एजेंट के लिए अपरिवर्तनीय कार्रवाई लॉगिंग
केवल-जोड़े-जा-सकने वाले लॉग, क्रिप्टोग्राफ़िक हस्ताक्षर और छेड़छाड़-स्पष्ट ऑडिट ट्रेल।
एजेंट के लिए अपरिवर्तनीय कार्रवाई लॉगिंग, CoddyKit पर AI एजेंट का एक निःशुल्क पाठ है। यह 4 में से 1वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह AI एजेंट सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। AI एजेंट पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
एजेंटों को अपरिवर्तनीय लॉग की आवश्यकता क्यों है
एजेंट स्वायत्त रूप से कार्रवाइयाँ करते हैं — अक्सर हर चरण की जाँच कोई व्यक्ति नहीं करता। जब कुछ गलत हो जाए, तो आपको इन सवालों का उत्तर देना होता है: एजेंट ने क्या किया, कब किया, किसकी ओर से किया और क्यों किया?
एक अपरिवर्तनीय और छेड़छाड़-स्पष्ट लॉग लेखा-परीक्षण पथ को बाद में बदलना असंभव बना देता है।
लॉग प्रविष्टि की संरचना
हर लॉग प्रविष्टि में समय-मुद्रा, एजेंट की पहचान, उपयोगकर्ता की पहचान, कार्रवाई का प्रकार, पैरामीटर, परिणाम और पिछली प्रविष्टि से जोड़ने वाला हैश दर्ज होता है। यह संरचना खोज और छेड़छाड़ का पता लगाने, दोनों में सहायक है।
from dataclasses import dataclass
from typing import Any
@dataclass
class AuditEntry:
timestamp: float # Unix time (UTC)
agent_id: str
user_id: str
action_type: str
parameters: dict
result: dict
session_id: str
prev_hash: str # hash of previous entry
entry_hash: str = '' # computed after construction
if __name__ == '__main__':
entry = AuditEntry(
timestamp=1717000000.0, agent_id='agent-1', user_id='user-42',
action_type='send_email', parameters={'to': 'a@b.com'},
result={'status': 'sent'}, session_id='sess-1', prev_hash='0' * 64
)
print('Audit entry created:')
print(' agent_id:', entry.agent_id)
print(' action_type:', entry.action_type)
print(' prev_hash:', entry.prev_hash)
छेड़छाड़ का पता लगाने के लिए हैश-श्रृंखला
हर प्रविष्टि का हैश उसकी सामग्री और पिछली प्रविष्टि के हैश से निकाला जाता है। यदि बाद में किसी प्रविष्टि में बदलाव किया जाता है, तो उसका हैश बदल जाता है और उसके बाद के सभी हैश अमान्य हो जाते हैं। इससे छेड़छाड़ का पता लगाया जा सकता है।
import hashlib, json, time
def compute_entry_hash(entry: dict, prev_hash: str) -> str:
content = json.dumps(entry, sort_keys=True, default=str)
payload = f'{prev_hash}:{content}'
return hashlib.sha256(payload.encode()).hexdigest()
def create_log_entry(agent_id: str, user_id: str, action_type: str,
parameters: dict, result: dict,
session_id: str, prev_hash: str) -> dict:
entry = {
'timestamp': time.time(),
'agent_id': agent_id,
'user_id': user_id,
'action_type': action_type,
'parameters': parameters,
'result': result,
'session_id': session_id,
'prev_hash': prev_hash
}
entry['entry_hash'] = compute_entry_hash(
{k: v for k, v in entry.items() if k != 'entry_hash'},
prev_hash
)
return entry
if __name__ == '__main__':
entry = create_log_entry('agent-1', 'user-42', 'send_email',
{'to': 'a@b.com'}, {'status': 'sent'},
'sess-1', prev_hash='0' * 64)
print('New log entry hash:', entry['entry_hash'])
print('Chained from prev_hash:', entry['prev_hash'])
प्रक्रिया के भीतर केवल-जोड़ने वाला लॉग
सबसे सरल कार्यान्वयन एक ऐसी मेमोरी-आधारित सूची है जिसमें केवल प्रविष्टियाँ जोड़ने की अनुमति देने वाली विधि होती है। मिटाने या बदलने की कोई विधि उपलब्ध नहीं कराई जाती। वास्तविक उपयोग में इसके पीछे डेटाबेस या ऑब्जेक्ट भंडार होता है।
class AppendOnlyLog:
def __init__(self):
self._entries: list[dict] = []
self._last_hash = 'GENESIS'
def append(self, agent_id: str, user_id: str, action_type: str,
parameters: dict, result: dict, session_id: str) -> dict:
entry = create_log_entry(
agent_id, user_id, action_type,
parameters, result, session_id,
self._last_hash
)
self._entries.append(entry)
self._last_hash = entry['entry_hash']
return entry
def verify_integrity(self) -> bool:
running_hash = 'GENESIS'
for e in self._entries:
expected = compute_entry_hash(
{k: v for k, v in e.items() if k != 'entry_hash'},
running_hash
)
if expected != e['entry_hash']:
return False
running_hash = e['entry_hash']
return True
@property
def entries(self):
return list(self._entries) # return copy, not referenceजोड़ने के अर्थ के साथ PostgreSQL में लिखना
वास्तविक उपयोग में लॉग को ऐसी डेटाबेस तालिका में लिखें जिसके लिए अनुप्रयोग उपयोगकर्ता को UPDATE या DELETE की कोई अनुमति न दी गई हो। वास्तविक केवल-जोड़ने वाले व्यवहार के लिए डेटाबेस स्तर पर इन विशेषाधिकारों को रद्द करें।
import psycopg2, json
# Table DDL (run once):
# CREATE TABLE agent_audit_log (
# id BIGSERIAL PRIMARY KEY,
# timestamp DOUBLE PRECISION NOT NULL,
# agent_id TEXT NOT NULL,
# user_id TEXT NOT NULL,
# action_type TEXT NOT NULL,
# parameters JSONB NOT NULL,
# result JSONB NOT NULL,
# session_id TEXT NOT NULL,
# prev_hash TEXT NOT NULL,
# entry_hash TEXT NOT NULL UNIQUE
# );
# REVOKE UPDATE, DELETE ON agent_audit_log FROM app_user;
def write_to_db(conn, entry: dict):
with conn.cursor() as cur:
cur.execute(
'INSERT INTO agent_audit_log '
'(timestamp,agent_id,user_id,action_type,parameters,result,session_id,prev_hash,entry_hash) '
'VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s)',
(entry['timestamp'], entry['agent_id'], entry['user_id'],
entry['action_type'], json.dumps(entry['parameters']),
json.dumps(entry['result']), entry['session_id'],
entry['prev_hash'], entry['entry_hash'])
)
conn.commit()Object Lock (WORM) के साथ S3 में लिखना
COMPLIANCE मोड वाला AWS S3 ऑब्जेक्ट लॉक किसी भी उपयोगकर्ता — यहाँ तक कि मुख्य खाता-स्वामी — को अवधारण अवधि के दौरान ऑब्जेक्ट मिटाने या उसके ऊपर लिखने से रोकता है। यह लेखा-परीक्षण लॉग के लिए वास्तविक एक-बार-लिखने वाला भंडारण है।
import boto3, json, time
s3 = boto3.client('s3', region_name='us-east-1')
BUCKET = 'your-audit-log-bucket-worm'
def write_to_s3_worm(entry: dict):
key = f'audit/{entry["agent_id"]}/{int(entry["timestamp"])}/{entry["entry_hash"][:16]}.json'
s3.put_object(
Bucket=BUCKET,
Key=key,
Body=json.dumps(entry).encode(),
ContentType='application/json',
ObjectLockMode='COMPLIANCE',
ObjectLockRetainUntilDate='2030-01-01T00:00:00Z' # 4+ year retention
)
return keyलेखा-परीक्षण लॉग में खोज करना
लेखा-परीक्षण लॉग केवल अनुपालन के लिए नहीं होता — यह संचालन की दृष्टि से भी उपयोगी है। एजेंट के व्यवहार में त्रुटि खोजने, किसी सत्र का पुनर्निर्माण करने या यह उत्तर देने के लिए इसमें खोज करें कि 'एजेंट ने X क्यों किया?'
def query_session(log: AppendOnlyLog, session_id: str) -> list[dict]:
return [
e for e in log.entries
if e['session_id'] == session_id
]
def query_user_actions(log: AppendOnlyLog, user_id: str,
action_type: str = None) -> list[dict]:
entries = [e for e in log.entries if e['user_id'] == user_id]
if action_type:
entries = [e for e in entries if e['action_type'] == action_type]
return sorted(entries, key=lambda e: e['timestamp'])
def count_actions_by_type(log: AppendOnlyLog) -> dict:
from collections import Counter
return dict(Counter(e['action_type'] for e in log.entries))लॉग दर्ज करने से पहले संवेदनशील डेटा को स्वच्छ करना
लेखा-परीक्षण लॉग में एजेंट की गई कार्रवाई दर्ज होनी चाहिए, संवेदनशील डेटा उजागर नहीं होना चाहिए। लिखने से पहले पैरामीटर और परिणामों से PII (पासवर्ड, एपीआई कुंजियाँ और क्रेडिट कार्ड नंबर) हटा दें।
import re
SENSITIVE_KEYS = {'password', 'api_key', 'secret', 'token', 'credit_card', 'ssn'}
def sanitize(obj, depth: int = 0) -> dict | list | str:
if depth > 5:
return '[MAX_DEPTH]'
if isinstance(obj, dict):
return {
k: '[REDACTED]' if k.lower() in SENSITIVE_KEYS
else sanitize(v, depth + 1)
for k, v in obj.items()
}
elif isinstance(obj, list):
return [sanitize(i, depth + 1) for i in obj]
elif isinstance(obj, str):
# Redact anything that looks like an API key
return re.sub(r'(sk-|Bearer\s)[A-Za-z0-9_-]{16,}', '[REDACTED]', obj)
return obj
if __name__ == '__main__':
record = {'user': 'alice', 'password': 'hunter2', 'note': 'call me at sk-abcdefghijklmnopqrstuv'}
print('Sanitized record:', sanitize(record))
लॉग का चक्रीकरण और संग्रहण
सक्रिय लॉग लगातार बढ़ते रहते हैं। उनका चक्रीकरण करें: 90 दिनों से पुरानी प्रविष्टियों को ठंडे भंडार (जैसे S3 ग्लेशियर) में ले जाकर संपीड़ित करें। चक्रीकृत प्रत्येक खंड का अंतिम हैश सुरक्षित रखकर श्रृंखला को अखंड बनाए रखें।
import time, json, gzip
def rotate_log(log: AppendOnlyLog, max_age_days: int = 90) -> dict:
cutoff = time.time() - max_age_days * 86400
archive = [e for e in log.entries if e['timestamp'] < cutoff]
remaining = [e for e in log.entries if e['timestamp'] >= cutoff]
if not archive:
return {'archived': 0, 'remaining': len(remaining)}
# Compress archive
archive_bytes = gzip.compress(json.dumps(archive).encode())
archive_file = f'/tmp/audit_archive_{int(time.time())}.json.gz'
with open(archive_file, 'wb') as f:
f.write(archive_bytes)
# Update in-memory log
log._entries = remaining
return {'archived': len(archive), 'remaining': len(remaining), 'file': archive_file}संदिग्ध पैटर्न पर चेतावनी देना
वास्तविक समय में असामान्य पैटर्न के लिए लेखा-परीक्षण लॉग की निगरानी करें: कम समय में उच्च-जोखिम वाली कार्रवाइयों का अचानक समूह, कारोबारी समय के बाहर की गई कार्रवाइयाँ, या कम अवधि में एक ही कार्रवाई का निर्धारित संख्या से अधिक बार दोहराया जाना।
import time
from collections import defaultdict
HIGH_RISK_ACTIONS = {'delete_user', 'send_mass_email',
'transfer_funds', 'export_all_data'}
BURST_LIMIT = 5
BURST_WINDOW = 60 # seconds
action_timestamps: dict[str, list] = defaultdict(list)
def check_suspicious(entry: dict) -> list[str]:
alerts = []
action = entry['action_type']
if action in HIGH_RISK_ACTIONS:
alerts.append(f'HIGH_RISK_ACTION: {action} by {entry["agent_id"]}')
now = time.time()
action_timestamps[action].append(now)
recent = [t for t in action_timestamps[action] if now - t < BURST_WINDOW]
action_timestamps[action] = recent
if len(recent) > BURST_LIMIT:
alerts.append(f'ACTION_BURST: {action} called {len(recent)}x in {BURST_WINDOW}s')
return alerts
if __name__ == '__main__':
entry = {'action_type': 'delete_user', 'agent_id': 'agent-9'}
for _ in range(6):
alerts = check_suspicious(entry)
print('Alerts on 6th call:', alerts)
आवश्यकतानुसार लॉग की अखंडता सत्यापित करना
अपनी निगरानी प्रक्रिया-क्रम के हिस्से के रूप में अखंडता जाँच चलाएँ। सत्यापन की कोई विफलता मिलते ही चेतावनी दें — यह या तो लॉग दर्ज करने वाले कोड में त्रुटि या सक्रिय छेड़छाड़ के प्रयास का संकेत है।
def verify_and_alert(log: AppendOnlyLog) -> dict:
is_valid = log.verify_integrity()
total = len(log.entries)
result = {
'total_entries': total,
'integrity_ok': is_valid
}
if not is_valid:
import logging
alert_logger = logging.getLogger('agent.integrity_alert')
alert_logger.critical(
'AUDIT LOG INTEGRITY FAILURE: tampered or corrupted entries detected. '
'Total entries: %d. Initiating incident response.', total
)
result['alert_sent'] = True
return result
# Run periodically via cron or monitoring hook
# verify_and_alert(global_audit_log)लेखा-परीक्षण लॉग में हैश-श्रृंखला का पता क्या चलता है
हैश-श्रृंखला वह क्रिप्टोग्राफ़िक तंत्र है जो लेखा-परीक्षण लॉग को छेड़छाड़-स्पष्ट बनाता है। इससे किस चीज़ का पता चलता है, यह समझना लेखा-परीक्षण लॉग की संरचना के लिए मूलभूत है।
अपरिवर्तनीय कार्रवाई-लॉगिंग की पुनरावृत्ति
अपरिवर्तनीय एजेंट लॉग में उपयोग होता है: छेड़छाड़ का पता लगाने के लिए हैश-श्रृंखला, केवल-जोड़ने वाला भंडारण (डेटाबेस स्तर पर UPDATE/DELETE रद्द करना), नियामकीय अवधारण के लिए WORM ऑब्जेक्ट भंडारण (S3 Object Lock), लिखने से पहले PII स्वच्छीकरण, और संदिग्ध कार्रवाई-पैटर्न पर वास्तविक समय में विसंगति की चेतावनी।
एआई शिक्षक के साथ AI एजेंट सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 60
- पाठ
- 239
अक्सर पूछे जाने वाले प्रश्न
क्या “एजेंट के लिए अपरिवर्तनीय कार्रवाई लॉगिंग” पाठ निःशुल्क है?
हाँ—“एजेंट के लिए अपरिवर्तनीय कार्रवाई लॉगिंग” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और AI एजेंट पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। AI एजेंट पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“एजेंट के लिए अपरिवर्तनीय कार्रवाई लॉगिंग” में मैं क्या सीखूँगा?
केवल-जोड़े-जा-सकने वाले लॉग, क्रिप्टोग्राफ़िक हस्ताक्षर और छेड़छाड़-स्पष्ट ऑडिट ट्रेल। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ AI एजेंट का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या AI एजेंट शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर AI एजेंट शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 1वाँ पाठ है।
“एजेंट के लिए अपरिवर्तनीय कार्रवाई लॉगिंग” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस AI एजेंट पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर AI एजेंट पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- एजेंट के लिए अपरिवर्तनीय कार्रवाई लॉगिंग
- एजेंट कार्रवाइयों के लिए नीति प्रवर्तन
- नियामकीय अनुपालन: GDPR और SOC2
- मानव-निगरानी अनुमोदन द्वार