IAM 정책 문제 해결
IAM 정책 문제 해결
IAM 정책을 만들고 관리하면서 겪는 흔한 문제를 진단하고 해결하는 방법을 정리한 문서예요. 시각적 편집기 문제 해결, 정책 요약 문제 해결, 정책 관리 문제, JSON 정책 문서 오류까지 다루며 각 구체적인 상황과 해결 방법을 설명한답니다.
출처: 문서
본문
IAM 정책은 AWS에서 엔터티(자격 증명 또는 리소스)에 연결했을 때 그 엔터티의 권한을 정의하는 개체예요. 사용자 같은 프린시펄이 요청을 하면 AWS가 이 정책들을 평가하고, 정책의 권한에 따라 요청이 허용되거나 거부돼요.
정책은 AWS에 JSON 문서로 저장되며, 프린시펄에는 자격 증명 기반 정책으로, 리소스에는 리소스 기반 정책으로 연결돼요. 자격 증명 기반 정책에는 AWS 관리형 정책, 고객 관리형 정책, 인라인 정책이 포함돼요.
AWS Management Console에서 시각적(Visual) 편집기와 JSON 편집기를 모두 사용해 고객 관리형 정책을 만들고 편집할 수 있어요. 콘솔에서 정책을 보면 그 정책이 부여하는 권한의 요약을 볼 수 있어요. 시각적 편집기와 정책 요약을 사용해 IAM 정책을 관리하면서 겪는 흔한 오류를 진단하고 해결할 수 있어요.
모든 IAM 정책은 JavaScript Object Notation(JSON)의 규칙으로 시작하는 문법으로 저장된다는 점을 기억하세요. 이 문법을 이해하지 않아도 정책을 만들거나 관리하는 데 문제는 없어요. AWS Management Console의 시각적 편집기를 사용해 정책을 만들고 편집할 수 있으니까요. IAM 정책에서 JSON 문법을 더 알아보려면 IAM JSON 정책 언어의 문법을 참고하세요.
시각적 편집기로 문제 해결하기
고객 관리형 정책을 만들거나 편집할 때 시각적(Visual) 편집기의 정보를 사용해 정책의 오류를 해결할 수 있어요. 시각적 편집기를 사용해 정책을 만드는 예시를 보려면 자격 증명에 대한 액세스 제어를 참고하세요.
정책 재구성
정책을 만들면 AWS가 정책을 저장하기 전에 검증·처리·변환해요. 정책을 다시 가져오면 AWS는 권한을 바꾸지 않고 사람이 읽기 쉬운 형식으로 다시 변환해요. 그래서 정책 시각적 편집기나 JSON 탭에서 보이는 내용이 달라질 수 있어요.
- 시각적 편집기의 권한 블록은 추가·제거·재정렬될 수 있고, 블록 안의 내용도 최적화될 수 있어요.
- JSON 탭에서는 의미 없는 공백이 제거되고 JSON 맵 안의 요소가 재정렬될 수 있어요. 또한 프린시펄 요소 안의 AWS 계정 ID가 해당 AWS 계정 루트 사용자의 Amazon Resource Name(ARN)으로 바뀔 수 있어요.
이런 변화가 가능하기 때문에 JSON 정책 문서를 문자열로 비교하면 안 돼요.
AWS Management Console에서 고객 관리형 정책을 만들 때 JSON 편집기에서만 작업하도록 선택할 수 있어요. JSON 편집기에서 정책을 시각적 편집기에서 바꾼 적이 없다면 Next를 선택할 때 정책이 재구성될 가능성이 적어요. 시각적 편집기를 사용하면 IAM이 정책 모양을 최적화하기 위해 재구성할 수 있어요. 이 재구성은 편집 세션 안에서만 존재하며 자동으로 저장되지는 않아요.
편집 세션에서 정책이 재구성되면 IAM은 다음 상황에 따라 재구성을 저장할지 결정해요.
| 편집기 옵션 | 정책 편집 | 이 탭에서 Next 선택 | Save changes 선택 시 |
|---|---|---|---|
| Visual | Edited | Visual | 정책이 재구성됨 |
| Visual | Edited | JSON | 정책이 재구성됨 |
| Visual | Not Edited | Visual | 정책이 재구성됨 |
| JSON | Edited | Visual | 정책이 재구성됨 |
| JSON | Edited | JSON | 정책 구조가 변경되지 않음 |
| JSON | Not Edited | JSON | 정책 구조가 변경되지 않음 |
IAM은 여러 서비스·리소스 유형·조건 키를 허용하는 권한 블록이나 문이 있는 복잡한 정책을 재구성할 수 있어요.
시각적 편집기에서 리소스 ARN 고르기
시각적 편집기로 정책을 만들거나 편집할 때는 먼저 서비스를 고르고, 그다음 그 서비스의 작업을 선택해야 해요. 선택한 서비스와 작업이 특정 리소스 선택을 지원하면 시각적 편집기가 지원되는 리소스 유형을 나열해요. 그런 다음 Add ARN을 선택해 리소스에 대한 세부 정보를 제공할 수 있어요. 리소스 유형에 대한 ARN을 추가하는 옵션은 다음과 같아요.
- ARN 빌더 – 리소스 유형에 따라 ARN을 만들기 위한 필드가 다르게 보일 수 있어요. 지정한 설정에 대해 어떤 값을 허용하려면 Any를 선택할 수도 있어요. 예를 들어 Amazon EC2 Read 액세스 수준 그룹을 선택했다면 정책의 작업은
instance리소스 유형을 지원해요. 리소스에 대해 Region, Account, InstanceId 값을 제공하세요. 계정 ID를 제공하고 Region과 인스턴스 ID에 Any를 선택하면 정책이 계정의 모든 인스턴스에 권한을 부여해요. - ARN 입력 또는 붙여넣기 – Amazon Resource Name(ARN)으로 리소스를 지정할 수 있어요. ARN의 아무 필드(콜론 쌍 사이)에 와일드카드 문자(
*)를 포함할 수 있어요. 자세한 내용은 IAM JSON 정책 요소: Resource를 참고하세요.
시각적 편집기에서 권한 거부
기본적으로 시각적 편집기로 만든 정책은 선택한 작업을 허용해요. 선택한 작업을 대신 거부하려면 Switch to deny permissions를 선택하세요. 요청은 기본적으로 거부되므로 사용자가 필요한 작업과 리소스에만 권한을 허용하는 걸 권장해요. 다른 문이나 정책이 별도로 허용하는 권한을 재정의하려는 경우에만 deny 문을 만들어야 해요. deny 권한은 문제 해결을 어렵게 만들 수 있으므로 최소한으로 제한하는 걸 권장해요. IAM이 정책 로직을 평가하는 방법에 대한 자세한 내용은 정책 평가 로직을 참고하세요.
참고 기본적으로 AWS 계정 루트 사용자만 해당 계정의 모든 리소스에 액세스할 수 있어요. 루트 사용자로 로그인하지 않았다면 정책이 부여하는 권한이 있어야 해요.
시각적 편집기에서 여러 서비스 지정하기
시각적 편집기로 정책을 만들 때는 한 번에 하나의 서비스만 선택할 수 있어요. 이는 모범 사례인데, 시각적 편집기가 그 하나의 서비스에 대한 작업에서 선택할 수 있게 해주기 때문이에요. 그런 다음 그 서비스와 선택한 작업이 지원하는 리소스 중에서 고르게 돼요. 이렇게 하면 정책을 더 쉽게 만들고 문제를 해결할 수 있어요.
와일드카드 문자(*)를 사용해 여러 서비스를 수동으로 지정할 수도 있어요. 예를 들어 Code*를 입력하면 CodeBuild, CodeCommit처럼 Code로 시작하는 모든 서비스에 권한을 부여해요. 하지만 그런 경우 작업과 리소스 ARN을 직접 입력해 정책을 완성해야 해요. 또한 정책을 저장하면 각 서비스를 별도의 권한 블록에 포함하도록 재구성될 수 있어요.
서비스에 와일드카드 같은 JSON 문법을 사용하려면 JSON 편집기 옵션으로 정책을 만들고 편집하고 저장하세요.
시각적 편집기에서 정책 크기 줄이기
시각적 편집기로 정책을 만들면 IAM이 정책을 저장할 JSON 문서를 만들어요. JSON 편집기 옵션으로 전환하면 이 문서를 볼 수 있어요. 이 JSON 문서가 정책 크기 제한을 초과하면 시각적 편집기가 오류 메시지를 표시해요. 그러면 정책을 검토하고 저장할 수 없어요. 관리형 정책의 크기 제한을 보려면 IAM과 STS 문자 제한을 참고하세요.
시각적 편집기에서 정책 크기를 줄이려면 정책을 편집하거나 권한 블록을 다른 정책으로 옮기세요. 오류 메시지에는 정책 문서의 문자 수가 포함돼요. 이 정보를 사용해 정책 크기를 줄일 수 있어요.
시각적 편집기에서 인식되지 않는 서비스·작업·리소스 유형 수정하기
시각적 편집기에서 정책에 인식되지 않는 서비스·작업·리소스 유형이 포함됐다는 경고를 볼 수 있어요.
참고 IAM은 정책 요약을 지원하는 서비스의 서비스 이름·작업·리소스 유형을 검토해요. 하지만 정책 요약에 존재하지 않는 리소스 값이나 조건이 포함될 수 있어요. 항상 정책 시뮬레이터로 정책을 테스트하세요.
정책에 인식되지 않는 서비스·작업·리소스 유형이 포함되면 다음 오류 중 하나가 발생한 거예요.
- 프리뷰 서비스 – 프리뷰 상태인 서비스는 시각적 편집기를 지원하지 않아요. 프리뷰에 참여 중이라면 작업과 리소스 ARN을 직접 입력해 정책을 완성해야 해요. 경고를 무시하고 계속할 수 있어요. 또는 JSON 편집기 옵션을 선택해 JSON 정책 문서를 입력하거나 붙여넣을 수 있어요.
- 사용자 지정 서비스 – 사용자 지정 서비스는 시각적 편집기를 지원하지 않아요. 사용자 지정 서비스를 사용한다면 작업과 리소스 ARN을 직접 입력해 정책을 완성해야 해요. 경고를 무시하고 계속할 수 있어요. 또는 JSON 편집기 옵션을 선택해 JSON 정책 문서를 입력하거나 붙여넣을 수 있어요.
- 시각적 편집기를 지원하지 않는 서비스 – 정책에 시각적 편집기를 지원하지 않는 일반 사용 가능(GA) 서비스가 포함되면 작업과 리소스 ARN을 직접 입력해 정책을 완성해야 해요. 경고를 무시하고 계속할 수 있어요. 또는 JSON 편집기 옵션을 선택해 JSON 정책 문서를 입력하거나 붙여넣을 수 있어요. 일반 사용 가능 서비스는 공개적으로 출시된 서비스로, 프리뷰나 사용자 지정 서비스가 아니에요. 인식되지 않는 서비스가 GA이고 이름이 올바르게 입력됐다면 그 서비스는 시각적 편집기를 지원하지 않는 거예요. GA 서비스에 시각적 편집기 또는 정책 요약 지원을 요청하는 방법은 IAM 정책 요약을 지원하지 않는 서비스를 참고하세요.
- 시각적 편집기를 지원하지 않는 작업 – 정책에 지원되는 서비스의 지원되지 않는 작업이 포함되면 작업과 리소스 ARN을 직접 입력해 정책을 완성해야 해요. 경고를 무시하고 계속할 수 있어요. 또는 JSON 편집기 옵션을 선택해 JSON 정책 문서를 입력하거나 붙여넣을 수 있어요. 정책에 지원되는 서비스의 지원되지 않는 작업이 포함되면 그 서비스는 시각적 편집기를 완전히 지원하지 않는 거예요. GA 서비스에 시각적 편집기 또는 정책 요약 지원을 요청하는 방법은 IAM 정책 요약을 지원하지 않는 서비스를 참고하세요.
- 시각적 편집기를 지원하지 않는 리소스 유형 – 정책에 지원되는 작업의 지원되지 않는 리소스 유형이 포함되면 경고를 무시하고 계속할 수 있어요. 하지만 IAM이 선택한 모든 작업에 리소스를 포함했는지 확인할 수 없으므로 추가 경고가 나올 수 있어요.
- 오타 – 시각적 편집기에서 서비스·작업·리소스를 직접 입력하면 오타가 포함된 정책을 만들 수 있어요. 서비스와 작업 목록에서 선택해 시각적 편집기를 사용하세요. 그런 다음 프롬프트에 따라 리소스 섹션을 완성해요. 서비스가 시각적 편집기를 완전히 지원하지 않으면 정책의 일부를 직접 입력해야 할 수 있어요.
정책에 위 오류가 전혀 없다고 확신한다면 정책에 오타가 있을 수 있어요. 다음 문제를 확인하세요.
- 서비스·작업·리소스 유형 이름의 철자가 틀린 경우. 예:
s3대신s2,ListAllMyBuckets대신ListMyBuckets - ARN에 불필요한 텍스트가 있는 경우. 예:
arn:aws:s3: : :* - 작업에 콜론이 없는 경우. 예:
iam.CreateUser
오타가 있을 수 있는 정책을 평가하려면 Next를 선택해 정책 요약을 검토하고, 정책이 의도한 권한을 제공하는지 확인하세요.
정책 요약으로 문제 해결하기
정책 요약과 관련된 문제를 진단하고 해결할 수 있어요.
정책 요약 누락
IAM 콘솔에는 정책의 각 서비스에 대해 허용되거나 거부된 액세스 수준·리소스·조건을 설명하는 정책 요약 테이블이 포함돼요. 정책은 정책 요약, 서비스 요약, 작업 요약의 세 가지 테이블로 요약돼요.
정책 요약 테이블에는 서비스 목록과 선택한 정책이 정의하는 권한의 요약이 포함돼요. 정책 요약은 연결된 정책에 대해서는 Policy details 페이지에서, 관리형 정책에 대해서는 Policies 페이지에서 볼 수 있어요. AWS가 정책에 대한 요약을 만들지 못하면 콘솔은 JSON 정책 문서와 다음 오류를 표시해요.
A summary for this policy cannot be generated. You can still view or edit the JSON policy document.
정책에 요약이 포함되지 않으면 다음 오류 중 하나가 발생한 거예요.
- 지원되지 않는 정책 요소 – IAM은 다음 정책 요소 중 하나를 포함하는 정책에 대한 정책 요약을 생성하는 것을 지원하지 않아요:
Principal,NotPrincipal,NotResource - 정책 권한 없음 – 정책이 유효한 권한을 제공하지 않으면 정책 요약을 생성할 수 없어요. 예를 들어 정책에
"NotAction": "*"요소가 있는 단일 문이 포함되면 "모든 작업"(*)을 제외한 모든 작업에 액세스를 부여해요. 즉 아무것에도Deny또는Allow액세스를 부여하지 않아요.
참고
NotPrincipal,NotAction,NotResource같은 정책 요소를 사용할 때는 주의하세요. 정책 요소 사용에 대한 정보는 IAM JSON 정책 요소 참조를 참고하세요.
서비스와 리소스를 일치하지 않게 지정하면 유효한 권한을 제공하지 않는 정책을 만들 수 있어요. 이는 한 서비스의 작업과 다른 서비스의 리소스를 지정할 때 발생할 수 있어요. 이 경우 정책 요약은 나타나요. 문제가 있다는 유일한 표시는 요약의 리소스 열에 다른 서비스의 리소스가 포함될 수 있다는 거예요. 이 열에 일치하지 않는 리소스가 포함되면 정책에 오류가 있는지 검토해야 해요. 정책을 더 잘 이해하려면 정책 시뮬레이터로 정책을 테스트하세요.
정책 요약에 인식되지 않는 서비스·작업·리소스 유형이 포함됨
IAM 콘솔에서 정책 요약에 경고 기호()가 포함되면 정책에 인식되지 않는 서비스·작업·리소스 유형이 포함됐을 수 있어요. 정책 요약의 경고에 대해 알아보려면 정책 요약(서비스 목록)을 참고하세요.
참고 IAM은 정책 요약을 지원하는 서비스의 서비스 이름·작업·리소스 유형을 검토해요. 하지만 정책 요약에 존재하지 않는 리소스 값이나 조건이 포함될 수 있어요. 항상 정책 시뮬레이터로 정책을 테스트하세요.
정책에 인식되지 않는 서비스·작업·리소스 유형이 포함되면 다음 오류 중 하나가 발생한 거예요.
- 프리뷰 서비스 – 프리뷰 상태인 서비스는 정책 요약을 지원하지 않아요.
- 사용자 지정 서비스 – 사용자 지정 서비스는 정책 요약을 지원하지 않아요.
- 요약을 지원하지 않는 서비스 – 정책에 정책 요약을 지원하지 않는 일반 사용 가능(GA) 서비스가 포함되면 그 서비스는 정책 요약 테이블의 Unrecognized services 섹션에 포함돼요. 일반 사용 가능 서비스는 공개적으로 출시된 서비스로, 프리뷰나 사용자 지정 서비스가 아니에요. 인식되지 않는 서비스가 GA이고 이름이 올바르게 입력됐다면 그 서비스는 IAM 정책 요약을 지원하지 않는 거예요. GA 서비스에 정책 요약 지원을 요청하는 방법은 IAM 정책 요약을 지원하지 않는 서비스를 참고하세요.
- 요약을 지원하지 않는 작업 – 정책에 지원되는 서비스의 지원되지 않는 작업이 포함되면 그 작업은 서비스 요약 테이블의 Unrecognized actions 섹션에 포함돼요. 서비스 요약의 경고에 대해 알아보려면 서비스 요약(작업 목록)을 참고하세요.
- 요약을 지원하지 않는 리소스 유형 – 정책에 지원되는 작업의 지원되지 않는 리소스 유형이 포함되면 그 리소스는 서비스 요약 테이블의 Unrecognized resource types 섹션에 포함돼요. 서비스 요약의 경고에 대해 알아보려면 서비스 요약(작업 목록)을 참고하세요.
- 오타 – AWS는 정책 검증의 일부로 JSON이 문법적으로 올바른지, 정책에 오타나 다른 오류가 없는지 확인해요.
참고 모범 사례에 따라 IAM Access Analyzer를 사용해 IAM 정책을 검증해 안전하고 기능적인 권한을 보장하는 것을 권장해요. 기존 정책을 열어 정책 검증 권장 사항을 검토하고 해결하세요.
IAM 정책 요약을 지원하지 않는 서비스
IAM 정책 요약이나 시각적 편집기가 일반 사용 가능(GA) 서비스 또는 작업을 지원하지 않을 수 있어요. GA 서비스는 공개적으로 출시된 서비스로, 프리뷰나 사용자 지정 서비스가 아니에요. 인식되지 않는 서비스가 GA이고 이름이 올바르게 입력됐다면 그 서비스는 이러한 기능을 지원하지 않는 거예요. 정책에 지원되는 서비스의 지원되지 않는 작업이 포함되면 그 서비스는 IAM 정책 요약을 완전히 지원하지 않아요.
서비스가 IAM 정책 요약 또는 시각적 편집기 지원을 추가하도록 요청하려면
- AWS Management Console에 로그인하고 IAM 콘솔(https://console.aws.amazon.com/iam/)을 엽니다.
- 지원되지 않는 서비스가 포함된 정책을 찾습니다. 관리형 정책이면 탐색 창에서 Policies를 선택하고 정책 목록에서 보고 싶은 정책의 이름을 선택합니다. 사용자에 연결된 인라인 정책이면 탐색 창에서 Users를 선택하고 정책을 보려는 사용자의 이름을 선택한 뒤, 사용자의 정책 테이블에서 보려는 정책 요약의 헤더를 펼칩니다.
- AWS Management Console 왼쪽 하단에서 Feedback을 선택합니다. Feedback for IAM 상자에
I request that the <ServiceName> service add support for IAM policy summaries and the visual editor라고 입력합니다. 여러 서비스가 요약을 지원하도록 하려면I request that the <ServiceName1>, <ServiceName2>, and <ServiceName3> services add support for IAM policy summaries and the visual editor라고 입력합니다.
누락된 작업에 대한 IAM 정책 요약 지원을 요청하려면
- AWS Management Console에 로그인하고 IAM 콘솔(https://console.aws.amazon.com/iam/)을 엽니다.
- 지원되지 않는 서비스가 포함된 정책을 찾습니다. 관리형 정책이면 탐색 창에서 Policies를 선택하고 보고 싶은 정책의 이름을 선택합니다. 사용자에 연결된 인라인 정책이면 탐색 창에서 Users를 선택하고 정책을 보려는 사용자의 이름을 선택한 뒤, 사용자의 정책 테이블에서 정책 요약을 펼치려는 정책의 이름을 선택합니다.
- 정책 요약에서 지원되지 않는 작업이 포함된 서비스의 이름을 선택합니다.
- AWS Management Console 왼쪽 하단에서 Feedback을 선택합니다. Feedback for IAM 상자에
I request that the <ServiceName> service add IAM policy summary and the visual editor support for the <ActionName> action이라고 입력합니다. 지원되지 않는 작업이 두 개 이상이라면I request that the <ServiceName> service add IAM policy summary and the visual editor support for the <ActionName1>, <ActionName2>, and <ActionName3> actions이라고 입력합니다.
다른 서비스에 누락된 작업을 포함하도록 요청하려면 마지막 세 단계를 반복합니다.
내 정책이 기대한 권한을 부여하지 않아요
사용자·그룹·역할·리소스에 권한을 할당하려면 권한을 정의하는 문서인 정책을 만들어요. 정책 문서에는 다음 요소가 포함돼요.
- Effect – 정책이 액세스를 허용하는지 거부하는지
- Action – 정책이 허용하거나 거부하는 작업의 목록
- Resource – 작업이 수행될 수 있는 리소스의 목록
- Condition(선택) – 정책이 권한을 부여하는 상황
이 요소들과 다른 정책 요소에 대해 알아보려면 IAM JSON 정책 요소 참조를 참고하세요.
액세스를 부여하려면 정책이 지원되는 리소스가 있는 작업을 정의해야 해요. 정책에 조건도 포함되면 그 조건은 글로벌 조건 키를 포함하거나 작업에 적용돼야 해요. 어떤 작업이 어떤 리소스를 지원하는지 알아보려면 해당 서비스의 AWS 문서를 참고하세요. 어떤 작업이 어떤 조건을 지원하는지 알아보려면 AWS 서비스의 작업·리소스·조건 키를 참고하세요.
정책이 권한을 부여하지 않는 작업·리소스·조건을 정의하는지 확인하세요. IAM 콘솔(https://console.aws.amazon.com/iam/)에서 정책의 정책 요약을 확인하세요. 정책 요약을 사용해 정책의 문제를 식별하고 수정할 수 있어요.
IAM 정책에 정의됐는데도 요소가 권한을 부여하지 않는 데는 여러 이유가 있어요.
경고를 포함한 정책 요약의 예시를 보려면 정책 요약(서비스 목록)을 참고하세요.
작업이 적용 가능한 리소스 없이 정의됨
아래 정책은 모든 ec2:Describe* 작업을 정의하고 특정 리소스를 정의해요. 그런데 ec2:Describe 작업 중 어느 것도 부여되지 않아요. 이 작업들은 리소스 수준 권한을 지원하지 않기 때문이에요. 리소스 수준 권한이란 정책의 Resource 요소에서 ARN을 사용해 리소스를 지원한다는 뜻이에요. 작업이 리소스 수준 권한을 지원하지 않으면 정책의 해당 문은 Resource 요소에 와일드카드(*)를 사용해야 해요. 어떤 서비스가 리소스 수준 권한을 지원하는지 알아보려면 IAM과 함께 작동하는 AWS 서비스를 참고하세요.
JSON
{
"Version":"2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "ec2:Describe*",
"Resource": "arn:aws:ec2:us-east-2:111122223333:instance/*"
}
]
}
이 정책은 어떤 권한도 제공하지 않으며 정책 요약에 다음 오류가 포함돼요.
This policy does not grant any permissions. To grant access, policies must have an action that has an applicable resource or condition.
이 정책을 고치려면 Resource 요소에 *를 사용해야 해요.
JSON
{
"Version":"2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": "ec2:Describe*",
"Resource": "*"
}]
}
적용 가능한 작업 없이 리소스가 정의됨
아래 정책은 Amazon S3 버킷 리소스를 정의하지만 그 리소스에서 수행할 수 있는 S3 작업은 포함하지 않아요. 이 정책은 또한 모든 Amazon CloudFront 작업에 대한 전체 액세스를 부여해요.
JSON
{
"Version":"2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "cloudfront:*",
"Resource": [
"arn:aws:cloudfront:*",
"arn:aws:s3:::amzn-s3-demo-bucket"
]
}
]
}
이 정책은 모든 CloudFront 작업에 대한 권한을 제공해요. 하지만 정책이 S3 amzn-s3-demo-bucket 리소스를 정의하면서 S3 작업을 정의하지 않기 때문에 정책 요약에는 다음 경고가 포함돼요.
This policy defines some actions, resources, or conditions that do not provide permissions. To grant access, policies must have an action that has an applicable resource or condition.
S3 버킷 권한을 제공하도록 이 정책을 고치려면 버킷 리소스에서 수행할 수 있는 S3 작업을 정의해야 해요.
JSON
{
"Version":"2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"cloudfront:*",
"s3:CreateBucket",
"s3:ListBucket*",
"s3:PutBucket*",
"s3:GetBucket*"
],
"Resource": [
"arn:aws:cloudfront:*",
"arn:aws:s3:::amzn-s3-demo-bucket"
]
}
]
}
또는 CloudFront 권한만 제공하도록 이 정책을 고치려면 S3 리소스를 제거하세요.
적용 가능한 작업 없이 조건이 정의됨
아래 정책은 S3 접두사가 custom이고 버전 ID가 1234일 때 모든 S3 리소스에 대한 두 개의 Amazon S3 작업을 정의해요. 하지만 s3:VersionId 조건 키는 객체 버전 태그 지정에 사용되며 정의된 버킷 작업에서는 지원되지 않아요. 어떤 작업이 어떤 조건을 지원하는지 알아보려면 AWS 서비스의 작업·리소스·조건 키에서 서비스를 선택해 조건 키에 대한 서비스 문서를 확인하세요.
JSON
{
"Version":"2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucketVersions",
"s3:ListBucket"
],
"Resource": "*",
"Condition": {
"StringEquals": {
"s3:prefix": [
"custom"
],
"s3:VersionId": [
"1234"
]
}
}
}
]
}
이 정책은 버킷 이름에 custom 접두사가 포함된 경우 s3:ListBucketVersions 작업과 s3:ListBucket 작업에 대한 권한을 제공해요. 하지만 s3:VersionId 조건이 정의된 어떤 작업에서도 지원되지 않기 때문에 정책 요약에는 다음 오류가 포함돼요.
This policy does not grant any permissions. To grant access, policies must have an action that has an applicable resource or condition.
S3 객체 버전 태그 지정을 사용하도록 이 정책을 고치려면 s3:VersionId 조건 키를 지원하는 S3 작업을 정의해야 해요.
JSON
{
"Version":"2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucketVersions",
"s3:ListBucket",
"s3:GetObjectVersion"
],
"Resource": "*",
"Condition": {
"StringEquals": {
"s3:prefix": [
"custom"
],
"s3:VersionId": [
"1234"
]
}
}
}
]
}
이 정책은 정책의 모든 작업과 조건에 대한 권한을 제공해요. 하지만 단일 작업이 두 조건을 모두 일치시키는 경우가 없기 때문에 여전히 어떤 권한도 제공하지 않아요. 대신 각 문에 해당 작업만 포함하는 두 개의 개별 문을 만들어야 해요.
이 정책을 고치려면 두 개의 문을 만드세요. 첫 번째 문은 s3:prefix 조건을 지원하는 작업을 포함하고, 두 번째 문은 s3:VersionId 조건을 지원하는 작업을 포함해요.
JSON
{
"Version":"2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucketVersions",
"s3:ListBucket"
],
"Resource": "*",
"Condition": {
"StringEquals": {
"s3:prefix": "custom"
}
}
},
{
"Effect": "Allow",
"Action": "s3:GetObjectVersion",
"Resource": "*",
"Condition": {
"StringEquals": {
"s3:VersionId": "1234"
}
}
}
]
}
정책 관리 문제 해결
정책 관리와 관련된 문제를 진단하고 해결할 수 있어요.
IAM 계정에서 정책 연결 또는 분리
일부 AWS 관리형 정책은 서비스에 연결되어 있어요. 이 정책들은 해당 서비스의 서비스 연결 역할에만 사용돼요. IAM 콘솔에서 Policy details 페이지를 보면 정책이 서비스에 연결되어 있다는 배너가 표시돼요. 이 정책을 IAM의 사용자·그룹·역할에 연결할 수는 없어요. 서비스에 대한 서비스 연결 역할을 만들면 이 정책이 새 역할에 자동으로 연결돼요. 이 정책은 필수이므로 서비스 연결 역할에서 분리할 수 없어요.
자격 증명의 활동에 따라 IAM 자격 증명 정책 변경하기
IAM 자격 증명(사용자·그룹·역할)의 활동에 따라 정책을 업데이트할 수 있어요. 그러려면 CloudTrail 이벤트 기록(Event history)에서 계정의 이벤트를 확인하세요. CloudTrail 이벤트 로그에는 정책의 권한을 변경하는 데 사용할 수 있는 자세한 이벤트 정보가 포함돼요.
사용자나 역할이 AWS에서 작업을 수행하려고 시도했는데 그 요청이 거부됐다면, 사용자나 역할이 그 작업을 수행할 권한이 있어야 하는지 고려하세요. 그래야 한다면 액세스를 시도한 리소스의 ARN과 작업을 정책에 추가할 수 있어요.
사용자나 역할이 사용하지 않는 권한을 갖고 있다면 그 권한을 정책에서 제거하는 것을 고려하세요. 정책이 필요한 작업만 수행하는 데 필요한 최소 권한을 부여하는지 확인하세요.
CloudTrail 사용에 대한 자세한 내용은 AWS CloudTrail 사용자 가이드의 CloudTrail 콘솔에서 CloudTrail 이벤트 보기를 참고하세요.
JSON 정책 문서 문제 해결
JSON 정책 문서와 관련된 문제를 진단하고 해결할 수 있어요.
정책 검증
JSON 정책을 만들거나 편집할 때 IAM이 정책 검증을 수행해 효과적인 정책을 만드는 데 도움을 줄 수 있어요. IAM이 JSON 문법 오류를 식별하고, IAM Access Analyzer가 정책을 더 다듬는 데 도움이 되는 권장 사항과 함께 추가 정책 검사를 제공해요. 정책 검증에 대해 자세히 알아보려면 IAM 정책 검증을 참고하세요. IAM Access Analyzer 정책 검사와 실행 가능한 권장 사항에 대해 자세히 알아보려면 IAM Access Analyzer 정책 검증을 참고하세요.
JSON 편집기에서 정책 검증 권한이 없어요
AWS Management Console에서 IAM Access Analyzer 정책 검증 결과를 볼 권한이 없으면 다음 오류가 표시될 수 있어요.
You need permissions. You do not have the permissions required to perform this operation. Ask your administrator to add permissions.
이 오류를 해결하려면 관리자에게 access-analyzer:ValidatePolicy 권한을 추가해 달라고 요청하세요.
JSON 정책 객체가 두 개 이상
IAM 정책은 JSON 객체 하나만으로 구성돼야 해요. 객체는 { } 중괄호로 감싸서 표시해요. JSON 객체 안에는 바깥 중괄호 쌍 안에 { } 중괄호를 추가로 넣어 다른 객체를 중첩할 수 있어요. 정책에는 { } 중괄호 한 쌍만 최상위에 있어야 해요. 다음 예시는 최상위에 두 개의 객체(빨간색으로 표시)를 포함하므로 올바르지 않아요.
JSON
{
"Version":"2012-10-17",
"Statement":
{
"Effect":"Allow",
"Action":"ec2:Describe*",
"Resource":"*"
}
}
{
"Statement": {
"Effect": "Allow",
"Action": "s3:*",
"Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*"
}
}
하지만 올바른 정책 문법을 사용해 이전 예시의 의도를 충족시킬 수 있어요. 각각의 Statement 요소를 가진 완전한 두 개의 정책 객체를 포함하는 대신 두 블록을 단일 Statement 요소로 결합할 수 있어요. Statement 요소는 값으로 두 개의 객체 배열을 가지며 다음 예시(굵게 표시)와 같아요.
JSON
{
"Version":"2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "ec2:Describe*",
"Resource":"*"
},
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*"
}
]
}
JSON Statement 요소가 두 개 이상
이 오류는 처음에는 이전 섹션의 변형으로 보일 수 있어요. 하지만 문법적으로는 다른 유형의 오류예요. 다음 예시는 최상위에 { } 중괄호 한 쌍으로 표시된 정책 객체가 하나만 있어요. 하지만 그 객체 안에 두 개의 Statement 요소가 포함돼 있네요.
IAM 정책에는 Statement 요소가 하나만 있어야 해요. 이 요소는 콜론 왼쪽에 이름(Statement)이 있고 오른쪽에 값이 있어요. Statement 요소의 값은 { } 중괄호로 표시된 객체여야 하며, Effect 요소 하나, Action 요소 하나, Resource 요소 하나를 포함해야 해요. 다음 예시는 정책 객체에 두 개의 Statement 요소(빨간색으로 표시)를 포함하므로 올바르지 않아요.
JSON
{
"Version":"2012-10-17",
"Statement": {
"Effect": "Allow",
"Action": "ec2:Describe*",
"Resource": "*"
},
"Statement": {
"Effect": "Allow",
"Action": "s3:*",
"Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*"
}
}
값 객체는 여러 값 객체의 배열이 될 수 있어요. 이 문제를 해결하려면 두 개의 Statement 요소를 객체 배열이 있는 하나의 요소로 결합하세요. 다음 예시(굵게 표시)와 같이요.
JSON
{
"Version":"2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "ec2:Describe*",
"Resource":"*"
},
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*"
}
]
}
Statement 요소의 값은 객체 배열이에요. 이 예시의 배열은 두 개의 객체로 구성되며, 각 객체는 그 자체로 Statement 요소의 올바른 값이에요. 배열의 각 객체는 쉼표로 구분돼요.
JSON Statement 요소에 Effect·Action·Resource 요소가 두 개 이상
Statement 이름/값 쌍의 값 쪽에서 객체는 Effect 요소 하나, Action 요소 하나, Resource 요소 하나만으로 구성돼야 해요. 다음 정책은 Statement에 Effect 요소가 두 개 있으므로 올바르지 않아요.
JSON
{
"Version":"2012-10-17",
"Statement": {
"Effect": "Deny",
"Effect": "Allow",
"Action": "ec2:* ",
"Resource": "*"
}
}
참고 정책 엔진은 새 정책이나 편집된 정책에서 이러한 오류를 허용하지 않아요. 하지만 정책 엔진은 엔진이 업데이트되기 전에 저장된 정책은 계속 허용해요. 오류가 있는 기존 정책의 동작은 다음과 같아요.
Effect요소가 여러 개인 경우: 마지막Effect요소만 적용돼요. 나머지는 무시돼요.Action요소가 여러 개인 경우: 모든Action요소가 내부적으로 결합되어 단일 목록으로 처리돼요.Resource요소가 여러 개인 경우: 모든Resource요소가 내부적으로 결합되어 단일 목록으로 처리돼요.
정책 엔진은 문법 오류가 있는 정책을 저장하는 것을 허용하지 않아요. 저장하기 전에 정책의 오류를 수정하세요. 정책의 정책 검증 권장 사항을 검토하고 수정하세요.
각 경우의 해결 방법은 잘못된 추가 요소를 제거하는 거예요. Effect 요소의 경우는 간단해요. 이전 예시에서 Amazon EC2 인스턴스에 대한 권한을 거부하려면 정책에서 "Effect": "Allow", 줄을 제거하면 돼요. 다음과 같이요.
JSON
{
"Version":"2012-10-17",
"Statement": {
"Effect": "Deny",
"Action": "ec2:*",
"Resource": "*"
}
}
하지만 중복 요소가 Action이나 Resource라면 해결이 더 복잡할 수 있어요. 허용(또는 거부)하려는 작업이 여러 개이거나 여러 리소스에 대한 액세스를 제어하려는 경우가 있을 수 있으니까요. 예를 들어 다음 예시는 Resource 요소가 여러 개(빨간색으로 표시)이므로 올바르지 않아요.
JSON
{
"Version":"2012-10-17",
"Statement": {
"Effect": "Allow",
"Action": "s3:*",
"Resource": "arn:aws:s3:::amzn-s3-demo-bucket",
"Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*"
}
}
Statement 요소의 값 객체에 있는 필수 요소 각각은 한 번만 존재할 수 있어요. 해결 방법은 각 값을 배열에 넣는 거예요. 다음 예시는 두 개의 별도 리소스 요소를 값 객체가 배열인 하나의 Resource 요소로 만들었어요(굵게 표시).
JSON
{
"Version":"2012-10-17",
"Statement": {
"Effect": "Allow",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::amzn-s3-demo-bucket",
"arn:aws:s3:::amzn-s3-demo-bucket/*"
]
}
}
JSON Version 요소 누락
Version 정책 요소는 정책 버전과 달라요. Version 정책 요소는 정책 내에서 사용되며 정책 언어의 버전을 정의해요. 반면 정책 버전은 IAM에서 고객 관리형 정책을 변경할 때 생성돼요. 변경된 정책은 기존 정책을 덮어쓰지 않아요. 대신 IAM이 관리형 정책의 새 버전을 만들어요. Version 정책 요소에 대해 자세히 알아보려면 IAM JSON 정책 요소: Version을 참고하세요. 정책 버전에 대해 자세히 알아보려면 IAM 정책 버전 관리를 참고하세요.
AWS 기능이 발전하면서 IAM 정책에 이러한 기능을 지원하기 위한 새 기능이 추가돼요. 때로는 정책 문법 업데이트에 새 버전 번호가 포함되기도 해요. 정책에서 정책 문법의 최신 기능을 사용한다면 어떤 버전을 사용하고 있는지 정책 구문 분석 엔진에 알려야 해요.
기본 정책 버전은 2008-10-17이에요. 나중에 도입된 정책 기능을 사용하려면 원하는 기능을 지원하는 버전 번호를 지정해야 해요. 항상 최신 정책 문법 버전 번호(현재 "Version": "2012-10-17")를 포함할 것을 권장해요.
예를 들어 다음 정책은 리소스 ARN에 정책 변수 ${...}를 사용하므로 올바르지 않아요. 하지만 정책 변수를 지원하는 정책 문법 버전을 지정하지 않았네요(빨간색으로 표시).
{
"Statement":
{
"Action": "iam:*AccessKey*",
"Effect": "Allow",
"Resource": "arn:aws:iam::123456789012:user/${aws:username}"
}
}
정책 상단에 값이 2012-10-17인 Version 요소를 추가하면 이 문제가 해결돼요. 2012-10-17은 정책 변수를 지원하는 첫 번째 IAM API 버전이에요(굵게 표시).
JSON
{
"Version":"2012-10-17",
"Statement":
{
"Action": "iam:*AccessKey*",
"Effect": "Allow",
"Resource": "arn:aws:iam::123456789012:user/${aws:username}"
}
}