Sobes.tech
Middle

Jak szyfrujesz zmienne w CI?

sobes.tech AI

Odpowiedź od AI

Szyfruję zmienne, korzystając z wbudowanych funkcji systemu CI. Każdy system CI, czy to GitLab CI/CD, GitHub Actions czy Jenkins, ma funkcje do bezpiecznego przechowywania sekretów. Te zmienne są dostępne tylko na określonych etapach potoku budowania i nie są wyświetlane w logach.

Na przykład w GitLab CI:

  • Zmienne środowiskowe: Na poziomie grupy lub projektu można zapisać zmienne. Są oznaczone jako "chronione" i "maskowane". "Chronione" są używane tylko na chronionych gałęziach i tagach, "maskowane" ukrywają wartość w logach, jeśli jest całkowicie zgodna.

    # .gitlab-ci.yml
    # Dostęp do zmiennej przez środowisko
    script:
      - echo $MY_SECRET_VARIABLE
    
  • HashiCorp Vault: Integracja z zewnętrznym magazynem sekretów, takim jak HashiCorp Vault. GitLab CI może uwierzytelnić się w Vault i pobierać sekrety podczas wykonywania potoku.

    # .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 # Zmienna jest automatycznie ładowana z Vault
    

W GitHub Actions:

  • Secrets: Na poziomie repozytorium lub organizacji można przechowywać sekrety. Dostępne w przepływach pracy przez ${{ secrets.MY_SECRET }}. Wartości nie są wyświetlane w logach i nie można ich pobrać przez API po zapisaniu.

    # .github/workflows/main.yml
    jobs:
      build:
        runs-on: ubuntu-latest
        steps:
        - name: Użyj sekretnych danych
          run: echo ${{ secrets.MY_SECRET }}
    

W Jenkins:

  • Credentials Plugin: Pozwala na bezpieczne przechowywanie różnych typów danych uwierzytelniających (nazwa użytkownika/hasło, tekst tajny, klucz SSH). Mogą być dostępne w Jenkinsfile lub przez interfejs graficzny.

    // Jenkinsfile (Pipeline deklaratywne)
    pipeline {
        agent any
        stages {
            W procesie budowania, gdzie używane są zmienne, są one zazwyczaj dostępne jako zmienne środowiskowe.
            stage('Użyj sekretu') {
                steps {
                    withCredentials([string(credentialsId: 'my-secret-id', variable: 'MY_VAR')]) {
                        sh 'echo $MY_VAR'
                    }
                }
            }
        }
    }
    

Ogólne zasady:

  • Minimalizacja zakresu: Sekrety są dostępne tylko na etapach i w środowiskach, gdzie są potrzebne.
  • Maskowanie logów: Wartości sekretów są ukryte w logach wykonywania pipeline.
  • Rozdzielenie ról: Tylko uprawnieni użytkownicy lub systemy mogą dodawać/zmieniać sekrety.
  • Użycie zewnętrznych magazynów: Dla bardziej złożonych scenariuszy i centralnego zarządzania sekretami używa się Vault lub podobnych rozwiązań.