Sobes.tech
Middle

Como é que encripta variáveis no CI?

sobes.tech IA

Resposta da IA

Cripto variáveis usando as funcionalidades integradas do sistema CI. Cada sistema CI, seja GitLab CI/CD, GitHub Actions ou Jenkins, possui funções para armazenar segredos de forma segura. Essas variáveis estão disponíveis apenas em certas etapas do pipeline de construção e não são exibidas nos logs.

Por exemplo, no GitLab CI:

  • Variáveis de ambiente: No nível do grupo ou projeto, pode-se guardar variáveis. Elas são marcadas como "protegidas" e "enmascaradas". As "protegidas" são usadas apenas em ramos e tags protegidos, e as "enmascaradas" ocultam o valor nos logs se coincidirem completamente.

    # .gitlab-ci.yml
    # Acesso à variável através do ambiente
    script:
      - echo $MY_SECRET_VARIABLE
    
  • HashiCorp Vault: Integração com um armazenamento externo de segredos, como HashiCorp Vault. O GitLab CI pode autenticar-se no Vault e obter segredos durante a execução do pipeline.

    # .gitlab-ci.yml
    variables:
      VAULT_SERVER: "https://vault.example.com"
      VAULT_AUTH_ROLE: "gitlab-ci"
      VAULT_AUTH_PATH: "auth/kubernetes"
      VAULT_SECRETS: |
        MY_SECRET_KEY: vault/path/to/secret:key
    script:
      - echo $MY_SECRET_KEY # Variável carregada automaticamente do Vault
    

Em GitHub Actions:

  • Secrets: No nível do repositório ou organização, pode-se guardar segredos. Disponíveis nos fluxos de trabalho através de ${{ secrets.MY_SECRET }}. Os valores não são exibidos nos logs e não podem ser obtidos via API após serem guardados.

    # .github/workflows/main.yml
    jobs:
      build:
        runs-on: ubuntu-latest
        steps:
        - name: Usar segredo
          run: echo ${{ secrets.MY_SECRET }}
    

No Jenkins:

  • Credentials Plugin: Permite guardar diferentes tipos de credenciais (login/senha, texto secreto, chave SSH) de forma encriptada. Podem ser acessadas no Jenkinsfile ou através da interface gráfica.

    // Jenkinsfile (Pipeline Declarativo)
    pipeline {
        agent any
        stages {
            Dentro do processo de build, onde as variáveis são usadas, elas geralmente estão disponíveis como variáveis de ambiente.
            stage('Usar segredo') {
                steps {
                    withCredentials([string(credentialsId: 'my-secret-id', variable: 'MY_VAR')]) {
                        sh 'echo $MY_VAR'
                    }
                }
            }
        }
    }
    

Princípios gerais:

  • Minimização do escopo: Segredos estão disponíveis apenas nas etapas e ambientes onde são necessários.
  • Mascaramento de logs: Os valores dos segredos são ocultados nos logs de execução do pipeline.
  • Separação de funções: Apenas usuários ou sistemas autorizados podem adicionar/alterar segredos.
  • Uso de armazenamento externo: Para cenários mais complexos e gestão centralizada de segredos, são utilizados Vault ou soluções similares.