GuardDuty 上传验证对象时为何提示 IAM 权限不足?
结论
从你提供的策略看,应先修正 GuardDuty 使用的 IAM role policy,让 s3:PutObject 权限匹配对象 ARN。当前的 Resource 是 arn:aws:s3:::*,属于 bucket ARN,不能匹配 bucket 中对象的 ARN。可以先为验证对象添加精确到对象 key 的权限,再确认 bucket policy 没有对该对象设置显式拒绝。
AWS 关于 INSUFFICIENT_TEST_OBJECT_PERMISSIONS 的排查文档说明,验证对象权限应添加到所选 IAM role 上。如果权限已经配置但仍出现此提示,还应检查 bucket policy 是否限制了写入。GuardDuty 验证对象排查文档
调整 IAM role policy
你贴出的 role policy 将多个 S3 操作放在同一条语句中,Resource 设置为:
"Action": ["s3:PutObject", "s3:GetObject", "s3:ListBucket"],
"Resource": "arn:aws:s3:::*"
这些操作需要不同类型的资源 ARN:s3:PutObject 需要对象 ARN,s3:ListBucket 需要 bucket ARN。建议为验证对象单独添加一条语句,并将 bucket 名替换为实际名称:
{
"Sid": "AllowPutValidationObject",
"Effect": "Allow",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::YOUR_BUCKET_NAME/malware-protection-resource-validation-object"
}
如果 GuardDuty 需要读取和扫描 bucket 中的对象,再根据实际扫描范围,为 s3:GetObject 和 s3:GetObjectVersion 配置对象 ARN,例如 arn:aws:s3:::YOUR_BUCKET_NAME/*。s3:ListBucket 则应单独使用 arn:aws:s3:::YOUR_BUCKET_NAME。AWS 提供的 role policy 示例也分别配置了验证对象写入、bucket 列举和对象读取权限。GuardDuty IAM role policy 示例
检查 bucket policy 的拒绝规则
你的拒绝语句通过 NotResource 排除了以下路径:
arn:aws:s3:::<bucket>/malware-protection-resource-validation-object*
请确认实际 bucket 名和对象 key 与该路径一致,并检查 bucket policy 中是否还有其他适用于这个 key 的显式 Deny。IAM role 上的 Allow 无法覆盖适用的显式拒绝。
还应复核策略中的 aws:PrincipalService 条件。GuardDuty Malware Protection for S3 会通过配置的 IAM service role 执行相关操作。如果 bucket policy 按调用身份豁免拒绝规则,需要核对请求实际使用的 role 身份和条件键。仅配置 GuardDuty service principal,并不能说明写对象请求会以该 service principal 作为请求主体。当前 NotResource 已排除验证对象时,先确认排除路径匹配,再逐条检查其他拒绝规则。
建议排查顺序
- 在当前使用的 GuardDuty IAM role policy 中,为验证对象添加上述精确的
s3:PutObject权限。 - 检查
s3:ListBucket、对象读取权限和 KMS 权限是否使用了对应的资源 ARN。如果 bucket 使用客户管理的 KMS key,也要核对 role policy 和 KMS key policy 是否允许所需操作。 - 检查 bucket policy 中针对验证对象的显式
Deny,重点确认NotResource路径、加密条件和其他拒绝语句的匹配结果。 - 更新策略后等待其生效,再查看 Malware Protection plan 状态。AWS 文档提示,状态更新可能需要几分钟。验证对象权限缺失也可能显示为 warning,不一定会阻止新上传对象触发扫描。
以上判断基于题目中提供的策略片段。如果问题仍未解决,可结合完整 bucket policy、IAM role ARN、bucket 的默认加密设置和 KMS key policy 继续排查。
备注:内容仅供参考。
