【筆記】Ubuntu VPS 第一步:安全性設定

這篇文章會記錄著剛拿到全新 Ubuntu VPS 後該做的一些簡易安全相關設定:

  1. 登入伺服器與建立自訂帳號
  2. 開啟 Ubuntu 自動安全性更新
  3. 改變 SSH Port
  4. 關閉 root 的 SSH 權限、允許 SSH 登入帳號
  5. 設定 SSH 免密碼登入(SSH Key)
  6. 關閉 SSH 密碼登入功能
  7. 安裝 UFW 防火牆
  8. 入侵檢測 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

安全性的設定到這邊大概告一段落了。

參考文章:

5 1 vote
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments