IAM 정책으로 액세스 거부 또는 승인되지 않은 작업 오류를 해결하려면 어떻게 해야 하나요?

최종 업데이트 날짜: 2022년 3월 30일

AWS 리소스에 대한 작업을 수행하려고 하는데 “액세스 거부(access denied)” 또는 “무단 작업(unauthorized operation)” 오류가 발생했습니다. 이러한 권한 문제를 해결하려면 어떻게 해야 합니까?

간략한 설명

AWS Identity and Access Management(IAM) 정책 관련 문제를 해결하려면 다음 내용을 확인합니다.

해결 방법

API 호출자 식별 및 오류 메시지 확인

중요:

IAM 정책을 검토하기 전에 API 호출이 올바른 IAM 엔터티를 대신해 수행되었는지 확인합니다. 오류 메시지에 호출자 정보가 포함되지 않은 경우 다음 단계에 따라 API 호출자를 식별합니다.

  1. AWS 관리 콘솔을 엽니다.
  2. 페이지 오른쪽 위에서 계정 정보 옆의 화살표를 선택합니다.
  3. IAM 역할로 로그인한 경우 수임된 역할의 이름은 ‘현재 활성 상태(Currently active as)’를 참조하고 계정 ID의 경우 ‘계정 ID(Account ID)’를 참조하세요.
  4. 페더레이션 사용자로 로그인한 경우 페더레이션 역할 이름 및 역할 세션 이름은 ‘페더레이션 사용자(Federated User)’를 참조하세요.

-또는-

AWS CLI 명령 get-caller-identity를 사용하여 API 호출자를 식별합니다. 또한 AWS CLI 명령을 --debug 플래그와 함께 사용하여 다음과 유사한 출력에서 자격 증명의 소스를 식별할 수 있습니다.

2018-03-13 16:23:57,570 - MainThread - botocore.credentials - INFO - Found credentials in shared credentials file: ~/.aws/credentials

IAM 정책 권한 검토

연결된 IAM 정책을 확인하여 API 호출자에게 필요한 권한이 부여되었는지 확인합니다. 자세한 내용은 계정 내에서 요청의 허용 또는 거부 결정을 참조하세요.

AWS Organizations SCP 평가

AWS 계정이 AWS Organization의 일부인 경우 SCP를 계층 수준에서 적용하여 작업을 허용하거나 거부할 수 있습니다. SCP 권한은 AWS 계정의 모든 IAM 엔터티에 상속됩니다. API 호출자가 SCP에서 명시적으로 거부되지 않았는지 확인합니다.

호출되는 API가 호출자에게 영향을 주는 조직 SCP 정책에서 명시적으로 거부되지 않았는지 확인합니다.

ID 기반 및 리소스 기반 정책 검토

API 호출자에 대한 IAM 엔터티 자격 증명 정책에 명시적인 allow 문이 있는지 확인합니다. 그런 다음 API가 리소스 수준 권한을 지원하는지 확인합니다. API 호출자가 리소스 수준 권한을 지원하지 않는 경우 IAM 정책 구문의 리소스 요소에 와일드카드 “*”가 지정되어 있는지 확인합니다.

리소스 기반 정책을 AWS 서비스 내의 리소스에 연결하여 액세스를 제공할 수 있습니다. 자세한 내용은 ID 기반 정책 및 리소스 기반 정책을 참조하세요.

IAM 정책 요약을 보려면 다음을 수행하세요.

  1. IAM 콘솔을 엽니다.
  2. 탐색 창에서 [정책(Policies)]을 선택합니다.
  3. 정책 이름 옆의 화살표를 선택하여 정책 세부 정보 보기를 확장합니다.

다음 예시에서는 모든 Amazon Elastic Compute Cloud(Amazon EC2) API 작업이 리소스 수준 권한을 지원하는 것은 아니기 때문에 정책이 작동하지 않습니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "SorryThisIsNotGoingToWorkAsExpected",
            "Effect": "Allow",
            "Action": ["ec2:*"],
            "Resource": "arn:aws:ec2:us-east-1:accountid:instance/*"
        }
    ]
}

run-instances AWS CLI 명령을 사용하여 us-east-1 리전에서 Amazon EC2 인스턴스를 시작하려고 하는 IAM 사용자는 다음과 유사한 오류 메시지를 수신합니다.

"An error occurred (UnauthorizedOperation) when calling the RunInstances operation: You are not authorized to perform this operation. Encoded authorization failure message:…"

이 문제를 해결하려면 리소스를 와일드카드 “*”로 변경합니다. 이는 Amazon EC2가 부분적인 리소스 수준 권한만 지원하기 때문입니다.

권한 부여 실패 메시지를 디코딩하여 이 실패의 원인에 대한 자세한 내용을 보려면 다음과 유사한 DecodeAuthorizationMessage API 작업을 사용합니다.

$ aws sts decode-authorization-message --encoded-message <encoded-message-from-the-error>

권한 경계 확인

IAM 엔터티에 권한 경계가 연결되어 있는 경우 경계는 엔터티의 최대 권한을 설정합니다. 자세한 내용은 권한 경계를 사용하여 IAM 사용자 및 역할 범위를 제한하고 권한 에스컬레이션을 방지하려면 어떻게 해야 하나요?를 참조하세요.

세션 정책 평가

API 호출자가 IAM 역할 또는 페더레이션 사용자인 경우 세션 기간 동안 세션 정책이 전달됩니다. 세션에 대한 권한은 세션 및 세션 정책을 생성하는 데 사용된 IAM 엔터티에 대한 자격 증명 기반 정책의 교차점입니다. API 호출이 IAM 정책 및 엔터티에 존재하는지 확인합니다.

정책의 조건 키가 API에서 지원되는지 확인합니다.

AWS 조건 키는 AWS에 대한 API 요청의 요소를 IAM 정책에 지정된 키 값과 비교하는 데 사용할 수 있습니다. 조건 키는 전역 조건 키일 수도 있고 AWS 서비스에 의해 정의될 수도 있습니다. AWS 서비스별 조건 키는 해당 서비스 내에서만 사용할 수 있습니다(예: EC2 API 작업의 EC2 조건). 자세한 내용은 AWS 서비스에 대한 작업, 리소스 및 조건 컨텍스트 키를 참조하세요.

조건 요소는 여러 조건을 포함할 수 있으며 각 조건 블록 내에 여러 키-값 쌍을 포함할 수 있습니다. 자세한 내용은 여러 키 또는 값으로 조건 만들기를 참조하세요.

이 정책 예제에서는 IAM 사용자 관리자가 IAM API 요청을 호출하고 소스 IP 주소가 1.1.1.0/24 또는 2.2.2.0/24인 경우 조건 요소가 일치됩니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "iam:*",
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "aws:username": "admin"
        },
        "IpAddress": {
          "aws:SourceIp": [
            "1.1.1.0/24",
            "2.2.2.0/24"
          ]
        }
      }
    }
  ]
}

IAM 정책 오류 및 문제 해결 예시

다음 예제를 참조하여 오류 메시지, API 호출자, API 및 호출되는 리소스를 식별합니다.

예제 오류 메시지 API 호출자 API 리소스 사용 사례
A: "DescribeInstances 작업을 호출하는 동안 오류(UnauthorizedOperation)가 발생했습니다. 이 작업을 수행할 권한이 없습니다." 알 수 없음 인스턴스 설명 알 수 없음 오류 발생 시
B: "AssumeRole 작업을 호출할 때 오류(AccessDenied)가 발생했습니다. 사용자 arn:aws:iam::123456789012:user/test는 리소스 arn:aws:iam::123456789012:role/EC2-FullAccess에서 sts:AssumeRole을 수행할 권한이 없습니다." arn:aws:iam::123456789012:user/test AssumeRole arn:aws:iam::123456789012:role/EC2-FullAccess 오류 발생 시
C: “GetSessionToken 작업을 호출할 때 오류(AccessDenied)가 발생했습니다. 세션 자격 증명으로 GetSessionToken을 호출할 수 없습니다.” 알 수 없음 GetSessionToken 알 수 없음 오류 발생 시
D: "AssociateIamInstanceProfile 작업을 호출할 때 오류(UnauthorizedOperation)가 발생했습니다. 이 작업을 수행할 권한이 없습니다. 인코딩된 권한 부여 실패 메시지: ...." 알 수 없음 AssociateIamInstanceProfile 알 수 없음 오류 발생 시

이 평가 방법을 사용하여 다양한 AWS 서비스의 권한 문제와 관련하여 표시될 수 있는 오류 메시지의 원인을 식별할 수 있습니다. 자세한 내용은 다음 오류 메시지 및 문제 해결 단계를 참조하세요.

예제 오류 메시지 A:

이 오류 메시지는 DescribeInstances API를 호출할 수 있는 권한이 없음을 나타냅니다.

이 문제를 해결하려면 다음 단계를 수행합니다.

  1. API 호출자를 식별합니다.
  2. ec2:DescribeInstances API 작업이 거부 문에 포함되지 않았는지 확인합니다.
  3. ec2:DescribeInstances API 작업이 허용 문에 포함되었는지 확인합니다.
  4. 이 API 작업에 대해 지정된 리소스가 없는지 확인합니다. 참고: 이 API 작업은 리소스 수준 권한을 지원하지 않습니다.
  5. 허용 문에 지정된 모든 IAM 조건이 DescribeInstances 작업에서 지원되고 조건이 일치하는지 확인합니다.

자세한 내용은 DescribeInstanceStatus를 참조하세요.

예제 오류 메시지 B:

이 오류 메시지에는 API 이름, API 호출자 및 대상 리소스가 포함됩니다. API를 호출한 IAM 자격 증명에 올바른 리소스 액세스 권한이 있는지 확인합니다. 이전 평가 방법을 사용하여 IAM 정책을 검토합니다.

이 오류를 해결하려면 다음 단계에 따라 IAM 역할의 신뢰 정책을 확인하세요. EC2-FullAccess:

  1. arn:aws:iam::123456789012:user/test 또는 arn:aws:iam::123456789012:root가 신뢰 정책의 거부 문에 없는지 확인합니다.
  2. arn:aws:iam::123456789012:user/test 또는 arn:aws:iam::123456789012:root가 신뢰 정책의 허용 문에 있는지 확인합니다.
  3. 허용 문에 지정된 모든 IAM 조건이 sts:AssumeRole API 작업에서 지원되고 일치하는지 확인합니다.

다음 단계에 따라 API 호출자(arn:aws:iam::123456789012:user/test)에 연결된 IAM 정책을 확인합니다.

  1. arn:aws:iam::123456789012:role/EC2-FullAccess가 sts:AssumeRole API 작업이 포함된 거부 문에 없는지 확인합니다.
  2. arn:aws:iam::123456789012:root가 신뢰 정책의 허용 문에 있는 경우 arn:aws:iam::123456789012:role/EC2-FullAccess가 sts:AssumeRole API 작업이 포함된 IAM 정책의 허용 문에 있는지 확인합니다.
  3. 허용 문에 지정된 모든 IAM 조건이 sts:AssumeRole API 작업에서 지원되고 일치하는지 확인합니다.

예제 오류 메시지 C:

이 오류 메시지는 get-session-token임시 자격 증명에서 지원되지 않음을 나타냅니다. 자세한 내용은 AWS STS API 작업 비교를 참조하세요.

예제 오류 메시지 D:

이 오류 메시지는 권한 부여 실패에 대한 세부 정보를 제공하는 인코딩된 메시지를 반환합니다. 오류 메시지를 디코딩하고 권한 실패의 세부 정보를 확인하려면 DecodeAuthorizationMessage를 참조하세요. 오류 메시지를 디코딩한 후 API 호출자를 식별하고 리소스 수준 권한 및 조건을 검토합니다.

이 오류를 해결하려면 다음 단계에 따라 IAM 정책 권한을 검토하세요.

  1. 오류 메시지가 API가 명시적으로 거부되었음을 나타내는 경우 일치하는 문에서 ec2:AssociateIamInstanceProfile 또는 iam:PassRole API 작업을 제거합니다.
  2. ec2:AssociateIamInstanceProfile 및 iam:PassRole이 지원되는 올바른 리소스 대상이 포함된 허용 문에 있는지 확인합니다. 예를 들어 ec2:AssociateIamInstanceProfile API 작업의 리소스 대상이 EC2 인스턴스이고 iam:PassRole의 리소스 대상이 IAM 역할인지 확인합니다.
  3. ec2:AssociateIamInstanceProfile 및 iam:PassRole API 작업이 동일한 허용 문에 있는 경우 모든 조건이 ec2:AssociateIamInstanceProfile 및 iam:PassRole API 작업에서 지원되고 조건이 일치하는지 확인합니다.
  4. ec2:AssociateIamInstanceProfile 및 iam:PassRole API 작업이 개별 허용 문에 있는 경우 각 허용 문의 모든 조건이 작업에서 지원되고 조건이 일치하는지 확인합니다.

자세한 내용은 정책 평가 로직계정 내에서 요청의 허용 또는 거부 결정을 참조하세요.