Melindungi Akses Alat Ejen
Gunakan prinsip keistimewaan minimum pada kebenaran alat ejen, laksanakan langkah pengesahan sebelum tindakan yang memusnahkan data dan audit log tindakan ejen untuk mengesan tingkah laku tidak normal.
Melindungi Akses Alat Ejen ialah pelajaran AI Engineering Academy percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran AI Engineering Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus AI Engineering Academy merangkumi sejumlah 4 pelajaran.
Masalah Keselamatan Akses Alat
Apabila Anda memberikan alat kepada ejen AI, Anda memberikannya keupayaan untuk mengambil tindakan di dunia sebenar. Alat yang menghantar e-mel, menjalankan pertanyaan SQL, memanggil API pembayaran atau mengubah suai fail boleh menyebabkan kemudaratan besar jika ejen tersebut terjejas akibat suntikan gesaan atau sekadar melakukan kesilapan. Melindungi akses alat ejen bermaksud mereka bentuk lapisan alat Anda supaya kerosakan daripada setiap penggunaan alat dapat dihadkan, diaudit dan dikembalikan jika boleh.
Prinsip Keistimewaan Minimum
Gunakan prinsip keistimewaan minimum pada setiap alat: berikan ejen akses minimum yang diperlukan untuk menyelesaikan tugas yang diberikan kepadanya, dan tidak lebih daripada itu. Jika ejen perlu membaca rekod pelanggan, berikan sambungan pangkalan data baca sahaja — bukan sambungan pentadbir penuh yang Anda gunakan untuk penyelenggaraan. Jika ejen menghantar pemberitahuan, hadkan kunci API-nya kepada titik akhir pemberitahuan sahaja. Keistimewaan minimum mengehadkan jejari kesan daripada sebarang insiden keselamatan.
from enum import Enum
from dataclasses import dataclass
class Permission(Enum):
READ_CUSTOMER_PROFILE = 'read_customer_profile'
SEND_NOTIFICATION = 'send_notification'
READ_ORDER_HISTORY = 'read_order_history'
WRITE_CUSTOMER_PROFILE = 'write_customer_profile' # higher privilege
PROCESS_REFUND = 'process_refund' # highest risk
@dataclass
class AgentIdentity:
agent_id: str
allowed_permissions: set[Permission]
# Support chat agent: read-only + send notification only
SUPPORT_AGENT = AgentIdentity(
agent_id='support-agent-v1',
allowed_permissions={
Permission.READ_CUSTOMER_PROFILE,
Permission.READ_ORDER_HISTORY,
Permission.SEND_NOTIFICATION # can notify, but NOT write or refund
}
)
# NOT: give every agent all permissions for conveniencePelaksanaan Alat Berpagar Keizinan
Laksanakan keistimewaan minimum pada lapisan pelaksanaan, bukan hanya pada lapisan reka bentuk. Setiap panggilan alat mesti melalui pemeriksaan keizinan yang mengesahkan bahawa ejen pemanggil mempunyai keizinan yang diperlukan untuk tindakan khusus tersebut. Perkara ini tidak boleh dipintas oleh ejen atau suntikan gesaan kerana ia dikuatkuasakan dalam kod, bukan dalam gesaan LLM.
class ToolGateway:
def __init__(self, agent: AgentIdentity):
self.agent = agent
self.audit_log = []
def execute_tool(self, tool_name: str, required_permission: Permission, tool_fn, **kwargs) -> dict:
# Permission check - enforced in code, not in the LLM prompt
if required_permission not in self.agent.allowed_permissions:
self.log_denied(tool_name, required_permission, kwargs)
raise PermissionError(
f'Agent {self.agent.agent_id} does not have permission: {required_permission.value}'
)
# Execute tool
result = tool_fn(**kwargs)
self.log_allowed(tool_name, kwargs, result)
return result
def log_denied(self, tool: str, permission: Permission, args: dict):
entry = {'type': 'DENIED', 'agent': self.agent.agent_id, 'tool': tool, 'permission': permission.value, 'args': args}
self.audit_log.append(entry)
print(f'SECURITY: Permission denied - {entry}')
def log_allowed(self, tool: str, args: dict, result):
entry = {'type': 'ALLOWED', 'agent': self.agent.agent_id, 'tool': tool, 'args': args}
self.audit_log.append(entry)
gateway = ToolGateway(SUPPORT_AGENT)
# This will succeed (agent has READ permission)
gateway.execute_tool('read_profile', Permission.READ_CUSTOMER_PROFILE, read_customer_profile, user_id='123')
# This will raise PermissionError (agent lacks PROCESS_REFUND permission)
gateway.execute_tool('process_refund', Permission.PROCESS_REFUND, process_refund, order_id='456', amount=50.00)Langkah Pengesahan untuk Tindakan yang Memusnahkan
Sesetengah tindakan tidak boleh dipulihkan atau mempunyai kesan besar: memadam rekod, menghantar e-mel pukal dan memproses transaksi kewangan. Minta pengesahan jelas daripada manusia sebelum ejen melaksanakan sebarang tindakan sedemikian. Ejen mencadangkan tindakan tersebut (perkara yang ingin dilakukannya dan sebabnya), manusia meluluskan atau menolaknya, dan hanya selepas itu pelaksanaan diteruskan. Pintu pengesahan ini ialah pertahanan tunggal yang paling berkesan terhadap kesilapan ejen dan penyalahgunaan yang didorong oleh suntikan.
HIGH_RISK_ACTIONS = {
'delete_customer_record',
'send_bulk_email',
'process_refund_over_100',
'deploy_code',
'revoke_user_access'
}
def execute_with_confirmation(tool_name: str, tool_args: dict, agent_reasoning: str) -> dict:
if tool_name in HIGH_RISK_ACTIONS:
# Pause and request human approval
approval_request = {
'action': tool_name,
'arguments': tool_args,
'agent_reasoning': agent_reasoning,
'risk_level': 'HIGH'
}
approval = request_human_approval(approval_request) # blocks until human responds
if not approval.approved:
return {'status': 'rejected', 'reason': approval.rejection_reason}
# Log the approval for audit trail
log_approval(tool_name, tool_args, approved_by=approval.approver_id)
# Execute only after confirmation
return execute_tool(tool_name, **tool_args)Penskopan Alat: Had Masa, Pengguna dan Data
Selain jenis keizinan, hadkan skop akses alat dalam tiga dimensi. Had masa: kunci API atau token yang tamat tempoh selepas sesi ejen berakhir. Had pengguna: ejen yang membantu pengguna A tidak boleh mengakses data pengguna B, walaupun ejen diarahkan untuk berbuat demikian. Had data: ejen sokongan pelanggan hanya boleh mengakses data pelanggan yang sedang dibantunya, bukan semua pelanggan. Laksanakan had ini dalam pelaksanaan alat Anda, bukan dalam gesaan ejen.
class ScopedCustomerTool:
def __init__(self, current_user_id: str, session_token: str):
self.user_id = current_user_id # agent can only access THIS user's data
self.token = session_token # expires at end of session
def get_customer_profile(self) -> dict:
# Hardcoded to current user - agent cannot change this via prompt
return db.query(
'SELECT * FROM customers WHERE id = %s',
(self.user_id,) # parameterized, always this user's ID only
)
def get_order_history(self, limit: int = 10) -> list:
# Even if the agent says 'get orders for user 999', it gets self.user_id
return db.query(
'SELECT * FROM orders WHERE customer_id = %s ORDER BY date DESC LIMIT %s',
(self.user_id, min(limit, 50)) # cap limit too
)
# Inject scoped tool into agent - cannot be overridden by prompt
def create_support_agent(user_id: str, session_token: str):
scoped_tools = ScopedCustomerTool(user_id, session_token)
return AgentExecutor(llm=llm, tools=[scoped_tools.get_customer_profile, scoped_tools.get_order_history])Pengesahan Input pada Argumen Alat
Ejen menjana argumen alat sebagai teks. Sebelum melaksanakan sebarang alat, sahkan semua argumen terhadap skema yang ketat. Ini mencegah: suntikan SQL melalui parameter alat, serangan rentas laluan (ejen menghantar '../../../etc/passwd' sebagai laluan fail), serangan SSRF (ejen menghantar URL perkhidmatan dalaman sebagai parameter 'URL jauh'), serta limpahan integer atau nilai di luar julat yang boleh menyebabkan tingkah laku tidak dijangka.
from pydantic import BaseModel, validator, constr, confloat
import re
class SendEmailArgs(BaseModel):
to: str
subject: constr(max_length=200)
body: constr(max_length=10000)
@validator('to')
def must_be_company_email(cls, v):
if not re.match(r'^[^@]+@(?:yourcorp\.com|partner\.com)$', v):
raise ValueError('Email must be sent to yourcorp.com or partner.com domains only')
return v
class ReadFileArgs(BaseModel):
filename: constr(pattern=r'^[a-zA-Z0-9_\-\.]+$') # alphanumeric only, no path traversal
@validator('filename')
def no_parent_directory(cls, v):
if '..' in v or '/' in v or '\\' in v:
raise ValueError('Path traversal detected')
return v
# Validate before execution
def validated_send_email(args_dict: dict) -> dict:
args = SendEmailArgs(**args_dict) # raises ValueError on invalid input
return send_email(args.to, args.subject, args.body)Pengelogan Audit Tidak Boleh Ubah
Setiap panggilan alat yang dibuat oleh ejen mesti direkodkan dalam log audit tidak boleh ubah. Entri log mesti merangkumi: ID ejen dan ID sesi, nama alat dan semua argumen, nilai pulangan, cap masa dan alasan yang dinyatakan ejen untuk membuat panggilan tersebut. Tidak boleh ubah bermaksud ejen (atau penyerang) tidak boleh memadam atau mengubah suai entri log. Gunakan storan tambah sahaja (perkhidmatan pengelogan awan, pangkalan data tulis sekali atau storan WORM).
import hashlib
import json
import time
class ImmutableAuditLog:
def __init__(self, log_backend):
self.backend = log_backend # e.g., CloudWatch, BigQuery, or append-only file
self.previous_hash = '0' * 64 # genesis hash
def record(self, agent_id: str, tool_name: str, args: dict, result, reasoning: str):
entry = {
'agent_id': agent_id,
'tool': tool_name,
'args': args,
'result_summary': str(result)[:500], # truncate large results
'reasoning': reasoning[:1000],
'timestamp': time.time(),
'previous_hash': self.previous_hash # chain entries like a blockchain
}
entry_json = json.dumps(entry, sort_keys=True)
entry['hash'] = hashlib.sha256(entry_json.encode()).hexdigest()
self.backend.append(entry) # append-only, never update
self.previous_hash = entry['hash']
return entry['hash']Mengesan Tingkah Laku Ejen yang Anomali
Walaupun terdapat pintu keizinan dan log audit, perhatikan corak tingkah laku anomali yang menunjukkan ejen telah terjejas atau bertindak di luar jangkaan. Isyarat anomali termasuk: ejen sokongan tiba-tiba memanggil alat yang tidak pernah dipanggilnya sebelum ini, lonjakan luar biasa dalam kekerapan panggilan alat daripada satu ejen, argumen yang berbeza daripada kebiasaan dengan cara yang mencurigakan (rentetan yang luar biasa panjang, jujukan aksara pelik) atau panggilan yang berlaku pada waktu luar biasa.
from collections import Counter
class AgentBehaviorMonitor:
def __init__(self):
self.tool_call_counts = Counter() # tracks historical tool usage
self.arg_length_history = {} # tracks typical argument lengths
def record_and_check(self, agent_id: str, tool_name: str, args: dict) -> list[str]:
key = f'{agent_id}:{tool_name}'
anomalies = []
self.tool_call_counts[key] += 1
# Flag tools never called before by this agent
if self.tool_call_counts[key] == 1 and tool_name not in COMMON_TOOLS:
anomalies.append(f'First time agent {agent_id} called unusual tool: {tool_name}')
# Flag unusually long arguments (potential injection payload)
total_arg_length = sum(len(str(v)) for v in args.values())
if tool_name not in self.arg_length_history:
self.arg_length_history[tool_name] = []
self.arg_length_history[tool_name].append(total_arg_length)
if len(self.arg_length_history[tool_name]) > 10:
avg = sum(self.arg_length_history[tool_name]) / len(self.arg_length_history[tool_name])
if total_arg_length > avg * 5:
anomalies.append(f'Unusually long arguments for {tool_name}: {total_arg_length} chars (avg: {avg:.0f})')
return anomaliesTamat Tempoh Token dan Penskopan Sesi
Sesi ejen harus mempunyai jangka hayat yang ditetapkan. Keluarkan token atau kelayakan berjangka pendek kepada ejen apabila sesi bermula, dan batalkannya apabila sesi berakhir. Jika sesi ejen terjejas semasa pelaksanaan, keupayaan penyerang untuk mengeksploitasi sesi yang terjejas dihadkan oleh tamat tempoh token tersebut. Penskopan sesi juga memastikan ejen tunggal yang terjejas tidak boleh digunakan untuk serangan susulan beberapa hari kemudian.
import secrets
import time
class SessionTokenManager:
def __init__(self, ttl_seconds=3600):
self.tokens = {} # token -> (agent_id, user_id, expires_at)
self.ttl = ttl_seconds
def issue_token(self, agent_id: str, user_id: str) -> str:
token = secrets.token_urlsafe(32)
expires_at = time.time() + self.ttl
self.tokens[token] = (agent_id, user_id, expires_at)
return token
def validate_token(self, token: str) -> dict | None:
if token not in self.tokens:
return None
agent_id, user_id, expires_at = self.tokens[token]
if time.time() > expires_at:
del self.tokens[token] # clean up expired token
return None
return {'agent_id': agent_id, 'user_id': user_id}
def revoke_token(self, token: str):
self.tokens.pop(token, None)
token_manager = SessionTokenManager(ttl_seconds=1800) # 30-minute sessionsMenguji Keselamatan Alat
Uji lapisan keselamatan alat Anda dengan mensimulasikan serangan: cuba memanggil alat terhad menggunakan ejen tanpa keizinan, berikan argumen rentas laluan, suntik rentetan arahan ke dalam parameter alat dan cuba memanggil alat menggunakan token yang telah tamat tempoh. Set ujian keselamatan alat yang menyeluruh harus merangkumi semua had keizinan, semua peraturan pengesahan dan semua pencetus pengesanan anomali.
Mereka Bentuk untuk Kebolehbalikan
Jika boleh, reka alat supaya boleh dikembalikan atau dilaksanakan secara berperingkat. Daripada terus memadam rekod, tandakannya sebagai telah dipadam dengan penanda pemadaman supaya rekod itu boleh dipulihkan. Daripada terus menghantar e-mel, letakkannya dalam baris gilir 'menunggu penghantaran' yang dilaksanakan selepas tempoh semakan 5 minit. Laksanakan transaksi kewangan secara berperingkat dengan menahannya sebelum penyelesaian. Kebolehbalikan tidak menghapuskan risiko keselamatan, tetapi mengurangkan kesan serangan yang berjaya dengan ketara.
Semakan Pantas
Uji pemahaman Anda tentang perlindungan akses alat ejen daripada pelajaran ini.
Ringkasan Pelajaran
Dalam pelajaran ini, Anda telah mempelajari bahawa prinsip keistimewaan minimum mengehadkan keizinan alat kepada perkara yang benar-benar diperlukan oleh setiap peranan ejen, pintu keizinan pada peringkat kod menguatkuasakan keizinan ini dengan cara yang tidak boleh dipintas oleh suntikan gesaan, dan langkah pengesahan manusia untuk tindakan berisiko tinggi menyediakan lapisan keselamatan terakhir sebelum operasi yang tidak boleh dipulihkan dilaksanakan. Seterusnya, kita akan menjalankan latihan pasukan merah berstruktur pada aplikasi LLM.
Pelajari Python dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 30
- Pelajaran
- 120
Soalan Lazim
Adakah pelajaran “Melindungi Akses Alat Ejen” percuma?
Ya — teks penuh “Melindungi Akses Alat Ejen” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus AI Engineering Academy, tingkat taraf kepada CoddyKit PRO. Kursus AI Engineering Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Melindungi Akses Alat Ejen”?
Gunakan prinsip keistimewaan minimum pada kebenaran alat ejen, laksanakan langkah pengesahan sebelum tindakan yang memusnahkan data dan audit log tindakan ejen untuk mengesan tingkah laku tidak norma… Anda berlatih AI Engineering Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan AI Engineering Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran AI Engineering Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.
Berapa lamakah pelajaran “Melindungi Akses Alat Ejen” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran AI Engineering Academy ini?
Ya. Setiap pelajaran AI Engineering Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Taksonomi Serangan Suntikan Gesaan
- Mempertahankan Sistem RAG daripada Suntikan
- Melindungi Akses Alat Ejen
- Menjalankan Ujian Red Team pada Aplikasi LLM Anda