Pelajari cara mendesain jaringan multi-agent yang aman: topologi agent pribadi versus publik, kebijakan egress dan ingress, penggunaan service mesh, serta hardening seperti rate limiting, sanitasi input, dan sandboxing eksekusi tool di remote agent.

Di episode 12 kita membangun jembatan antar framework: mengekspos agent ADK lewat to_a2a, memakai remote agent sebagai sub-agent, dan membungkus framework lain dengan adapter. Kini agent-agent kalian mulai berkomunikasi. Pertanyaan berikutnya mengikuti: bagaimana mengamankan seluruh jaringan itu?
Masalahnya berbeda dengan mengamankan satu service biasa. Agent A2A adalah peer yang bisa memulai aksi, bukan sekadar endpoint yang melayani request. Sebuah agent yang terpapar publik bisa dipanggil oleh siapa saja, diminta menjalankan tool, dan hasilnya memengaruhi sistem lain. Roadmap episode ini: kita mulai dari membedakan agent pribadi dan publik, merancang kebijakan ingress dan egress, memanfaatkan service mesh untuk mTLS, lalu menutup dengan tiga teknik hardening — rate limiting, sanitasi input, dan sandboxing eksekusi tool.
Keputusan pertama dalam arsitektur multi-agent adalah klasifikasi tiap agent:
Prinsipnya sederhana: default-private. Semakin sedikit agent yang terpapar publik, semakin kecil attack surface-nya. Jika sebuah agent publik harus memanggil agent internal, jangan buka port agent internal ke internet — gunakan relay atau allowlist yang ketat. Satu pola umum adalah memisahkan keduanya secara fisik maupun logis:
DMZ / Public Zone
└── pricing-agent (publik, AgentCard di domain publik)
Internal Zone
└── orchestrator (pribadi)
├── sales-agent (pribadi)
└── reporting-agent (pribadi)Agent publik hanya bertugas menerima task dari partner; pekerjaan berat dilakukan agent internal. Beginilah cara meminimalkan risiko ketika satu agent publik dikompromikan.
Setelah topologi ditentukan, kita perlu menegakkan batas tersebut dengan network policy. Di Kubernetes, NetworkPolicy memungkinkan kita mendeklarasikan siapa yang boleh mengirim lalu lintas ke agent (ingress) dan ke mana agent boleh mengirim (egress). Contoh berikut menggabungkan keduanya: hanya orchestrator yang boleh memanggil agent internal, dan agent internal hanya boleh mengirim ke range internal 10.0.0.0/8 — sekaligus menjadi pertahanan awal terhadap SSRF. Terapkan dengan kubectl apply -f network-policy.yaml.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: agent-policy
spec:
podSelector:
matchLabels:
app: internal-agent
policyTypes:
- Ingress
- Egress
ingress:
- from:
- podSelector:
matchLabels:
app: orchestrator
ports:
- port: 8000
egress:
- to:
- ipBlock:
cidr: 10.0.0.0/8
ports:
- port: 443
- port: 8000Warning
Policy egress sering diabaikan, padahal ini pertahanan kunci. LLM yang menerima prompt jahat bisa memerintahkan agent memanggil URL internal. Dengan egress yang dibatasi ke range internal tertentu, damage prompt injection bisa ditekan drastis.
Ketika jumlah agent bertambah, mengelola sertifikat dan observability secara manual jadi tidak masuk akal. Di sinilah service mesh berperan. Service mesh seperti Istio atau Linkerd menyediakan:
Ilustrasi alur mTLS di service mesh:
orchestrator ──TLS──▶ Envoy sidecar ──mTLS──▶ Envoy sidecar ──TLS──▶ sales-agent
│ │
└───── otel telemetry & access log diteruskan ke mesh ─────────┘Karena A2A berjalan di atas HTTP, service mesh "tidak peduli" isi payload JSON-RPC. Ia hanya melihat trafik HTTP biasa, sehingga integrasi service mesh tidak memerlukan perubahan di kode agent sama sekali. Keuntungan terbesarnya: identity berbasis mTLS menggantikan pengecekan IP ad hoc, dan lalu lintas antar agent otomatis terenkripsi.
Agent publik wajib dibatasi laju request-nya, baik untuk mencegah penyalahgunaan maupun melindungi LLM backend dari biaya membengkak. Rate limiting bisa dilakukan di reverse proxy atau di middleware aplikasi.
Contoh di Nginx, membatasi 10 request per detik per client dengan burst kecil:
limit_req_zone $binary_remote_addr zone=a2a:10m rate=10r/s;
server {
listen 443 ssl;
location / {
limit_req zone=a2a burst=20 nodelay;
proxy_pass http://a2a-agent:8000;
}
}Info
Saat dipanggil oleh agent lain, key rate limit yang lebih adil adalah identitas client agent dari autentikasi, bukan sekadar IP. Dua agent partner di balik NAT yang sama akan saling blokir jika key-nya hanya IP; padukan rate limiting dengan identitas token untuk hasil yang akurat.
Input dari agent lain tidak boleh dipercaya mentah-mentah. Sebuah Message A2A berisi teks yang pada akhirnya diteruskan ke LLM, path file, atau perintah shell. Langkah sanitasi yang wajib:
file part hanya berisi mimeType yang diizinkan dan URL yang masuk allowlist, bukan skema file:// atau IP internal.Contoh validasi sederhana di Python:
MAX_TEXT_LEN = 20_000
ALLOWED_MIME = {"text/plain", "application/json", "image/png"}
def validate_message(part):
if part.kind == "text" and len(part.text) > MAX_TEXT_LEN:
raise ValueError("text part too large")
if part.kind == "file":
if part.mimeType not in ALLOWED_MIME:
raise ValueError("mime type not allowed")
if part.uri.startswith(("file:", "http://10.", "http://169.254.")):
raise ValueError("uri not allowed")
return TrueIngat: sanitasi input di sini bukan pengganti autentikasi, melainkan lapisan pertahanan kedua jika autentikasi lolos atau jika partner ternyata tidak tepercaya.
Bagian paling berbahaya dari sebuah agent adalah tool execution: menjalankan shell, memproses file, atau melakukan aksi sistem. Ketika agent menerima task, eksekusi tool sebaiknya terjadi di lingkungan yang terisolasi, bukan di proses utama server.
Beberapa pendekatan sandboxing:
Contoh menjalankan tool dalam container tanpa network dan dengan limit ketat:
docker run --rm \
--network none \
--read-only \
--memory 512m \
--cpus 1 \
--cap-drop ALL \
--pids-limit 64 \
sandbox-runner \
python run_tool.pyDanger
Jangan pernah menjalankan tool yang menerima input dari agent eksternal di proses utama yang punya akses ke database dan secrets. Satu prompt injection yang berhasil berubah menjadi eksekusi kode di environment yang sama dengan data produksi kalian.
Kombinasi ideal: sandbox untuk isolasi eksekusi, egress policy untuk membatasi network, dan rate limit sebagai pengaman biaya. Ketiganya bekerja bersama menciptakan pertahanan berlapis.
Pada episode ini kita membangun lapisan infrastruktur untuk jaringan multi-agent yang aman. Kita mengklasifikasikan agent menjadi pribadi dan publik dengan prinsip default-private, menegakkan pembatasan lalu lintas lewat ingress dan egress policy, menyerahkan mTLS dan observability ke service mesh, lalu memperkeras tiap agent dengan rate limiting, sanitasi input, dan sandboxing eksekusi tool.
Inti yang harus dibawa pulang:
Langkah-langkah ini sudah membuat jaringan lebih sulit diserang. Namun keamanan sejati lahir dari berpikir seperti penyerang — memetakan ancaman sebelum menambal satu per satu.
Di episode 14 selanjutnya kita akan membahas Threat Modeling & Vulnerability Awareness: ancaman seperti spoofing agent card, prompt injection via messages, kebocoran data antar tenant, dan SSRF, beserta mitigasi signed security cards, mTLS/TLS, allowlist partner, dan audit trail. Sampai jumpa!