GitHub - Sign Commits With Your GPG Key

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

依照以下步驟:

  1. 安裝 gnupg2
  2. 產生 GPG key
  3. 登錄 GPG key
  4. 本機端的 Git 設定
  5. 簽署 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
  1. 接著會跳出 cli prompt 詢問要產生哪種金鑰,可以直接按 Enter 鍵選擇 RSA and RSA (default)
  2. 金鑰長度,必須要是 4096 bits 以上,因此輸入 4096
  3. 選擇金鑰的有效期限,輸入 Enter 以選擇 key does not expire 
  4. 確認選擇,輸入 y
  5. 輸入真實姓名
  6. 輸入 email,此 email 需在 GitHub 網站上驗證過
  7. 輸入 comment,可以留空,直接按 Enter 進行下一步
  8. 確認已輸入的個人資訊,輸入 O 以確認
  9. 輸入 secure passphrase,進行簽署時需要輸入這組密碼
  10. cli prompt 會請使用者隨意按鍵會移動滑鼠以幫助取得 entropy,這是產生隨機數的重要元件。可能會遇到電腦在這關卡太久,因為產生的 entropy 太少,可以透過指令查看 entropy 的數目:
$ watch -n1 cat /proc/sys/kernel/random/entropy_avail

並透過安裝 rng-tools 加速亂數產生。我一裝完也就產生完了 XD

$ sudo apt install rng-tools
  1. 簽章測試,測試是否能用以產生的 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

  1. 先透過指令查看金鑰資訊:
$ 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
  1. 複製 keyID, 上面的例子 ID 為 3AA5C34371567BD2
$ gpg --armor --export 3AA5C34371567BD2
# Prints the GPG key ID, in ASCII armor format
  1. 產生 key block,整段複製(包含 -----BEGIN PGP PUBLIC KEY BLOCK----- -----END PGP PUBLIC KEY BLOCK-----)
  2. 進入 Github 的頁面 settings -> SSh and GPG keys
  3. 點選 New GPG key,貼上 3. 所複製的 key block
  4. 輸入 GitHub 密碼確認
  5. 完成!!

GPG key settings first

  1. 之後提交 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

References: