AI Engineering Academy · Pelajaran

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.

Pelajaran 3 daripada 413 langkah

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 convenience

Pelaksanaan 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 anomalies

Tamat 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 sessions

Menguji 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.

Percuma untuk bermula

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

  1. Taksonomi Serangan Suntikan Gesaan
  2. Mempertahankan Sistem RAG daripada Suntikan
  3. Melindungi Akses Alat Ejen
  4. Menjalankan Ujian Red Team pada Aplikasi LLM Anda
← Kembali ke AI Engineering Academy