Usando helm-secrets e Vals para anonimizar seus dados no deploy!

pedronandi

Pedro Nandi

Posted on November 7, 2024

Usando helm-secrets e Vals para anonimizar seus dados no deploy!

Eai, meu povo! Bão? Aqui, tô bão! Mas faz tempo que não escrevo. Essa semana precisei estudar umas ferramentas para atender uma demanda e pensei que seria bacana compartilhar esse conhecimento!

Esse texto vai para quem precisa fazer deploy em cluster Kubernetes e utiliza helm charts, no dia-a-dia. Nos values.yml, você possui informações sensíveis como senhas de bancos de dados, de serviços de mensageria, etc? Você anonimiza esses dados, para que eles não fiquem expostos no repositório de controle de versão? Não? Então vem ver como faz de um jeito facinho!

A seguir, mostrarei como anonimizar dados sensíveis dos helm charts utilizando: AWS Secrets Manager, o plugin helm-secrets e o Vals. Seguinte, imagine que temos que fazer o deploy de um serviço no nosso cluster, com helm charts. No values.yml, temos os dados de acesso ao banco de dados MySQL, e eles estão explícitos. Assim:

secret:
  spring:
    datasource:
      username: pedro
      password: pedro123
Enter fullscreen mode Exit fullscreen mode

Não queremos que todos que tenham acesso ao repositório do projeto, tenham acesso à esses dados assim, tão facilmente. Para isso, decidimos utilizar um cofre de senhas, externo. O AWS Secrets Manager. Porém, precisamos fazer com que, no momento do deploy, o Helm consiga acessar o Secret Manager para buscar as informações. Caso contrário, o deploy nunca vai funcionar.

Para tal, existem dois caras que nos salvam: O plugin helm-secrets e o Vals. Ambos existem para facilitar a vida de quem usa Helm e precisa lidar com secrets e informações sensíveis. Vamos iniciar instalando o plugin helm-secrets:

helm plugin install https://github.com/jkroepke/helm-secrets --version v4.6.1
Enter fullscreen mode Exit fullscreen mode

Disclaimer: Todas as versões utilizadas nesse texto são datadas da época em que o mesmo está sendo escrito.

Para validar a instalação do helm-secrets, basta digitar no terminal:

helm plugin list
Enter fullscreen mode Exit fullscreen mode

Agora, para a instalação do Vals, basta seguir esses passos (exclusivamente para Linux):

  • Aqui, efetuar o download do binário (vals_0.37.8_linux_amd64.tar.gz)
  • Descompactar e mover o arquivo vals para /usr/local/bin
  • Conceder permissão de execução à vals: chmod +x /usr/local/bin/vals

Para validar a instalação do Vals, basta digitar no terminal:

vals version
Enter fullscreen mode Exit fullscreen mode

No AWS Secrets Manager, vamos criar as seguintes secrets:

  • datasource.username : pedro
  • datasource.password : pedro123

Nos nossos helm charts, precisamos que o arquivo templates/secrets.yml esteja buscando os valores das secrets do nosso arquivo values.yml, assim:

apiVersion: v1
kind: Secret
metadata:
  name: nosso-secret
data:
  spring.datasource.username: {{ .Values.secret.spring.datasource.username | b64enc }}
  spring.datasource.password: {{ .Values.secret.spring.datasource.password | b64enc }}
Enter fullscreen mode Exit fullscreen mode

Agora, no nosso arquivo values.yml, precisamos apontar para as secrets da AWS utilizando a sintaxe disponibilizada pelo Vals. Essa sintaxe está disponível na documentação oficial da ferramenta. O values.yml ficará assim:

secret:
  spring:
    datasource:
      username: ref+awssecrets://datasource.username?region=us-east-2#datasource.username
      password: ref+awssecrets://datasource.password?region=us-east-2#datasource.password
Enter fullscreen mode Exit fullscreen mode

Dissecando a sintaxe, temos:

  • Termo fixo para integração com AWS Secrets Manager: ref+awssecrets://
  • Path para a secret: datasource.username
  • Parâmetro indicando a região AWS: ?region=us-east-2
  • Apontamento para a key da secret: #datasource.username

O Vals possui suporte para uma infinidade de secret managers. Agora, com tudo pronto, vamos para o deploy. O Vals precisa de dados de acesso à AWS, para que consiga buscar as secrets ao longo do deploy. Para isso, é necessário que algumas variáveis de ambiente sejam setadas na máquina que realizará o deploy:

export HELM_SECRETS_BACKEND=vals #Faz parta das configurações entre o helm-secrets e o Vals
export AWS_ACCESS_KEY_ID=foo
export AWS_SECRET_ACCESS_KEY=foo
export AWS_SESSION_TOKEN=foo
export AWS_DEFAULT_REGION="us-east-2" #Região AWS
Enter fullscreen mode Exit fullscreen mode

Os valores das variáveis referentes à AWS podem ser obtidas no portal de acesso da AWS. O comando para o deploy é o seguinte:

helm secrets install release-name -f values.yaml your-chart
Enter fullscreen mode Exit fullscreen mode

Ao longo do deploy, o Vals deve informar que conseguiu buscar as secrets da AWS. Ele deve gerar um arquivo temporário contendo os values.yml com as respectivas secrets e, por fim, deve sinalizar que o serviço foi deployado com sucesso!

Bom, texto rápido e fácil, pra facilitar a vida de todo mundo. Decidi compartilhar, novamente, porque tive dificuldade em reunir toda essa informação através de pesquisas. Encontrei alguns links que me ajudaram muito, mas nada muito claro.

Através do helm-secrets, também é possível fazer a anonimização dessas informações através de criptografia, sem o uso de um cofre externo. Mas isso, rende um outro texto (que vai vir em breve). A ideia principal é não ter informações sensíveis expostas dentro do repositório de controle de versão do projeto, disponíveis à qualquer um que tiver acesso.

Aqui, algumas referências e documentações que usei para validar toda essa groselha. Valeu!

💖 💪 🙅 🚩
pedronandi
Pedro Nandi

Posted on November 7, 2024

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related