幾乎每台新 VPS 的開局都一樣:用 root 登入,裝幾樣東西,一個月後還在用 root。這樣一直沒事,直到某天貼上的指令碼刪錯了目錄。設定一個帶 sudo 的普通使用者只要五分鐘,而順序比指令更重要——順序錯了,您就把自己鎖在門外了。
下面是適用於 Ubuntu 22.04/24.04 和 Debian 12 的安全步驟。
1. 建立使用者
以 root 身分:
adduser deploy
usermod -aG sudo deploy
adduser 會要您設密碼,並詢問一些可選資訊(直接按回車跳過即可)。請設一個像樣的密碼:用 sudo 時要輸入它。在精簡版 Debian 映像上,如果沒有這個指令,先執行 apt install -y sudo。
2. 給它您的 SSH 金鑰
最簡單的辦法是複製 root 的授權金鑰,並保持正確的屬主:
rsync --archive --chown=deploy:deploy /root/.ssh /home/deploy
如果您更想手動操作:
mkdir -p /home/deploy/.ssh
cp /root/.ssh/authorized_keys /home/deploy/.ssh/
chown -R deploy:deploy /home/deploy/.ssh
chmod 700 /home/deploy/.ssh
chmod 600 /home/deploy/.ssh/authorized_keys
權限不對是金鑰登入悄無聲息失敗的經典原因。SSH 會忽略其他使用者可寫的 authorized_keys。
3. 改任何東西之前先測試
保持 root 工作階段開著。在一個新終端裡:
ssh -p 22 deploy@203.0.113.10
sudo whoami
用您自己的 IP 和埠——NAT 方案的話就是控制面板裡的專屬 SSH 埠。如果 sudo whoami 輸出 root,就一切正常。如果登入失敗,您還有 root 視窗可以修。
4. 關閉 root 登入
現在把門關上。不要編輯主設定檔案,而是建立一個小的 drop-in 檔案:
cat > /etc/ssh/sshd_config.d/10-hardening.conf <<'EOF'
PermitRootLogin no
PasswordAuthentication no
EOF
sshd -t && systemctl reload ssh
sshd -t 會先檢查語法。設定寫壞了再 reload,就是很多人最後只能靠控制台的原因。PasswordAuthentication no 只有在新使用者的金鑰登入能用時才有意義——而您剛剛已經測過了。
再開一個終端,確認 root 被拒絕、deploy 仍能登入。然後再關掉舊的 root 工作階段。
5. 可選:給自動化用的免密碼 sudo
如果部署指令碼需要不經詢問就使用 sudo,只給它恰好需要的權限,不要多給:
visudo -f /etc/sudoers.d/deploy
deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart myapp
說實話,NOPASSWD: ALL 很誘人,但這意味著金鑰一旦被盜就等於 root。把它限制在自動化實際執行的指令上。
出問題了怎麼辦
控制面板裡的網頁控制台既不依賴 SSH,也不依賴防火牆。從那裡登入,修好 /etc/ssh/sshd_config.d/ 裡的檔案,reload,搞定。完整的恢復流程我們寫在了如何重新進入被鎖的 VPS裡。
接下來做什麼
- 徹底改成僅金鑰登入:SSH 金鑰認證。
- 減少暴力破解的噪音:fail2ban。
- 用新 VPS 安全清單把剩下的基礎工作做完。
評論
目前還沒有評論。歡迎成為第一位。