You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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请求:

  1. 选择对应区域的S3 HTTP端点:
    通用格式为http://s3.<region>.amazonaws.com,也可以使用桶专属端点http://<bucket-name>.s3.<region>.amazonaws.com。

  2. 执行测试命令:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 20:08:13