چطوری کلیدهای SSH و GPGمون رو تولید کنیم و بذاریم رو گیت‌هاب؟ اصلا چی هستن و به چه دردی می‌خورن؟

2020-04-09
20 دقیقه مطالعه

حتما خیلی‌هاتون از گیت‌هاب، گیت‌لب، بیت‌باکت و یا سرویس‌های امثال‌شون برای مدیریت پروژه‌هاتون استفاده می‌کنید. خیلی‌هامون روی این پلتفرم‌ها ریپوزیتوری داریم، از پروژه‌های آزاد گرفته تا پروژه‌های پرایوت. (البته همون‌طور که می‌دونید ایرانی‌ها به دلیل تحریم نمی‌تونن ریپوزیتوری پرایوت روی گیت‌هاب داشته باشن! ولی اینجا هدف بحث‌مون این نیست.)

می‌خوایم در مورد دوتا قابلیت خیلی باحال که خیلی از این ارائه دهنده‌های گیت بهمون می‌دن صحبت کنیم. حتما برای شما هم پیش اومده که موقع پوش کردن ریپوزیتوری‌تون به یه ریموت (مثلا گیت‌هاب) ازتون یوزرنیم و پسورد پرسیده و خب این یوزر نیم و پسورد پرسیدن به یک بار ختم نمی‌شه و هر دفعه که شما نیاز دارین یه تغییری روی ریموت بدین یا مثلا توی ریپوزیتوری‌های پرایوت تغییرات رو از ریموت بگیرین، لازمه که هر دفعه یوزر نیم و پسورد بزنین و خب توی طولانی مدت قطعا به موضوع اذیت‌کننده‌ای تبدیل می‌شه و ترجیح می‌دین به جای این‌که هر دفعه بیاین یوزر نیم و پسورد بزنین، به شکل خودکار شناسایی بشین!

برای این قضیه دوتا راه داریم، اولیش اینه یه جورایی یوزر نیم و پسوردمون رو توی گیت ذخیره کنیم. برای این کار خیلی ساده می‌تونیم دستور زیر رو اجرا کنیم:

$ git config --global credential.helper store

بعد از این دستور به محض این‌که یه اکشنی انجام بدین که نیاز به احراز هویت داره، یوزر نیم و پسوردتون ذخیره می‌شه. اما اشکال این کار چیه؟ اشکال این کار اینه که یوزرنیم و پسورد شما داخل یه فایل توی دایرکتوری هوم‌تون به شکل plain text ذخیره شده و اگر بخوایم از نظر امنیتی به قضیه نگاه کنیم اصلا اتفاق خوبی نیست و احتمالا بیشترتون ترجیح می‌دین پسوردهاتون رو هیچ‌جا به شکل plain text ذخیره نکنید.

بنابراین می‌ریم سراغ گزینه‌ی دوم. راه دومی که برای انجام این کار داریم اینه که بیایم از کلید SSH استفاده کنیم. ولی بیاید قبلش یکم در مورد SSH صحبت کنیم. Secure Shell یا به اصطلاح SSH یه پروتکل اینترنتی هست که بهتون کمک می‌کنه با استفاده از یه کانال امن و رمزنگاری شده بین دوتا دستگاه ارتباط برقرار کنید. با کمک این پروتکل هر دفعه که دیتایی از طرف کامپیوترتون به شبکه می‌فرستین اون دیتا رمزنگاری می‌شه و وقتی دیتا به مقصدش رسید دوباره رمزگشایی و قابل خوندن می‌شه. معمولا SSH به شکل سرور/کلاینت کار می‌کنه و یکی از قابلیت‌هایی که اینجا مستقیما باهاش کار داریم کلید SSH هست. کلید SSH راهی برای احراز هویت کاربرا توی این پروتکل هست؛ در واقع نرم افزار سرور SSH به کلیدهای مورد اطمینان اجازه‌ی ورود و تبادل اطلاعات می‌ده. تنها کاری که ما لازمه انجام بدیم اینه که یه کلید SSH برای خودمون بسازیم و به سرور مورد نظرمون (که اینجا گیت‌هاب هست) بگیم که این کلید مورد اطمینانه و بهش اجازه‌ی تبادل اطلاعات رو بده.

برای ایجاد کلیدهای SSH ما یه ابزاری داریم به اسم ssh-keygen که معمولا به شکل پیش‌فرض روی بیشتر سیستم‌های یونیکسی (لینوکس هم شاملش می‌شه) نصب هست. این ابزار برای ما یک جفت کلید ایجاد می‌کنه که یکیش کلید عمومی و اون یکی کلید خصوصی هست. به شکل خلاصه شما با کلید خصوصی‌تون می‌تونید توی پروتکل SSH یه محتوایی رو قفل کنید (رمزنگاری کنید) و به جایی بفرستید و بعد دریافت کننده‌ای که کلید عمومی‌تون رو داره می‌تونه مطمئن بشه که اون اطلاعات از سمت شماست. حالا توی این مورد (ریموت‌های گیت) شما می‌تونین کلید عمومی‌تون رو به سرور مورد نظرتون بدین و بعد با کلید خصوصی‌تون شناسایی بشین. در واقع موضوع واضح اینجاست که کلید عمومی‌تون رو می‌تونید هر جایی منتشر کنید و به هر کسی بدید اما کلید خصوصی همون‌طوری که از اسمش مشخصه مال شماست و به هیچ وجه نباید جایی منتشرش کنید، چرا که اگه کسی کلید خصوصی شما رو داشته باشه می‌تونه خودش رو به جای شما جا بزنه و با هر محتوایی رو که با اون کلید قفل کرد به اسم شما ثبت کنه!

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

از این حرفا بگذریم، می‌رسیم به این‌که چطوری کلید SSH تولید کنیم و بذاریمش رو گیت‌هاب تا از این به بعد احراز هویت‌مون از این روش انجام بشه و علاوه بر امنیت بیشتر، دیگه لازم نباشه هر دفعه نام کاربری و پسورد بزنیم. به عنوان اولین مرحله یه ترمینال باز کنید و دستور زیر رو توش اجرا کنید:

$ ssh-keygen -b 4096

بعدش با همچین خروجی‌ای مواجه می‌شین که طبق راهنما ازشون عبور کنید:

> Generating public/private rsa key pair.


> Enter a file in which to save the key (/home/you/.ssh/id_rsa): [Press enter]

> Enter passphrase (empty for no passphrase): [You Can Type a passphrase or not]
> Enter same passphrase again: [If you Typed a passphrase, type it again otherwise press enter]

حالا اگه به دایرکتوری ~/.ssh برین می‌بینید که دوتا فایل دارین به اسم‌های id_rsa و id_rsa.pub. فایل id_rsa حاوی کلید خصوصی شما و فایل id_rsa.pub هم حاوی کلید عمومی‌تونه. حالا برید به صفحه‌ی تنظیمات گیت‌هاب‌تون و از قسمت Personal Settings گزینه‌ی SSH and GPG keys رو بزنید. بعدش روی دکمه‌ی New SSH Key کلیک کنید. یه فرم براتون باز میشه که شامل دو بخش Title و Key خواهد بود. توی بخش Title می‌تونید یه عنوان برای کلیدتون انتخاب کنید (معمولا از Host Name کامپیوتری که کلید روش قرار داره استفاده می‌کنیم) و بعد وارد فایل کلید عمومی‌تون بشید، محتویاتش رو کپی کنید و داخل فیلد Key قرار بدین. حالا کافیه با استفاده از دکمه‌ی Add SSH Key کلیدتون رو داخل گیت‌هاب ثبت کنید.

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

این روند برای سرویس‌های دیگه مثل گیت‌لب هم به همین شکله. فقط کافیه کلیدتون رو ایجاد کنید و توی تنظیمات سرویس دنبال جایی بگردین که بتونین کلیدتون رو بذارین توش و تمام ((( :

خارج از موضوع بگم که استفاده‌های دیگه‌ای هم از این کلید می‌تونید بکنید، مثلا یکی دیگه از کاربردی‌ترین‌هاش اینه که می‌تونید باهاش بدون نیاز به دادن رمز وارد سرورتون که روش SSH نصبه (قاعدتا روی همه‌ی سرورهای لینوکسی باید نصب باشه)، بشین که خب از بحث این نوشته خارجه اما می‌تونید با یه جستجو بفهمین چطوری!

اما موضوع بعدی‌ای که می‌خوایم در موردش صحبت کنیم کلید GPG هست. GPG یا Gnu Privacy Guard اسم یه نرم نرم افزار برای رمزنگاریه که همون‌طوری که از اسمش مشخصه عضوی از پروژه گنو محسوب می‌شه. GPG هم بهتون یک جفت کلید می‌ده و یه جورایی میشه گفت کارکردی مشابه با SSH Key داره با این تفاوت که SSH Key صرفا جهت استفاده در پروتکل SSH هست اما با GPG تقریبا می‌تونید هر چیزی رو رمزنگاری کنید! شما به نوعی با کلید خصوصی GPG خودتون می‌تونید داده‌ها رو امضا کنید و دریافت کننده‌ای که کلید GPG عمومی شما رو داره می‌تونه مطمئن بشه که اون داده از طرف شما ارسال شده و این قابلیتی هست که قراره ازش استفاده کنیم تا کاربرها مطمئن باشن کامیتی که زدیم واقعا از طرف ما بوده یا نه! احتمالا شما هم توی خیلی از ریپوزیتوری‌ها عبارت verified رو جلوی کامیت‌ها دیدین:

github verifed commit

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

برای تولید کلید GPG هم کار سختی در پیش نداریم. توی همه‌ی سیستم‌های گنو/لینوکسی ابزار تحت خط فرمان gpg موجوده و کافیه از دستور زیر استفاده کنید:

$ gpg --full-gen-key

بعدش با خروجی‌ای مشابه خروجی زیر مواجه می‌شین که طبق راهنمایی که براتون نوشتم پیش برین:

Please select what kind of key you want:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (sign only)
   (4) RSA (sign only)
Your selection? 1

RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) 4096
Requested keysize is 4096 bits

Please specify how long the key should be valid.
         0 = key does not expire
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n months
      <n>y = key expires in n years
Key is valid for? (0) 0
Key does not expire at all
[NOTE: if you want to expire your keys in a specific period of time just enter it. for example: 2y (your keys would be valid just for two years)]

Is this correct? (y/N) y

بعدش gpg ازتون می‌خواد که یه پسورد برای کلیدتون تعریف کنید. بعد از این مرحله طبق باکس پایین بقیه مراحل رو ادامه بدین:

You need a user ID to identify your key; the software constructs the user ID from the Real Name, Comment and Email Address in this form:

Real name: [Enter Your Full Name]
E-mail address: [Enter Your Email Address]
Comment: [--leave blank--]
You selected this USER-ID:
    "YOUR FULL NAME <YOUR EMAIL ADDRESS>"

Change (N)ame, (C)omment, (E)-mail or (O)kay/(Q)uit? o

gpg: key 2C8134H596Z1799A marked as ultimately trusted
gpg: revocation certificate stored as '~/.gnupg/openpgp-revocs.d/HC98C54765D247692510Z004FE64CDD9A468E7AB.rev'
public and secret key created and signed.

حالا دستور زیر رو اجرا کنید تا لیستی از کلیدهای GPG تون رو ببینید:

$ gpg --list-secret-keys --keyid-format LONG

---------------- output ----------------
sec   rsa4096/FE64CDD9A468E7AB 2020-04-09 [SC]  
uid                 [ultimate] YOUR FULL NAME <YOUR EMAIL>  
ssb   rsa4096/53119D71AF1DD7FB 2020-04-09 [E]

توی این خروجی sec مخفف ‘secret key’ و ssb مخفف ‘secret sub key’ هست و عبارت بعد از rsa4096/ آی‌دی کلیدهای ما هست. توجه کنید که آی‌دی کلید خصوصی و عمومی فرقی با هم ندارن و یکی هستن. حالا کافیه آی‌دی رو کپی کنید و دستور زیر رو اجرا کنید:

$ gpg --armor --export FE64CDD9A468E7AB

خروجی‌ای که خواهید داشت همون کلید GPG عمومی شماست. کافیه اون خروجی رو کپی کنید و دوباره به تنظیمات گیت‌هاب و قسمت SSH and GPG Keys برگردید و این بار از گزینه‌ی New GPG Key استفاده کنید و کلید عمومی‌تون رو توش Paste کنید. حالا از این به بعد می‌تونید توی کامپیوتری که حاوی اون کلید هست، با دستور زیر کامیت‌های امضا شده بزنید:

$ git commit --gpg-sign=FE64CDD9A468E7AB

البته شاید همچین دستوری راهکار ساده‌ای نیست و احتمالا دل‌تون نمی‌خواد هر دفعه موقع کامیت کردن آی‌دی کلید GPGتون رو بزنید. با استفاده از دستور زیر می‌تونید آی‌دی کلید GPGتون رو تو git ذخیره کنید:

$ git config --global user.signingkey FE64CDD9A468E7AB
$ git config --global commit.gpgsign true

و از این به بعد همه‌ی کامیت‌هایی که از این کامپیوتر می‌فرستین با کلید GPGتون امضا خواهد شد و کاربرا می‌تونن مطمئن باشن که اون کامیت از طرف شما بوده.

تمام هدف این نوشته همین بود ((( : امیدوارم بدرتون خورده باشه!


سورس این پست رو می‌تونین از اینجا ببینین :)