format_list_bulletedBu İçerikte Bahsedilen Konular
- arrow_rightDocker Swarm'da Secret ve Config Yönetimi: Kapsamlı Rehber
- arrow_rightDocker Swarm Secret Nedir ve Neden Kullanılır?
- arrow_rightDocker Swarm Config Nedir?
- arrow_rightDocker Swarm Secret Oluşturma ve Kullanma
- arrow_rightSecret Oluşturma Komutları
- arrow_rightServislere Secret Ekleme
- arrow_rightExternal Secret Kullanımı
- arrow_rightDocker Swarm Config Oluşturma ve Kullanma
- arrow_rightConfig Oluşturma
- arrow_rightServislere Config Ekleme
- arrow_rightConfig Güncelleme
- arrow_rightSecret ve Config Arasındaki Farklar
- arrow_rightDocker Compose ile Secret ve Config Yönetimi
- arrow_rightEn İyi Uygulamalar ve Güvenlik Önerileri
- arrow_rightSecret Yönetimi En İyi Uygulamaları
- arrow_rightConfig Yönetimi En İyi Uygulamaları
- arrow_rightProduction Ortamında Dikkat Edilmesi Gerekenler
- arrow_rightYüksek Erişilebilirlik
- arrow_rightNetwork Güvenliği
- arrow_rightMonitoring ve Logging
- arrow_rightÖrnek: Tam Stack Uygulama Yapılandırması
Docker Swarm'da Secret ve Config Yönetimi: Kapsamlı Rehber
Docker Swarm, Kubernetes'e alternatif olarak sunulan yerel orkestrasyon çözümüdür ve container tabanlı uygulamaların yönetimini kolaylaştırır. Ancak production ortamlarında güvenlik ve konfigürasyon yönetimi kritik önem taşır. Docker Swarm'ın sunduğu Secret ve Config özellikleri, hassas verilerin ve uygulama ayarlarının güvenli bir şekilde yönetilmesini sağlar. Bu rehberde, Docker Swarm'da secret ve config yönetiminin tüm inceliklerini detaylı olarak ele alacağız.
Docker Swarm Secret Nedir ve Neden Kullanılır?
Docker Swarm Secret (sır), Docker Swarm servislerine güvenli bir şekilde iletilen hassas verileri kapsüller. Parolalar, API anahtarları, TLS sertifikaları ve veritabanı kimlik bilgileri gibi sensitive bilgiler secret olarak yönetilir. Bu veriler, Swarm manager node'lar arasında RAKT (Raft Consensus Algorithm) ile şifrelenmiş olarak iletilir ve yalnızca yetkili container'lara erişim hakkı tanınır.
Geleneksel yöntemlerde hassas bilgiler ortam değişkenleri (environment variables) aracılığıyla aktarılırdı. Ancak bu yaklaşım ciddi güvenlik açıklarına yol açar. Ortam değişkenleri, container metadata'sında ve Docker inspect çıktılarında düz metin olarak görüntülenebilir. Docker Swarm secret'leri ise Linux tmpfs üzerinde saklanır ve container durdurulduğunda otomatik olarak silinir.
Docker Swarm Config Nedir?
Config, secret'ten farklı olarak hassas olmayan konfigürasyon verilerini yönetmek için kullanılır. Nginx yapılandırma dosyaları, uygulama ayar dosyaları (JSON, YAML, TOML), sistem yapılandırmaları ve diğer statik içerikler config olarak tanımlanır. Config'ler secret'ler gibi şifrelenmiş olarak saklanır ancak container içinde düz metin olarak erişilebilir durumdadır.
Config kullanmanın en büyük avantajlarından biri, uygulama kodunu değiştirmeden yapılandırma güncellemeleri yapabilmektir. Bu sayede infrastructure as code prensipleri daha etkin uygulanır ve deployment süreçleri otomatize edilir.
Docker Swarm Secret Oluşturma ve Kullanma
Secret Oluşturma Komutları
Docker Swarm'da secret oluşturmak için docker secret create komutu kullanılır. Aşağıdaki örnekler temel secret oluşturma yöntemlerini göstermektedir:
# Dosyadan secret oluşturma
echo "veritabani_parolasi123" | docker secret create db_password -
# Direkt olarak secret oluşturma
docker secret create my_api_key api_key_degeri
# Dosyadan secret oluşturma
docker secret create nginx_ssl_cert /path/to/certificate.crt
Secret oluşturulduktan sonra docker secret ls komutu ile listelenebilir. Ancak secret değerleri güvenlik nedeniyle doğrudan görüntülenemez.
Servislere Secret Ekleme
Oluşturulan secret'ler, servis oluşturulurken veya güncellenirken container'lara monte edilir. Aşağıdaki örnek, bir MySQL servisine secret eklemeyi göstermektedir:
# Secret ile birlikte servis oluşturma
docker service create \
--name mysql_db \
--secret db_root_password \
--secret db_user_password \
-e MYSQL_ROOT_PASSWORD_FILE=/run/secrets/db_root_password \
-e MYSQL_PASSWORD_FILE=/run/secrets/db_user_password \
mysql:8.0
Secret'ler container içinde /run/secrets/ dizinine monte edilir. Dosya adı, secret adı ile aynıdır. Örneğin, db_password secret'i /run/secrets/db_password olarak erişilebilir olur.
External Secret Kullanımı
Bazı durumlarda harici secret yönetim sistemlerinden (HashiCorp Vault, AWS Secrets Manager, Azure Key Vault) secret'leri Docker Swarm'a entegre etmek gerekebilir. Bu durumda docker-compose dosyasında external secrets tanımlaması yapılabilir:
secrets:
db_password:
external: true
name: "external-secret-name"
Bu yaklaşım, mevcut secret yönetim altyapınızı Docker Swarm ile entegre etmenize olanak tanır ve Docker Compose kullanım esnekliği sağlar.
Docker Swarm Config Oluşturma ve Kullanma
Config Oluşturma
Config oluşturma süreci secret oluşturmaya benzer. docker config create komutu kullanılarak yapılandırma dosyaları Swarm'a eklenir:
# Nginx yapılandırma dosyasından config oluşturma
docker config create nginx_config /path/to/nginx.conf
# Uygulama yapılandırmasından config oluşturma
docker config create app_config config.json
# Stdinput'dan config oluşturma
cat config.yaml | docker config create app_yaml -
Servislere Config Ekleme
Config'ler, secret'lerden farklı olarak / dizinine monte edilir. Nginx servisi için config ekleme örneği:
# Nginx servisi oluşturma ve config ekleme
docker service create \
--name nginx_web \
--config src=nginx_config,target=/etc/nginx/nginx.conf \
-p 80:80 \
nginx:alpine
Config'lerin mount noktası target parametresi ile özelleştirilebilir. Birden fazla config eklemek için --config flag'i tekrarlanabilir.
Config Güncelleme
Config güncellemeleri, servis yeniden başlatılmadan uygulanamaz. Ancak Docker Swarm'ın update özelliği ile kademeli güncelleme yapılabilir:
# Config güncelleme
docker config create nginx_config_v2 /path/to/nginx_new.conf
# Servisi yeni config ile güncelleme
docker service update \
--config-rm nginx_config \
--config-add source=nginx_config_v2,target=/etc/nginx/nginx.conf \
nginx_web
Bu yakışım, zero-downtime deployment için kritik öneme sahiptir ve production ortamlarında kesintisiz hizmet sunumunu sağlar.
Secret ve Config Arasındaki Farklar
Hem secret hem de config, Docker Swarm'da encrypted olarak saklanır ve yönetilir. Ancak kullanım amaçları ve güvenlik düzeyleri farklıdır:
| Özellik | Secret | Config |
|---|---|---|
| Kullanım Amacı | Hassas veriler (parolalar, API anahtarları) | Genel yapılandırma dosyaları |
| Şifreleme | RAKT ile şifreli, tmpfs'te saklanır | Şifreli saklanır |
| Container Erişimi | /run/secrets/ dizininde dosya olarak | Belirtilen hedef dizinde |
| Görünürlük | Container içinde düz metin ama inspect'te görünmez | Container içinde düz metin |
| Otomatik Temizleme | Container durduğunda silinir | td> Veriler kalıcı olarak saklanır
Docker Compose ile Secret ve Config Yönetimi
Docker Compose dosyalarında secret ve config tanımlamak, geliştirme ve test ortamlarında büyük kolaylık sağlar. Aşağıda kapsamlı bir örnek verilmiştir:
version: '3.8'
services:
web:
image: nginx:alpine
configs:
- source: nginx_conf
target: /etc/nginx/nginx.conf
secrets:
- db_password
- api_key
configs:
nginx_conf:
file: ./nginx.conf
secrets:
db_password:
file: ./secrets/db_password.txt
api_key:
external: true
Bu yapılandırma, hem local dosyalardan hem de harici sistemlerden secret ve config yönetimini destekler. Docker Compose kullanımı ile stack deploy komutu tek seferde tüm yapılandırmayı uygulayabilir.
En İyi Uygulamalar ve Güvenlik Önerileri
Secret Yönetimi En İyi Uygulamaları
- Minimal Yetki Prensibi: Her servise yalnızca ihtiyaç duyduğu secret'leri ekleyin. Gereksiz secret erişimi güvenlik riski oluşturur.
- Düzenli Rotasyon: Secret'leri düzenli aralıklarla güncelleyin. Özellikle personelin ayrılması veya güvenlik ihlali şüphesi durumunda immediately değiştirin.
- Harici Secret Yönetimi: Büyük ölçekli ortamlarda HashiCorp Vault veya bulut tabanlı secret yönetim servislerini kullanın.
- Log İzleme: Secret'lere erişim log'larını izleyin ve şüpheli aktiviteleri tespit edin.
- Encryption at Rest: Docker Swarm, secret'leri disk üzerinde şifreli saklar. Ancak ek güvenlik katmanı için Volume Encryption kullanın.
Config Yönetimi En İyi Uygulamaları
- Versiyon Kontrolü: Config dosyalarını Git gibi versiyon kontrol sistemlerinde saklayın.
- Şablon Kullanımı: Environment bazlı değişkenler için template sistemleri kullanın.
- Config Validation: Deploy öncesi config dosyalarını doğrulayın.
- Immutable Config: Mümkünse config'leri immutable olarak deploy edin ve değişiklik için yeni versiyon oluşturun.
Production Ortamında Dikkat Edilmesi Gerekenler
Yüksek Erişilebilirlik
Production ortamlarında en az 3 manager node kullanılması önerilir. Bu, RAKT consensus algoritmasının sağlıklı çalışması ve yüksek erişilebilirlik için gereklidir. Manager node sayısı arttıkça, secret ve config yönetimi daha güvenli hale gelir.
Felaket kurtarma planlaması kapsamında secret ve config yedekleme stratejileri oluşturulmalıdır. Manager node'lar arasında secret dağılımı otomatik yapılır, ancak emergency durumları için yedekleme prosedürleri belgelenmelidir.
Network Güvenliği
Docker Swarm overlay ağları, secret'lerin node'lar arasında şifrelenmiş iletilmesini sağlar. Ancak ek güvenlik için:
- Manager ve worker node'ları ayrı ağlarda izole edin
- Güvenlik duvarı kuralları ile port erişimini kısıtlayın
- Node authentication için mutual TLS kullanın
Monitoring ve Logging
Secret ve config operasyonlarını izlemek için merkezi log sistemi kurun. Aşağıdaki metrikler takip edilmelidir:
- Secret oluşturma/güncelleme/silme operasyonları
- Config değişiklikleri ve deployment'lar
- Yetkisiz erişim denemeleri
- Servis restart'ları ve config reload olayları
Bu metrikler için Prometheus ve Grafana gibi araçlar kullanılabilir. Özellikle kendi analytics servisinizi host etmek gibi izleme gereksinimleri için altyapı oluşturulabilir.
Örnek: Tam Stack Uygulama Yapılandırması
Aşağıda, Docker Swarm üzerinde çalışan çok katmanlı bir uygulamanın secret ve config yapılandırması verilmiştir:
# Stack dosyası: docker-stack.yml
version: '3.8'
services:
api:
image: myapp/api:latest
environment:
- NODE_ENV=production
secrets:
- db_credentials
- redis_password
- jwt_secret
configs:
- source: api_config
target: /app/config/production.json
deploy:
replicas: 3
update_config:
parallelism: 1
delay: 10s
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
configs:
- source: nginx_main
target: /etc/nginx/nginx.conf
- source: nginx_ssl_certs
target: /etc/nginx/ssl/cert.pem
secrets:
- source: ssl_key
target