AWS JSON 정책 요소: NotPrincipal
AWS JSON 정책 요소: NotPrincipal
NotPrincipal 요소는 "Effect":"Deny"와 함께 사용해 NotPrincipal 요소에 지정된 프린시펄을 제외한 모든 프린시펄의 접근을 거부해요. 새 정책에서는 aws:PrincipalArn 컨텍스트 키를 쓰는 쪽을 권장하는 고급 요소예요.
출처: 문서
본문
NotPrincipal 요소는 "Effect":"Deny"와 함께 사용해 NotPrincipal 요소에 지정된 프린시펄을 제외한 모든 프린시펄의 접근을 거부해요. 프린시펄은 IAM 사용자, AWS STS 페더레이션 사용자 프린시펄, IAM 역할, 수임된 역할 세션, AWS 계정, AWS 서비스 또는 다른 프린시펄 타입일 수 있어요. 프린시펄에 대한 자세한 내용은 AWS JSON 정책 요소: Principal을 참고하세요.
NotPrincipal은 "Effect":"Deny"와 함께 사용해야 해요. "Effect":"Allow"와 함께 사용하는 것은 지원되지 않아요.
Important — 보안 및 인가 전략의 일부로 새 리소스 기반 정책에 NotPrincipal을 사용하는 것을 권장하지 않아요.
NotPrincipal을 사용하면 여러 정책 타입의 효과를 트러블슈팅하기 어려워질 수 있어요. 대신 ARN 조건 연산자와 함께aws:PrincipalArn컨텍스트 키를 사용할 것을 권장해요.
핵심 사항
NotPrincipal요소는 VPC 엔드포인트를 포함한 일부 AWS 서비스의 리소스 기반 정책에서 지원돼요. 리소스 기반 정책은 리소스에 직접 임베드하는 정책이에요. IAM ID 기반 정책이나 IAM 역할 신뢰 정책에서는NotPrincipal요소를 사용할 수 없어요.- 권한 경계가 연결된 IAM 사용자나 역할에 대해
Deny효과와 함께NotPrincipal정책 요소를 포함하는 리소스 기반 정책 문을 사용하지 마세요.Deny효과가 있는NotPrincipal요소는NotPrincipal요소에 지정된 값과 관계없이 권한 경계가 연결된 모든 IAM 프린시펄을 항상 거부해요. 이로 인해 리소스에 접근할 수 있었을 일부 IAM 사용자나 역할이 접근을 잃게 돼요. 리소스 기반 정책 문을 바꿔NotPrincipal요소 대신aws:PrincipalArn컨텍스트 키와 함께ArnNotEquals조건 연산자를 사용해 접근을 제한할 것을 권장해요. 권한 경계에 대한 자세한 내용은 IAM 엔티티의 권한 경계를 참고하세요. NotPrincipal을 사용할 때는 거부되지 않는 프린시펄의 계정 ARN도 지정해야 해요. 그렇지 않으면 정책이 프린시펄을 포함하는 전체 계정의 접근을 거부할 수 있어요. 정책에 포함하는 서비스에 따라 AWS가 계정을 먼저 검증한 다음 사용자를 검증할 수 있어요. 수임된 역할 사용자(역할을 사용하는 사람)가 평가된다면 AWS가 계정, 역할, 그리고 수임된 역할 사용자 순서로 검증할 수 있어요. 수임된 역할 사용자는 역할을 수임할 때 지정된 역할 세션 이름으로 식별돼요. 따라서 사용자 계정의 ARN을 명시적으로 포함하거나, 역할의 ARN과 그 역할을 포함하는 계정의 ARN을 둘 다 포함할 것을 강력히 권장해요.NotPrincipal요소는 서비스 제어 정책(SCP)과 리소스 제어 정책(RCP)에서는 지원되지 않아요.
NotPrincipal 요소의 대안
AWS에서 접근 제어를 관리할 때 지정한 하나 이상의 프린시펄을 제외한 모든 프린시펄의 리소스 접근을 명시적으로 거부해야 하는 시나리오가 있을 수 있어요. AWS는 더 정확한 제어와 쉬운 트러블슈팅을 위해 전역 조건 컨텍스트 키와 함께 Deny 문을 사용할 것을 권장해요. 다음 예시는 Condition 요소에 지정된 프린시펄을 제외한 모든 프린시펄의 접근을 거부하기 위해 StringNotEquals나 ArnNotEquals 같은 조건 연산자를 사용하는 대안적 접근 방식을 보여 줘요.
IAM 역할을 사용한 예시 시나리오
Deny 문과 함께 리소스 기반 정책을 사용해서 Condition 요소에 지정된 역할을 제외한 모든 IAM 역할이 리소스에 접근하거나 조작하지 못하게 할 수 있어요. 이 방식은 명시적 거부가 항상 모든 허용 문보다 우선한다는 AWS 보안 원칙을 따르고, AWS 인프라 전반에 걸쳐 최소 권한 원칙을 유지하는 데 도움이 돼요.
NotPrincipal 대신 전역 조건 컨텍스트 키와 ArnNotEquals 같은 조건 연산자와 함께 Deny 문을 사용해 IAM 역할이 리소스에 명시적으로 접근할 수 있게 할 것을 권장해요. 다음 예시는 aws:PrincipalArn을 사용해 Bucket_Account_Audit 폴더의 Amazon S3 버킷에 read-only-role 역할이 접근하도록 명시적으로 허용해요.
{
"Version":"2012-10-17",
"Statement": [
{
"Sid": "DenyCrossAuditAccess",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::Bucket_Account_Audit",
"arn:aws:s3:::Bucket_Account_Audit/*"
],
"Condition": {
"ArnNotEquals": {
"aws:PrincipalArn": "arn:aws:iam::444455556666:role/read-only-role"
}
}
}
]
}
서비스 프린시펄을 사용한 예시 시나리오
Deny 문을 사용해 Condition 요소에 지정된 서비스 프린시펄을 제외한 모든 서비스 프린시펄이 리소스에 접근하거나 조작하지 못하게 할 수 있어요. 이 방식은 AWS 환경에서 서로 다른 서비스와 애플리케이션 사이에 세밀한 접근 제어를 구현하거나 보안 경계를 설정해야 할 때 특히 유용해요.
NotPrincipal 대신 전역 조건 컨텍스트 키와 StringNotEquals 조건 연산자와 함께 Deny 문을 사용해 서비스 프린시펄이 리소스에 명시적으로 접근할 수 있게 할 것을 권장해요. 다음 예시는 aws:PrincipalServiceName을 사용해 AWS CodeBuild 서비스 프린시펄이 BUCKETNAME 폴더의 Amazon S3 버킷에 접근하도록 명시적으로 허용해요.
{
"Version":"2012-10-17",
"Statement": [
{
"Sid": "DenyNotCodeBuildAccess",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::BUCKETNAME",
"arn:aws:s3:::BUCKETNAME/*"
],
"Condition": {
"StringNotEqualsIfExists": {
"aws:PrincipalServiceName": "codebuild.amazonaws.com"
}
}
}
]
}