Docker Güvenliği: Konteyner Güvenliği İçin Kapsamlı Rehber
Yazar: Burak Balkı | Kategori: Security | Okuma Süresi: 9 dk
Docker güvenliği için kapsamlı rehber: İmaj tarama, runtime izolasyonu, ağ güvenliği ve best practices yöntemleriyle konteynerlerinizi profesyonelce koruyun.
## Docker Güvenliği Nedir ve Neden Önemlidir?
**Docker güvenliği**, modern yazılım geliştirme süreçlerinde konteynerize edilmiş uygulamaların çalışma zamanı (runtime), imaj ve altyapı katmanlarında korunmasını ifade eder. Mikroservis mimarilerinin yaygınlaşmasıyla birlikte, saldırı yüzeyinin genişlemesi güvenlik stratejilerini kritik hale getirmiştir. Docker, doğası gereği izolasyon sağlasa da, yanlış yapılandırmalar tüm ana makinenin (host) ele geçirilmesine neden olabilir.
Bu rehberde, Docker ekosisteminde güvenliği sağlamak için kullanılan mekanizmaları, en iyi uygulamaları ve ileri seviye yapılandırma tekniklerini ele alacağız.
## Docker Güvenlik Mimarisi: Temel Kavramlar
Docker'ın güvenlik modeli, Linux çekirdeğinin sağladığı dört ana özelliğe dayanır. Bu özelliklerin doğru anlaşılması, güvenli bir mimari kurmanın ilk adımıdır.
### 1. Namespaces (İsim Alanları)
Namespaces, Docker'ın izolasyon sağladığı temel katmandır. Bir konteynerin diğer konteynerleri veya ana sistemi görmesini engeller.
- **PID namespace:** Süreç izolasyonu.
- **NET namespace:** Ağ arayüzü izolasyonu.
- **MNT namespace:** Dosya sistemi bağlama noktası izolasyonu.
### 2. Control Groups (cgroups)
Cgroups, kaynak kullanımını sınırlar. Bir konteynerin sistemdeki tüm CPU veya RAM kaynaklarını tüketerek bir **Denial of Service (DoS)** saldırısına neden olmasını engeller.
### 3. Docker Daemon Güvenliği
Docker daemon (`dockerd`) varsayılan olarak `root` yetkileriyle çalışır. Bu durum, daemon üzerindeki bir açığın tüm sisteme yayılması riskini taşır. Bu nedenle **Rootless Mode** kullanımı önem kazanmaktadır.
## Docker Kurulumu ve Güvenli Yapılandırma
Docker'ı kurarken ve yapılandırırken varsayılan ayarları değiştirmek güvenliği artırır. İlk adım olarak Docker daemon'ın sadece yetkili kullanıcılar tarafından erişilebilir olduğundan emin olunmalıdır.
### Rootless Docker Kurulumu
Rootless mod, Docker daemon ve konteynerlerin root yetkisi olmadan çalışmasını sağlar.
```bash
# Rootless kurulum betiğini çalıştırın
curl -fsSL https://get.docker.com/rootless | sh
# Ortam değişkenlerini ayarlayın
export DOCKER_HOST=unix:///run/user/1000/docker.sock
```
### Docker Bench for Security Kullanımı
Sisteminizin CIS Docker Benchmark standartlarına uygunluğunu denetlemek için bu aracı kullanabilirsiniz:
```bash
docker run --rm -it --net host --pid host --userns host --cap-add audit_control \
-e DOCKER_CONTENT_TRUST=$DOCKER_CONTENT_TRUST \
-v /etc:/etc:ro -v /usr/bin:/usr/bin:ro -v /lib/systemd:/lib/systemd:ro \
-v /var/lib:/var/lib:ro -v /var/run/docker.sock:/var/run/docker.sock:ro \
--label docker_bench_security docker/docker-bench-security
```
## Docker İmaj Güvenliği ve Vulnerability Scanning
Güvenli bir konteyner yapısı, güvenli bir imajla başlar. Public registry'lerden (Docker Hub gibi) çekilen imajlar kötü amaçlı yazılımlar içerebilir.
### 1. Minimal Base Images Kullanımı
İmaj boyutunu ve saldırı yüzeyini küçültmek için `alpine` veya `distroless` imajlar tercih edilmelidir.
```dockerfile
# Kötü Uygulama
FROM ubuntu:latest
# İyi Uygulama (Minimalist)
FROM alpine:3.18
```
### 2. İmaj Tarama (Vulnerability Scanning)
Trivy gibi araçlar kullanarak imajlardaki açıkları CI/CD sürecinde tespit edebilirsiniz.
```bash
# Trivy ile bir imajı tarama
trivy image --severity HIGH,CRITICAL python:3.9-slim
```
### 3. Docker Content Trust (DCT)
DCT, imajların dijital olarak imzalanmasını ve doğrulanmasını sağlar. Bu sayede sadece güvenilir kaynaklardan gelen imajların çalıştırılması garanti edilir.
```bash
export DOCKER_CONTENT_TRUST=1
docker pull my-trusted-repo/app:latest
```
## Runtime Güvenliği ve Konteyner İzolasyonu
Konteynerler çalışırken yetkilerini kısıtlamak, olası bir sızma durumunda saldırganın hareket alanını daraltır.
### Privileged Mode Kullanımından Kaçının
`--privileged` bayrağı, konteynere host makinesindeki tüm aygıtlara erişim yetkisi verir. Bu kesinlikle kaçınılması gereken bir durumdur.
### Salt Okunur Dosya Sistemi
Konteynerin çalışma zamanında kendi dosya sistemine yazmasını engellemek, zararlı yazılımların kalıcılık sağlamasını önler.
```bash
docker run --read-only --tmpfs /tmp my-app:latest
```
### Linux Capabilities Kısıtlaması
Konteynerin ihtiyaç duymadığı çekirdek yetkilerini kaldırın:
```bash
docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE my-app:latest
```
## Docker Network Güvenliği ve Firewall Ayarları
Varsayılan Docker ağı (bridge), konteynerlerin birbirleriyle iletişim kurmasına izin verir. Ancak bu, yanal hareket (lateral movement) riskini artırır.
### İzole Ağlar Oluşturma
Uygulamaları mantıksal olarak birbirinden ayırmak için özel ağlar (user-defined networks) kullanın.
```bash
# İzole bir ağ oluşturma
docker network create --internal private-net
# Konteyneri bu ağa dahil etme
docker run --network private-net my-db-app
```
| Ağ Tipi | Güvenlik Seviyesi | Kullanım Senaryosu |
| :--- | :--- | :--- |
| Bridge | Orta | Genel uygulamalar |
| Host | Düşük | Yüksek performans gereksinimi |
| None | Çok Yüksek | Ağ bağlantısı gerektirmeyen işlemler |
| Overlay | Orta | Swarm/Multi-host iletişim |
## Docker Secrets ve Hassas Veri Yönetimi
API anahtarları, veritabanı şifreleri ve sertifikalar asla Dockerfile içinde veya ortam değişkenlerinde (Environment Variables) tutulmamalıdır. Ortam değişkenleri `docker inspect` komutuyla kolayca görülebilir.
### Docker Secrets Kullanımı (Swarm Mode)
```bash
# Secret oluşturma
echo "my_super_secret_password" | docker secret create db_password -
# Servise secret ekleme
docker service create --name web --secret db_password my-web-app
```
## Docker Güvenliği İçin En İyi Uygulamalar (Best Practices)
1. **USER Talimatını Kullanın:** Konteyner içinde asla root kullanıcısı ile uygulama çalıştırmayın.
2. **Kaynak Limitleri Koyun:** Bellek ve CPU limitleri belirleyerek kaynak tükenmesini önleyin.
3. **Güncel Kalın:** Docker Engine ve temel imajları düzenli olarak güncelleyin.
4. **Logging Yapılandırın:** Logları host dışındaki merkezi bir sisteme (ELK, Graylog) aktarın.
5. **SSH Kullanmayın:** Konteyner içine SSH sunucusu kurmayın, `docker exec` kullanın.
```dockerfile
# Güvenli Dockerfile Örneği
FROM node:18-alpine
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
WORKDIR /app
COPY package*.json ./
RUN npm install --production
COPY . .
USER appuser
EXPOSE 3000
CMD ["node", "index.js"]
```
## Yaygın Yapılan Docker Güvenlik Hataları
- **Docker Socket'i Mount Etmek:** `/var/run/docker.sock` dosyasını bir konteynere mount etmek, o konteynere host üzerinde tam yetki verir.
- **Hassas Verileri İmaj Katmanlarında Bırakmak:** `COPY` veya `ADD` ile eklenen dosyalar silinse bile önceki katmanlarda kalır. Multi-stage build kullanarak bu riski azaltın.
- **Default Bridge Kullanımı:** Tüm konteynerlerin aynı ağda olması sızma sonrası keşif işlemlerini kolaylaştırır.
## Docker Performans ve Güvenlik Optimizasyonu
Güvenlik önlemleri bazen performans üzerinde yük oluşturabilir. Örneğin, yoğun I/O işlemlerinde `read-only` dosya sistemi kullanımı veya karmaşık firewall kuralları gecikmelere yol açabilir. Ancak, **seccomp** profilleri ve **AppArmor** gibi güvenlik modülleri, doğru yapılandırıldığında sistem çağrılarını filtreleyerek hem güvenliği artırır hem de gereksiz süreçlerin çalışmasını engelleyerek performansa dolaylı katkı sağlar.
```bash
# Özel bir seccomp profili ile çalıştırma
docker run --security-opt seccomp=/path/to/profile.json my-app
```
## Sık Sorulan Sorular (FAQ)
> **Soru 1: Docker konteynerleri sanal makineler (VM) kadar güvenli mi?**
> Cevap: Hayır. VM'ler donanım seviyesinde izolasyon sağlarken, Docker konteynerleri aynı işletim sistemi çekirdeğini paylaşır. Ancak doğru yapılandırma ile Docker, üretim ortamları için yeterli güvenliği sağlar.
> **Soru 2: `docker scan` komutu nedir?**
> Cevap: Docker'ın yerleşik imaj tarama komutudur (Snyk tabanlı). İmajlarınızdaki bilinen güvenlik açıklarını (CVE) listeler.
> **Soru 3: Docker imajlarını neden root kullanıcısıyla çalıştırmamalıyız?**
> Cevap: Eğer bir saldırgan uygulamadaki bir açıktan yararlanarak konteyner içinde kod çalıştırırsa, root yetkilerine sahip olur ve konteynerden kaçarak host sistemine zarar verebilir.
> **Soru 4: Docker Desktop güvenli mi?**
> Cevap: Docker Desktop, geliştirme amaçlıdır. Üretim ortamında daha sıkı güvenlik politikalarına sahip Docker Engine veya Kubernetes tercih edilmelidir.
> **Soru 5: İmaj imzalama zorunlu mu?**
> Cevap: Zorunlu değildir ancak kurumsal seviyede tedarik zinciri güvenliği (Supply Chain Security) için şiddetle tavsiye edilir.
## Özet ve Sonuç
Docker güvenliği, tek bir ayarla çözülebilecek bir konu değil, çok katmanlı bir süreçtir. İmaj üretiminden runtime yönetimine kadar her aşamada **"En Az Yetki Prensibi" (Principle of Least Privilege)** uygulanmalıdır. Minimal imajlar kullanmak, rootless mod tercih etmek ve düzenli taramalar yapmak, sisteminizi modern tehditlere karşı dirençli kılacaktır.