چرا git log حتی پس از «حذف» اسرار را فاش میکند؟
حذف یک خط از یک فایل و commitاین تغییر در واقع دادههای حساس را از مخزن شما حذف نمیکند. اگر آن راز، یک کلید API، اعتبارنامه یا توکن، تا به حال وجود داشته باشد commitتد، این در تاریخچه گیت شما ذخیره میشود. هر کسی که آن را اجرا میکند گیت لاگ -p, نمایش گیتیا بررسی تفاوتها با گذشته commitهنوز هم میتوان آن را بازیابی کرد.
حتی اگر فایلی را بازنویسی کنید یا مقداری را جایگزین کنید، ورود به سیستم اصل و نسب کامل هر تغییر را حفظ میکند. این از روی طراحی است. کل مدل گیت بر اساس تغییرناپذیری است commit تاریخ و نسخههای توزیعشده. بنابراین، مگر اینکه صریحاً تاریخ را بازنویسی کنید، اسرار شما هنوز سر جای خود هستند. در اینجا یک مورد عملی وجود دارد:
⚠️ مثال آموزشی، در محیط عملیاتی اجرا نشود
خیلی دیر شده. ورود به سیستم هنوز آن کلید را در حرف اول نام نشان میدهد commit.
تصورات غلط در مورد git stash و git rebase
بسیاری از توسعهدهندگان فرض میکنند گیت استش به پنهان کردن یا پاک کردن اسرار کمک میکند. درست نیست. گیت استش فقط قفسهها دایرکتوری کار موقتاً تغییر میکند؛ هرگز لمس نمیشود commit تاریخ. اگر رازی وجود داشت commitتد، ذخیره کردن پول خرد بعداً هیچ کمکی به تمیز کردن آن نمیکند.
در مورد ریبیس گیتاگرچه میتواند تاریخ را از نو بنویسد، اما باید از قبل انجام شودcisالی. فقط در حال دویدن گیت ریبیس -i و مرتبسازی مجدد یا له کردن commits رمزها را حذف نمیکند مگر اینکه صریحاً آنها را ویرایش یا حذف کنید. و اگر حتی یک کلون یا فورک با نسخه اصلی وجود داشته باشد commit، راز تو هنوز زنده است.
حتی بدتر از آن، تغییر پایگاه داده بدون اعمال صحیح فورس-پوش یا هماهنگی مجدد با همکاران میتواند اعتبارنامههای افشا شده را از طریق ادغامها دوباره معرفی کند.
⚠️ مثال آموزشی، در محیطهای واقعی استفاده نکنید
⚠️ مثال آموزشی، روی مخازن اصلی اجرا نشود
ویرایش commit حاوی راز است، اما فراموش میکند آن را حذف کند. شما ورود به سیستم قدرت نگاه پاکتر، اما محتوای حساس هنوز قابل بازیابی است.
خطرات دنیای واقعی ناشی از فراموشی اعتبارنامهها در تاریخچه گیت
این یک فرضیه نیست. مهاجمان به طور فعال مخازن عمومی و خصوصی را برای یافتن اسرار پنهان در آنها اسکن میکنند. commit تاریخچهها. فورکهای گیتهاب، مخازن آینهای و فایلهای ذخیرهشده در حافظه پنهان CI/CD pipelineهمه میتوانند آن توکنهای فراموششده را در خود جای دهند.
- یک کلید API لو رفته از یک سرور قدیمی ورود به سیستم منجر به هزاران دلار هزینه ابری برای یک استارتاپ شد.
- توکنهای OAuth committed، که سپس «حذف» شدند، برای ربودن حسابهای کاربری مورد استفاده قرار گرفتند.
- رازهای پنهان در اعماق فورکهای پروژههای متنباز، باعث بروز حوادث امنیتی بزرگی شدند.
این مشکلات در مقیاسهای مختلف وجود دارند CI/CDهر کاری که یک مخزن را کپی میکند، اجرا میشود. ورود به سیستم زیر کاپوت، و هر مصنوع ساخت میتواند به طور بالقوه شامل ردپایی از اسرار افشا شده باشد.
پاکسازی دادههای حساس با git filter-repo
اگر آسیبی وارد شده باشد، مطمئنترین ابزار برای تمیز کردن آن، مخزن فیلتر گیت. بر خلاف ریبیس گیتکه بازنویسی میکند فرد commits, مخزن فیلتر گیت میتواند کل را از نو بنویسد commit تاریخچه بر اساس مسیر فایل، الگوها یا محتوا.
مثال: برای پاک کردن همه موارد config.json که ممکن است حاوی اسرار باشد:
⚠️ مثال آموزشی، قبل از استفاده در محیط عملیاتی، در یک مخزن آزمایشی تأیید کنید
یا برای حذف همه commitکه شامل یک رشته خاص هستند (مثلاً AWS_SECRET_ACCESS_KEY):
⚠️ مثال آموزشی، قبل از استفاده در محیط عملیاتی، در یک مخزن آزمایشی تأیید کنید
محتاط باشید: این بازنویسی خواهد شد commit هشها. شما باید به همه همکاران خود اطلاع دهید و آنها را مجبور به اعمال فشار کنید. هرگونه کلید اتوماسیون یا استقرار مرتبط با commit هشها شکسته خواهند شد.
همچنین، ابزارهایی مانند BFG Repo-Cleaner قابلیتهای مشابهی ارائه میدهند اما انعطافپذیری کمتری دارند و اکنون برای موارد پیچیده منسوخ شده تلقی میشوند.
جلوگیری از نشت اطلاعات محرمانه قبل از رسیدن به گیت
پیشگیری بهتر از پاکسازی است. در اینجا نحوه جلوگیری از فاش شدن رازها آورده شده است ورود به سیستم:
1. Pre-commit Hooks
از ابزارهایی مانند استفاده کنید pre-commit, گیتلیکز، یا طلسم برای اسکن کردن اسرار قبل از commits:
2. CI/CD Pipeline اجرای
ادغام تشخیص مخفی در شغلهای CI خود. وقتی اسرار پیدا میشوند، شکست ایجاد میشود. این را به یک سیاست تبدیل کنید.
۳. مدیریت اسرار
هرگز اعتبارنامهها را به صورت کد ثابت وارد نکنید. از همان روز اول از متغیرهای محیطی، خزانهها یا مدیران مخفی استفاده کنید.
۴. وابستگیهای حسابرسی
کورکورانه به بستههای شخص ثالث اعتماد نکنید. رازها میتوانند فاش شوند از طریق لایههای npm، PyPI یا Docker.
راه حل نهایی: حذف اسرار با git filter-repo
حذف اسرار از کد کافی نیست. ورود به سیستم مگر اینکه عمداً اقدامی برای بازنویسی تاریخ انجام دهید، سوابق کاملی را ثبت میکند. به آن تکیه نکنید گیت استش یا نیم پز ریبیس گیت تلاشها. استفاده کنید مخزن فیلتر گیت وقتی به یک پاکسازی عمیق نیاز دارید، و قبل از اینکه اطلاعات سری به مخزن شما برسند، سیاستها و اسکن را اعمال کنید.
برای تشخیص مخفی پیشگیرانه، استفاده از ابزارهایی مانند شیگنی برای تأمین امنیت خود pipelineها، اجرا کردن commit بهداشت، و جلوگیری از نشتهای پرهزینه قبل از آشکار شدن. گیت هرگز فراموش نمیکند، اما میتوانید مطمئن شوید که از همان ابتدا هرگز اسرار شما را به خاطر نمیسپارد.





