Aracı Eylemleri İçin İlke Uygulama
Eylem öncesi ilke kontrolleri, izinli/engelli listeleri ve dinamik ilke kuralları.
Aracı Eylemleri İçin İlke Uygulama, CoddyKit'te ücretsiz bir AI Agents dersidir. Bu, 4 dersinin 2. 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.
Aracı Politikasının Uygulanması Nedir?
Politikanın uygulanması, her aracı eyleminden önce çalışarak eyleme izin verilip verilmediğine karar veren çalışma zamanı geçididir. Bu geçit olmadan aracının tek kısıtlaması, atlatılabilen veya yanlış yorumlanabilen LLM talimatlarını izlemesidir.
Uygulama, LLM'nin dışında, altyapınızda gerçekleştirilmelidir.
Eylem Öncesi Denetim Kalıbı
Herhangi bir aracı çalıştırmadan önce can_agent_do(action, context) çağrısını yapın. Bu işlev, tek uygulama noktasıdır — eylem yürütmeye giden her yol buradan geçer.
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)İzin ve Engel Listelerini Tanımlama
İzin listesi, aracının gerçekleştirmesine izin verilen her eylemi sıralar. Listede olmayan her şey varsayılan olarak engellenir. Engel listesi, bağlamdan bağımsız olarak hiçbir zaman izin verilmemesi gereken eylemler için ek bir güvenlik katmanı sağlar.
# 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}")
Bağlama Özgü Politika Denetimleri
Basit izin ve engel listelerinin ötesinde, politikalar çoğu zaman bağlama bağlıdır: kullanıcı kimdir, rolü nedir, saat kaçtır, hedef kaynak hangisidir? Bunlar bağlama özgü denetimlerdir.
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))
Politika Motorundan Dinamik Politikalar
Sabit kodlanmış politikaları üretim ortamında güncellemek zordur. Politikaları kod olarak değil veri olarak değerlendirmek için bir politika motoru (OPA — Açık Politika Aracısı gibi) kullanın. Politikalar, aracıyı yeniden dağıtmadan güncellenebilir.
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}'Kapatma ve Açma Yönünde Hata Verme
Politika motoru kullanılamadığında iki seçeneğiniz vardır:
- Kapatma yönünde hata verme: tüm eylemleri reddetmek. Güvenlidir, ancak aracı çalışmayı durdurur.
- Açma yönünde hata verme: tüm eylemlere izin vermek. Aracı çalışmaya devam eder, ancak politika uygulanmaz.
Güvenliğe duyarlı aracılarda her zaman kapatma yönünde hata verin. Düşük riskli eylemlere sahip üretkenlik aracıları için açma yönünde hata verme kabul edilebilir olabilir.
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)'Eylemleri Hız Sınırlama
Politikanın uygulanması hız sınırlarını içerebilir: bir aracının e-posta göndermesine izin verilebilir, ancak oturum başına yalnızca 5 e-posta gönderebilir. Sınır aşılırsa eylem reddedilir.
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}')
Politika İhlallerini Günlükleme
Politikanın her reddi tam bağlamıyla günlüğe kaydedilmelidir. Beklenmeyen aracı davranışlarında hata ayıklarken veya bir güvenlik olayını araştırırken ilk bakılacak yer bu günlüklerdir.
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, reasonKaynak Kapsamını Sınırlandırma
İzin verilen eylemler için bile aracının erişebileceği kaynağın kapsamını sınırlandırın. Kullanıcı A'nın belgelerini işleyen bir aracı, read_file izin listesinde olsa bile kullanıcı B'nin dosyalarını okuyamamalıdır.
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))
Politika Kurallarını Sınama
Politika kuralları koddur — sınanmaları gerekir. Reddetmelerin ve izinlerin doğru çalıştığından, uç durumların yanlışlıkla politika atlatmalarına yol açmadığından emin olmak için her kural için birim sınamaları yazın.
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()Politika Kararlarını Önbelleğe Alma
Her bir eylemde politika motorunu çağırmak, özellikle harici bir OPA hizmeti kullanıldığında gecikme ekler. Gidiş dönüşleri azaltmak için (eylem, bağlam karması) çiftlerine ait yakın tarihli kararları kısa bir TTL süresiyle önbelleğe alın.
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 resultPolitikanın Uygulanmasında “Kapatma Yönünde Hata Verme” Yaklaşımı Nedir?
Kapatma ve açma yönünde hata verme arasındaki seçim, her politika uygulama sistemi için temel bir güvenlik ödünleşimidir. Her yaklaşımın ne zaman uygun olduğunu bilmek, temel bir yönetişim kavramıdır.
Politikanın Uygulanması Özeti
Aracı politikasının uygulanması şunları kullanır: tek geçit olarak eylem öncesi denetim, temel kararlar için izin listeleri + engel listeleri, kaynak kapsamını ve rol denetimlerini belirlemek için bağlama özgü kurallar, güncellenebilir kurallar için dinamik politika motoru (OPA), oturum başına eylem hız sınırları ve güvenlik açısından kritik aracılar için varsayılan olarak kapatma yönünde hata verme.
Sıkça Sorulan Sorular
“Aracı Eylemleri İçin İlke Uygulama” dersi ücretsiz mi?
Evet — “Aracı Eylemleri İçin İlke Uygulama” 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.
“Aracı Eylemleri İçin İlke Uygulama” dersinde ne öğreneceğim?
Eylem öncesi ilke kontrolleri, izinli/engelli listeleri ve dinamik ilke kuralları. 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 2. dersidir.
“Aracı Eylemleri İçin İlke Uygulama” 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
- Aracılar İçin Değiştirilemez Eylem Günlüğü
- Aracı Eylemleri İçin İlke Uygulama
- Düzenleyici Uyumluluk: GDPR ve SOC2
- Döngüde İnsan Onay Kapıları