輕鬆部署 Laravel 應用 | 《11. 安全加固 - 避免使用根使用者》

Wi1dcard發表於2019-03-18

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

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

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

感謝 :clap: !

還記得最早我們提到的「暫時 作為 root(根)使用者登入」嗎。在本節,我將帶領大家建立新使用者。

為何這麼做?

嚴格地說,並不是不允許使用根使用者;而是 禁止直接作為根使用者登入到伺服器。原因如下:

  • 避免隨手 rm -rf / 或是 rm -rf . / 之類的悲劇。
  • 更加安全地使用 Composer,儘可能減少擴充套件包作者或中間人劫持插入的惡意程式碼在依賴安裝或更新時被執行對伺服器造成的影響。
  • 更加安全地登入伺服器,即使金鑰洩露,不法分子(?)也不能直接作為根使用者登入,無法直接取得管理許可權。
  • 後續課程中,更加安全地使用 Deployer 和 Ansible。
  • ...

可以看出,幾乎所有的因素都與 安全 直接掛鉤。

建立新使用者

在建立使用者之前,請先新建使用者組,例如 deployment

$ addgroup deployment

隨後建立新使用者,例如 deployer

$ useradd -d /home/deployer -s /bin/bash -m deployer

其中,/home/deployer 為使用者家目錄(也就是登入到伺服器後預設所在的當前目錄),/bin/bash 為使用者的預設 Shell 程式。

接著將使用者新增至使用者組:

$ usermod -a -G deployment -G www-data deployer

注意:此處使用了兩次 -G 引數,將該使用者分別新增至 deployment 和 www-data 使用者組。

最後,為新使用者設定密碼:

$ passwd deployer

根據提示輸入密碼並確認:

Enter new UNIX password: <輸入密碼>
Retype new UNIX password: <再次輸入密碼>

好了,新使用者配置完成。你可以通過以下命令切換至 deployer 使用者:

$ su deployer

同理,也可切換為其它使用者,例如 root

$ su root

測試效果

斷開 SSH 連線,在本地使用以下命令作為 deployer 使用者登入到伺服器:

$ ssh deployer@laravel-deployment.wi1dcard.cn

如你所見,將原先的 root 替換為新使用者名稱即可。隨後,輸入上文中設定的密碼:

deployer@laravel-deployment.wi1dcard.cn's password: <輸入密碼>

若能夠成功登入,則可以繼續下一步了。

注意:務必確保登入成功,否則下一步完成後你將無法登入到伺服器!

禁止根使用者 SSH 登入

以上我們已經建立了新使用者,接下來我們需要禁止根使用者直接通過 SSH 登入到伺服器。若需要管理員許可權,可登入後通過 su 命令切換至 root 執行。

首先,請執行以下命令:

$ sed -i -E 's/#?\s*(PermitRootLogin)(.*)$/\1 no/' /etc/ssh/sshd_config

其中:

  • sed 是一款十分流行的流文字編輯器,具備查詢、替換等功能;與先前提到的 grep 類似,但相比之下 sed 更加強大。該例子中,我們使用的便是它的 替換 功能。
  • /etc/ssh/sshd_config 是被編輯的檔案,也就是 SSH 的配置。
  • 's/#?\s*(PermitRootLogin)(.*)$/\1 no/' 是最關鍵的部分,它是一個 sed 表示式,表示將 PermitRootLogin 配置項設定為 no。此處不再詳細展開,有興趣可自行搜尋相關語法。
  • -i 表示直接替換檔案內容,而不是將替換後的結果輸出。
  • -E 表示使用擴充套件版正則語法,支援更多規則。

以上引數的細節可不必深究,只需明白它的作用即可。

你也可以手動編輯 /etc/ssh/sshd_config 檔案,搜尋 PermitRootLogin 這一關鍵字,將 整行 修改為:

PermitRootLogin no

注意:務必確保整行修改,首尾無多餘字元(例如註釋符 #)。

提示:雖然課程內儘可能地假設你不會使用 Vim / Emacs 等文字編輯器,但還是強烈建議學習一下它們,哪怕簡單地瞭解一部分用法也會帶來極高的效率提升。

隨後,重啟 SSH 服務即可:

$ service ssh restart

再次測試效果

在本地執行原先的登入命令:

$ ssh root@laravel-deployment.wi1dcard.cn

輸入密碼後將會報錯:

root@laravel-deployment.wi1dcard.cn's password: <輸入密碼>
Permission denied, please try again.

意為許可權被拒絕,請再試一次。當然,我們都知道,重試也不會起作用的。

我感謝自己平凡,敢愛敢恨沒負擔。
我感謝自己不凡,可愛可恨都包攬。

相關文章