# Armazenando seus segredos com segurança

Saiba mais sobre segredos no desenvolvimento de software e sobre como gerenciá-los com segurança.

## O que é um segredo?

No desenvolvimento de software, um segredo são as informações confidenciais usadas para autenticar ou autorizar o acesso a sistemas, serviços, dados e APIs. Os exemplos incluem:

* **Chaves de API** e **tokens de acesso** que permitem interagir com serviços externos, como a API REST do GitHub. Os tokens de acesso também permitem que serviços, como o GitHub Actions, executem tarefas que precisam de autenticação, como testaremos posteriormente.
* **Credenciais de banco de dados** que concedem acesso a armazenamento e bancos de dados locais e externos.
* **Chaves privadas**, como chaves SSH e PGP privadas, que podem ser usadas para acessar outros servidores e criptografar dados.

Como os segredos fornecem tanto acesso, inclusive a sistemas críticos, podemos entender por que é tão importante mantê-los **em segurança**.

### O que pode acontecer quando um segredo é exposto?

* Invasores podem obter **acesso não autorizado** a tudo a que o segredo permite acesso.
* Hackers podem **roubar dados**, incluindo dados confidenciais do usuário. Isso pode ter ramificações legais e de privacidade, além de reduzir a confiança em você e em seu aplicativo.
* A exposição de segredos pode **custar dinheiro** quando hackers executam cargas de trabalho não autorizadas nas contas de um provedor de nuvem.
* Hackers podem usar um segredo exposto para excluir, modificar e encerrar servidores, o que pode causar **tempo de inatividade e perda de dados**.

Considere todo o acesso e as funcionalidades que um segredo concede a você e o que um hacker poderia fazer com isso. Por exemplo, se um personal access token de sua conta do GitHub fosse exposto, um hacker poderia postar e fazer alterações no GitHub como se fosse você.

## Práticas recomendadas para gerenciar segredos

Para evitar esses tipos de problemas, siga as práticas recomendadas para impedir vazamentos e limitar danos se um segredo for exposto.

### Siga o **Princípio do menor privilégio (PoLP)**.

Sempre que possível, restrinja as ações e o acesso de um segredo apenas ao que é necessário. Por exemplo:

* Se um segredo for usado apenas para ler dados, e não fazer alterações neles, opte por torná-lo **somente leitura**.
* Se a API que você está usando permitir que um segredo seja limitado apenas a escopos ou permissões específicos, selecione apenas **aqueles de que você precisa**. Por exemplo, se você precisa apenas criar problemas com um segredo do GitHub, não há motivos para o segredo ter acesso ao conteúdo do repositório nem a qualquer outra coisa.
* Se um segredo conceder a um invasor acesso total à conta de usuário que o possui, **considere criar contas de serviço** que possam assumir a propriedade do segredo.

### Proteger segredos em seu aplicativo

* **Nunca embuta um secreto no código**. Sempre use **variáveis de ambiente** ou as ferramentas de gerenciamento de segredos da plataforma (como os segredos do repositório do GitHub).
* Se precisar compartilhar um segredo com alguém, use uma ferramenta dedicada, como um **gerenciador de senhas**. Nunca envie segredos por email ou mensagem instantânea.
* Se possível, defina **datas de validade** e **gire os segredos** regularmente; isso reduz o risco de segredos antigos serem explorados.
* Se seu aplicativo produzir um log, assegure que os **segredos serão ocultados antes de serem registrados nele**. Caso contrário, segredos ativos poderão ser salvos em arquivos de texto sem formatação.

### Limitar o impacto caso um segredo seja exposto

* Considere que o segredo foi comprometido, mesmo que tenha sido exposto por apenas um segundo, e **revogue-o imediatamente**. Em seguida, gere um novo segredo e armazene-o com segurança.
* Verifique os **logs de atividades** que possam mostrar atividades suspeitas executadas com o segredo comprometido.
* Considere como o segredo foi exposto e faça alterações em seus processos para que isso não volte a acontecer.

## Como o GitHub ajuda a manter segredos em segurança

Você pode fazer muitas coisas para manter seus segredos em segurança, mas o GitHub também faz muito para ajudar com isso. Todos cometem erros, e estamos aqui para ajudar com recursos que capturam os segredos que você expõe acidentalmente:

* A **proteção de push**, que testaremos posteriormente, impede o envio de segredos por push para seus repositórios no GitHub.
* A **verificação de segredos** verifica os repositórios e cria alertas quando descobre um segredo. No caso de alguns segredos, também notificamos o provedor para que ele possa tomar medidas como revogar o segredo automaticamente.

## Praticando o armazenamento seguro de segredos

Neste exercício, criaremos um personal access token e o armazenaremos com segurança para que possamos usá-lo com o GitHub Actions. A ação que criaremos é um fluxo de trabalho simples que responde a uma questão.

### 1. Criar um repositório para praticar

Vamos começar criando um repositório no qual trabalhar. A conta `new2code` tem um modelo de repositório que podemos usar para começar rapidamente.

1. Navegue até a [página de novo repositório](https://github.com/new?template_owner=new2code\&template_name=secret-action). Ao seguir este link, o modelo será pré-selecionado na conta `new2code`.
2. Em "Owner", verifique se sua conta de usuário está selecionada.
3. No campo "Repository name", digite `secret-action`.
4. Abaixo do campo de descrição, selecione **Public** para definir a visibilidade do repositório.
5. Clique em **Criar repositório**.

### 2. Fazer commit de um token fictício

Todos cometem erros, e é possível que você efetue commit de um segredo acidentalmente em algum momento de sua jornada de codificação. Neste exercício, faremos commit de um **token falso** intencionalmente para que possamos nos familiarizar e com o alerta que é disparado.

1. Navegue até o repositório recém-criado.

2. Navegue até o arquivo de fluxo de trabalho YAML clicando em `.github/workflows` na lista de arquivos.

3. Abra o arquivo de fluxo de trabalho clicando em `comment.yml` na lista de arquivos.

4. Para editar o arquivo de fluxo de trabalho, na parte superior direita, clique em <svg version="1.1" width="16" height="16" viewBox="0 0 16 16" class="octicon octicon-pencil" aria-label="Edit this file" role="img"><path d="M11.013 1.427a1.75 1.75 0 0 1 2.474 0l1.086 1.086a1.75 1.75 0 0 1 0 2.474l-8.61 8.61c-.21.21-.47.364-.756.445l-3.251.93a.75.75 0 0 1-.927-.928l.929-3.25c.081-.286.235-.547.445-.758l8.61-8.61Zm.176 4.823L9.75 4.81l-6.286 6.287a.253.253 0 0 0-.064.108l-.558 1.953 1.953-.558a.253.253 0 0 0 .108-.064Zm1.238-3.763a.25.25 0 0 0-.354 0L10.811 3.75l1.439 1.44 1.263-1.263a.25.25 0 0 0 0-.354Z"></path></svg>.

5. Na linha 13, `GH_TOKEN: ""`, insira este token fictício entre as aspas:

   ```text
   secret_scanning_ab85fc6f8d7638cf1c11da812da308d43_abcde
   ```

   O resultado final deve ter essa aparência:

   ```yaml
   GH_TOKEN: "secret_scanning_ab85fc6f8d7638cf1c11da812da308d43_abcde"
   ```

6. Para tentar fazer commit da alteração, na parte superior direita, clique em **Commit changes...** e em **Commit changes** novamente na caixa de diálogo.

7. Agora, você deve ver o alerta de proteção de push com a mensagem "Secret scanning found a GitHub Secret Scanning secret on line 13".

   ![Captura de tela de um alerta de proteção de push referente à Linha 13 do arquivo no qual tentamos fazer commit. O botão "Cancel" está realçado com um contorno laranja.](/assets/images/help/security/push-protection-example.png)

   Se não estivéssemos testando um token fictício, isso nos alertaria de estarmos a um passo de expor um token. Examine as opções que você pode selecionar no alerta.

8. Para interromper o commit e evitar expor o segredo, clique em **Cancel**. No canto superior direito, clique em **Cancel changes** e descarte as alterações não salvas, se solicitado.

### 3. Criando um token real

Agora, vamos tentar seguir nossas práticas recomendadas. Primeiro, criaremos um personal access token que permitirá que a ação ocorra em seu nome (o comentário criado parecerá vir da sua conta de usuário).

> \[!NOTE] Observe como seguimos o Princípio de privilégios mínimos em cada etapa de configuração. Seu token terá a validade mais curta necessária, só terá acesso ao repositório de que precisa e terá as permissões mínimas necessárias para funcionar.

1. Navegue até a [nova página do personal access token](https://github.com/settings/personal-access-tokens/new).
2. Em "Token name", dê um nome ao novo token. Você pode usar algo como "Token de ação".
3. Em "Expiration", selecione "7 days".
4. Em "Repository access", selecione **Apenas selecionar repositórios**.
5. Na lista suspensa "Select repositories", selecione **apenas** o repositório de prática criado anteriormente.
6. À direita de "Repository permissions" na seção "Permissions", clique em <svg version="1.1" width="16" height="16" viewBox="0 0 16 16" class="octicon octicon-unfold" aria-label="Expand" role="img"><path d="m8.177.677 2.896 2.896a.25.25 0 0 1-.177.427H8.75v1.25a.75.75 0 0 1-1.5 0V4H5.104a.25.25 0 0 1-.177-.427L7.823.677a.25.25 0 0 1 .354 0ZM7.25 10.75a.75.75 0 0 1 1.5 0V12h2.146a.25.25 0 0 1 .177.427l-2.896 2.896a.25.25 0 0 1-.354 0l-2.896-2.896A.25.25 0 0 1 5.104 12H7.25v-1.25Zm-5-2a.75.75 0 0 0 0-1.5h-.5a.75.75 0 0 0 0 1.5h.5ZM6 8a.75.75 0 0 1-.75.75h-.5a.75.75 0 0 1 0-1.5h.5A.75.75 0 0 1 6 8Zm2.25.75a.75.75 0 0 0 0-1.5h-.5a.75.75 0 0 0 0 1.5h.5ZM12 8a.75.75 0 0 1-.75.75h-.5a.75.75 0 0 1 0-1.5h.5A.75.75 0 0 1 12 8Zm2.25.75a.75.75 0 0 0 0-1.5h-.5a.75.75 0 0 0 0 1.5h.5Z"></path></svg> para exibir todas as permissões possíveis.
7. Role para baixo até "Issues" e, na lista suspensa à direita, selecione "Ler e escrever".
8. Na parte inferior da página, clique em **Gerar token**. Se solicitado, confirme clicando em **Generate token** novamente.

É crucial lidar com o token resultante de maneira segura deste momento em diante. Como usaremos o token em breve, você pode copiá-lo para sua área de transferência.

### 4. Armazenando o token com segurança

Agora, podemos armazenar o novo token com segurança em nosso repositório.

1. Navegue até o repositório criado no início do exercício.
2. No nome do repositório, clique em **<svg version="1.1" width="16" height="16" viewBox="0 0 16 16" class="octicon octicon-gear" aria-label="gear" role="img"><path d="M8 0a8.2 8.2 0 0 1 .701.031C9.444.095 9.99.645 10.16 1.29l.288 1.107c.018.066.079.158.212.224.231.114.454.243.668.386.123.082.233.09.299.071l1.103-.303c.644-.176 1.392.021 1.82.63.27.385.506.792.704 1.218.315.675.111 1.422-.364 1.891l-.814.806c-.049.048-.098.147-.088.294.016.257.016.515 0 .772-.01.147.038.246.088.294l.814.806c.475.469.679 1.216.364 1.891a7.977 7.977 0 0 1-.704 1.217c-.428.61-1.176.807-1.82.63l-1.102-.302c-.067-.019-.177-.011-.3.071a5.909 5.909 0 0 1-.668.386c-.133.066-.194.158-.211.224l-.29 1.106c-.168.646-.715 1.196-1.458 1.26a8.006 8.006 0 0 1-1.402 0c-.743-.064-1.289-.614-1.458-1.26l-.289-1.106c-.018-.066-.079-.158-.212-.224a5.738 5.738 0 0 1-.668-.386c-.123-.082-.233-.09-.299-.071l-1.103.303c-.644.176-1.392-.021-1.82-.63a8.12 8.12 0 0 1-.704-1.218c-.315-.675-.111-1.422.363-1.891l.815-.806c.05-.048.098-.147.088-.294a6.214 6.214 0 0 1 0-.772c.01-.147-.038-.246-.088-.294l-.815-.806C.635 6.045.431 5.298.746 4.623a7.92 7.92 0 0 1 .704-1.217c.428-.61 1.176-.807 1.82-.63l1.102.302c.067.019.177.011.3-.071.214-.143.437-.272.668-.386.133-.066.194-.158.211-.224l.29-1.106C6.009.645 6.556.095 7.299.03 7.53.01 7.764 0 8 0Zm-.571 1.525c-.036.003-.108.036-.137.146l-.289 1.105c-.147.561-.549.967-.998 1.189-.173.086-.34.183-.5.29-.417.278-.97.423-1.529.27l-1.103-.303c-.109-.03-.175.016-.195.045-.22.312-.412.644-.573.99-.014.031-.021.11.059.19l.815.806c.411.406.562.957.53 1.456a4.709 4.709 0 0 0 0 .582c.032.499-.119 1.05-.53 1.456l-.815.806c-.081.08-.073.159-.059.19.162.346.353.677.573.989.02.03.085.076.195.046l1.102-.303c.56-.153 1.113-.008 1.53.27.161.107.328.204.501.29.447.222.85.629.997 1.189l.289 1.105c.029.109.101.143.137.146a6.6 6.6 0 0 0 1.142 0c.036-.003.108-.036.137-.146l.289-1.105c.147-.561.549-.967.998-1.189.173-.086.34-.183.5-.29.417-.278.97-.423 1.529-.27l1.103.303c.109.029.175-.016.195-.045.22-.313.411-.644.573-.99.014-.031.021-.11-.059-.19l-.815-.806c-.411-.406-.562-.957-.53-1.456a4.709 4.709 0 0 0 0-.582c-.032-.499.119-1.05.53-1.456l.815-.806c.081-.08.073-.159.059-.19a6.464 6.464 0 0 0-.573-.989c-.02-.03-.085-.076-.195-.046l-1.102.303c-.56.153-1.113.008-1.53-.27a4.44 4.44 0 0 0-.501-.29c-.447-.222-.85-.629-.997-1.189l-.289-1.105c-.029-.11-.101-.143-.137-.146a6.6 6.6 0 0 0-1.142 0ZM11 8a3 3 0 1 1-6 0 3 3 0 0 1 6 0ZM9.5 8a1.5 1.5 0 1 0-3.001.001A1.5 1.5 0 0 0 9.5 8Z"></path></svg> Settings**. Caso não consiga ver a guia "Configurações", selecione o menu suspenso **<svg version="1.1" width="16" height="16" viewBox="0 0 16 16" class="octicon octicon-kebab-horizontal" aria-label="More" role="img"><path d="M8 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm13 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path></svg>** , clique em **Configurações**.

   ![Captura de tela de um cabeçalho de repositório que mostra as guias. A guia "Configurações" é realçada por um contorno laranja-escuro.](/assets/images/help/repository/repo-actions-settings.png)
3. Na seção "Security" da barra lateral, selecione **<svg version="1.1" width="16" height="16" viewBox="0 0 16 16" class="octicon octicon-key-asterisk" aria-label="key-asterisk" role="img"><path d="M0 2.75A2.75 2.75 0 0 1 2.75 0h10.5A2.75 2.75 0 0 1 16 2.75v10.5A2.75 2.75 0 0 1 13.25 16H2.75A2.75 2.75 0 0 1 0 13.25ZM2.75 1.5c-.69 0-1.25.56-1.25 1.25v10.5c0 .69.56 1.25 1.25 1.25h10.5c.69 0 1.25-.56 1.25-1.25V2.75c0-.69-.56-1.25-1.25-1.25Z"></path><path d="M8 4a.75.75 0 0 1 .75.75V6.7l1.69-.975a.75.75 0 0 1 .75 1.3L9.5 8l1.69.976a.75.75 0 0 1-.75 1.298L8.75 9.3v1.951a.75.75 0 0 1-1.5 0V9.299l-1.69.976a.75.75 0 0 1-.75-1.3L6.5 8l-1.69-.975a.75.75 0 0 1 .75-1.3l1.69.976V4.75A.75.75 0 0 1 8 4Z"></path></svg> Secrets and variables** e clique em **Actions**.
4. Em "Repository secrets", clique em **New repository secret**.
5. No campo **Name**, digite um nome para o segredo. Para este exercício, usaremos `MY_TOKEN`.
6. No campo **Secret**, cole o personal access token gerado anteriormente.
7. Clique em **Adicionar segredo**.

Seu segredo está criptografado com segurança e pronto para uso!

### 5. Referenciando o token na ação

Agora, podemos atualizar o arquivo de fluxo de trabalho YAML para usar o token e testar se ele funciona.

1. Navegue de volta para seu repositório. Se estiver nas configurações de seu repositório, clique em **<svg version="1.1" width="16" height="16" viewBox="0 0 16 16" class="octicon octicon-code" aria-label="code" role="img"><path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path></svg> Code** abaixo do nome do repositório.

2. Navegue até o arquivo de fluxo de trabalho YAML clicando em `.github/workflows` na lista de arquivos.

3. Abra o arquivo de fluxo de trabalho clicando em `comment.yml` na lista de arquivos.

4. Para começar a editar o arquivo de fluxo de trabalho, na parte superior direita, clique em <svg version="1.1" width="16" height="16" viewBox="0 0 16 16" class="octicon octicon-pencil" aria-label="Edit this file" role="img"><path d="M11.013 1.427a1.75 1.75 0 0 1 2.474 0l1.086 1.086a1.75 1.75 0 0 1 0 2.474l-8.61 8.61c-.21.21-.47.364-.756.445l-3.251.93a.75.75 0 0 1-.927-.928l.929-3.25c.081-.286.235-.547.445-.758l8.61-8.61Zm.176 4.823L9.75 4.81l-6.286 6.287a.253.253 0 0 0-.064.108l-.558 1.953 1.953-.558a.253.253 0 0 0 .108-.064Zm1.238-3.763a.25.25 0 0 0-.354 0L10.811 3.75l1.439 1.44 1.263-1.263a.25.25 0 0 0 0-.354Z"></path></svg>.

5. Na linha 13, `GH_TOKEN: ""`, substitua as aspas vazias por `${{ secrets.MY_TOKEN }}`. Isso fará referência ao segredo do repositório que adicionamos anteriormente.

   ```yaml
   GH_TOKEN: ${{ secrets.MY_TOKEN }}
   ```

6. Para confirmar a alteração, na parte superior direita, clique em **Commit changes...**

7. Na caixa de diálogo "Commit changes", edite "Commit message" para refletir a alteração que estamos fazendo. Por exemplo, você pode inserir "Atualizando o fluxo de trabalho para usar o segredo do repositório".

8. Assegure que "Commit directly to the `main` branch" esteja selecionado.

9. Clique em **Confirmar alterações**.

### 6. Testando o token e o fluxo de trabalho

Devemos estar prontos agora! Agora, vamos testar o fluxo de trabalho.

1. No nome do seu repositório, clique em **<svg version="1.1" width="16" height="16" viewBox="0 0 16 16" class="octicon octicon-issue-opened" aria-label="issue-opened" role="img"><path d="M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Z"></path></svg> Issues**.

   ![Captura de tela da página principal de um repositório. Na barra de navegação horizontal, uma guia, rotulada como "Problemas", é destacada em laranja escuro.](/assets/images/help/repository/repo-tabs-issues-global-nav-update.png)
2. Clique em **Novo problema**.
3. Em "Add a title", você pode digitar qualquer título desejado.
4. Em "Add a description", na área de texto, digite `Hello`.
5. Abaixo da área de texto, clique em **Create**.

Depois que o fluxo de trabalho for concluído, você deverá ver um novo comentário aparecer. O comentário será criado por você mesmo, pois estamos usando seu token, e conterá uma saudação.

## Próximas etapas

Para se aprofundar mais na verificação de segredos e na proteção de push, conclua o curso [Introdução à verificação de segredos](https://github.com/skills/introduction-to-secret-scanning/tree/main) no GitHub Skills.

Outra parte importante da segurança de código é aprender a identificar e corrigir vulnerabilidades de código nos projetos. Confira [Como localizar e corrigir sua primeira vulnerabilidade de código](/pt/get-started/learning-to-code/finding-and-fixing-your-first-code-vulnerability).