
# 安全使用IAM
#### 通过IAM身份中心集中管理人机用户并使用联邦认证
华为云的用户可以是管理员、开发者、使用应用程序的用户（例如，业务分析师，数据分析师等），他们使用CLI、控制台或者是客户端应用程序访问华为云，他们通常位于企业或者组织的内部。有时，他们也可能是企业或组织外部的用户。这些用户必须有身份凭证才能访问华为云。推荐使用[IAM 身份中心](https://support.huaweicloud.com/productdesc-identitycenter/iic_01_0002.html)管理这些用户，这样带来的好处是：
- 可以对用户进行集中管理，企业或组织成员的变动只通过一个系统完成，减少维护成本。
- 用户认证凭据的集中管理，不需要在许多单独的系统中创建或维护密码。
- 减少身份系统的数量，通过一个身份提供商管理所有用户。
- 便于审计，单一的身份源会使审计变得容易。
 
#### 机机用户通过IAM委托或信任委托的临时访问密钥访问华为云
使用临时访问密钥是一个好的安全实践，因为它们的生命周期有限，并且会自动过期，所以临时凭证不需要进行轮转，也不需要在不需要它们时进行注销。推荐使用IAM委托或者信任委托的的方式给机机账号颁发临时凭证，而不是IAM用户的永久访问密钥。
#### 不将访问密钥嵌入到代码中
当您使用API、CLI、SDK等开发工具来访问云服务时，请勿直接将访问密钥嵌入到代码中，减少访问密钥被泄露的风险。
#### 创建单独的IAM用户
如果有任何人需要访问您账号中的资源，请不要将账号的密码共享给他们，而是在您的账号中给他们创建单独的IAM用户并分配相应的权限，同时，建议您不要直接使用账号访问华为云，而是为自己创建一个IAM用户，并授予该用户管理权限，以使用该IAM用户代替账号进行日常管理工作，保护账号的安全。
#### 合理设置访问方式
您可以通过不同的方式访问华为云，在IAM新版控制台创建的IAM用户，具体访问方式取决于IAM用户的凭证类型。如果您在创建IAM用户时设置了控制台密码，则该IAM用户可以通过控制台方式来访问华为云；如果给IAM用户创建了访问密钥，则该IAM用户可以通过编程方式来访问华为云。在IAM旧版控制台创建的IAM用户，则需要对**访问方式**进行显示设置，可以在创建IAM用户时或者创建后从用户列表进入IAM用户的安全设置中进行设置。
#### 开启虚拟MFA功能
Multi-Factor Authentication（简称MFA）是一种非常简单的安全实践方法，建议您给账号以及您账号中的IAM用户开启MFA功能，它能够在用户名和密码之外再额外增加一层保护。启用MFA后，用户登录控制台时，系统将要求用户输入用户名和密码（第一安全要素），以及来自其MFA设备的验证码（第二安全要素）。这些多重要素结合起来将为您的账号和资源提供更高的安全保护。
MFA设备目前包含虚拟MFA和安全密钥两种。虚拟MFA是能产生6位数字认证码的应用程序，此类应用程序可在移动硬件设备（包括智能手机）上运行，非常方便。安全密钥是基于FIDO协议的双因素认证，华为云当前支持基于FIDO协议的硬件设备和Windows Hello的安全密钥。
#### 设置强密码策略
在IAM控制台设置强密码策略，例如密码最小长度、密码中同一字符连续出现的最大次数、密码不能与历史密码相同，保证用户使用复杂程度高的强密码。
#### 设置敏感操作
设置敏感操作后，如果您或者您账号中的用户进行敏感操作时，例如删除资源、生成访问密钥等，需要输入密码和验证码进行验证，避免误操作带来的风险和损失。
#### 定期修改身份凭证
如果您不知道自己的密码或访问密钥是否已泄露，定期进行修改可以将不小心泄露的风险降至最低。
- 定期轮换密码可以通过设置密码有效期策略进行，您以及您账号中的用户在设置的时间内必须修改密码，否则密码将会失效，IAM会在密码到期前15天开始提示用户修改密码。请注意，华为账号不受密码有效期策略影响。
- 轮换访问密钥可以通过创建两个访问密钥进行，将两个访问密钥作为一主一备，一开始先使用主访问密钥一，一段时间后，使用备访问密钥二，然后在控制台删除主访问密钥一，并重新生成一个访问密钥，在您的应用程序中定期轮换使用。
 
#### 删除不需要的身份凭证
对于仅需要登录控制台的IAM用户，不需要使用访问密钥，请不要给他们创建，或者及时删除访问密钥。您还可以通过账号中IAM用户的"最近一次登录时间"，来判断该用户的凭证是否已经属于不需要的范畴，对于长期未登录的用户，请及时修改他们的身份凭证，包括修改密码和删除访问密钥，您还可以设置"用户停用策略"来控制长期未使用的IAM用户到期自动停用。
#### 开通云审计服务
您可以通过云审计服务（Cloud Trace Service，CTS）对IAM的关键操作事件进行收集、存储和查询，用于安全分析、合规审计、资源跟踪和问题定位等。为了方便查看IAM的关键操作事件，例如创建用户、删除用户等，建议您开启云审计服务。
#### 遵循最佳实践保护账号身份凭证
账号是您华为云资源归属、资源使用计费的主体，对其所拥有的资源及云服务具有完全的访问权限。请您像保护个人隐私数据一样保护账号的身份凭证。
- 请勿为账号创建访问密钥 密码与访问密钥（AK/SK）都是账号的身份凭证，具有同等效力，密码用于登录界面控制台，是您必须具备的身份凭证，访问密钥用于使用开发工具进行编程调用，是第二个身份凭证，为辅助性质，非必须具备。为了提高账号安全性，建议您仅使用密码登录控制台即可，不要给账号创建第二个身份凭证（访问密钥），避免因访问密钥泄露带来的信息安全风险。
  

- 保护您的账号身份凭证，不允许未经授权使用账号 加强账号身份凭证的保护，请勿泄露您的密码，多因子认证、AK/SK，严格限制需要通过账号身份凭据进行认证的业务范围。
  

- 使用强密码来加强访问保护 推荐使用密码工具生成强密码，请勿将密码设置为您的账号名或者是邮箱地址。
  

- 开启多因素认证 强烈建议为账号开启多因素认证。
  

- 尽可能使用多人审批进行账号的登录 推荐使用多人审批，防止一个人可以同时使用密码和多因子认证进行账号登录。例如，可以通过设置一组有权限访问密码的管理员和另一组有权限访问多因子认证的管理员，必须通过至少两个人的审批才能进行账号登录。
  

- 监控账号的权限以及使用情况 建议通过华为云审计服务（CTS）监控账号的使用情况，如发现异常活动请及时进行安全审计与防范。
  
 
#### 授予最小权限
最小权限原则是标准的安全建议，您可以使用IAM提供的系统权限，或者自己创建自定义策略或身份策略，给账号中的用户仅授予刚好能完成工作所需的权限，通过最小权限原则，可以帮助您安全地控制用户对华为云资源的访问。
同时，建议为使用API、CLI、SDK等开发工具访问云服务的IAM用户，授予自定义策略或身份策略，通过精细的权限控制，减少因访问密钥泄露对您的账号造成的影响。
- 将管理员使用的IAM用户和程序用的IAM用户区分开。
- 管理员使用的IAM用户，建议使用身份联邦，密码在企业线下身份系统。
- 程序使用IAM用户，授予程序需要访问的API对应的权限，禁止登录控制台（避免保存密码）。
- 禁止重要数据资产的下载和删除权限被授权，或针对重要数据的下载（部分敏感数据的查询）和删除权限，仅授予几个重要的IAM用户（联邦用户），这些用户的密码禁止分享，杜绝账号密码泄露带来的影响。
 
#### 使用IAM策略或身份策略中的条件进一步限制访问权限
推荐使用IAM策略或身份策略进一步限制访问权限，例如，您可以编写一个策略或身份策略来限制只允许特定的IAM用户执行特定的操作。有关更多信息，请参阅[IAM权限管理](https://support.huaweicloud.com/usermanual-iam5/iam_01_1159.html)。
#### 移除（或不生成）账号根用户访问密钥
保护账号的最佳方法之一是不为账号根用户设置访问密钥。除非必须具有账号根用户访问密钥（这种情况很少见），否则建议不要生成根用户访问密钥。最佳实践是在华为云IAM身份中心中创建一个管理用户来执行日常管理任务。有关如何在IAM身份中心中创建管理用户的信息，请参见[IAM 身份中心快速入门](https://support.huaweicloud.com/qs-identitycenter/iic_02_0002.html)。
如果您已经拥有并在使用账号的根用户访问密钥，建议您执行以下操作：找到您当前在应用程序中使用访问密钥的位置，然后使用IAM用户访问密钥替换根用户访问密钥，最后再禁用并移除根用户访问密钥。
#### 控制访问密钥的使用
作为最佳实践，我们建议工作负载使用[临时安全凭证](https://support.huaweicloud.com/usermanual-iam5/iam_01_1236.html)来访问华为云，如果一定要使用永久访问密钥，我们建议向拥有永久访问密钥的IAM用户授权时遵循最小权限原则，并启用多因素认证（MFA）。
例如，您正在进行一些短期的测试，并选择使用IAM用户的永久访问密钥来运行工作负载，我们建议您使用条件键来进一步限制用户的权限。在这种情况下，您可以创建有时限的身份策略附加在IAM用户身上，使用户的权限在指定时间后过期；或者如果您是从安全网络运行工作负载，可以使用限制IP的身份策略。
- **为IAM用户配置限时策略**
  1. 管理员登录[统一身份认证服务新版控制台](https://console.huaweicloud.com/iam5)。
  
  2. 在左侧导航窗格中，选择"身份策略"。
  
  3. 单击右上方的"创建自定义身份策略"，输入策略名称，策略配置方式选择JSON视图。
  
  4. 在"策略内容"区域中输入以下策略，将 g:CurrentTime 条件键的值替换为所需的到期时间。
     ```
     {
     "Version": "5.0",
     "Statement": [{
     "Effect": "Deny",
     "Action": [
     "*"
     ],
     "Condition": {
     "DateGreaterThan": {
     "g:CurrentTime": [
     "2025-07-15T08:53:13Z"
     ]
     }
     }
     }]
     }
     ```
     该策略使用Deny效果来限制在指定日期后对所有资源执行所有操作。DateGreaterThan运算符用于比较当前的时间是否大于您设置的时间。
     
  
  5. 选择确定，返回身份策略页面。在选择策略身份搜索框，输入刚才创建的策略名称，选择对应身份策略，单击"附加"，将对应身份策略附加到指定IAM用户身上。 附加身份策略后，身份策略将显示在用户的权限选项卡上。当前时间大于或等于该身份策略中指定的时间时，用户就无法再访问华为云资源。请务必让开发人员了解您为这些用户权限指定的到期日期。
     
   

- **为IAM用户配置IP限制策略**
  1. 管理员登录[统一身份认证服务新版控制台](https://console.huaweicloud.com/iam5)。
  
  2. 在左侧导航窗格中，选择"身份策略"。
  
  3. 单击右上方的"创建自定义身份策略"，输入策略名称，策略配置方式选择JSON视图。
  
  4. 在"策略内容"区域中，将以下IAM策略复制到 JSON 编辑器，并根据需要更改对应公网IP地址或范围。您可以使用斜杠标记指定单个IP地址或IP地址范围。有关更多信息，请参阅[g:SourceIp条件键](https://support.huaweicloud.com/usermanual-iam5/iam_01_1287.html#iam_01_1287__li6661840171714)。
     ```
     {
     "Version": "5.0",
     "Statement": [{
     "Effect": "Deny",
     "Action": [
     "*"
     ],
     "Resource": [
     "*"
     ],
     "Condition": {
     "NotIpAddress": {
     "g:SourceIp": [
     "xx.xx.xx.0/32"
     ]
     },
     "BoolIfExists": {
     "g:ViaService": [
     "false"
     ]
     }
     }
     },
     {
     "Effect": "Deny",
     "Action": [
     "*"
     ],
     "Resource": [
     "*"
     ],
     "Condition": {
     "NotIpAddress": {
     "g:SourceIp": [
     "xx.xx.xx.0/32"
     ]
     },
     "StringEquals": {
     "g:CalledViaFirst": "service.console",
     "g:CalledViaLast": "service.console"
     }
     }
     }
     ]
     }
     ```
     该策略使用Deny效果来限制在指定IP外对所有资源执行所有操作。NotIpAddress运算符指指定IP地址或者IP范围之外的所有IP地址。
     
  
  5. 选择"确定"，返回身份策略页面。在选择策略身份搜索框，输入刚才创建的策略名称，选择对应身份策略，单击"附加"，将对应身份策略附加到指定IAM用户身上。
     您还可以将以下策略作为服务控制策略 (SCP) 应用于华为云中的多个账号，我们建议您使用条件键g:PrincipalUrn让该策略仅适用于受此SCP约束的账号中的IAM用户：
     ```
     {
     "Version": "5.0",
     "Statement": [{
     "Effect": "Deny",
     "Action": [
     "iam:*:*"
     ],
     "Resource": [
     "*"
     ],
     "Condition": {
     "NotIpAddress": {
     "g:SourceIp": [
     "xx.xx.xx.0/32"
     ]
     },
     "BoolIfExists": {
     "g:ViaService": [
     "false"
     ]
     },
     "StringMatch": {
     "g:PrincipalUrn": [
     "iam::<account-id>:user:<user-name>"
     ]
     }
     }
     },
     {
     "Effect": "Deny",
     "Action": [
     "iam:*:*"
     ],
     "Resource": [
     "*"
     ],
     "Condition": {
     "NotIpAddress": {
     "g:SourceIp": [
     "xx.xx.xx.0/32"
     ]
     },
     "StringEquals": {
     "g:CalledViaFirst": "service.console",
     "g:CalledViaLast": "service.console"
     },
     "StringMatch": {
     "g:PrincipalUrn": [
     "iam::<account-id>:user:<user-name>"
     ]
     }
     }
     }
     ]
     }
     ```
     
   
