

# Elementos da política JSON da AWS: NotPrincipal
<a name="reference_policies_elements_notprincipal"></a>

O elemento `NotPrincipal` usa `"Effect":"Deny"` para negar acesso a todas as entidades principais, ***exceto*** a entidade principal especificada no elemento `NotPrincipal`. Uma entidade principal pode ser um usuário do IAM, uma entidade principal de usuário federado do AWS STS, um perfil do IAM, uma sessão de perfil assumido, uma Conta da AWS, um serviço da AWS ou outro tipo de entidade principal. Para obter mais informações, sobre entidades principais, consulte [Elementos da política JSON da AWS: Principal](reference_policies_elements_principal.md).

`NotPrincipal` deve ser usado com `"Effect":"Deny"`. O uso de `"Effect":"Allow"` não é compatível. 

**Importante**  
Não recomendamos o uso de `NotPrincipal` para novas políticas baseadas em recursos como parte de sua estratégia de segurança e autorização. Quando você usa `NotPrincipal`, pode ser difícil solucionar os problemas causados por vários tipos de política. Em vez disso, recomendamos usar a chave de contexto `aws:PrincipalArn` com operadores de condição de ARN.

## Principais pontos
<a name="notprincipal-key-points"></a>
+ O elemento `NotPrincipal` é aceito em políticas baseadas em recursos para alguns serviços da AWS, incluindo endpoints da VPC. As políticas baseadas em recursos são políticas que você incorpora diretamente em um recurso. Não é possível usar o elemento `NotPrincipal` em uma política baseada em identidade do IAM ou em uma política de perfil do IAM de confiança.
+ Não use declarações de política baseadas em recursos que incluam um elemento de política `NotPrincipal` com um efeito `Deny` para usuários ou perfis do IAM que tenham uma política de limite de permissões anexada. O elemento `NotPrincipal` com um efeito `Deny` sempre negará qualquer entidade principal do IAM que tenha uma política de limite de permissões anexada, independentemente dos valores especificados no elemento `NotPrincipal`. Isso faz com que alguns usuários ou perfis do IAM que, de outra forma, teriam acesso ao recurso, percam o acesso. Recomendamos alterar suas declarações de política baseadas em recursos para usar o operador de condição [`ArnNotEquals`](reference_policies_elements_condition_operators.md#Conditions_ARN) com a chave de contexto [`aws:PrincipalArn`](reference_policies_condition-keys.md#condition-keys-principalarn) para limitar o acesso, em vez do elemento `NotPrincipal`. Para obter mais informações sobre esses limites de permissões, consulte [Limites de permissões para entidades do IAM](access_policies_boundaries.md).
+ Ao usar `NotPrincipal`, você também deve especificar o ARN da entidade principal não negada. Caso contrário, a política pode negar o acesso à conta por completo contendo o principal. Dependendo do serviço que você incluir em sua política, a AWS pode validar primeiro a conta e, em seguida, o usuário. Se um usuário de função assumida (alguém que esteja usando uma função) está sendo avaliado, AWS pode validar primeiro a conta, em seguida, a função e, por fim, o usuário de função assumida. O usuário de função assumida é identificado pelo nome de sessão da função, especificado quando ele assumiu a função. Portanto, é recomendável incluir explicitamente o ARN para uma conta de usuário, ou incluir o ARN para a função e o ARN para a conta que contém essa função.
+ O elemento `NotPrincipal` não é compatível com políticas de controle de serviços (SCP) e políticas de controle de recursos (RCP).

## Alternativas ao elemento `NotPrincipal`
<a name="notprincipal-alternatives"></a>

Ao gerenciar o controle de acesso em AWS, pode haver cenários em que talvez seja necessário negar explicitamente o acesso de todas as entidades principais a um recurso, exceto uma ou mais entidades principais que você especificar. A AWS recomenda o uso de uma instrução Deny com chaves de contexto de condição global para um controle mais preciso e uma solução de problemas mais fácil. Os exemplos a seguir mostram abordagens alternativas usando operadores de condição, como `StringNotEquals` ou `ArnNotEquals`, para negar acesso a todas as entidades principais, exceto aquelas especificadas no elemento Condition.

## Exemplo de cenário usando um perfil do IAM
<a name="notprincipal-alternative-role"></a>

É possível usar uma política baseada em recursos com uma instrução Deny para impedir que todos os perfis do IAM, exceto aqueles especificados no elemento Condition, acessem ou manipulem seus recursos. Essa abordagem segue o princípio de segurança da AWS em que uma negação explícita sempre tem precedência sobre qualquer declaração de permissão e ajuda a manter o princípio de privilégio mínimo em sua infraestrutura da AWS.

Em vez de usar `NotPrincipal`, recomendamos usar uma instrução Deny com chaves de contexto de condição globais e o operador de condição como [`ArnNotEquals`](reference_policies_elements_condition_operators.md#Conditions_ARN) para permitir explicitamente que um perfil do IAM acesse seus recursos. O exemplo a seguir usa [aws:PrincipalArn](reference_policies_condition-keys.md#condition-keys-principalarn) para permitir explicitamente que o perfil `read-only-role` acesse buckets do Amazon S3 na pasta `Bucket_Account_Audit`.

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

------

## Exemplo de cenário usando uma entidade principal de serviço
<a name="notprincipal-alternative-service-principal"></a>

É possível usar uma instrução Deny para impedir que todas as entidades principais de serviço, exceto aquelas especificados no elemento `Condition`, acessem ou manipulem seus recursos. Essa abordagem é particularmente útil quando você precisa implementar controles de acesso refinados ou estabelecer limites de segurança entre diferentes serviços e aplicações em seu ambiente da AWS.

Em vez de usar `NotPrincipal`, recomendamos usar uma instrução Deny com chaves de contexto de condição globais e o operador de condição [`StringNotEquals`](reference_policies_elements_condition_operators.md#Conditions_String) para permitir explicitamente que uma entidade principal de serviço acesse seus recursos. O exemplo a seguir usa `aws:PrincipalServiceName` para permitir explicitamente que a entidade principal de serviço AWS CodeBuild acesse buckets do Amazon S3 na pasta `BUCKETNAME`.

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

------