Yazılara geri dön
Yazı

Argo CD'de SOPS Şifrelenmiş Gizli Anahtarlarından Helm Değerlerini Enjekte Et

SOPS ve Argo CD'nin Helm eklentisini kullanarak, Git'te gizli bilgileri açığa çıkarmadan şifrelenmiş Helm değerlerini güvenli bir şekilde nasıl enjekte edeceğinizi öğrenin.

DevopsArgo CDSOPSHelmKubernetesAge

Bu bölüm metnini Türkçeye çevir. Anlam aynı kalsın. İngilizce cümle bırakma.

Helm grafiklerini Git'te yönetiyorsanız ve hassas değerleri düz metin olarak tutmak zorunda kalmıyorsanız, SOPS sağlam bir seçenektir. Kubernetes secretlerini şifrelemek için kullandım ve Helm değerleri için de aynı şekilde iyi çalışır. İşte Argo CD'nin senkronizasyon sırasında bu değerleri anahtarları göstermek veya otomasyonu bozmadan şifresini çözmesi için gerekli olan şey.

Kurulumumda, values.yaml.sops dosyasını Helm grafiği deposunda tutuyorum; bu dosya, CI/CD hizmet hesabımıza bağlı bir SOPS anahtarı üzerinden Age ile şifrelenmiş. Argo CD SOPS'i yerel olarak anlayamaz, ancak Helm eklentisi, helm.values parametresi üzerinden bir dosya yolu ile harici değer kaynaklarını destekler — ve bu, şifre çözme adımını enjekte edebileceğimiz yerdir.

İlk olarak, SOPS şifre çözme anahtarının Argo CD uygulama kontrolörü tarafından erişilebilir olduğundan emin olun. Ben bunu, argocd-application-controller pod'una bir Kubernetes Secret olarak monte ediyorum:

kubectl create secret generic sops-age-key \
  --from-file=keys.txt=/path/to/age/key.txt \
  -n argocd

Ardından kontrolörü bu anahtarı monte edecek şekilde yama yapın:

kubectl patch deployment argocd-application-controller \
  -n argocd \
  --type='json' \
  -p='[{"op":"add","path":"/spec/template/spec/volumes/-","value":{"name":"sops-key","secret":{"secretName":"sops-age-key"}}},{"op":"add","path":"/spec/template/spec/containers/0/volumeMounts/-","value":{"name":"sops-key","mountPath":"/sops/keys","readOnly":true}}]'

SOPS age anahtar dosyasını ortam değişkeni üzerinden ayarlayın:

kubectl set env deployment/argocd-application-controller \
  SOPS_AGE_KEY_FILE=/sops/keys/keys.txt \
  -n argocd

Artık Argo CD, SOPS çağrıldığında .sops dosyalarını şifresini çözebilir. Sonra, Helm grafiğinin şifresi çözülmüş değerleri kullanmasını yapılandırın. Application manifestinizde, şifrelenmiş dosyayı gösterin ancak Argo CD'nin Helm eklentisi tarafından bir kabuk sarmalayıcı üzerinden işlenmesini sağlayın:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-app
spec:
  source:
    helm:
      valueFiles:
        - values.yaml.sops
      parameters:
        - name: values.yaml.sops
          value: "$(sops -d {{ .ValuesFile }})"

Bekleyin — bu doğrudan çalışmayacak çünkü Helm, valueFiles içinde shell komutlarını değerlendirmez. Bunun yerine, geçici olarak dosyayı şifresini çözmek için bir pre-sync kancası kullanıyorum:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-app
  annotations:
    argocd.argoproj.io/hook: PreSync
    argocd.argoproj.io/hook-delete-policy: HookSucceeded
spec:
  source:
    path: charts/my-app
    helm:
      valueFiles:
        - values.yaml.decrypted  # kancada üretilen dosya

Ve kancayı (ConfigMap veya satır içi olarak):

apiVersion: v1
kind: ConfigMap
metadata:
  name: decrypt-values-hook
  labels:
    app.kubernetes.io/part-of: my-app
data:
  decrypt.sh: |
    #!/usr/bin/env bash
    set -euo pipefail
    SOPS_AGE_KEY_FILE=/sops/keys/keys.txt sops -d charts/my-app/values.yaml.sops > charts/my-app/values.yaml.decrypted

Bu ConfigMap'i geçici bir iş veya initContainer'a monte edebilirsiniz — ancak basitlik için, SOPS ile önceden derlenmiş ve valueFiles'i Helm çalıştırmadan önce ön işleme yapan bir sarmalayıcı komut dosyası olan değiştirilmiş bir Argo CD imajına güveniyorum.

Daha temiz bir yaklaşım? helm.values parametresini file:// URL'si ve bir harici şifre çözme adımıyla bir eklentiyle kullanmak. Ancak Argo CD'nin mevcut eklenti modeli göz önüne alındığında, güvenilir bulduğum yöntem, SOPS anahtarına erişimi olan bir Presync kancasında değerleri önceden işlemek ve şifresi çözülmüş bir values.yaml.decrypted dosyasını grafik dizinine yazmaktır — ardından Helm bu dosyayı normal şekilde okur.

Şifre çözüldükten sonra, Argo CD Helm senkronizasyonunu normal şekilde devam ettirir. Şifresi çözülmüş dosya geçicidir — sadece senkronizasyon sırasında konteynerde bulunur ve deposunda kalmaz.

jsonnet veya helmfile kullanmayı deneyen ekipleri gördüm, ancak zaten Argo CD + Helm kullanıyorsanız, bir Presync kancası eklemek şeyleri minimumda tutar. Hatırlatayım: SOPS anahtarı sıkı bir şekilde kapsamlandırılmalıdır. Ben sadece salt okunur olarak sınırlıyorum, sadece kontrolörde monte ediyorum ve erişimi Kubernetes RBAC üzerinden denetliyorum.

Önceki yazımda [SOPS ve Age ile Kubernetes secretlerini Git'te şifreleme](https://furkanikkan.com/urun/kubernetes-secretlerini-git-te-sops-ve-age-ile-sifreleme-69) konusunda belirttiğim gibi, burada da aynı anahtar yönetimi ilkeleri geçerli — Age anahtarını periyodik olarak döndürün ve Git'te saklamayın.

Bir dikkat etmeniz gereken durum: Helm grafiğiniz Argo CD yapılandırmasında başka yerlerde --set veya --values bayrakları kullanıyorsa, bunların şifresi çözülmüş dosyayı geçersiz kılmadığından emin olun. Önceden belirlenebilir bir öncelik sağlamak için Application spesifikasyonunda sadece valueFiles kullanmaya sadık kalırım.

Bu desen, values.yaml.sops dosyasını Git'te tutmanızı — incelebilir, fark görülebilir, denetlenebilir — sağlarken, sırların deposunuzda veya Argo CD günlüklerinde düz metin olarak görünmesini önler. Büyü değil, ama pratik operasyon: önemli olanları şifrele, sadece gerektiğinde ve gerektiği yerde şifresini çöz, ve araç zincirinin geri kalanını halletmesini bırak.


Kapak görseli: HD Wallpapers · CC0 (Openverse / kamu malı) · https://stocksnap.io/photo/light-abstract-V9L6XXK3LB