[ AWS ] S3 Bucket - Cross Account Access

minidoo·2023년 4월 4일
0

클라우드

목록 보기
5/6
post-thumbnail

보통 개발 초기에는 AWS 계정을 통합하여 사용하다가 운영 단계에서는 개발, 운영, 테스트 등 여러개의 계정으로 나누어 사용한다. 이런 경우 통합 계정에서 사용하던 버킷을 운영 계정에서 접근해야하거나, 개발 계정에서 운영 계정으로 접근 등 다양한 상황이 생기기 마련이다.

AWS는 계정 A에서 다른 계정 B의 버킷 및 객체와 같은 리소스에 대한 권한을 부여할 수 있는 기능을 제공한다. 계정 B는 해당 권한을 자신의 계정에 속한 사용자에게 위임할 수 있다.

💡 계정 B에서 A의 버킷에 접근하려는 상황
  1. 계정 A의 관리자 사용자가 특정 버킷 작업을 수행할 수 있도록 계정 B에 교차 계정 권한을 부여하는 버킷 정책을 연결한다.
  2. 계정 B의 관리자 사용자가 계정 A로부터 받은 권한을 위임하는 사용자 정책을 사용자에게 연결한다.
  3. 계정 B에 속한 사용자가 계정 A 소유의 버킷에 있는 객체에 액세스하여 권한 확인

1단계 : 계정 A의 태스크 수행

1.1단계 : S3 버킷 만들기

  1. Amazon S3 콘솔에서 버킷을 생성한다. 생성된 버킷 이름을 example.bucket이라 한다.
  2. 해당 버킷에 샘플 파일을 업로드한다. ex) pdf/account-test.pdf

1.2단계 : 계정 B에 교차 계정 권한을 부여하기 위해 버킷 정책 연결

  1. 버킷의 권한 탭의 버킷 정책을 설정한다.
{
   "Version": "2012-10-17",
   "Statement": [
      {
         "Effect": "Allow",
         "Principal": {
            "AWS": "arn:aws:iam::AccountB-ID:root"
         },
         "Action": [
            "s3:PutObject",
            "s3:PutObjectAcl",
            "s3:GetObject",
            "s3:GetObjectAcl",
            "s3:DeleteObject"
         ],
         "Resource": [
            "arn:aws:s3:::example.bucket",
			"arn:aws:s3:::example.bucket/*"
         ]
      }
   ]
}
  • Principal.AWS : 연결할 계정, 만약 계정 B의 특정 사용자만 접근 가능하다면 arn:aws:iam::AccountB-ID:user/app.miniplatform 와 같이 입력한다.
  • Action : 권한을 부여할 작업
  • Resource : 권한을 부여할 버킷 경로

2단계 : 계정 B의 태스트 수행

2.1단계 : 계정 B에서 사용자 만들기

  1. I AM 콘솔에서 사용자 app.miniplatform을 만든다.

  2. 사용자 권한에 S3 정책을 연결한다.

  3. 사용자 app.miniplatform에 대한 인라인 정책을 만든다. 버킷 이름을 제공하여 정책을 업데이트해야 한다.

2.2단계 : 사용자 app.miniplatform에게 원한 위임

{
    "Version": "2012-10-17",
    "Statement": [
      {
        "Effect": "Allow",
        "Action": [
          "s3:PutObject",
          "s3:PutObjectAcl",
          "s3:GetObject",
          "s3:GetObjectAcl",
          "s3:DeleteObject"
        ],
        "Resource": [
          "arn:aws:s3:::example.bucket",
		  "arn:aws:s3:::example.bucket/*"
        ]
      }
    ]
}

2.3단계 : 권한 테스트

import { S3 } from 'aws-sdk';

const s3 = new S3({ ... });
const params = {
	Bucket: 'example.bucket',
	Key: 'pdf/account-test.pdf'
};

try {
	await s3.getObject(params).promise();
} catch(err) {
	console.log('S3 연결 에러');
}

3단계 : 추가작업 (명시적 거부 시도)

버킷 또는 사용자 정책을 통해 설정된 명시적 거부가 있을 경우, 명시적 거부가 다른 권한보다 우선 적용된다. Effect: Allow 로 권한을 부여할 수도 있지만, Effect: Deny 로 권한을 거부할 수도 있다.

계정 A의 버킷 정책 수정

{
   "Version": "2012-10-17",
   "Statement": [
      {
         "Effect": "Allow",
         "Principal": {
            "AWS": "arn:aws:iam::AccountB-ID:root"
         },
         "Action": "s3:*",
         "Resource": [
            "arn:aws:s3:::example.bucket",
						"arn:aws:s3:::example.bucket/*"
         ]
      },
			{
         "Effect": "Deny",
         "Principal": {
            "AWS": "arn:aws:iam::AccountB-ID:root"
         },
         "Action": "s3:*",
         "Resource": [
            "arn:aws:s3:::test.bucket",
						"arn:aws:s3:::test.bucket/*"
         ]
      }
   ]
}

참고문서

[ 1 ] 버킷 소유자가 교차 계정 버킷 권한 부여
https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/example-walkthroughs-managing-access-example2.html

[ 2 ] Amazon S3 버킷에 있는 객체에 대한 교차 계정 액세스 권한을 제공하려면 어떻게 해야 하나요?
https://aws.amazon.com/ko/premiumsupport/knowledge-center/cross-account-access-s3/

[ 3 ] S3 Bucket - Cross Account Access 해보기
https://medium.com/@labcloud/s3-bucket-cross-account-access-해보기-81f1bbb8d5db

0개의 댓글