پراکندگی رمزها: چگونه ۴۱۲ توکن لو رفته را اصلاح کردیم

یک خط لوله CI در ساعت ۲:۱۳ بامداد ۳ مارس با خطا مواجه شد. ما ۴۱۲ توکن API لو رفته را در ۳۷ مخزن (repository) پیدا کردیم. این خطا، ۱.۲ میلیون دلار از هزینه‌های احتمالی ناشی از نقض امنیتی را در معرض خطر قرار داد.

بیشتر تیم‌ها فکر می‌کنند که یک Vault تمام مشکلات را حل می‌کند. در واقعیت، یک Vault می‌تواند به یک نقطه واحد شکست (single point of failure) برای تأخیر (latency) تبدیل شود. وقتی توکن‌ها خارج از Vault قرار می‌گیرند، از مقادیر هاردکد شده (hard-coded) یا متغیرهای محیطی استفاده می‌کنند. این روش‌های جایگزین در گزارش‌های حسابرسی (audit logs) ظاهر نمی‌شوند.

متریک‌های ما هزینه این پراکندگی را نشان داد:

  • بازیابی عادی رمز: ۴۸ میلی‌ثانیه برای هر درخواست.
  • در زمان نشت: ۱۸۷ میلی‌ثانیه برای هر درخواست.

ایجنت‌های ساخت (Build agents)، ۱۲ توکن را در هر Job از یک کلاستر دوردست Vault فراخوانی می‌کردند. این امر باعث ایجاد تایم‌اوت (timeout) شد و توسعه‌دهندگان را مجبور کرد تغییرات را به صورت دستی بازگردانی (roll back) کنند. تأخیر (latency) فقط یک فرآیند کند نیست؛ بلکه یک مرکز هزینه است که هزینه‌های ابری را افزایش داده و سرعت توسعه‌دهندگان را کاهش می‌دهد.

یک کلید AWS لو رفته در یک مخزن استیجینگ (staging repo) اگر توسط یک مهاجم استفاده شود، می‌تواند ساعتی ۱۲۰ دلار هزینه داشته باشد. تنها یک ساعت سوءاستفاده، بیش از هزینه یک حسابرسی امنیتی فصلی است.

اسکنرهای استاتیک (Static scanners) ما را ناامید کردند. آن‌ها ۷۸٪ از توکن‌های ما را نادیده گرفتند. چرا؟ چون آن توکن‌ها در لحظه (on the fly) تولید می‌شدند و در آرتیفکت‌های ساخت (build artifacts) قرار داشتند، نه در کد منبع. یکی از مراحل GitHub Actions، یک توکن را در یک لایه Docker نوشت. اسکنر چیزی ندید، اما آن توکن هفته‌ها در رجیستری ما باقی ماند.

شما به قابلیت مشاهده در زمان اجرا (runtime visibility) نیاز دارید، نه فقط بازرسی استاتیک.

ما یک موتور Lambda برای حل این مشکل ساختیم. این موتور CloudTrail را برای یافتن رمزهای جدید زیر نظر می‌گیرد و آن‌ها را با Vault خود مقایسه می‌کند. گردش کار جدید به این صورت است:

  • شناسایی رمز از طریق یک وب‌هوک (webhook).
  • پرس‌وجو از Vault برای دریافت متادیتا.
  • باطل کردن توکن از طریق API ارائه‌دهنده.
  • باز کردن یک PR برای حذف رمز از فایل.
  • ادغام (Merge) خودکار PR در صورت موفقیت در CI.

این موتور ۴۱۲ توکن را در ۲۷ دقیقه با نرخ موفقیت ۹۹.۹۷٪ چرخاند (rotate کرد).

ما اکنون قدمت رمزها را ردیابی می‌کنیم. اگر توکنی قدیمی‌تر از ۳۰ روز باشد، فرآیند ساخت با خطا مواجه می‌شود. این قانون ساده، نشت‌های جدید را در یک فصل ۶۲٪ کاهش داد. ما همچنین از یک مدل isolation-forest برای علامت‌گذاری الگوهای استفاده غیرعادی استفاده می‌کنیم. اگر توکنی از یک IP جدید ظاهر شود، سیستم بلافاصله آن را چرخاند (rotate کرد).

از برخورد با توکن‌ها مانند فایل‌ها خودداری کنید. با قدمت رمز و تأخیر بازیابی (retrieval latency) به عنوان متریک‌های کلیدی برخورد کنید. اگر این کار را انجام دهید، پراکندگی کاهش خواهد یافت.

Source: https://dev.to/isabelle_dubuis_d858453d7/secrets-sprawl-how-we-cleaned-up-412-leaked-tokens-and-stopped-the-latency-bleed-k71

Optional learning community: https://t.me/GyaanSetuAi