5 puan yazan GN⁺ 2025-08-20 | Henüz yorum yok. | WhatsApp'ta paylaş
  • 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.

Henüz yorum yok.