Why? Security!
GitHub 是知名的版本控制平台,也是開發者們的大寶庫,可以在上面找到各式各樣的開源專案,學習應用兩相宜。當然也有很多社群甚至公司也採用 GitHub 進行專案開發,但除了基本的 Git 操作,其中的安全議題是常常為人所忽略的。
我也是在聽完公司同仁分享才開始重視這個議題,於是終於啟用 GPG key 簽署 commit,也啟動 2FA 的驗證。
Enable 2FA
GitHub 的登入就如一般的服務,只要輸入帳密即可操作該帳號的專案,然而一般人總懶的時時更換密碼,也因此容易成為安全漏洞,若取得帳戶便能肆意修改專案。因此啟動 2FA 兩階段驗證便是一道重要的防火牆,然而這也只是最基本的第一步。
Enable SSH key
透過 SSH key 可以有效的管理並限制哪些授權裝置能使用自己的帳號發布、修改、刪除專案等操作。
Enable GPG key
有了上述兩個設定,為什麼需要 GPG key 進行 commit 簽署呢?原因也很簡單,就是要確保此 commit 真為本人所提交,讓其他使用者確信這項修改或 release 來自可信賴的源頭。在同事的簡報中,他特別點出若是專案中有牽涉到與加密相關的操作就更應該使用 GPG key 簽署。簽署後的 commit 在 Github 上會顯示 Verified,如附圖:
接下來就引導讀者們如何使用 GPG key 簽署 commit! 我的環境是 Ubuntu 16.04 & Ubuntu 18.04
依照以下步驟:
- 安裝 gnupg2
- 產生 GPG key
- 登錄 GPG key
- 本機端的 Git 設定
- 簽署 commit
Install gnupg2
gnupg 是用來生產 GPG key 的套件。在 Ubuntu 16.04 中已預設裝有 gnupg 1.4.20,但 GitHub 的官方教學建議我們使用 v2 以上,因此需要安裝 gnupg2,版本為 v2.1.11 :
sudo apt install gnupg2
Ubuntu 18.04 的預設 gpg 已是 v2 以上,可以跳過這步驟
Generate a GPG key
Ubuntu 16.04:
$ gpg2 --full-gen-key
Ubuntu 18.04:
$ gpg --full-generate-key
- 接著會跳出 cli prompt 詢問要產生哪種金鑰,可以直接按 Enter 鍵選擇 RSA and RSA (default)
- 金鑰長度,必須要是 4096 bits 以上,因此輸入 4096
- 選擇金鑰的有效期限,輸入 Enter 以選擇 key does not expire
- 確認選擇,輸入 y
- 輸入真實姓名
- 輸入 email,此 email 需在 GitHub 網站上驗證過
- 輸入 comment,可以留空,直接按 Enter 進行下一步
- 確認已輸入的個人資訊,輸入 O 以確認
- 輸入 secure passphrase,進行簽署時需要輸入這組密碼
- cli prompt 會請使用者隨意按鍵會移動滑鼠以幫助取得 entropy,這是產生隨機數的重要元件。可能會遇到電腦在這關卡太久,因為產生的 entropy 太少,可以透過指令查看 entropy 的數目:
$ watch -n1 cat /proc/sys/kernel/random/entropy_avail
並透過安裝 rng-tools 加速亂數產生。我一裝完也就產生完了 XD
$ sudo apt install rng-tools
- 簽章測試,測試是否能用以產生的 GPG key 簽名
$ echo "test" | gpg --clearsign -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA512 test -----BEGIN PGP SIGNATURE----- .... -----END PGP SIGNATURE-----
若沒辦法進行簽章可能要先升級套件:
$ sudo apt upgrade gpg
Register GPG key on GitHub
- 先透過指令查看金鑰資訊:
$ gpg --list-secret-keys --keyid-format LONG /home/userID/.gnupg/pubring.kbx ------------------------------------ sec rsa4096/3AA5C34371567BD2 2016-03-10 [SC] uid Hubot ssb rsa4096/42B317FD4BA89E7A 2016-03-10
- 複製 keyID, 上面的例子 ID 為 3AA5C34371567BD2:
$ gpg --armor --export 3AA5C34371567BD2 # Prints the GPG key ID, in ASCII armor format
- 產生 key block,整段複製(包含
-----BEGIN PGP PUBLIC KEY BLOCK-----
與-----END PGP PUBLIC KEY BLOCK-----
) - 進入 Github 的頁面 settings -> SSh and GPG keys
- 點選 New GPG key,貼上 3. 所複製的 key block
- 輸入 GitHub 密碼確認
- 完成!!
GPG key settings first
- 之後提交 commit 時使用某把 key 進行簽署:
$ git config --global user.signingkey <keyID> $ git config --global commit.gpgsign true // optional, 每次 commit 都要簽名 $ git config --global gpg.program gpg2 // Ubuntu 16.04 only, 使用 gpg2
Sign your commit!
一行指令,非常簡單! -S 就是簽名 commit
$ git commit -S -m "success!" $ git log --show-signature -1 // 查看剛簽章的 commit