
Eyvah eyvah!
Şunun başımıza gelmesini istemeyiz değil mi? Reddit
Elbette Claude Code, Open Code gibi araçlar bir şeyler yapmadan önce soruyorlar
ve yukarıdaki örnekte kullanıcının Claude Code’u belki de fazla serbest
bıraktığını söyleyebiliriz. Fakat biz yine de ek önlemler almaya çalışalım ki
sonradan ah vah çekmeyelim. 1️⃣ Birincisi aracın içerisindeki kontrol
mekanizmaları örneğin bir güncelleme ile düzgün çalışmayabilir, prompt
injection gibi bir sorun ile karşılaşabiliriz, 2️⃣ ikincisi kullanan kişi
agent’ın sorduğu Bunu yapabilir miyim? sorularından bıkıp hepsine Evet deyip
geçebilir (ki bence yoğun bir günde yorulmuş bir bünye için oldukça olası),
3️⃣ üçüncüsü de ajanı full otonom bırakmak isteyebiliriz, claude --dangerously-skip-permissions gibi. Proje dışı dosyaları bozmayacağını düşünsek
bile kodlama ajanının testler ya da başka işleri için sistem geneline apt,
pip gibi paket yöneticileri ile bir şeyler kurması sistemimizin kısa sürede
stabilitesini bozabilir.
Peki biz kodlama ajanlarını daha “güvenli” hale nasıl getirebiliriz? Gelin container teknolojisi ile bir izolasyon ve kodlama ajanına rahatça oynayıp bozabileceği bir alan sağlamaya çalışalım.
Devcontainer
Devcontainer yani Development Container VS Code tarafından da desteklenen ama VS Code’a özgü olmayan standart bir yapı. Amacı, projelerin geliştirme ortamlarını bir container içerisinde toplamak ve But, it works (develops?) on my machine! probleminden geliştiricileri kurtarmak. Projenizin geliştirme ortamını düzgün tariflemek ve saklamak için standart bir yol. Deployment için de kullanılabiliyor bildiğim kadarıyla ama ben denemedim.
Devcontainer İçerisinde Kodlama Ajanları
Birçok kodlama ajanını container içerisine koloayca kurmak mümkün. CLI araçlardan bahsediyorum. Örneğin:
FROM mcr.microsoft.com/devcontainers/base:debian-13
# Claude Code:
RUN curl -fsSL https://claude.ai/install.sh | bash
# Open Code:
RUN curl -fsSL https://opencode.ai/install | bash
# Alternatif olarak npm, bun vs ile de kurabilirsiniz elbette
gibi tek satırda kurulum yapılabiliyor. Bu arada VS Code ile Devcontainer kullanacaksanız buradaki gibi Microsoft’un imajlarını baz alabilirsiniz, daha kısa Dockerfile’larınız olur çünkü bu imaj içerisinde temel araçlar kurulu oluyor ama zorunda değilsiniz.
Her Projeye Ayrı Kurulum?
Eğer çalıştığımız kodlama ajanı o proje için vazgeçilmez olduysa onu projenin geliştirme container’ına koyabiliriz. Nasıl projenin bağımlılıklarını kuruyoruz, bu da bizim bağımlılığımız oluyor. 🙂 Boyutlarının da çok büyük olmadığını düşünürsek proje başına kurulum yapmak kabul edilebilir.
Persistent Storage
VS Code, Devcontainer kullandığınız zaman projenizi otomatik container içerisine
mount ediyor. Ama kodlama ajanınızın belleğini ve çeşitli giriş ve hesap
bilgilerinizi, ayarlarınızı ve tercihlerinizi host bilgisayarınızda yani esas
bilgisayarınızda tutmak isteyebilirsiniz. Bunun için container içerisine başka
dosya ve dizinleri de mount etmeniz gerekecektir. Bunun için devcontainer.json
dosyasını kullanabiliriz. Ben örnekleri Claude Code ve OpenCode için
vereceğim, diğer ajanlar için hangi dizin ve dosyaların gerekli olduğuna
kendiniz bakabilirsiniz. Mesela OpenCode ile OMO
kullanıyorsanız ek dosyalar eklemeniz gerekecektir, ama mantık bu şekilde…
Ama buradaki prensip en az eklemeyi yapmak. Yani tutup $HOME dizininizi
olduğu gibi verirseniz zaten bu izolasyonun amacı kalmayacaktır.
devcontainer.json
{
"name": "My Dev Environment",
"build": {
"dockerfile": "Dockerfile"
},
"mounts": [
{
//OpenCode
"source": "${localEnv:HOME}/.local/share/opencode",
"target": "/home/vscode/.local/share/opencode",
"type": "bind"
},
{
//OpenCode
"source": "${localEnv:HOME}/.config/opencode",
"target": "/home/vscode/.config/opencode",
"type": "bind"
},
{
//Claude Code
"source": "${localEnv:HOME}/.claude",
"target": "/home/vscode/.claude",
"type": "bind"
},
{
//Claude Code
"source": "${localEnv:HOME}/.claude.json",
"target": "/home/vscode/.claude.json",
"type": "bind"
}
]
//"onCreateCommand":"sudo chown -R vscode:vscode /home/vscode/.local; sudo chown -R vscode:vscode /home/vscode/.config",
//"runArgs": [
// "--userns=keep-id:uid=1000,gid=1000"
//]
}
Baz
aldığım mcr.microsoft.com/devcontainers imajları içerisinde vscode isminde
bir user oluyor, UID ve GID değerleri 1000 olan. Container ayağa kalkıp
çalışmaya başlayınca aslında bu kullanıcıya düşüyoruz. Ben genelde Podman
kullanıyorum ve gördüğüm kadarıyla VS Code Podman kullanırken otomatik
olarak --userns=keep-id flag’ini geçiyor. O yüzden içerideki vscode
kullanıcısı ile hosttaki kullanıcımız düzgün eşleşiyor, mount ettiğimiz
dizinlerde izin problemleri yaşamıyoruz. Ama problem yaşarsanız
onCreateCommand ve runArgs kısmını açabilirsiniz. Fakat ben böyle bir
problem yaşamadım, referans olması açısından bırakıyorum.
Günün sonunda projemizde
.devcontainer
├── devcontainer.json
└── Dockerfile
şeklinde iki adet dosya oluşturuyoruz. Yukarıdaki iskelet dosyaları da kullanırsanız container içerisinde olmanın rahatlığı ile agent’larınızı çalıştırabilirsiniz.
Özetle
Agent’ımız bu durumda sadece proje dosyalarımıza ve birkaç config
dosyasına/dizinine erişecektir. Bu çalışmasını etkilememektedir. Yine doğrudan
host üzerinde çalışıyormuş gibi container içerisinde bir şeyler kurabilmektedir.
Sadece container içerisinde yaptığı değişiklik, mount edilen dizinlerdekiler
hariç, ve kurulumlar o container içerisinde kalacak ve sisteme sızmayacaktır.
Ayrıca VS Code var olan container’ı tekrar kullandığı için Container imajında
değişiklik yapıp tekrar Build alana kadar container’da ajanın yaptığı tüm
değişimler de, mesela kurduğu yazılımlar, aslında bilgisayarımızda daha doğru
container içerisinde kalacaktır. Yani container’lar işimiz bitince otomatik
silinmiyor, çalıştırılırken otomatik eklenen bir --rm yok.
Claude Code gibi ajanların çeşitli teknolojilerle sağlanan Sandboxing gibi özellikleri var. Ama biz burada container teknolojisi ile doğrudan işletim sistemi seviyesinde bir önlem daha alıyoruz diyebiliriz.
Agent’larınız ile güvenli çalışmalar dilerim…
