Sobes.tech
Middle

Cum criptați variabilele în CI?

sobes.tech AI

Răspuns de la AI

Criptez variabilele utilizând funcțiile încorporate ale sistemului CI. Fiecare sistem CI, fie că este GitLab CI/CD, GitHub Actions sau Jenkins, are funcții pentru stocarea sigură a secretelor. Aceste variabile sunt disponibile doar în anumite etape ale pipeline-ului de construcție și nu sunt afișate în jurnale.

De exemplu, în GitLab CI:

  • Variabile de mediu: La nivel de grup sau proiect, se pot salva variabile. Sunt marcate ca "protejate" și "mascate". "Protejate" sunt utilizate doar în ramuri și etichete protejate, iar "mascate" ascund valoarea în jurnale dacă corespunde complet.

    # .gitlab-ci.yml
    # Acces la variabilă prin mediu
    script:
      - echo $MY_SECRET_VARIABLE
    
  • HashiCorp Vault: Integrare cu un depozit extern de secrete, precum HashiCorp Vault. GitLab CI se poate autentifica în Vault și poate obține secrete în timpul execuției pipeline-ului.

    # .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 # Variabila este încărcată automat din Vault
    

În GitHub Actions:

  • Secrets: La nivel de depozit sau organizație, se pot stoca secrete. Sunt disponibile în fluxurile de lucru prin ${{ secrets.MY_SECRET }}. Valorile nu sunt afișate în jurnale și nu pot fi obținute prin API după ce au fost salvate.

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

În Jenkins:

  • Credentials Plugin: Permite stocarea în mod criptat a diferitelor tipuri de acreditări (nume de utilizator/parolă, text secret, cheie SSH). Pot fi accesate în Jenkinsfile sau prin interfața grafică.

    // Jenkinsfile (Pipeline declarativ)
    pipeline {
        agent any
        stages {
            În procesul de build, unde sunt utilizate variabilele, acestea sunt de obicei disponibile ca variabile de mediu.
            stage('Folosește secretul') {
                steps {
                    withCredentials([string(credentialsId: 'my-secret-id', variable: 'MY_VAR')]) {
                        sh 'echo $MY_VAR'
                    }
                }
            }
        }
    }
    

Principii generale:

  • Minimizarea domeniului de aplicare: Secretele sunt disponibile doar în etapele și mediile în care sunt necesare.
  • Mascherarea în jurnale: Valorile secretelor sunt ascunse în jurnalele de execuție ale pipeline-ului.
  • Separarea rolurilor: Doar utilizatorii sau sistemele autorizate pot adăuga/modifica secretele.
  • Utilizarea depozitelor externe: Pentru scenarii mai complexe și gestionarea centralizată a secretelor, se utilizează Vault sau soluții similare.