Linux 伺服器安全簡明指南
現在讓我們強化你的伺服器以防止未授權訪問。
經常升級系統
保持最新的軟體是你可以在任何操作系統上採取的最大的安全預防措施。軟體更新的範圍從關鍵漏洞補丁到小 bug 的修復,許多軟體漏洞實際上是在它們被公開的時候得到修補的。
自動安全更新
有一些用於伺服器上自動更新的參數。Fedora 的 Wiki 上有一篇很棒的剖析自動更新的利弊的文章,但是如果你把它限制到安全更新上,自動更新的風險將是最小的。
自動更新的可行性必須你自己判斷,因為它歸結為你在你的伺服器上做什麼。請記住,自動更新僅適用於來自倉庫的包,而不是自行編譯的程序。你可能會發現一個複製了生產伺服器的測試環境是很有必要的。可以在部署到生產環境之前,在測試環境裡面更新來檢查問題。
- CentOS 使用 yum-cron 進行自動更新。
- Debian 和 Ubuntu 使用 無人值守升級。
- Fedora 使用 dnf-automatic。
添加一個受限用戶賬戶
到目前為止,你已經作為 root
用戶訪問了你的伺服器,它有無限制的許可權,可以執行任何命令 - 甚至可能意外中斷你的伺服器。 我們建議創建一個受限用戶帳戶,並始終使用它。 管理任務應該使用 sudo
來完成,它可以臨時提升受限用戶的許可權,以便管理你的伺服器。
不是所有的 Linux 發行版都在系統上默認包含
sudo
,但大多數都在其軟體包倉庫中有sudo
。 如果得到這樣的輸出sudo:command not found
,請在繼續之前安裝sudo
。
要添加新用戶,首先通過 SSH 登錄到你的伺服器。
CentOS / Fedora
1、 創建用戶,用你想要的名字替換 example_user
,並分配一個密碼:
useradd example_user && passwd example_usern
2、 將用戶添加到具有 sudo 許可權的 wheel
組:
usermod -aG wheel example_usern
Ubuntu
1、 創建用戶,用你想要的名字替換 example_user
。你將被要求輸入用戶密碼:
adduser example_usern
2、 添加用戶到 sudo
組,這樣你就有管理員許可權了:
adduser example_user sudon
Debian
1、 Debian 默認的包中沒有 sudo
, 使用 apt-get
來安裝:
apt-get install sudon
2、 創建用戶,用你想要的名字替換 example_user
。你將被要求輸入用戶密碼:
adduser example_usern
3、 添加用戶到 sudo
組,這樣你就有管理員許可權了:
adduser example_user sudon
創建完有限許可權的用戶後,斷開你的伺服器連接:
exitn
重新用你的新用戶登錄。用你的用戶名代替 example_user
,用你的伺服器 IP 地址代替例子中的 IP 地址:
ssh example_user@203.0.113.10n
現在你可以用你的新用戶帳戶管理你的伺服器,而不是 root
。 幾乎所有超級用戶命令都可以用 sudo
(例如:sudo iptables -L -nv
)來執行,這些命令將被記錄到 /var/log/auth.log
中。
加固 SSH 訪問
默認情況下,密碼認證用於通過 SSH 連接到您的伺服器。加密密鑰對更加安全,因為它用私鑰代替了密碼,這通常更難以暴力破解。在本節中,我們將創建一個密鑰對,並將伺服器配置為不接受 SSH 密碼登錄。
創建驗證密鑰對
1、這是在你本機上完成的,不是在你的伺服器上,這裡將創建一個 4096 位的 RSA 密鑰對。在創建過程中,您可以選擇使用密碼加密私鑰。這意味著它不能在沒有輸入密碼的情況下使用,除非將密碼保存到本機桌面的密鑰管理器中。我們建議您使用帶有密碼的密鑰對,但如果你不想使用密碼,則可以將此欄位留空。
Linux / OS X
如果你已經創建了 RSA 密鑰對,則這個命令將會覆蓋它,這可能會導致你不能訪問其它的操作系統。如果你已創建過密鑰對,請跳過此步驟。要檢查現有的密鑰,請運行
ls?/ .ssh / id_rsa *
。
ssh-keygen -b 4096n
在輸入密碼之前,按下 回車使用 /home/your_username/.ssh
中的默認名稱 id_rsa
和 id_rsa.pub
。
Windows
這可以使用 PuTTY 完成,在我們指南中已有描述:使用 SSH 公鑰驗證。
2、將公鑰上傳到您的伺服器上。 將 example_user
替換為你用來管理伺服器的用戶名稱,將 203.0.113.10
替換為你的伺服器的 IP 地址。
Linux
在本機上:
ssh-copy-id example_user@203.0.113.10n
OS X
在你的伺服器上(用你的許可權受限用戶登錄):
mkdir -p ~/.ssh && sudo chmod -R 700 ~/.ssh/n
在本機上:
scp ~/.ssh/id_rsa.pub example_user@203.0.113.10:~/.ssh/authorized_keysn
如果相對於
scp
你更喜歡ssh-copy-id
的話,那麼它也可以在 Homebrew 中找到。使用brew install ssh-copy-id
安裝。
Windows
- 選擇 1:使用 WinSCP 來完成。 在登錄窗口中,輸入你的伺服器的 IP 地址作為主機名,以及非 root 的用戶名和密碼。單擊「登錄」連接。
一旦 WinSCP 連接後,你會看到兩個主要部分。 左邊顯示本機上的文件,右邊顯示服務區上的文件。 使用左側的文件瀏覽器,導航到你已保存公鑰的文件,選擇公鑰文件,然後點擊上面工具欄中的「上傳」。
系統會提示你輸入要將文件放在伺服器上的路徑。 將文件上傳到 /home/example_user/.ssh /authorized_keys
,用你的用戶名替換 example_user
。
- 選擇 2:將公鑰直接從 PuTTY 鍵生成器複製到連接到你的伺服器中(作為非 root 用戶):
mkdir ~/.ssh; nano ~/.ssh/authorized_keysn
上面命令將在文本編輯器中打開一個名為 authorized_keys
的空文件。 將公鑰複製到文本文件中,確保複製為一行,與 PuTTY 所生成的完全一樣。 按下 CTRL + X
,然後按下 Y
,然後回車保存文件。
最後,你需要為公鑰目錄和密鑰文件本身設置許可權:
sudo chmod 700 -R ~/.ssh && chmod 600 ~/.ssh/authorized_keysn
這些命令通過阻止其他用戶訪問公鑰目錄以及文件本身來提供額外的安全性。有關它如何工作的更多信息,請參閱我們的指南如何修改文件許可權。
3、 現在退出並重新登錄你的伺服器。如果你為私鑰指定了密碼,則需要輸入密碼。
SSH 守護進程選項
1、 不允許 root 用戶通過 SSH 登錄。 這要求所有的 SSH 連接都是通過非 root 用戶進行。當以受限用戶帳戶連接後,可以通過使用 sudo
或使用 su -
切換為 root shell 來使用管理員許可權。
# Authentication:n...nPermitRootLogin non
2、 禁用 SSH 密碼認證。 這要求所有通過 SSH 連接的用戶使用密鑰認證。根據 Linux 發行版的不同,它可能需要添加 PasswordAuthentication
這行,或者刪除前面的 #
來取消注釋。
# Change to no to disable tunnelled clear text passwordsnPasswordAuthentication non
如果你從許多不同的計算機連接到伺服器,你可能想要繼續啟用密碼驗證。這將允許你使用密碼進行身份驗證,而不是為每個設備生成和上傳密鑰對。
3、 只監聽一個互聯網協議。 在默認情況下,SSH 守護進程同時監聽 IPv4 和 IPv6 上的傳入連接。除非你需要使用這兩種協議進入你的伺服器,否則就禁用你不需要的。 這不會禁用系統範圍的協議,它只用於 SSH 守護進程。
使用選項:
AddressFamily inet
只監聽 IPv4。AddressFamily inet6
只監聽 IPv6。
默認情況下,AddressFamily
選項通常不在 sshd_config
文件中。將它添加到文件的末尾:
echo AddressFamily inet | sudo tee -a /etc/ssh/sshd_confign
4、 重新啟動 SSH 服務以載入新配置。
如果你使用的 Linux 發行版使用 systemd(CentOS 7、Debian 8、Fedora、Ubuntu 15.10+)
sudo systemctl restart sshdn
如果您的 init 系統是 SystemV 或 Upstart(CentOS 6、Debian 7、Ubuntu 14.04):
sudo service ssh restart n
使用 Fail2Ban 保護 SSH 登錄
Fail2Ban 是一個應用程序,它會在太多的失敗登錄嘗試後禁止 IP 地址登錄到你的伺服器。由於合法登錄通常不會超過三次嘗試(如果使用 SSH 密鑰,那不會超過一個),因此如果伺服器充滿了登錄失敗的請求那就表示有惡意訪問。
Fail2Ban 可以監視各種協議,包括 SSH、HTTP 和 SMTP。默認情況下,Fail2Ban 僅監視 SSH,並且因為 SSH 守護程序通常配置為持續運行並監聽來自任何遠程 IP 地址的連接,所以對於任何伺服器都是一種安全威懾。
有關安裝和配置 Fail2Ban 的完整說明,請參閱我們的指南:使用 Fail2ban 保護伺服器。
刪除未使用的面向網路的服務
大多數 Linux 發行版都安裝並運行了網路服務,監聽來自互聯網、迴環介面或兩者兼有的傳入連接。 將不需要的面向網路的服務從系統中刪除,以減少對運行進程和對已安裝軟體包攻擊的概率。
查明運行的服務
要查看伺服器中運行的服務:
sudo netstat -tulpnn
如果默認情況下
netstat
沒有包含在你的 Linux 發行版中,請安裝軟體包net-tools
或使用ss -tulpn
命令。
以下是 netstat
的輸出示例。 請注意,因為默認情況下不同發行版會運行不同的服務,你的輸出將有所不同:
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program namentcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 7315/rpcbindntcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 3277/sshdntcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 3179/exim4ntcp 0 0 0.0.0.0:42526 0.0.0.0:* LISTEN 2845/rpc.statdntcp6 0 0 :::48745 :::* LISTEN 2845/rpc.statdntcp6 0 0 :::111 :::* LISTEN 7315/rpcbindntcp6 0 0 :::22 :::* LISTEN 3277/sshdntcp6 0 0 ::1:25 :::* LISTEN 3179/exim4nudp 0 0 127.0.0.1:901 0.0.0.0:* 2845/rpc.statdnudp 0 0 0.0.0.0:47663 0.0.0.0:* 2845/rpc.statdnudp 0 0 0.0.0.0:111 0.0.0.0:* 7315/rpcbindnudp 0 0 192.0.2.1:123 0.0.0.0:* 3327/ntpdnudp 0 0 127.0.0.1:123 0.0.0.0:* 3327/ntpdnudp 0 0 0.0.0.0:123 0.0.0.0:* 3327/ntpdnudp 0 0 0.0.0.0:705 0.0.0.0:* 7315/rpcbindnudp6 0 0 :::111 :::* 7315/rpcbindnudp6 0 0 fe80::f03c:91ff:fec:123 :::* 3327/ntpdnudp6 0 0 2001:DB8::123 :::* 3327/ntpdnudp6 0 0 ::1:123 :::* 3327/ntpdnudp6 0 0 :::123 :::* 3327/ntpdnudp6 0 0 :::705 :::* 7315/rpcbindnudp6 0 0 :::60671 :::* 2845/rpc.statdn
netstat
告訴我們服務正在運行 RPC(rpc.statd
和 rpcbind
)、SSH(sshd
)、NTPdate(ntpd
)和Exim(exim4
)。
TCP
請參閱 netstat
輸出的 Local Address
那一列。進程 rpcbind
正在偵聽 0.0.0.0:111
和 :::111
,外部地址是 0.0.0.0:*
或者 :::*
。這意味著它從任何埠和任何網路介面接受來自任何外部地址(IPv4 和 IPv6)上的其它 RPC 客戶端的傳入 TCP 連接。 我們看到類似的 SSH,Exim 正在偵聽來自迴環介面的流量,如所示的 127.0.0.1
地址。
UDP
UDP 套接字是無狀態的,這意味著它們只有打開或關閉,並且每個進程的連接是獨立於前後發生的連接。這與 TCP 的連接狀態(例如 LISTEN
、ESTABLISHED
和 CLOSE_WAIT
)形成對比。
我們的 netstat
輸出說明 NTPdate :1)接受伺服器的公網 IP 地址的傳入連接;2)通過本地主機進行通信;3)接受來自外部的連接。這些連接是通過埠 123 進行的,同時支持 IPv4 和 IPv6。我們還看到了 RPC 打開的更多的套接字。
查明該移除哪個服務
如果你在沒有啟用防火牆的情況下對伺服器進行基本的 TCP 和 UDP 的 nmap 掃描,那麼在打開埠的結果中將出現 SSH、RPC 和 NTPdate 。通過配置防火牆,你可以過濾掉這些埠,但 SSH 除外,因為它必須允許你的傳入連接。但是,理想情況下,應該禁用未使用的服務。
- 你可能主要通過 SSH 連接管理你的伺服器,所以讓這個服務需要保留。如上所述,RSA 密鑰和 Fail2Ban 可以幫助你保護 SSH。
- NTP 是伺服器計時所必需的,但有個替代 NTPdate 的方法。如果你喜歡不開放網路埠的時間同步方法,並且你不需要納秒精度,那麼你可能有興趣用 OpenNTPD 來代替 NTPdate。
- 然而,Exim 和 RPC 是不必要的,除非你有特定的用途,否則應該刪除它們。
本節針對 Debian 8。默認情況下,不同的 Linux 發行版具有不同的服務。如果你不確定某項服務的功能,請嘗試搜索互聯網以了解該功能是什麼,然後再嘗試刪除或禁用它。
卸載監聽的服務
如何移除包取決於發行版的包管理器:
Arch
sudo pacman -Rs package_namen
CentOS
sudo yum remove package_namen
Debian / Ubuntu
sudo apt-get purge package_namen
Fedora
sudo dnf remove package_namen
再次運行 sudo netstat -tulpn
,你看到監聽的服務就只會有 SSH(sshd
)和 NTP(ntpdate
,網路時間協議)。
配置防火牆
使用防火牆阻止不需要的入站流量能為你的伺服器提供一個高效的安全層。 通過指定入站流量,你可以阻止入侵和網路測繪。 最佳做法是只允許你需要的流量,並拒絕一切其他流量。請參閱我們的一些關於最常見的防火牆程序的文檔:
- iptables 是 netfilter 的控制器,它是 Linux 內核的包過濾框架。 默認情況下,iptables 包含在大多數 Linux 發行版中。
- firewallD 是可用於 CentOS/Fedora 系列發行版的 iptables 控制器。
- UFW 為 Debian 和 Ubuntu 提供了一個 iptables 前端。
接下來
這些是加固 Linux 伺服器的最基本步驟,但是進一步的安全層將取決於其預期用途。 其他技術可以包括應用程序配置,使用入侵檢測或者安裝某個形式的訪問控制。
現在你可以按你的需求開始設置你的伺服器了。
推薦閱讀:
※Linux 1.0 之旅:回顧這一切的開始
※Linux下Anaconda的安裝使用與卸載
※拯救者 Linux:我是如何給我的團隊引入 Linux 的
※linux zsh終端 大目錄下 緩慢的問題?
※學Linux內核的作用與方法?