如何合并两个AWS IAM策略以限制特定操作仅访问指定目录?
问题分析与解决方案
你的问题出在两个策略的设计冲突和ARN格式错误上:
核心问题
第一个策略的过度授权:
第一个策略中Resource设为arn:aws:s3:::*/*,这意味着允许对所有S3存储桶下的所有对象执行指定操作。IAM权限是累加生效的,只要有一个策略允许了某范围的访问,其他策略的限制就会被绕过——这直接导致你资源组的权限限制完全失效。S3 ARN格式错误:
第二个策略里的资源ARN写法不对。S3的ARN规则是:- 存储桶ARN:
arn:aws:s3:::bucket-name - 桶内对象/目录ARN:
arn:aws:s3:::bucket-name/path/to/object-or-directory/*
你写的arn:aws:s3:::path/to/my/bucket/directory不符合格式,正确的应该是把桶名放在最前面,比如arn:aws:s3:::my-bucket/path/to/directory/*。
- 存储桶ARN:
修正后的策略设计
按照你“操作权限组+资源权限组”的思路,正确的策略拆分应该是:
操作权限组策略(仅授予允许执行的操作,不限制资源范围)
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "s3:GetObject", "s3:PutObject", "s3:AbortMultipartUpload", "s3:ListMultipartUploadParts", "s3:ListBucketMultipartUploads" ], "Resource": "*", "Effect": "Allow" } ] }
资源权限组策略(仅授予指定资源的访问权限,操作可匹配操作组的范围)
{ "Version": "2012-10-17", "Statement": [ { "Action": "s3:*", "Resource": [ "arn:aws:s3:::your-bucket-name/path/to/directory", "arn:aws:s3:::your-bucket-name/path/to/directory/*" ], "Effect": "Allow" }, // 如果需要列出目录内的对象,补充以下规则 { "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::your-bucket-name", "Effect": "Allow", "Condition": { "StringLike": { "s3:prefix": "path/to/directory/*" } } } ] }
权限生效逻辑
IAM的权限判定逻辑是:用户必须同时拥有允许该操作的策略,以及允许该资源的策略,才能完成访问。通过这种拆分,操作组定义用户能做什么,资源组定义用户能访问什么,两者结合就能精准控制用户的S3访问范围。
内容的提问来源于stack exchange,提问作者SteveJ
相关产品推荐
相关产品推荐

