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ń.