메뉴
Amazon Simple Storage Service
개발자 안내서 (API Version 2006-03-01)

예 4: 버킷 소유자가 자신의 소유가 아닌 객체에 교차-계정 권한 부여

이러한 예로 사용자가 한 버킷을 소유하고 있고 다른 AWS 계정에 객체 업로드를 허용하는 시나리오를 살펴봅니다. 이는 소유자의 버킷에 다른 AWS 계정이 소유한 객체를 둘 수 있다는 것을 의미합니다.

이번에는 버킷 소유자가 객체 소유자에 관계 없이 객체에 대한 교차 계정 권한을 다른 계정 사용자에게 부여하는 시나리오를 살펴봅니다. 예를 들어, 해당 사용자는 객체 메타데이터에 액세스해야 하는 요금 청구 애플리케이션이 될 수 있습니다. 이 경우, 두 가지 핵심 사안이 있습니다.

  • 버킷 소유자는 다른 AWS 계정이 만든 객체에 대한 권한이 없습니다. 그러므로 버킷 소유자가 자신의 소유가 아닌 객체에 대한 권한을 부여하려면, 우선 해당 객체를 만든 AWS 계정에서 버킷 소유자에게 권한을 부여해야 합니다. 그러면 버킷 소유자가 해당 권한을 위임할 수 있습니다.

  • 버킷 소유자 계정은 본인 계정 사용자에게는 권한을 위임할 수 있으나 (예제 3: 버킷 소유자가 자신의 사용자에게 자신이 소유하지 않는 객체에 대한 권한 부여 참조), 교차 계정 위임은 이를 지원하지 않아 다른 AWS 계정에는 권한을 위임할 수 없습니다.

이 시나리오에서 버킷 소유자는 객체 액세스 권한을 가진 AWS Identity and Access Management(IAM) 역할을 생성하고 다른 AWS 계정에 이 역할을 임시로 맡겨 버킷 객체 액세스 허용 권한을 부여할 수 있습니다.

배경: 교차 계정 권한과 IAM 역할 사용

IAM 역할은 사용자 리소스 액세스를 위임하는 여러 시나리오를 활성화하는 데 있으며, 교차 계정 액세스는 키 시나리오 중 한 가지에 해당합니다. 이번에는 버킷 소유자인 계정 A는 IAM 역할에 임시로 다른 AWS 계정 사용자인 계정 C에게 객체 액세스 교차 계정을 위임하는 시나리오를 살펴봅니다. 사용자가 만든 각 IAM 역할에 다음과 같이 두 개의 정책이 연결됩니다.

  • 역할을 맡을 다른 AWS 계정을 식별하는 신뢰 정책.

  • 사용자가 역할을 수임할 때 s3:GetObject 등 권한의 내용을 정의하는 액세스 정책. 정책에서 지정할 수 있는 권한 목록에 대해서는 정책에서 권한 지정을 참조하십시오.

신뢰 정책에서 식별된 AWS 계정은 사용자에게 해당 역할을 수임할 권한을 부여합니다. 사용자는 객체에 액세스하기 위해 다음과 같이 수행합니다.

  • 역할을 맡으면 임시 보안 자격 증명이 주어집니다.

  • 임시 보안 자격 증명으로 버킷 내 객체에 액세스합니다.

IAM 역할에 대한 자세한 내용은 IAM 사용 설명서IAM 역할 단원을 참조하십시오.

각 연습 단계는 다음과 같이 간략히 설명할 수 있습니다.

  1. 계정 A 관리자 사용자는 계정 B에게 객체 업로드 조건부 권한을 부여하는 버킷 정책을 연결합니다.

  2. 계정 A의 관리자가 IAM 역할을 만들어 계정 C와의 신뢰를 설정하면 계정 C 사용자는 계정 A에 액세스할 수 있습니다. 해당 역할에 연결된 액세스 정책은 사용자가 계정 A에 액세스할 때 계정 C의 사용자가 수행할 수 있는 작업을 제한합니다.

  3. 계정 B의 관리자는 계정 A가 소유한 버킷에 객체를 업로드해 버킷 소유자에게 전적인 제어 권한을 부여합니다.

  4. 계정 C 관리자는 사용자를 생성하고 사용자 정책을 연결해 해당 사용자에게 역할을 수임하게 합니다.

  5. 계정 C의 사용자는 우선 역할을 맡고, 사용자 임시 보안 자격 증명을 반환합니다. 이러한 임시 자격 증명으로 사용자는 버킷 내 객체에 액세스합니다.

이번에는 세 계정이 필요한 경우를 예로 들어봅니다. 다음 표는 세 계정과 해당 계정의 관리자 사용자를 나타내는 방법을 보여 줍니다. IAM 지침(관리자 사용자를 사용하여 리소스를 만들고 권한을 부여하는 것에 대한 소개 참조)에 따라 본 연습에서는 계정 루트 자격 증명을 사용하지 않습니다. 대신 사용자는 각 계정에서 관리자 사용자를 만든 후 해당 자격 증명을 사용해 리소스를 만들어 해당 리소스에 권한을 부여합니다.

AWS 계정 ID 계정 이름 계정의 관리자 사용자

1111-1111-1111

계정 A

AccountAadmin

2222-2222-2222

계정 B

AccountBadmin

3333-3333-3333

계정 C

AccountCadmin

0단계: 연습 준비

참고

텍스트 편집기를 열고 각 단계를 진행하면서 필요한 정보를 적는 것이 좋습니다. 계정 ID, 정식 사용자 ID, 콘솔에 연결할 각 계정의 IAM User Sign-in URL, IAM 사용자의 ARN(Amazon 리소스 이름)과 그 역할이 필요하기 때문입니다.

  1. AWS 계정이 세 개인지, 이전 단원의 표와 같이 각 계정에 관리자 사용자가 한 명인지 확인합니다.

    1. 필요한 경우 AWS 계정에 가입합니다. 이 계정을 계정 A, 계정 B, 계정 C라고 칭합니다.

      1. https://aws.amazon.com/s3/로 이동하여 [Create an AWS Account]를 클릭합니다.

      2. 화면에 나타나는 지시를 따릅니다.

        계정이 활성화되고 사용 가능한 상태가 되면 AWS에서 사용자에게 이메일로 알립니다.

    2. 계정 A의 자격 증명을 사용하여 IAM 콘솔에 로그인하고 다음을 수행하여 관리자 사용자를 만듭니다.

      • 사용자 AccountAadmin을 만들고 보안 자격 증명을 적어 둡니다. 사용자 추가에 대한 자세한 내용은 IAM 사용 설명서AWS 계정의 IAM 사용자 생성 단원을 참조하십시오.

      • 전적인 권한을 부여하는 사용자 정책에 연결해 AccountAadmin 관리자에게 권한을 위임합니다. 지침은 IAM 사용 설명서정책 작업 단원을 참조하십시오.

      • IAM Console DashboardIAM 사용자 로그인 URL을 적어 둡니다. 해당 계정 사용자는 AWS Management Console에 로그인할 때 이 URL을 사용해야 합니다. 자세한 내용은 IAM 사용 설명서How Users Sign In to Your Account를 참조하십시오.

    3. 이전 단계를 반복하며 계정 B와 계정 C에 속한 관리자 사용자를 만듭니다.

  2. 계정 C의 경우 계정 ID를 적어 둡니다.

    계정 A에 IAM 역할을 생성하면 신뢰 정책에 따라 계정 ID를 지정해 계정 C에게 역할을 수임할 권한을 부여합니다. 계정 정보는 다음과 같이 찾을 수 있습니다.

    1. https://aws.amazon.com/내 계정/콘솔 드롭다운 메뉴에서 [보안 자격 증명]를 선택합니다.

    2. 적합한 계정 자격 증명으로 로그인.

    3. [Account Identifiers]를 클릭하고 AWS Account IDCanonical User ID를 적어 둡니다.

  3. 버킷 정책을 만들려면 다음과 같은 정보가 필요합니다. 이 값을 적어 둡니다.

    • 계정 A의 정식 사용자 ID - 계정 A 관리자가 계정 B 관리자에게 조건부 업로드 객체 권한을 위임할 때, 해당 조건에 객체의 전적인 권한을 갖게 될 계정 A 사용자의 정식 사용자 ID를 지정합니다.

      참고

      정식 사용자 ID는 Amazon S3로만 사용합니다. 계정 ID의 64자 난독화 버전입니다.

    • 계정 B 관리자의 사용자 ARN - IAM 콘솔 사용자 ARN을 찾을 수 있습니다. 사용자를 선택하고 Summary 탭에서 해당 사용자 ARN을 찾아야 합니다.

      버킷 정책에서 AccountBadmin에 객체 업로드 권한을 위임하고 ARN을 이용해 사용자를 지정합니다. 다음은 ARN 값의 예입니다.

      Copy
      arn:aws:iam::AccountB-ID:user/AccountBadmin
  4. AWS 명령행 인터페이스(CLI)나 Windows PowerShell용 AWS 도구를 설정합니다. 관리자 사용자 자격 증명은 다음과 같이 저장합니다.

    • AWS CLI를 사용하는 경우, 구성 파일에서 AccountAadmin과 AccountBadmin 프로필을 만듭니다.

    • Windows PowerShell용 AWS 툴을 사용하는 경우, 세션의 자격 증명을 AccountAadmin과 AccountBadmin으로 저장해야 합니다.

    지침은 예제 안내를 위한 도구 설정을 참조하십시오.

1단계: 계정 A 작업 수행

계정 A를 버킷 소유자로 예를 들어봅니다. 계정 A가 버킷 소유자이므로 계정 A 사용자 AccountAadmin은 버킷을 만들어 계정 B 관리자에게 객체 업로드 권한을 부여하는 버킷 정책을 연결하고, 계정 C에 역할을 수임할 권한을 부여하는 IAM 역할을 만들어 버킷 내 객체에 액세스할 수 있게 해줍니다.

1.1단계: AWS Management Console에 로그인

우선 계정 A의 IAM User Sign-in URL을 사용해 AccountAadmin 사용자로 AWS Management Console에 로그인합니다. 이 사용자가 버킷을 만들고 버킷에 정책을 연결합니다.

1.2단계: 버킷 생성과 버킷 정책 연결

Amazon S3 콘솔에서 다음과 같이 수행합니다.

  1. 버킷을 만듭니다. 이 연습에서는 버킷 이름을 examplebucket(으)로 가정합니다.

    지침은 S3 버킷을 생성하려면 어떻게 해야 합니까?(출처: Amazon Simple Storage Service 콘솔 사용 설명서)를 참조하십시오.

  2. 다음의 버킷 정책에 연결해 계정 B 관리자에게 객체 업로드 조건부 권한을 위임합니다.

    examplebucket, AccountB-ID, CanonicalUserId-of-AWSaccountA-BucketOwner에 대한 자신의 사용자 값을 입력해 정책을 업데이트합니다.

    Copy
    { "Version": "2012-10-17", "Statement": [ { "Sid": "111", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::AccountB-ID:user/AccountBadmin" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::examplebucket/*" }, { "Sid": "112", "Effect": "Deny", "Principal": { "AWS": "arn:aws:iam::AccountB-ID:user/AccountBadmin" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::examplebucket/*", "Condition": { "StringNotEquals": { "s3:x-amz-grant-full-control": "id=CanonicalUserId-of-AWSaccountA-BucketOwner" } } } ] }

1.3단계: 계정 A에서 계정 C의 교차 계정 액세스를 허용하는 IAM 역할 생성

IAM 콘솔에서 계정 C에게 역할을 수임할 권한을 부여하는 IAM 역할("examplerole")을 생성합니다. 반드시 계정 A에서 역할을 만들어야 하므로 사용자는 계정 A 관리자로 로그인을 유지합니다.

  1. 역할을 만들기 전에 먼저 해당 역할에 필요한 권한을 정의하는 관리형 정책을 준비합니다. 차후 단계에서 이 정책을 해당 역할에 연결합니다.

    1. 왼쪽 탐색 창에서 [Policies]를 클릭한 다음 [Create Policy]를 클릭합니다.

    2. [Create Your Own Policy] 옆의 [Select]를 클릭합니다.

    3. Policy Name 필드에 access-accountA-bucket을 입력합니다.

    4. 다음 액세스 정책을 복사해 Policy Document 필드에 붙여 넣습니다. 액세스 정책은 이 역할에 s3:GetObject 권한을 부여해 계정 C 사용자가 해당 역할을 맡으면 s3:GetObject 작업만 수행할 수 있게 해줍니다.

      Copy
      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::examplebucket/*" } ] }
    5. [Create Policy]를 클릭합니다.

      새로운 정책이 관리형 정책 목록에 나타납니다.

  2. 왼쪽 탐색 창에서 [Roles]를 클릭한 뒤, [Create New Role]을 클릭합니다.

  3. 역할 이름에 examplerole을 입력한 뒤, [Next Step]을 클릭합니다.

  4. Select Role Type에서 [Role for Cross-Account Access]를 선택한 뒤, [Provide access between AWS accounts you own] 옆의 [Select] 버튼을 클릭합니다.

  5. 계정 C 계정 ID를 입력합니다.

    이 연습에서는 사용자가 역할을 수임할 MFA(멀티 팩터 인증)를 필요로 하지 않으므로 해당 옵션을 선택하지 않고 그대로 둡니다.

  6. [Next Step]을 클릭해 역할과 연결되는 권한을 설정합니다.

  7. 사용자가 만든 access-accountA-bucket 정책 옆의 상자를 선택한 뒤, [Next Step]을 클릭합니다.

    Review 페이지를 보면서 역할이 완전히 생성되기 전에 해당 설정을 확인할 수 있습니다. 이 페이지에서 확인할 한 가지 주요 항목은 해당 역할을 사용해야 하는 사용자에게 보낼 수 있는 링크입니다. 사용자가 링크를 클릭하면 계정 ID와 기재된 역할 이름 필드로 된 Switch Role 페이지로 바로 연결됩니다. 이 링크는 모든 교차 계정 역할에 대한 Role Summary 페이지에서도 확인할 수 있습니다.

  8. 역할을 검토하고 [Create Role]을 클릭합니다.

    역할 목록에 examplerole 역할이 표시됩니다.

  9. 역할 이름 [examplerole]을 클릭합니다.

  10. [Trust Relationships] 탭을 선택합니다.

  11. [Show policy document]를 클릭해 나타나는 신뢰 정책이 다음 정책과 일치하는지 확인합니다.

    다음 신뢰 정책으로 계정 C에 sts:AssumeRole 작업을 허용해 계정 C와의 신뢰를 설정합니다. 자세한 내용은 AWS Security Token Service API ReferenceAssumeRole을 참조하십시오.

    Copy
    { "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::AccountC-ID:root" }, "Action": "sts:AssumeRole" } ] }
  12. 사용자가 생성한 examplerole 역할의 Amazon 리소스 이름(ARN)을 적어 둡니다.

    다음 단계 후반에서, IAM 사용자에 이 역할의 수임을 허용할 사용자 정책을 연결하고 ARN 값으로 역할을 식별합니다.

2단계: 계정 B 작업 수행

계정 A가 소유한 examplebucket은 다른 계정 소유의 객체가 필요합니다. 이 단계에서 계정 B 관리자는 명령행 도구를 이용해 객체를 업로드합니다.

  • put-object AWS CLI 명령으로 examplebucket에 객체를 업로드합니다.

    Copy
    aws s3api put-object --bucket examplebucket --key HappyFace.jpg --body HappyFace.jpg --grant-full-control id="canonicalUserId-ofTheBucketOwner" --profile AccountBadmin

    다음을 참조하십시오.

    • --Profile 파라미터가 AccountBadmin 프로필을 지정하면 계정 B가 객체를 소유하게 됩니다.

    • 파라미터 grant-full-control은 버킷 정책에 따라 버킷 소유자에게 객체에 대한 전적인 권한을 부여합니다.

    • --body 파라미터가 업로드할 원본 파일을 식별합니다. 예를 들어, 파일이 Windows 컴퓨터의 C: 드라이브에 있는 경우 c:\HappyFace.jpg로 지정합니다.

3단계: 계정 C 작업 수행

전 단계에서 계정 A가 역할 examplerole을 만들어 계정 C와의 신뢰를 설정했기 때문에 계정 C 사용자는 계정 A에 액세스할 수 있습니다. 이번 단계에서는 계정 C 관리자가 사용자(Dave)를 생성해 계정 A에서 받은 sts:AssumeRole 권한을 Dave에게 위임합니다. Dave는 이 권한으로 examplerole을 수임해 계정 A에 임시로 액세스할 수 있습니다. 계정 A가 이 역할에 연결한 액세스 정책은 Dave가 계정 A에 액세스해 할 수 있는 활동을 제한하는데, 그 중에서도 특히 examplebucket의 객체에 대한 활동을 제한합니다.

3.1단계: 계정 C 사용자 생성과 examplerole 담당 권한 위임

  1. 먼저 계정 C의 IAM 사용자 로그인 URL을 사용해 AccountCadmin 사용자로 AWS Management Console에 로그인합니다.

  2. IAM 콘솔에서 사용자 Dave를 만듭니다.

    이에 관한 지침은 IAM 사용 설명서IAM 사용자 만들기(AWS Management Console) 단원을 참조하십시오.

  3. Dave의 자격 증명을 적어 둡니다. Dave가 examplerole 역할을 수임하려면 이 자격 증명이 필요합니다.

  4. Dave IAM 사용자에 대한 인라인 정책을 만들고 계정 A의 examplerole 역할에 대한 sts:AssumeRole 권한을 Dave에게 위임합니다.

    1. 왼쪽 탐색 창에서 [Users]를 클릭합니다.

    2. 사용자 이름 Dave를 클릭합니다.

    3. 사용자 세부 정보 페이지에서 [Permissions] 탭을 선택한 다음 [Inline Policies] 섹션을 확장합니다.

    4. [click here] 또는 [Create User Policy]를 선택합니다.

    5. [Custom Policy]를 클릭한 후 [Select]를 클릭합니다.

    6. [Policy Name] 필드에 정책 이름을 입력합니다.

    7. 다음 정책을 [Policy Document] 필드에 복사해 넣습니다.

      계정 A ID를 입력해 정책을 업데이트합니다.

      Copy
      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["sts:AssumeRole"], "Resource": "arn:aws:iam::AccountA-ID:role/examplerole" } ] }
    8. [Apply Policy]를 클릭합니다.

  5. 또 다른 프로필 AccountCDave를 추가해 AWS CLI의 구성 파일에 Dave의 자격 증명을 저장합니다.

    Copy
    [profile AccountCDave] aws_access_key_id = UserDaveAccessKeyID aws_secret_access_key = UserDaveSecretAccessKey region = us-west-2

3.2단계: 역할(examplerole) 수임과 액세스 객체

이제 Dave는 다음과 같이 계정 A가 소유한 버킷 내 객체에 액세스할 수 있습니다.

  • Dave는 먼저 자신의 자격 증명으로 examplerole을 수임합니다. 이 때 임시 자격 증명이 반환됩니다.

  • 임시 자격 증명으로 Dave는 계정 A의 버킷 내 객체에 액세스합니다.

  1. 명령 프롬프트에서 AccountCDave 프로필로 다음 AWS CLI assume-role 명령을 실행합니다.

    examplerole가 정의된 계정 A ID를 입력해 명령의 ARN 값을 업데이트합니다.

    Copy
    aws sts assume-role --role-arn arn:aws:iam::accountA-ID:role/examplerole --profile AccountCDave --role-session-name test

    업데이트 시, AWS STS(Security Token Service)가 임시 보안 자격 증명(액세스 키 ID, 보안 액세스 키, 및 보안 토큰)을 반환합니다.

  2. 임시 보안 자격 증명을 TempCred 프로필의 AWS CLI 구성 파일에 저장합니다.

    Copy
    [profile TempCred] aws_access_key_id = temp-access-key-ID aws_secret_access_key = temp-secret-access-key aws_security_token = security-token region = us-west-2
  3. 명령 프롬프트에서 임시 자격 증명으로 다음 AWS CLI 명령을 실행해 객체에 액세스합니다. 예를 들어 명령으로 헤드 객체 API를 지정하고 HappyFace.jpg 객체에 대한 객체 메타데이터를 검색합니다.

    Copy
    aws s3api get-object --bucket examplebucket --key HappyFace.jpg SaveFileAs.jpg --profile TempCred

    examplerole에 연결된 액세스 정책에서 해당 작업을 허용해주어 Amazon S3가 액세스 요청을 처리합니다. 버킷 내 객체에 모든 작업 수행이 가능합니다.

    예를 들어 get-object-acl 등 다른 작업을 시도할 경우, 해당 작업이 허용되지 않는 역할이기 때문에 거부당합니다.

    Copy
    aws s3api get-object-acl --bucket examplebucket --key HappyFace.jpg --profile TempCred

    사용자 Dave로 그 역할을 수임해 임시 자격 증명으로 객체에 액세스합니다. examplebucket의 객체에 액세스하는 계정 C의 애플리케이션으로도 엑세스가 가능합니다. 애플리케이션으로 임시 보안 자격 증명을 얻을 수 있습니다. 또한, 계정 C는 애플리케이션에 examplerole을 맡을 권한을 위임할 수 있습니다.

4단계: 정리

  1. 시험을 완료한 후, 다음과 같이 수행해 정리합니다.

    1. 계정 A의 자격 증명으로 AWS Management Console(AWS Management Console)에 로그인하고 다음과 같이 수행합니다.

      • Amazon S3 콘솔에서 examplebucket에 연결된 버킷 정책을 제거합니다. 버킷 [Properties]의 [Permissions] 섹션에서 정책을 삭제합니다.

      • 이 연습을 위해 버킷을 만들었다면 Amazon S3 콘솔에서 객체를 삭제한 뒤 버킷을 삭제합니다.

      • IAM 콘솔에서 계정 A로 만든 examplerole을 삭제합니다.

      • IAM 콘솔에서 AccountAadmin 사용자를 삭제합니다.

  2. 계정 B의 자격 증명을 사용하여 AWS Management Console(AWS Management Console)에 로그인합니다. IAM 콘솔에서 사용자 AccountBadmin을 삭제합니다.

  3. 계정 C의 자격 증명으로 AWS Management Console(AWS Management Console)에 로그인합니다. IAM 콘솔에서 사용자 AccountCadmin와 사용자 Dave를 삭제합니다.

관련 리소스