Bir ajana terminal vermek. İzolasyon nerede başlar, nerede biter?
DRAVION'da en uzun süren iş model entegrasyonu değildi. Ajanın gerçekten komut çalıştırabildiği, ama yanlış komutun kimseyi yakmadığı sınırı çizmekti.
Otonom bir kodlama ajanının işe yaraması için gerçek yetkiye ihtiyacı var. Dosya okuyacak, dosya yazacak, testi çalıştıracak, bağımlılık kuracak, commit atacak. Bu yetkiyi vermezsen elinde bir sohbet kutusu kalıyor.
Ama verdiğin anda şu soruyu cevaplamak zorundasın: bu ajan yanlış komutu çalıştırdığında ne oluyor? Ve dikkat, soru "yanlış komut çalıştırır mı" değil. Çalıştırır. Bin koşunun içinde biri mutlaka rm yazar, biri mutlaka ağ isteği atar, biri mutlaka bir ortam değişkenini ekrana basar.
Host'ta hiçbir şey çalışmaz
DRAVION'daki ilk ve tartışmasız kural: terminal komutları asla host makinede çalışmıyor. Her worker kendi konteynerinde yaşıyor ve o konteynerin kardeş worker'ların dosya sistemine hiçbir yolu yok.
Bu kulağa Docker'ı açıp kapatmak gibi geliyor ama işin zor kısmı burada başlıyor. Konteyneri başlatmak kolay; kararı zor olan şey konteynerin neye erişebildiği.
Bir ajanın çalışması için bağımlılık kurması gerekiyor, yani ağ erişimi lazım. Ama ağ erişimi olan bir konteyner, aynı zamanda içindeki her şeyi dışarı gönderebilen bir konteyner. Bir ajanın testi çalıştırması için proje dosyalarını görmesi gerekiyor, ama sadece o projeye ait olanları. Her izin, karşılığında bir saldırı yüzeyi açıyor ve hiçbirini tamamen kapatamıyorsun — kapattığın anda ürün çalışmıyor.
Sandbox tasarımı bir güvenlik problemi gibi görünür. Aslında bir ürün problemidir: ajanın işini yapabildiği en küçük yetki kümesini bulmak.
Asıl mesele sırlar
Konteyner izolasyonu üzerine konuşmak kolay çünkü somut. Gerçekten zor olan kısım sır yönetimiydi.
DRAVION'da kullanıcı kendi model anahtarını getiriyor. Bu, ürün açısından doğru karar — kullanıcı kendi kotasını, kendi faturasını, kendi sağlayıcısını yönetiyor. Ama bunun anlamı şu: sistemde başkasının parasına doğrudan bağlı bir kimlik bilgisi duruyor ve bir hatanın yarıçapı artık benim altyapım değil, kullanıcının hesabı.
Bu yüzden anahtarlar döndürülebilir bir ana anahtarın arkasında şifreli tutuluyor, veritabanında düz metin hiçbir yerde bulunmuyor. Worker'a giden iş talimatları imzalı geliyor; konteynerin içinden "bana şu anahtarı ver" diye bir istek uydurulamıyor. Ve loglar sırları filtreliyor — çünkü bir sırrın sızmasının en sık yolu saldırı değil, hata ayıklama çıktısı.
Yeniden oynatılabilirlik bir güvenlik özelliği
Beklemediğim bir bağlantı şu oldu: her ajan turunun yeniden oynatılabilir bir kayıt bırakması, hata ayıklama için tasarlanmıştı. Ama en çok işe yaradığı yer güvenlik oldu.
Bir koşu tuhaf davrandığında, ne yaptığını tahmin etmiyorum — tekrar çalıştırıp izliyorum. Hangi komut çalıştı, hangi dosyaya dokundu, hangi ağ isteğini denedi. İzolasyonun gerçekten tuttuğunu iddia etmek ile göstermek arasındaki fark bu.
Nerede bitiyor
Dürüst cevap: bitmiyor. Konteyner kaçışları var, tedarik zinciri saldırıları var, ve bir ajanın yazdığı kodun kendisi de bir risk.
Ama şunu öğrendim — izolasyonun amacı her senaryoyu imkânsız kılmak değil, her senaryonun yarıçapını daraltmak. Bir worker patladığında kaybettiğim şey o worker'ın konteyneri olsun, veritabanım olmasın. Bu cümleyi yazmak beş saniye, doğru hâle getirmek altı ay sürdü.
Ve bu iş demo videosunda görünmüyor. Ajanın PR açtığı ekran görüntüsünde görünmüyor. Ama ürünü başkasının reposuna yaklaştırabildiğin tek şey o.