Sobes.tech
Middle

Jak šifrujete proměnné v CI?

sobes.tech AI

Odpověď od AI

Šifruji proměnné pomocí vestavěných funkcí CI systému. Každý CI systém, ať už GitLab CI/CD, GitHub Actions nebo Jenkins, má funkce pro bezpečné ukládání tajných údajů. Tyto proměnné jsou dostupné pouze na určitých etapách sestavovacího procesu a nejsou zobrazeny v logu.

Například v GitLab CI:

  • Proměnné prostředí: Na úrovni skupiny nebo projektu lze uložit proměnné. Jsou označeny jako "chráněné" a "maskované". "Chráněné" jsou použitelné pouze na chráněných větvích a značkách, "maskované" skrývají hodnotu v logu, pokud se úplně shoduje.

    # .gitlab-ci.yml
    # Přístup k proměnné přes prostředí
    script:
      - echo $MY_SECRET_VARIABLE
    
  • HashiCorp Vault: Integrace s externím úložištěm tajných údajů, například HashiCorp Vault. GitLab CI se může autentizovat do Vault a získávat tajné údaje během běhu 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 # Proměnná je automaticky načtena z Vault
    

V GitHub Actions:

  • Secrets: Na úrovni repozitáře nebo organizace lze ukládat tajné údaje. Jsou dostupné ve workflow přes ${{ secrets.MY_SECRET }}. Hodnoty nejsou zobrazeny v logu a po uložení je nelze získat přes API.

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

V Jenkins:

  • Credentials Plugin: Umožňuje ukládat různé typy přihlašovacích údajů (uživatelské jméno/heslo, tajný text, SSH klíč) v zašifrované podobě. K nim lze získat přístup v Jenkinsfile nebo přes grafické rozhraní.

    // Jenkinsfile (Declarative Pipeline)
    pipeline {
        agent any
        stages {
            V rámci pracovního procesu sestavení, kde jsou proměnné používány, jsou obvykle dostupné jako proměnné prostředí.
            stage('Use Secret') {
                steps {
                    withCredentials([string(credentialsId: 'my-secret-id', variable: 'MY_VAR')]) {
                        sh 'echo $MY_VAR'
                    }
                }
            }
        }
    }
    

Obecné principy:

  • Minimalizace rozsahu: Tajné údaje jsou dostupné pouze na těch etapách a v těch prostředích, kde jsou potřeba.
  • Maskování logů: Hodnoty tajných údajů jsou skryty v logu běhu pipeline.
  • Oddělení rolí: Pouze autorizovaní uživatelé nebo systémy mohou přidávat/měnit tajné údaje.
  • Použití externích úložišť: Pro složitější scénáře a centralizované řízení tajných údajů se používají Vault nebo podobná řešení.