這篇文章會記錄著剛拿到全新 Ubuntu VPS 後該做的一些簡易安全相關設定:
- 登入伺服器與建立自訂帳號
- 開啟 Ubuntu 自動安全性更新
- 改變 SSH Port
- 關閉 root 的 SSH 權限、允許 SSH 登入帳號
- 設定 SSH 免密碼登入(SSH Key)
- 關閉 SSH 密碼登入功能
- 安裝 UFW 防火牆
- 入侵檢測 Intrusion Detection
本文有大量參考 Setup Ubuntu VPS – First Few Steps(Author: Prashanth Krishnamurthy)的文章。
1. 登入伺服器與建立自訂帳號
為了避免駭客直接使用 root 連線進來(不論他用了什麼方法獲得密碼或是 Key),我們應該限制 root 使用 SSH。不過在這之前,需要先用 root 創立一個你自己使用的帳號。
使用 root 和預設密碼登入你的伺服器。
ssh root@<server_ip>
改變你的 root 密碼。
passwd
新增一個帳號。以後使用這個帳號登入你的伺服器。
adduser <your_user_account>
允許這個帳號使用 sudo
權限。
usermod -aG sudo <your_user_account>
2. 開啟 Ubuntu 自動安全性更新
通常自動更新可能會增加網站運作上的不確定性,所以有些人會選擇關閉。但這邊會開啟最基本的安全性更新,有想要開啟的人可以參考下列步驟。
首先,先更新 ubuntu。
apt update
apt dist-upgrade
更新完成後,重新啟動 ubuntu。
reboot
重新啟動 ubuntu 會中斷 SSH 的連線,重新使用 SSH 登入至你的伺服器。
ssh <your_user_account>@<server_ip>
打開 Ubuntu 的 unattended-upgrades 設定檔。
sudo nano /etc/apt/apt.conf.d/50unattended-upgrades
如果是使用比較舊的 Ununtu 版本,你可能需要自行安裝。
apt install unattended-upgrades
nano /etc/apt/apt.conf.d/50unattended-upgrades
將安全性更新之外的程式註解掉。
Unattended-Upgrade::Allowed-Origins {
// "${distro_id}:${distro_codename}"; // 發行版的預設軟體源
"${distro_id}:${distro_codename}-security"; // 安全性更新
"${distro_id}ESM:${distro_codename}"; // 針對過期的 LTS 版提供的付費延展安全性更新
// "${distro_id}:${distro_codename}-updates"; // 官方建議的軟體更新(功能更新、Bug 修復等)
// "${distro_id}:${distro_codename}-proposed"; // 尚未官方建議的軟體更新
// "${distro_id}:${distro_codename}-backports"; // 針對舊版 Ubuntu 提供的新軟體更新
};
儲存檔案後離開。
目前已經做好自動更新的設定,接下來是要開啟自動更新的功能。
打開 Ubuntu 的 auto-upgrades 設定檔。
nano /etc/apt/apt.conf.d/20auto-upgrades
複製下方的指令並貼上。
// 指定自動更新套件庫清單 (apt update) 的週期,單位是天。
APT::Periodic::Update-Package-Lists "1";
// 指定自動把可更新的套件下載下來 (apt upgrade -d) 的週期,單位是天。
APT::Periodic::Download-Upgradeable-Packages "1";
// 指定自動把目前已經不可下載,但是先前已經被下載下來的套件清除 (apt autoclean) 的週期,單位是天。
APT::Periodic::AutocleanInterval "7";
// 與套件「unattended-upgrades」互相搭配使用。可以指定要自動下載並安裝套件 (類似apt upgrade) 的週期,單位是天。
APT::Periodic::Unattended-Upgrade "1";
儲存並離開。
3. 改變 SSH Port
SSH 預設是使用 22
port。你可以將 SSH 掛到 1023 ~ 65535 中的其中一個,以避免駭客最低成本的攻擊。
你可以先找出哪些 port 是可被使用的。
ss -tulpn | grep LISTEN
決定好要使用哪個 port 後,開啟 SSH 設定檔。
nano /etc/ssh/sshd_config
找到以 Port 開頭的那一行,並將 22
更改成你想要的 port。
Port <your_ssh_port>
請在同個檔案的任一處加入下方指令,以限制 SSH 永遠使用 Protocol 2。這會使 SSH 連線更加安全。
Protocol 2
儲存並離開。
4. 關閉 root 的 SSH 權限、允許 SSH 登入帳號
你可以先以新設好的 port 和你所使用的非 root 帳號連線。
ssh -p <your_ssh_port> <your_user_account>@<server_ip>
登入成功後,試著使用 sudo 來確認你的使用者帳號是否具有 root 權限。
sudo ls /root
如果可以正常運行,請開啟 SSH 設定檔。
sudo nano /etc/ssh/sshd_config
將 PermitRootLogin 的參數值改為 no
,且插入新的一行指令 AllowUsers
以開啟你的使用者帳號登入權限。
PermitRootLogin no
AllowUsers <your_user_account>
儲存並離開。
重新啟動 SSH。
sudo systemctl restart ssh
到這邊為止,你已經關閉了 root 使用 SSH 連線的權限,並開啟了你的使用者帳號的登入權限。一旦 SSH 重新啟動完畢後,可以嘗試再使用 root 登入看看,此時應該已經無法登入。
ssh -p <your_ssh_port> root@<server_ip> // 此階段應該無法登入
5. 設定 SSH 免密碼登入(SSH Key)
我們會使用 SSH Key 的機制來達成免密碼登入。這是一種使用非對稱金鑰的技術,利用演算法建構出來極為複雜的公私鑰(題目與密碼),將公鑰放在伺服器上,每次登入時系統自動將本地端的私鑰去對應伺服器上的公鑰,來確認是否為本人以達成免本人輸入密碼的登入。除了方便以外,極為複雜且加密過的鑰匙,也可以讓被暴力破解的機會降低。
這邊假設你已經有了 SSH 公私鑰,若沒有,可以參考網路上的其他文章:
首先將公鑰放到伺服器上。先登入你的伺服器。
ssh -p <your_ssh_port> <your_user_account>@<server_ip>
建立 .ssh
資料夾(如果不存在的話),新增 authorized_keys
並編輯。
mkdir /home/<your_user_account>/.ssh
nano /home/<your_user_account>/.ssh/authorized_keys
將公鑰內容複製到 authorized_keys
中。
儲存並離開。
改變 authorized_keys
的權限。
chmod 0600 /home/<your_user_account>/.ssh/authorized_keys
到這邊為止,你已經完成 SSH Key 的設定了。
這時候再開啟另外一個小黑窗,使用 SSH 登入,會發現應該不需要輸入密碼了。
ssh -p <your_ssh_port> <your_user_account>@<server_ip> // 此階段應該不需要輸入密碼了
6. 關閉 SSH 密碼登入功能
為了降低 SSH 的連線風險,我們前面已經限制了登入 SSH 的帳號,以及設定了 SSH Key 以達到免密碼登入。接下來我們要做一個更絕的事情就是關閉 SSH 密碼登入功能。
開啟 SSH 設定檔。
sudo nano /etc/ssh/sshd_config
將 PasswordAuthentication
的參數值改為 no
。
PasswordAuthentication no
儲存並離開。
7. UWF 防火牆
UFW (Uncomplicated Firewall) 防火牆,是 Linux 系統上簡易使用的防火牆。我們可以安裝它。
sudo apt install ufw
因為 UFW 預設會關閉所有 port,所以我們最優先要設定的就是開啟 SSH Port。
sudo ufw allow <your_ssh_port>/tcp // 開啟 SSH Port。非常重要!
sudo ufw enable // 啟動防火牆
這樣就設定完成了。如果你有更改你的 SSH Port,那你可以試試用預設的 22
port 登入看看——應該會是失敗的。
你可以用下列指令查看防火牆狀態。
sudo ufw status
你可以用下列指令檢查所添加的防火牆規則。
udo ufw show added
8. 入侵檢測 Intrusion Detection
我們會安裝 Fail2Ban 來預防暴力登入。Fail2Ban 可以將短時間內登入失敗次數太多 IP 給封鎖,以降低伺服器被入侵的風險。
sudo add-apt-repository universe
sudo apt-update
sudo apt install fail2ban
複製一份設定檔,以避免下次更新複蓋掉原本的設定。
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
service fail2ban restart
安全性的設定到這邊大概告一段落了。
參考文章: