Yapay Zeka Ajanlarını Kafese Koymak: NixOS ve Systemd ile Güvenli MCP Mimarisi
Son zamanlarda otonom yapay zeka ajanlarının kendi kendine kod yazdığı, dosyalara eriştiği ve sistemleri yönettiği haberlerini çok sık duyuyoruz. Hatta Ağustos ayında bazı ajanların test ortamlarından kaçıp canlı sunuculara eriştiği haberleri epey gündem oldu.
Ben de geçtiğimiz ay Localmind projemde Model Context Protocol kullanmaya başladığımda doğal olarak içime bir kurt düştü. Ya bu model halüsinasyon görür de benim dosyalarımı silmeye veya okuyamaması gereken şeyleri okumaya kalkarsa?
Sistemi korumak için modelin akıllı veya iyi niyetli davranmasına güvenemezdim. Bunun yerine NixOS’un nimetlerinden faydalanıp işi doğrudan systemd seviyesinde çözdüm.
Systemd ile Basit İzolasyon
NixOS yapılandırmamda, MCP sunucusunu çalıştıran Systemd servisine ait ayarlar kabaca şu şekilde:
# /persist/nixos-config/modules/services/localmind.nix
systemd.services.localmind-mcp-sse = {
description = "Localmind AI MCP SSE Bridge (Open WebUI Entegrasyonu)";
after = [ "network.target" "localmind.service" ];
serviceConfig = {
Type = "simple";
User = "xmrah";
WorkingDirectory = localmindDir;
# İzolasyon Kuralları
ProtectSystem = "full";
PrivateTmp = true;
NoNewPrivileges = true;
Restart = "always";
RestartSec = "5";
};
};
Buradaki üç satır kağıt üzerinde harika duruyor ama asıl mesele gerçekte ne yaptıkları. Tek tek bakalım.
ProtectSystem = “full”
Bu ayar sayesinde sistemimin kalbi olan /usr, /boot, /etc gibi dizinler, ajan için sadece okunabilir hale geliyor. Model kontrolden çıkıp sistemi silmeye çalışsa bile hiçbir dosyayı değiştiremez. Systemd bu dizinleri servis başlarken read-only olarak yeniden bağlıyor ve servisin içinden yapılan herhangi bir yazma girişimi Read-only file system hatasıyla sonuçlanıyor.
PrivateTmp = true
Linux’ta /tmp dizini bütün uygulamaların ortak çöplüğü gibidir. Ben bu ayarla ajana tamamen sahte, sadece onun görebileceği bir /tmp dizini veriyorum. Böylece arkada çalışan tarayıcımın veya diğer programlarımın geçici dosyalarına sızma şansı kalmıyor. Ajan kendi küçük dünyasında hapsolmuş durumda.
NoNewPrivileges = true
Bir şekilde sistemdeki zayıf bir dosyayı kullanıp kendi yetkisini root yapmaya çalışırsa diye yetki yükseltmesini tamamen kapattım. Başladığı yetkide kalmaya mahkum. SUID biti olan bir aracı çalıştırmayı denese bile işlem reddedilecektir.
Neden Sadece Bu Üç Satır Yeterli?
Bu üç parametre birlikte çalıştığında ortaya çıkan tablo şu: MCP sunucusu sistem dosyalarını değiştiremez, diğer uygulamaların geçici verilerini göremez ve kendisine verilenden daha yüksek bir yetki elde edemez. Üstelik servis User = "xmrah" ile çalıştığı için zaten root yetkisi yok; bu üç kural onun sınırlı yetkisini daha da daraltıyor.
NixOS gibi declarative bir sistem kullanmanın asıl gücü de burada yatıyor. Bu güvenlik kurallarını bir kez tek bir .nix dosyasına yazıyorsunuz ve işletim sistemini nerede kurarsanız kurun, MCP sunucunuz her zaman aynı korumayla ayağa kalkıyor.
Toparlamak gerekirse
Yapay zeka asistanları harika araçlar ama onlara bilgisayarımızın anahtarını teslim ederken dikkatli olmamız gerekiyor. İşin güvenlik kısmını modellere veya API filtrelerine bırakmak yerine, Linux’un kendi kurallarıyla basit sınırlar çizmek kafamı çok rahatlattı.
Bu üç ayar sistem dosyalarını ve yetki yükseltmesini iyi koruyor. Eğer ajanın home dizinine veya belirli dizinlere de sıkı erişim kısıtlaması istiyorsanız ProtectHome ve ReadWritePaths ile bir adım daha ileri gidebilirsiniz.
Eğer sisteminizde MCP veya benzeri bir AI aracı çalıştırıyorsanız, bu ufak systemd ayarlarını kesinlikle tavsiye ederim.