AWS CloudTrail을 사용하여 IAM 및 AWS STS API 호출 로깅 - AWS Identity and Access Management

AWS CloudTrail을 사용하여 IAM 및 AWS STS API 호출 로깅

IAM 및 AWS STS는 사용자 또는 역할이 수행한 작업에 대한 레코드를 제공하는 서비스인 AWS CloudTrail과 통합됩니다. CloudTrail은 콘솔과 API 호출을 비롯한 모든 IAM에 대한 API 호출 및 AWS STS을 이벤트로 캡처합니다. 추적을 생성하면 CloudTrail 이벤트를 지속적으로 Amazon S3 버킷에 배포할 수 있습니다. 추적을 구성하지 않은 경우에도 CloudTrail 콘솔의 이벤트 기록에서 최신 이벤트를 볼 수 있습니다. CloudTrail을 사용하여 IAM 또는 AWS STS에 요청한 내용의 정보를 얻을 수 있습니다. 예를 들어 어떤 IP 주소에서 요청했는지, 누가 요청했는지, 언제 생성되었는지 등 추가적인 세부 정보를 확인할 수 있습니다.

CloudTrail에 대한 자세한 설명은 AWS CloudTrail 사용자 가이드를 참조하세요.

CloudTrail의 IAM 및 AWS STS 정보

CloudTrail은 계정 생성 시 AWS 계정에서 사용되도록 설정됩니다. IAM 또는 AWS STS에서 활동이 발생하면 해당 활동이 이벤트 기록(Event history)의 다른 AWS 서비스 이벤트와 함께 CloudTrail 이벤트에 기록됩니다. AWS 계정에서 최신 이벤트를 확인, 검색 및 다운로드할 수 있습니다. 자세한 정보는 CloudTrail 이벤트 기록을 사용하여 이벤트 보기를 참조하세요.

IAM 및 AWS STS 이벤트를 비롯하여 AWS 계정의 이벤트 기록을 보유하려면 추적을 생성하세요. CloudTrail은 추적을 사용하여 Amazon S3 버킷으로 로그 파일을 전송할 수 있습니다. 콘솔에서 추적을 생성하면 기본적으로 모든 지역에 추적이 적용됩니다. 추적은 AWS 파티션에 있는 모든 지역의 이벤트를 로깅하고 지정된 Amazon S3 버킷으로 로그 파일을 전송합니다. 또는 CloudTrail 로그에서 수집된 이벤트 데이터를 추가 분석 및 처리하도록 다른 AWS 서비스를 구성할 수 있습니다. 자세한 정보는 다음을 참조하십시오.

모든 IAM 및 AWS STS 작업은 CloudTrail에서 로깅되고 IAM API 참조AWS Security Token Service API 참조에 기록됩니다.

IAM 및 AWS STS API 요청 로깅

CloudTrail은 인증된 모든 API 요청(자격 증명 사용)을 IAM 및 AWS STS API 작업으로 로그합니다. 또한 CloudTrail은 인증되지 않은 요청을 AWS STS 작업, AssumeRoleWithSAMLAssumeRoleWithWebIdentity에 로그하고 자격 증명 제공자가 제공한 정보를 로그합니다. 이 정보를 사용하여 위임된 역할을 지닌 페더레이션 사용자의 호출을 외부 페더레이션 호출자에 다시 매핑할 수 있습니다. AssumeRole의 경우, 호출을 원래 AWS 서비스 또는 원래 사용자의 계정에 다시 매핑할 수 있습니다. CloudTrail 로그 항목에 있는 JSON 데이터의 userIdentity 섹션에는 특정 페더레이션 사용자에게 AssumeRole* 요청을 매핑하는 데 필요한 정보가 들어 있습니다. 자세한 내용은 AWS CloudTrail 사용 설명서CloudTrail userIdentity 요소를 참조하세요.

예를 들어 IAM CreateUser, DeleteRole, ListGroups 및 기타 API 작업에 대한 호출은 모두 CloudTrail에 로깅됩니다.

이러한 유형의 로그 항목에 대한 예시는 이번 주제의 뒷 부분에 제시됩니다.

다른 AWS 서비스에 대한 API 요청 로깅

다른 AWS 서비스 API 작업에 대해 인증된 요청은 CloudTrail에 로깅되며, 이 로그 항목에는 요청자에 대한 정보가 저장됩니다.

예를 들어 Amazon EC2 인스턴스 나열 요청을 했거나 AWS CodeDeploy 배포 그룹을 생성했다고 가정합시다. 요청한 사람이나 서비스에 대한 세부 내용은 그 요청의 로그 항목에 들어 있습니다. 이 정보로 AWS 계정 루트 사용자, IAM 사용자, 역할, 또는 다른 AWS 서비스에 의한 요청인지 판단할 수 있습니다.

CloudTrail 로그 항목의 사용자 자격 증명 정보에 대한 자세한 내용은 AWS CloudTrail 사용 설명서userIdentity 요소를 참조하세요.

사용자 로그인 이벤트 로깅

CloudTrail은 로그인 이벤트를 AWS Management Console, AWS 토론 포럼 및 AWS Marketplace에 로그합니다. CloudTrail은 IAM 사용자 및 페더레이션 사용자에 대해 성공 및 실패한 로그인 시도를 기록합니다.

루트 사용자 로그인의 성공 및 실패에 대한 샘플 CloudTrail 이벤트를 보려면 AWS CloudTrail사용 설명서루트 사용자에 대한 이벤트 레코드의 예제를 참조하세요.

보안 모범 사례의 일환으로 AWS는 잘못된 사용자 이름으로 인해 로그인에 실패하더라도 입력한 IAM 사용자 이름 텍스트를 로깅하지 않습니다. 사용자 이름 텍스트는 HIDDEN_DUE_TO_SECURITY_REASONS 값으로 마스킹 처리됩니다. 마스킹 처리의 예는 이번 주제 후반부의 잘못된 사용자 이름으로 인한 로그인 실패 이벤트의 예 섹션을 참조하세요. 이러한 오류는 사용자 오류로 인해 발생할 수 있으므로 사용자 이름 텍스트는 가려집니다. 이러한 오류를 기록하면 잠재적으로 중요한 정보가 노출될 수 있습니다. 예:

  • 우발적으로 사용자 이름 상자에 암호를 입력한 경우

  • AWS 계정의 로그인 페이지 링크를 선택하고서 다른 AWS 계정의 계정 번호를 입력하는 경우

  • 로그인하려는 계정을 잊고 우발적으로 개인 이메일 계정의 사용자 이름, 금융 서비스 로그인 식별자, 또는 기타 프라이빗 ID를 입력하는 경우

임시 자격 증명에 대한 로그인 이벤트 로깅

보안 주체가 임시 자격 증명을 요청할 때 보안 주체 유형에 의해 이벤트를 CloudTrail 로그에 기록하는 방법이 결정됩니다. 보안 주체가 다른 계정의 역할을 맡는 경우 이는 복잡할 수 있습니다. 역할 크로스 계정 작업과 관련된 작업을 수행하기 위한 여러 API 호출이 있습니다. 먼저 보안 주체는 AWS STS API를 호출하여 임시 자격 증명을 검색합니다. 해당 작업은 호출 계정과 AWS STS 작업이 수행되는 계정에 기록됩니다. 그런 다음 보안 주체는 역할을 사용하여 맡은 역할의 계정에서 다른 API 호출을 수행합니다.

역할 신뢰 정책에서 sts:SourceIdentity 조건 키를 사용하여 사용자가 역할을 수임할 때 자격 증명을 지정하도록 요구할 수 있습니다. 예를 들어 IAM 사용자가 자신의 사용자 이름을 소스 자격 증명으로 지정하도록 요구할 수 있습니다. 이를 통해 AWS에서 특정 작업을 수행한 사용자를 확인할 수 있습니다. 자세한 내용은 sts:SourceIdentity 단원을 참조하십시오. 역할 신뢰 정책에서 sts:RoleSessionName을 사용하여 사용자가 역할을 수임할 때 세션 이름을 지정하도록 요구할 수 있습니다. 이렇게 하면 AWS CloudTrail 로그를 검토할 때 여러 보안 주체가 사용하는 역할의 역할 세션을 구분할 수 있습니다.

다음 표는 임시 자격 증명을 생성하는 각 AWS STS API 호출에 대해 CloudTrail에서 다양한 사용자 자격 증명 정보를 기록하는 방법을 보여줍니다.

보안 주체 유형 STS API 호출자 계정에 대한 CloudTrail 로그의 사용자 자격 증명 수임하는 역할 계정에 대한 CloudTrail 로그의 사용자 자격 증명 역할의 후속 API 호출에 대한 CloudTrail 로그의 사용자 자격 증명
AWS 계정 루트 사용자 보안 인증 GetSessionToken 루트 사용자 자격 증명 역할 소유자 계정은 호출 계정과 동일 루트 사용자 자격 증명
IAM 사용자 GetSessionToken IAM 사용자 자격 증명 역할 소유자 계정은 호출 계정과 동일 IAM 사용자 자격 증명
IAM 사용자 GetFederationToken IAM 사용자 자격 증명 역할 소유자 계정은 호출 계정과 동일 IAM 사용자 자격 증명
IAM 사용자 AssumeRole IAM 사용자 자격 증명 계정 번호 및 보안 주체 ID(사용자인 경우) 또는 AWS 서비스 보안 주체 역할 자격 증명만(사용자 없음)
외부에서 인증된 사용자 AssumeRoleWithSAML 해당 사항 없음 SAML 사용자 자격 증명 역할 자격 증명만(사용자 없음)
외부에서 인증된 사용자 AssumeRoleWithWebIdentity 해당 사항 없음 OIDC/웹 사용자 자격 증명 역할 자격 증명만(사용자 없음)

CloudTrail은 리소스를 변형하지 않는 작업을 읽기 전용으로 간주합니다. 읽기 전용 이벤트를 기록할 때 CloudTrail은 로그에서 responseElements 정보를 수정합니다. CloudTrail이 읽기 전용이 아닌 이벤트를 기록하는 경우 로그 항목에 전체 responseElements가 표시됩니다. 하지만 AWS STS API AssumeRole, AssumeRoleWithSAMLAssumeRoleWithWebIdentity의 경우 읽기 전용으로 기록되더라도 CloudTrail은 이러한 API의 로그에 전체 responseElements를 포함합니다.

다음 표는 임시 자격 증명을 생성하는 각 AWS STS API 호출에 대해 CloudTrail에서 responseElementsreadOnly 정보를 기록하는 방법을 보여줍니다.

STS API 응답 요소 정보 읽기 전용
AssumeRole 포함 true
AssumeRoleWithSAML 포함 true
AssumeRoleWithWebIdentity 포함 true
GetFederationToken 포함 false
GetSessionToken 포함 false

CloudTrail 로그의 IAM API 이벤트 예제

CloudTrail 로그 파일에는 JSON 형식의 이벤트 정보가 포함되어 있습니다. API 이벤트는 단일 API 요청을 나타내며 보안 주체, 요청된 작업, 모든 파라미터, 작업 날짜 및 시간에 대한 정보를 포함합니다.

CloudTrail 로그 파일의 IAM API 이벤트 예제

다음은 IAM GetUserPolicy 작업 요청에 대한 CloudTrail 로그 항목 예제입니다.

{ "eventVersion": "1.05", "userIdentity": { "type": "IAMUser", "principalId": "AIDACKCEVSQ6C2EXAMPLE", "arn": "arn:aws:iam::444455556666:user/JaneDoe", "accountId": "444455556666", "accessKeyId": "AKIAI44QH8DHBEXAMPLE", "userName": "JaneDoe", "sessionContext": { "attributes": { "mfaAuthenticated": "false", "creationDate": "2014-07-15T21:39:40Z" } }, "invokedBy": "signin.amazonaws.com" }, "eventTime": "2014-07-15T21:40:14Z", "eventSource": "iam.amazonaws.com", "eventName": "GetUserPolicy", "awsRegion": "us-east-2", "sourceIPAddress": "signin.amazonaws.com", "userAgent": "signin.amazonaws.com", "requestParameters": { "userName": "JaneDoe", "policyName": "ReadOnlyAccess-JaneDoe-201407151307" }, "responseElements": null, "requestID": "9EXAMPLE-0c68-11e4-a24e-d5e16EXAMPLE", "eventID": "cEXAMPLE-127e-4632-980d-505a4EXAMPLE" }

위 이벤트 정보에서 ReadOnlyAccess-JaneDoe-201407151307 요소에 지정한 것처럼 사용자 JaneDoe을 의미하는 requestParameters이라는 이름의 사용자 정책을 가져오는 요청인 것을 알 수 있습니다. 그 밖에도 요청자는 JaneDoe이라는 이름의 IAM 사용자이고, 2014년 7월 15일 오후 9시 40분(UTC)에 생성된 것도 확인 가능합니다. 여기서는 userAgent 요소를 통해 요청이 AWS Management Console에서 이루어진 것도 알 수 있습니다.

CloudTrail 로그의 AWS STS API 이벤트 예제

CloudTrail 로그 파일에는 JSON 형식의 이벤트 정보가 포함되어 있습니다. API 이벤트는 단일 API 요청을 나타내며 보안 주체, 요청된 작업, 모든 파라미터, 작업 날짜 및 시간에 대한 정보를 포함합니다.

CloudTrail 로그 파일의 크로스 계정 AWS STS API 이벤트의 예

계정 777788889999에 JohnDoe라는 이름의 IAM 사용자가 계정 111122223333의 역할 EC2-dev를 수임하기 위해 AssumeRole AWS STS 작업을 호출합니다. 계정 관리자는 사용자가 역할을 수임할 때 해당 사용자 이름과 동일한 소스 자격 증명을 설정하도록 요구합니다. 사용자는 값이 JohnDoe인 소스 자격 증명을 전달합니다.

{ "eventVersion": "1.05", "userIdentity": { "type": "IAMUser", "principalId": "AIDAQRSTUVWXYZEXAMPLE", "arn": "arn:aws:iam::777788889999:user/JohnDoe", "accountId": "777788889999", "accessKeyId": "AKIAIOSFODNN7EXAMPLE", "userName": "JohnDoe" }, "eventTime": "2014-07-18T15:07:39Z", "eventSource": "sts.amazonaws.com", "eventName": "AssumeRole", "awsRegion": "us-east-2", "sourceIPAddress": "192.0.2.101", "userAgent": "aws-cli/1.11.10 Python/2.7.8 Linux/3.2.45-0.6.wd.865.49.315.metal1.x86_64 botocore/1.4.67", "requestParameters": { "roleArn": "arn:aws:iam::111122223333:role/EC2-dev", "roleSessionName": "JohnDoe-EC2-dev", "sourceIdentity": "JohnDoe", "serialNumber": "arn:aws:iam::777788889999:mfa" }, "responseElements": { "credentials": { "sessionToken": "<encoded session token blob>", "accessKeyId": "ASIAI44QH8DHBEXAMPLE", "expiration": "Jul 18, 2023, 4:07:39 PM" }, "assumedRoleUser": { "assumedRoleId": "AIDAQRSTUVWXYZEXAMPLE:JohnDoe-EC2-dev", "arn": "arn:aws:sts::111122223333:assumed-role/EC2-dev/JohnDoe-EC2-dev" }, "sourceIdentity": "JohnDoe" }, "resources": [ { "ARN": "arn:aws:iam::111122223333:role/EC2-dev", "accountId": "111122223333", "type": "AWS::IAM::Role" } ], "requestID": "4EXAMPLE-0e8d-11e4-96e4-e55c0EXAMPLE", "sharedEventID": "bEXAMPLE-efea-4a70-b951-19a88EXAMPLE", "eventID": "dEXAMPLE-ac7f-466c-a608-4ac8dEXAMPLE", "eventType": "AwsApiCall", "recipientAccountId": "111122223333" }

두 번째 예제는 동일한 요청에 대해 수임한 역할 계정(111122223333)의 CloudTrail 로그 항목입니다.

{ "eventVersion": "1.05", "userIdentity": { "type": "AWSAccount", "principalId": "AIDAQRSTUVWXYZEXAMPLE", "accountId": "777788889999" }, "eventTime": "2014-07-18T15:07:39Z", "eventSource": "sts.amazonaws.com", "eventName": "AssumeRole", "awsRegion": "us-east-2", "sourceIPAddress": "192.0.2.101", "userAgent": "aws-cli/1.11.10 Python/2.7.8 Linux/3.2.45-0.6.wd.865.49.315.metal1.x86_64 botocore/1.4.67", "requestParameters": { "roleArn": "arn:aws:iam::111122223333:role/EC2-dev", "roleSessionName": "JohnDoe-EC2-dev", "sourceIdentity": "JohnDoe", "serialNumber": "arn:aws:iam::777788889999:mfa" }, "responseElements": { "credentials": { "sessionToken": "<encoded session token blob>", "accessKeyId": "ASIAI44QH8DHBEXAMPLE", "expiration": "Jul 18, 2014, 4:07:39 PM" }, "assumedRoleUser": { "assumedRoleId": "AIDAQRSTUVWXYZEXAMPLE:JohnDoe-EC2-dev", "arn": "arn:aws:sts::111122223333:assumed-role/EC2-dev/JohnDoe-EC2-dev" }, "sourceIdentity": "JohnDoe" }, "requestID": "4EXAMPLE-0e8d-11e4-96e4-e55c0EXAMPLE", "sharedEventID": "bEXAMPLE-efea-4a70-b951-19a88EXAMPLE", "eventID": "dEXAMPLE-ac7f-466c-a608-4ac8dEXAMPLE" }

CloudTrail 로그 파일의 AWS STS 역할 체인 API 이벤트의 예

다음은 111111111111 계정의 John Doe가 만든 요청에 대한 CloudTrail 로그 항목 예제입니다. John은 이전에 자신의 JohnDoe 사용자를 사용하여 JohnRole1 역할을 맡았습니다. 이 요청에 대해 그는 해당 역할의 자격 증명을 사용하여 JohnRole2 역할을 맡습니다. 이를 역할 체인이라고 합니다. JohnDoe1 역할을 수임할 때 설정한 소스 자격 증명은 JohnRole2에 대한 수임 요청에서 지속됩니다. John이 역할을 수임할 때 다른 소스 자격 증명을 설정하려고 하면 요청이 거부됩니다. John은 요청에 두 개의 세션 태그를 전달합니다. 그는 두 태그를 전이적으로 설정합니다. John은 JohnRole1을 맡을 때 전이적으로 설정했기 때문에 요청은 Department 태그를 전이적으로 상속합니다. 소스 자격 증명에 대한 자세한 내용은 위임된 역할로 수행한 작업 모니터링 및 제어 섹션을 참조하세요. 역할 체인의 전이적 키에 대한 자세한 내용은 세션 태그를 사용하는 역할 체인 섹션을 참조하세요.

{ "eventVersion": "1.05", "userIdentity": { "type": "AssumedRole", "principalId": "AROAIN5ATK5U7KEXAMPLE:JohnRole1", "arn": "arn:aws:sts::111111111111:assumed-role/JohnDoe/JohnRole1", "accountId": "111111111111", "accessKeyId": "ASIAIOSFODNN7EXAMPLE", "sessionContext": { "attributes": { "mfaAuthenticated": "false", "creationDate": "2019-10-02T21:50:54Z" }, "sessionIssuer": { "type": "Role", "principalId": "AROAIN5ATK5U7KEXAMPLE", "arn": "arn:aws:iam::111111111111:role/JohnRole1", "accountId": "111111111111", "userName": "JohnDoe" }, "sourceIdentity": "JohnDoe" } }, "eventTime": "2019-10-02T22:12:29Z", "eventSource": "sts.amazonaws.com", "eventName": "AssumeRole", "awsRegion": "us-east-2", "sourceIPAddress": "123.145.67.89", "userAgent": "aws-cli/1.16.248 Python/3.4.7 Linux/4.9.184-0.1.ac.235.83.329.metal1.x86_64 botocore/1.12.239", "requestParameters": { "incomingTransitiveTags": { "Department": "Engineering" }, "tags": [ { "value": "johndoe@example.com", "key": "Email" }, { "value": "12345", "key": "CostCenter" } ], "roleArn": "arn:aws:iam::111111111111:role/JohnRole2", "roleSessionName": "Role2WithTags", "sourceIdentity": "JohnDoe", "transitiveTagKeys": [ "Email", "CostCenter" ], "durationSeconds": 3600 }, "responseElements": { "credentials": { "accessKeyId": "ASIAI44QH8DHBEXAMPLE", "expiration": "Oct 2, 2019, 11:12:29 PM", "sessionToken": "AgoJb3JpZ2luX2VjEB4aCXVzLXdlc3QtMSJHMEXAMPLETOKEN+//rJb8Lo30mFc5MlhFCEbubZvEj0wHB/mDMwIgSEe9gk/Zjr09tZV7F1HDTMhmEXAMPLETOKEN/iEJ/rkqngII9///////////ARABGgw0MjgzMDc4NjM5NjYiDLZjZFKwP4qxQG5sFCryASO4UPz5qE97wPPH1eLMvs7CgSDBSWfonmRTCfokm2FN1+hWUdQQH6adjbbrVLFL8c3jSsBhQ383AvxpwK5YRuDE1AI/+C+WKFZb701eiv9J5La2EXAMPLETOKEN/c7S5Iro1WUJ0q3Cxuo/8HUoSxVhQHM7zF7mWWLhXLEQ52ivL+F6q5dpXu4aTFedpMfnJa8JtkWwG9x1Axj0Ypy2ok8v5unpQGWych1vwdvj6ez1Dm8Xg1+qIzXILiEXAMPLETOKEN/vQGqu8H+nxp3kabcrtOvTFTvxX6vsc8OGwUfHhzAfYGEXAMPLETOKEN/L6v1yMM3B1OwFOrQBno1HEjf1oNI8RnQiMNFdUOtwYj7HUZIOCZmjfN8PPHq77N7GJl9lzvIZKQA0Owcjg+mc78zHCj8y0siY8C96paEXAMPLETOKEN/E3cpksxWdgs91HRzJWScjN2+r2LTGjYhyPqcmFzzo2mCE7mBNEXAMPLETOKEN/oJy+2o83YNW5tOiDmczgDzJZ4UKR84yGYOMfSnF4XcEJrDgAJ3OJFwmTcTQICAlSwLEXAMPLETOKEN" }, "assumedRoleUser": { "assumedRoleId": "AROAIFR7WHDTSOYQYHFUE:Role2WithTags", "arn": "arn:aws:sts::111111111111:assumed-role/test-role/Role2WithTags" }, "sourceIdentity": "JohnDoe" }, "requestID": "b96b0e4e-e561-11e9-8b3f-7b396EXAMPLE", "eventID": "1917948f-3042-46ec-98e2-62865EXAMPLE", "resources": [ { "ARN": "arn:aws:iam::111111111111:role/JohnRole2", "accountId": "111111111111", "type": "AWS::IAM::Role" } ], "eventType": "AwsApiCall", "recipientAccountId": "111111111111" }

CloudTrail 로그 파일의 AWS 서비스 AWS STS API 이벤트의 예

다음은 서비스 역할의 권한을 사용하여 다른 서비스 API를 호출하는 AWS 서비스의 요청에 대한 CloudTrail 로그 항목 예제입니다. 777788889999 계정에서 만든 요청에 대한 CloudTrail 로그 항목을 보여줍니다.

{ "eventVersion": "1.04", "userIdentity": { "type": "AssumedRole", "principalId": "AROAQRSTUVWXYZEXAMPLE:devdsk", "arn": "arn:aws:sts::777788889999:assumed-role/AssumeNothing/devdsk", "accountId": "777788889999", "accessKeyId": "ASIAI44QH8DHBEXAMPLE", "sessionContext": { "attributes": { "mfaAuthenticated": "false", "creationDate": "2016-11-14T17:25:26Z" }, "sessionIssuer": { "type": "Role", "principalId": "AROAQRSTUVWXYZEXAMPLE", "arn": "arn:aws:iam::777788889999:role/AssumeNothing", "accountId": "777788889999", "userName": "AssumeNothing" } } }, "eventTime": "2016-11-14T17:25:45Z", "eventSource": "s3.amazonaws.com", "eventName": "DeleteBucket", "awsRegion": "us-east-2", "sourceIPAddress": "192.0.2.1", "userAgent": "[aws-cli/1.11.10 Python/2.7.8 Linux/3.2.45-0.6.wd.865.49.315.metal1.x86_64 botocore/1.4.67]", "requestParameters": { "bucketName": "my-test-bucket-cross-account" }, "responseElements": null, "requestID": "EXAMPLE463D56D4C", "eventID": "dEXAMPLE-265a-41e0-9352-4401bEXAMPLE", "eventType": "AwsApiCall", "recipientAccountId": "777788889999" }

CloudTrail 로그 파일의 SAML AWS STS API 이벤트의 예

다음은 AWS STS AssumeRoleWithSAML 작업 요청에 대한 CloudTrail 로그 항목 예제입니다. 이 요청에는 SAML 어설션을 통해 세션 태그로 전달되는 SAML 속성 CostCenterProject가 포함됩니다. 이러한 태그는 역할 체인 시나리오에서 지속되도록 전이적으로 설정됩니다. 요청에는 선택적 API 파라미터 DurationSeconds이(가) 포함되며 이는 CloudTrail 로그에서 durationSeconds(으)로 표시되며 1800초로 설정됩니다. 요청에는 SAML 어설션에서 전달되는 SAML 속성 sourceIdentity도 포함됩니다. 결과 역할 세션 자격 증명을 사용하여 다른 역할을 수임하는 경우 이 소스 자격 증명은 유지됩니다.

{ "eventVersion": "1.08", "userIdentity": { "type": "SAMLUser", "principalId": "SampleUkh1i4+ExamplexL/jEvs=:SamlExample", "userName": "SamlExample", "identityProvider": "bdGOnTesti4+ExamplexL/jEvs=" }, "eventTime": "2023-08-28T18:30:58Z", "eventSource": "sts.amazonaws.com", "eventName": "AssumeRoleWithSAML", "awsRegion": "us-east-2", "sourceIPAddress": "AWS Internal", "userAgent": "aws-internal/3 aws-sdk-java/1.12.479 Linux/5.10.186-157.751.amzn2int.x86_64 OpenJDK_64-Bit_Server_VM/17.0.7+11 java/17.0.7 kotlin/1.3.72 vendor/Amazon.com_Inc. cfg/retry-mode/standard", "requestParameters": { "sAMLAssertionID": "_c0046cEXAMPLEb9d4b8eEXAMPLE2619aEXAMPLE", "roleSessionName": "MyAssignedRoleSessionName", "sourceIdentity": "MySAMLUser", "principalTags": { "CostCenter": "987654", "Project": "Unicorn", "Department": "Engineering" }, "transitiveTagKeys": [ "CostCenter", "Project" ], "roleArn": "arn:aws:iam::444455556666:role/SAMLTestRoleShibboleth", "principalArn": "arn:aws:iam::444455556666:saml-provider/Shibboleth", "durationSeconds": 1800 }, "responseElements": { "credentials": { "accessKeyId": "ASIAIOSFODNN7EXAMPLE", "sessionToken": "<encoded session token blob>", "expiration": "Aug 28, 2023, 7:00:58 PM" }, "assumedRoleUser": { "assumedRoleId": "AROAD35QRSTUVWEXAMPLE:MyAssignedRoleSessionName", "arn": "arn:aws:sts::444455556666:assumed-role/SAMLTestRoleShibboleth/MyAssignedRoleSessionName" }, "packedPolicySize": 1, "subject": "SamlExample", "subjectType": "transient", "issuer": "https://server.example.com/idp/shibboleth", "audience": "https://signin.aws.amazon.com/saml", "nameQualifier": "bdGOnTesti4+ExamplexL/jEvs=", "sourceIdentity": "MySAMLUser" }, "requestID": "6EXAMPLE-e595-11e5-b2c7-c974fEXAMPLE", "eventID": "dEXAMPLE-265a-41e0-9352-4401bEXAMPLE", "readOnly": true, "resources": [ { "accountId": "444455556666", "type": "AWS::IAM::Role", "ARN": "arn:aws:iam::444455556666:role/SAMLTestRoleShibboleth" }, { "accountId": "444455556666", "type": "AWS::IAM::SAMLProvider", "ARN": "arn:aws:iam::444455556666:saml-provider/test-saml-provider" } ], "eventType": "AwsApiCall", "managementEvent": true, "recipientAccountId": "444455556666", "eventCategory": "Management", "tlsDetails": { "tlsVersion": "TLSv1.2", "cipherSuite": "ECDHE-RSA-AES128-GCM-SHA256", "clientProvidedHostHeader": "sts.us-east-2.amazonaws.com" } }

CloudTrail 로그 파일의 예시 OIDC AWS STS API 이벤트

다음은 AWS STS AssumeRoleWithWebIdentity 작업 요청에 대한 CloudTrail 로그 항목 예제입니다. 이 요청에는 자격 증명 공급자 토큰을 통해 세션 태그로 전달되는 속성 CostCenterProject가 포함됩니다. 이러한 태그는 역할 체인 시나리오에서 지속되도록 전이적으로 설정됩니다. 요청에는 자격 증명 공급자 토큰의 sourceIdentity 특성이 포함됩니다. 결과 역할 세션 자격 증명을 사용하여 다른 역할을 수임하는 경우 이 소스 자격 증명은 유지됩니다.

{ "eventVersion": "1.05", "userIdentity": { "type": "WebIdentityUser", "principalId": "accounts.google.com:<id-of-application>.apps.googleusercontent.com:<id-of-user>", "userName": "<id of user>", "identityProvider": "accounts.google.com" }, "eventTime": "2016-03-23T01:39:51Z", "eventSource": "sts.amazonaws.com", "eventName": "AssumeRoleWithWebIdentity", "awsRegion": "us-east-2", "sourceIPAddress": "192.0.2.101", "userAgent": "aws-cli/1.3.23 Python/2.7.6 Linux/2.6.18-164.el5", "requestParameters": { "sourceIdentity": "MyWebIdentityUser", "durationSeconds": 3600, "roleArn": "arn:aws:iam::444455556666:role/FederatedWebIdentityRole", "roleSessionName": "MyAssignedRoleSessionName" "principalTags": { "CostCenter": "24680", "Project": "Pegasus" }, "transitiveTagKeys": [ "CostCenter", "Project" ], }, "responseElements": { "provider": "accounts.google.com", "subjectFromWebIdentityToken": "<id of user>", "sourceIdentity": "MyWebIdentityUser", "audience": "<id of application>.apps.googleusercontent.com", "credentials": { "accessKeyId": "ASIAIOSFODNN7EXAMPLE", "expiration": "Mar 23, 2016, 2:39:51 AM", "sessionToken": "<encoded session token blob>" }, "assumedRoleUser": { "assumedRoleId": "AROACQRSTUVWRAOEXAMPLE:MyAssignedRoleSessionName", "arn": "arn:aws:sts::444455556666:assumed-role/FederatedWebIdentityRole/MyAssignedRoleSessionName" } }, "resources": [ { "ARN": "arn:aws:iam::444455556666:role/FederatedWebIdentityRole", "accountId": "444455556666", "type": "AWS::IAM::Role" } ], "requestID": "6EXAMPLE-e595-11e5-b2c7-c974fEXAMPLE", "eventID": "bEXAMPLE-0b30-4246-b28c-e3da3EXAMPLE", "eventType": "AwsApiCall", "recipientAccountId": "444455556666" }

CloudTrail 로그의 로그인 이벤트의 예

CloudTrail 로그 파일에는 JSON 형식의 이벤트 정보가 포함되어 있습니다. 로그인 이벤트는 단일 로그인 요청을 나타내며 로그인 보안 주체, 리전, 작업 날짜 및 시간에 대한 정보를 포함합니다.

CloudTrail 로그 파일의 로그인 성공 이벤트의 예

다음은 성공한 로그인 이벤트에 대한 CloudTrail 로그 항목을 나타낸 예제입니다.

{ "eventVersion": "1.05", "userIdentity": { "type": "IAMUser", "principalId": "AIDACKCEVSQ6C2EXAMPLE", "arn":"arn:aws:iam::111122223333:user/JohnDoe", "accountId": "111122223333", "userName": "JohnDoe" }, "eventTime": "2014-07-16T15:49:27Z", "eventSource": "signin.amazonaws.com", "eventName": "ConsoleLogin", "awsRegion": "us-east-2", "sourceIPAddress": "192.0.2.110", "userAgent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0", "requestParameters": null, "responseElements": { "ConsoleLogin": "Success" }, "additionalEventData": { "MobileVersion": "No", "LoginTo": "https://console.aws.amazon.com/s3/", "MFAUsed": "No" }, "eventID": "3fcfb182-98f8-4744-bd45-10a395ab61cb" }

CloudTrail 로그 파일에 저장된 정보에 대한 자세한 내용은 AWS CloudTrail 사용 설명서CloudTrail 이벤트 참조를 참조하세요.

CloudTrail 로그 파일의 로그인 실패 이벤트의 예

다음은 실패한 로그인 이벤트에 대한 CloudTrail 로그 항목을 나타낸 예제입니다.

{ "eventVersion": "1.05", "userIdentity": { "type": "IAMUser", "principalId": "AIDACKCEVSQ6C2EXAMPLE", "arn":"arn:aws:iam::111122223333:user/JaneDoe", "accountId": "111122223333", "userName": "JaneDoe" }, "eventTime": "2014-07-08T17:35:27Z", "eventSource": "signin.amazonaws.com", "eventName": "ConsoleLogin", "awsRegion": "us-east-2", "sourceIPAddress": "192.0.2.100", "userAgent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0", "errorMessage": "Failed authentication", "requestParameters": null, "responseElements": { "ConsoleLogin": "Failure" }, "additionalEventData": { "MobileVersion": "No", "LoginTo": "https://console.aws.amazon.com/sns", "MFAUsed": "No" }, "eventID": "11ea990b-4678-4bcd-8fbe-62509088b7cf" }

이 정보에서 userIdentity 요소에도 나와 있듯이 JaneDoe라는 이름의 IAM 사용자가 로그인을 시도한 것을 알 수 있습니다. 또한 responseElements 요소를 보면 로그인 시도가 실패한 것도 확인됩니다. 그리고 JaneDoe가 Amazon SNS 콘솔에 로그인하려고 시도한 일시는 2014년 7월 8일 오후 5시 35분(UTC)입니다.

잘못된 사용자 이름으로 인한 로그인 실패 이벤트의 예

다음은 잘못된 사용자 이름을 입력하여 로그인을 실패한 이벤트의 CloudTrail 로그 항목을 나타낸 예제입니다. 이때 AWS는 userName 텍스트를 HIDDEN_DUE_TO_SECURITY_REASONS로 마스킹 처리하여 잠재적으로 민감한 정보의 노출을 차단합니다.

{ "eventVersion": "1.05", "userIdentity": { "type": "IAMUser", "accountId": "123456789012", "accessKeyId": "", "userName": "HIDDEN_DUE_TO_SECURITY_REASONS" }, "eventTime": "2015-03-31T22:20:42Z", "eventSource": "signin.amazonaws.com", "eventName": "ConsoleLogin", "awsRegion": "us-east-2", "sourceIPAddress": "192.0.2.101", "userAgent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0", "errorMessage": "No username found in supplied account", "requestParameters": null, "responseElements": { "ConsoleLogin": "Failure" }, "additionalEventData": { "LoginTo": "https://console.aws.amazon.com/console/home?state=hashArgs%23&isauthcode=true", "MobileVersion": "No", "MFAUsed": "No" }, "eventID": "a7654656-0417-45c6-9386-ea8231385051", "eventType": "AwsConsoleSignin", "recipientAccountId": "123456789012" }

IAM 역할 신뢰 정책 동작

2022년 9월 21일, AWS는 역할 신뢰 정책을 명시적으로 허용하도록 IAM 역할 신뢰 정책 동작을 변경했습니다. 레거시 동작 허용 목록의 IAM 역할에는 AssumeRole 이벤트에 대한 ExplicitTrustGrant를 위한 additionalEventData 필드가 있습니다. 레거시 허용 목록에 있는 역할이 레거시 동작을 사용하여 자기 자신의 역할을 수행할 때 explicitTrustGrant의 값은 false입니다. 레거시 허용 목록에 있는 역할이 자기 자신의 역할을 수행하지만 역할 신뢰 정책 동작이 이를 명시적으로 허용하도록 업데이트된 경우 explicitTrustGrant의 값은 true입니다.

레거시 동작의 허용 목록에는 포함된 IAM 역할은 매우 제한적이며, 자기 자신의 역할을 맡을 때만 이 필드가 CloudTrail 로그에 표시됩니다. 대부분의 경우 IAM 역할이 자기 자신의 역할을 수행할 필요는 없습니다. AWS는 프로세스, 코드 또는 구성을 업데이트하여 이러한 동작을 제거하거나 이러한 동작을 명시적으로 허용하도록 역할 신뢰 정책을 업데이트하는 것을 권장합니다. 자세한 내용은 IAM 역할 신뢰 정책 동작에 대한 업데이트 발표를 참조하세요.