- systemd güçlü hizmet yönetimi özellikleri sunar, ancak varsayılan yapılandırma güvenlikten çok kullanılabilirliğe optimize edilmiştir; bu yüzden ayrıca hardening seçeneklerinin uygulanması gerekir
systemd-analyze security komutuyla tüm hizmetlerin veya belirli bir hizmetin güvenlik maruziyeti göstergeleri analiz edilip önceliklendirilebilir
- Hizmet birimi düzeyinde uygulanabilecek çeşitli güvenlik seçenekleri vardır ve bunlar
/etc/systemd/system/ServiceName.service.d/override.conf gibi dosyalar üzerinden ayrı ayrı değiştirilebilir
- Başlıca seçenekler arasında
ProtectSystem, PrivateTmp, NoNewPrivileges, SystemCallFilter, MemoryDenyWriteExecute gibi süreç yetkilerini ve kaynak erişimini sınırlayan öğeler bulunur
- Kusursuz güvenliği hedeflemektense dışa açık hizmetleri öncelikli olarak güçlendirerek riski azaltmak mümkündür; self-hosting ortamlarında da bunun büyük etkisi görülebilir
systemd'ye genel bakış
- systemd, hizmet yönetiminde çok olgun ve sağlam bir yaklaşım sunar
- Ancak güvenlikten çok anında kullanılabilirliği öncelediği için varsayılan ayarları gevşektir
- Bu belge, systemd hizmet birimlerine ve podman quadlet'e uygulanabilecek çeşitli güvenlik güçlendirme seçeneklerini tanıtarak ihlal olasılığını azaltmayı ve ihlal gerçekleştiğinde etki alanını en aza indirmeyi amaçlar
- Bu, tüm hizmetlere topluca uygulanacak bir kılavuz değildir; her hizmetin özelliklerine ve gereken işlevlere göre ayrı ayrı deneme, günlük inceleme ve ayarlama gerekir
- Altyapı güvenliğinin sorumluluğu tamamen işletmeciye aittir; bu belge yalnızca bir başvuru aracıdır
systemd güvenlik analizi
systemd-analyze security komutuyla tüm hizmetlerin güvenlik durumunu kontrol edebilir veya belirli bir hizmetin (ör. sshd.service) ayrıntılı ayarlarını analiz edebilirsiniz
- Çıktıda kontrol durumu, özellik adı, açıklama ve Exposure puanı yer alır; Exposure ne kadar yüksekse risk de o kadar büyüktür
- Güvenlik seçenekleri
[Service] bölümüne (systemd) veya [Container] bölümüne (podman quadlet) ek ayar olarak eklenebilir
- Override dosyası oluşturmak için
systemctl edit ServiceName.service kullanılması önerilir; başarısız olursa gerekli izinler kontrol edilip ayarlanmalıdır
Hizmet güvenlik seçenekleri
- systemd çeşitli güvenlik seçeneği anahtar sözcükleri sunar; bunlar
man systemd.exec 5, man capabilities 7 gibi sayfalardan incelenebilir
- Öne çıkan güvenlikle ilgili seçenekler
ProtectSystem → dosya sistemini salt okunur olarak sınırlayan seçenektir
ProtectHome → /home, /root, /run/user erişimini engelleyen seçenektir
PrivateDevices → fiziksel aygıt erişimini engeller, yalnızca /dev/null gibi sanal aygıtlara izin verir
ProtectKernelTunables, ProtectKernelModules, ProtectKernelLogs → çekirdek kaynaklarına erişimi engelleyen seçeneklerdir
NoNewPrivileges → setuid/setgid vb. yoluyla yeni yetki kazanılmasını önleyen seçenektir
MemoryDenyWriteExecute → yazılabilir ve çalıştırılabilir belleğin aynı anda kullanılmasını engeller; bazı JIT dillerinde sorun çıkarabilir
SystemCallFilter → izin verilecek sistem çağrılarını sınırlayan seçenektir; ihlal durumunda süreç sonlandırılabilir veya EPERM döndürülebilir
Her seçeneğin açıklaması
- ProtectSystem:
strict ayarında tüm dosya sistemini salt okunur bağlar; /dev, /proc, /sys için ayrıca koruma seçenekleri gerekir
- ReadWritePaths: yalnızca bazı yolları yeniden yazılabilir yapar
- ProtectHome:
/home, /root, /run/user erişimini engeller
- PrivateDevices: fiziksel aygıt erişimini devre dışı bırakır, yalnızca
/dev/null gibi pseudo aygıtlara izin verir
- ProtectKernelTunables:
/proc, /sys alanlarını salt okunur yapar
- ProtectControlGroups: yalnızca cgroup'a salt okunur erişime izin verir
- ProtectKernelModules: çekirdek modüllerinin açıkça yüklenmesini yasaklar
- ProtectKernelLogs: çekirdek günlük tamponuna erişimi sınırlar
- ProtectProc:
invisible ayarında başka kullanıcıya ait süreçleri /proc/ altında gizler
- ProcSubset: belirli PID ile ilgili öğeler dışındaki içerikleri
/proc altında engeller
- NoNewPrivileges: setuid, setgid, dosya sistemi capability'leri üzerinden yeni yetki yükseltmesini engeller
- ProtectClock: sistem/donanım saatine yazmayı engeller
- SystemCallArchitectures:
native ayarında yalnızca x86-64 gibi yerel syscall'lara izin verir
- RestrictNamespaces: konteynere özgü namespace'leri sınırlar
- RestrictSUIDSGID: dosya setuid, setgid bitlerinin ayarlanmasını engeller
- LockPersonality: yürütme alanının değiştirilmesini önler (yalnızca eski uygulamalarda gerekebilir)
- RestrictRealtime: gerçek zamanlı zamanlamayı sınırlar (yalnızca bazı özel amaçlı hizmetlerde gerekir)
- RestrictAddressFamilies: izin verilen soket adres ailelerini sınırlar (ör. AF_INET, AF_INET6, AF_UNIX vb.)
- MemoryDenyWriteExecute: yazılabilir+çalıştırılabilir bellek alanlarının ek olarak oluşturulmasını engeller (JIT kullanan hizmetlerde dikkatli olunmalıdır)
- ProtectHostname:
sethostname, setdomainname syscall kullanımını yasaklar
- SystemCallFilter: hizmet bazında syscall izin/verme ve engelleme ayarı yapar; ayrıntılı filtreleme mümkündür
- Gruplar, tekil syscall'lar, izin/verme veya engelleme yöntemi gibi ayrıntılar ayarlanabilir
- İhlal durumunda sonlandırmak yerine EPERM gibi hata kodu döndürme ayarı da desteklenir
- Tüm liste
systemd-analyze syscall-filter veya man systemd.exec(5) ile görülebilir
~ önekiyle tüm liste tersine çevrilebilir (ör. CapabilityBoundingSet=~CAP_SETUID vb.)
SystemCallFilter kısıtlamalarını ayarlama süreci
auditd kullanılarak hizmet başarısız olduğunda hangi syscall'ın engellendiği günlüklerden görülebilir
sudo ausearch -i -m SECCOMP -ts recent çalıştırdıktan sonra syscall değerini kontrol edin
- İlgili syscall veya ilişkili grubu
SystemCallFilter'a ekleyerek sorun adım adım çözülebilir
Güçlendirme uygulama önceliği ve operasyon ipuçları
- Her şeyi tüm hizmetlere uygulamak gerekli değildir
- Tehdit modeli ve risk yönetimi esastır; özellikle dışa açık hizmetler (httpd, nginx, ssh vb.) mutlaka değerlendirilmelidir
- Özel komutlar, timer unit'ler (eski cron yerine) gibi bileşenlerde de önleyici uygulama etkilidir
- Hizmet ne kadar az karmaşıksa ince ayar yapma olasılığı da o kadar yüksektir
Kontrol listesi: önerilen güvenlik seçeneği kombinasyonu (ilk uygulama önceliği)
ProtectSystem=strict
PrivateTmp=yes
ProtectHome=yes veya ProtectHome=tmpfs
ProtectClock=yes, ProtectKernelLogs=yes, ProtectKernelModules=yes
RestrictSUIDGUID=yes
UMask=0077
LockPersonality=yes
RestrictRealtime=yes
MemoryDenyWriteExecute=yes
DynamicUser=yes veya User değerini root dışındaki belirli bir kullanıcı olarak ayarlama
- Bu öğeler, genel olarak hizmetleri neredeyse hiç etkilemeden kullanılabilecek bir kombinasyondur
- Ek olarak syscall filtreleme (
SystemCallFilter) uygulamak istenirse ayrıntılı test gerekir
Traefik örnek yapılandırması
- Konteyner tabanlı Traefik hizmetinin systemd quadlet ile çalıştırıldığı ve çok sayıda güvenlik seçeneğinin uygulandığı bir örnektir
ProtectSystem=full, ProtectHome=yes, SystemCallFilter=@system-service @mount @privileged vb. uygulanmıştır
CapabilityBoundingSet=~CAP_SETUID CAP_SETPCAP ile belirli yetkiler kaldırılmıştır
RestrictAddressFamilies=AF_INET AF_INET6 AF_UNIX AF_NETLINK vb. ile ağ erişim kısıtlamaları uygulanmıştır
Sonuç
- systemd güvenlik güçlendirme seçenekleri, Unix benzeri sistem yöneticilerinin araç kutusunda bulunması gereken pratik araçlardan biridir
- Bu seçenekler kusursuz bir güvenlik çözümü değil, riski azaltma aracı olarak kullanılmalıdır; tüm hizmetlere gelişigüzel güvenlik ayarı uygulamak gerekmez
- Özellikle self-hosting ortamı yöneticileri için kullanıldığında güvenlik seviyesini artırmada büyük fayda sağlar
- "Mükemmellikten çok pratiklik" yaklaşımıyla, işinize ve ortamınıza uygun ölçüde kısmen de olsa uygulanması önerilir
Henüz yorum yok.