یکی از آسیبپذیریهایی که شاید کمتر کسی به آن توجه دارد این است که اطلاعات حساس و محرمانه مربوط به نرمافزار (مثل نامکاربری و رمزعبور دیتابیس) داخل سورسکد نرمافزار رها شده و بالتبع درون یک Version Controlling System یا به اختصار یک VCS پابلیک قرار گرفته باشند (منظور از پابلیک این است که هر دولوپر دیگری به راحتی میتواند به سورسکد مد نظر دسترسی پیدا کند.) که در این صورت فرد یا شرکت توسعهدهندهٔ آن نرمافزار اطلاعات حساس و یا حتی مجوزهای لازم را با دست خود در اختیار افراد سودجو قرار داده که ممکن است امنیت نرمافزار ایشان را تحتالشعاع قرار دهند.
Git در حال حاضر به یکی از پرکاربردترین و محبوبترین سیستمهای ورژن کنترل تبدیل شده است و در این مقاله قصد داریم آموزش دهیم که به چه شکل میتوان اطلاعات حساسی که ممکن است در گذشته سهواً در ریپازیتوری گیت خود منتشر کردهایم را حذف کنیم.
شاید برخی بگویند که وقتی نرمافزار به صورت تجاری ریلیس (منتشر) شد، بخشهای حساس سورسکد را از ریپازیتوری حذف میکنیم و شاید هم این کار را بکنند، ولی دولوپرهایی هستند که یا بلد نیستند این کار را انجام دهند یا فراموش میکنند که این کار را انجام داده و نتیجه آن میشود که یک آسیبپذیری جدی به صورت کاملاً اختصاصی را در اختیار هکرها گذاشته میشود!
حذف اطلاعات حساس از یک سیستم ورژن کنترل پابلیک (عمومی) مانند #گیتهاب کار سادهای است؛ تنها کافی است فایل مورد نظر خود را از ریپازیتوری گیتهاب حذف کرده و همچنین نام آن فایل را در فایل gitignore. اضافه نمایید (gitignore. یک فایل متنی ساده است که میتوان لیست فایلها و یا فولدرهایی که نمیخواهیم منتشر شوند را در آن قرار داده و این لیست در کلیهٔ پول و پوشها نادیده گرفته میشود.)
آشنایی با دستور filter-branch در گیت
برای انجام این کار، نخست آخرین تغییراتی که باید در پروژه اصطلاحاً Merge شوند را انجام دهید تا سهواً حاصل زحمات همکارانتان از دست نرود و بعد تاریخچهٔ فایل مورد نظر را از گیتهاب حذف نمایید؛ حذف تاریخچه با دستور filter-branch به صورت زیر انجام میشود:
$ git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA' \
--prune-empty --tag-name-filter cat -- --all
شاید در نگاه اول کامندهای بالا برای برخی کاربران پیچیده به نظر برسند، اما کاربرد آنها بسیار ساده است. پس از اینکه دستور فوق با موفقیت به پایان رسید، چند کار دیگر هم باید انجام دهید که اولین مورد، افزودن فایل/فایلهای مورد نظر به فایل gitignore. است که در بالا به آن اشاره شد؛ سپس استفاده از دستور زیر است که این وظیفه را دارا است تا کلیهٔ تغییرات لوکال را روی ریپازیتوری مد نظرتان اِعمال کند:
$ git push origin --force --all
در پایان، از دیگر اعضای تیم خود بخواهید تا پروژه را مجدداً از گیتهاب به اصطلاح کلون (دریافت) کنند تا مجدداً این اطلاعات حساس بر روی ریپازیتوری آپلود نشوند؛ همچنین اگر پروژهٔ خود را بر روی ورژن کنترلهای پابلیک قرار دادهاید، باید کلیهٔ پسوردها را تغییر دهید تا خطر نشت اطلاعات را به حداقل برسانید.
البته یک راه سادهتر هم برای حذف اطلاعات حساس از ریپازیتوری گیتهاب وجود دارد و آن هم استفاده از دستور bfg به جای دستور filter-branch است. برای مثال، برای حذف یک فایل حساس از ریپازیتوری مد نظر، از دستور زیر استفاده نمایید:
$ bfg --delete-files YOUR-FILE-WITH-SENSITIVE-DATA
YOUR-FILE-WITH-SENSITIVE-DATA هم نام فایلی است که اطلاعات حساس پروژه در آن قرار گرفته است.