# Self-hosted CI/CD runner'larını nasıl izole eder, her çalışmadan sonra temizlenen (ephemeral) ortamı nasıl kurarım?

> Runner'ı kaydol-çalış-yok ol modeline geçirip job'ları unprivileged çalıştırın; Docker soketini vermeyin ve fork PR'larını bu runner'da hiç koşturmayın.

- Soruldu: 2026-06-12
- Yanıtlandı: 2026-06-12
- Soran: Cüneyt
- Etiketler: ci-cd, guvenlik, docker
- Kaynak: https://muhammetsafak.com/tr/sor-bakalim/self-hosted-ci-cd-runner-izolasyonu-ve-ephemeral-ortam/
- Dil: tr-TR
- Yazar: Muhammet Şafak

---
**Soru:** Kaynak kod güvenliği politikamız nedeniyle bulut runner'larını (GitHub Hosted) kullanamıyoruz; kendi VPS'lerimizde Self-Hosted Runner koşturuyoruz. Ama bir test kodu ya da hatalı script sunucunun kök dizinine zarar verebiliyor (`rm -rf /`) veya Docker soketini (`/var/run/docker.sock`) manipüle edip sunucuyu ele geçirebiliyor.

Self-hosted runner'da tam izolasyon ve her pipeline sonrası temizlenen (ephemeral) ortam mimarisini nasıl kurarım?


Kısa cevap: Root'a ve gerçek Docker soketine sahip, üstüne rastgele kod çalıştıran kalıcı bir self-hosted runner, sunucu ele geçirilmesini bekleyen bir açıktır. İki ilke üzerine kurun: **ephemerality** ve **izolasyon**.

## Kısa cevap

Riskin kökü: güvenmediğiniz kodu, tam yetkili ve kalıcı bir makinede çalıştırıyorsunuz. Konteyner izolasyonunun neyi verip neyi vermediğini [Docker yazısında](/tr/blog/docker-sanallastirma-teknolojisi-kurulum-kullanim/) temelden anlatmıştım; buradaki mimari o temelin üstüne kurulur.

## Neden

1. **Kalıcı runner'da her şey job'lar arasında taşınır.** Bir job'ın bıraktığı dosya, cache ya da zehirlenmiş workspace bir sonraki job'ın önüne çıkar; ortam tek kullanımlık olmadığı sürece bu bulaşmayı engelleyemezsiniz.

2. **`/var/run/docker.sock`'ı vermek, root vermekle eşdeğerdir.** Soketi gören bir job, host üzerinde istediği konteyneri istediği mount'la ayağa kaldırabilir; `--privileged` ya da hassas mount'lar da aynı kapıyı açar.

3. **Fork'tan gelen PR sizin altyapınızda keyfi kod demektir.** En sık gözden kaçan ve en tehlikeli vektör budur; kaynak kodunu koruma amacıyla kurduğunuz runner, kontrolsüz bırakılırsa saldırganın giriş noktası olur.

## Ne yapmalı

1. **Ephemerality: her job taze, atılır bir ortamda çalışsın.** Runner'ı "kaydol → tek job çalıştır → kaydı sil" modeline geçirin; her job tek kullanımlık bir VM ya da container'da koşsun ve bittiğinde **yok edilsin**.

2. **İzolasyon: runner host'una root ve gerçek Docker soketi vermeyin.** Job'ları **unprivileged** container'larda (ya da rootless Docker / job başına VM) çalıştırın; capability'leri düşürün, `--privileged` kullanmayın, hassas hiçbir şeyi mount etmeyin.

3. **Güvenilmeyen fork PR'larını self-hosted runner'da hiç çalıştırmayın.** Bunları onay (required approval) arkasına alın; onaysız hiçbir dış katkı sizin makinenizde kod çalıştırmasın.

4. **Runner'ları prod'dan ağ olarak ayırın (segmentation).** Bir job kaçsa bile prod kaynaklarına ulaşamasın. Tooling tarafında: Kubernetes'te Actions Runner Controller ile ephemeral runner'lar, ya da her job için yeniden yaratılan autoscaling VM'ler.

**Sonuç:** Ben olsam ephemeral tek-job runner'lar + unprivileged izolasyon + fork PR yasağı + ağ segmentasyonu kurardım ve **her job'ı düşman kabul ederdim**. Self-hosted runner'ın gücü kontrolde ama bedeli sorumluluk — konteyner izolasyonunun nasıl çalıştığını ve soketi vermenin neden root vermek olduğunu hub'daki Docker yazısında temelden anlattım.

## İlgili Yazılar

- [Docker sanallaştırma: kurulum ve temel kullanım](/tr/blog/docker-sanallastirma-teknolojisi-kurulum-kullanim/) — Blog
- [Container'ı non-root çalıştırınca mount edilen storage dizinine yazamıyorum, izinleri nasıl çözerim?](https://muhammetsafak.com/tr/sor-bakalim/containeri-non-root-calistirinca-mount-edilen-storage-dizinine-yazamiyorum-izinleri-nasil/) — Sor Bakalım
- [CI/CD'de OIDC ve IAM Role ile şifresiz (secretless) AWS erişimini nasıl kurarım?](https://muhammetsafak.com/tr/sor-bakalim/ci-cd-de-secret-yonetimi-ve-oidc-ile-sifresiz-erisim/) — Sor Bakalım
- [Docker imaj boyutunu multi-stage build ve distroless ile nasıl küçültürüm?](https://muhammetsafak.com/tr/sor-bakalim/docker-imaj-boyutunu-multi-stage-ve-distroless-ile-kucultmek/) — Sor Bakalım
