輕鬆部署 Laravel 應用 | 《12. 安全加固 - 使用金鑰登入》

Wi1dcard發表於2019-03-22

:clap: 本系列持續更新中,歡迎關注:https://github.com/wi1dcard/laravel-deploy...

由於課程上下文關聯比較緊密,在開始前請先閱讀 本文

你的支援是我寫作的動力;關注我的客官們,請在右上角點個贊,將會讓文章在首頁展示,幫助更多人。

感謝 :clap: !

上一小節中,我們為伺服器建立了新使用者,並禁止了根使用者直接登入。本節將進一步完善安全加固,同時避免每次登入都需要輸入密碼的麻煩。

所謂金鑰登入,即 在本地生成金鑰對(一套公鑰 + 私鑰稱為「金鑰對」)後,將公鑰 傳輸到伺服器中;隨後進行 SSH 登入時,本地使用私鑰加密一字串,若服務端使用公鑰解密成功,則認為客戶端可信。

提示:關於非對稱加密和 RSA 相關知識,可參見 本文

在本地生成金鑰對

在本地執行以下命令:

$ ssh-keygen -t rsa -C "wi1dcard.cn@gmail.com"

其中,-t rsa 表示金鑰型別為 RSA,wi1dcard.cn@gmail.com 請替換為自己的郵箱地址。

接下來你將會收到連續幾條詢問提示:

Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):

意為:使用哪個檔案儲存私鑰(預設為 /root/.ssh/id_rsa)?不同系統、不同使用者的預設值均不同,通常情況下為 ~/.ssh/id_rsa~ 是 Bash 中的特殊字元之一,表示使用者根目錄)。

直接按下Enter鍵,使用預設值即可。

Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):

意為:私鑰密碼想設定成什麼?我們暫時無需加密,回車繼續即可。

Enter same passphrase again:

意為:請再次輸入密碼確認;依舊回車繼續即可。

稍等片刻,金鑰對就生成好了:

Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:TwgRw0ZIHo1UqzGgLrAuKkjZaLxdkmcHRxbAuyDNiow wi1dcard.cn@gmail.com
The key's randomart image is:
...

以上提示我們只需關注前兩行:

  • /root/.ssh/id_rsa 是私鑰路徑。
  • /root/.ssh/id_rsa.pub 是公鑰路徑。

你可以使用 cat 命令來檢視它們,例如:

$ cat /root/.ssh/id_rsa.pub

你將會看到公鑰文字展示在命令列中。

cat 命令與 PHP 的 file_get_contents + echo 作用類似 —— 讀取檔案並完整地輸出。

傳輸公鑰到伺服器

接下來,我們需要將公鑰傳輸到伺服器上。十分簡單,一行命令即可:

$ ssh-copy-id deployer@laravel-deployment.wi1dcard.cn

請將 laravel-deployment.wi1dcard.cn 替換為你的伺服器公網 IP 或域名,並使用新使用者(deployer),而非根使用者。

在這期間,需要你輸入上一節設定的密碼:

/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/Users/jootu/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
deployer@laravel-deployment.wi1dcard.cn's password: <輸入密碼>

恭喜,傳輸成功:

Number of key(s) added:        1

Now try logging into the machine, with:   "ssh 'deployer@laravel-deployment.wi1dcard.cn'"
and check to make sure that only the key(s) you wanted were added.

閱讀以上輸出,已提示我們可以使用 ssh 'deployer@laravel-deployment.wi1dcard.cn' 登入到伺服器,親自試試看吧。

禁止使用密碼登入

成功地「免密碼」登入伺服器後,我們需要確保密碼登入被禁用。與上一節類似,修改 SSH 服務配置檔案 /etc/ssh/sshd_config

$ su root # 切換至 root 使用者身份
$ sed -i -E 's/#?\s*(PermitEmptyPasswords)(.*)$/\1 no/' /etc/ssh/sshd_config
$ sed -i -E 's/#?\s*(PasswordAuthentication)(.*)$/\1 no/' /etc/ssh/sshd_config

注意:再次建議使用 Vim 等編輯器手動編輯。

以上命令將會變更兩個配置項,它們的值均被修改為 no,也就是不允許。

  • PermitEmptyPasswords no 用於禁止空密碼登入。若建立使用者時未使用 passwd 設定密碼,且此處為 yes 將會非常危險;因此,無論是否使用金鑰登入,強烈建議將該配置項設定為 no
  • PasswordAuthentication no 用於禁止密碼授權(即密碼登入)。

安全警告

務必務必!確保你的私鑰無法被除自己之外的任何人讀取,否則將會洩露 幾乎所有 基於 SSH 協議的通訊許可權,包括但不限於 Git Push、SSH 登入伺服器等。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

Former WinForm and PHP Engineer. Now focus on #DevSecOps and global networking.

相關文章