메뉴
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. Make sure you have three AWS accounts and each account has one administrator user as shown in the table in the preceding section.

    1. Sign up for AWS accounts, as needed. We refer to these accounts as Account A, Account B, and Account C.

      1. Go to https://aws.amazon.com/s3/ and click Create an AWS Account.

      2. Follow the on-screen instructions.

        AWS will notify you by email when your account is active and available for you to use.

    2. Using Account A credentials, sign in to the IAM console and do the following to create an administrator user:

      • Create user AccountAadmin and note down security credentials. For more information about adding users, see Creating an IAM User in Your AWS Account in the IAM 사용 설명서.

      • Grant AccountAadmin administrator privileges by attaching a user policy giving full access. For instructions, see Working with Policies in the IAM 사용 설명서.

      • In the IAM Console Dashboard, note down the IAM User Sign-In URL. Users in this account must use this URL when signing in to the AWS Management Console. For more information, go to How Users Sign In to Your Account in IAM 사용 설명서.

    3. Repeat the preceding step to create administrator users in Account B and Account C.

  2. For Account C, note down the account ID.

    When you create an IAM role in Account A, the trust policy grants Account C permission to assume the role by specifying the account ID. You can find account information as follows:

    1. Go to https://aws.amazon.com/ and from the My Account/Console drop-down menu, select Security Credentials.

    2. Sign in using appropriate account credentials.

    3. Click Account Identifiers and note down the AWS Account ID and the Canonical User ID.

  3. When creating a bucket policy, you will need the following information. Note down these values:

    • Canonical user ID of Account A – When the Account A administrator grants conditional upload object permission to the Account B administrator, the condition specifies the canonical user ID of the Account A user that must get full-control of the objects.

      참고

      The canonical user ID is the Amazon S3–only concept. It is s 64-character obfuscated version of the account ID.

    • User ARN for Account B administrator – You can find the user ARN in the IAM console. You will need to select the user and find the user's ARN in the Summary tab.

      In the bucket policy, you grant AccountBadmin permission to upload objects and you specify the user using the ARN. Here's an example ARN value:

      Copy
      arn:aws:iam::AccountB-ID:user/AccountBadmin
  4. Set up either the AWS Command Line Interface (CLI) or the AWS Tools for Windows PowerShell. Make sure you save administrator user credentials as follows:

    • If using the AWS CLI, create profiles, AccountAadmin and AccountBadmin, in the config file.

    • If using the AWS Tools for Windows PowerShell, make sure you store credentials for the session as AccountAadmin and AccountBadmin.

    For instructions, see 예제 안내를 위한 도구 설정.

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. Create a bucket. This exercise assumes the bucket name is examplebucket.

    For instructions, see How Do I Create an S3 Bucket? in the Amazon Simple Storage Service 콘솔 사용 설명서.

  2. Attach the following bucket policy granting conditional permission to the Account B administrator permission to upload objects.

    You need to update the policy by providing your own values for examplebucket, AccountB-ID, and the 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. Before creating the role, prepare the managed policy that defines the permissions that the role requires. You attach this policy to the role in a later step.

    1. In the navigation pane on the left, click Policies and then click Create Policy.

    2. Next to Create Your Own Policy, click Select.

    3. Enter access-accountA-bucket in the Policy Name field.

    4. Copy the following access policy and paste it into the Policy Document field. The access policy grants the role s3:GetObject permission so when Account C user assumes the role, it can only perform the s3:GetObject operation.

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

      The new policy appears in the list of managed policies.

  2. In the navigation pane on the left, click Roles and then click Create New Role.

  3. Enter examplerole for the role name, and then click Next Step.

  4. Under Select Role Type, select Role for Cross-Account Access, and then click the Select button next to Provide access between AWS accounts you own.

  5. Enter the Account C account ID.

    For this walkthrough you do not need to require users to have multi-factor authentication (MFA) to assume the role, so leave that option unselected.

  6. Click Next Step to set the permissions that will be associated with the role.

  7. Select the box next to the access-accountA-bucket policy that you created and then click Next Step.

    The Review page appears so you can confirm the settings for the role before it's created. One very important item to note on this page is the link that you can send to your users who need to use this role. Users who click the link go straight to the Switch Role page with the Account ID and Role Name fields already filled in. You can also see this link later on the Role Summary page for any cross-account role.

  8. After reviewing the role, click Create Role.

    The examplerole role is displayed in the list of roles.

  9. Click the role name examplerole.

  10. Select the Trust Relationships tab.

  11. Click Show policy document and verify the trust policy shown matches the following policy.

    The following trust policy establishes trust with Account C, by allowing it the sts:AssumeRole action. For more information, go to AssumeRole in the AWS Security Token Service API Reference.

    Copy
    { "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::AccountC-ID:root" }, "Action": "sts:AssumeRole" } ] }
  12. Note down the Amazon Resource Name (ARN) of the examplerole role you created.

    Later in the following steps, you attach a user policy to allow an IAM user to assume this role, and you identify the role by the ARN value.

2단계: 계정 B 작업 수행

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

  • Using the put-object AWS CLI command, upload an object to the examplebucket.

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

    Note the following:

    • The --Profile parameter specifies AccountBadmin profile, so the object is owned by Account B.

    • The parameter grant-full-control grants the bucket owner full-control permission on the object as required by the bucket policy.

    • The --body parameter identifies the source file to upload. For example, if the file is on the C: drive of a Windows computer, you specify 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. Using the IAM user sign-in URL for Account C, first sign in to the AWS Management Console as AccountCadmin user.

  2. In the IAM console, create a user Dave.

    For instructions, see Creating IAM Users (AWS Management Console) in the IAM 사용 설명서.

  3. Note down the Dave credentials. Dave will need these credentials to assume the examplerole role.

  4. Create an inline policy for the Dave IAM user to delegate the sts:AssumeRole permission to Dave on the examplerole role in account A.

    1. In the navigation pane on the left, click Users.

    2. Click the user name Dave.

    3. On the user details page, select the Permissions tab and then expand the Inline Policies section.

    4. Choose click here (or Create User Policy).

    5. Click Custom Policy, and then click Select.

    6. Enter a name for the policy in the Policy Name field.

    7. Copy the following policy into the Policy Document field.

      You will need to update the policy by providing the Account A ID.

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

  5. Save Dave's credentials to the config file of the AWS CLI by adding another profile, AccountCDave.

    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. At the command prompt, execute the following AWS CLI assume-role command using the AccountCDave profile.

    You will need to update the ARN value in the command by providing the Account A ID where examplerole is defined.

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

    In response, AWS Security Token Service (STS) returns temporary security credentials (access key ID, secret access key, and a security token).

  2. Save the temporary security credentials in the AWS CLI config file under the TempCred profile.

    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. At the command prompt, execute the following AWS CLI command to access objects using the temporary credentials. For example, the command specifies the head-object API to retrieve object metadata for the HappyFace.jpg object.

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

    Because the access policy attached to examplerole allows the actions, Amazon S3 processes the request. You can try any other action on any other object in the bucket.

    If you try any other action—for example, get-object-acl—you will get permission denied because the role is not allowed that action.

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

    We used user Dave to assume the role and access the object using temporary credentials. It could also be an application in Account C that accesses objects in examplebucket. The application can obtain temporary security credentials, and Account C can delegate the application permission to assume examplerole.

4단계: 정리

  1. After you are done testing, you can do the following to clean up.

    1. Sign in to the AWS Management Console (AWS Management Console) using account A credentials, and do the following:

      • In the Amazon S3 console, remove the bucket policy attached to examplebucket. In the bucket Properties, delete the policy in the Permissions section.

      • If the bucket is created for this exercise, in the Amazon S3 console, delete the objects and then delete the bucket.

      • In the IAM console, remove the examplerole you created in Account A.

      • In the IAM console, remove the AccountAadmin user.

  2. Sign in to the AWS Management Console (AWS Management Console) using Account B credentials. In the IAM console, delete user AccountBadmin.

  3. Sign in to the AWS Management Console (AWS Management Console) using Account C credentials. In the IAM console, delete user AccountCadmin and user Dave.

관련 리소스