

# AWS JSON 정책 요소: NotPrincipal
<a name="reference_policies_elements_notprincipal"></a>

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

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

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

## 중요 사항
<a name="notprincipal-key-points"></a>
+ `NotPrincipal` 요소는 VPC 엔드포인트를 포함한 일부 AWS 서비스의 리소스 기반 정책에서 지원됩니다. 리소스 기반 정책은 리소스에 직접 삽입할 수 있는 정책입니다. IAM ID 기반 정책 또는 IAM 역할 신뢰 정책에는 `NotPrincipal` 요소를 사용할 수 없습니다.
+ 권한 경계 정책이 연결된 IAM 사용자 또는 역할에는 `Deny` 효과를 포함하는 `NotPrincipal` 정책 요소가 있는 리소스 기반 정책 문을 사용하지 않도록 합니다. `Deny` 효과를 포함하는 `NotPrincipal` 요소는 `NotPrincipal` 요소에 지정된 값에 관계없이 권한 경계 정책이 연결된 IAM 보안 주체를 항상 거부합니다. 이로 인해 원래 리소스에 액세스할 수 있는 일부 IAM 사용자 또는 역할이 해당 리소스에 더 이상 액세스할 수 없습니다. `NotPrincipal` 요소 대신 액세스를 제한하기 위해 [`ArnNotEquals`](reference_policies_elements_condition_operators.md#Conditions_ARN) 조건 연산자를 [`aws:PrincipalArn`](reference_policies_condition-keys.md#condition-keys-principalarn) 컨텍스트 키와 함께 사용하도록 리소스 기반 정책 문을 변경하는 것이 좋습니다. 권한 경계에 대한 자세한 내용은 [IAM 엔터티의 권한 범위](access_policies_boundaries.md) 섹션을 참조하세요.
+ `NotPrincipal`을 사용할 때 거부되지 않은 위탁자의 계정 ARN도 지정해야 합니다. 지정하지 않으면 정책에서 해당 보안 주체를 포함하는 전체 계정에 대한 액세스가 거부될 수 있습니다. 정책에 포함하는 서비스에 따라 AWS에서 먼저 계정을 검증한 후 사용자를 검증할 수 있습니다. 위임된 역할 사용자(역할을 사용하는 사람)를 평가할 때 AWS는 먼저 계정을 검증한 후 위임된 역할 사용자를 평가합니다. 위임된 역할 사용자는 그 역할을 위임 받을 때 지정된 역할 세션 이름으로 식별할 수 있습니다. 따라서 사용자 계정의 ARN을 명시적으로 포함시키거나, 역할의 ARN과 해당 역할을 포함하는 계정의 ARN을 모두 포함시킬 것을 권장합니다.
+ `NotPrincipal` 요소는 서비스 제어 정책(SCP)과 리소스 제어 정책(RCP)에서 지원되지 않습니다.

## `NotPrincipal` 요소의 대안
<a name="notprincipal-alternatives"></a>

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

## IAM 역할을 사용하는 예제 시나리오
<a name="notprincipal-alternative-role"></a>

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

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

------
#### [ JSON ]

****  

```
{
  "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}}"
        }
      }
    }
  ]
}
```

------

## 서비스 위탁자를 사용하는 예제 시나리오
<a name="notprincipal-alternative-service-principal"></a>

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

`NotPrincipal`을 사용하는 대신 전역 조건 컨텍스트 키가 있는 거부 문과 [`StringNotEquals`](reference_policies_elements_condition_operators.md#Conditions_String)와 같은 조건 연산자를 사용하여 리소스에 대한 서비스 위탁자 액세스를 명시적으로 허용하는 것이 좋습니다. 다음 예제에서는 `aws:PrincipalServiceName`을 사용하여 AWS CodeBuild 서비스 위탁자가 `BUCKETNAME` 폴더의 Amazon S3 버킷에 액세스할 수 있도록 명시적으로 허용합니다.

------
#### [ JSON ]

****  

```
{
  "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}}"
        }
      }
    }
  ]
}
```

------