역할 수임 - AWS CloudTrail

역할 수임

각 계정에 생성한 각 역할을 수행할 별도의 IAM 사용자를 지정하고 각 IAM 사용자에게 적절한 권한이 있는지 확인해야 합니다.

IAM 사용자 및 역할

시나리오 1과 2에서 필요한 역할 및 정책을 계정 A에 생성한 후에는 계정 B, C, Z 각각의 IAM 사용자를 지정해야 합니다. 각 IAM 사용자는 프로그래밍 방식으로 로그 파일에 액세스하는 데 적합한 역할을 맡습니다. 즉, 계정 B의 사용자는 계정 B에 대해 생성된 역할을 수행하고 계정 C의 사용자는 계정 C에 대해 생성된 역할을 수행하고 계정 Z의 사용자는 계정 Z에 대해 생성된 역할을 수행합니다. 사용자가 역할을 수행하면 AWS는 역할과 연결된 액세스 정책에서 부여한 권한에 따라 로그 파일 나열, 검색, 복사 또는 삭제를 요청하는 데 사용될 수 있는 임시 보안 자격 증명을 반환합니다.

IAM 사용자 작업에 대한 자세한 내용은 IAM 사용자 및 그룹 작업 단원을 참조하세요.

시나리오 1과 2의 주요 차이점은 각 시나리오에서 각 IAM 역할에 대해 생성하는 액세스 정책에 있습니다.

IAM 사용자에 대한 권한 정책 생성

역할에서 허용하는 작업을 수행하려면 IAM 사용자에게 AWS STS AssumeRole API를 호출할 수 있는 권한이 있어야 합니다. 각 IAM 사용자의 ‘사용자 기반 정책’을 편집하여 해당 사용자에게 적절한 권한을 부여해야 합니다. 즉, IAM 사용자에게 연결된 정책에서 [리소스(Resource)] 요소를 설정합니다. 다음 예에서는 계정 B의 IAM 사용자에 대한 정책을 보여 줍니다. 이 정책을 통해 사용자는 앞서 계정 A가 생성한 ‘Test’라는 역할을 맡을 수 있습니다.

IAM 역할에 필요한 정책을 연결하려면
  1. AWS Management Console에 로그인하고 IAM 콘솔을 엽니다.

  2. 수정할 권한을 보유한 사용자를 선택합니다.

  3. 권한(Permissions) 탭을 선택합니다.

  4. [Custom Policy]를 선택합니다.

  5. [Use the policy editor to customize your own set of permissions]를 선택합니다.

  6. 정책 이름을 입력합니다.

  7. 다음 정책을 정책 문서에 제공된 공간에 복사해 넣습니다.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["sts:AssumeRole"], "Resource": "arn:aws:iam::account-A-id:role/Test" } ] }
중요

IAM 사용자만 역할을 맡을 수 있습니다. AWS 루트 계정 자격 증명을 사용하여 역할을 수행할 경우 액세스가 거부됩니다.

AssumeRole 호출

계정 B, C 또는 Z의 사용자는 AWS STS AssumeRole API를 호출하고 역할 세션 이름, 수행할 역할의 Amazon 리소스 번호(ARN) 및 선택적 외부 ID를 전달하는 애플리케이션을 생성하여 역할을 수행할 수 있습니다. 역할 세션 이름은 계정 A가 수행할 역할을 생성할 때 정의합니다. 외부 ID(있는 경우)는 계정 Z가 정의하며 역할 생성 중 포함할 수 있도록 계정 A에 전달됩니다. 자세한 내용은 IAM 사용 설명서AWS 리소스에 대한 액세스 권한을 서드 파티에 부여할 때 외부 ID를 사용하는 방법 단원을 참조하세요. IAM 콘솔을 열어서 계정 A의 ARN을 검색할 수 있습니다.

IAM 콘솔을 사용하여 계정 A의 ARN 값을 찾으려면
  1. [Roles]를 선택합니다.

  2. 검사할 역할을 선택합니다.

  3. [요약(Summary)] 섹션에서 [역할 ARN(Role ARN)]을 찾습니다.

AssumeRole API는 계정 B, C 또는 Z의 사용자가 계정 A의 리소스에 액세스하는 데 사용할 수 있는 임시 자격 증명을 반환합니다. 이 예에서 액세스하려는 리소스는 Amazon S3 버킷 및 버킷에 포함된 로그 파일입니다. 임시 자격 증명에는 역할 액세스 정책에 정의한 권한이 있습니다.

다음 Python 예(AWS SDK for Python (Boto) 사용)에서는 AssumeRole을 호출하는 방법 및 반환된 임시 보안 자격 증명을 사용하여 계정 A가 제어하는 모든 Amazon S3 버킷을 나열하는 방법을 보여 줍니다.

def list_buckets_from_assumed_role(user_key, assume_role_arn, session_name): """ Assumes a role that grants permission to list the Amazon S3 buckets in the account. Uses the temporary credentials from the role to list the buckets that are owned by the assumed role's account. :param user_key: The access key of a user that has permission to assume the role. :param assume_role_arn: The Amazon Resource Name (ARN) of the role that grants access to list the other account's buckets. :param session_name: The name of the STS session. """ sts_client = boto3.client( 'sts', aws_access_key_id=user_key.id, aws_secret_access_key=user_key.secret) try: response = sts_client.assume_role( RoleArn=assume_role_arn, RoleSessionName=session_name) temp_credentials = response['Credentials'] print(f"Assumed role {assume_role_arn} and got temporary credentials.") except ClientError as error: print(f"Couldn't assume role {assume_role_arn}. Here's why: " f"{error.response['Error']['Message']}") raise # Create an S3 resource that can access the account with the temporary credentials. s3_resource = boto3.resource( 's3', aws_access_key_id=temp_credentials['AccessKeyId'], aws_secret_access_key=temp_credentials['SecretAccessKey'], aws_session_token=temp_credentials['SessionToken']) print(f"Listing buckets for the assumed role's account:") try: for bucket in s3_resource.buckets.all(): print(bucket.name) except ClientError as error: print(f"Couldn't list buckets for the account. Here's why: " f"{error.response['Error']['Message']}") raise