IAM 권한 액세스 거부 또는 권한 없음 오류 문제를 해결하는 데 도움이 되는 데이터를 가져오려면 어떻게 해야 합니까?

5분 분량
0

AWS 리소스에 액세스하려고 하는데 "Access Denied" 또는 "Unauthorized" 오류가 발생했습니다. 이러한 AWS 자격 증명 및 액세스 관리(IAM) API 호출 실패 오류를 해결하는 데 도움이 되는 데이터를 가져오려면 어떻게 해야 합니까?

간략한 설명

Amazon Athena 쿼리 또는 AWS 명령줄 인터페이스(AWS CLI)를 사용하여 IAM API 호출 실패 에러 로그를 불러올 수 있습니다. 그런 다음 IAM 정책으로 액세스 거부 또는 승인되지 않은 작업 오류 해결을 위한 지침을 따르세요.

해결 방법

참고: AWS CLI 명령을 실행할 때 오류가 발생하는 경우 최신 버전의 AWS CLI를 사용하고 있는지 확인하세요.

옵션 1: Athena 쿼리를 사용하여 CloudTrail 로그를 검색하는 방법으로 IAM API 호출 실패 문제 해결

참고: 시작하기 전에 Amazon Simple Storage Service(Amazon S3) 버킷에 로깅할 수 있도록 추적 기능이 생성되어 있어야 합니다. Athena는 추적을 위해 Amazon S3 버킷에 제공되는 AWS CloudTrail 로그 파일에 기록된 이벤트를 사용하기 때문입니다.

1.    Athena에서 AWS CloudTrail 로그 검색을 위한 테이블을 자동으로 생성하려면 어떻게 해야 합니까?에서 Athena 테이블 생성 섹션에 설명된 단계를 수행합니다.

참고: 자동으로 생성되는 Athena 테이블은 Amazon S3 버킷과 동일한 AWS 리전에 있습니다.

2.    Athena 콘솔을 연 다음 더하기 기호 **“+”**를 선택하여 새 쿼리를 만듭니다.

3.    다음 예제 쿼리를 입력한 후 [실행]을 선택합니다.

이 예제 쿼리에서 시간 형식은 UTC의 Z 변수와 함께 ISO 8601 기본 형식을 사용합니다.

참고: 여기에서 your-arn은 리소스의 IAM Amazon 리소스 이름(ARN) 으로 바꾸고 your-table은 사용할 테이블 이름으로 바꾸십시오.

SELECT from_iso8601_timestamp(eventTime) AS "Time", useridentity.arn AS "Identity ARN", eventID AS "Event ID",
         eventsource AS "Service", eventname AS "Action", errorCode AS "Error", errorMessage AS "Message"
FROM your-table
WHERE from_iso8601_timestamp(eventtime) >= from_iso8601_timestamp('2019-10-29T06:40:00Z')
        AND from_iso8601_timestamp(eventtime) < from_iso8601_timestamp('2019-10-29T06:55:00Z')
        AND userIdentity.arn = 'your-arn'
        AND eventType = 'AwsApiCall'
        AND errorCode is not null
        AND (lower(errorCode) LIKE '%accessdenied%' OR lower(errorCode) LIKE '%unauthorized%')
ORDER BY eventTime desc

4.    다음 예제 테이블 출력에는 자격 증명 ARN에 대한 권한 오류가 나열되어 있습니다.

| Time                        | Event ID                             | Service                  | Action       | Error        | Message                                                                                                              |
|-----------------------------|--------------------------------------|--------------------------|--------------|--------------|----------------------------------------------------------------------------------------------------------------------|
| 2019-10-29 06:52:45.000 UTC | 0406f0c1-47a8-4f71-8a94-18267b84042a | cloudtrail.amazonaws.com | LookupEvents | AccessDenied | User: arn:aws:iam::account:user/username is not authorized to perform: cloudtrail:LookupEvents with an explicit deny in an identity-based policy |
| 2019-10-29 06:41:48.000 UTC | 14e5e77c-f682-45e1-8c88-12d15af293dd | cloudtrail.amazonaws.com | LookupEvents | AccessDenied | User: arn:aws:iam::account:user/username is not authorized to perform: cloudtrail:LookupEvents because no identity-based policy allows the cloudtrail:LookupEvents action |

참고: CloudTrail 이벤트 출력을 통해 결과가 제공되는 데는 최대 15분이 걸릴 수 있습니다.

5.    필요한 경우 예제 쿼리에서 다음 줄을 제거하여 모든 사용자에 대한 오류를 가져옵니다.

AND userIdentity.arn = 'your-arn'

6.    필요한 경우 예제 쿼리에서 다음 줄을 제거하여 선택한 기간의 모든 오류를 가져옵니다.

AND (lower(errorCode) LIKE '%accessdenied%' OR lower(errorCode) LIKE '%unauthorized%')

옵션 2: AWS CLI를 사용하여 IAM 권한 API 호출 실패 문제 해결

참고: 이 AWS CLI 스크립트에는 jq 명령줄 JSON 프로세서가 필요합니다. 튜토리얼 및 다운로드 지침은 JSON 출력 형식을 참조하세요. yum 패키지를 사용하는 배포의 경우 다음 명령을 실행하세요.

$ sudo yum install jq

1.    다음 AWS CLI 명령을 실행합니다.

참고: 여기서 your-arn은 해당 리소스의 IAM ARN으로 바꾸십시오.

( echo "Time,Identity ARN,Event ID,Service,Action,Error,Message";
  aws cloudtrail lookup-events --start-time "2019-10-29T06:40:00Z" --end-time "2019-10-29T06:55:00Z" --query "Events[*].CloudTrailEvent" --output text \
    | jq -r ". | select(.userIdentity.arn == \"your-arn\" and .eventType == \"AwsApiCall\" and .errorCode != null
    and (.errorCode | ascii_downcase | (contains(\"accessdenied\") or contains(\"unauthorized\"))))
    | [.eventTime, .userIdentity.arn, .eventID, .eventSource, .eventName, .errorCode, .errorMessage] | @csv"
) | column -t -s'",'

참고: CloudTrail에 대한 조회 요청 속도는 리전별, 계정별로 초당 2회 요청으로 제한됩니다. 이 한도를 초과하는 경우 병목 오류가 발생합니다.

2.    다음 예제 테이블 출력에는 지정된 기간의 자격 증명 ARN에 대한 권한 오류가 나열되어 있습니다.

참고: 지난 90일 동안 리전에서 발생한 이벤트를 조회할 수 있습니다.

Time                  Event ID                              Service                   Action        Error         Message
2019-10-29T06:52:45Z  0406f0c1-47a8-4f71-8a94-18267b84042a  cloudtrail.amazonaws.com  LookupEvents  AccessDenied  User: arn:aws:iam::account:user/username is not authorized to perform: cloudtrail:LookupEvents with an explicit deny in an identity-based policy
2019-10-29T06:41:48Z  14e5e77c-f682-45e1-8c88-12d15af293dd  cloudtrail.amazonaws.com  LookupEvents  AccessDenied  User: arn:aws:iam::account:user/username is not authorized to perform: cloudtrail:LookupEvents because no identity-based policy allows the cloudtrail:LookupEvents action

3.    (선택 사항) 다음 줄을 제거하여 모든 사용자에 대한 오류를 가져옵니다.

.userIdentity.arn == \"your-arn\" and

4.    (선택 사항) 다음 줄을 제거하여 선택한 기간의 모든 오류를 가져옵니다.

and (.errorCode | ascii_downcase | (contains(\"accessdenied\") or contains(\"unauthorized\")))

Unauthorized 오류 문제 해결

Athena 및 이전 AWS CLI 예제 출력은 CloudTrail LookupEvents API 호출과 관련이 있습니다.

Deny 문이 포함되어 있기 때문에 액세스를 거부하는 IAM 정책에는 명시적 및 암시적 거부에 대한 오류 메시지에 특정 문구가 포함됩니다. IAM 명시적 거부 오류에는 “<type> 정책에 명시적 거부 포함”이라는 문구가 포함됩니다. IAM 암시적 거부 오류에는 “<action> 작업을 허용하는 <type>정책이 없기 때문”라는 문구가 포함됩니다.

cloudtrail:LookupEvents with an explicit deny 출력은 연결된 IAM 정책이 올바르지 않음을 나타냅니다.

이러한 정책 유형 중 하나에서 명시적 거부가 발생할 수 있습니다. 예를 들어 자격 증명 기반 정책, 리소스 기반 정책, 권한 경계, 조직 SCP 및 세션 정책이 있습니다. 명시적 deny 문은 항상 allow 문보다 우선합니다. 명시적 거부는 IAM 사용자의 자격 증명 기반 정책에서 찾아볼 수 있습니다.

cloudtrail:LookupEvents because no identity-based policy allows 출력은 자격 증명 기반 정책이 이 API 작업을 허용하지 않아 암시적 거부가 발생함을 나타냅니다. 자격 증명 기반 정책에는 CloudTrail:LookupEvents API 작업에 대한 명시적 허용 문이 없습니다.

AWS가 액세스 권한을 설정하기 위해 평가하는 정책 유형은 다음과 같습니다.

IAM 정책의 평가 및 관리 방식에 대한 자세한 내용은 정책 평가 로직IAM 정책 관리를 참조하세요.


관련 정보

IAM의 정책 및 권한

IAM 정책 문제 해결