AWS JSON 정책 요소: Principal
AWS JSON 정책 요소: Principal
Principal 요소는 리소스 기반 JSON 정책에서 리소스에 접근이 허용되거나 거부되는 주체(프린시펄)를 지정해요. 역할 신뢰 정책이 대표적인 예시로, 누가 역할을 수임할 수 있는지 여기서 정해요.
출처: 문서
본문
리소스 기반 JSON 정책의 Principal 요소를 사용해 리소스에 접근이 허용되거나 거부되는 프린시펄을 지정해요.
Principal 요소는 리소스 기반 정책에서 반드시 사용해야 해요. IAM을 포함해 여러 서비스가 리소스 기반 정책을 지원해요. IAM의 리소스 기반 정책 타입은 역할 신뢰 정책이에요. IAM 역할에서는 역할 신뢰 정책의 Principal 요소로 누가 역할을 수임할 수 있는지 지정해요. 크로스 계정 접근의 경우 신뢰하는 계정의 12자리 식별자를 지정해야 해요.
신뢰 범위(신뢰하는 조직 또는 계정) 밖의 계정에 있는 프린시펄이 역할을 수임할 수 있는지 알아보려면 IAM Access Analyzer란 무엇인가요?를 참고하세요.
Note — 역할을 만든 뒤 계정을
"*"로 바꿔서 누구든 역할을 수임하도록 할 수 있어요. 이렇게 하면 특정 IP 주소로만 접근을 제한하는Condition요소 같은 다른 수단으로 역할에 접근할 수 있는 사람을 제한할 것을 강력히 권장해요. 역할을 모두에게 열어 두지 마세요!
리소스 기반 정책을 지원하는 다른 리소스 예시로는 Amazon S3 버킷이나 AWS KMS 키가 있어요.
ID 기반 정책에서는 Principal 요소를 사용할 수 없어요. ID 기반 정책은 IAM ID(사용자, 그룹, 역할)에 연결하는 권한 정책이에요. 이 경우 프린시펄은 암시적으로 정책이 연결된 ID가 돼요.
프린시펄 지정 방법
리소스 기반 정책의 Principal 요소나 프린시펄을 지원하는 조건 키에서 프린시펄을 지정해요.
정책에서 다음 프린시펄을 지정할 수 있어요.
- AWS 계정 및 루트 사용자
- IAM 역할
- 역할 세션
- IAM 사용자
- 페더레이션 사용자 프린시펄
- AWS 서비스
- 모든 프린시펄
정책에서 사용자 그룹을 프린시펄로 식별할 수는 없어요(리소스 기반 정책 같은 데서). 그룹은 인증이 아니라 권한과 관련이 있고, 프린시펄은 인증된 IAM 엔티티이기 때문이에요.
각 프린시펄 타입에 대해 배열을 사용해서 여러 프린시펄을 지정할 수 있어요. 배열은 하나 이상의 값을 받을 수 있어요. 요소에 여러 프린시펄을 지정하면 각 프린시펄에 권한을 부여해요. 이것은 논리적 OR이지 논리적 AND가 아니에요. 한 번에 하나의 프린시펄로 인증하니까요. 값을 여러 개 포함하면 대괄호([와 ])를 사용하고 각 항목을 쉼표로 구분해요. 다음 예시 정책은 123456789012 계정 또는 555555555555 계정에 권한을 정의해요.
"Principal" : {
"AWS": [
"123456789012",
"555555555555"
]
}
Note — 와일드카드로 프린시펄 이름이나 ARN의 일부를 매칭할 수는 없어요.
AWS 계정 프린시펄
리소스 기반 정책의 Principal 요소나 프린시펄을 지원하는 조건 키에 AWS 계정 식별자를 지정할 수 있어요. 이것은 계정에 권한을 위임해요. 다른 계정에 접근을 허용하면 그 계정의 관리자가 해당 계정의 ID(IAM 사용자 또는 역할)에 접근 권한을 부여해야 해요. AWS 계정을 지정할 때는 계정 ARN(arn:aws:iam::account-ID:root)이나 "AWS" 접두사 뒤에 계정 ID만 붙인 축약 형태를 사용할 수 있어요.
예를 들어 계정 ID가 123456789012라면 Principal 요소에서 해당 계정을 지정할 때 다음 두 방법 중 하나를 쓸 수 있어요.
"Principal": { "AWS": "arn:aws:iam::123456789012:root" }
"Principal": { "AWS": "123456789012" }
계정 ARN과 축약 계정 ID는 같은 방식으로 동작해요. 둘 다 계정에 권한을 위임해요. Principal 요소에서 계정 ARN을 사용한다고 해서 계정의 루트 사용자에게만 권한이 제한되지는 않아요.
Note — 축약된 계정 ID를 포함하는 리소스 기반 정책을 저장하면 서비스가 그것을 프린시펄 ARN으로 변환할 수 있어요. 이것은 정책의 기능을 바꾸지 않아요.
일부 AWS 서비스는 계정 프린시펄을 지정하는 추가 옵션을 지원해요. 예를 들어 Amazon S3는 다음 형식으로 표준 사용자 ID(canonical user ID)를 지정할 수 있게 해 줘요.
"Principal": { "CanonicalUser": "79a59df900b949e55d96a1e698fbacedfd6e09d98eacf8f8d5218e7cd47ef2be" }
배열을 사용해서 여러 AWS 계정(또는 표준 사용자 ID)을 프린시펄로 지정할 수도 있어요. 예를 들어 버킷 정책에서 세 가지 방법을 모두 써서 프린시펄을 지정할 수 있어요.
"Principal": {
"AWS": [
"arn:aws:iam::123456789012:root",
"999999999999"
],
"CanonicalUser": "79a59df900b949e55d96a1e698fbacedfd6e09d98eacf8f8d5218e7cd47ef2be"
}
IAM 역할 프린시펄
리소스 기반 정책의 Principal 요소나 프린시펄을 지원하는 조건 키에 IAM 역할 프린시펄 ARN을 지정할 수 있어요. IAM 역할은 ID(identity)예요. IAM에서 ID는 권한을 할당할 수 있는 리소스예요. 역할은 다른 인증된 ID가 그 역할을 수임하도록 신뢰해요. 여기에는 AWS의 프린시펄이나 외부 ID 공급자(IdP)의 사용자가 포함돼요. 프린시펄이나 ID가 역할을 수임하면 수임된 역할의 권한이 담긴 임시 보안 자격 증명을 받아요. 그 세션 자격 증명으로 AWS에서 동작을 수행하면 역할 세션 프린시펄(role session principal)이 돼요.
리소스 기반 정책에서 역할 프린시펄을 지정할 때 프린시펄의 유효 권한은 역할의 권한을 제한하는 모든 정책 타입에 의해 제한돼요. 여기에는 세션 정책과 권한 경계(permissions boundary)가 포함돼요. 역할 세션의 유효 권한이 어떻게 평가되는지에 대한 자세한 내용은 정책 평가 로직을 참고하세요.
Principal 요소에서 역할 ARN을 지정하려면 다음 형식을 사용해요.
"Principal": { "AWS": "arn:aws:iam::AWS-account-ID:role/role-name" }
Important — 역할 신뢰 정책의
Principal요소가 특정 IAM 역할을 가리키는 ARN을 포함하면, 정책을 저장할 때 그 ARN이 역할의 고유 프린시펄 ID로 변환돼요. 이는 누군가 역할을 삭제하고 다시 만들어 권한을 상승시키는 위험을 완화해 줘요. IAM은 신뢰 정책을 표시할 때 다시 역할 ARN으로 역변환하기 때문에 콘솔에서 이 ID를 보통 볼 수 없어요. 하지만 역할을 삭제하면 관계가 끊어져요. 새 역할은 신뢰 정책에 저장된 ID와 일치하지 않는 새 프린시펄 ID를 갖기 때문에, 역할을 다시 만들더라도 정책이 더 이상 적용되지 않아요. 이 경우 AWS가 더 이상 유효한 ARN으로 매핑할 수 없으므로 프린시펄 ID가 리소스 기반 정책에 나타나요. 결과적으로 신뢰 정책의Principal요소에 참조된 역할을 삭제하고 다시 만들었다면, 정책에서 역할을 편집해 프린시펄 ID를 올바른 ARN으로 바꿔야 해요. 정책을 저장하면 ARN이 다시 역할의 새 프린시펄 ID로 변환돼요. 자세한 내용은 정책에서 삭제된 IAM 역할을 AWS가 처리하는 방식 이해하기를 참고하세요.
또는 리소스 기반 정책에서 역할 프린시펄을 프린시펄로 지정하거나, aws:PrincipalArn 조건 키를 사용하는 광범위한 권한 정책을 만들 수 있어요. 이 키를 사용하면 역할 세션 프린시펄은 결과 세션의 ARN이 아니라 수임된 역할의 ARN을 기준으로 권한을 부여받아요. AWS는 조건 키 ARN을 ID로 변환하지 않으므로, 역할을 삭제한 다음 같은 이름으로 새 역할을 만들어도 역할 ARN에 부여된 권한은 유지돼요. 권한 경계나 세션 정책 같은 ID 기반 정책 타입은, ID 기반 정책에 명시적 거부가 없으면 Principal 요소에 와일드카드(*)가 있는 aws:PrincipalArn 조건 키로 부여된 권한을 제한하지 않아요.
역할 세션 프린시펄
리소스 기반 정책의 Principal 요소나 프린시펄을 지원하는 조건 키에 역할 세션을 지정할 수 있어요. 프린시펄이나 ID가 역할을 수임하면 수임된 역할의 권한이 담긴 임시 보안 자격 증명을 받아요. 그 세션 자격 증명으로 AWS에서 동작을 수행하면 역할 세션 프린시펄이 돼요.
역할 세션 프린시펄에 사용하는 형식은 역할을 수임할 때 사용한 AWS STS 동작에 따라 달라져요.
Important — AWS는 가능하면 역할 세션 프린시펄 대신 정책에서 IAM 역할 프린시펄을 사용할 것을 권장해요. 필요하면
Condition문과 조건 키로 접근을 더 좁게 한정하세요.
Principal 요소에서 역할 세션 프린시펄 ARN을 지정하려면 다음 형식을 사용해요.
"Principal": { "AWS": "arn:aws:sts::AWS-account-ID:assumed-role/role-name/role-session-name" }
또한 관리자는 역할 세션이 발급되는 방식을 제어하는 프로세스를 설계할 수 있어요. 예를 들어 사용자에게 예측 가능한 세션 이름을 만드는 원클릭 솔루션을 제공할 수 있어요. 관리자가 그렇게 한다면 정책이나 조건 키에서 역할 세션 프린시펄을 사용할 수 있어요. 그렇지 않으면 aws:PrincipalArn 조건 키에서 역할 ARN을 프린시펄로 지정할 수 있어요. 역할을 프린시펄로 지정하는 방식에 따라 결과 세션의 유효 권한이 달라질 수 있어요. 자세한 내용은 IAM 역할 프린시펄을 참고하세요.
OIDC 페더레이션 프린시펄
OIDC 페더레이션 프린시펄은 OIDC 호환 IDP(OpenID Provider, OP라고도 함)의 JSON 웹 토큰(JWT)으로 AWS STS AssumeRoleWithWebIdentity API를 호출해 임시 AWS 자격 증명을 요청할 때 사용되는 프린시펄이에요. OIDC 페더레이션 프린시펄은 AWS 계정의 OIDC IDP 또는 4개의 내장 ID 공급자(Login with Amazon, Google, Facebook, Amazon Cognito)를 나타낼 수 있어요.
자신의 OIDC IDP로부터 JWT를 발급받은 사용자, 워크로드, 시스템은 그 JWT로 AssumeRoleWithWebIdentity를 호출해서, JWT를 발급한 OIDC IDP를 신뢰하도록 구성된 IAM 역할의 임시 AWS 보안 자격 증명을 요청할 수 있어요. JWT는 id 토큰, 액세스 토큰, 또는 AWS STS가 나열한 요구 사항을 충족하는 한 어떤 방법으로든 전달된 JWT 토큰일 수 있어요. 자세한 내용은 일반 시나리오와 OIDC 공급자를 통한 자격 증명 요청을 참고하세요.
역할 신뢰 정책에서 이 프린시펄 타입을 사용해 AWS 계정에 존재하는 OIDC IDP 또는 내장 IDP 중 하나로 AssumeRoleWithWebIdentity를 호출하는 권한을 허용하거나 거부할 수 있어요. 역할 신뢰 정책의 Principal 요소에서 OIDC 페더레이션 프린시펄 ARN을 지정하려면 내장 OIDC IDP에 대해 다음 네 가지 형식 중 하나를 사용해요.
"Principal": { "Federated": "cognito-identity.amazonaws.com" }
"Principal": { "Federated": "www.amazon.com" }
"Principal": { "Federated": "graph.facebook.com" }
"Principal": { "Federated": "accounts.google.com" }
GitHub처럼 계정에 추가한 OIDC 공급자를 사용할 때는 역할의 신뢰 정책에서 공급자의 ARN을 지정해요. 이 구성을 통해 사용자 지정 ID 공급자로 인증된 사용자만 제어하는 IAM 정책을 작성할 수 있어요.
"Principal": { "Federated": "arn:aws:iam::AWS-account-ID:oidc-provider/full-OIDC-identity-provider-URL" }
예를 들어 GitHub가 신뢰하는 웹 ID 공급자라면 역할 신뢰 정책의 Principal 요소에 있는 OIDC 역할 세션 ARN은 다음 형식을 사용해요.
"Principal": { "Federated": "arn:aws:iam::AWS-account-ID:oidc-provider/tokens.actions.githubusercontent.com" }
자세한 내용은 Amazon Web Services에서 OpenID Connect 구성을 참고하세요.
OIDC 페더레이션 프린시펄은 역할 신뢰 정책이 아닌 다른 정책 타입에서는 지원되지 않아요.
SAML 페더레이션 프린시펄
SAML 페더레이션 프린시펄은 SAML 어설션으로 AWS STS AssumeRoleWithSAML API를 호출해 임시 AWS 자격 증명을 요청할 때 사용되는 프린시펄이에요. SAML ID 공급자(IDP)로 로그인한 다음 이 동작으로 IAM 역할을 수임할 수 있어요. AssumeRoleWithWebIdentity와 비슷하게 AssumeRoleWithSAML은 인증에 AWS 자격 증명을 요구하지 않아요. 대신 사용자가 먼저 SAML ID 공급자로 인증한 다음 SAML 어설션으로 AssumeRoleWithSAML API 호출을 하거나, AWS Sign-In/SAML 페이지로 리디렉션되어 AWS Management Console에 로그인해요. 이 동작으로 어떤 프린시펄이 역할을 수임할 수 있는지에 대한 자세한 내용은 AWS STS 자격 증명 비교를 참고하세요.
역할 신뢰 정책에서 이 프린시펄 타입을 사용해 신뢰하는 SAML ID 공급자에 기반해 권한을 허용하거나 거부할 수 있어요. 역할 신뢰 정책의 Principal 요소에서 SAML ID 역할 세션 ARN을 지정하려면 다음 형식을 사용해요.
"Principal": { "Federated": "arn:aws:iam::AWS-account-ID:saml-provider/provider-name" }
IAM 사용자 프린시펄
리소스 기반 정책의 Principal 요소나 프린시펄을 지원하는 조건 키에 IAM 사용자를 지정할 수 있어요.
Note —
Principal요소에서 Amazon 리소스 이름(ARN)의 사용자 이름 부분은 대소문자를 구분해요.
"Principal": { "AWS": "arn:aws:iam::AWS-account-ID:user/user-name" }
"Principal": {
"AWS": [
"arn:aws:iam::AWS-account-ID:user/user-name-1",
"arn:aws:iam::AWS-account-ID:user/user-name-2"
]
}
Principal 요소에서 사용자를 지정할 때 와일드카드(*)로 "모든 사용자"를 뜻할 수는 없어요. 프린시펄은 항상 특정 사용자를 지목해야 해요.
Important — 역할 신뢰 정책의
Principal요소가 특정 IAM 사용자를 가리키는 ARN을 포함하면, IAM은 정책을 저장할 때 ARN을 사용자의 고유 프린시펄 ID로 변환해요. 이는 누군가 사용자를 삭제하고 다시 만들어 권한을 상승시키는 위험을 완화해 줘요. 신뢰 정책이 표시될 때 사용자의 ARN으로 역변환되기 때문에 콘솔에서 이 ID를 보통 볼 수 없어요. 하지만 사용자를 삭제하면 관계가 끊어져요. 사용자를 다시 만들어도 정책이 더 이상 적용되지 않아요. 새 사용자는 신뢰 정책에 저장된 ID와 일치하지 않는 새 프린시펄 ID를 가지기 때문이에요. 이 경우 AWS가 더 이상 유효한 ARN으로 매핑할 수 없으므로 프린시펄 ID가 리소스 기반 정책에 나타나요. 결과적으로 신뢰 정책Principal요소에 참조된 사용자를 삭제하고 다시 만들었다면, 역할을 편집해 이제 잘못된 프린시펄 ID를 올바른 ARN으로 바꿔야 해요. IAM은 정책을 저장할 때 ARN을 다시 사용자의 새 프린시펄 ID로 변환해요.
IAM Identity Center 프린시펄
IAM Identity Center에서 리소스 기반 정책의 프린시펄은 AWS 계정 프린시펄로 정의해야 해요. 접근을 지정하려면 조건 블록에서 권한 세트(permission set)의 역할 ARN을 참조하세요. 자세한 내용은 IAM Identity Center 사용자 가이드의 리소스 정책, Amazon EKS, AWS KMS에서 권한 세트 참조를 참고하세요.
AWS STS 페더레이션 사용자 프린시펄
리소스 기반 정책의 Principal 요소나 프린시펄을 지원하는 조건 키에 페더레이션 사용자 세션을 지정할 수 있어요.
Important — AWS는 AWS STS 페더레이션 사용자 세션의 사용을 제한할 것을 권장해요. 대신 IAM 역할을 사용하세요.
AWS STS 페더레이션 사용자 프린시펄은 장기 IAM 자격 증명으로 호출된 GetFederationToken 동작을 통해 만들어져요. 페더레이션 사용자 권한은 GetFederationToken을 호출한 프린시펄과 GetFederationToken API에 파라미터로 전달된 세션 정책의 교집합이에요.
AWS에서 IAM 사용자나 AWS 계정 루트 사용자는 장기 액세스 키로 인증할 수 있어요. 이 동작으로 어떤 프린시펄이 페더레이션할 수 있는지에 대한 자세한 내용은 AWS STS 자격 증명 비교를 참고하세요.
- IAM 페더레이션 사용자 — IAM 사용자가
GetFederationToken동작으로 페더레이션되어 그 IAM 사용자에 대한 페더레이션 사용자 세션을 만들어요. - 페더레이션 루트 사용자 — 루트 사용자가
GetFederationToken동작으로 페더레이션되어 그 루트 사용자에 대한 페더레이션 사용자 세션을 만들어요.
IAM 사용자나 루트 사용자가 이 동작으로 AWS STS에 임시 자격 증명을 요청하면 임시 페더레이션 사용자 세션을 시작해요. 이 세션의 ARN은 페더레이션된 원래 ID를 기준으로 해요.
Principal 요소에서 페더레이션 사용자 세션 ARN을 지정하려면 다음 형식을 사용해요.
"Principal": { "AWS": "arn:aws:sts::AWS-account-ID:federated-user/user-name" }
AWS 서비스 프린시펄
리소스 기반 정책의 Principal 요소나 프린시펄을 지원하는 조건 키에 AWS 서비스를 지정할 수 있어요. 서비스 프린시펄은 서비스의 식별자예요.
AWS 서비스가 수임할 수 있는 IAM 역할을 서비스 역할(service role)이라고 해요. 서비스 역할에는 신뢰 정책이 반드시 포함되어야 해요. 신뢰 정책은 역할에 연결되는 리소스 기반 정책으로, 어떤 프린시펄이 역할을 수임할 수 있는지 정의해요. 일부 서비스 역할은 미리 정의된 신뢰 정책을 가져요. 하지만 어떤 경우에는 신뢰 정책에서 서비스 프린시펄을 직접 지정해야 해요. IAM 정책의 서비스 프린시펄은 "Service": "*"가 될 수 없어요.
Important — 서비스 프린시펄의 식별자는 서비스 이름을 포함하며 보통 다음 형식이에요:
service-name.amazonaws.com서비스 프린시펄은 서비스가 정의해요. 일부 서비스의 서비스 프린시펄은 IAM과 함께 동작하는 AWS 서비스를 열고, 그 서비스의 Service-linked role 열에 Yes가 있는지 확인한 다음 Yes 링크를 열어 그 서비스의 서비스 연결 역할 문서를 보면 찾을 수 있어요. 그 서비스의 Service-Linked Role Permissions 섹션에서 서비스 프린시펄을 찾을 수 있어요.
다음 예시는 서비스 역할에 연결할 수 있는 정책이에요. 이 정책은 Amazon ECS와 Elastic Load Balancing이라는 두 서비스가 역할을 수임할 수 있게 해요. 그러면 그 서비스들은 역할에 연결된 권한 정책(표시되지 않음)이 부여하는 모든 작업을 수행할 수 있어요. 여러 서비스 프린시펄을 지정할 때 Service 요소를 두 개 지정하는 게 아니라, 단일 Service 요소의 값으로 여러 서비스 프린시펄의 배열을 사용해요.
"Principal": {
"Service": [
"ecs.amazonaws.com",
"elasticloadbalancing.amazonaws.com"
]
}
옵트인(opt-in) 리전의 AWS 서비스 프린시펄
여러 AWS 리전에서 리소스를 실행할 수 있고 그중 일부 리전은 옵트인해야 해요. 옵트인해야 하는 리전의 전체 목록은 AWS 일반 참조 가이드의 AWS 리전 관리를 참고하세요.
옵트인 리전의 AWS 서비스가 같은 리전 안에서 요청을 보낼 때는 서비스 프린시펄 이름 형식이 리전이 없는(non-regionalized) 버전으로 식별돼요.
service-name.amazonaws.com
옵트인 리전의 AWS 서비스가 다른 리전으로 크로스 리전 요청을 보낼 때는 서비스 프린시펄 이름 형식이 리전화된(regionalized) 버전으로 식별돼요.
service-name.{region}.amazonaws.com
예를 들어 ap-southeast-1 리전에 Amazon SNS 주제가 있고 옵트인 리전 ap-east-1에 Amazon S3 버킷이 있다고 해볼게요. S3 버킷 알림이 SNS 주제에 메시지를 게시하도록 구성하려고 해요. S3 서비스가 SNS 주제에 메시지를 게시하도록 허용하려면 주제의 리소스 기반 접근 정책을 통해 S3 서비스 프린시펄에 sns:Publish 권한을 부여해야 해요.
주제 접근 정책에서 S3 서비스 프린시펄의 리전 없는 버전인 s3.amazonaws.com을 지정하면, 버킷에서 주제로 가는 sns:Publish 요청이 실패해요. 다음 예시는 SNS 주제 접근 정책의 Principal 정책 요소에 리전 없는 S3 서비스 프린시펄을 지정한 것이에요.
"Principal": { "Service": "s3.amazonaws.com" }
버킷이 옵트인 리전에 있고 요청이 같은 리전 밖에서 이뤄지므로 S3 서비스 프린시펄은 리전화된 서비스 프린시펄 이름인 s3.ap-east-1.amazonaws.com으로 나타나요. 옵트인 리전의 AWS 서비스가 다른 리전으로 요청을 보낼 때는 리전화된 서비스 프린시펄 이름을 사용해야 해요. 리전화된 서비스 프린시펄 이름을 지정하면 버킷이 다른 리전의 SNS 주제에 sns:Publish 요청을 보낼 때 성공해요. 다음 예시는 SNS 주제 접근 정책의 Principal 정책 요소에 리전화된 S3 서비스 프린시펄을 지정한 것이에요.
"Principal": { "Service": "s3.ap-east-1.amazonaws.com" }
옵트인 리전에서 다른 리전으로 가는 크로스 리전 요청에 대한 리소스 정책이나 서비스 프린시펄 기반 허용 목록은 리전화된 서비스 프린시펄 이름을 지정해야만 성공해요.
Note — IAM 역할 신뢰 정책에 대해서는 리전 없는(non-regionalized) 서비스 프린시펄 이름을 사용할 것을 권장해요. IAM 리소스는 전역(global)이므로 같은 역할을 어떤 리전에서든 쓸 수 있거든요.
모든 프린시펄
리소스 기반 정책의 Principal 요소나 프린시펄을 지원하는 조건 키에서 와일드카드(*)로 모든 프린시펄을 지정할 수 있어요. 리소스 기반 정책은 권한을 부여하고 조건 키는 정책 문의 조건을 제한하는 데 쓰여요.
Important — 공개 또는 익명 접근을 허용하려는 게 아니라면,
Allow효과와 함께 리소스 기반 정책의Principal요소에 와일드카드(*)를 사용하지 않을 것을 강력히 권장해요. 대신 의도한 프린시펄, 서비스, AWS 계정을Principal요소에 지정하고Condition요소에서 접근을 더 제한하세요. 특히 IAM 역할 신뢰 정책에서 이는 중요해요. 다른 프린시펄이 계정의 프린시펄이 될 수 있게 하기 때문이에요.
리소스 기반 정책에서 Allow 효과와 함께 와일드카드(*)를 사용하면 익명 사용자(공개 접근)를 포함한 모든 사용자에게 접근 권한을 부여해요. 계정 안의 IAM 사용자와 역할 프린시펄에게는 다른 권한이 필요 없어요. 다른 계정의 프린시펄은 자신의 계정에서 리소스에 접근할 수 있게 하는 ID 기반 권한도 있어야 해요. 이것을 크로스 계정 접근(cross-account access)이라고 해요.
익명 사용자에게는 다음 요소가 동일해요.
"Principal": "*"
"Principal" : { "AWS" : "*" }
와일드카드로 프린시펄 이름이나 ARN의 일부를 매칭할 수는 없어요.
다음 예시는 NotPrincipal 대신 사용해 Condition 요소에 지정된 프린시펄을 제외한 모든 프린시펄을 명시적으로 거부할 수 있는 리소스 기반 정책이에요. 이 정책은 Amazon S3 버킷에 추가해야 해요.
{
"Version":"2012-10-17",
"Statement": [
{
"Sid": "UsePrincipalArnInsteadOfNotPrincipalWithDeny",
"Effect": "Deny",
"Action": "s3:*",
"Principal": "*",
"Resource": [
"arn:aws:s3:::amzn-s3-demo-bucket/*",
"arn:aws:s3:::amzn-s3-demo-bucket"
],
"Condition": {
"ArnNotEquals": {
"aws:PrincipalArn": "arn:aws:iam::444455556666:user/user-name"
}
}
}
]
}
추가 정보
자세한 내용은 다음을 참고하세요.
- Amazon Simple Storage Service 사용자 가이드의 버킷 정책 예시
- Amazon Simple Notification Service 개발자 가이드의 Amazon SNS용 예시 정책
- Amazon Simple Queue Service 개발자 가이드의 Amazon SQS 정책 예시
- AWS Key Management Service 개발자 가이드의 키 정책
- AWS 일반 참조의 계정 식별자
- OIDC 페더레이션