500 Satır Kodda Linux Konteynerleri (2016)
Kaynak: Hacker News
İçindekiler 4 başlık
Giriş ve Motivasyon#
Linux konteynerleri modern bulut bilişimin ve mikroservis mimarilerinin kalbinde yer alır. Geliştiriciler bu teknolojiyi doğrudan veya dolaylı olarak yıllarca kullansalar bile, arka planda çalışan çekirdek (kernel) mekanizmalarının gerçekte nasıl işlediğini tam olarak kavramak için en etkili yol kendi uygulamasını geliştirmektir. Yazar, güvenilmeyen kodları çalıştırmak için gereken asgari kısıtlama kümesini belirleme amacıyla yaklaşık 500 satırlık C tabanlı bir prototip (contained.c) kurgulamıştır.
Dış dünyaya açık üretim sistemlerinde temel kural mümkün olan her izni kısıtlamak olsa da, hangi izinlerin kategorik olarak güvensiz olduğunu tam olarak bilmek kritik bir mühendislik refleksidir. Bu çalışma, literate programming (okunabilir programlama / noweb tarzı) yöntemiyle hazırlanmış ve GPLv3 lisansıyla paylaşılmıştır.
Mimarinin Yapı Taşları (İçindekiler)#
Konteyner yapısının anlaşılması için ele alınan 12 temel bileşen şunlardır:
- Container setup (Konteyner Kurulumu): Çekirdek mekanizmalarının bir araya getirilmesi.
- contained.c: Prototipi hayata geçiren C kaynak kod dosyası.
- Namespaces (İsim Alanları): Süreçlerin gördüğü sistem kaynaklarının ayrıştırılması.
- Capabilities (Yetenekler): Kök kullanıcı (root / UID 0) ayrıcalıklarının sınırlandırılması.
- Dropped capabilities (Bırakılan Yetenekler): Güvenlik gerekçesiyle devredışı bırakılan izinler.
- Retained Capabilities (Korunan Yetenekler): Konteynerin çalışması için zorunlu tutulan izinler.
- Mounts (Bağlama Noktaları): Dosya sistemi izolasyonu ve bağlama hiyerarşisi.
- System Calls (Sistem Çağrıları): Çekirdek ile süreçler arasındaki iletişim kanalı.
- Disallowed System Calls (Engellenen Sistem Çağrıları): Güvensiz kabul edilip engellenen çağrılar.
- Allowed System Calls (İzin Verilen Sistem Çağrıları): Yürütülmesine izin verilen güvenli sistem çağrıları.
- Resources (Kaynaklar): Donanım tüketiminin sınırlandırılması.
- Networking (Ağ): İzole ağ arabirimleri ve yönlendirme kuralları.
Konteyner Kurulumu ve Çekirdek Mekanizmaları#
Modern Linux konteynerleri, birbirini tamamlayan ve yer yer kapsamları örtüşen mekanizmalardan oluşur:
- Namespaces: Çekirdek nesnelerini süreç ağaçlarına göre gruplar. Örneğin PID isim alanı, süreç listesini yalnızca o isim alanındakilerle sınırlar.
- Capabilities: UID 0 (root) kullanıcısının yapabileceklerini kaba hatlarıyla sınırlar.
- cgroups (Control Groups): Bellek, disk G/Ç ve CPU süresi gibi kaynakları sınırlandırır; bu mekanizmaya dosya sistemi arabirimi üzerinden erişilir.
- setrlimit: Sistem çağrıları üzerinden çalışır; cgroups'a göre daha eskidir ancak cgroups'un yapamadığı bazı özel kaynak kısıtlamalarını sağlayabilir.
- Seccomp: Yetenekler ve setrlimit gibi sistem çağrıları düzeyinde filtreleme gerçekleştirir.
- User Namespaces: Yetkileri birleştirmeyi vadetse de çekirdek genelinde yetki yükseltme (privilege escalation) açıklarına zemin hazırlayabildiği için dikkatle ele alınmalıdır.
Yazılım Geliştirme ve Öğrenme Çıkarımları#
- Soyutlamayı Anlamak: Konteynerler bağımsız işletim sistemleri değil; çekirdeğin sunduğu
namespaces,cgroups,capabilitiesveseccompilkellerinin bir bileşimidir. - Savunma Derinliği: Üretim ortamlarında asgari kısıtlama yerine en az yetki prensibi (least privilege) uygulanmalı ve gereksiz capabilities çekirdek seviyesinde kaldırılmalıdır.
Bu konuyu derinlemesine öğrenmek isterseniz: Güvenli Model Registry ve Container Güvenliği modülüne göz atın.
Kaynak ve atıf
Bu yazı, Hacker News üzerinde yayımlanan içerikten yararlanılarak Edumints tarafından yapay zekâ desteğiyle Türkçe hazırlandı. Ayrıntılar ve yazarların kendi anlatımı için orijinaline bakabilirsin:
- blog.lizzie.io/linux-containers-in-500-loc.html