Mengelola siklus hidup agen AI dengan pendekatan Infrastructure as Code (IaC) mirip Terraform—seperti konsep Kastor—memudahkan deployment multi-agen yang deterministik. Namun, agen AI memiliki karakteristik eksekusi non-deterministik dan sering membutuhkan akses langsung ke berbagai tool serta API pihak ketiga. Menyimpan API token langsung di dalam file deklarasi (spec) menciptakan kerentanan fatal berupa kebocoran kredensial ke Version Control System (VCS), context window LLM, atau output log eksekusi.

Artikel ini membahas arsitektur isolasi kredensial, validasi skema runtime menggunakan Zod, serta pembatasan blast radius token melalui scoped execution.

Vektor Ancaman Secret pada Agentic IaC

Pola deklarasi agen declarative menghadapi tiga titik kebocoran utama:

  1. Static Leakage: Token di-hardcode pada file spec YAML/JSON dan ter-commit ke repositori git.
  2. Prompt & Context Poisoning: Agen membaca env var mentah ke memori eksekusi dan memuntahkannya kembali ke LLM saat inference atau debugging.
  3. Tool Blast Radius: Tool yang diberikan token ber-scope luas (misal: repo:* GitHub alih-alih read-only issue) disalahgunakan melalui Indirect Prompt Injection.

Desain Spec Deklaratif yang Aman

Pendekatan aman melarang penulisan value secret secara literal. File spec hanya boleh mendefinisikan referensi ke secret provider (seperti AWS Secrets Manager, HashiCorp Vault, atau process environment).

agent:
  id: "pr-reviewer-bot"
  runtime: "node-20"
  tools:
    - name: "github_issue_reader"
      type: "builtin"
      permissions:
        - action: "read"
          scope: "issues"
      auth:
        type: "secret_ref"
        source: "env"
        key: "GH_READ_TOKEN"
    - name: "database_query"
      type: "mcp"
      auth:
        type: "vault"
        path: "secret/data/agents/db"
        key: "password"

Implementasi Parser dan Runtime Scoping

Parser spec wajib memvalidasi skema deklarasi sebelum agen diinisialisasi. Jika ada developer yang mencoba memasukkan token plaintext ke field referensi, parser harus menolak eksekusi.

Berikut contoh implementasi parser dengan zod di TypeScript yang memblokir literal token dan meresolusi kredensial secara aman:

import { z } from 'zod';

// Format deteksi token umum untuk memblokir literal leak
const PlaintextLeakDetector = z.string().refine(
  (val) => !/^(ghp_[a-zA-Z0-9]{36}|sk-[a-zA-Z0-9]{20,}|Bearer\s)/.test(val),
  { message: "Detected literal API token in spec file. Use secret_ref instead." }
);

const SecretRefSchema = z.discriminatedUnion('source', [
  z.object({
    source: z.literal('env'),
    key: PlaintextLeakDetector,
  }),
  z.object({
    source: z.literal('vault'),
    path: z.string(),
    key: PlaintextLeakDetector,
  }),
]);

export const AgentSpecSchema = z.object({
  id: z.string(),
  tools: z.array(
    z.object({
      name: z.string(),
      permissions: z.array(
        z.object({
          action: z.enum(['read', 'write', 'admin']),
          scope: z.string(),
        })
      ),
      auth: z.object({
        type: z.literal('secret_ref'),
      }).and(SecretRefSchema),
    })
  ),
});

// Runtime resolver: hanya injeksi nilai ke memory worker tool terkait
export function resolveSecret(ref: z.infer<typeof SecretRefSchema>): string {
  if (ref.source === 'env') {
    const secret = process.env[ref.key];
    if (!secret) throw new Error(`Missing environment variable: ${ref.key}`);
    return secret;
  }
  // ponytail: implementasi HashiCorp Vault client saat butuh dynamic TTL
  throw new Error(`Provider ${ref.source} not implemented yet`);
}

Masking Output dan Isolasi Proses

Mencegah secret bocor ke log eksekusi atau prompt LLM memerlukan masking engine di level stream I/O stdout/stderr agen:

export class LogSanitizer {
  private secrets = new Set<string>();

  registerSecret(value: string): void {
    if (value.length > 3) {
      this.secrets.add(value);
    }
  }

  sanitize(text: string): string {
    let sanitized = text;
    for (const secret of this.secrets) {
      sanitized = sanitized.replaceAll(secret, '***REDACTED***');
    }
    return sanitized;
  }
}

Mitigasi Blast Radius dengan Scoped Tool Execution

Prinsip Least Privilege wajib diterapkan pada level agen. Hindari membagikan satu API key master ke seluruh agen. Jalankan pola berikut:

  • Short-Lived Token: Gunakan OAuth token atau IAM Role berbasis OpenID Connect (OIDC) yang otomatis kedaluwarsa dalam 1 jam alih-alih personal access token statis.
  • Sandbox Isolasi Tool: Eksekusi tool pemanggil API (seperti REST client atau terminal executor) di container atau sub-process terisolasi, bukan di context engine runner utama.
  • Strict Tool Permission Mapping: Pastikan spec agen menolak eksekusi aksi di luar daftar permissions yang didaftarkan. Validasi ini dijalankan sebelum network payload dikirim ke API target.