Sobes.tech
Middle

Kako šifrujete promenljive u CI?

sobes.tech АИ

Одговор од АИ

Šifrujem promenljive koristeći ugrađene mogućnosti CI sistema. Svaki CI sistem, bilo GitLab CI/CD, GitHub Actions ili Jenkins, ima funkcije za sigurno skladištenje tajni. Ove promenljive su dostupne samo na određenim fazama izgradnje i nisu prikazane u logovima.

Na primer, u GitLab CI:

  • Promenljive okruženja: Na nivou grupe ili projekta mogu se sačuvati promenljive. Obeležavaju se kao "zaštićene" i "maskirane". "Zaštićene" se koriste samo u zaštićenim granama i oznakama, "maskirane" skrivaju vrednost u logovima ako se potpuno poklapaju.

    # .gitlab-ci.yml
    # Pristup promenljivoj putem okruženja
    script:
      - echo $MY_SECRET_VARIABLE
    
  • HashiCorp Vault: Integracija sa spoljnjim skladištem tajni, poput HashiCorp Vault. GitLab CI može da se autentifikuje u Vault i da dobije tajne tokom izvršavanja cevi.

    # .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 # Promenljiva je automatski učitana iz Vault-a
    

U GitHub Actions:

  • Secrets: Na nivou repozitorijuma ili organizacije mogu se čuvati tajne. Dostupne su u radnim tokovima putem ${{ secrets.MY_SECRET }}. Vrednosti se ne prikazuju u logovima i ne mogu biti dobijene putem API-ja nakon čuvanja.

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

U Jenkins-u:

  • Credentials Plugin: Omogućava čuvanje različitih tipova akreditiva (korisničko ime/lozinka, tajni tekst, SSH ključ) u šifrovanom obliku. Do njih se može doći u Jenkinsfile ili putem grafičkog interfejsa.

    // Jenkinsfile (Deklarativni pipeline)
    pipeline {
        agent any
        stages {
            U okviru radnog procesa izgradnje, gde se koriste promenljive, one su obično dostupne kao promenljive okruženja.
            stage('Use Secret') {
                steps {
                    withCredentials([string(credentialsId: 'my-secret-id', variable: 'MY_VAR')]) {
                        sh 'echo $MY_VAR'
                    }
                }
            }
        }
    }
    

Opšti principi:

  • Minimizacija opsega: Tajne su dostupne samo na onim etapama i u okruženjima gde su potrebne.
  • Maskiranje logova: Vrednosti tajnih se skrivaju u logovima izvršenja.
  • Razdvajanje uloga: Samo ovlašćeni korisnici ili sistemi mogu dodavati/menjati tajne.
  • Korišćenje spoljašnjih skladišta: Za složenije scenarije i centralizovano upravljanje tajnama koriste se Vault ili slična rešenja.