همانطور که می دانید در دنیای امروز توسعه وب git و GitHub بخشی جدا نشدنی هستند و هر برنامه ای از هر نوع که باشد حداقل با گیت مدیریت خواهد شد. مسئله اصلی اینجاست که گیت هیچ سیستم احراز هویتی ندارد بلکه بر اساس ایمیل کار می کند بنابراین می توانید از ایمیل دیگران برای commit کردن کدهای خود استفاده کنید.
اگر تیتر اخبار تکنولوژی را دنبال کرده باشید در سال گذشته چندین حمله جعل هویت در گیت انجام شده است و به همین خاطر امضا کردن commit ها ارزش زیادی دارد. ما در این مقاله درباره امضا کردن commit ها و نحوه انجام آن صحبت خواهیم کرد.
قابل توجه کاربران ویندوز: برای همراهی با این مقاله باید ترمینال خاصی به نام git for windows را نصب کنید. این ترمینال کار اجرای دستورات git را بسیار آسان تر می کند. هر جایی از این مقاله که عبارت ترمینال را دیدید، بدانید که منظور من git for windows است.
برای امضا کردن commit ها ابتدا باید در رابطه با نحوه پیکربندی در گیت صحبت کنیم. در گیت سه سطح مختلف برای در نظر گرفتن تنظیمات پیکربندی داریم:
زمانی که برای اولین بار گیت را نصب می کنید باید آن را پیکربندی کنید، یعنی آدرس ایمیل و نامتان را به آن بدهید. از آنجایی که سطح global رایج ترین سطح برای اعمال پیکربندی در گیت است من از آن استفاده می کنم.
شما برای پیکربندی اولیه گیت باید دستورات زیر را به ترتیب در ترمینال اجرا کنید:
git config --global user.name "Your name here" git config --global user.email "your_email@example.com"
دستور اول نام شما را مشخص می کند بنابراین باید به جای Your name here نام خودتان را تایپ کنید. دستور دوم نیز ایمیل شما را مشخص می کند و باید به جای your_email@example.com ایمیل واقعی خودتان را وارد کنید.
من شخصا علاوه بر دستورات بالا، دو دستور زیر را نیز اجرا می کنم:
git config --global color.ui true git config --global core.editor code
دستور اول می گوید که در هنگام نمایش نتایج در ترمینال از رنگ استفاده کند تا ظاهر خروجی زیباتر شود. دستور دوم مشخص می کند که ویرایشگر ما به صورت پیش فرض چه ویرایشگری باشد. من code را انتخاب کرده ام که همان Visual Studio Code است. طبیعتا شما می توانید هر ویرایشگر دیگری مانند Atom یا Vim یا Nano و غیره را انتخاب کنید.
حالا برای نمایش تنظیمات پیکربندی خود می توانید فایل متنی gifconfig را باز کنید. این فایل در سیستم های لینوکس در مسیر Home (آدرس gitconfig./~) قرار دارد اما در ویندوز در مسیر C:\ProgramData\Git\config جای گرفته است. محتویات این فایل برای من به شکل زیر است:
[user] email = *************@*****.*** signingkey = ************ name = Amir Zouerami [diff] tool = default-difftool [difftool "default-difftool"] cmd = code --wait --diff $LOCAL $REMOTE [commit] gpgsign = true [core] editor = code --wait [color] ui = true
من ایمیل و signingkey را مخفی کرده ام چرا که خصوصی هستند و نباید در اختیار دیگران قرار بگیرند اما می توانید دیگر تنظیمات من را مشاهده کنید. من چند گزینه اضافه مانند difftool را نیز دارم که اگر با گیت آشنا باشید می دانید برای چه هستند. مثلا اگر کلید دیجیتال نداشته باشید قسمت signingkey برای شما وجود ندارد اما جای نگرانی نیست ما در این مقاله این موضوع را بررسی می کنیم.
در ضمن توجه داشته باشید که این فایل یک فایل متنی ساده است بنابراین هیچ سیستم احراز هویتی وجود ندارد و شما می توانید هر ایمیلی را که می خواهید وارد کنید!
commit signature verification یا تایید امضای commit قابلیت محبوبی در گیت هاب است که با استفاده از یک کلید دیجیتال commit های شما را امضا می کند بنابراین زمانی که کدهایتان را در گیت هاب قرار می دهید یک علامت verified (به معنی «تایید شده») را در کنار آن commit مشاهده می کنید.
بدین شکل افراد دیگر می توانند مطمئن شوند که این کدها حتما توسط شخص شما نوشته شده است و کسی با استفاده از ایمیل شما هویت خود را جعل نکرده است. چطور؟ به دلیل اینکه هیچکس به جز شما و گیت هاب این کلید دیجیتال را ندارد بنابراین هر commit ای که با این کلید امضا شود قطعا متعلق به شما است.
اگر گیت هاب نتواند با کلیدی که از شما دریافت کرده است یک commit را تایید کند عبارت unverified (به معنی «تایید نشده») در کنار آن commit نمایش داده می شود اما اگر اصلا کلیدی به گیت هاب نداده باشید، هیچ وضعیتی برای آن commit نمایش داده نمی شود. این رفتار امن نیست بنابراین گیت هاب جدیدا قابلیتی به نام Vigilant mode را معرفی کرده است که اگر آن را فعال کنید وضعیت تمام commit های شما نمایش داده می شوند، چه کلیدی به گیت هاب داده باشید و چه نداده باشید.
برای فعال کردن حالت vigilant mode روی آیکون پروفایل خود در گیت هاب کلیک کرده و گزینه settings را انتخاب کنید:
در صفحه تنظیمات به بخش SSH and GPG keys رفته و از آنجا گزینه vigilant mode را فعال کنید:
حالا که این حالت را فعال کرده ایم باید یک کلید دیجیتال ایجاد کرده و commit هایمان را با آن امضا کنیم.
گیت هاب از کلیدهای GPG برای امضا کردن commit ها استفاده می کند. GPG مخفف GNU Privacy Guard (محافظ امنیت گنو) و نام یک نرم افزار رمزنگاری است. در واقع GPG یک نوع الگوریتم خاص خودش را برای پیاده سازی کلیدهای دیجیتال دارد (الگوریتم های دیگری نیز وجود دارند اما همانطور که گفتم گیت هاب از GPG استفاده می کند).
قابل توجه کاربران ویندوز: ویندوز به صورت پیش فرض برنامه GPG را ندارد بنابراین باید ابتدا به آدرس www.gnupg.org/download رفته و آن را دانلود و نصب کنید. در این صفحه گزینه ای به نام Gpg4win وجود دارد که با کلیک روی آن به صفحه دانلود GPG برای ویندوز منتقل می شوید. پس از نصب، آدرس نصب آن (معمولا C:\Program Files\GnuPG) را به PATH سیستم خود اضافه کنید تا بتوانید آن را در ترمینال اجرا کنید. حالا یک ترمینال جدید باز کرده و دستور gpg --version را در آن اجرا کنید. اگر خطا دریافت کردید یعنی GPG را به درستی به PATH ویندوز اضافه نکرده اید اما اگر نتیجه زیر را دیدید یعنی همه چیز با موفقیت نصب شده است:
gpg (GnuPG) 2.2.20 libgcrypt 1.8.7 Copyright (C) 2020 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Home: /home/amir/.gnupg Supported algorithms: Pubkey: RSA, ELG, DSA, ECDH, ECDSA, EDDSA Cipher: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH, CAMELLIA128, CAMELLIA192, CAMELLIA256 Hash: SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224 Compression: Uncompressed, ZIP, ZLIB, BZIP2
کاربران لینوکس GPG را از قبل به صورت نصب شده دارند بنابراین نیازی به انجام کار خاصی نیست.
قبل از اینکه بخواهیم یک کلید GPG تولید کنیم بهتر است وجود چنین کلیدی را در سیستم خودمان بررسی کنیم تا از قبل آن را نساخته باشیم. برای انجام این کار دستور زیر را در ترمینال خود اجرا کنید:
gpg --list-secret-keys --keyid-format=long
اگر از قبل کلید GPG داشته باشید، با اجرای دستور بالا آن کلید به شما نشان داده می شود اما اگر کلیدی نداشته باشید هیچ چیزی نمایش داده نمی شود و یا اینکه پیامی مبنی بر عدم وجود کلید GPG دریافت می کنید. اگر کلید GPG دارید می توانید مستقیما به بخش «اضافه کردن کلید GPG به گیت هاب» بروید اما اگر کلید GPG ندارید و یا اینکه می خواهید یک کلید GPG جدید تولید کنید به بخش «تولید کلید GPG» مراجعه کنید.
قبل از آنکه بخواهید کلید GPG را تولید کنید باید مطمئن شوید که ایمیل شما در گیت هاب تایید شده (verified) است چرا که بدون ایمیل تایید شده اجازه امضا کردن commit ها را ندارید. برای انجام این کار روی پروفایل خود کلیک کرده و به بخش settings بروید. در آن صفحه به بخش emails رفته و وضعیت ایمیل خود را چک کنید:
اگر ایمیل شما مانند ایمیل تصویر بالا تایید نشده بود باید روی دکمه Resend verification email کلیک کرده و سپس به ایمیل خود بروید و روی لینک ارسال شده کلیک کنید. با این کار ایمیل شما تایید می شود.
قابلیت جالبی در گیت هاب وجود دارد که باید آن را در این بخش توضیح بدهم. همانطور که در ابتدای این مقاله دیدید، برای پیکربندی گیت نیاز به یک ایمیل دارید و طبیعتا زمانی که commit انجام می دهید، این ایمیل در آن commit ثبت می شود و دیگران می توانند به راحتی آن را ببینند. اگر دوست ندارید دیگران ایمیل شما را ببینند، در همین صفحه تنظیمات Emails، یک ایمیل ناشناس از سمت گیت هاب برایتان تولید می شود که می توانید از آن استفاده کنید:
شما می توانید هنگام پیکربندی گیت از این ایمیل استفاده کنید:
git config --global user.email "********+Amir-*****@users.noreply.github.com"
با انجام این کار فقط گیت هاب ایمیل اصلی شما را دارد و commit ها با این ایمیل ناشناس ثبت می شوند.
گیت هاب از الگوریتم های زیر برای تولید کلید GPG پشتیبانی می کند:
اگر کلید شما با الگوریتمی غیر از یکی از الگوریتم های بالا تولید شده باشد، گیت هاب درخواست شما را در خواهد کرد.
اگر از نسخه 2.1.17 یا نسخه های جدید تر GPG استفاده می کنید باید دستور زیر را در ترمینال اجرا کنید:
gpg --full-generate-key
با اجرای این دستور چند سوال از شما پرسیده می شود که بر اساس نسخه GPG نصب شده در سیستم شما ممکن است کمی تفاوت داشته باشند (مثلا در جمله بندی متفاوت باشند) اما کلیت آن ها عینا یکی است. اولین سوال به شکل زیر است:
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?
یعنی الگوریتم تولید کلید GPG را انتخاب کنید. از آنجایی که کلیدهای RSA محبوب ترین و سازگار ترین کلیدها هستند من گزینه اول که گزینه پیش فرض هم می باشد را انتخاب می کنم. در مرحله بعدی از شما خواسته می شود طوط کلید RSA را مشخص کنید:
RSA keys may be between 1024 and 4096 bits long. What keysize do you want? (2048)
کلیدهای RSA اندازه ای بین 1024 تا 4096 بیت دارند و مقدار پیش فرض 2048 می باشد. گیت هاب هیچ کلیدی زیر 4096 بیت را قبول نمی کند بنابراین عدد 4096 را تایپ کرده و enter بزنید. در مرحله بعدی از شما پرسیده می شود طول عمر این کلید باید چقدر باشد:
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)
طبیعتا ما نمی خواهیم کلیدمان منقضی شود بنابراین عدد صفر را تایپ کرده و enter می زنیم. عدد صفر یعنی کلید منقضی نشود. ممکن است در یکی از این بخش ها از شما پرسیده شود که یک passphrase (رمز عبور) را انتخاب نمایید. در این حالت سعی کنید یک رمز طولانی و مناسب را انتخاب کنید.
در نهایت سوال آخر از شما پرسیده می شود:
GnuPG needs to construct a user ID to identify your key. Real name: Best User Email address: bestuser@example.com Comment: Best Company You selected this USER-ID: "Best User (Best Company) <bestuser@example.com>" Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit?
همانطور که می بینید من گزینه های این سوال را به صورت نمایشی پر کرده ام. بیایید این گزینه ها را بررسی کنیم:
در نهایت حرف O را تایپ کرده و enter بزنید تا این اطلاعات تایید شود. زمانی که این کار را انجام بدهید نتیجه ای شبیه به نتیجه زیر را در ترمینال می بینید که یعنی کلید شما تولید شده است:
اگر از نسخه های قدیمی تر GPG استفاده می کنید باید به جای دستور بالا، دستور زیر را اجرا کنید:
gpg --default-new-key-algo rsa4096 --gen-key
نکته: برای بررسی نسخه GPG دستور gpg --version را در ترمینال اجرا کنید.
پس از تولید کلید GPG با اجرای دستور زیر می توانید آن را مشاهده کنید:
gpg --list-secret-keys --keyid-format=long
خروجی این دستور چیزی شبیه به اطلاعات زیر است:
/Users/hubot/.gnupg/secring.gpg ------------------------------------ sec 4096R/3AA5C34371567BD2 2022-03-10 [expires: 2017-03-10] uid Hubot ssb 4096R/42B317FD4BA89E7A 2022-03-10
از این بخش ID کلید GPG را کپی کنید. ID کلید بالا همان 3AA5C34371567BD2 است (در بخش sec). حالا این id را در دستور زیر استفاده می کنیم:
gpg --armor --export 3AA5C34371567BD2
با اجرای این دستور، کل کلید RSA برایتان چاپ می شود که ساختار زیر را دارد:
-----BEGIN PGP PUBLIC KEY BLOCK----- // چند صد کاراکتر -----END PGP PUBLIC KEY BLOCK-----
این کلید GPG شما است.
برای اضافه کردن این کلید به گیت هاب ابتدا از بخش تنظیمات (setting) روی گزینه SSH and GPG keys کلیک کنید:
سپس در صفحه باز شده روی گزینه New GPG key کلیک نمایید:
و در نهایت کل کلید خود (به همراه قسمت های -----BEGIN PGP PUBLIC KEY BLOCK----- و-----END PGP PUBLIC KEY BLOCK-----) را کپی کرده و درون کادر نمایش داده شده قرار بدهید. حالا می توانید روی گزینه Add GPG key کلیک کنید تا این کلید به حسابتان اضافه شود.
اگر یادتان باشد گفتم که برای مشاهده ID کلیدهایتان باید دستور زیر را اجرا کنید:
gpg --list-secret-keys --keyid-format=long
خروجی این دستور چیزی شبیه به خروجی زیر خواهد بود:
/Users/hubot/.gnupg/secring.gpg ------------------------------------ sec 4096R/3AA5C34371567BD2 2022-03-10 [expires: 2017-03-10] uid Hubot ssb 4096R/42B317FD4BA89E7A 2022-03-10
با این حساب ID کلید ما 3AA5C34371567BD2 می باشد که در نتیجه بالا نمایش داده شده است. ما این کلید را با دستور زیر به گیت اضافه می کنیم:
git config --global user.signingkey 3AA5C34371567BD2
اگر از کاربران لینوکس هستید، دستور زیر را نیز اجرا نمایید:
if [ -r ~/.bash_profile ]; then echo 'export GPG_TTY=$(tty)' >> ~/.bash_profile; \ else echo 'export GPG_TTY=$(tty)' >> ~/.profile; fi
این دستور کلید را به bash_profile شما اضافه می کند.
از این به بعد برای امضا کردن commit ها باید پارامتر S- را نیز به دستور commit اضافه کنید. مثلا:
git commit -S -m your commit message
اما اگر می خواهید امضا کردن به صورت خودکار برای تمام commit ها اتفاق بیفتد (که روش پیشنهادی است) دستور زیر را در ترمینال خود اجرا کنید:
git config --global commit.gpgsign true
امضا کردن tag ها در گیت نیز به همین شکل است:
git tag -s mytag
امیدوارم این مقاله به امنیت پروژه های شما کمک کرده باشد.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.