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…