İçeriğe geç

Sırlar — Parola Git'e Girerse Ne Olur?

Orta 9 dk Çok sık karşılaşılır

Önce şunu oku: Docker Katman Cache ve İmaj Boyutu

30 saniyede özet

Bir API anahtarı ya da veritabanı parolası Git'e, imaja ya da loga girerse oradan kolay kolay çıkmaz. Sırlar çalışma anında, bir sır deposundan verilmeli; sızan bir sır silinmez, değiştirilir.

Evin yedek anahtarını paspasın altına koyuyorsun, çünkü kolay. Paspası kaldıran herkes kapıyı açabilir. Anahtarı sonra oradan alsan bile, o arada kopyasını çıkaran olmuş olabilir.

  1. Bayt: Kart ağının API anahtarını application-prod.yml'e yazdım. Her şey tek yerde, ne güzel!

  2. Sen: Bu depo dış ekiple de paylaşılıyor. Anahtarı onlar da görüyor.

  3. Bayt: Hemen siliyorum... tamam, sildim ve commit'ledim.

  4. Bayt: Ama Git geçmişi hatırlıyor. Silmek yetmez; anahtarın kendisini değiştirmek gerek.

Sır nerede yaşamamalı?

Bir sır kodun yanındaki bir ayar dosyasına yazılınca Git’e girer. Git her değişikliği saklar; dosyayı silmek yalnızca son hâli değiştirir, geçmişteki kopya yerinde kalır.

Docker imajı da benzerdir. Build sırasında verilen bir sır imajın katmanlarında kalır ve imajı çeken herkes onu okuyabilir.

Kafam karıştı, daha basit anlat

Git geçmişi ve imaj katmanları unutmaz. Sır oraya bir kez girdiyse, artık sızmıştır.

Hızlı kontrolBaşlangıç

Bir parolayı application-prod.yml'e yazıp Git'e commit'lemenin sorunu nedir?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Parolayı içeren dosyayı silip yeniden commit'ledin. Parola artık güvende mi?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Çalışırken, bir depodan

Anahtar bir ortam değişkeni olarak veriliyor. Bir geliştirici hata ayıklamak için açılışta bütün ortam değişkenlerini loga yazdırdı. Anahtar nereye gider? Cevabı göster

Log toplayıcıya, düz metin olarak. Ortam değişkenleri süreç içinde herkese açıktır; loglara, hata raporlarına ve alt süreçlere kolayca sızar.

Sır, kullanılacağı anda verilir.
Adım adım oku
  1. Paspasın altındaki anahtar: kaldıran alır.
  2. Her plan kopyasına yapıştırılmış anahtar.
  3. Kapıdaki anahtar kutusu: doğru kişiye, o an.
  4. Sır, kullanılacağı anda verilir.

En sağlam yol bir sır deposuParola, anahtar ve token gibi sırları saklayan ve uygulamaya çalışırken veren sistem; örneğin Vault ya da Kubernetes sırları.Sözlükte gör →dur: Vault ya da Kubernetes’in sırları gibi. Uygulama sırrı çalışırken, örneğin bağlanmış bir dosyadan okur; sır ne kodda ne imajda ne de ortam değişkenlerinde durur.

Bir sır sızarsa yapılacak tek doğru şey sır rotasyonuBir sırrı yenisiyle değiştirip eskisini geçersiz kılmak. Sızan bir sırrı güvenli hâle getirmenin tek yolu.Sözlükte gör →dur: yeni bir sır üretip eskisini geçersiz kılmak. Sır depodaysa bu, yeniden deploy etmeden yapılabilir.

Kafam karıştı, daha basit anlat

Sırrı çalışırken bir depodan ver. Sızarsa silme, değiştir.

Hızlı kontrolOrta

Sır deposu (Vault, Kubernetes sırları) neden daha güvenlidir?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Sır rotasyonu nedir?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Kendin gör

Anahtar nerede, kim görebilir?

Tohum 350283

    Oynat ya da adımla: her adımda sıradan bir olay yaşanır.

    Hız
    Adım 0

    Şu an ne oldu?

    application-prod.yml içinde, Git’te

    Dört sıradan olay yaşanacak. Anahtar kaç yerde görünecek?

    Görevler0/3

    • Anahtarı Git geçmişine kaçıraçık

      İpucu

      Varsayılan ayarlar yeter.

    • Anahtarı imaj katmanlarına gömaçık

      İpucu

      Build sırasında ver.

    • Hiçbir yerde görünmesin ve kolayca değişsinaçık

      İpucu

      Çalışırken, bir depodan.

    Olay günlüğü (0)

    Henüz olay yok. Oynat veya adımla.

    1. Varsayılanla oynat. Anahtar Git’te: dış ekip depoyu kopyalayınca anahtar da gitti; değiştirmek zahmetliydi.
    2. “Commit öncesi sır tarayıcı”yı aç. Anahtar depoya hiç girmedi.
    3. “Docker imajında” seç. İmajı çeken herkes anahtarı katmanlardan okuyabildi.
    4. “Ortam değişkeni” seç. Açılış logu anahtarı düz metin olarak yazdı.
    5. “Sır deposu” seç. Anahtar hiçbir yerde görünmedi ve yeniden deploy etmeden değişti.
    Hızlı kontrolOrta

    Bir token Docker build argümanı olarak verildi. Ne olur?

    Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

    Bir ortam değişkenindeki anahtar loglara nasıl sızabilir?

    Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

    Tuzaklar

    Commit’i silmek yeterli sanmak: sır bir kez Git’e girdiyse, kopyalanmış her depoda ve önbellekte yaşamaya devam edebilir. Geçmişi temizlemek iyidir, ama sırrı değiştirmek şarttır.

    Build sırasında sır vermek. İmajın içinde bir parola ya da token gerekiyorsa, onu katmana yazan bir build argümanı yerine BuildKit’in sır bağlamasını kullan; sır yalnızca o adımda görünür.

    Her yerde aynı sırrı kullanmak. Test ve canlı aynı anahtarı paylaşırsa, test ortamındaki bir sızıntı canlıyı da açar. Her ortamın kendi sırrı olsun.

    Kafam karıştı, daha basit anlat

    Sızan sırrı değiştir, build’de katmana yazma, her ortama ayrı sır ver.

    Hızlı kontrolOrta

    Commit öncesi sır tarayıcının işi nedir?

    Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.
    Derinleş · Ödeme servisi: anahtar çalışırken, bir dosyadan 4 dosya · ~31 satır · ilk okumada atlayabilirsin
    Proje dosyaları

    src/main/resources/ application.yml Spring: configtree ile bağlanan dizindeki her dosya bir ayar olur; anahtar ne yml'de ne ortamda.

    src/main/resources/application.yml
    spring:
    config:
    # Each file under /run/secrets becomes a property: /run/secrets/card-network/api-key -> card-network.api-key
    import: "optional:configtree:/run/secrets/"
    card-network:
    base-url: https://api.card-network.example
    # api-key comes from the mounted file, never from this file or the environment

    deploy/ payment-service.yaml (excerpt) Kubernetes: sır bir dosya olarak bağlanıyor; ortam değişkeni olarak verilmiyor.

    deploy/payment-service.yaml (excerpt)
    spec:
    containers:
    - name: payment-service
    image: registry.bank.example/payment-service:1.42.0
    volumeMounts:
    - name: card-network
    mountPath: /run/secrets/card-network
    readOnly: true
    volumes:
    - name: card-network
    secret:
    secretName: card-network # rotated in the store; the mounted file follows
    items:
    - key: api-key
    path: api-key

    Dockerfile (build step that needs a token) Build: imajın içinde bir token gerekirse yalnızca o RUN adımında görünüyor, katmana yazılmıyor.

    Dockerfile (build step that needs a token)
    # The private Maven token is visible only during this RUN step, never in a layer.
    RUN --mount=type=secret,id=maven_token \
    MAVEN_TOKEN=$(cat /run/secrets/maven_token) ./mvnw -B -q -DskipTests package

    .pre-commit-config.yaml Commit öncesi: anahtar benzeri bir şey içeren commit daha depoya girmeden reddediliyor.

    .pre-commit-config.yaml
    repos:
    - repo: https://github.com/gitleaks/gitleaks
    rev: v8.18.4
    hooks:
    - id: gitleaks # refuses a commit that looks like it contains a key

    Kendini sına

    Şimşek turu1/4

    Parolayı içeren dosyayı silip commit'lemek, parolayı Git geçmişinden de siler.

    Soru 1/3İleri

    Test ve canlı ortam aynı veritabanı parolasını kullanıyor. Risk nedir?

    Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

    Aklında kalacak üç şey

    1. 1 Git geçmişi ve imaj katmanları kalıcıdır. Bir sırrı içeren dosyayı silmek, onu geçmişten ya da eski imajlardan silmez.
    2. 2 Sırlar uygulamaya çalışma anında, bir sır deposundan verilmelidir; ne kodda ne imajda ne de loglanabilecek bir ortam değişkeninde durmalıdır.
    3. 3 Sızan bir sır silinmez, değiştirilir. Değiştirmesi kolay bir düzen, sızıntıyı bir felaketten sıradan bir işe çevirir.
    Sonraki kapı CI kırmızı yandı. 'Tekrar çalıştır'a bastın, yeşil oldu. Bir şey düzeldi mi? Kararsız Testler — Kod Değişmedi, Test Neden Bir Kırmızı Bir Yeşil? · 9 dk

    4 kart sonraki derste seni bekliyor

    0/4 kart bu dersten toplandı