# Gestão de Segredos

Quando estamos desenvolvendo nossas soluções, é comum precisarmos conectar diferentes serviços.

Comumente estes serviços exigem algum tipo de credencial, apikey, token ou qualquer informação de acesso.

Como exemplo temos credenciais de acesso ao banco de dados, chaves de api do google, certificados digitais, credenciais da AWS, etc.

Mas o que aconteceria se estas informações caíssem em mãos erradas?

Por este motivo precisamos ter certos cuidados com algumas informações...

## Checklist

### Segredos no Código

Não devemos deixar qualquer segredo fixo no código:

{% code title="Secret Hardcoded" lineNumbers="true" %}

```js
// 🚫 BAD
const db = new DB({
  user: 'DbUser',
  pass: 'DbP@ss0rd!'
})
```

{% endcode %}

Para resolver isso, podemos utilizar `Variáveis de Ambiente`...

{% code title="Variáveis de Ambiente" lineNumbers="true" %}

```js
// ✅ GOOD
const db = new DB({
  user: process.env.DB_USER,
  pass: process.env.DB_PASS
})
```

{% endcode %}

Ou `Cofre de Senhas`:

{% code title="Hashicorp Vault" lineNumbers="true" %}

```js
const vault = require("node-vault")({
  apiVersion: process.env.VAULT_VERSION,
  endpoint: process.env.VAULT_URL,
});

const roleId = process.env.ROLE_ID;
const secretId = process.env.SECRET_ID;

const run = async () => {
  const result = await vault.approleLogin({
    role_id: roleId,
    secret_id: secretId,
  });

  vault.token = result.auth.client_token;

  const { data } = await vault.read("secret/data/mysql/webapp");

  const databaseName = data.data.db_name;
  const username = data.data.username;
  const password = data.data.password;

  console.log({
    databaseName,
    username,
    password,
  });
};

run();
```

{% endcode %}

Este tipo de informação podem estar em vários lugares:

* Código
* Arquivos de Configurações (web.config, .env, application.properties, etc)
* READMEs

### Gestão de Acessos

Ok, já removemos os segredos chumbados no código, wikis, e etc. Mas e as informações de acesso que as pessoas precisam ter, como uma credencial de consulta ao banco ou painel de logs, como fica? Como o time de desenvolvimento vai realizar a correção de um problema ou ter acesso às plataformas?

É comum que os membros dos times tenham senhas, certificados ou chaves para acessar ambientes e ferramentas. O cuidado com esta informação também é importante.

Para isso, alguns cuidados precisam ser tomados:

#### Credenciais Nominais

Cada membro do time que tiver acesso à uma ferramenta ou plataforma deve ter sua própria credencial, com o perfil específico para suas necessidades.

#### Escopo de Acesso

Quando acontecem problemas em produção ou alguma nova funcionalidade exigir uma análise do ambiente para evitar breaking changes, o time precisa de informações.

Em vez de ficarmos restringindo o acesso à tudo, criando atrito e atrasando as demandas do trabalho, foquemos em uma pergunta:

{% hint style="info" %}
O que precisa ser protegido?
{% endhint %}

Talvez você chegue na conclusão de:

* Não podem realizar operações de escrita.
* Não podem acessar dados pessoais, sensíveis e sigilosos.

Ótimo, é aqui que está o trabalho.

Chegar para o time e dizer:

{% hint style="success" %}
*"E ai pessoas, estamos dando liberdade para vocês, só não vamos habilitar o acesso aos dados das pessoas e operações de escrita para não comprometer o ambiente, beleza?"*
{% endhint %}

É MUITO melhor que perguntar:

{% hint style="danger" %}
*"O que vocês precisam?"*
{% endhint %}

Pelo simples motivo que na c#r\@lh4 de um WAR ROOM ninguém sabe o que precisa (além do café e uma aspirina, é claro) e no fim você precisar dar acesso a tudo por causa da pressão.

## Riscos

[CWE-798: Use of Hard-coded Credentials](https://cwe.mitre.org/data/definitions/798.html)

* Alguém não autorizado ter acesso à credenciais de produção pelo simples fato de ter acesso ao código fonte ou documentação.
* Alguém colocar o código em ambiente público (github pessoal público, pastebin, etc) e as secrets vazarem.

## Guias

* [SAMM - Secret Management](https://owaspsamm.org/model/implementation/secure-deployment/stream-b/)
* [OWASP Cheat Sheet - Key Management](https://cheatsheetseries.owasp.org/cheatsheets/Key_Management_Cheat_Sheet.html)
* [OWASP Proactive Controls - C8 - Protect Data Everywhere](https://owasp.org/www-project-proactive-controls/v3/en/c8-protect-data-everywhere)
* [OWASP Cheat Sheet - Cryptographic Storage](https://cheatsheetseries.owasp.org/cheatsheets/Cryptographic_Storage_Cheat_Sheet.html)

## Tools

### [Bitwarden](https://bitwarden.com/)

Gerenciador de senhas (pessoal / teams).

Para uso pessoal, é free, open source e pode ser utilizado em múltiplos dispositivos.

Para empresas, pode ser utilizado como vault.

Recomendamos o bitwarden para uso de gerenciador de senhas pessoal =).

### [Passbolt](https://www.passbolt.com/)

Open source password manager for teams.

Pode ser instalado de diversas formas, mas o principal: tem um docker-compose =).

### [Hashicorp Vault](https://www.vaultproject.io/)

Vault para armazenamento de senhas, certificados ou qualquer outra informação sensível.

Tem opção free e self-hosted.

### [Trufflehog](https://github.com/trufflesecurity/trufflehog)

Tool de linha de comando para detecção de secrets hardcoded.

Roda a partir de docker e é capaz de detectar mais de 700 tipos de credenciais.

Pode realizar o scan em Github, Gitlab, FileSystem, Logs e Buckets S3.

{% code title="Executar o trufflehog com docker" lineNumbers="true" %}

```bash
docker run -it -v "$PWD:/pwd" \
    trufflesecurity/trufflehog:latest \
    github \
    --org=trufflesecurity
```

{% endcode %}

### [Gitlab - Secret Detection](https://docs.gitlab.com/ee/user/application_security/secret_detection/)

O Gitlab (em todas as suas versões) possui nativamente um scan para segredos hard-coded.

A versão free é limitada com relação à ultimate, mas é uma ótima opção caso a corporação não queira adotar uma ferramenta externa ou deseja usar 100% da plataforma que já paga.

### [Github - Secret Scanning](https://docs.github.com/en/code-security/secret-scanning/about-secret-scanning)

O Github tem um scan de secrets embarcado também.

Sua execução é automática em todos os repositórios, mas existem opções extras caso o Advanced Security seja adquirido.

## Links Úteis

### Tutorials

* [Creating a Node.js App that Records and Retrieves Secrets from Vault](https://www.hashicorp.com/resources/creating-nodejs-app-record-retrieve-secret-vault)
* [Github :: Removing sensitive data from a repository](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/removing-sensitive-data-from-a-repository)
* [Truffle :: How to Rotate Tutorials](https://howtorotate.com/docs/introduction/getting-started/)

### Vídeos

* [Fabio Akita :: Sua Segurança é uma DROGA | Gerenciadores de Senhas, 2FA, Encriptação](https://youtu.be/s7ldn31OEFc)
