> For the complete documentation index, see [llms.txt](https://wiki.datadike.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://wiki.datadike.com/product-guide/configuracoes/pam/a2a.md).

# A2A — Acesso a Credenciais por Aplicação

Este guia mostra como permitir que **ferramentas e sistemas** (em vez de pessoas) buscem credenciais no cofre do DataDike PAM de forma segura e auditada — sem nunca armazenar a senha fora do cofre.

Casos de uso típicos:

* **Scanners de vulnerabilidade** (Tenable, Qualys) que precisam de credencial privilegiada para o *authenticated scan*.
* **Automação / CI / DevOps** (pipelines, scripts) que precisam de uma senha na hora de executar.
* **Workloads em contêiner** (Kubernetes, OpenShift, Rancher) que consomem segredos sem tê-los embutidos na imagem.

> A funcionalidade fica no menu **A2A** do console: **Aplicações** e **Kubernetes**.

***

## 1. Conceitos

| Conceito               | O que é                                                                                                       |
| ---------------------- | ------------------------------------------------------------------------------------------------------------- |
| **Aplicação**          | A identidade da ferramenta/sistema (um "AppID"). Tem um **token** e regras de acesso.                         |
| **Token**              | A chave secreta da aplicação. É exibido **uma única vez** ao criar/rotacionar — copie e guarde com segurança. |
| **Escopo**             | Quais contas a aplicação pode buscar: *todas* ou uma lista de **ativos** específicos.                         |
| **IPs de origem**      | Lista de IPs/redes (CIDR) de onde a aplicação pode chamar a API. De outros IPs, é recusada.                   |
| **Cluster Kubernetes** | (Para contêineres) um cluster cadastrado que autentica seus pods.                                             |
| **Role (Kubernetes)**  | Liga `namespace` + `serviceaccount` de um cluster a uma Aplicação.                                            |

**Pré-requisito:** o acesso ao PAM deve estar em **HTTPS** (o token trafega no cabeçalho da requisição). Use `https://<endereço-do-seu-pam>` em tudo abaixo.

Ao longo do guia, troque `<PAM>` pelo endereço do seu PAM (ex.: `https://pam.suaempresa.com.br`).

***

## 2. Criar uma Aplicação (token)

1. Console → **A2A → Aplicações** → botão **Nova aplicação**.
2. Preencha:
   * **Nome**: identifique o consumidor (ex.: `tenable-scanner-prod`).
   * **Escopo**:
     * Ligue **Todas as contas** para acesso amplo, **ou**
     * Deixe desligado e liste em **Ativos permitidos** os nomes ou endereços dos ativos que essa aplicação pode acessar (recomendado).
   * **IPs de origem permitidos** (recomendado): informe o(s) IP(s) da ferramenta (ex.: `10.20.0.15/32`). Vazio = qualquer IP.
   * **Expira em** (opcional): data de validade.
3. **Confirmar.** Um modal mostra o **token uma única vez**. Clique em **Copiar** e guarde-o no lugar seguro da ferramenta que vai consumi-lo.

> Perdeu o token? Não dá para vê-lo de novo. Use a ação **Regerar token** na aplicação (isso invalida o token anterior).

Na aba **Conexão** da aplicação você encontra, prontas para copiar, as URLs e o cabeçalho a usar.

***

## 3. Usar o token (genérico)

Há duas APIs equivalentes. Use a que sua ferramenta suportar.

### 3.1 API compatível com HashiCorp Vault (KV v2) — recomendada p/ Tenable/Qualys

```
GET <PAM>/api/v1/appsecrets/vault/v1/datadike/data/<ativo>/<usuario>
Cabeçalho:  X-Vault-Token: <TOKEN>
```

Resposta:

```json
{ "data": { "data": { "username": "...", "password": "..." } } }
```

Exemplo:

```bash
curl -s -H "X-Vault-Token: $TOKEN" \
  "<PAM>/api/v1/appsecrets/vault/v1/datadike/data/srv-db-01/oracle_scan"
```

* `datadike` é o "mount" (pode usar esse valor).
* `<ativo>` é o **nome** ou o **endereço/IP** do ativo cadastrado no PAM.
* `<usuario>` é o nome da conta naquele ativo.

### 3.2 API nativa — simples para scripts

```
POST <PAM>/api/v1/appsecrets/fetch/
Cabeçalho:  X-App-Token: <TOKEN>
Corpo (JSON): { "asset": "<ativo>", "username": "<usuario>" }
```

```bash
curl -s -X POST -H "X-App-Token: $TOKEN" -H "Content-Type: application/json" \
  -d '{"asset":"srv-db-01","username":"oracle_scan"}' \
  "<PAM>/api/v1/appsecrets/fetch/"
# -> {"username":"oracle_scan","secret":"..."}
```

### 3.3 Códigos de resposta

| Código    | Significado                                                       |
| --------- | ----------------------------------------------------------------- |
| 200       | OK, credencial retornada                                          |
| 401 / 403 | Token inválido/inativo, IP não permitido, ou ativo fora do escopo |
| 404       | Ativo ou conta não encontrados no PAM                             |

***

## 4. Configurar no Tenable

Tenable (Nessus / Vulnerability Management) → **Credentials** → escolha o tipo (SSH, Windows, etc.) → em **Authentication method** selecione **HashiCorp Vault**:

| Campo                 | Valor                           |
| --------------------- | ------------------------------- |
| Vault host / URL      | `<PAM>/api/v1/appsecrets/vault` |
| Port                  | `443`                           |
| Authentication type   | Token                           |
| Token                 | *(o token da sua Aplicação)*    |
| KV version            | v2                              |
| Secret engine mount   | `datadike`                      |
| Path / Secret name    | `<ativo>/<usuario>`             |
| Username key / source | `username`                      |
| Password key / source | `password`                      |

> A versão do Tenable monta a chamada `…/v1/<mount>/data/<path>` automaticamente. Se o campo de URL pedir incluir ou não o `/v1`, lembre que a base do PAM termina em `/appsecrets/vault` e o conector acrescenta `/v1/...`.

Faça um **teste de credencial** no Tenable para validar antes de agendar o scan.

***

## 5. Configurar no Qualys

Qualys VMDR → **Authentication Vaults** → **New → HashiCorp Vault**:

| Campo          | Valor                           |
| -------------- | ------------------------------- |
| Vault URL      | `<PAM>/api/v1/appsecrets/vault` |
| Authentication | Token                           |
| Token          | *(o token da sua Aplicação)*    |
| Secret Engine  | KV v2                           |
| Mount point    | `datadike`                      |

Depois, no **Authentication Record** (Unix/Windows), aponte o segredo para o caminho `<ativo>/<usuario>` e mapeie as chaves `username` / `password`.

***

## 6. Kubernetes / OpenShift / Rancher

Aqui os **pods** se autenticam pela própria identidade (ServiceAccount), sem token fixo embutido na imagem. O PAM se comporta como um HashiCorp Vault, então as ferramentas oficiais (Vault Agent Injector e Secrets Store CSI Driver) funcionam.

### Passo 1 — Cadastrar o cluster no PAM

Console → **A2A → Kubernetes** → **Novo cluster**. Escolha o modo:

* **TokenReview (online):** o PAM consulta o cluster para validar o pod. Informe:
  * **Kubernetes host** (API server, ex.: `https://10.0.0.1:6443`)
  * **CA do cluster (PEM)**
  * **Token reviewer JWT**: o token de um ServiceAccount com a permissão `system:auth-delegator`.
* **JWKS (offline):** o PAM valida a assinatura do token sem falar com o cluster. Informe:
  * **Issuer** (OIDC do cluster)
  * **JWKS JSON**: a saída de `kubectl get --raw /openid/v1/jwks`

### Passo 2 — Criar um Role

Selecione o cluster na lista → painel da direita → aba **Roles** → **Adicionar role**:

* **Nome** (ex.: `scanner`) — é o `role` usado no login.
* **Aplicação**: a Aplicação (do item 2) cujo escopo/credenciais o pod poderá usar.
* **Namespaces permitidos** e **ServiceAccounts permitidos** (use `*` para liberar todos — não recomendado em produção).
* **TTL do token**: validade do token temporário emitido a cada login (ex.: 900s).

### Passo 3a — Vault Agent Injector (injeta o segredo no pod)

Instale o injetor oficial apontando o endereço do "Vault" para o PAM (`<PAM>/api/v1/appsecrets/vault`) e anote o seu deployment:

```yaml
metadata:
  annotations:
    vault.hashicorp.com/agent-inject: "true"
    vault.hashicorp.com/role: "scanner"
    vault.hashicorp.com/agent-inject-secret-db: "datadike/data/srv-db-01/oracle_scan"
```

O segredo aparece em `/vault/secrets/db` dentro do pod.

### Passo 3b — Secrets Store CSI Driver (segredo como arquivo em volume)

Crie um `SecretProviderClass` (provider `vault`) com `vaultAddress: <PAM>/api/v1/appsecrets/vault`, `roleName: scanner` e os objetos apontando para `datadike/data/<ativo>/<usuario>`.

> Manifests de exemplo prontos: pasta `k8s-secrets/` do pacote de implantação (`example-deployment-agent.yaml`, `secretproviderclass-csi.yaml`, `vault-agent-injector-values.yaml`).

**OpenShift e Rancher** usam exatamente o mesmo procedimento (são Kubernetes).

***

## 7. Docker / scripts / pipelines de CI

Use o helper portátil (`k8s-secrets/datadike-fetch.sh`) ou um `curl` direto:

```bash
export DATADIKE_ADDR="<PAM>"
export DATADIKE_TOKEN="<TOKEN>"
DB_PASS=$(./datadike-fetch.sh srv-db-01 oracle_scan)     # busca a senha
```

Passe o token como **variável de ambiente/segredo** do seu CI, nunca commitado.

***

## 8. Rotação e revogação

* **Rotacionar token** (Aplicação): ação **Regerar token** → gera um novo e **invalida o anterior na hora**. Atualize a ferramenta com o novo token.
* **Revogar acesso**: **Desativar** a Aplicação (ou definir **Expira em**) corta o acesso imediatamente. Reative quando quiser.
* **Trocar a senha real** do ativo: use a função de troca de senha do PAM; na próxima busca, a aplicação já recebe a senha nova (sempre lê o valor vigente no cofre).
* **Kubernetes**: os tokens dos pods são temporários (expiram pelo TTL do role). Desativar o role ou a Aplicação corta o acesso.

***

## 9. Auditoria

Toda recuperação de credencial é registrada no **log de operações** do PAM (qual aplicação, qual conta, IP de origem e horário). Acesse em **Auditoria → Logs de operação**. Na página da Aplicação, a aba **Auditoria** leva direto ao log.

***

## 10. Solução de problemas

| Sintoma                             | Provável causa                                                                   | O que fazer                                                                                   |
| ----------------------------------- | -------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- |
| `401` / `403` ao buscar             | Token errado/expirado, IP não permitido, ou ativo fora do escopo                 | Confira o token; verifique **IPs de origem** e **Escopo** na Aplicação                        |
| `404`                               | Nome/endereço do ativo ou usuário não batem com o cadastro                       | Use exatamente o **nome** ou **endereço** do ativo e o **usuário** da conta como estão no PAM |
| Conector Tenable/Qualys não conecta | URL base incorreta ou sem HTTPS                                                  | Use `<PAM>/api/v1/appsecrets/vault`; garanta certificado válido/confiável                     |
| Pod K8s não autentica               | Role não casa `namespace`/`serviceaccount`, ou modo de validação mal configurado | Revise o Role (namespaces/SAs) e os dados do Cluster                                          |
| Health para teste                   | —                                                                                | `GET <PAM>/api/v1/appsecrets/vault/v1/sys/health` deve responder `{"initialized":true,...}`   |

***

## 11. API de administração (provisionamento e automação)

Além da busca de credenciais por aplicações (seções anteriores), o DataDike PAM expõe uma **API REST de administração** para automatizar o provisionamento e a gestão do próprio PAM, permitindo operações **CRUD** (criar, consultar, atualizar e remover) sobre os principais objetos:

| Objeto                   | Operações                                                                                   |
| ------------------------ | ------------------------------------------------------------------------------------------- |
| **Usuários**             | criação, consulta, atualização, ativação/desativação e remoção de usuários do PAM           |
| **Contas / credenciais** | cadastro, consulta, atualização e exclusão de contas privilegiadas (logins) e seus segredos |
| **Grupos e perfis**      | criação e manutenção de grupos, associação/desassociação de usuários e atribuição de perfis |
| **Ativos**               | cadastro, atualização e remoção de ativos (assets) e seus protocolos                        |

Características:

* **Autenticação por token** sobre HTTPS, com escopo e permissões controlados por RBAC.
* **Auditoria:** toda operação administrativa via API é registrada na trilha de auditoria (autor, objeto, ação e horário).
* **Casos de uso:** onboarding/offboarding em massa, sincronização com ITSM/IGA e integração com pipelines de automação.

> A referência detalhada de *endpoints* (rotas, parâmetros e exemplos) é disponibilizada com o produto e junto ao seu Partner DataDike.

***

## 12. Perguntas frequentes

**A senha fica armazenada na ferramenta (Tenable/Qualys)?** Não. A ferramenta busca a senha no PAM no momento do uso. O cofre continua sendo a única fonte.

**Preciso instalar algo no meu ambiente?** Para API/scanners, não — basta configurar o conector. Para Kubernetes, usa-se o Vault Agent Injector ou o CSI Driver oficiais (componentes padrão do ecossistema).

**Posso restringir uma aplicação a poucos ativos?** Sim — desligue "Todas as contas" e liste os **Ativos permitidos**. Combine com a allowlist de **IPs de origem** para defesa em camadas.

**O token expira sozinho?** Só se você definir **Expira em**. Caso contrário vale até ser rotacionado ou a Aplicação ser desativada. (No Kubernetes, os tokens de pod sempre têm TTL.)

**Vários scanners/sistemas podem usar a mesma funcionalidade?** Sim. Crie **uma Aplicação por sistema** — assim cada um tem token, escopo, IPs e auditoria próprios.
