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 de privilégios mínimos (PoLP).
Sempre que possível, restrinja o que um segredo pode fazer e o que pode acessar somente ao que for 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 issue 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 os danos se um segredo for 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 um issue.
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.
- Navegue até new repository page. Seguir este link selecionará o modelo na conta
new2code
. - Em "Owner", verifique se sua conta de usuário está selecionada.
- No campo "Repository name", digite
secret-action
. - Abaixo do campo de descrição, selecione Public para definir a visibilidade do repositório.
- 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.
-
Navegue até o repositório recém-criado.
-
Navegue até o arquivo de fluxo de trabalho YAML clicando em
.github/workflows
na lista de arquivos. -
Abra o arquivo de fluxo de trabalho clicando em
comment.yml
na lista de arquivos. -
Para editar o arquivo de fluxo de trabalho, na parte superior direita, clique em .
-
Na linha 13,
GH_TOKEN: ""
, insira este token fictício entre as aspas:secret_scanning_ab85fc6f8d7638cf1c11da812da308d43_abcde
O resultado final deve ter essa aparência:
GH_TOKEN: "secret_scanning_ab85fc6f8d7638cf1c11da812da308d43_abcde"
-
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.
-
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".
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.
-
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).
Observação
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.
- Navegue até a nova página do personal access token.
- Em "Token name", dê um nome ao novo token. Você pode usar algo como "Token de ação".
- Em "Expiration", selecione "7 days".
- Em "Repository access", selecione Only select repositories.
- Na lista suspensa "Select repositories", selecione apenas o repositório de prática criado anteriormente.
- À direita de "Repository permissions" na seção "Permissions", clique em para exibir todas as permissões possíveis.
- Role para baixo até "Issues" e, na lista suspensa à direita, selecione "Read and write".
- Clique me Generate token na parte inferior da página. 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.
-
Navegue até o repositório criado no início do exercício.
-
No nome do repositório, clique em Settings. Caso não consiga ver a guia "Configurações", selecione o menu suspenso , clique em Configurações.
-
Na seção "Security" da barra lateral, selecione Secrets and variables e clique em Actions.
-
Em "Repository secrets", clique em New repository secret.
-
No campo Name, digite um nome para o segredo. Para este exercício, usaremos
MY_TOKEN
. -
No campo Secret, cole o personal access token gerado anteriormente.
-
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.
-
Navegue de volta para seu repositório. Se estiver nas configurações de seu repositório, clique em Code no nome do repositório.
-
Navegue até o arquivo de fluxo de trabalho YAML clicando em
.github/workflows
na lista de arquivos. -
Abra o arquivo de fluxo de trabalho clicando em
comment.yml
na lista de arquivos. -
Para começar a editar o arquivo de fluxo de trabalho, na parte superior direita, clique em .
-
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.GH_TOKEN: ${{ secrets.MY_TOKEN }}
-
Para confirmar a alteração, na parte superior direita, clique em Commit changes...
-
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".
-
Assegure que "Commit directly to the
main
branch" esteja selecionado. -
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.
-
No nome do seu repositório, clique em Issues.
-
Clique em Novo problema.
-
Em "Add a title", você pode digitar qualquer título desejado.
-
Em "Add a description", na área de texto, digite
Hello
. -
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 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.