AWS 계정 간 CloudTrail 로그 파일 공유 - AWS CloudTrail

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

AWS 계정 간 CloudTrail 로그 파일 공유

이 단원에서는 여러 AWS 계정 간에 CloudTrail 로그 파일을 공유하는 방법을 설명합니다. AWS 계정 간에 로그를 공유하는 데 사용하는 접근 방식은 S3 버킷 구성에 따라 다릅니다. 로그 파일 공유 옵션은 다음과 같습니다.

  • 버킷 소유자 적용S3 객체 소유권은 버킷에 업로드되는 객체의 소유권을 제어하고 액세스 제어 목록(ACL)을 비활성화 또는 활성화하는 데 사용할 수 있는 Amazon S3 버킷 수준 설정입니다. 기본적으로 객체 소유권은 버킷 소유자 적용 설정으로 설정되며 모든 ACL이 비활성화되어 있습니다. ACL이 비활성화되면 버킷 소유자는 버킷의 모든 객체를 소유하고 액세스 관리 정책을 사용하여 데이터에 대한 액세스를 독점적으로 관리합니다. 버킷 소유자 적용 옵션이 설정되면 버킷 정책을 통해 액세스가 관리되므로 사용자가 역할을 수임할 필요가 없습니다.

  • 로그 파일 공유를 위한 역할 수임버킷 소유자 적용 설정을 선택하지 않은 경우 사용자는 S3 버킷의 로그 파일에 액세스하기 위한 역할을 수임해야 합니다.

역할을 수임하여 계정 간에 로그 파일 공유

참고

이 섹션은 버킷 소유자 적용 설정을 사용하지 않는 Amazon S3 버킷에만 적용됩니다.

이 섹션에서는 역할을 수임하여 여러 AWS 계정 간에 CloudTrail 로그 파일을 공유하는 방법과 로그 파일 공유 시나리오를 설명합니다.

  • 시나리오 1: Amazon S3 버킷에 배치된 로그 파일을 생성한 계정에 읽기 전용 액세스 권한을 부여합니다.

  • 시나리오 2: 로그 파일을 분석할 수 있는 타사 계정에 Amazon S3 버킷의 모든 로그 파일에 대한 액세스 권한을 부여합니다.

Amazon S3 버킷의 로그 파일에 대한 읽기 전용 액세스 권한 부여
  1. 로그 파일을 공유할 각 계정에 대해 IAM 역할을 생성합니다. 권한을 부여하려면 관리자여야 합니다.

    역할을 생성할 때 다음 작업을 수행합니다.

    • 다른 AWS 계정 옵션을 선택합니다.

    • 액세스 권한을 부여할 계정의 12자리 계정 ID를 입력합니다.

    • 사용자가 멀티 팩터 인증을 제공해야 역할을 수임할 수 있도록 하려면 [Require MFA] 확인란을 선택합니다.

    • AmazonS3ReadOnlyAccess 정책을 선택합니다.

      참고

      기본적으로 AmazonS3ReadOnlyAccess 정책은 계정 내의 모든 Amazon S3 버킷에 대한 검색 및 나열 권한을 부여합니다.

    IAM 역할의 권한 관리에 대한 자세한 내용은 IAM 사용 설명서의 IAM 역할을 참조하세요.

  2. 로그 파일을 공유할 계정에 읽기 전용 액세스 권한을 부여하는 액세스 정책을 생성합니다.

  3. 각 계정에 로그 파일을 검색하는 역할을 수임하도록 지시합니다.

타사 계정으로 로그 파일에 대한 읽기 전용 액세스 권한 부여
  1. 로그 파일을 공유할 타사 계정에 대해 IAM 역할을 생성합니다. 권한을 부여하려면 관리자여야 합니다.

    역할을 생성할 때 다음 작업을 수행합니다.

    • 다른 AWS 계정 옵션을 선택합니다.

    • 액세스 권한을 부여할 계정의 12자리 계정 ID를 입력합니다.

    • 누가 역할을 수임할 수 있는지에 대한 추가 제어를 제공하는 외부 ID를 입력합니다. 자세한 내용은 IAM 사용 설명서AWS 리소스에 대한 액세스 권한을 서드 파티에 부여할 때 외부 ID를 사용하는 방법 단원을 참조하세요.

    • AmazonS3ReadOnlyAccess 정책을 선택합니다.

      참고

      기본적으로 AmazonS3ReadOnlyAccess 정책은 계정 내의 모든 Amazon S3 버킷에 대한 검색 및 나열 권한을 부여합니다.

  2. 로그 파일을 공유할 타사 계정에 읽기 전용 액세스 권한을 부여하는 액세스 정책을 생성합니다.

  3. 타사 계정에 로그 파일을 검색하는 역할을 수임하도록 지시합니다.

다음 섹션에서는 이 단계에 대해 더욱 자세히 살펴보겠습니다.

소유한 계정에 액세스 권한을 부여하는 액세스 정책 생성

Amazon S3 버킷 소유자는 CloudTrail에서 다른 계정에 대한 로그 파일을 작성하는 Amazon S3 버킷을 완전히 제어할 수 있습니다. 각 사업부의 로그 파일을 해당 파일을 생성한 사업부와 다시 공유하려고 합니다. 그러나 한 부문에서 다른 부분의 로그 파일을 읽지 않으려고 합니다.

예를 들어 계정 B의 로그 파일을 계정 B와 공유하지만 계정 C와는 공유하지 않으려면 계정 B가 신뢰할 수 있는 계정임을 지정하는 새 IAM 역할을 생성해야 합니다. 이 역할 신뢰 정책은 계정 B가 계정 A에 의해 생성된 역할을 수임할 수 있도록 신뢰받고 있음을 지정하며, 다음 예와 같아야 합니다. 콘솔을 사용하여 역할을 생성하면 신뢰 정책이 자동으로 생성됩니다. SDK를 사용하여 역할을 생성하면 CreateRole API에 신뢰 정책을 파라미터로 제공해야 합니다. CLI를 사용하여 역할을 생성하면 create-role CLI 명령에 신뢰 정책을 지정해야 합니다.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::account-B-id:root" }, "Action": "sts:AssumeRole" } ] }

또한 B가 해당 로그 파일을 작성한 위치에서만 계정 B를 읽을 수 있음을 지정하는 액세스 정책을 생성해야 합니다. 액세스 정책은 다음과 같습니다. 리소스 ARN에는 계정 B의 12자리 계정 ID와 집계 프로세스 중 계정 B에 대해 CloudTrail을 활성화할 때 지정한 접두사(있는 경우)가 포함된다는 점에 유의하세요. 접두사 지정에 대한 자세한 내용은 추가 계정에서 추적 생성 단원을 참조하세요.

중요

액세스 정책의 접두사는 계정 B에 대해 CloudTrail을 활성화할 때 지정한 접두사와 정확하게 동일해야 합니다. 동일하지 않은 경우 계정 B에 대한 실제 접두사를 포함하도록 계정 A의 IAM 역할 액세스 정책을 편집해야 합니다. 역할 액세스 정책의 접두사가 계정 B에서 CloudTrail을 활성화할 때 지정한 접두사와 정확하게 동일하지 않으면 계정 B는 해당 로그 파일에 액세스할 수 없습니다.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:Get*", "s3:List*" ], "Resource": "arn:aws:s3:::bucket-name/prefix/AWSLogs/account-B-id/*" }, { "Effect": "Allow", "Action": [ "s3:Get*", "s3:List*" ], "Resource": "arn:aws:s3:::bucket-name" } ] }

추가 계정에 대해 이전 프로세스를 사용합니다.

각 계정에 대한 역할을 생성하고 적절한 신뢰 및 액세스 정책을 지정한 후 해당 계정의 관리자가 각 계정의 IAM 사용자에게 액세스 권한을 부여하면, 계정 B 또는 C의 IAM 사용자는 프로그래밍 방식으로 역할을 맡을 수 있습니다.

자세한 내용은 역할 수임 섹션을 참조하세요.

서드 파티에 액세스 권한을 부여하는 액세스 정책 생성

타사 계정에 대해 별도의 IAM 역할을 생성해야 합니다. 역할을 생성하면 AWS는 계정 Z가 역할 수임이 가능한 신뢰할 수 있는 타사 계정임을 지정하는 신뢰 관계를 자동으로 생성합니다. 역할에 대한 액세스 정책은 계정 Z가 수행할 수 있는 작업을 지정합니다. IAM 역할 생성에 대한 자세한 내용은 IAM 역할 생성을 참조하세요.

예를 들어, AWS에서 생성된 신뢰 관계는 타사 계정(이 예제의 계정 Z)이 생성된 역할을 수임하는 신뢰할 수 있는 계정임을 지정합니다. 다음은 신뢰 정책 예시입니다.

{ "Version": "2012-10-17", "Statement": [{ "Sid": "", "Effect": "Allow", "Principal": {"AWS": "arn:aws:iam::account-Z-id:root"}, "Action": "sts:AssumeRole" }] }

타사 계정에 대한 역할을 생성할 때 외부 ID를 지정하면 액세스 정책에는 계정 Z에 의해 할당된 고유 ID를 테스트하는 추가된 Condition 요소가 포함됩니다. 테스트는 역할이 수임될 때 수행됩니다. 다음 예의 액세스 정책에는 Condition 요소가 있습니다.

자세한 내용은 IAM 사용 설명서AWS 리소스에 대한 액세스 권한을 서드 파티에 부여할 때 외부 ID를 사용하는 방법을 참조하세요.

{ "Version": "2012-10-17", "Statement": [{ "Sid": "", "Effect": "Allow", "Principal": {"AWS": "arn:aws:iam::account-Z-id:root"}, "Action": "sts:AssumeRole", "Condition": {"StringEquals": {"sts:ExternalId": "external-ID-issued-by-account-Z"}} }] }

또한 계정의 액세스 정책도 생성하여 타사 계정이 Amazon S3 버킷의 모든 로그를 읽을 수 있도록 지정해야 합니다. 액세스 정책은 다음 예와 같아야 합니다. Resource 값의 끝에 있는 와일드카드(*)는 타사 계정이 액세스 권한이 부여된 S3 버킷의 모든 로그 파일에 액세스할 수 있음을 나타냅니다.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:Get*", "s3:List*" ], "Resource": "arn:aws:s3:::bucket-name/*" }, { "Effect": "Allow", "Action": [ "s3:Get*", "s3:List*" ], "Resource": "arn:aws:s3:::bucket-name" } ] }

타사 계정에 대한 역할을 생성하고 적절한 신뢰 관계 및 액세스 정책을 지정하면, 타사 계정의 IAM 사용자는 버킷의 로그 파일을 읽을 수 있도록 프로그래밍 방식으로 역할을 맡아야 합니다. 자세한 내용은 역할 수임 섹션을 참조하세요.

역할 수임

각 계정에서 생성한 각 역할을 맡은 별도의 IAM 사용자를 지정해야 합니다. 그런 다음 각 IAM 사용자에게 적절한 권한이 있는지 확인해야 합니다.

IAM 사용자 및 역할

필요한 역할과 정책을 생성한 후에는 파일을 공유하려는 각 계정에서 IAM 사용자를 지정해야 합니다. 각 IAM 사용자는 로그 파일에 액세스하기 위해 프로그래밍 방식으로 적절한 역할을 수임합니다. 사용자가 역할을 맡으면 AWS는 해당 사용자에게 임시 보안 인증을 반환합니다. 그러고 나서 역할과 관련된 액세스 정책에서 부여한 권한에 따라 로그 파일을 나열, 검색, 복사 또는 삭제하도록 요청할 수 있습니다.

다양한 IAM 자격 증명 작업에 대한 자세한 내용은 IAM 자격 증명(사용자, 사용자 그룹 및 역할) 섹션을 참조하세요.

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

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

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

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["sts:AssumeRole"], "Resource": "arn:aws:iam::account-A-id:role/Test" } ] }
고객 관리형 정책을 편집하려면(콘솔)
  1. AWS Management Console에 로그인하고 https://console.aws.amazon.com/iam/에서 IAM 콘솔을 엽니다.

  2. 탐색 창에서 정책을 선택합니다.

  3. 정책 목록에서 편집할 정책 이름을 선택합니다. 검색 상자를 사용하여 정책 목록을 필터링할 수 있습니다.

  4. 권한 탭을 선택한 다음 편집을 선택합니다.

  5. 다음 중 하나를 수행합니다.

    • 시각적 편집기 옵션을 선택하면 JSON 구문을 이해하지 않아도 정책을 변경할 수 있습니다. 정책의 각 권한 블록에 대한 서비스, 작업, 리소스 또는 조건(선택 사항)을 변경할 수 있습니다. 정책을 가져와 추가 권한을 정책 하단에 추가할 수도 있습니다. 변경이 완료되면 다음을 선택하여 계속 진행합니다.

    • JSON 옵션을 선택하고 JSON 텍스트 상자에 입력하거나 붙여 넣어 정책을 수정합니다. 정책을 가져와 추가 권한을 정책 하단에 추가할 수도 있습니다. 정책 검증 동안 생성된 모든 보안 경고, 오류 또는 일반 경고를 해결하고 다음을 선택합니다.

      참고

      언제든지 시각적 편집기 옵션과 JSON 편집기 옵션을 서로 전환할 수 있습니다. 그러나 변경을 적용하거나 시각적 편집기에서 다음을 선택한 경우 IAM은 시각적 편집기에 최적화되도록 정책을 재구성할 수 있습니다. 자세한 내용은 IAM 사용 설명서정책 재구성을 참조하십시오.

  6. 검토 및 저장 페이지에서 이 정책에 정의된 권한을 검토한 다음 변경 사항 저장을 선택하여 작업을 저장합니다.

  7. 관리형 정책 버전이 이미 최댓값인 5개가 있을 경우 변경 사항 저장을 선택하면 대화 상자가 나타납니다. 새 버전을 저장하려면 기본이 아닌 가장 오래된 버전의 정책이 제거되고 새 버전으로 교체됩니다. 옵션으로 새로운 버전을 기본 정책 버전으로 설정할 수도 있습니다.

    변경 사항 저장을 선택하여 새 정책 버전을 저장합니다.

AssumeRole 호출

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

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

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

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

AssumeRole API는 소유 계정의 리소스에 액세스하는 데 사용할 임시 보안 인증을 반환합니다. 이 예제에서 액세스하려는 리소스는 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

AWS 계정 간 CloudTrail 로그 파일 공유 중지

다른 AWS 계정과의 로그 파일 공유를 중지하려면 해당 계정에 대해 생성한 역할을 삭제합니다. 역할 삭제 방법에 대한 내용은 역할 또는 인스턴스 프로파일 삭제를 참조하세요.