Future ForgeFuture ForgeFuture ForgeFuture Forge
خدماتنمونه‌کارهاپکیج‌هاابزارهای رایگانیادداشت‌هادرباره ماتماس
شروع پروژه
  1. خانه
  2. /یادداشت‌ها
Future ForgeFuture Forge

استودیوی مهندسی محصول — طراحی، ساخت و استقرار نرم‌افزار.

پروژه‌تان را مطرح کنید

ارتباط

hello@futureforge.ir09128464105
Future ForgeFuture Forge

استودیوی مهندسی محصول — طراحی، ساخت و استقرار نرم‌افزار.

خدمات

طراحی و ساخت محصولتوسعه فول‌استکممیزی مهندسیمشاوره معماریزیرساخت و استقرارهوش مصنوعی در محصول

کاوش

نمونه‌کارهایادداشت‌هاپرسش‌هاپکیج‌ها

ابزارهای رایگان

ممیزی مهندسیمشاور معماریتخمین پروژهابزار پرامپت

شرکت

درباره ماتماسحریم خصوصیشرایط استفاده

پروژه‌تان را مطرح کنید

مسئله و محدودیت را بنویسید. اگر تطابق داشته باشیم، برای گفتگو هماهنگ می‌کنیم.

پروژه‌تان را مطرح کنید

ارتباط

hello@futureforge.ir09128464105
GitHubLinkedIn

© 2026 FutureForge. همه حقوق محفوظ است.

خانهخدماتابزارهای رایگانشروع پروژه
واژه‌نامه

secret روی GitHub لو رفت: پاسخ به حادثه گام‌به‌گام

اول revoke و rotate، بعد ارزیابی دامنه، محدودیت دسترسی، و فقط در صورت نیاز پاک‌سازی تاریخچه با git-filter-repo طبق مستندات رسمی GitHub.

سا
سهیل ابراهیم‌پور

بنیان‌گذار و مهندس محصول

·۲۹ شهریور ۱۴۰۵·6 دقیقه مطالعه
نشت secret گیت‌هابrevoke tokenrotate credentialsgit-filter-reposecret scanning alertforce push risk
هشدار امنیتی و چک‌لیست revoke و rotate

هشدار secret scanning آمده، همکار در چت نوشته «توکن را اشتباه push کردم»، یا رباتی از کلید شما سوءاستفاده کرده. در این لحظه اولویت «پاک کردن فایل از آخرین commit» نیست. اولویت قطع دسترسی مهاجم است. مستندات رسمی GitHub صریحاً می‌گوید اگر دادهٔ حساس یک secret است، اولین قدم revoke یا rotate است؛ بعد تازه دربارهٔ بازنویسی تاریخچه تصمیم بگیرید.

این مقاله runbook است: ترتیب کار، چه چیزی را ثبت کنید، کی تاریخچه را لمس کنید، و چرا force push تنها کافی نیست.

revoke تا rotate تا purge تاریخچه تا notify

پاسخ کوتاه

۱) همان secret را فوراً باطل/چرخش دهید. ۲) دسترسی‌های وابسته و لاگ مصرف را بررسی کنید. ۳) دامنهٔ افشا را مشخص کنید (عمومی/خصوصی، fork، PR، Actions). ۴) از استفادهٔ مجدد همان مقدار جلوگیری کنید. ۵) فقط اگر سیاست و ریسک ایجاب کرد، با git-filter-repo تاریخچه را پاک و با هماهنگی force-push کنید و از Support برای پاک‌سازی کش/PR کمک بگیرید. ۶) کنترل پیشگیرانه را روشن کنید.

کلید زنده را بچرخانید؛ تاریخچهٔ تمیز بدون revoke امنیت نمی‌آورد.

دقیقهٔ صفر تا پانزده: مهار

  1. نوع secret را شناسایی کنید: توکن GitHub، کلید ابر، DB password، webhook، private key.
  2. در پنل صادرکننده revoke/rotate کنید؛ نسخهٔ جدید را فقط از کانال امن توزیع کنید.
  3. اگر توکن GitHub بود، sessionها و SSH keyهای مشکوک را هم مرور کنید.
  4. اگر کلید ابر بود، هزینه‌ها، ایجاد منبع جدید، و IAM را چک کنید.
  5. کانال حادثه باز کنید: چه کسی، چه مخزن، چه SHA، چه زمان.

در همین مرحله، commit پاک‌سازی ظاهری بدون revoke فقط حس امنیت کاذب می‌دهد.

ارزیابی دامنه

سؤالچرا مهم است
مخزن عمومی بود یا خصوصی؟اسکنرهای عمومی سرعت سوءاستفاده را بالا می‌برند
چند وقت در تاریخچه بوده؟پنجرهٔ سوءاستفاده
fork و mirror وجود دارد؟کپی خارج از کنترل شما
در PR، issue، wiki، gist هم آمده؟secret scanning این‌ها را هم پوشش می‌دهد
در لاگ Actions چاپ شده؟بازدیدکنندگان و artifact

طبق GitHub، حتی پس از بازنویسی محلی و push، داده ممکن است در کلون‌ها، forkها، مشاهدهٔ کش‌شده، و ارجاع PR باقی بماند.

اقدامات هم‌زمان روی مخزن

  • دسترسی collaboratorها را مرور کنید؛ حساب مشکوک را حذف کنید.
  • branch protection و قوانین force push را بشناسید قبل از هر rewrite.
  • اگر workflow مخرب یا مشکوک اضافه شده، آن را متوقف و بررسی کنید.
  • alertهای secret scanning را در تب Security دنبال و مستند کنید.

آیا باید تاریخچه را پاک کنید؟

GitHub تأکید می‌کند پس از revoke، بازنویسی تاریخچه ممکن است دیگر ارزش ریسک عملیاتی را نداشته باشد. بازنویسی side effect دارد:

  • ریسک بازگشت secret با push کلون قدیمی.
  • تغییر hash همهٔ commitهای بعدی و شکستن ابزار وابسته.
  • نیاز به خاموش کردن موقت محدودیت force push.
  • اثر روی PRها، امضای commit، و هماهنگی همهٔ کلون‌ها.

اگر secret هنوز در تاریخچه است ولی باطل شده، اولویت مستندسازی و پیشگیری است. اگر دادهٔ حساس غیرقابل‌چرخش (مثلاً دادهٔ شخصی مشتری) است، مسیر پاک‌سازی و هماهنگی با Support جدی‌تر می‌شود.

اگر تصمیم به پاک‌سازی تاریخچه گرفتید

مسیر توصیه‌شدهٔ فعلی GitHub استفاده از git-filter-repo با پرچم sensitive-data-removal است — نه دستورهای قدیمی filter-branch به‌عنوان پیش‌فرض آموزشی.

bash

# خلاصهٔ مفهومی مراحل رسمی — جزئیات را از Docs بخوانید git clone https://github.com/ORG/REPO cd REPO # حذف فایل از تمام تاریخچه: git-filter-repo --sensitive-data-removal --invert-paths --path PATH/TO/SECRET_FILE # یا جایگزینی متن‌ها از فایل passwords.txt: # git-filter-repo --sensitive-data-removal --replace-text ../passwords.txt git push --force --mirror origin

قبل از mirror push برگشت‌ناپذیر، تعداد PRهای متأثر را از خروجی filter-repo بررسی کنید. ممکن است موقتاً branch protection را شل کنید. سپس با همکاران هماهنگ کنید که کلون‌های آلوده را merge نکنند — merge می‌تواند تاریخچهٔ آلوده را برگرداند؛ باید rebase/بازکلون طبق راهنما انجام شود.

برای پاک شدن کامل از سمت GitHub (کش، ارجاع PR، GC)، طبق Docs باید از طریق GitHub Support درخواست دهید و اطلاعات مخزن، تعداد PR متأثر، و First Changed Commit را بفرستید. Support برای دادهٔ غیرحساس این کار را نمی‌کند و وقتی چرخش credential ریسک را کم کند ممکن است کمک حذف را لازم نداند.

چک‌لیست بعد از مهار

  1. تأیید کنید secret قدیم هیچ‌جا کار نمی‌کند.
  2. رمز جدید در همهٔ محیط‌ها (اپ، CI، همکاران) به‌روز شده.
  3. علت ریشه‌ای: add بی‌دقت، نبود gitignore، نبود push protection، کپی در تست.
  4. فعال‌سازی/بازبینی push protection و secret scanning.
  5. آموزش کوتاه در تیم و به‌روزرسانی runbook.
  6. ثبت زمان‌خط حادثه برای یادگیری.

آنچه نباید بکنید

  • فقط delete کردن فایل در commit جدید و بستن تیکت.
  • force push بدون هماهنگی روی شاخهٔ فعال تیم.
  • fort کردن کلید جدید داخل همان PR عمومی با توضیح واضح مقدار.
  • نادیده گرفتن forkها.
  • فرض اینکه «مخزن خصوصی بود پس هیچ‌کس ندید».

نقش هشدارها و شریک‌های scanning

برای برخی انواع secret، GitHub با ارائه‌دهنده شریک است و ممکن است خود ارائه‌دهنده را مطلع کند. این کمک است نه جایگزین revoke توسط شما. validity checkها در طرح‌های پیشرفته کمک می‌کنند بفهمید کلید هنوز فعال است یا نه.

تمرین بدون بحران

در محیط آزمایشی یک‌بار سناریوی «توکن تست لو رفت» را با تیم مرور کنید: چه کسی revoke می‌کند، کانال اطلاع چیست، کی Security وارد می‌شود. اولین‌بار بودن این کار در production ساعت طلایی را می‌سوزاند.

خلاصه

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

سوالات متداول

commit را از تاریخچه پاک کردم؛ تمام شد؟

خیر تا revoke نشده و کپی‌ها و کش‌ها بررسی نشده‌اند.

آیا باید مخزن را خصوصی کنم؟

کاهش دید عمومی گاهی مفید است ولی جایگزین چرخش کلید نیست؛ پیامد تغییر visibility را از Docs بخوانید.

push protection بعد از حادثه چه کمکی می‌کند؟

از تکرار ورود secretهای شناخته‌شده جلوگیری می‌کند؛ برای گذشته کافی نیست.

منابع و مراجع

  • GitHub Docs — Removing sensitive data from a repository: https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/removing-sensitive-data-from-a-repository
  • GitHub Docs — About secret scanning: https://docs.github.com/en/code-security/secret-scanning/about-secret-scanning
  • GitHub Docs — Push protection: https://docs.github.com/en/code-security/secret-scanning/introduction/about-push-protection
  • GitHub Support portal: https://support.github.com/
  • git-filter-repo project: https://github.com/newren/git-filter-repo

نویسنده

سا

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

یادداشت‌های مرتبط

یادداشت‌های مرتبط

دسته‌بندی‌ها

خدمات مرتبط

از یادداشت تا پروژه

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

اگر در انتخاب معماری یا مسیر توسعه مطمئن نیستید، می‌توانید درباره پروژه صحبت کنیم.

مسئله و محدودیت را بنویسید. اگر تطابق داشته باشیم، برای گفتگو هماهنگ می‌کنیم.

سهیل ابراهیم‌پور
یادداشت‌ها
Monolith در برابر Microservices: کدام را انتخاب کنیم؟
Logging چیست؟ ثبت رویداد برای تشخیص و پاسخ به حادثه
Empty State، Error State و Loading State چیست؟
UX مهم‌تر است یا UI؟
چرا متن بد می‌تواند حتی یک UI زیبا را خراب کند؟

معماری نرم‌افزار

Monolith در برابر Microservices: کدام را انتخاب کنیم؟

۲۹ شهریور ۱۴۰۵

عملیات و استقرار

Logging چیست؟ ثبت رویداد برای تشخیص و پاسخ به حادثه

۲۹ شهریور ۱۴۰۵

مهندسی محصول

Empty State، Error State و Loading State چیست؟

۲۹ شهریور ۱۴۰۵

مهندسی محصول

UX مهم‌تر است یا UI؟

۲۹ شهریور ۱۴۰۵

مهندسی محصول

چرا متن بد می‌تواند حتی یک UI زیبا را خراب کند؟

۲۹ شهریور ۱۴۰۵
همه یادداشت‌ها219
معماری نرم‌افزار13
واژه‌نامه37
عملیات و استقرار87
مهندسی محصول74
راهنمای وب8
طراحی و ساخت محصول
توسعه فول‌استک
ممیزی مهندسی
مشاوره معماری
زیرساخت و استقرار
پروژه‌تان را مطرح کنید
ابزارهای رایگان
پروژه‌تان را مطرح کنید