Sobes.tech
Middle

Come crittografi le variabili in CI?

sobes.tech AI

Risposta dell'AI

Cifro le variabili utilizzando le funzionalità integrate del sistema CI. Ogni sistema CI, che sia GitLab CI/CD, GitHub Actions o Jenkins, dispone di funzioni per memorizzare in modo sicuro i segreti. Queste variabili sono disponibili solo in alcune fasi della pipeline di build e non vengono visualizzate nei log.

Ad esempio, in GitLab CI:

  • Variabili di ambiente: A livello di gruppo o progetto, è possibile salvare variabili. Sono contrassegnate come "protette" e "mascherate". Le "protette" vengono usate solo in branch e tag protetti, le "mascherate" nascondono il valore nei log se corrispondono completamente.

    # .gitlab-ci.yml
    # Accesso alla variabile tramite l'ambiente
    script:
      - echo $MY_SECRET_VARIABLE
    
  • HashiCorp Vault: Integrazione con un archivio di segreti esterno, come HashiCorp Vault. GitLab CI può autenticarsi in Vault e ottenere segreti durante l'esecuzione della 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 # La variabile viene caricata automaticamente da Vault
    

In GitHub Actions:

  • Secrets: A livello di repository o organizzazione, è possibile memorizzare segreti. Sono disponibili nei flussi di lavoro tramite ${{ secrets.MY_SECRET }}. I valori non vengono visualizzati nei log e non possono essere recuperati tramite API dopo essere stati salvati.

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

In Jenkins:

  • Credentials Plugin: Permette di memorizzare diversi tipi di credenziali (nome utente/password, testo segreto, chiave SSH) in modo cifrato. Possono essere accessibili nel Jenkinsfile o tramite l'interfaccia grafica.

    // Jenkinsfile (Pipeline dichiarativa)
    pipeline {
        agent any
        stages {
            Nel processo di build, dove vengono usate le variabili, sono generalmente disponibili come variabili di ambiente.
            stage('Usa Segreto') {
                steps {
                    withCredentials([string(credentialsId: 'my-secret-id', variable: 'MY_VAR')]) {
                        sh 'echo $MY_VAR'
                    }
                }
            }
        }
    }
    

Principi generali:

  • Minimizzazione dell'ambito: I segreti sono disponibili solo nelle fasi e negli ambienti in cui sono necessari.
  • Mascheramento dei log: I valori dei segreti sono nascosti nei log di esecuzione del pipeline.
  • Separazione dei ruoli: Solo utenti o sistemi autorizzati possono aggiungere/modificare i segreti.
  • Utilizzo di archivi esterni: Per scenari più complessi e gestione centralizzata dei segreti, vengono utilizzati Vault o soluzioni simili.