Amazon S3 クロスアカウントバケットポリシー設定パターン
なんか混乱してくるので整理しました。
アクセス元アカウント ID で制限
別のアカウントから IAM role を使用したアクセスを許可する場合は、Principal
にアカウント ID を指定します。
IAM policy
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": [
"(アカウントID)"
]
},
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::(バケット名)",
"arn:aws:s3:::(バケット名)/*"
]
}
]
}
CloudFormation template
Parameters:
TestBucket:
Type: AWS::S3::Bucket
TestBucketPolicy:
Type: AWS::S3::BucketPolicy
Properties:
Bucket: !Ref TestBucket
PolicyDocument:
Version: 2012-10-17
Statement:
- Sid: TestBucketPermissions
Effect: Allow
Action: s3:*
Resource:
- !Sub "arn:${AWS::Partition}:s3:::${TestBucket}"
- !Sub "arn:${AWS::Partition}:s3:::${TestBucket}/*"
Principal:
AWS:
- (アカウント ID)
アクセス元を Organizations に制限
Organizations のすべてのアカウントからのアクセスを許可する場合は、Condition
に aws:PrincipalOrgID
を指定します。
IAM policy
TODO
CloudFormation template
Parameters:
TestBucket:
Type: AWS::S3::Bucket
TestBucketPolicy:
Type: AWS::S3::BucketPolicy
Properties:
Bucket: !Ref TestBucket
PolicyDocument:
Version: 2012-10-17
Statement:
- Sid: TestBucketPermissions
Effect: Allow
Action: s3:*
Resource:
- !Sub "arn:${AWS::Partition}:s3:::${TestBucket}"
- !Sub "arn:${AWS::Partition}:s3:::${TestBucket}/*"
Principal:
AWS: "*"
Condition:
StringEquals:
aws:PrincipalOrgID: (Organization ID)
サービスプリンシパルによるアクセス元アカウントで制限
Service-linked role を使用したサービスからのアクセスを許可する場合は、Principal
にサービスプリンシパルを指定し、アクセス元アカウントは Condition
の aws:SourceAccount
で指定します。aws:PrincipalOrgID
で Organization を指定することはできません。
IAM policy
TODO
CloudFormation template
Parameters:
TestBucket:
Type: AWS::S3::Bucket
TestBucketPolicy:
Type: AWS::S3::BucketPolicy
Properties:
Bucket: !Ref TestBucket
PolicyDocument:
Version: 2012-10-17
Statement:
- Sid: TestBucketPermissions
Effect: Allow
Action: s3:*
Resource:
- !Sub "arn:${AWS::Partition}:s3:::${TestBucket}"
- !Sub "arn:${AWS::Partition}:s3:::${TestBucket}/*"
Principal:
Service:
- config.amazonaws.com
Condition:
StringEquals:
aws:SourceAccount:
- (アカウント ID)