AWS IAM - Policy
Tags: aws, security, devops, cloud
Published: 2023-05-19 14:31:03

**Anotações sobre o AWS IAM Policy para ajudar na preparação das certificações AWS.**

Até o momento as anotações são para as certificações abaixo:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/se0sqtegn424nami6rz8.png)

- [Link oficial](https://docs.aws.amazon.com/pt_br/IAM/latest/UserGuide/access_policies.html)


---
##**Elementos IAM Policy**

- Statement
- Effect
- Action
- Resource

---

##**Condition**
[Documentação oficial](https://docs.aws.amazon.com/pt_br/IAM/latest/UserGuide/reference_policies_elements_condition.html)

_O elemento `Condition `(ou bloco `Condition`) permite que você especifique as condições sob as quais uma política está em vigor._

**Exemplo**

```
{
    "Version": "2012-10-17",
    "Statement": {
        "Effect": "Allow",
        "Action": "*",
        "Resource": "*",
**        "Condition": {
            "IpAddress": {
                "aws:SourceIp": "115.99.177.174/32"**
            }
        }
    }
}
```

---

##**Principal e Not Principal**

- [Documentação oficial - Not Principal](https://docs.aws.amazon.com/pt_br/IAM/latest/UserGuide/reference_policies_elements_notprincipal.html)
- [Documentação oficial - Principal](https://docs.aws.amazon.com/pt_br/IAM/latest/UserGuide/reference_policies_elements_principal.html)

**Principal**
_Use o elemento `Principal `em uma policy JSON baseada em recursos para especificar a entidade principal cujo acesso a um recurso é permitido ou negado._

**Pode ser utilizando em:**
- AWS account and root user
- IAM roles
- Role sessions
- IAM users
- Federated user sessions
- AWS services name (_"datapipeline.amazonaws.com"_)
- All principals

**Exemplo**

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "SamplePolicy",
            "Effect": "Allow",
            **"Principal": {
                "AWS": "arn:aws:iam::888913816489:user/Alice"**
            },
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::the-demo-s3-bucket",
                "arn:aws:s3:::the-demo-s3-bucket/*"
            ]
        }
    ]
}
```

**NotPrincipal**

_É altamente recomendável que você não use `NotPrincipal` na mesma declaração de política que `"Effect": "Allow"`. 
Quando você usa `NotPrincipal` na mesma declaração de policy que `"Effect": "Deny"`, **as ações especificadas na declaração de policy são explicitamente negadas para todos os Principal exceto aqueles especificados.**_

- **NotPrincipal **- Para Effect=Deny
- Tem que atachar a policy no usuário

**Exemplo**

```
{
    "Version": "2012-10-17",
    "Statement": [{
        "Effect": "Deny",
      **  "NotPrincipal": {"AWS": [
            "arn:aws:iam::888913816489:user/Alice"**
        ]},
        "Action": "s3:*",
        "Resource": [
            "arn:aws:s3:::BUCKETNAME",
            "arn:aws:s3:::BUCKETNAME/*"
        ]
    }]
}
```

---
##**Policy Variables**
[Documentação oficial](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_variables.html)

_Use as Policy Variables do AWS IAM como espaços reservados quando você não souber o valor exato de um recurso ou chave de condição ao escrever a Policy._

- `aws:CurrentTime` Isso pode ser usado para condições que verificam a data e a hora.
- `aws:EpochTime` Essa é a data em hora epoch ou Unix a ser usada com as condições de data/hora.
- `aws:TokenIssueTime` Essa é a data e a hora em que as credenciais de segurança temporárias foram emitidas e podem ser usadas com condições de data/hora. Observação: essa chave só está disponível em solicitações assinadas com credenciais de segurança temporárias. Para obter mais informações sobre credenciais de segurança temporárias, consulte Credenciais de segurança temporárias no IAM.
- `aws:PrincipalType` Esse valor indica se a entidade principal é uma conta, um usuário federado ou função assumida – consulte a explicação fornecida mais adiante.
- `aws:SecureTransport` Esse é um valor Booliano que representa o fato de a solicitação ter sido ou não enviada usando SSL.
- `aws:SourceIp` Esse é o endereço IP do solicitante, para uso com condições de endereço IP. Consulte Operadores de condição de endereço IP para obter informações sobre quando SourceIp é válido e quando você deve usar uma chave específica da VPC.
- `aws:UserAgent` Esse valor é uma string que contém informações sobre o aplicativo cliente do solicitante. Essa string é gerada pelo cliente e pode não ser confiável. Você só pode usar essa chave de contexto na AWS CLI.
- `aws:userid` Esse valor é o ID exclusivo para o usuário atual – consulte o gráfico a seguir.
- `aws:username` Essa é uma string que contém o nome amigável do usuário atual – consulte o gráfico a seguir.
- `ec2:SourceInstanceARN:` este é o nome do recurso da Amazon (ARN) da instância do Amazon EC2 da qual a solicitação é feita. Essa chave está presente somente quando a solicitação vem de uma instância do Amazon EC2 usando uma função do IAM associada a um perfil de instância do EC2.

**Exemplo**

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "iam:*AccessKey*"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:iam::888913816489:user/$**{aws:username}**"
            ]
        }
    ]
}
```

---
##**Policy Version Element**
[Documentação oficial](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_version.html)

_O `Version `elemento policy especifica as regras de sintaxe do idioma que devem ser usadas para processar uma política. Para usar todos os recursos de policy disponíveis, inclua o `Version `elemento a seguir fora do `Statement `elemento em todas as suas políticas._

Esse `Version` elemento de Policy JSON é diferente de uma versão de Policy. 

**"Version": "2012–10–17" - Recomendado**

- Atual
- Certas opções são suportadas somente nessa versão

**"Version": "2008–10–17"**

- Se não estiver declarado, essa será utilizada como padrão

---

##**Tipos de policies**
**AWS Managed Policies**

- Políticas gerenciadas que são criadas e gerenciadas pela AWS.
- Você pode alterar

**Customer Managed Policies**

- Políticas gerenciadas que você criar e gerenciar em sua conta da AWS.
- As políticas gerenciadas pelo cliente oferecem um controle mais preciso de suas políticas do que as políticas gerenciadas pela AWS.

**Inline Policies**

- Políticas adicionadas diretamente a um único usuário, grupo ou função.
- As Inline Policies mantêm um relacionamento restrito de um para um entre uma política e uma identidade.
- Elas são excluídas quando você exclui a identidade.

---
##**Estrutura de uma Policy**

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zjo9nmafao2kmnhui89m.png)

---
##**Simple Policy**

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/papegoaswonw7dijsgj4.png)

---
##**IAM permissions boundaries**

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jgsa5i829sbjo3ihv4a4.png)

Você pode usar permissions boundaries para delegar tarefas de gerenciamento de permissões, como criação de usuários, para usuários do IAM em sua conta. Isso permite que outras pessoas executem tarefas em seu nome dentro de um limite específico de permissõe

- Veem desativado por padrão
- Por mais que o User tenha outro tipo de permissão, uma vez o Boundary habilitado a Policy dele ira sobrepor
- Sobrepõe a IAM Policy

**Referências**

- [When and where to use IAM permissions boundaries](https://aws.amazon.com/pt/blogs/security/when-and-where-to-use-iam-permissions-boundaries/)
- [Limites de permissões para entidades do IAM](https://docs.aws.amazon.com/pt_br/IAM/latest/UserGuide/access_policies_boundaries.html)

---
##**Permitir que os usuários do IAM acessem a página de relatórios do console**
[Documentação oficial](https://docs.aws.amazon.com/pt_br/awsaccountbilling/latest/aboutv2/billing-example-policies.html#example-billing-view-reports)

- Acesso ao Report AWS Usage
- Permissões --> `"aws-portal:ViewUsage"`,`"aws-portal:ViewBilling"`

**Exemplo**

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "aws-portal:ViewUsage",
                "aws-portal:ViewBilling",
                "cur:DescribeReportDefinitions",
                "cur:PutReportDefinition",
                "cur:DeleteReportDefinition",
                "cur:ModifyReportDefinition"
            ],
            "Resource": "*"
        }
    ]
}
```