> ## Documentation Index
> Fetch the complete documentation index at: https://docs.basaltic.sh/llms.txt
> Use this file to discover all available pages before exploring further.

# Permissões de DNS

> Cada ação do IAM que o serviço DNS verifica, qual chamada precisa dela e os recursos aos quais uma política pode escopo-la.

Cada endpoint DNS verifica uma ação do IAM antes de fazer qualquer coisa. Esta é a lista completa — não há outros, e nenhum endpoint ignora a verificação.

<Info>
  A referência da API mostra a ação na própria página de cada ponto de extremidade, para que você não precise voltar aqui para procurar uma. Ambos vêm do mesmo lugar: a chamada de autorização no serviço, lida no momento da compilação.
</Info>

<a id="the-actions" />

## As ações

Dois deles não são adivinháveis a partir do ponto final, e são a razão pela qual esta tabela existe em vez de uma regra de nomenclatura:

* **Exportar um arquivo de zona** precisa de `dns:ListRecords`, não de uma ação de exportação própria. A exportação é uma leitura de todos os registros na zona, então é fechada como uma.
* **A leitura do resultado da importação de registros** precisa de `dns:GetZone`. Descreve algo que aconteceu com a zona, não um registro. **Descartando** ele precisa de `dns:UpdateZone` — ele muda o que a zona registra sobre si mesma, e não há nenhuma ação separada para um pedaço de metadados da zona.

| Ação e aventura | Chamada de telefone |
| - | - |
| `dns:ListZones` | `GET /v1/zones` |
| `dns:CreateZone` | `POST /v1/zones` |
| `dns:GetZone` | `GET /v1/zones/{zone_id}` |
| `dns:GetZone` | `GET /v1/zones/{zone_id}/record-import` |
| `dns:UpdateZone` | `PATCH /v1/zones/{zone_id}` |
| `dns:UpdateZone` | `DELETE /v1/zones/{zone_id}/record-import` |
| `dns:DeleteZone` | `DELETE /v1/zones/{zone_id}` |
| `dns:VerifyZoneOwnership` | `POST /v1/zones/{zone_id}/verify-ownership` |
| `dns:ImportZoneFile` | `POST /v1/zones/{zone_id}/import` |
| `dns:ListRecords` | `GET /v1/zones/{zone_id}/records` |
| `dns:ListRecords` | `GET /v1/zones/{zone_id}/export` |
| `dns:CreateRecord` | `POST /v1/zones/{zone_id}/records` |
| `dns:GetRecord` | `GET /v1/zones/{zone_id}/records/{record_id}` |
| `dns:UpdateRecord` | `PATCH /v1/zones/{zone_id}/records/{record_id}` |
| `dns:DeleteRecord` | `DELETE /v1/zones/{zone_id}/records/{record_id}` |
| `dns:ListVPCAssociations` | `GET /v1/zones/{zone_id}/vpc-associations` |
| `dns:AssociateVPC` | `POST /v1/zones/{zone_id}/vpc-associations` |
| `dns:DissociateVPC` | `DELETE /v1/zones/{zone_id}/vpc-associations/{vpc_id}` |

<a id="resources" />

## Recursos

As ações de DNS são verificadas em relação a uma das duas formas de recurso:

```
crn:dns::<account>:zone/<zone-name>
crn:dns::<account>:zone/<zone-name>/record/<record-id>
```

O slot de região está vazio porque o DNS é global — há um ponto de extremidade e um conjunto de zonas, não um por região.

Um registro é identificado pelo seu **UUID**, não pelo seu nome e tipo. Os nomes de registros legitimamente contêm `*`, que é um curinga em um CRN também, então uma política escrita contra `record/*.example.com` corresponderia muito mais do que o nome que parece.

<a id="writing-a-policy" />

## Escrever uma política

Somente leitura em todas as zonas da conta:

```json theme={null}
{
  "version": "2024-01-01",
  "statements": [
    {
      "sid": "ReadDNS",
      "effect": "allow",
      "actions": [
        "dns:ListZones",
        "dns:GetZone",
        "dns:ListRecords",
        "dns:GetRecord"
      ],
      "resources": ["crn:dns::my-account:zone/*"]
    }
  ]
}
```

Controle total de uma zona e nada mais:

```json theme={null}
{
  "version": "2024-01-01",
  "statements": [
    {
      "sid": "OwnOneZone",
      "effect": "allow",
      "actions": ["dns:*"],
      "resources": [
        "crn:dns::my-account:zone/example.com",
        "crn:dns::my-account:zone/example.com/record/*"
      ]
    }
  ]
}
```

<Warning>
  **Ambas as linhas de recursos são necessárias.** `zone/example.com` não cobre os registros abaixo dele — o CRN de um registro é um caminho mais longo, e uma correspondência de curinga pára no recurso que ele nomeia. Uma política com apenas a primeira linha permite que alguém leia e exclua a zona, mas não toque em um único registro nela.
</Warning>

`dns:ListZones` é verificado contra a conta em vez de uma zona nomeada, então não pode ser escopo para uma zona. Conceder isso concede a capacidade de ver que cada zona na conta existe, embora não para ler o que está nelas.

<a id="what-a-denial-looks-like" />

## Como é uma negação

Uma verificação falhada responde `403`:

```json theme={null}
{
  "error": {
    "code": "ACCESS_DENIED",
    "message": "You don't have permission to perform this action",
    "request_id": "..."
  }
}
```

**Ele não diz qual ação estava faltando**, deliberadamente — a mensagem é a mesma para cada negação, então não pode ser usada para mapear o que uma credencial pode ou não alcançar. É por isso que a tabela acima existe: procure a chamada que você fez, e a ação que ela precisa é a que você adiciona.

<Note>
  Um `404` não é um `403` disfarçado. Propriedade e autorização são verificações separadas: uma zona pertencente a outra conta responde `404` porque não é sua para ver, e uma que você possui, mas não tem a ação para respostas `403`. Se você está recebendo `404` em uma zona que você acredita que possui, verifique a conta a que a credencial pertence antes de verificar a política.
</Note>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.