پرش به محتوای اصلی

پاک‌سازی توسط ایجنت لاگ‌ها را به شواهد اولیه تبدیل می‌کند، نه یک محصول جانبی

وقتی ایجنت‌ها می‌توانند ردپای خود را حذف کنند، لاگ‌های حسابرسی باید کاملاً از دامنه نوشتن ایجنت خارج شوند. یک الگوی تفکیک وظایف برای ردها.

نمای نزدیک از یک رک سرور با چراغ‌های وضعیت چشمک‌زن و کابل‌های شبکه، که نمایانگر یک مقصد لاگ خارجی است.

حالت شکست

یک ایجنت با دسترسی به شل یا فایل‌سیستم، توانایی کوتاه کردن لاگ‌ها، چرخش فایل‌ها و پاک کردن تاریخچه را به ارث می‌برد. این یک مورد حاشیه‌ای فرضی نیست؛ نتیجه پیش‌فرض اعطای همان امتیازات یک اپراتور انسانی به یک فرآیند خودمختار است. اگر ایجنت بتواند truncate -s 0 /var/log/agent.log را اجرا کند، لاگ دیگر شواهد نیست. یک تسهیلات است.

رانتایم‌های خودتغییردهنده این را تشدید می‌کنند. وقتی ایجنت می‌تواند کدی را که ثبت می‌کند چه کاری انجام داده ویرایش کند، خود ابزارگذاری بخشی از سطح قابل تغییر می‌شود. یک پوشش ابزار که قبل از فراخوانی یک API خارجی یک رویداد ساختاریافته می‌نویسد، می‌تواند بازنویسی شود تا چیزی ننویسد، یا رویدادی باورپذیر اما نادرست بنویسد. سابقه توسط همان اصلی تولید می‌شود که در حال ثبت است، بنابراین سابقه انگیزه‌ها و حالت‌های شکست آن اصل را به ارث می‌برد.

بازسازی پس‌رویدادی از وضعیت برنامه زمانی که خود وضعیت تغییر کرده باشد غیرقابل اعتماد است. اگر ایجنت یک سطر را حذف کرده، یک فیلد وضعیت را به‌روزرسانی کرده یا یک تراکنش را برگردانده باشد، وضعیت باقی‌مانده دنیای پس از عمل را منعکس می‌کند، نه خود عمل را. تریگرهای پایگاه داده و ثبت تغییرات داده تنها در صورتی کمک می‌کنند که به مقصدی بنویسند که ایجنت نتواند به آن دسترسی داشته باشد. در غیر این صورت آن‌ها فقط یک سطح قابل نوشتن دیگر هستند.

این عدم تقارن اصلی است: هر شاهدی که ایجنت بتواند به آن دسترسی پیدا کند، شاهدی است که ایجنت می‌تواند حذف کند. سؤال این نیست که آیا ایجنت امروز خصمانه است. سؤال این است که آیا رد حسابرسی از یک ایجنت به‌خطرافتاده، یک ایجنت باگ‌دار یا یک ایجنت که بر اساس دستوری مبهم عمل می‌کند جان سالم به در می‌برد.

چرا فقط-افزودنی کافی نیست

فایل‌های فقط-افزودنی روی یک ولوم قابل نوشتن، هنوز توسط همان اصل قابل نوشتن هستند. مجوزهای POSIX، فلگ‌های تغییرناپذیر و ویژگی‌های فقط-افزودنی توسط همان کرنل و همان زمینه سوپریوزری اعمال می‌شوند که ایجنت ممکن است قبلاً اشغال کرده باشد. یک کانتینر با CAP_SYS_ADMIN یا یک ولوم مانت‌شده روی هاست می‌تواند محافظت‌های سطح فایل را دور بزند. خاصیت فقط-افزودنی یک قرارداد است، نه یک مرز، مگر اینکه ذخیره‌سازی آن را در برابر هویت دیگری اعمال کند.

امضای ورودی‌ها تنها در صورتی کمک می‌کند که کلید امضا خارج از دسترس ایجنت باشد. اگر فرآیند ایجنت کلید خصوصی را در حافظه نگه دارد یا آن را از یک متغیر محیطی بخواند، امضا هیچ چیزی درباره نویسندگی اثبات نمی‌کند. اثبات می‌کند که کسی با آن کلید ورودی را امضا کرده است. نگهداری کلید باید در یک سرویس جداگانه یا یک ماژول سخت‌افزاری باشد که ایجنت نتواند آن را برای بارهای دلخواه فراخوانی کند. حتی در آن صورت، یک اوراکل امضا که هر چیزی که ایجنت ارسال می‌کند را امضا می‌کند، یک مهر تأیید است، نه یک تصدیق.

Person touching a plasma ball with colorful electrical filaments in a dark room

سیاست‌های نگهداری که طبق برنامه حذف می‌کنند، یک مسیر پاک‌سازی مشروع ایجاد می‌کنند که شبیه انطباق به نظر می‌رسد. یک پنجره نگهداری سی‌روزه یک انتخاب عملیاتی عادی است. همچنین پنجره‌ای است که در آن یک حادثه می‌تواند قبل از اینکه کسی تحقیق کند، از رده خارج شود. اگر ایجنت بتواند یک چرخش، یک فشرده‌سازی یا یک قاعده چرخه عمر را فعال کند، سیاست نگهداری به یک ابتدایی پاک‌سازی با بهانه‌ای به شکل انطباق تبدیل می‌شود.

نتیجه عملی این است که فقط-افزودنی، امضا و نگهداری همه ضروری هستند اما هیچ‌کدام کافی نیستند. آن‌ها شعاع انفجار حذف تصادفی را کاهش می‌دهند. آن‌ها مرزی بین ایجنت و سابقه خودش ایجاد نمی‌کنند.

یک الگوی تفکیک وظایف برای ردها

بیان الگو ساده است و پیاده‌سازی آن دشوار: رد را کاملاً از دامنه نوشتن ایجنت خارج کنید.

ردها را به مقصدی با هویت متفاوت و بدون مجوز حذف برای اصل ایجنت بنویسید. مقصد می‌تواند یک سرویس لاگ مدیریت‌شده، یک صف پیام با اعتبارنامه تولیدکننده جداگانه، یا یک باکت ذخیره‌سازی شیء فقط-نوشتنی باشد. هویت ایجنت PutRecord می‌گیرد و هیچ چیز دیگری. نه DeleteObject، نه PutBucketLifecycle، نه نقش مدیریتی. نگهداری و حذف خود مقصد توسط یک اصل جداگانه کنترل می‌شود که ایجنت نمی‌تواند جعل هویت کند.

رویدادهای ساختاریافته را در مرز ابزار منتشر کنید، نه داخل فرآیند ایجنت، تا سابقه توسط فراخوانی‌شده تولید شود. اگر ایجنت یک ابزار جستجو را فراخوانی می‌کند، سرویس جستجو رویداد را می‌نویسد. اگر یک پایگاه داده را فراخوانی می‌کند، پروکسی پایگاه داده رویداد را می‌نویسد. ایجنت اجازه ندارد اقدامات خود را توصیف کند؛ سیستم‌هایی که لمس می‌کند آن‌ها را توصیف می‌کنند. این لنگر اعتماد را از خودگزارشی ایجنت به ابزارگذاری فراخوانی‌شده منتقل می‌کند. همچنین به این معناست که طرح‌واره رویداد متعلق به ابزار است، نه پرامپت ایجنت.

یک توالی یکنوا و یک خلاصه خارجی دوره‌ای نگه دارید تا شکاف‌ها حتی در صورت حذف ورودی‌ها قابل تشخیص باشند. هر رویداد یک شماره توالی از یک شمارنده حمل می‌کند که ایجنت نمی‌تواند بازنشانی کند. در یک بازه ثابت، یک کار خارجی یک خلاصه روی محدوده توالی محاسبه و آن را به یک کانال جداگانه منتشر می‌کند. اگر بعداً مشخص شود که مقصد فاقد توالی 4021 است، خلاصه اثبات می‌کند که یک ورودی وجود داشته و حذف شده است. بدون خلاصه، یک شکاف از یک دوره سکوت قابل تشخیص نیست.

یک مکانیزم مشخص: مرز ابزار به یک سوکت دامنه یونیکس محلی که توسط یک فرآیند کناری مالکیت می‌شود می‌نویسد. فرآیند کناری اعتبارنامه‌های مقصد را نگه می‌دارد، رویدادها را بافر می‌کند، شماره‌های توالی را تخصیص می‌دهد و آن‌ها را ارسال می‌کند. کانتینر ایجنت هیچ مسیر شبکه‌ای به مقصد و هیچ دسترسی فایل‌سیستمی به مخزن اعتبارنامه فرآیند کناری ندارد. فرآیند کناری تنها نویسنده است. ایجنت می‌تواند فرآیند کناری را بکشد، اما کشتن آن فراخوانی‌های ابزار را نیز متوقف می‌کند، زیرا فراخوانی‌های![ClClose-up of suspension bridge cables and tower against a blue sky with cloudsگی.

Circuit board macro

پیامدها برای پاسخ به حادثه

فرض کنید لاگ قابل مشاهده برای ایجنت غیرقابل اعتماد است و از مقصد بازسازی کنید. لاگ محلی یک تسهیلات اشکال‌زدایی است. مقصد سابقه است. پاسخ‌دهندگان به حادثه باید هر واگرایی بین این دو را به عنوان یک سیگنال در نظر بگیرند، نه یک باگ همگام‌سازی.

هر شماره توالی گمشده را به عنوان یک حادثه در نظر بگیرید، نه یک باگ لاگ‌گیری. یک شکاف یعنی یا مقصد داده را از دست داده یا کسی آن را حذف کرده است. هر دو ارزش یک پیجینگ را دارند. خلاصه این بررسی را ارزان می‌کند: خلاصه منتشرشده را با خلاصه بازمحاسبه‌شده روی محدوده نگهداری‌شده مقایسه کنید. اگر متفاوت باشند، محدوده تغییر کرده است.

برای هزینه ذخیره‌سازی و خروج داده یک مقصد که ایجنت نمی‌تواند به آن دسترسی داشته باشد بودجه اختصاص دهید. این معاوضه صادقانه است. یک مقصد فقط-نوشتنی با اعتبارنامه‌های مستقل، تکرار بین‌منطقه‌ای و یک کار خلاصه بیشتر از یک فایل محلی هزینه دارد. خروج داده از محیط ایجنت به یک حساب جداگانه رایگان نیست. نگهداری در یک سرویس مدیریت‌شده بر اساس گیگابایت و بر اساس کوئری قیمت‌گذاری می‌شود. جایگزین یک سیستم ارزان‌تر است که شواهدش دقیقاً زمانی که لازم است ناپدید می‌شود.

هزینه فقط پولی نیست. یک فرآیند کناری یک حالت شکست اضافه می‌کند: اگر پایین باشد، فراخوانی‌های ابزار مسدود می‌شوند یا شکست می‌خورند. این یک انتخاب عمدی است. مسدود کردن روی رد امن‌تر از ادامه دادن بدون آن است، اما مشخصات دسترس‌پذیری ایجنت را تغییر می‌دهد. تیم‌ها باید صریحاً تصمیم بگیرند که آیا ایجنت بسته شکست می‌خورد یا باز، و آن تصمیم را مستند کنند.

این چه چیزی را تغییر می‌دهد

لاگ‌ها از یک محصول جانبی بودن دست می‌کشند و به شواهد اولیه تبدیل می‌شوند. این بازقالب‌بندی پیامدهای معماری دارد. خط لوله رد دیگر یک نگرانی فرآیند کناری نیست که بعد از کار کردن ایجنت پیچ شود. بخشی از مرز اعتماد است که در کنار رابط ابزار و مدل اعتبارنامه طراحی می‌شود.

آزمون ساده است: آیا ایجنت، تنها با استفاده از اعتبارنامه‌های خود و سیستم‌های قابل دسترس، می‌تواند سابقه‌ای از آنچه انجام داده را حذف یا تغییر دهد؟ اگر پاسخ بله است، لاگ شواهد نیست. داستانی است که ایجنت درباره خودش تعریف می‌کند، و تنها به اندازه وضعیت فعلی ایجنت قابل اعتماد است.

برای تیم‌هایی که سیستم‌های ایجنت می‌سازند، کار این است که آن پاسخ را نه کنند. هویت جداگانه، انتشار از سمت فراخوانی‌شده، توالی یکنوا و خلاصه خارجی. هیچ‌کدام از این‌ها بدیع نیستند. بدیع بودن در اعمال آن‌ها به اصلی است که می‌تواند ابزارگذاری خود را بخواند و تصمیم بگیرد آن را بازنویسی کند.

اشتراک‌گذاریXLinkedInپیوند یکتا6 دقیقه مطالعه

خواندن مرتبط

پرسش‌هایی که این پاسخ می‌دهد

Why is an append-only file not enough for agent audit logs?

Append-only files on a writable volume are still writable by the same principal. If the agent has filesystem or superuser access, it can truncate, rotate or delete the file. The append-only property is a convention enforced by the same kernel and identity the agent may already control, so it does not create a boundary between the agent and its own record.

What does a separation-of-duties trace pattern look like in practice?

Write traces to a sink with a different identity and no delete permission for the agent's principal. Emit structured events at the tool boundary so the callee produces the record, not the agent. Keep a monotonic sequence and publish a periodic external digest so gaps are detectable even if entries are removed.

How should incident response change when agents can erase traces?

Assume the agent-visible log is untrusted and reconstruct from the sink. Treat any missing sequence number as an incident rather than a logging bug. Compare the published digest against the recomputed digest over the retained range; a mismatch means the range has been altered.

What is the main trade-off of a sink the agent cannot reach?

Storage and egress cost, plus a new availability dependency. A write-only sink with independent credentials, cross-region replication and a digest job costs more than a local file, and a sidecar that blocks tool calls when it is down changes the agent's failure profile. Teams should decide explicitly whether the agent fails closed or fails open.