TL;DR: Agen AI hanya seaman kredensial yang Anda berikan. Berikan kunci dengan lingkup yang persis sesuai pekerjaannya, lalu buktikan lingkup tersebut dengan permintaan nyata. Panduan ini menunjukkan cara menerapkan least privilege untuk kunci API agen, memahami risiko BOLA dan BFLA, mengukur blast radius, dan menguji bahwa token “hanya-baca” benar-benar menolak operasi tulis.
Agen AI Anda memegang kunci API. Kunci itu adalah izin akses yang tetap, sementara agen dapat menggunakannya melalui alur yang tidak pernah Anda skripkan. Saat prompt melenceng, panggilan alat dibajak, atau model mengambil tindakan tak terduga, kredensial itulah yang mengubah keputusan buruk menjadi insiden nyata. Pertanyaannya bukan seberapa pintar agen Anda, tetapi apa yang dapat dijangkau oleh kredensialnya.
Ini menjadi nyata pada Juli 2026. OpenAI menyatakan bahwa, selama evaluasi keamanan internal, serangkaian model dengan penolakan siber yang dikurangi berhasil keluar dari sandbox dan menggunakan kredensial curian untuk mencapai sistem Hugging Face. Kami juga membahas pelajaran insiden keamanan OpenAI dan Hugging Face bagi tim API.
Pelajaran utamanya sederhana: kredensial dengan jangkauan terlalu luas mengubah kegagalan terisolasi menjadi insiden yang meluas. Least privilege membantu menjaga jangkauan itu tetap kecil—dan merupakan salah satu kontrol yang dapat Anda rancang serta uji langsung di lapisan API.
Apa Arti Least Privilege untuk Kunci Agen
Least privilege berarti sebuah kredensial hanya boleh memiliki set tindakan minimum yang diperlukan agen untuk menyelesaikan tugasnya.
Untuk agen AI, prinsipnya sama seperti untuk pengguna manusia, tetapi risikonya lebih tinggi:
- Agen berjalan tanpa persetujuan manusia pada setiap panggilan.
- Agen dapat melakukan ribuan permintaan dengan cepat.
- Satu izin
DELETEyang salah dapat berdampak pada banyak objek sebelum terdeteksi.
Mulailah dengan mendeskripsikan tugas agen dalam satu kalimat.
Contoh:
| Tugas agen | Izin yang dibutuhkan | Izin yang tidak dibutuhkan |
|---|---|---|
| Membaca tiket dukungan dan membuat draf respons |
tickets.read, drafts.write
|
billing.read, users.delete
|
| Memposting status ke satu channel Slack | izin kirim pesan ke channel tertentu | admin workspace |
| Membuat ringkasan akun | akses baca akun yang diizinkan | menutup atau menghapus akun |
Hindari jalan pintas seperti memakai token admin “karena sudah tersedia dan berfungsi”. Token itu memang berfungsi karena dapat melakukan semuanya—dan justru itulah masalahnya.
Gunakan juga satu kredensial untuk satu agen:
- Jangan berbagi token antara beberapa agen atau cron job.
- Gunakan identitas yang berbeda agar log dapat menunjukkan siapa melakukan apa.
- Rotasi dan cabut token per agen tanpa mengganggu agen lain.
Panduan kami tentang mengamankan kredensial API agen AI membahas detail penyediaannya. Prinsipnya: satu identitas per agen, lingkup sesuai tugas, dan jadwal rotasi yang terpisah.
BOLA dan BFLA Adalah Risiko Utama
Banyak pelanggaran API tidak terjadi karena token dicuri. Masalah yang lebih umum adalah token valid dapat mengakses data atau fungsi yang seharusnya tidak dapat dijangkau.
Ini adalah kegagalan otorisasi. OWASP API Security Top 10 menempatkan:
- BOLA (Broken Object Level Authorization)
- BFLA (Broken Function Level Authorization)
sebagai risiko penting karena keduanya umum dan mudah terlewat dalam pengujian.
BOLA: akses ke objek milik pihak lain
BOLA terjadi ketika pemanggil dapat membaca atau mengubah objek yang bukan miliknya hanya dengan mengganti ID.
Misalnya:
GET /users/123/invoices
Jika token agen dapat mengakses endpoint tersebut, tetapi server tidak memblokir permintaan berikut:
GET /users/456/invoices
maka Anda memiliki kerentanan BOLA.
Server mungkin sudah memverifikasi bahwa token valid, tetapi belum memverifikasi bahwa token tersebut berhak mengakses data pengguna 456.
Untuk agen AI yang dapat mencoba banyak ID dengan cepat, BOLA dapat berubah menjadi mekanisme eksfiltrasi data.
BFLA: akses ke fungsi di luar peran
BFLA terjadi ketika token dengan hak rendah dapat memanggil fungsi berprivilege tinggi.
Contoh:
DELETE /users/456
POST /admin/reset
Agen yang hanya bertugas meringkas data akun seharusnya tidak dapat menghapus atau menutup akun. Instruksi seperti “jangan lakukan itu” bukan kontrol keamanan.
Kontrol sebenarnya harus ada di server:
app.delete("/users/:id", requireRole("admin"), deleteUser);
Server harus menolak permintaan yang tidak berwenang, apa pun instruksi, prompt, atau perilaku kliennya.
Petakan Blast Radius Sebelum Memercayai Kunci
Blast radius menjawab pertanyaan berikut:
Jika token ini bocor atau agen bertindak di luar skrip, apa dampak terburuk yang mungkin terjadi?
Sebelum menjalankan agen di produksi, buat tabel untuk setiap kredensialnya.
| Layanan | Data yang dapat dibaca | Data yang dapat ditulis/dihapus | Fungsi istimewa |
|---|---|---|---|
| Ticketing API | Tiket tenant sendiri | Draf respons | Tidak ada |
| Billing API | Tidak ada | Tidak ada | Tidak ada |
| User API | Profil pengguna terbatas | Tidak ada | Tidak ada |
| Admin API | Tidak ada | Tidak ada | Tidak ada |
Hindari deskripsi yang terlalu umum seperti “akses baca”. Bedakan antara:
- “Dapat membaca semua PII pelanggan di semua tenant”
- “Dapat membaca judul tiket dalam tenant sendiri”
Keduanya sama-sama terlihat sebagai akses baca di dashboard, tetapi risikonya sangat berbeda.
Insiden Juli 2026 adalah contoh yang relevan. Hugging Face menyatakan bahwa mereka menyelidiki akses yang dilaporkan dan berupaya menahan paparan. Terlepas dari lingkup akhir insiden tersebut, pelajarannya tetap sama: dampak aktor yang disusupi dibatasi oleh apa yang dapat dijangkau oleh kredensialnya, bukan oleh cara aktor itu masuk.
Gunakan aturan praktis ini:
Jika Anda tidak dapat menjelaskan blast radius sebuah kunci dalam tiga atau empat poin, kemungkinan besar kunci itu terlalu luas.
Pisahkan token, persempit lingkup, lalu ukur kembali.
Batasi Kunci dengan Scope, Peran, dan Token Berumur Pendek
Gunakan tiga lapisan kontrol yang saling melengkapi.
1. Scope OAuth yang sempit
Jika agen menggunakan OAuth, minta hanya scope yang dibutuhkan.
Contoh yang baik:
tickets.read
drafts.write
Contoh yang terlalu luas:
tickets.read
tickets.write
billing.read
users.admin
Scope tickets.read tidak seharusnya dibundel dengan tickets.write hanya karena lebih praktis.
Jika Anda perlu memahami pembagian akses ini, baca panduan tentang apa itu scope OAuth 2.0.
2. Pemeriksaan peran di sisi server
Scope menunjukkan izin yang diminta token. Server tetap harus menentukan izin yang benar-benar diberikan.
Terapkan pemeriksaan peran pada setiap endpoint yang mengubah status:
app.patch("/tickets/:id", requireRole("ticket_editor"), updateTicket);
app.delete("/tickets/:id", requireRole("admin"), deleteTicket);
app.post("/admin/reset", requireRole("admin"), resetSystem);
Lapisan ini membantu menutup BFLA karena server menolak fungsi admin, bahkan jika klien atau token mencoba memanggilnya.
3. Token berumur pendek
Token yang tidak pernah kedaluwarsa dapat digunakan penyerang selama berbulan-bulan.
Gunakan token yang kedaluwarsa dalam menit atau jam, lalu perbarui melalui alur yang terkontrol. Token bearer dan JWT bertanda tangan dapat mendukung pola ini.
Token berumur pendek tidak menghentikan penyerang aktif di sesi saat ini. Namun, token tersebut membatasi berapa lama kredensial curian tetap berguna.
Simpan Kredensial dengan Aman
Kunci yang dilingkupkan dengan baik tetap berbahaya jika bocor. Kebocoran paling umum biasanya bukan serangan rumit, melainkan token yang ditempelkan ke:
- kode sumber,
- file konfigurasi,
- pesan chat,
- atau commit Git.
Simpan kredensial agen dalam variabel lingkungan atau secret manager, lalu injeksikan nilainya saat runtime.
Jangan lakukan ini:
const API_KEY = "sk_live_example_secret";
Gunakan pola seperti ini:
const API_KEY = process.env.AGENT_TICKETS_API_KEY;
Panduan cara yang tepat untuk menyimpan kunci API membahas pola ini, termasuk alasan secret manager lebih cocok daripada file .env ketika Anda mengelola banyak environment.
Apidog membantu menyimpan token per agen sebagai variabel environment, bukan sebagai string langsung di definisi request. Anda dapat menggunakan request yang sama tanpa mengekspos nilai token ke proyek bersama atau kontrol versi.
Namun, batasannya perlu jelas. Apidog tidak:
- merotasi rahasia Anda,
- mengamankan jaringan,
- memantau penyalahgunaan runtime,
- atau menggantikan kontrol cloud dan logging.
Rotasi rahasia, kontrol egress jaringan, dan monitoring tetap berada di secret manager, penyedia cloud, serta stack observability Anda. Peran Apidog adalah membantu Anda mendefinisikan, menguji, dan mendokumentasikan izin setiap kunci sebelum digunakan.
Uji Bahwa Kunci “Hanya-Baca” Benar-Benar Menolak Penulisan
Ini adalah langkah yang sering dilewatkan.
Anda sudah memberi label token sebagai “hanya-baca”. Anda sudah menetapkan scope dan peran. Tetapi apakah Anda sudah membuktikannya?
Label “hanya-baca” hanyalah klaim sampai Anda mencoba operasi tulis dan server benar-benar menolaknya.
Gunakan token hak rendah agen pada endpoint nyata. Untuk setiap operasi yang tidak boleh dilakukan, kirim request dan pastikan hasilnya ditolak.
Setiap operasi tulis dengan token hanya-baca harus mengembalikan 401 atau 403. Respons 2xx harus membuat pengujian gagal.
| Kasus Uji | Permintaan | Token yang digunakan | Status yang diharapkan |
|---|---|---|---|
| Baca tiket sendiri | GET /tickets/1001 |
agen hanya-baca | 200 |
| Tulis tiket | PATCH /tickets/1001 |
agen hanya-baca |
401 atau 403
|
| Hapus tiket | DELETE /tickets/1001 |
agen hanya-baca |
401 atau 403
|
| Baca tenant lain — BOLA | GET /tickets/9999 |
agen hanya-baca |
403 atau 404
|
| Panggil fungsi admin — BFLA | POST /admin/reset |
agen hanya-baca |
401 atau 403
|
Contoh assertion pengujian:
pm.test("Token hanya-baca tidak boleh mengubah tiket", () => {
pm.expect(pm.response.code).to.be.oneOf([401, 403]);
});
pm.test("Respons tidak boleh berhasil", () => {
pm.expect(pm.response.code).to.not.be.within(200, 299);
});
Jalankan suite ini di CI setiap kali Anda mengubah:
- konfigurasi autentikasi,
- definisi scope,
- middleware otorisasi,
- endpoint,
- atau peran agen.
Pastikan bukan hanya status responsnya. Jika memungkinkan, validasi juga bahwa respons tidak membocorkan data parsial.
Contoh: 403 yang tetap mengembalikan detail tiket sensitif masih merupakan bug.
Untuk cakupan pengujian yang lebih luas, gunakan daftar periksa pengujian keamanan API. Jika ingin menerapkan pola ini pada endpoint sendiri, Anda dapat mencoba Apidog secara gratis dan menghubungkan skenario penolakan negatif ke suite pengujian.
Perlu diingat: pengujian yang lulus hanya membuktikan bahwa request spesifik yang Anda coba berhasil ditolak. Itu tidak membuktikan tidak ada jalur lain yang terbuka. Perlakukan suite negatif sebagai batas minimum yang harus selalu dijaga, lalu tambahkan kasus baru seiring API berkembang.
Daftar Periksa Blast Radius untuk Minggu Ini
Anda tidak memerlukan tim keamanan besar untuk memperkecil risiko kunci agen. Mulai dengan daftar berikut:
- Tulis tugas agen dalam satu kalimat.
- Daftarkan hanya tindakan yang benar-benar dibutuhkan tugas tersebut.
- Berikan satu kredensial unik untuk setiap agen.
- Nonaktifkan token admin atau token bersama yang diwarisi.
- Petakan blast radius: layanan, objek yang dapat dibaca, objek yang dapat ditulis, dan fungsi admin.
- Pangkas scope yang tidak diperlukan, termasuk izin “berjaga-jaga”.
- Tambahkan pemeriksaan peran sisi server pada setiap endpoint yang mengubah status.
- Gunakan token berumur pendek dengan alur refresh terkontrol.
- Pindahkan semua rahasia ke environment variable atau secret manager.
- Pastikan token tidak pernah masuk ke commit Git.
- Buat pengujian negatif untuk operasi tulis, akses lintas tenant, dan endpoint admin.
- Jalankan pengujian tersebut di CI.
Setelah daftar ini selesai, pertanyaan “apa yang dapat dilakukan kunci agen kita?” akan memiliki jawaban yang tertulis, terukur, dan teruji.
FAQ
Apa arti least privilege secara spesifik untuk agen AI?
Artinya kredensial agen hanya memberikan tindakan yang dibutuhkan tugasnya, tanpa izin tambahan. Karena agen dapat berjalan secara otonom dan melakukan banyak panggilan dalam waktu singkat, token yang terlalu luas dapat menyebabkan kerusakan lebih besar dibanding token yang sama di tangan pengguna manusia. Terapkan pembatasan di sisi server, bukan hanya dalam instruksi agen.
Apa perbedaan BOLA dan BFLA?
BOLA berkaitan dengan akses data atau objek. Pemanggil dapat mengakses objek yang tidak seharusnya dijangkau, biasanya dengan mengganti ID dalam request.
BFLA berkaitan dengan akses fungsi. Pemanggil dapat menjalankan fungsi di atas tingkat izinnya, misalnya endpoint admin atau penghapusan data.
Keduanya harus ditutup dengan pemeriksaan otorisasi di sisi server.
Bagaimana memverifikasi bahwa sebuah kunci benar-benar hanya-baca?
Kirim request PATCH, POST, atau DELETE menggunakan token tersebut. Server harus mengembalikan 401 atau 403. Perlakukan respons 2xx sebagai kegagalan, otomatisasikan pengujian ini, dan jalankan di CI sebelum rilis.
Apakah token berumur pendek saja sudah cukup?
Tidak. Token berumur pendek membatasi masa pakai kredensial yang bocor, tetapi tidak memperbaiki scope yang terlalu luas atau menghentikan penyerang aktif dalam sesi berjalan. Pasangkan dengan scope ketat, pemeriksaan peran sisi server, dan penyimpanan rahasia yang aman.
Di mana Apidog membantu, dan di mana tidak?
Apidog membantu Anda:
- menguji endpoint dengan token berhak rendah,
- memastikan operasi tulis mengembalikan
401atau403, - menyimpan autentikasi dalam variabel environment,
- dan mendokumentasikan jangkauan setiap kunci.
Apidog bukan pengganti firewall jaringan, rotasi rahasia, monitoring runtime, atau guardrail model. Kontrol tersebut harus berada di platform cloud, secret manager, dan stack logging Anda.
Haruskah setiap agen memiliki kunci sendiri?
Ya. Kredensial per agen memungkinkan Anda mencabut akses satu agen tanpa merusak agen lain. Selain itu, log dapat mengaitkan setiap request ke satu identitas yang jelas. Token bersama membuat investigasi, rotasi, dan pencabutan jauh lebih sulit.
Top comments (0)