AWS JSON 정책 요소: NotPrincipal - AWS Identity and Access Management

AWS JSON 정책 요소: NotPrincipal

NotPrincipal 요소는 "Effect":"Deny"를 사용하여 NotPrincipal 요소에 지정된 위탁자를 제외한 모든 위탁자의 액세스를 거부합니다. 위탁자는 IAM 사용자, 페더레이션 사용자, IAM 역할, 가정된 역할 세션, AWS 계정, AWS 서비스 또는 기타 위탁자의 유형일 수 있습니다. 위탁자에 대한 자세한 내용은 AWS JSON 정책 요소: Principal 섹션을 참조하세요.

NotPrincipal은 "Effect":"Deny"와 함께 사용해야 합니다. "Effect":"Allow"와 함께 사용은 지원되지 않습니다.

중요

보안 및 권한 부여 전략의 일환으로 새로운 리소스 기반 정책에 NotPrincipal을 사용하는 것은 권장되지 않습니다. NotPrincipal을 사용할 경우 여러 정책 유형의 영향을 해결하기 어려울 수 있습니다. 대신 ARN 조건 연산자와 함께 aws:PrincipalArn 컨텍스트 키를 사용하는 것이 좋습니다.

중요 사항

  • NotPrincipal 요소는 VPC 엔드포인트를 포함한 일부 AWS 서비스의 리소스 기반 정책에서 지원됩니다. 리소스 기반 정책은 리소스에 직접 삽입할 수 있는 정책입니다. IAM ID 기반 정책 또는 IAM 역할 신뢰 정책에는 NotPrincipal 요소를 사용할 수 없습니다.

  • 권한 경계 정책이 연결된 IAM 사용자 또는 역할에는 Deny 효과를 포함하는 NotPrincipal 정책 요소가 있는 리소스 기반 정책 문을 사용하지 않도록 합니다. Deny 효과를 포함하는 NotPrincipal 요소는 NotPrincipal 요소에 지정된 값에 관계없이 권한 경계 정책이 연결된 IAM 보안 주체를 항상 거부합니다. 이로 인해 원래 리소스에 액세스할 수 있는 일부 IAM 사용자 또는 역할이 해당 리소스에 더 이상 액세스할 수 없습니다. NotPrincipal 요소 대신 액세스를 제한하기 위해 ArnNotEquals 조건 연산자를 aws:PrincipalArn 컨텍스트 키와 함께 사용하도록 리소스 기반 정책 문을 변경하는 것이 좋습니다. 권한 경계에 대한 자세한 내용은 IAM 엔터티의 권한 범위 섹션을 참조하세요.

  • NotPrincipal을 사용할 때 거부되지 않은 위탁자의 계정 ARN도 지정해야 합니다. 지정하지 않으면 정책에서 해당 보안 주체를 포함하는 전체 계정에 대한 액세스가 거부될 수 있습니다. 정책에 포함하는 서비스에 따라 AWS에서 먼저 계정을 검증한 후 사용자를 검증할 수 있습니다. 위임된 역할 사용자(역할을 사용하는 사람)를 평가할 때 AWS는 먼저 계정을 검증한 후 위임된 역할 사용자를 평가합니다. 위임된 역할 사용자는 그 역할을 위임 받을 때 지정된 역할 세션 이름으로 식별할 수 있습니다. 따라서 사용자 계정의 ARN을 명시적으로 포함시키거나, 역할의 ARN과 해당 역할을 포함하는 계정의 ARN을 모두 포함시킬 것을 권장합니다.

  • NotPrincipal 요소는 서비스 제어 정책(SCP)과 리소스 제어 정책(RCP)에서 지원되지 않습니다.

NotPrincipal 요소의 대안

AWS에서 액세스 제어를 관리할 때 지정한 하나 이상의 위탁자를 제외한 리소스에 대한 모든 위탁자 액세스를 명시적으로 거부해야 하는 시나리오가 있을 수 있습니다. AWS는 보다 정확한 제어와 쉬운 문제 해결을 위해 글로벌 조건 컨텍스트 키와 함께 거부 문을 사용할 것을 권장합니다. 다음 예제에서는 StringNotEquals 또는 ArnNotEquals와 같은 조건 연산자를 사용하여 조건 요소에 지정된 위탁자를 제외한 모든 위탁자에 대한 액세스를 거부하는 대체 접근 방식을 보여줍니다.

IAM 역할을 사용하는 예제 시나리오

거부 문과 함께 리소스 기반 정책을 사용하여 조건 요소에 지정된 역할을 제외한 모든 IAM 역할이 리소스에 액세스하거나 조작하지 못하도록 할 수 있습니다. 이러한 접근 방식은 명시적 거부가 항상 모든 허용 문보다 우선한다는 AWS 보안 원칙을 따르며 AWS 인프라 전반에서 최소 권한 원칙을 유지하는 데 도움이 됩니다.

NotPrincipal을 사용하는 대신 ArnNotEquals와 같은 조건 연산자와 전역 조건 컨텍스트 키와 함께 거부 문을 사용하여 IAM 역할이 리소스에 액세스할 수 있도록 명시적으로 허용하는 것이 좋습니다. 다음 예제에서는 aws:PrincipalArn을 사용하여 read-only-role 역할이 Bucket_Account_Audit 폴더의 Amazon S3 버킷에 액세스할 수 있도록 명시적으로 허용합니다.

{ "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:sts::444455556666:role/read-only-role" } } } ] }

서비스 위탁자를 사용하는 예제 시나리오

거부 문을 사용하여 Condition 요소에 지정된 위탁자를 제외한 모든 서비스 위탁자가 리소스에 액세스하거나 리소스를 조작하지 못하도록 할 수 있습니다. 이 접근 방식은 세분화된 액세스 제어를 구현하거나 AWS 환경의 다양한 서비스와 애플리케이션 간에 보안 경계를 설정해야 하는 경우에 특히 유용합니다.

NotPrincipal을 사용하는 대신 전역 조건 컨텍스트 키가 있는 거부 문과 StringNotEquals와 같은 조건 연산자를 사용하여 리소스에 대한 서비스 위탁자 액세스를 명시적으로 허용하는 것이 좋습니다. 다음 예제에서는 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" } } } ] }