نکاتی که باید در مورد git-crypt بدانید تا بتوانید از اطلاعات محرمانه خود با موفقیت محافظت کنید

عکس پروفایل نویسنده

@MichaelBمایکل

من Dev Spotlight را اجرا می کنم – ما محتوای فناوری را برای شرکت های فناوری می نویسیم. ایمیل به [email protected]

بسیاری از پروژه های نرم افزاری از اسرار استفاده می کنند – معمولاً از کلیدهای API یا گواهینامه های خارجی برای دسترسی به یک منبع خارجی مانند پایگاه داده استفاده می شود. برنامه شما در زمان اجرا به این کلیدها نیاز دارد ، بنابراین باید بتوانید هنگام استقرار برنامه یا در مرحله آماده سازی محیط استقرار خود ، آنها را تهیه کنید.

در این مقاله ، من قصد دارم نحوه استفاده از git-crypt را به شما نشان دهم تا بتوانید با خیال راحت اسرار برنامه خود را در مخازن کد منبع خود نگه دارید ، حتی اگر عمومی باشد.

مشکل رازهای برنامه

اکثر پروژه ها دارای نوعی کلید مخفی یا اعتبارنامه هستند. به عنوان مثال ، اگر برنامه شما در Heroku میزبانی شده باشد ، ممکن است با استفاده از دستوری مانند این ، یک کلید API برای برنامه Heroku خود ارائه دهید:

$ heroku config:set API_KEY=my-sooper-sekrit-api-key

با اجرای این دستور قبل از اینکه برنامه خود را مجدداً مستقر کنید ، به آن یک متغیر محیطی می دهید در زمان اجرا API_KEY با مقدار my-sooper-sekrit-api-key نامیده می شود. با این حال ، پیگیری این مقادیر مخفی خارج از از هروکو (یا هر کجا که برنامه خود را نصب کنید) هنوز یک چالش است.

من همیشه سعی می کنم پروژه هایم را طوری تنظیم کنم که بتوانم بدون هیچ مرحله جداگانه و دستی ، یک دستور واحد برای استقرار آنها اجرا کنم. برای مثال ما ، این بدان معنی است که من باید مقدار my-sooper-sekrit-api-key را ذخیره کنم جایی به طوری که کد استقرار من می تواند از آن استفاده کند (در این مورد ، برای اجرای پیکربندی heroku: تنظیم کنید … دستور بالا).

کد منبع پروژه من همیشه در git ذخیره می شود و معمولاً در github.com یا bitbucket.com یا برخی دیگر از خدمات میزبانی کد منبع میزبانی می شود. من میتوانست مقدار API_KEY من را در مخزن کد منبع خود ذخیره کنید ، با این حال ، موارد منفی نیز در این مورد وجود دارد:

  1. من نمی توانم مخزن خود را با شخص دیگری به اشتراک بگذارم ، مگر اینکه راحت باشم که آنها به اسرار من دسترسی پیدا کنند. این بدان معنی است که تمام مخازن برنامه های کاربردی من با اسرار در آنها نیاز به خصوصی دارند.
  2. احتمالاً بسیاری از کارمندان در Github / bitbucket / هر کجا که به اسرار من دسترسی داشته باشند ، ممکن است با آنها مشکلی نداشته باشم (بسته به راز).
  3. اگر بعداً بخواهم آن را عمومی کنم ، فراموش کردن اسرار موجود در یک مخزن خصوصی آسان است. بنابراین می توانم به طور اتفاقی اسرار مهم را فاش کنم.

من می توانم اسرار خود را در جایی جدا از کد منبع برنامه خود ذخیره کنم ، اما این مشکلات خاص خود را دارد:

  • من به راهی نیاز دارم تا اسرار خود را از هرجایی که ذخیره شده است ، در زمان استقرار یا قبل از آن دریافت کنم و به کد استقرار خود اجازه دسترسی به آنها را بدهم.
  • اسرار من ممکن است به اندازه کد منبع من محکم ذخیره نشوند. به عنوان مثال ، من می توانم اسرار را در یک فایل .env در لپ تاپ خود نگه دارم و اطمینان حاصل کنم که هرگز این مورد را در مخزن git بررسی نمی کنم. با این حال ، اگر آن پرونده را گم کنم (مانند اینکه لپ تاپم آسیب ببیند / به سرقت برود) ، آن راز را نیز از دست می دهم.

سرداب گیت

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

بیایید به یک مثال نگاه کنیم.

1. git-crypt را نصب کنید.

دستورالعمل هایی برای Linux ، Mac و Windows در صفحه نصب git-crypt وجود دارد

اگر مثل من ، از Mac با نصب Homebrew استفاده می کنید ، می توانید اجرا کنید:

2. مخزن git جدید ایجاد کنید.

$ mkdir myproject 
$ cd myproject 
$ git init 
$ echo "This is some text" > file.txt 
$ git add file.txt 
$ git commit -m "Initial commit"

اکنون یک مخزن git داریم که شامل یک فایل متنی است.

3. مخزن را برای استفاده از git-crypt تنظیم کنید.

شما باید خروجی را ببینید:

قبل از اینکه کار دیگری انجام دهیم ، لطفا دستور زیر را اجرا کنید:

$ git-crypt export-key ../git-crypt-key

این دستور یک کپی از کلید متقارن git-crypt ایجاد می کند که برای این مخزن تولید شده است. ما آن را در فهرست بالای این مخزن قرار می دهیم تا بتوانیم از همان کلید در چندین مخزن git دوباره استفاده کنیم.

به طور پیش فرض ، git-crypt کلید تولید شده را در پرونده .git / git-crypt / keys / default ذخیره می کند ، بنابراین با اجرای cp .git / git-crypt / keys / default می توانید به همان نتیجه برسید ../git-crypt- کلید

این فایل git-crypt-key مهم است. این کلیدی است که می تواند تمام پرونده های رمزگذاری شده در مخزن ما را باز کند. بعداً نحوه استفاده از این کلید را خواهیم دید.

4- به git-crypt بگویید کدام پرونده ها را رمزگذاری کند.

تصور کنید برنامه ما به کلید API نیاز دارد و ما می خواهیم آن را در فایلی به نام api.key ذخیره کنیم.

قبل از ما آن پرونده را به مخزن خود اضافه می کنیم ، به git-crypt خواهیم گفت که هر وقت فایل api.key را مرتکب شد رمزگذاری شود.

ما این کار را با استفاده از فایل .gitattributes انجام می دهیم. این پرونده ای است که می توانیم از آن برای اضافه کردن فوق داده به مخزن git خود استفاده کنیم. این مختص git-crypt نیست ، بنابراین ممکن است از قبل یک پرونده .gitattributes در مخزن خود داشته باشید. در این صورت ، فقط خطوط مربوطه را اضافه کنید – کل پرونده را جایگزین نکنید.

در مورد ما ، ما یک پرونده .gitattributes نداریم ، بنابراین باید یک پرونده ایجاد کنیم. پرونده .gitattributes حاوی خطوطی از فرم است:

[file pattern] attr1=value1 attr2=value2

برای git-crypt ، الگوی پرونده باید با تمام پرونده هایی که می خواهیم git-crypt رمزگذاری شود مطابقت داشته باشد و ویژگی ها همیشه یکسان هستند: فیلتر و اختلاف ، هر دو را git-crypt قرار می دهیم.

بنابراین ، پرونده .gitattributes ما باید حاوی این موارد باشد:

api.key filter=git-crypt diff=git-crypt

آن پرونده را ایجاد کنید و آن را به مخزن git خود اضافه و متعهد کنید:

$ echo "api.key filter=git-crypt diff=git-crypt" > .gitattributes 
$ git add .gitattributes 
$ git commit -m "Tell git-crypt to encrypt api.key"

من از نام واقعی پرونده api.key در پرونده .gitattributes خود استفاده کرده ام ، اما این می تواند هر الگوی فایلی باشد که شامل پرونده (های) موردنظر برای رمزگذاری باشد ، بنابراین می توانم مثلاً از * .key استفاده کنم. متناوباً ، می توانید برای هر فایلی که می خواهید رمزگذاری کنید یک خط اضافه کنید.

اگر بخواهید از چندین پرونده با یک الگوی واحد محافظت کنید ، اشتباه در پرونده .gitattributes آسان خواهد بود. بنابراین ، من به شدت توصیه می کنم این بخش از git-crypt README را مطالعه کنید ، که برخی از خریدهای رایج را برجسته می کند.

5. یک راز اضافه کنید.

حالا که به git-crypt گفتیم می خواهیم فایل api.key را رمزگذاری کنیم ، اجازه دهید آن را به مخزن خود اضافه کنیم.

همیشه بهتر است قبل از ارتکاب راز واقعی خود ، تنظیمات خود را ابتدا با افزودن مقدار ساختگی و تأیید رمزگذاری موفقیت آمیز آن آزمایش کنید.

$ echo "dummy value" > api.key

ما هنوز api.key را به git اضافه نکرده ایم ، اما می توانیم بررسی کنیم که git-crypt چیست رفتن انجام با دویدن:

باید خروجی زیر را ببینید:

    encrypted: api.key 
not encrypted: .gitattributes 
not encrypted: file.txt

بنابراین ، حتی اگر پرونده api.key هنوز به مخزن git ما متعهد نشده است ، این به شما می گوید که git-crypt قصد دارد آن را برای شما رمزگذاری کند.

بیایید پرونده را اضافه و متعهد کنیم:

$ git add api.key 
$ git commit -m "Added the API key file"

6. تأیید کنید که رمز ما رمزگذاری شده است.

ما به git-crypt گفته ایم که رمزگذاری شود و api.key را به مخزن خود اضافه کرده ایم. با این حال ، اگر نگاه کنیم ، هیچ چیز متفاوت به نظر نمی رسد:

$ cat api.key 
dummy value

دلیل این امر این است که git-crypt هنگام فشار دادن و کشیدن فایلها به مخزن ، به طور شفاف رمزگذاری و رمزگشایی می کند. بنابراین ، فایل api.key مانند یک فایل عادی و روشن به نظر می رسد.

$ file api.key 
api.key: ASCII text

یکی از راه های تأیید رمزگذاری شدن پرونده های شما ، انتقال مخزن خود به GitHub است. وقتی فایل api.key را با استفاده از رابط وب GitHub مشاهده می کنید ، می بینید که این یک فایل باینری رمزگذاری شده است نه متن.

راه آسانتری برای دیدن نحوه مشاهده مخزن برای شخصی بدون کلید رمزگشایی این است که اجرا شود:

حالا اگر به پرونده api.key خود نگاه کنیم ، چیزها متفاوت است:

$ file api.key 
api.key: data 

$ cat api.key 
GITCRYPTROܮ7yR*^

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

برای بازگشت به داشتن یک فایل api.key cleartext ، اجرا کنید:

$ git-crypt unlock ../git-crypt-key

پرونده //git-crypt- پرونده ای است که ما قبلاً با استفاده از کلید صادرات git-crypt ذخیره کردیم …

ایست بازرسی

بیایید سریع بررسی کنیم که اکنون کجا هستیم.

  • استفاده از git-crypt در مخزن git را ابتدا در مخزن git شروع کنید
  • از الگوهای پرونده در .gitattributes استفاده کنید تا به git-crypt بگویید کدام پرونده ها را رمزگذاری می کند
  • قفل git-crypt تمام پرونده های مشخص شده در مخزن ما را رمزگذاری می کند
  • قفل git-crypt [path to keyfile] پرونده های رمزگذاری شده را رمزگشایی می کند

کلید git-crypt فایل بسیار مهم است. بدون آن ، قادر به رمزگشایی هیچ یک از پرونده های رمزگذاری شده در مخزن خود نخواهید بود. هر کسی که یک نسخه از آن پرونده را داشته باشد ، به همه اسرار رمزگذاری شده در مخزن شما دسترسی دارد. بنابراین شما باید آن پرونده را ایمن و مطمئن نگه دارید.

دوباره از پرونده Key git-crypt استفاده کنید

ما برای ساختن پرونده کلید git-crypt از کلید init و git-crypt export استفاده کردیم. اما ، اگر مجبور باشیم یک پرونده کلید جداگانه برای هر یک از مخازن خود داشته باشیم ، پس مدیریت مخفی خود را خیلی بهبود نداده ایم.

خوشبختانه ، استفاده از همان پرونده کلید git-crypt برای چندین مخزن git بسیار آسان است.

هنگامی که مخزن git خود را برای استفاده از git-crypt راه اندازی می کنید ، برای استفاده از یک پرونده کلید موجود ، فقط از قفل git-crypt استفاده کنید به جای git-crypt init ، مانند این:

$ mkdir my-other-project   # At the same directory level as `myproject` 
$ cd my-other-project 
$ git init 
$ echo "Something" > file.txt 
$ git add file.txt 
$ git commit -m "initial commit" 
$ git-crypt unlock ../git-crypt-key

اگر قبل از اضافه کردن هر پرونده به مخزن git خود ، دستور git-crypt unlock را اجرا کنید ، پیامی مانند این را مشاهده خواهید کرد:

fatal: You are on a branch yet to be born 
Error: 'git checkout' failed 
git-crypt has been set up but existing encrypted files have not been decrypted

این هنوز هم خوب کار می کند ، اما کمی گیج کننده است ، بنابراین من اطمینان حاصل کردم که حداقل یک فایل را قبل از اجرای باز کردن قفل git-crypt اضافه و متعهد می کنم …

استفاده مجدد از پرونده کلید git-crypt شما راحت است ، اما به این معنی است که اگر کسی نسخه دیگری از پرونده کلید شما را دریافت کند ، همه رازهای رمزگذاری شده شما فاش می شود

این همان نوع تجارت امنیتی است که با استفاده از یک مدیر رمز عبور مانند LastPass یا 1password استفاده می شود. به جای مدیریت چندین اسرار (رمزهای عبور) ، هرکدام با خطر خاص خود در معرض قرار گرفتن ، همه آنها را در یک فروشگاه امن نگه دارید و از یک رمز عبور اصلی برای باز کردن قفل استفاده کنید که.

ایده در اینجا این است که مدیریت یک راز مهم آسان تر از بسیاری از اسرار کمتر است.

چه موقع استفاده از git-crypt نیست

Git-crypt یک روش عالی برای حفظ اسرار مورد نیاز برنامه های شما در مخزن git ، در کنار کد منبع برنامه است. با این حال ، مانند هر اقدام امنیتی دیگر ، اینگونه نیست همیشه مناسب یا توصیه می شود.

در اینجا مواردی وجود دارد که باید در نظر بگیرید تا تصمیم بگیرید که آیا راه حل مناسبی برای پروژه خاص شما است.

  • git-crypt برای شرایطی طراحی شده است که اکثر پرونده های موجود در مخزن git شما می توانند در متن بعدی باقی بمانند و شما فقط باید چند پرونده حاوی اسرار را رمزگذاری کنید. اگر شما نیاز به رمزگذاری بیشتر یا تمام پرونده های موجود در مخزن خود دارید ، ممکن است راه حل های دیگر بهتر باشد.
  • هیچ راهی آسان برای لغو دسترسی به اسرار موجود در یک مخزن به محض دسترسی شخصی به پرونده اصلی وجود ندارد و هیچ راهی آسان برای چرخاندن (یعنی جایگزینی) یک پرونده کلید وجود ندارد (اگرچه تغییر پرونده کلید git-crypt کمک چندانی نمی کند مگر اینکه شما همچنین تمام اسرار واقعی موجود در مخزن را بچرخانید).
  • git-crypt فقط رمزگذاری می کند فهرست پرونده ها بنابراین ، اگر مناسب نباشد فراداده از مخزن شما نیز حساس است (به عنوان مثال نام پرونده ها ، تاریخ اصلاح ، پیام های متعهد ، و غیره).
  • برخی از برنامه های GUI git ممکن است به طور قابل اعتماد با git-crypt کار نکنند. (اگرچه مورد خاص Atlassian SourceTree ، ذکر شده در README ، رفع شده است.)

اطلاعات بیشتری در این بخش از git-crypt README وجود دارد.

روشی بهتر برای استفاده از git-crypt

به جای مدیریت مستقیم فایل کلید git-crypt ، روش بهتری برای مدیریت مخازن رمزگذاری شده با ادغام git-crypt با gpg وجود دارد ، بنابراین می توانید از کلید خصوصی gpg برای رمزگشایی مخزن git استفاده کنید. این همچنین به شما امکان می دهد تا چندین مشارکت کننده را بدون انتقال هرگونه راز بین طرفین ، به یک مخزن git اضافه کنید. با این حال ، این به تنظیمات پیچیده تری نیاز دارد ، بنابراین ما آن را برای مقاله دیگری ذخیره خواهیم کرد.

برچسب ها

با هکر نون همراه باشید

حساب رایگان خود را ایجاد کنید تا قفل تجربه خواندن سفارشی خود را باز کنید.