Sobes.tech
Middle

CI'de değişkenleri nasıl şifreliyorsunuz?

sobes.tech yapay zeka

AI'dan gelen yanıt

CI sisteminin yerleşik özelliklerini kullanarak değişkenleri şifreliyorum. GitLab CI/CD, GitHub Actions veya Jenkins olsun, her CI sistemi gizli bilgileri güvenli bir şekilde saklamak için fonksiyonlara sahiptir. Bu değişkenler, derleme hattının belirli aşamalarında erişilebilir olup, günlüklerde gösterilmez.

Örneğin, GitLab CI'de:

  • Ortam değişkenleri: Grup veya proje seviyesinde değişkenler saklanabilir. "Korunmuş" ve "maskelenmiş" olarak işaretlenirler. "Korunmuş" olanlar sadece korunmuş dallarda ve etiketlerde kullanılır, "maskelenmiş" olanlar ise tamamen eşleştiğinde değeri günlüklerde gizler.

    # .gitlab-ci.yml
    # Ortam değişkenine erişim
    script:
      - echo $MY_SECRET_VARIABLE
    
  • HashiCorp Vault: HashiCorp Vault gibi harici gizli saklama alanlarıyla entegrasyon. GitLab CI, Vault'ta kimlik doğrulaması yapabilir ve çalışma sırasında gizli bilgileri alabilir.

    # .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 # Vault'tan otomatik olarak yüklenmiş değişken
    

GitHub Actions'ta:

  • Secrets: Depo veya organizasyon seviyesinde gizli bilgiler saklanabilir. İş akışlarında ${{ secrets.MY_SECRET }} ile erişilir. Değerler günlüklerde gösterilmez ve kaydedildikten sonra API aracılığıyla alınamaz.

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

Jenkins'te:

  • Credentials Plugin: Farklı kimlik bilgisi türlerini (kullanıcı adı/parola, gizli metin, SSH anahtarı) şifreli biçimde saklamaya imkan tanır. Jenkinsfile veya grafik arayüz üzerinden erişilebilir.

    // Jenkinsfile (Deklaratif Pipeline)
    pipeline {
        agent any
        stages {
            Build aşamasında, değişkenler kullanılırken, genellikle ortam değişkenleri olarak erişilebilirler.
            stage('Gizli bilgiyi kullan') {
                steps {
                    withCredentials([string(credentialsId: 'my-secret-id', variable: 'MY_VAR')]) {
                        sh 'echo $MY_VAR'
                    }
                }
            }
        }
    }
    

Genel ilkeler:

  • Kapsamın en aza indirilmesi: Gizli bilgiler sadece ihtiyaç duyulan aşamalarda ve ortamlarda erişilebilir olmalıdır.
  • Günlükleri gizleme: Gizli bilgilerin değerleri, pipeline çalıştırma günlüklerinde gizlenir.
  • Rollerin ayrılması: Sadece yetkili kullanıcılar veya sistemler gizli bilgileri ekleyip değiştirebilir.
  • Harici depolama kullanımı: Daha karmaşık senaryolar ve merkezi gizli bilgi yönetimi için Vault veya benzeri çözümler kullanılır.