华为云IAM最小权限实操:创建子用户、用户组与自定义策略并校验权限边界

举报
yd_244253482 发表于 2026/11/04 07:17:12 2026/11/04
【摘要】 一、为什么要认真用 IAM很多人在华为云上从注册到开发,一直使用账号本身(主账号)的登录密码和访问密钥。主账号拥有该账号下所有资源的最高权限,一旦它的 AK/SK 被写进代码仓库、日志或截图泄露,攻击者就能删除、搬走或加密你的全部资源,风险是全局性的。统一身份认证服务 IAM(Identity and Access Management)解决的就是“谁能访问、能访问什么、能做什么操作”的问题...

一、为什么要认真用 IAM

很多人在华为云上从注册到开发,一直使用账号本身(主账号)的登录密码和访问密钥。主账号拥有该账号下所有资源的最高权限,一旦它的 AK/SK 被写进代码仓库、日志或截图泄露,攻击者就能删除、搬走或加密你的全部资源,风险是全局性的。

统一身份认证服务 IAM(Identity and Access Management)解决的就是“谁能访问、能访问什么、能做什么操作”的问题。它的核心原则是最小权限:每个用户、每个程序只拿到完成本职工作所必需的权限,够用即止。本文用一个可落地的例子,演示如何创建子用户、用户组,编写自定义策略,并实际校验权限边界。

二、基本概念先理清

  • IAM 用户:账号下的具体身份,可以是一个人,也可以是一个跑程序的服务账号,拥有独立的登录密码和访问密钥。
  • 用户组:权限的批量载体。把策略授予用户组,再把用户加入组,组内所有用户自动继承权限,避免逐个授权。
  • 策略:一份 JSON 文档,由若干 Statement 组成,描述允许(Allow)或拒绝(Deny)哪些 Action、作用在哪些 Resource 上,还可以带 Condition。
  • 委托:让云服务或其他账号代为扮演角色,常用于服务间调用,本文不展开。

三、创建用户组与子用户

1. 新建用户组

进入控制台“统一身份认证 IAM”,在“用户组”页签点击“创建用户组”,例如命名为 dev-oss-only,表示这是一组只允许操作指定 OBS 资源的开发人员。先不要急着授权,等自定义策略写好后再挂载。

2. 新建 IAM 用户

在“用户”页签点击“创建用户”,用户名填 dev01。这里有两种访问方式,按用途勾选:

  • 控制台访问:需要密码,供人登录控制台使用,可要求首次登录改密。
  • 编程访问:生成 AK/SK,供 SDK、CLI、脚本调用 API 使用,只在确实需要时开启。

创建后把 dev01 加入用户组 dev-oss-only。此时该用户还没有任何有效权限,默认什么都做不了,这正是最小权限的起点。

四、编写自定义策略

系统策略(如 OBS OperateAccess)覆盖面较广,难以精确到单个桶。要实现“只能读写某一个桶、不能删桶、不能碰其他资源”,需要自定义策略。策略结构如下:

{
  "Version": "1.1",
  "Statement": [
    {
      "Sid": "AllowOneBucket",
      "Effect": "Allow",
      "Action": [
        "obs:bucket:GetBucketLocation",
        "obs:bucket:ListBucket",
        "obs:object:GetObject",
        "obs:object:PutObject"
      ],
      "Resource": [
        "obs:*:*:bucket:my-app-data",
        "obs:*:*:object:my-app-data/*"
      ]
    }
  ]
}

字段含义:Action 用“服务:资源类型:操作”的格式限定能做的动作;Resource 用通配与具体名称把权限收敛到 my-app-data 这一个桶及其对象;这里故意不包含 obs:bucket:DeleteBucket 和 obs:object:DeleteObject,因此删除操作天然不被允许。

在 IAM“权限”页签选择“创建自定义策略”,策略名称填 policy-obs-myapp-rw,选择 JSON 编辑方式粘贴上述内容并保存,再回到用户组 dev-oss-only 的“授权”中挂载这条策略。

五、用子用户实际校验权限边界

权限是否真的收敛,必须用子身份实测,而不是想当然。

1. 验证“允许”的操作可用

用 dev01 的 AK/SK 配置 KooCLI 或 SDK,向 my-app-data 上传一个对象:

hcloud obs cp ./test.txt obs://my-app-data/test.txt

再执行 GetObject、ListBucket,均应成功,说明必要的读写权限已生效。

2. 验证“未授权”的操作被拒绝

尝试删除该对象或删除桶:

hcloud obs rm obs://my-app-data/test.txt

由于策略中没有对应的 Delete 权限,请求会被拒绝并返回 403 Forbidden,错误信息里通常带 AccessDenied 或策略评估相关字样。再尝试访问另一个桶 other-bucket,同样会被拒绝,证明资源范围也被正确限制。

六、常见问题排查

  • 策略明明 Allow 了却仍报 403:先确认用户是否真的在组内、策略是否已挂载到正确的组;再检查 Resource 是否覆盖了实际访问的资源,对象级操作和桶级操作的 Resource 写法不同,容易漏配 object:桶名/*。
  • Deny 与 Allow 同时存在:IAM 评估中只要有任意一条 Deny 命中,最终结果就是拒绝,Deny 优先于 Allow。做封禁类控制时可以用显式 Deny。
  • 列桶与操作对象权限要分开:ListBucket 属于桶级动作,GetObject/PutObject 属于对象级动作,两者 Resource 不同,缺一会出现“能进控制台但看不到内容”或“能直接访问对象但无法列举”的现象。
  • 用 Condition 进一步收紧:可在 Statement 中加 Condition,限制请求来源 IP、时间窗口或必须使用加密传输,满足合规要求。

七、小结

通过“用户组承载策略、子用户加入组、自定义策略精确到 Action 与 Resource、再用子身份实测允许与拒绝”这套流程,就能把权限收敛到最小可用范围。相比直接使用主账号 AK/SK,IAM 子用户即使凭证意外泄露,影响面也被限制在有限资源和操作内,且可以随时在 IAM 中禁用或删除该用户的密钥,快速止血。建议把主账号 AK/SK 停用或删除,日常开发一律使用最小权限的子用户。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。