Cara Menjaga Rahasia Tetap di Luar Agen AI
Kunci API di lingkungan agen AI dapat bocor lewat satu panggilan alat. Gunakan token terbatas dan berumur pendek melalui gateway kredensial, bukan kunci asli.
Arti menjaga rahasia tetap berada di luar agen AI
Agen AI adalah proses Linux biasa yang menjalankan perintah. Setiap variabel lingkungan yang dimiliki proses tersebut dapat dibaca oleh kode yang dijalankannya. Karena itu, kunci API di lingkungan agen dapat dikirim agen ke host mana pun yang dapat dijangkaunya. Menjaga rahasia tetap berada di luar agen berarti memberinya handle, bukan kuncinya: token dengan cakupan terbatas dan masa berlaku singkat, atau placeholder yang diganti dengan nilai sebenarnya oleh komponen lain di batas jaringan.
Ini bukan tentang model yang berubah menjadi berbahaya. Mekanismenya lebih sederhana. Agen membaca halaman web, README, atau komentar issue yang berisi instruksi, lalu mengikutinya karena bagi model bahasa tidak ada perbedaan antara teks yang Anda tulis dan teks yang diambilnya. Ini disebut prompt injection. Setelah hal itu terjadi, dampaknya dibatasi tepat oleh satu hal: apa saja yang dapat dibaca proses tersebut. Jika Anda belum menetapkan batas, menjalankan agen coding dengan aman di server membahas tingkat isolasi yang menjadi dasar panduan ini.
Model ancaman dalam istilah sederhana
Jalankan ini sebagai pengguna yang digunakan agen Anda.
tr '\0' '\n' < /proc/self/environ | grep -iE 'key|token|secret|password'Setiap baris yang dicetaknya berarti satu permintaan HTTP ke server milik pihak asing. Sekarang periksa apa saja yang tersimpan di disk di dekat agen.
grep -rIl --exclude-dir=.git -e 'API_KEY' -e 'SECRET' ~/projects
find ~ -maxdepth 3 -name '.env' -o -name 'credentials' -o -name '*.pem'Agen yang memiliki shell tidak memerlukan eksploit canggih untuk mengeluarkan data tersebut. Empat jalur biasa sudah cukup, dan keempatnya tampak seperti pekerjaan normal di log:
curlataufetchkeluar ke host mana pun, dengan nilainya di dalam string kueri.git commitdangit pushke repositori yang dapat ditulisi oleh agen.- Skrip instalasi paket yang menjalankan kode arbitrer sebagai pengguna agen.
- Pencarian DNS untuk nama host yang memuat nilai tersebut, yang tetap mengirimkan data meskipun egress HTTP diblokir.
Anda tidak dapat mengatasi masalah ini hanya dengan meninjau. Solusinya adalah memastikan tidak ada data berharga yang dapat dijangkau.
Rahasia di pohon kerja adalah rahasia di jendela konteks
Agen membaca file. File .env di repositori tempat agen bekerja akan dibaca. Setelah dibaca, file tersebut masuk ke jendela konteks. Artinya, file tersebut ada di transkrip, di setiap log yang Anda simpan, dan di apa pun yang ditulis agen berikutnya.
Sebelumnya, ketika kunci berada di pohon tempat agen bekerja:
cd ~/projects/billing
cat .env
# STRIPE_SECRET_KEY=sk_live_...
# DATABASE_URL=postgres://app:hunter2@db.internal:5432/billingSetelah file dipindahkan ke luar jangkauan:
sudo install -d -m 750 -o root -g agent-review /etc/agent-review
sudo install -m 640 -o root -g agent-review ~/projects/billing/.env /etc/agent-review/billing.env
rm ~/projects/billing/.envPengguna agen tidak dapat lagi membuka file tersebut, karena pohon kerja tidak lagi memuatnya. Aturan penolakan dalam konfigurasi agen sendiri adalah lapisan kedua, bukan lapisan pertama. Claude Code membaca aturan izin dari .claude/settings.json dalam proyek:
{
"permissions": {
"deny": ["Read(./.env)", "Read(./secrets/**)", "Read(./**/*.pem)"]
}
}Hal ini mencegah agen membuka file secara tidak sengaja saat menjelajah. Namun, hal ini tidak mencegah instruksi yang disisipkan menjalankan base64 .env, karena itu adalah perintah shell, bukan pembacaan file. Perlakukan konfigurasi sebagai pembatas dan izin sistem file sebagai dinding. Pemisahan yang sama berlaku di dalam container: file env dan rahasia di Docker Compose membahas versi masalah ini pada satu lapisan di bawahnya.
Berikan setiap agen pengguna tanpa hak istimewa sendiri
Jika agen berjalan sebagai Anda, agen tersebut mewarisi kunci SSH, kredensial cloud, dan riwayat shell Anda. Pengguna terpisah memerlukan satu perintah dan menghapus semua akses tersebut.
sudo adduser --disabled-password --gecos "" agent-review
sudo chmod 700 /home/agent-review
sudo -u agent-review cat ~/.ssh/id_ed25519Baris terakhir harus gagal dengan cat: /home/you/.ssh/id_ed25519: Permission denied. Jika perintah tersebut mencetak kunci, direktori home Anda dapat dibaca oleh grup atau semua pengguna, dan chmod 700 ~ memperbaikinya. Jangan tambahkan pengguna agen ke sudo, dan jangan berikan aturan NOPASSWD yang lebih luas daripada satu perintah yang benar-benar diperlukan. Pengguna dengan hak minimum pada VPS membahas detail grup dan sudoers.
Satu batasan lain perlu ditambahkan pada VPS cloud. Layanan metadata instans menjawab pada alamat link-local tetap, dan sering memberikan kredensial peran kepada apa pun yang memintanya.
sudo iptables -A OUTPUT -m owner --uid-owner agent-review -d 169.254.169.254 -j REJECTPeriksa dari sisi agen. sudo -u agent-review curl -s --max-time 3 http://169.254.169.254/ harus tidak mencetak apa pun dan keluar dengan status non-zero, karena paket tersebut ditolak sebelum meninggalkan mesin.
Injeksi kredensial di batas
Pola yang benar-benar menyelesaikan masalah ini adalah injeksi kredensial. Agen tidak pernah menyimpan kunci yang sebenarnya. Agen mengirimkan permintaan melalui gateway lokal, lalu gateway mengganti placeholder dengan secret yang sebenarnya saat permintaan keluar. Secret disimpan di penyimpanan gateway, dalam proses yang berbeda dan dimiliki oleh pengguna yang berbeda.
OneCLI adalah salah satu implementasi open source untuk pola ini. OneCLI menggunakan lisensi Apache-2.0 dan berjalan sebagai container di samping agen. Per Juli 2026, proyek ini mendokumentasikan konfigurasi berikut:
git clone https://github.com/onecli/onecli.git
cd onecli
docker compose -f docker/docker-compose.yml up -d --waitDashboard mendengarkan pada port 10254, sedangkan gateway mendengarkan pada port 10255. Anda menyimpan kredensial yang sebenarnya satu kali, lalu memberikan setiap agen nilai placeholder sebagai pengganti kunci serta access token dengan cakupan khusus miliknya. Agen mengirim token ini dalam header Proxy-Authorization. Gateway mencocokkan permintaan keluar berdasarkan host dan path, mendekripsi kredensial yang cocok, lalu menggantinya. Environment agen tidak menyimpan apa pun yang bernilai bagi penyerang.
Nilai utama pendekatan ini bukan enkripsinya. Nilainya adalah pertanyaan "kredensial apa yang digunakan agen ini, dan kapan" dapat dijawab melalui kueri log. Anda membaca satu audit trail, bukan menebak environment mana dari enam environment yang menyimpan salinan kunci.
Berikan rahasia kepada proses, bukan kepada lingkungan
Jika Anda menjalankan agen di bawah systemd, Anda sama sekali tidak memerlukan variabel lingkungan. LoadCredential= menempatkan rahasia di direktori privat yang hanya dapat dibaca oleh layanan tersebut, mengeksposnya sebagai %d dalam berkas unit dan sebagai $CREDENTIALS_DIRECTORY di dalam proses. Nilai tersebut tidak pernah muncul di /proc/<pid>/environ, sehingga ps eww tidak dapat menampilkannya, dan direktori tersebut dihapus saat layanan berhenti.
Enkripsikan kredensial ke mesin terlebih dahulu. Perintah berikut berasal dari dokumentasi systemd dan berfungsi pada systemd 250 atau yang lebih baru, yang mencakup Ubuntu 24.04 dan Debian 13:
echo -n 'sk-example-value' > /tmp/plain.txt
sudo systemd-creds encrypt --name=api_key /tmp/plain.txt /etc/credstore/api_key.cred
shred -u /tmp/plain.txt
sudo systemd-run -P --wait -p LoadCredentialEncrypted=api_key:/etc/credstore/api_key.cred \
systemd-creds cat api_keyPerintah terakhir menampilkan sk-example-value. Ini membuktikan bahwa berkas terenkripsi dapat didekripsi di host ini. Kemudian, referensikan berkas tersebut dari unit:
[Service]
User=agent-review
LoadCredentialEncrypted=api_key:/etc/credstore/api_key.cred
Environment=AGENT_KEY_FILE=%d/api_key
ExecStart=/usr/local/bin/agent-workerKode agen Anda membuka berkas di $AGENT_KEY_FILE saat memerlukan nilainya. Pembacaan berkas hanya berlangsung sesaat. Variabel lingkungan bertahan selama proses berjalan, termasuk di setiap proses anak yang dibuatnya.
Pilih token berumur pendek daripada kunci berumur panjang
Kunci yang tidak pernah kedaluwarsa tetap valid setiap kali muncul, bahkan berbulan-bulan kemudian, dalam log atau transkrip. Jika layanan menyediakan token sesi, gunakan token sesi dan tetapkan masa berlaku sesingkat yang diizinkan oleh pekerjaan tersebut.
aws sts assume-role \
--role-arn arn:aws:iam::123456789012:role/agent-readonly \
--role-session-name agent-review \
--duration-seconds 900Lima belas menit adalah durasi minimum yang diterima AWS STS (security token service), dan biasanya cukup untuk satu tugas agen. Untuk GitHub, buat login gh khusus bagi pengguna agen dengan token terperinci yang dibatasi ke satu repositori tempat agen bekerja, sehingga gh auth token dalam sesi tersebut hanya menghasilkan sesuatu yang tidak dapat mengakses hal lain. Batasi berdasarkan sumber daya terlebih dahulu, lalu berdasarkan waktu.
Verifikasi, lalu terus verifikasi
Tiga pemeriksaan layak dijalankan setelah setiap perubahan pada konfigurasi agent. Jalankan pemeriksaan tersebut sebagai pengguna agent, bukan sebagai diri Anda sendiri.
sudo -u agent-review env | grep -iE 'key|token|secret'
sudo -u agent-review ls -la /home/you/ 2>&1 | head -3
sudo -u agent-review curl -s -o /dev/null -w '%{http_code}\n' --max-time 5 https://api.github.com/userPerintah pertama seharusnya tidak mencetak apa pun. Perintah kedua seharusnya mencetak ls: cannot open directory '/home/you/': Permission denied. Perintah ketiga menunjukkan identitas yang ditampilkan oleh jalur jaringan agent. Inilah pertanyaan yang hendak dijawab oleh pola gateway: 401 berarti agent tidak membawa kredensial GitHub miliknya sendiri, sedangkan 200 berarti agent membawanya. Karena itu, Anda harus mengetahui token yang digunakan. Jika Anda menjalankan agent tanpa pengawasan, mengendalikan biaya agent AI di VPS membahas batas anggaran yang melengkapi batas akses ini.
FAQ
Dapatkah saya begitu saja mempercayai model untuk tidak membocorkan key saya?
Tidak, karena model bukan penyerang dalam model ancaman ini. Agent membaca teks dari halaman web, repositori, dan pelacak issue, dan teks tersebut dapat berisi instruksi. Model tidak memiliki cara yang andal untuk membedakan instruksi Anda dari teks yang diambilnya. Setiap kontrol yang bergantung pada keputusan model akan gagal saat instruksi yang disisipkan terlihat meyakinkan. Karena itu, kontrol harus ditempatkan di sistem operasi atau jaringan.
Apakah environment variable benar-benar berbahaya bagi secret agent?
Environment variable bermasalah dalam satu hal tertentu: variable tersebut diwariskan. Setiap proses anak yang dibuat agent akan menerima salinannya, termasuk build script, test runner, dan hook instalasi package. Variable tersebut juga dapat dibaca melalui /proc/<pid>/environ oleh user yang sama. Jadi, apa pun yang dijalankan agent dapat membacanya tanpa agent meneruskannya. File yang dibaca saat diperlukan, menggunakan LoadCredential= atau gateway, membatasi paparan hanya pada saat tersebut.
Apakah menyimpan secret di vault dengan sendirinya menyelesaikan masalah ini?
Hanya sebagian. Vault memperbaiki penyimpanan. Vault tidak memperbaiki langkah terakhir, yaitu saat sesuatu mengambil secret dari vault lalu memberikannya kepada agent sebagai environment variable. Kondisinya kembali seperti semula. Hal yang penting adalah pihak yang melakukan substitusi. Jika agent mengambil secret, agent memiliki secret tersebut. Jika gateway atau init system melakukan substitusi di luar proses agent, agent tidak pernah memegangnya.
Bagaimana saya mengetahui apakah agent sudah membocorkan sesuatu?
Biasanya Anda tidak dapat mengetahuinya setelah kejadian. Inilah alasan menggunakan gateway. Tanpa gateway, bukti tersebar di shell history, transkrip agent, dan log koneksi keluar yang kemungkinan besar tidak Anda simpan. Dengan credential gateway, setiap penggunaan credential tercatat dalam satu baris yang memuat identitas agent dan timestamp. Jika Anda mencurigai kebocoran, lakukan rotasi key terlebih dahulu, lalu lakukan investigasi. Rotasi mudah dilakukan, sedangkan kepastian tidak.
Apa tindakan minimum yang harus saya lakukan hari ini?
Pindahkan setiap file .env dari direktori tempat agent bekerja, lalu buat satu user tanpa hak istimewa untuk setiap agent. Dua perubahan ini memerlukan waktu sekitar sepuluh menit dan menutup jalur yang paling umum, yaitu agent membaca file credential yang sebenarnya tidak perlu berada di dekat kode. Gateway dan token berumur pendek adalah langkah berikutnya, bukan langkah pertama. Titik awal yang sama berlaku untuk runtime agent apa pun, termasuk menjalankan agent otonom dengan aman di VPS.