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 ReadOnlyFileSystemProfil 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_cpusataucpu_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 secondsMengizinkan 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 resultApa 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
- Sandbox Agen Berbasis Docker
- Isolasi VM untuk Agen Kode dengan Keamanan Tinggi
- Layanan Sandbox E2B dan Cloud
- Kebijakan Keamanan untuk Eksekusi Kode