AWS Identity and Access Management
사용 설명서

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

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

CloudTrail에 대한 자세한 내용은 AWS CloudTrail User Guide을 참조하십시오.

CloudTrail의 IAM 및 AWS STS 정보

CloudTrail은 계정 생성 시 AWS 계정에서 활성화됩니다. IAM 또는 AWS STS에서 활동이 수행되면 해당 활동은 이벤트 기록에서 다른 AWS 서비스 이벤트와 함께 CloudTrail 이벤트에 기록됩니다. AWS 계정에서 최신 이벤트를 확인, 검색 및 다운로드할 수 있습니다. 자세한 내용은 CloudTrail 이벤트 기록에서 이벤트 보기를 참조하십시오.

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

모든 IAM 및 AWS STS 작업은 CloudTrail에서 로깅되고 IAM API ReferenceAWS Security Token Service API Reference에 기록됩니다. IAM 정보는 다음과 같은 방법으로 CloudTrail에 로깅됩니다.

  • IAM 및 AWS Security Token Service(AWS STS)에 대한 API 요청 – CloudTrail는 인증된 모든 API 요청(자격 증명을 통한)을 IAM 및 AWS STS API 작업으로 기록합니다. CloudTrail는 또한 AWS STS 작업, AssumeRoleWithSAMLAssumeRoleWithWebIdentity에 대한 미인증 요청을 자격 증명 제공자가 제공한 정보와 함께 기록합니다. 이 정보를 사용하여 위임된 역할을 지닌 연동 사용자의 호출을 외부 연동 호출자에 다시 매핑할 수 있습니다. AssumeRole의 경우, 호출을 원래 AWS 서비스 또는 원래 사용자의 계정에 다시 매핑할 수 있습니다. CloudTrail 로그 항목에 있는 JSON 데이터의 userIdentity 섹션에는 특정 연동 사용자에게 AssumeRole* 요청을 매핑하는 데 필요한 정보가 들어 있습니다. 자세한 내용은 AWS CloudTrail User GuideCloudTrail userIdentity 요소를 참조하십시오.

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

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

    중요

    임의 리전에서 기본 글로벌 엔드포인트가 아닌 AWS STS 엔드포인트를 활성화할 경우에는 해당 리전의 CloudTrail 로깅 기능도 함께 활성화합니다. 이것은 해당 리전에서 수행된 AWS STS API 호출을 기록하는 데 필요합니다. 자세한 정보는 AWS CloudTrail User Guide의 Turning On CloudTrail in Additional Regions(추가 리전에서 CloudTrail 설정) 단원을 참조하십시오.

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

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

    CloudTrail 로그 항목의 사용자 자격 증명 정보에 대한 자세한 정보는 AWS CloudTrail User GuideuserIdentity Element 단원을 참조하십시오.

  • AWS 로그인 이벤트 – AWS Management 콘솔, AWS 토론 포럼, 그리고 AWS Marketplace에 대한 로그인 이벤트는 CloudTrail에 로깅됩니다.

    예를 들어 IAM 및 연동 사용자 로그인 이벤트—로그인 성공 횟수와 실패 횟수—가 CloudTrail에 로깅됩니다. 그 밖에 루트 사용자의 로그인 성공 이벤트 역시 CloudTrail에 로깅됩니다. 단, 루트 사용자의 로그인 실패 이벤트는 CloudTrail에 로깅되지 않습니다.

    CloudTrail에서 로그인 이벤트를 사용자 로그에 기록하도록 설정할 경우 CloudTrail에서 이벤트를 기록할 위치를 어떻게 선택하는지 잘 이해할 필요가 있습니다.

    • 사용자가 콘솔에 직접 로그인할 경우 선택한 서비스 콘솔이 리전을 지원하는지 여부를 기준으로 글로벌 또는 리전 로그인 종단점으로 리디렉션됩니다. 예를 들어 메인 콘솔 홈 페이지가 리전을 지원하여 https://alias.signin.aws.amazon.com/console에 로그인할 경우, https://us-east-2.signin.aws.amazon.com 같은 리전 로그인 엔드포인트로 리디렉션됩니다. 이 리디렉션은 사용자의 리전 로그에 리전별 CloudTrail 로그 항목을 생성합니다.

      반면 Amazon S3 콘솔은 리전을 지원하지 않으므로 https://alias.signin.aws.amazon.com/console/s3에 로그인할 경우 AWS에서 글로벌 로그인 엔드포인트 https://signin.aws.amazon.com으로 리디렉션합니다. 이 리디렉션은 글로벌 CloudTrail 로그 항목을 생성합니다.

    • https://alias.signin.aws.amazon.com/console?region=ap-southeast-1 같은 URL을 사용하여 리전이 활성화된 메인 콘솔 홈 페이지에 로그인하면 특정 리전 로그인 엔드포인트를 수동으로 요청할 수 있습니다. 이 경우 AWS가 사용자를 ap-southeast-1 리전 로그인 엔드포인트로 리디렉션하고 리전 CloudTrail 로그 이벤트가 발생합니다.

    중요

    보안 모범 사례의 일환으로 AWS는 잘못된 사용자 이름으로 인해 로그인에 실패하더라도 입력한 사용자 이름 텍스트를 로깅하지 않습니다. 사용자 이름 텍스트는 HIDDEN_DUE_TO_SECURITY_REASONS 값으로 마스킹 처리됩니다. 마스킹 처리의 예는 이번 주제 후반부의 잘못된 사용자 이름으로 인한 로그인 실패 이벤트 단원을 참조하십시오. 사용자 이름이 마스킹 처리되는 이유는 다음과 같은 사용자 오류로 인한 로그인 실패를 로깅할 경우 잠재적으로 민감한 정보가 노출될 수 있기 때문입니다.

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

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

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

    로그인 이벤트가 리전 또는 글로벌 이벤트인지 여부는 사용자가 로그인하는 콘솔과 사용자가 로그인 URL을 구성하는 방식에 따라 다릅니다.

    • 서비스 콘솔이 리전화되어 있습니까? 그럴 경우 로그인 요청이 리전 로그인 종단점으로 자동으로 리디렉션되고 이벤트가 해당 리전의 CloudTrail 로그에 기록됩니다. 예를 들어 리전화된 https://alias.signin.aws.amazon.com/console에 로그인할 경우, https://us-east-2.signin.aws.amazon.com 같은 리전 로그인 엔드포인트로 자동으로 리디렉션됩니다. 이벤트는 해당 리전의 로그에 기록됩니다.

      하지만 일부 서비스는 아직 리전화되어 있지 않습니다. 예를 들어 Amazon S3 서비스는 현재 리전화되지 않았기 때문에 https://alias.signin.aws.amazon.com/console/s3에 로그인하면 글로벌 로그인 엔드포인트 https://signin.aws.amazon.com에 리디렉션됩니다. 이 리디렉션은 글로벌 로그에 이벤트를 생성합니다.

    • 또한 https://alias.signin.aws.amazon.com/console?region=ap-southeast-1 같은 URL을 사용하여 특정 리전의 로그인 엔드포인트로 수동으로 요청할 수 있는데 이 경우 ap-southeast-1 리전 로그인 엔드포인트로 리디렉션됩니다. 이 리디렉션은 리전 로그에 이벤트를 생성합니다.

  • 임시 자격 증명 요청이 로그에 기록되는 방법 – 보안 주체가 임시 자격 증명을 요청할 때 보안 주체 유형에 의해 CloudTrail에서 이벤트를 로그에 기록하는 방법이 결정됩니다. 다음 표는 임시 자격 증명을 생성하는 각 API 호출에 대해 CloudTrail에서 다양한 정보를 로그에 기록하는 방법을 보여줍니다.

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

CloudTrail 파일에 로깅된 이벤트 예제

CloudTrail 로그 파일에는 JSON 형식의 이벤트 정보가 포함되어 있습니다. 여기서 이벤트란 단일 API 요청이나 로그인 이벤트를 의미하여 요청된 작업, 파라미터, 그리고 작업 일시에 대한 정보가 저장됩니다.

CloudTrail 로그 파일의 IAM API 이벤트

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

{ "eventVersion": "1.05", "userIdentity": { "type": "IAMUser", "principalId": "AIDACKCEVSQ6C2EXAMPLE", "arn": "arn:aws:iam::444455556666:user/Alice", "accountId": "444455556666", "accessKeyId": "AKIAI44QH8DHBEXAMPLE", "userName": "Alice", "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": "Alice", "policyName": "ReadOnlyAccess-Alice-201407151307" }, "responseElements": null, "requestID": "9EXAMPLE-0c68-11e4-a24e-d5e16EXAMPLE", "eventID": "cEXAMPLE-127e-4632-980d-505a4EXAMPLE" }

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

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

777788889999 계정의 "Bob"이라는 IAM 사용자는 AWS STS AssumeRole 작업을 호출하여 111122223333 계정의 EC2-dev 역할을 맡습니다. 다음 예시 두 개는 가계정 두 개에 대한 CloudTrail 로그 항목입니다. 첫 번째 예시는 AssumeRole을 호출하는 사용자를 소유한 계정인 777788889999 계정에서 보낸 요청에 대한 CloudTrail 로그 항목입니다.

{ "eventVersion": "1.05", "userIdentity": { "type": "IAMUser", "principalId": "AIDAQRSTUVWXYZEXAMPLE", "arn": "arn:aws:iam::777788889999:user/Bob", "accountId": "777788889999", "accessKeyId": "AKIAQRSTUVWXYZEXAMPLE", "userName": "Bob" }, "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": "Bob-EC2-dev" "serialNumber": "arn:aws:iam::777788889999:mfa" }, "responseElements": { "credentials": { "sessionToken": "<encoded session token blob>", "accessKeyId": "AKIAQRSTUVWXYZEXAMPLE", "expiration": "Jul 18, 2014 4:07:39 PM" }, "assumedRoleUser": { "assumedRoleId": "AIDAQRSTUVWXYZEXAMPLE:Bob-EC2-dev", "arn": "arn:aws:sts::111122223333:assumed-role/EC2-dev/Bob-EC2-dev" } }, "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": "Bob-EC2-dev", "serialNumber": "arn:aws:iam::777788889999:mfa" }, "responseElements": { "credentials": { "sessionToken": "<encoded session token blob>", "accessKeyId": "AKIAQRSTUVWXYZEXAMPLE", "expiration": "Jul 18, 2014 4:07:39 PM" }, "assumedRoleUser": { "assumedRoleId": "AIDAQRSTUVWXYZEXAMPLE:Bob-EC2-dev", "arn": "arn:aws:sts::111122223333:assumed-role/EC2-dev/Bob-EC2-dev" } }, "requestID": "4EXAMPLE-0e8d-11e4-96e4-e55c0EXAMPLE", "sharedEventID": "bEXAMPLE-efea-4a70-b951-19a88EXAMPLE", "eventID": "dEXAMPLE-ac7f-466c-a608-4ac8dEXAMPLE" }

다음 예시는 IAM 역할에서 권한을 사용하는 API를 호출하는 AWS 서비스의 요청에 대한 CloudTrail 로그 항목입니다.

{ "eventVersion": "1.04", "userIdentity": { "type": "AssumedRole", "principalId": "AIDAQRSTUVWXYZEXAMPLE:devdsk", "arn": "arn:aws:sts::777788889999:assumed-role/AssumeNothing/devdsk", "accountId": "777788889999", "accessKeyId": "AKIAQRSTUVWXYZEXAMPLE", "sessionContext": { "attributes": { "mfaAuthenticated": "false", "creationDate": "2016-11-14T17:25:26Z" }, "sessionIssuer": { "type": "Role", "principalId": "AIDAQRSTUVWXYZEXAMPLE", "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" }

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

{ "eventVersion": "1.05", "userIdentity": { "type": "SAMLUser", "principalId": "<id of identity provider>:<canonical id of user>", "userName": "<canonical id of user>", "identityProvider": "<id of identity provider>" }, "eventTime": "2016-03-23T01:39:57Z", "eventSource": "sts.amazonaws.com", "eventName": "AssumeRoleWithSAML", "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": { "sAMLAssertionID": "_c0046cEXAMPLEb9d4b8eEXAMPLE2619aEXAMPLE", "roleSessionName": "MyAssignedRoleSessionName", "durationSeconds": 3600, "roleArn": "arn:aws:iam::444455556666:role/SAMLTestRoleShibboleth", "principalArn": "arn:aws:iam::444455556666:saml-provider/Shibboleth" }, "responseElements": { "subjectType": "transient", "issuer": "https://server.example.com/idp/shibboleth", "credentials": { "accessKeyId": "AKIAIOSFODNN7EXAMPLE", "expiration": "Mar 23, 2016 2:39:57 AM", "sessionToken": "<encoded session token blob>" }, "nameQualifier": "<id of identity provider>", "assumedRoleUser": { "assumedRoleId": "AROAD35QRSTUVWEXAMPLE:MyAssignedRoleSessionName", "arn": "arn:aws:sts::444455556666:assumed-role/SAMLTestRoleShibboleth/MyAssignedRoleSessionName" }, "subject": "<canonical id of user>", "audience": "https://signin.aws.amazon.com/saml" }, "resources": [ { "ARN": "arn:aws:iam::444455556666:role/SAMLTestRoleShibboleth", "accountId": "444455556666", "type": "AWS::IAM::Role" }, { "ARN": "arn:aws:iam::444455556666:saml-provider/test-saml-provider", "accountId": "444455556666", "type": "AWS::IAM::SAMLProvider" } ], "requestID": "6EXAMPLE-e595-11e5-b2c7-c974fEXAMPLE", "eventID": "dEXAMPLE-265a-41e0-9352-4401bEXAMPLE", "eventType": "AwsApiCall", "recipientAccountId": "444455556666" }

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

{ "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": { "durationSeconds": 3600, "roleArn": "arn:aws:iam::444455556666:role/FederatedWebIdentityRole", "roleSessionName": "MyAssignedRoleSessionName" }, "responseElements": { "provider": "accounts.google.com", "subjectFromWebIdentityToken": "<id of user>", "audience": "<id of application>.apps.googleusercontent.com", "credentials": { "accessKeyId": "ASIACQRSTUVWRAOEXAMPLE", "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 로그 항목을 나타낸 예제입니다.

{ "eventVersion": "1.05", "userIdentity": { "type": "IAMUser", "principalId": "AIDACKCEVSQ6C2EXAMPLE", "arn":"arn:aws:iam::111122223333:user/Alice", "accountId": "111122223333", "userName": "Alice" }, "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 요소에도 나와 있듯이 Alice라는 이름의 IAM 사용자가 로그인을 시도한 것을 알 수 있습니다. 또한 responseElements 요소를 보면 로그인 시도가 실패한 것도 확인됩니다. 그리고 Alice가 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" }

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

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

{ "eventVersion": "1.05", "userIdentity": { "type": "IAMUser", "principalId": "AIDACKCEVSQ6C2EXAMPLE", "arn":"arn:aws:iam::111122223333:user/Bob", "accountId": "111122223333", "userName": "Bob" }, "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 User GuideCloudTrail 이벤트 참조 단원을 참조하십시오.

CloudTrail의 중복 로그 항목 방지

CloudTrail은 각 리전마다 별도로 추적 파일을 생성합니다. 이 추적 파일에는 각 리전에서 발생하는 이벤트 정보를 비롯해 IAM API 호출, 리전이 아닌 다른 기준의 AWS STS 호출(sts.amazonaws.com 호출 등), 그리고 AWS 로그인 이벤트 같은 글로벌(리전이 아닌 다른 기준의) 이벤트 정보까지 저장됩니다. 예를 들어, 한 리전에 두 개의 추적이 있다고 가정하겠습니다. 그런 다음 IAM 사용자를 새로 생성할 경우 CreateUser 이벤트가 두 리전의 로그 파일에 추가되어 로그 항목이 중복되고 맙니다.

AWS Security Token Service(STS)는 https://sts.amazonaws.com에 단일 엔드포인트가 있는 전역적 서비스입니다. 따라서 이 엔드포인트에 대한 호출은 글로벌 서비스에 대한 호출로 로깅됩니다. 하지만 이 엔드포인트가 물리적으로 미국 동부(버지니아 북부) 리전에 위치하기 때문에 로그가 표시되는 이벤트 리전 역시 us-east-1이 됩니다. 이때는 해당 리전에 글로벌 서비스 로그를 추가하도록 선택해야만 CloudTrail이 이 로그를 미국 동부(오하이오) 리전에 기록합니다. 그러면 CloudTrail이 모든 리전의 엔드포인트 호출을 각 리전으로 기록합니다. 이를테면 sts.us-east-2.amazonaws.com 호출은 미국 동부(오하이오) 리전에 게시되고, sts.eu-central-1.amazonaws.com 호출은 EU(프랑크푸르트) 리전에 게시되는 등의 방식을 따릅니다.

여러 리전 및 AWS STS에 대한 자세한 정보는 AWS 리전에서 AWS STS 관리 단원을 참조하십시오.

아래는 각 리전을 비롯해 리전에 따른 CloudTrail의 AWS STS 요청 로깅 방식을 나타낸 표입니다. "위치" 열은 CloudTrail이 기록하는 로그를 나타냅니다. "전역"은 전역 서비스 로그를 추가하도록 선택한 모든 리전에 이벤트가 로깅된다는 것을 의미합니다. 그리고, "리전"은 엔드포인트가 위치한 리전에만 이벤트가 로깅된다는 것을 의미합니다. 마지막 열은 로그 항목에서 요청 리전의 식별 방식을 나타냅니다.

리전 이름 CloudTrail 로그의 리전 자격 증명 엔드포인트 CloudTrail 로그 위치
해당 사항 없음 - 글로벌 us-east-1 sts.amazonaws.com 전 세계
미국 동부(오하이오) us-east-2 sts.us-east-2.amazonaws.com Region
미국 동부(버지니아 북부) us-east-1 sts.us-east-1.amazonaws.com Region
미국 서부(캘리포니아 북부 지역) us-west-1 sts.us-west-1.amazonaws.com Region
미국 서부(오레곤) us-west-2 sts.us-west-2.amazonaws.com Region
캐나다(중부) ca-central-1 sts.ca-central-1.amazonaws.com Region
EU(프랑크푸르트) eu-central-1 sts.eu-central-1.amazonaws.com Region
EU(아일랜드) eu-west-1 sts.eu-west-1.amazonaws.com Region
EU(런던) eu-west-2 sts.eu-west-2.amazonaws.com Region
아시아 태평양(도쿄) ap-northeast-1 sts.ap-northeast-1.amazonaws.com Region
아시아 태평양(서울) ap-northeast-2 sts.ap-northeast-2.amazonaws.com Region
아시아 태평양(뭄바이) ap-south-1 sts.ap-south-1.amazonaws.com Region
아시아 태평양(싱가포르) ap-southeast-1 sts.ap-southeast-1.amazonaws.com Region
아시아 태평양(시드니) ap-southeast-2 sts.ap-southeast-2.amazonaws.com Region
남아메리카(상파울루) sa-east-1 sts.sa-east-1.amazonaws.com Region

계정 내 다양한 리전의 추적 정보를 단일 Amazon S3 버킷으로 통합하도록 CloudTrail을 구성할 경우, IAM 이벤트가 로그에 중복 저장됩니다. 즉, 각 리전의 추적이 동일한 IAM 이벤트를 통합 로그에 기록합니다. 이러한 중복 문제를 해결하기 위해 글로벌 이벤트를 선택적으로 추가할 수 있습니다. 일반적인 방법은 한 추적 파일에서는 글로벌 이벤트를 활성화하고, 동일한 Amazon S3 버킷에 기록하는 다른 모든 추적 파일에서는 글로벌 이벤트를 비활성화하는 것입니다. 이렇게 하면 글로벌 이벤트는 항상 한 곳에만 기록됩니다.

자세한 정보는 AWS CloudTrail User GuideAggregating Logs 단원을 참조하십시오.