0Pricing
AI Agents · Pelajaran

Kebijakan Keamanan untuk Eksekusi Kode

Pembatasan kapabilitas, isolasi jaringan, batasan sistem berkas, dan batas waktu.

Kebijakan Keamanan untuk Eksekusi Kode adalah pelajaran AI Agents gratis di CoddyKit. Ini adalah pelajaran 4 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.

Mengapa Kebijakan Saja Tidak Cukup

Memberi tahu LLM “jangan mengakses jaringan” bukanlah kontrol keamanan — itu hanya petunjuk. LLM mungkin mengabaikannya, dibobol, atau kode yang dihasilkan mungkin secara tidak langsung melanggar aturan tersebut.

Kebijakan keamanan yang nyata harus ditegakkan pada lapisan eksekusi, bukan hanya dalam instruksi.

Gambaran Umum Pembatasan Kapabilitas

Pembatasan kapabilitas membatasi tindakan yang dapat dilakukan proses dalam lingkungan terisolasi pada tingkat OS. Kapabilitas Linux memecah hak istimewa pengguna root menjadi kemampuan terperinci yang dapat dihapus satu per satu.

Menghapus semua kapabilitas kecuali yang minimum diperlukan disebut prinsip hak istimewa minimum.

import docker
client = docker.from_env()

# Drop all Linux capabilities
output = client.containers.run(
    'python:3.12-slim',
    'python -c "print(\"safe run\")"',
    cap_drop=['ALL'],
    network_disabled=True,
    mem_limit='256m',
    auto_remove=True
)
print(output.decode())

Memblokir Penulisan ke Disk di Luar /tmp

Gunakan sistem berkas akar hanya-baca dan pasang hanya /tmp sebagai lokasi yang dapat ditulis. Hal ini mencegah kode mengubah berkas sistem atau menyimpan data di luar area kerja sementara yang ditentukan.

import tempfile, docker
client = docker.from_env()

with tempfile.TemporaryDirectory() as tmpdir:
    output = client.containers.run(
        'python:3.12-slim',
        'python -c "open(\"/tmp/ok.txt\",\"w\").write(\"ok\"); print(open(\"/tmp/ok.txt\").read())"',
        read_only=True,
        tmpfs={'/tmp': 'size=64m,mode=1777'},
        network_disabled=True,
        mem_limit='128m',
        auto_remove=True
    )
    print(output.decode())  # 'ok' — /tmp write allowed
    # Writing anywhere else raises ReadOnlyFileSystem

Profil seccomp: Penyaringan Panggilan Sistem

seccomp (mode komputasi aman) memungkinkan Anda menentukan daftar izin panggilan sistem. Panggilan sistem apa pun yang tidak ada dalam daftar tersebut menyebabkan proses dihentikan dengan SIGSYS.

Docker menyediakan profil seccomp bawaan. Anda dapat memberikan profil JSON khusus agar pembatasannya lebih ketat.

import json, docker
client = docker.from_env()

# Minimal seccomp profile: only allow read, write, open, close, exit
seccomp_profile = json.dumps({
    'defaultAction': 'SCMP_ACT_ERRNO',
    'architectures': ['SCMP_ARCH_X86_64'],
    'syscalls': [
        {'names': ['read', 'write', 'open', 'openat', 'close',
                   'fstat', 'mmap', 'mprotect', 'munmap', 'brk',
                   'exit', 'exit_group', 'rt_sigaction',
                   'rt_sigprocmask', 'futex'],
         'action': 'SCMP_ACT_ALLOW'}
    ]
})

output = client.containers.run(
    'python:3.12-slim',
    'python -c "print(1+1)"',
    security_opt=[f'seccomp={seccomp_profile}'],
    auto_remove=True
)
print(output.decode())

Batas Sumber Daya: CPU, Memori, Waktu

Tiga batas sumber daya yang harus diberlakukan setiap lingkungan terisolasi:

  • Memori: mem_limit — mencegah serangan OOM
  • CPU: nano_cpus atau cpu_quota — mencegah penghabisan CPU
  • Waktu: batas waktu eksekusi — mencegah perulangan tak terbatas
output = client.containers.run(
    'python:3.12-slim',
    'python -c "import time; time.sleep(100)"',
    mem_limit='128m',
    nano_cpus=500_000_000,   # 0.5 CPU
    network_disabled=True,
    auto_remove=True,
    timeout=10               # kill after 10 seconds
)
# Raises ReadTimeout after 10 seconds

Mengizinkan Impor Python melalui Daftar Izin

Sebelum menjalankan kode, pindai AST untuk mencari pernyataan impor. Tolak setiap impor yang tidak ada dalam daftar izin. Ini merupakan lapisan pertahanan berlapis — bukan pengganti kontrol tingkat OS, tetapi berguna untuk mendeteksi pelanggaran kebijakan yang jelas sejak awal.

import ast

ALLOWED_IMPORTS = {'math', 'statistics', 'json', 'csv', 'datetime', 'collections', 're'}

def check_imports(code: str) -> list[str]:
    tree = ast.parse(code)
    blocked = []
    for node in ast.walk(tree):
        if isinstance(node, ast.Import):
            for alias in node.names:
                if alias.name.split('.')[0] not in ALLOWED_IMPORTS:
                    blocked.append(alias.name)
        elif isinstance(node, ast.ImportFrom):
            if node.module and node.module.split('.')[0] not in ALLOWED_IMPORTS:
                blocked.append(node.module)
    return blocked

print(check_imports('import socket; print(1)'))   # ['socket']
print(check_imports('import math; print(math.pi)'))  # []

Mendeteksi Pola Kode Berbahaya

Selain impor, periksa pola yang dapat melewati pembatasan impor: __import__, exec(), eval(), compile(), serta open() dengan jalur di luar /tmp.

import ast

DANGEROUS_CALLS = {'exec', 'eval', 'compile', '__import__', 'breakpoint'}

def check_dangerous_calls(code: str) -> list[str]:
    tree = ast.parse(code)
    found = []
    for node in ast.walk(tree):
        if isinstance(node, ast.Call):
            if isinstance(node.func, ast.Name):
                if node.func.id in DANGEROUS_CALLS:
                    found.append(node.func.id)
            elif isinstance(node.func, ast.Attribute):
                if node.func.attr in DANGEROUS_CALLS:
                    found.append(node.func.attr)
    return found

print(check_dangerous_calls('exec("import os")'))  # ['exec']

Batas Ukuran Keluaran

Perulangan pencetakan yang tidak terkendali dapat menghasilkan keluaran hingga gigabita. Batasi keluaran standar dan galat standar ke ukuran yang wajar (misalnya, 1 MB), lalu potong keluaran atau hentikan kontainer jika batas terlampaui.

MAX_OUTPUT_BYTES = 1 * 1024 * 1024  # 1 MB

def run_with_output_limit(client, code: str) -> dict:
    container = client.containers.run(
        'python:3.12-slim',
        f'python -c "{code}"',
        mem_limit='256m',
        network_disabled=True,
        detach=True
    )
    try:
        container.wait(timeout=30)
        logs = container.logs(stdout=True, stderr=True)
        if len(logs) > MAX_OUTPUT_BYTES:
            return {'success': False, 'error': 'Output too large'}
        return {'success': True, 'output': logs.decode(errors='replace')}
    finally:
        container.remove(force=True)

if __name__ == '__main__':
    class FakeContainer:
        def wait(self, timeout=30): pass
        def logs(self, stdout=True, stderr=True): return b'Analysis complete: 42 rows processed.'
        def remove(self, force=True): pass
    class FakeContainers:
        def run(self, *args, **kwargs): return FakeContainer()
    class FakeClient:
        containers = FakeContainers()

    result = run_with_output_limit(FakeClient(), 'print(42)')
    print('Success:', result['success'])
    print('Output :', result['output'])

Bendera Tanpa Hak Istimewa Baru

Opsi keamanan no-new-privileges mencegah proses memperoleh hak istimewa tambahan melalui biner setuid atau sudo. Meskipun kode masuk ke shell, kode tersebut tidak dapat meningkatkan hak istimewa.

output = client.containers.run(
    'python:3.12-slim',
    'python -c "import os; print(os.getuid())"',
    user='nobody',                              # run as non-root
    security_opt=['no-new-privileges:true'],    # no privilege escalation
    cap_drop=['ALL'],                           # no capabilities
    network_disabled=True,
    mem_limit='128m',
    auto_remove=True
)
print(output.decode())  # numeric UID of 'nobody'

Menggabungkan Semua Kebijakan

Sandbox siap produksi menggabungkan setiap lapisan: kapabilitas OS dikurangi, profil seccomp, sistem berkas hanya-baca, tanpa hak istimewa baru, jaringan dinonaktifkan, batas sumber daya, dan batas waktu. Pertahanan berlapis memastikan bahwa celah pada satu lapisan dihentikan oleh lapisan lainnya.

import tempfile, json, docker
client = docker.from_env()

def maximum_security_run(code: str) -> dict:
    with tempfile.TemporaryDirectory() as tmpdir:
        try:
            out = client.containers.run(
                'python:3.12-slim',
                f'python -c "{code}"',
                user='nobody',
                security_opt=['no-new-privileges:true'],
                cap_drop=['ALL'],
                network_disabled=True,
                read_only=True,
                tmpfs={'/tmp': 'size=32m,mode=1777'},
                mem_limit='128m',
                nano_cpus=500_000_000,
                auto_remove=True,
                timeout=15
            )
            return {'success': True, 'output': out.decode()}
        except Exception as e:
            return {'success': False, 'error': str(e)}

Pencatatan Pelanggaran Kebijakan

Saat pelanggaran kebijakan terdeteksi (impor yang diblokir, panggilan berbahaya, atau batas waktu), catat peristiwa tersebut bersama ID sesi agen, hash cuplikan kode, dan jenis pelanggaran. Data ini menjadi masukan untuk dasbor keamanan dan membantu menyempurnakan kebijakan seiring waktu.

import hashlib, logging, time

logging.basicConfig(level=logging.INFO)
security_logger = logging.getLogger('sandbox.security')

def policy_check_and_run(code: str, session_id: str) -> dict:
    violations = check_imports(code) + check_dangerous_calls(code)
    code_hash = hashlib.sha256(code.encode()).hexdigest()[:16]

    if violations:
        security_logger.warning(
            'POLICY_VIOLATION session=%s hash=%s violations=%s',
            session_id, code_hash, violations
        )
        return {'success': False, 'error': f'Blocked: {violations}'}

    result = maximum_security_run(code)
    security_logger.info(
        'EXEC session=%s hash=%s success=%s',
        session_id, code_hash, result['success']
    )
    return result

Apa fungsi pengaturan 'defaultAction: SCMP_ACT_ERRNO' pada profil seccomp?

Profil seccomp mengontrol panggilan sistem yang boleh dilakukan oleh suatu proses. Kolom defaultAction menentukan tindakan untuk panggilan sistem yang tidak tercantum secara eksplisit dalam profil.

Ringkasan Kebijakan Keamanan

Keamanan eksekusi kode yang efektif memerlukan beberapa lapisan: kapabilitas Linux dikurangi, penyaringan panggilan sistem oleh seccomp, sistem berkas hanya-baca dengan ruang kerja tmpfs, tanpa hak istimewa baru, jaringan dinonaktifkan, batas memori/CPU/waktu, dan pemeriksaan impor tingkat AST.

Tidak ada satu lapisan pun yang memadai — pertahanan berlapis berarti setiap lapisan mengatasi celah pada lapisan lainnya.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Kebijakan Keamanan untuk Eksekusi Kode” gratis?

Ya — teks lengkap “Kebijakan Keamanan untuk Eksekusi Kode” 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 “Kebijakan Keamanan untuk Eksekusi Kode”?

Pembatasan kapabilitas, isolasi jaringan, batasan sistem berkas, dan batas waktu. 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 4 dari 4.

Berapa lama pelajaran “Kebijakan Keamanan untuk Eksekusi Kode” 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. Sandbox Agen Berbasis Docker
  2. Isolasi VM untuk Agen Kode dengan Keamanan Tinggi
  3. Layanan Sandbox E2B dan Cloud
  4. Kebijakan Keamanan untuk Eksekusi Kode
← Kembali ke AI Agents