Eğer Helm grafiklerini Git'te yönetiyorsan ve şifreleri düz metin olarak tutmak istemiyorsan, SOPS ve Age ile Kubernetes secretlerini şifrelemek basit ve denetlenebilir bir yöntem. Bu kurulumu birden fazla üretim kümesinde kullandım ve GitOps akışlarını bozmadan ani sızdırımları önlemek için güvenilir buldum. Araçlar yüklüyse süreç 10 dakikadan kısa sürer ve Helm ile Flux veya Argo CD ile sorunsuz entegrasyon sağlar.
SOPS ve Age ile Secret Şifrelemesinin Nedeni
SOPS (Secrets OPerationS), Age, PGP, AWS KMS ve GCP KMS gibi çeşitli arka uçları kullanarak dosyaları şifrelemenizi sağlar. Age basit, modern ve anahtar sunucusu gerektirmez; bu da kendi barındırılan veya hava geçirmez ortamlar için ideal kılar. Sealed-secrets gibi şifre çözmeyi bir kontrolöre bağlayan yaklaşımlardan farklı olarak, SOPS ile şifrelenmiş dosyalar anahtarınız varsa her yerde çözülebilir; bu da CI/CD hatları ve olağanüstü durum kurtarma için esneklik sağlar.
Bu kullanımda PGP'ye kıyasla Age'ı tercih ederim çünkü anahtar yönetimi daha basit: şifreleme için bir ortak anahtar, şifre çözme için bir özel anahtar. Anahtar halkası karmaşıklığı yok, süresi dolan anahtarlarla ilgili baş ağrısı da yok.
SOPS ve Age'ı Kurma
Öncelikle araçları yükleyin. Linux'ta paket yöneticisini kullanabilir veya doğrudan ikili dosyaları indirebilirsiniz.
# Age'ı paket yöneticisiyle kur (Ubuntu/Debian)
sudo apt-get install -y age
# Ya da en son ikili dosyayı indir
curl -sSfL https://github.com/FiloSottile/age/releases/latest/download/age-v1.1.1-linux-amd64.tar.gz | tar -xzv
sudo mv age/age /usr/local/bin/
sudo mv age/age-keygen /usr/local/bin/
# SOPS'ı kur
curl -sSfL https://github.com/getsops/sops/releases/latest/download/sops-v3.8.1.linux.amd64 | sudo tee /usr/local/bin/sops > /dev/null
sudo chmod +x /usr/local/bin/sops
Her iki aracın da PATH'te olduğundan emin ol:
age-keygen --version
sops --version
Age Anahtar Çiftini Oluşturma
Bir anahtar çifti oluşturun. Ortak anahtar şifreleme için, özel anahtar şifre çözme için kullanılır. Özel anahtarı güvenli bir yerde saklayın — ideal olarak bir parola yöneticisi veya HSM.
age-keygen -o key.txt
Bu komut şuna benzer bir dosya oluşturur:
# public key: age1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
AGE-PRIVATE-KEY-1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Ortak anahtarı ( # public key: ile başlayan satırı) kopyalayın — dosyaları şifrelemek için buna ihtiyacınız olacak. key.txt dosyasını özel tutun ve yedekleyin.
Helm İçin Bir Secret Dosyasını Şifreleme
Uygulamanızın veritabanı şifresi için bir Kubernetes secret'iniz olduğunu varsayalım:
# secret-plain.yaml
apiVersion: v1
kind: Secret
metadata:
name: app-db-secret
namespace: production
type: Opaque
stringData:
DB_PASSWORD: super-secret-password
SOPS ile Age ortak anahtarınızı kullanarak bu dosyayı şifreleyin:
sops --encrypt --age <YOUR_PUBLIC_KEY> secret-plain.yaml > secret.enc.yaml
<YOUR_PUBLIC_KEY> kısmını key.txt dosyasındaki gerçek anahtarla değiştirin (yorum satırını çıkarın). Çıktı olan secret.enc.yaml şuna benzer görünecek:
apiVersion: v1
kind: Secret
metadata:
name: app-db-secret
namespace: production
type: Opaque
stringData:
DB_PASSWORD: ENC[AES256_GCM,data:...,tag:...,type:str]
sops:
kms: []
gcp_kms: []
azure_kms: []
hc_vault: []
age: []
lastmodified: "2024-05-10T12:34:56Z"
mac: ENC[...]
pgp: []
unencrypted_suffix: _enc
version: 3.8.1
Şimdi secret.enc.yaml dosyasını Git'e güvenle kaydedebilirsiniz. Secret şifrelidir; sadece özel anahtarını olan kişi onu çözebilir.
Helm veya kubectl İçin Secretleri Şifre Çözme
Dağıtım yaparken şifrelenmiş dosyayı anlık olarak şifre çözebilirsiniz. Şifre çözülmüş versiyonu saklamanız gerekmez.
Helm kullanıyorsan, --values ile SOPS üzerinden dosyayı işleyebilirsin:
helm upgrade --install my-app ./chart \
-f <(sops -d secret.enc.yaml)
Flux veya Argo CD kullanıyorsan, bunları sops -d komutunu şifre çözme stratejisi olarak çalıştıracak şekilde yapılandırabilirsin. Argo CD için [SOPS eklentisi](https://argo-cd.readthedocs.io/en/stable/user-guide/helm/sops/) kullanılabilir.
Şifre çözülmüş içeriği yerel olarak görmek için:
sops -d secret.enc.yaml
En İyi Uygulamalar ve Yaygın Hatalar
- Özel anahtarı asla Git'e commit etme.
key.txtdosyasını bir root parolası gibi tut. Eğer repoda saklamanız gerekiyorsa (tavsiye edilmez),git-cryptveya SOPS kendisiyle şifreleyin. - Anahtarları düzenli olarak döndür. Bir anahtarın tehlikeye girdiğini düşünüyorsan, yeni bir anahtar çifti oluşturup tüm secretleri yeniden şifrele.
.sops.yamlyapılandırmasını kullanarak her seferinde anahtar girmekten kaçın:
creation_rules:
- age: >-
age1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Daha sonra --age belirtmeden sops -e secret-plain.yaml çalıştırabilirsin.
- CI'de şifre çözmeyi test et. Şifreli dosyalarda bozulma olup olmadığını vroeg aşamada yakalamak için
sops -dadımı ekle. - Gizli olmayan dosyaları şifreleme. SOPS ekstra yük getirir; sadece şifrelenmesi gereken şeyleri (secretler, TLS sertifikaları, API anahtarları içeren konfigürasyonlar) şifrele.
Mevcut GitOps Akışınıza Entegrasyon
Zaten Helm ile GitOps kullanıyorsan, bu yöntem minimum friction getirir. Şifrelenmiş secretler Chart.yaml ve values.yaml dosyanızın yanında olur. CI pipeline'ınız, özel anahtarı bir secret olarak (GitHub Actions secrets veya GitLab CI değişkenleri gibi) enjekte ederek dağıtım sırasında bu dosyaları şifre çözer.
Daha önceki [GitOps altyapı yazımda](https://furkanikkan.com/urun/gitops-ile-altyapi-yonetimi-manuel-deploy-lara-son-58) da belirttiğim gibi, Git'te beklenen durumu tutmak sadece o durumun güvenilir olduğu sürece çalışır — ve bu, sızdırılamayacak secretleri de kapsar.
SOPS + Age, secret şifre çözmesi için bir sidecar veya kontrolör eklemeden bu güvenceyi hafif ve şeffaf bir şekilde sağlar. Ben EKS, AKS ve bare-metal Kubernetes kümesinde bu kurulumu güvenilir buldum ve adımları bildiğin sürece 10 dakikadan kısa sürede kurulabiliyor.
Git'te düz metin secretleri commitlemekten vazgeçmek için basit ve etkili bir yol arıyorsan, bu tam olarak onu sunar.
Kapak görseli: HD Wallpapers · CC0 (Openverse / kamu malı) · https://stocksnap.io/photo/light-abstract-V9L6XXK3LB
