Kod Çalıştırma İçin Güvenlik İlkeleri
Yetenek kısıtlamaları, ağ yalıtımı, dosya sistemi sınırları ve zaman aşımı süreleri.
Kod Çalıştırma İçin Güvenlik İlkeleri, CoddyKit'te ücretsiz bir AI Agents dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, AI Agents öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. AI Agents kursu toplamda 4 dersten oluşur.
Politikalar Tek Başına Neden Yeterli Değildir
LLM'ye “ağa erişmeyin” demek bir güvenlik denetimi değil, yalnızca bir ipucudur. LLM bunu yok sayabilir, güvenlik kısıtlamaları aşılmış olabilir veya oluşturulan kod bu kuralı dolaylı olarak ihlal edebilir.
Gerçek güvenlik politikaları yalnızca istemde değil, yürütme katmanında uygulanmalıdır.
Yetenek Kısıtlamalarına Genel Bakış
Yetenek kısıtlamaları, korumalı alandaki bir sürecin OS düzeyinde neler yapabileceğini sınırlar. Linux yetenekleri, root ayrıcalığını tek tek bırakılabilen ayrıntılı yetkilere böler.
Gereken asgari yetenekler dışındaki tüm yetenekleri bırakmaya en az ayrıcalık ilkesi denir.
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())/tmp Dışındaki Disk Yazmalarını Engelleme
Salt okunur bir kök dosya sistemi kullanın ve yalnızca /tmp yolunu yazılabilir olarak bağlayın. Bu, kodun sistem dosyalarını değiştirmesini veya belirlenmiş geçici çalışma alanının dışına veri kalıcı olarak yazmasını engeller.
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 ReadOnlyFileSystemseccomp Profilleri: Sistem Çağrılarını Filtreleme
seccomp (güvenli hesaplama modu), izin verilen sistem çağrılarının bir listesini belirtmenizi sağlar. Listede bulunmayan herhangi bir sistem çağrısı, sürecin SIGSYS ile sonlandırılmasına neden olur.
Docker varsayılan bir seccomp profiliyle birlikte gelir. Daha kısıtlayıcı olmak için özel bir JSON profili sağlayabilirsiniz.
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())Kaynak Sınırları: CPU, Bellek, Zaman
Her korumalı alanın uygulaması gereken üç kaynak sınırı şunlardır:
- Bellek:
mem_limit— OOM saldırılarını önleme - CPU:
nano_cpusveyacpu_quota— CPU tükenmesini önleme - Zaman: yürütme zaman aşımı — sonsuz döngüleri önleme
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 secondsPython İçe Aktarmalarını İzin Listesine Alma
Kodu yürütmeden önce içe aktarma ifadeleri için AST'yi tarayın. İzin listesinde bulunmayan tüm içe aktarmaları reddedin. Bu, derinlemesine bir savunma katmanıdır; OS düzeyindeki denetimlerin yerine geçmez, ancak bariz politika ihlallerini erkenden yakalamak için kullanışlıdır.
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)')) # []Tehlikeli Kod Kalıplarını Algılama
İçe aktarmaların ötesinde, içe aktarma kısıtlamalarını aşan kalıpları da denetleyin: __import__, exec(), eval(), compile() ve /tmp dışındaki yollarla kullanılan open().
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']Çıktı Boyutu Sınırları
Kontrolden çıkan bir yazdırma döngüsü gigabaytlarca çıktı üretebilir. stdout/stderr akışlarını makul bir boyutla (örneğin 1 MB) sınırlandırın; sınır aşılırsa çıktıyı kesin veya kapsayıcıyı sonlandırın.
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'])
Yeni Ayrıcalık Kazanmayı Engelleyen Bayrak
no-new-privileges güvenlik seçeneği, sürecin setuid ikilileri veya sudo aracılığıyla ek ayrıcalıklar kazanmasını engeller. Kod bir kabuğa düşse bile ayrıcalıklarını yükseltemez.
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'Tüm İlkeleri Birleştirme
Üretim kalitesinde bir korumalı çalışma alanı tüm katmanları birleştirir: OS yeteneklerinin kaldırılması, seccomp profili, salt okunur dosya sistemi, no-new-privileges, ağın devre dışı bırakılması, kaynak sınırları ve zaman aşımı. Katmanlı savunma, bir katmanın aşılması durumunda bunun başka bir katman tarafından durdurulmasını sağlar.
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)}İlke İhlallerini Günlükleme
Bir ilke ihlali (engellenen içe aktarma, tehlikeli çağrı veya zaman aşımı) algılandığında olayı temsilci oturum ID'si, kod parçacığının karma değeri ve ihlal türüyle birlikte günlüğe kaydedin. Bu bilgiler bir güvenlik paneline aktarılır ve ilkelerin zaman içinde ayarlanmasına yardımcı olur.
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 resultseccomp profilindeki 'defaultAction: SCMP_ACT_ERRNO' ayarı ne yapar?
seccomp profilleri, bir sürecin hangi sistem çağrılarını gerçekleştirebileceğini denetler. defaultAction alanı, profilde açıkça listelenmeyen sistem çağrıları için ne yapılacağını belirler.
Güvenlik İlkelerinin Özeti
Etkili kod çalıştırma güvenliği birden çok katman gerektirir: Linux yeteneklerinin kaldırılması, seccomp sistem çağrısı filtrelemesi, tmpfs geçici çalışma alanına sahip salt okunur dosya sistemi, no-new-privileges, ağın devre dışı bırakılması, bellek/CPU/zaman sınırları ve AST düzeyinde içe aktarma denetimi.
Tek bir katman yeterli değildir — katmanlı savunma, her katmanın diğerlerindeki aşmaları telafi etmesi anlamına gelir.
Sıkça Sorulan Sorular
“Kod Çalıştırma İçin Güvenlik İlkeleri” dersi ücretsiz mi?
Evet — “Kod Çalıştırma İçin Güvenlik İlkeleri” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve AI Agents kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. AI Agents kursu toplamda 4 dersten oluşur.
“Kod Çalıştırma İçin Güvenlik İlkeleri” dersinde ne öğreneceğim?
Yetenek kısıtlamaları, ağ yalıtımı, dosya sistemi sınırları ve zaman aşımı süreleri. AI Agents ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
AI Agents öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te AI Agents, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“Kod Çalıştırma İçin Güvenlik İlkeleri” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu AI Agents dersinde kod yazıp çalıştırabilir miyim?
Evet. Her AI Agents dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Docker Tabanlı Aracı Korumalı Alanları
- Yüksek Güvenlikli Kod Aracıları İçin VM Yalıtımı
- E2B ve Bulut Korumalı Alan Hizmetleri
- Kod Çalıştırma İçin Güvenlik İlkeleri