华为云IAM最小权限实操:创建子用户、用户组与自定义策略并校验权限边界
一、为什么要认真用 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 停用或删除,日常开发一律使用最小权限的子用户。
- 点赞
- 收藏
- 关注作者
评论(0)