IAM 권한에 대한 Access Denied 또는 Unauthorized 오류 문제를 해결하려면 어떻게 해야 하나요?

최종 업데이트 날짜: 2019년 12월 20일

AWS 리소스에 액세스하려고 하는데 "Access Denied" 또는 "Unauthorized" 오류가 발생했습니다. AWS Identity and Access Management(IAM) 사용자의 권한 문제를 해결하려면 어떻게 해야 합니까?

간략한 설명

Amazon Athena 쿼리 또는 AWS 명령줄 인터페이스(AWS CLI)를 사용하여 IAM 권한 API 호출 실패 문제를 해결할 수 있습니다.

해결 방법

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

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

1.    Amazon 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 |
| 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                       |

참고: 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를 설치하고 구성했는지 확인하십시오.

참고: 이 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에 대한 조회 요청 속도는 계정별로 초당 1회 요청으로 제한됩니다. 이 한도를 초과하면 조절 오류가 발생합니다.

2.    다음 예제 테이블 출력에는 지난 90일 동안의 자격 증명 ARN에 대한 권한 오류가 나열되어 있습니다.

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
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

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

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

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

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

Unauthorized 오류 문제 해결

Athena 및 AWS CLI 예제 출력에는 CloudTrail 서비스에서 LookupEvents 작업을 호출한 결과가 반영됩니다.

cloudtrail:LookupEvents with an explicit deny 출력은 IAM 정책이 올바르지 않음을 나타냅니다. 모든 IAM 정책 유형이 명시적 거부 오류를 반환할 수 있습니다. 명시적 deny 문은 항상 allow 문보다 우선합니다.

cloudtrail:LookupEvents 출력은 오류가 암시적 거부의 결과임을 나타냅니다. 이 출력 오류는 다음과 같은 경우에 발생할 수 있습니다.

  • IAM 정책에 따라 cloudtrail:LookupEvents 작업이 명시적으로 허용되는 경우
  • 자격 증명에 대한 최대 권한이 IAM 정책에 따라 제한되는 경우
  • 계정에 대한 AWS Organizations 서비스 제어 정책(SCP)에 명시적 허용이 없는 경우

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

  • AWS Organizations SCP
  • 리소스 기반 정책
  • IAM 권한 경계
  • 세션 정책
  • 자격 증명 기반 정책

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