S3角色策略无法限制仅用指定KMS密钥加密上传问题排查
一、IAM角色策略未生效的排查与修复
首先,你遇到的核心问题是绑定到IAM角色的拒绝策略未生效,但相同策略作为存储桶策略时正常,这通常和以下几个关键点有关:
1. 确认执行请求的身份确实使用了目标IAM角色
IAM策略仅对关联的身份生效,如果你用AWS CLI执行命令时,使用的是其他身份(比如IAM用户、默认EC2实例角色等),那么绑定到目标角色的策略不会起作用。
验证当前CLI使用的身份:
aws sts get-caller-identity
检查输出的Arn字段,确认是否是你绑定策略的那个IAM角色。如果不是,需要先切换到该角色的凭证:
# 替换为你的角色ARN aws sts assume-role --role-arn arn:aws:iam::<your-account-id>:role/<your-role-name> --role-session-name test-s3-upload
将返回的Credentials中的AccessKeyId、SecretAccessKey、SessionToken设置为环境变量:
export AWS_ACCESS_KEY_ID=<AccessKeyId> export AWS_SECRET_ACCESS_KEY=<SecretAccessKey> export AWS_SESSION_TOKEN=<SessionToken>
再次执行aws sts get-caller-identity确认身份,然后重新测试put-object命令。
2. 检查IAM策略的条件键匹配精度
你的策略中使用了StringNotEquals条件,需要确保请求中的参数和策略值完全匹配:
- 确认
arn:aws:kms:us-east-1:<account-id>:key/<my-default-kmskey-id>中的账号ID、密钥ID没有拼写错误,ARN格式完全正确(AWS ARN是大小写敏感的)。 - 测试命令中如果仅用密钥ID作为
--ssekms-key-id的值,策略中的条件值也需要对应改为密钥ID,或者统一使用完整ARN来避免匹配失败。
3. 确认没有其他IAM策略干扰
虽然IAM的拒绝策略优先级高于允许策略,但如果存在其他允许策略中包含无限制的s3:PutObject权限,需要确保你的拒绝策略条件能够精准触发。比如当你使用非指定KMS密钥时,第二个拒绝语句的条件必须完全匹配请求中的s3:x-amz-server-side-encryption-aws-kms-key-id参数。
二、测试非SSL请求是否被拒绝的方法
AWS CLI默认使用HTTPS,但可以通过指定HTTP端点来强制发送非SSL请求:
选择对应区域的S3 HTTP端点:
通用格式为http://s3.<region>.amazonaws.com,也可以使用桶专属端点http://<bucket-name>.s3.<region>.amazonaws.com。执行测试命令:
aws s3api put-object \ --bucket test-buck \ --key testimage.jpg \ --body testimage.jpg \ --server-side-encryption aws:kms \ --ssekms-key-id arn:aws:kms:us-east-1:<account-id>:key/<my-default-kmskey-id> \ --endpoint-url http://s3.us-east-1.amazonaws.com
此时请求会以HTTP发送,触发你策略中第三个拒绝条件(aws:SecureTransport: false),正常情况下会返回AccessDenied错误,证明策略生效。
注意:部分AWS区域或桶配置可能默认禁用HTTP访问,但你的策略已经明确拒绝非SSL请求,只要身份使用了绑定策略的IAM角色,该测试就会返回拒绝结果。
内容的提问来源于stack exchange,提问作者s_neenu

