Sobes.tech
Middle

Ako šifrujete premenné v CI?

sobes.tech AI

Odpoveď od AI

Šifrujem premenné pomocou vstavaných možností CI systému. Každý CI systém, či už GitLab CI/CD, GitHub Actions alebo Jenkins, má funkcie na bezpečné uloženie tajných údajov. Tieto premenné sú dostupné iba na určitých etapách zostavovacieho procesu a nie sú zobrazené v logoch.

Napríklad v GitLab CI:

  • Premenné prostredia: Na úrovni skupiny alebo projektu je možné uložiť premenné. Sú označené ako "chránené" a "maskované". "Chránené" sa používajú iba v chránených vetvách a značkách, "maskované" skrývajú hodnotu v logoch, ak sa úplne zhodujú.

    # .gitlab-ci.yml
    # Prístup k premennej cez prostredie
    script:
      - echo $MY_SECRET_VARIABLE
    
  • HashiCorp Vault: Integrácia s externým úložiskom tajných údajov, ako je HashiCorp Vault. GitLab CI sa môže autentifikovať vo Vault a získať tajné údaje počas behu 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 # Premenná je automaticky načítaná z Vault
    

V GitHub Actions:

  • Secrets: Na úrovni repozitára alebo organizácie je možné ukladať tajné údaje. Sú dostupné vo workflow cez ${{ secrets.MY_SECRET }}. Hodnoty sa nezobrazujú v logoch a nie je možné ich získať cez API po uložení.

    # .github/workflows/main.yml
    jobs:
      build:
        runs-on: ubuntu-latest
        steps:
        - name: Použiť tajný údaj
          run: echo ${{ secrets.MY_SECRET }}
    

V Jenkins:

  • Credentials Plugin: Umožňuje ukladať rôzne typy prihlasovacích údajov (používateľské meno/heslo, tajný text, SSH kľúč) v zašifrovanej podobe. K nim je možné získať prístup v Jenkinsfile alebo cez grafické rozhranie.

    // Jenkinsfile (Deklaratívny pipeline)
    pipeline {
        agent any
        stages {
            V rámci pracovného procesu zostavenia, kde sa používajú premenné, sú obvykle dostupné ako premenné prostredia.
            stage('Use Secret') {
                steps {
                    withCredentials([string(credentialsId: 'my-secret-id', variable: 'MY_VAR')]) {
                        sh 'echo $MY_VAR'
                    }
                }
            }
        }
    }
    

Všeobecné princípy:

  • Minimalizácia rozsahu: Tajné údaje sú dostupné iba na tých etapách a v tých prostrediach, kde sú potrebné.
  • Maskovanie logov: Hodnoty tajných údajov sú skryté v logu behu pipeline.
  • Oddelenie rolí: Iba autorizovaní používatelia alebo systémy môžu pridávať/meniť tajné údaje.
  • Použitie externých úložísk: Pre zložitejšie scenáre a centralizované riadenie tajných údajov sa používajú Vault alebo podobné riešenia.