> ## 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 do KMS

> O serviço KMS verifica cada ação do IAM, qual chamada precisa dela e como conceder o vedamento sem conceder a abertura.

Cada endpoint KMS 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

Toda operação em uma chave específica é autorizada contra **CRN dessa chave**, com as tags da chave disponíveis como contexto de condição. Apenas as duas operações de nível de coleção não são.

| Ação e aventura | Chamada de telefone | Âmbito de aplicação |
| - | - | - |
| `kms:ListKeys` | `GET /v1/keys` | coleção |
| `kms:CreateKey` | `POST /v1/keys` | coleção |
| `kms:GetKey` | `GET /v1/keys/{key_id}` | chave CRN |
| `kms:UpdateKey` | `PATCH /v1/keys/{key_id}` | chave CRN |
| `kms:EnableKey` | `POST /v1/keys/{key_id}/enable` | chave CRN |
| `kms:DisableKey` | `POST /v1/keys/{key_id}/disable` | chave CRN |
| `kms:ScheduleKeyDeletion` | `POST /v1/keys/{key_id}/schedule-deletion` | chave CRN |
| `kms:CancelKeyDeletion` | `POST /v1/keys/{key_id}/cancel-deletion` | chave CRN |
| `kms:Encrypt` | `POST /v1/keys/{key_id}/encrypt` | chave CRN |
| `kms:Decrypt` | `POST /v1/keys/{key_id}/decrypt` | chave CRN |
| `kms:GenerateDataKey` | `POST /v1/keys/{key_id}/generate-data-key` | chave CRN |
| `kms:Sign` | `POST /v1/keys/{key_id}/sign` | chave CRN |
| `kms:Verify` | `POST /v1/keys/{key_id}/verify` | chave CRN |

<a id="sealing-and-opening-are-different-grants" />

### Selagem e abertura são concessões diferentes

`kms:Decrypt` e `kms:GenerateDataKey` são ações separadas de `kms:GetKey` precisamente para que as operações que retornam material de chave utilizável possam ser concedidas de forma restrita. Um componente que só precisa *selar* dados deve conter `kms:Encrypt` e `kms:GenerateDataKey` e nada mais — ele pode então escrever, e nunca ler de volta.

A mesma divisão aparece em [certificates](/pt/certificates/permissions), onde `certificate:GetCertificateMaterial` é separado da leitura de um certificado.

<Note>
  `kms:GenerateDataKey` retorna a nova chave de dados **em texto simples, bem como envolto**, porque o chamador tem que usá-lo antes de jogá-lo fora. Trate-o como equivalente a `kms:Decrypt` no raio de explosão quando você decidir quem o segura, mesmo que os dois guardem direções diferentes.
</Note>

<a id="listing-cannot-be-narrowed" />

### A listagem não pode ser restringida

`kms:ListKeys` é autorizado contra a coleção, não contra chaves individuais, então restringi-lo por CRN ou tag não tem efeito. Escopo das operações que *usam* uma chave; listagem diz a um chamador que uma chave existe e nada mais.

<a id="resources" />

## Recursos

As ações KMS são verificadas em relação a uma forma de recurso:

```
crn:kms:<region>:<account>:key/<name>
```

O slot de região é **populado**, ao contrário do DNS ou dos certificados. Uma chave existe em uma região e só pode ser usada a partir daí, portanto, uma política escrita para uma região não alcança as chaves de outra região, mesmo quando os nomes correspondem.

<a id="conditions" />

## Condições

Create carrega as tags da solicitação; cada ação com escopo de tecla carrega as tags já na tecla. Assim, uma política pode definir tanto o que um chamador pode rotular uma tecla **como**, quanto quais teclas existentes ele pode tocar:

* `basalt:RequestTag/<key>` — em `kms:CreateKey`.
* `basalt:ResourceTag/<key>` — em cada ação com escopo para um CRN de chave.

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

## Escrever uma política

Um caminho de gravação que pode selar, mas nunca abrir:

```json theme={null}
{
  "version": "2024-01-01",
  "statements": [
    {
      "sid": "IngestSealsOnly",
      "effect": "allow",
      "actions": ["kms:GenerateDataKey", "kms:Encrypt"],
      "resources": ["crn:kms:sa-saopaulo-1:my-account:key/prod-*"]
    }
  ]
}
```

Cercar uma frota por rótulo em vez de por nome:

```json theme={null}
{
  "version": "2024-01-01",
  "statements": [
    {
      "sid": "StagingKeysOnly",
      "effect": "allow",
      "actions": ["kms:Encrypt", "kms:Decrypt", "kms:GenerateDataKey"],
      "resources": ["*"],
      "conditions": [
        {
          "operator": "equals",
          "key": "basalt:ResourceTag/env",
          "values": ["staging"]
        }
      ]
    }
  ]
}
```

<Warning>
  **`kms:*` inclui descriptografia e exclusão.** Um curinga concede `kms:Decrypt`, `kms:GenerateDataKey` e `kms:ScheduleKeyDeletion` junto com tudo o mais. Liste as ações quando a credencial pertencer a uma carga de trabalho; um serviço que sela dados não tem motivo para agendar a destruição da chave.
</Warning>

Veja [writing policies](/pt/iam/policies) para o formato completo do documento e cada operador de condição.

<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. Procure a chamada que você fez na tabela acima, e a ação que ela precisa é a que você adiciona.

<Note>
  Um `404` não é um `403` disfarçado. A propriedade é resolvida antes da autorização: uma chave pertencente a outra conta responde `KMS_KEY_NOT_FOUND` porque não é sua para ver, e uma que você possui, mas não tem a ação para respostas `403`. Se você estiver recebendo `404` em uma chave que você acredita que possui, verifique a região e a conta à qual 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.