AI Agents · Pelajaran

Penegakan Kebijakan untuk Tindakan Agen

Pemeriksaan kebijakan sebelum tindakan, daftar izin/penolakan, dan aturan kebijakan dinamis.

Pelajaran 2 dari 413 langkah

Penegakan Kebijakan untuk Tindakan Agen adalah pelajaran AI Agents gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar AI Agents, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus AI Agents mencakup 4 pelajaran total.

Apa Itu Penegakan Kebijakan Agen?

Penegakan kebijakan adalah gerbang saat berjalan yang dijalankan sebelum setiap tindakan agen untuk menentukan apakah tindakan tersebut diizinkan. Tanpanya, satu-satunya batasan agen adalah kepatuhan LLM terhadap instruksi — yang dapat dilewati atau disalahartikan.

Penegakan harus berada di luar LLM, di dalam infrastruktur Anda.

Pola Pemeriksaan Sebelum Tindakan

Sebelum menjalankan alat apa pun, panggil can_agent_do(action, context). Fungsi ini merupakan satu-satunya titik penegakan — setiap jalur menuju eksekusi tindakan harus melewatinya.

def can_agent_do(action: str, context: dict) -> tuple[bool, str]:
    '''
    Returns (allowed: bool, reason: str).
    Context includes: user_id, agent_id, session_id, parameters, timestamp.
    '''
    # 1. Check denylist first (fast path for obvious violations)
    if action in DENIED_ACTIONS:
        return False, f'Action "{action}" is on the global denylist'

    # 2. Check allowlist
    if action not in ALLOWED_ACTIONS:
        return False, f'Action "{action}" is not on the allowlist'

    # 3. Context-specific checks
    return check_context_policy(action, context)

Menentukan Daftar Izin dan Daftar Penolakan

Daftar izin mencantumkan setiap tindakan yang boleh dilakukan agen. Apa pun yang tidak ada dalam daftar akan diblokir secara bawaan. Daftar penolakan memberikan lapisan keamanan tambahan untuk tindakan yang tidak boleh diizinkan dalam keadaan apa pun, terlepas dari konteksnya.

# Allowlist: tools the agent can use
ALLOWED_ACTIONS = {
    'web_search',
    'read_file',
    'write_file',
    'send_email',
    'create_calendar_event',
    'query_database',
    'execute_python_sandbox',
    'fetch_url',
    'create_ticket'
}

# Denylist: actions that are always blocked, regardless of context
DENIED_ACTIONS = {
    'delete_all_records',
    'export_entire_database',
    'send_mass_email',
    'modify_system_config',
    'create_admin_user',
    'disable_audit_logging'
}

if __name__ == '__main__':
    for action in ('web_search', 'send_mass_email'):
        print(f"{action}: allowed={action in ALLOWED_ACTIONS} denied={action in DENIED_ACTIONS}")

Pemeriksaan Kebijakan yang Spesifik terhadap Konteks

Selain daftar izin atau penolakan sederhana, kebijakan sering kali bergantung pada konteks: siapa penggunanya, apa perannya, jam berapa sekarang, dan apa sumber daya sasarannya? Semua ini merupakan pemeriksaan yang spesifik terhadap konteks.

from datetime import datetime, timezone

def check_context_policy(action: str, context: dict) -> tuple[bool, str]:
    user_id   = context.get('user_id', '')
    params    = context.get('parameters', {})
    user_role = context.get('user_role', 'user')

    # send_email: only agents with email_sender role
    if action == 'send_email':
        if user_role not in ('email_agent', 'admin'):
            return False, f'Role "{user_role}" cannot send emails'
        recipient = params.get('to', '')
        if not recipient.endswith('@trusted-domain.com'):
            return False, 'Email recipient must be in @trusted-domain.com'

    # write_file: path restrictions
    if action == 'write_file':
        path = params.get('path', '')
        if not path.startswith('/tmp/') and not path.startswith('/workspace/'):
            return False, f'File writes outside /tmp/ and /workspace/ are not allowed'

    return True, 'Permitted'

if __name__ == '__main__':
    ctx = {'user_id': 'u1', 'user_role': 'user',
           'parameters': {'to': 'someone@gmail.com'}}
    print('send_email as user:', check_context_policy('send_email', ctx))

    ctx2 = {'user_id': 'u1', 'user_role': 'user',
            'parameters': {'path': '/etc/passwd'}}
    print('write_file outside sandbox:', check_context_policy('write_file', ctx2))

Kebijakan Dinamis dari Mesin Kebijakan

Kebijakan yang ditulis langsung dalam kode sulit diperbarui di lingkungan produksi. Gunakan mesin kebijakan (seperti OPA — Agen Kebijakan Terbuka) untuk mengevaluasi kebijakan yang ditentukan sebagai data, bukan kode. Kebijakan dapat diperbarui tanpa menerapkan ulang agen.

import requests

OPA_URL = 'http://localhost:8181/v1/data/agent/allow'

def opa_policy_check(action: str, context: dict) -> tuple[bool, str]:
    payload = {
        'input': {
            'action':   action,
            'user_id':  context.get('user_id'),
            'role':     context.get('user_role', 'user'),
            'params':   context.get('parameters', {}),
            'time_utc': datetime.now(timezone.utc).isoformat()
        }
    }
    try:
        resp = requests.post(OPA_URL, json=payload, timeout=0.5)
        result = resp.json().get('result', {})
        allowed = result.get('allow', False)
        reason  = result.get('reason', 'Policy decision')
        return allowed, reason
    except Exception as e:
        # Fail closed: deny if policy engine is unreachable
        return False, f'Policy engine unavailable: {e}'

Gagal Tertutup vs Gagal Terbuka

Ketika mesin kebijakan tidak tersedia, Anda memiliki dua pilihan:

  • Gagal tertutup: tolak semua tindakan. Aman, tetapi agen berhenti bekerja.
  • Gagal terbuka: izinkan semua tindakan. Agen tetap bekerja, tetapi kebijakan tidak ditegakkan.

Untuk agen yang sensitif terhadap keamanan, selalu gunakan gagal tertutup. Untuk agen produktivitas dengan tindakan berisiko rendah, gagal terbuka mungkin dapat diterima.

FAIL_CLOSED = True  # Configure per agent

def safe_policy_check(action: str, context: dict) -> tuple[bool, str]:
    try:
        return can_agent_do(action, context)
    except Exception as e:
        if FAIL_CLOSED:
            return False, f'Policy check failed (fail-closed): {e}'
        else:
            # Log the failure but allow the action
            import logging
            logging.warning('Policy check error (fail-open): %s', e)
            return True, 'Policy check bypassed due to error (fail-open)'

Membatasi Laju Tindakan

Penegakan kebijakan dapat mencakup batas laju: agen boleh mengirim email, tetapi hanya 5 email per sesi. Jika batas tersebut terlampaui, tindakan akan ditolak.

from collections import defaultdict
import time

action_counts: dict[str, dict[str, int]] = defaultdict(lambda: defaultdict(int))
action_window_start: dict[str, float] = defaultdict(float)

ACTION_RATE_LIMITS = {
    'send_email':   {'limit': 5,  'window_secs': 3600},  # 5/hour
    'write_file':   {'limit': 50, 'window_secs': 300},
    'web_search':   {'limit': 20, 'window_secs': 60}
}

def check_rate_limit(action: str, session_id: str) -> tuple[bool, str]:
    limit_config = ACTION_RATE_LIMITS.get(action)
    if not limit_config:
        return True, 'No rate limit defined'

    window = limit_config['window_secs']
    now = time.time()
    key = f'{session_id}:{action}'

    if now - action_window_start[key] > window:
        action_counts[key] = defaultdict(int)
        action_window_start[key] = now

    action_counts[key]['count'] += 1
    if action_counts[key]['count'] > limit_config['limit']:
        return False, f'Rate limit exceeded: {action} ({limit_config["limit"]}/{window}s)'
    return True, 'Within rate limit'

if __name__ == '__main__':
    for i in range(6):
        allowed, reason = check_rate_limit('send_email', 'session-1')
    print(f'After 6 send_email calls: allowed={allowed}, reason={reason}')

Mencatat Pelanggaran Kebijakan

Setiap penolakan kebijakan harus dicatat beserta konteks lengkapnya. Catatan ini adalah tempat pertama yang perlu diperiksa saat menelusuri perilaku agen yang tidak terduga atau menyelidiki insiden keamanan.

import logging, json, time

policy_logger = logging.getLogger('agent.policy')

def enforced_action(agent_id: str, user_id: str, action: str,
                    context: dict, audit_log) -> tuple[bool, str]:
    allowed, reason = safe_policy_check(action, context)

    log_entry = {
        'ts':       time.time(),
        'agent_id': agent_id,
        'user_id':  user_id,
        'action':   action,
        'allowed':  allowed,
        'reason':   reason,
        'params':   context.get('parameters', {})
    }

    if allowed:
        policy_logger.info('ALLOWED %s', json.dumps(log_entry))
    else:
        policy_logger.warning('DENIED %s', json.dumps(log_entry))

    audit_log.append(
        agent_id, user_id,
        f'POLICY_{"ALLOW" if allowed else "DENY"}',
        {'action': action},
        {'allowed': allowed, 'reason': reason},
        context.get('session_id', '')
    )
    return allowed, reason

Membatasi Cakupan Sumber Daya

Bahkan untuk tindakan yang diizinkan, batasi sumber daya yang dapat diakses agen. Agen yang menangani dokumen pengguna A tidak boleh dapat membaca berkas pengguna B, meskipun read_file ada dalam daftar izin.

def check_resource_scope(action: str, context: dict) -> tuple[bool, str]:
    user_id  = context.get('user_id', '')
    params   = context.get('parameters', {})

    if action == 'read_file':
        path = params.get('path', '')
        # Each user's files must be under their own namespace
        if not path.startswith(f'/workspace/{user_id}/'):
            return False, (
                f'User {user_id} cannot read files outside '
                f'/workspace/{user_id}/'
            )

    if action == 'query_database':
        table = params.get('table', '')
        allowed_tables = {'products', 'public_docs', f'user_{user_id}_data'}
        if table not in allowed_tables:
            return False, f'Table "{table}" not in scope for user {user_id}'

    return True, 'Resource scope check passed'

if __name__ == '__main__':
    ctx = {'user_id': 'u1', 'parameters': {'path': '/workspace/u2/secret.txt'}}
    print('Cross-user file read:', check_resource_scope('read_file', ctx))

    ctx2 = {'user_id': 'u1', 'parameters': {'path': '/workspace/u1/notes.txt'}}
    print('Own file read:      ', check_resource_scope('read_file', ctx2))

Menguji Aturan Kebijakan

Aturan kebijakan adalah kode — aturan tersebut harus diuji. Tulis pengujian unit untuk setiap aturan guna memastikan penolakan dan pemberian izin bekerja dengan benar serta kasus tepi tidak menimbulkan pelewatan kebijakan secara tidak sengaja.

def test_policy_rules():
    # Denylist blocks unconditionally
    ok, msg = can_agent_do('delete_all_records', {'user_role': 'admin'})
    assert not ok, 'Denylist should block even for admin'

    # Email requires trusted domain
    ok, msg = can_agent_do('send_email', {
        'user_role': 'email_agent',
        'parameters': {'to': 'attacker@evil.com'}
    })
    assert not ok, 'Should block untrusted email recipient'

    # File write outside allowed paths
    ok, msg = can_agent_do('write_file', {
        'user_role': 'user',
        'parameters': {'path': '/etc/crontab'}
    })
    assert not ok, 'Should block write to /etc/'

    print('All policy tests passed')

test_policy_rules()

Menyimpan Sementara Keputusan Kebijakan

Memanggil mesin kebijakan untuk setiap tindakan dapat menambah keterlambatan, terutama saat menggunakan layanan OPA eksternal. Simpan sementara keputusan terbaru untuk pasangan tindakan dan ringkasan konteks dengan masa berlaku singkat guna mengurangi perjalanan bolak-balik.

import hashlib, time

policy_cache: dict[str, dict] = {}
POLICY_CACHE_TTL = 10  # seconds — short TTL so policy updates take effect quickly

def cached_policy_check(action: str, context: dict) -> tuple[bool, str]:
    ctx_hash = hashlib.md5(
        f'{action}:{context.get("user_id")}:{context.get("user_role")}'
        .encode()
    ).hexdigest()
    key = f'{action}:{ctx_hash}'
    entry = policy_cache.get(key)
    if entry and time.time() - entry['ts'] < POLICY_CACHE_TTL:
        return entry['result']
    result = can_agent_do(action, context)
    policy_cache[key] = {'result': result, 'ts': time.time()}
    return result

Apa pendekatan gagal tertutup dalam penegakan kebijakan?

Keputusan antara gagal tertutup dan gagal terbuka merupakan kompromi keamanan mendasar bagi sistem penegakan kebijakan apa pun. Mengetahui kapan setiap pendekatan tepat digunakan adalah konsep inti tata kelola.

Ringkasan Penegakan Kebijakan

Penegakan kebijakan agen menggunakan: pemeriksaan sebelum tindakan sebagai satu-satunya gerbang, daftar izin + daftar penolakan untuk keputusan dasar, aturan spesifik terhadap konteks untuk pembatasan cakupan sumber daya dan pemeriksaan peran, mesin kebijakan dinamis (OPA) untuk aturan yang dapat diperbarui, batas laju untuk setiap tindakan pada setiap sesi, serta bawaan gagal tertutup bagi agen yang kritis terhadap keamanan.

Gratis untuk memulai

Belajar AI Agents dengan tutor AI — gratis

Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.

Kursus
60
Pelajaran
239

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Penegakan Kebijakan untuk Tindakan Agen” gratis?

Ya — teks lengkap “Penegakan Kebijakan untuk Tindakan Agen” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus AI Agents, upgrade ke CoddyKit PRO. Kursus AI Agents mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Penegakan Kebijakan untuk Tindakan Agen”?

Pemeriksaan kebijakan sebelum tindakan, daftar izin/penolakan, dan aturan kebijakan dinamis. Kamu berlatih AI Agents dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai AI Agents?

Tidak diperlukan pengalaman sebelumnya. AI Agents di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.

Berapa lama pelajaran “Penegakan Kebijakan untuk Tindakan Agen” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran AI Agents ini?

Ya. Setiap pelajaran AI Agents menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Pencatatan Tindakan Agen yang Tidak Dapat Diubah
  2. Penegakan Kebijakan untuk Tindakan Agen
  3. Kepatuhan Regulasi: GDPR dan SOC2
  4. Gerbang Persetujuan dengan Keterlibatan Manusia
← Kembali ke AI Agents