Linux 伺服器安全簡明指南

Phil Zona發表於2016-12-30

現在讓我們強化你的伺服器以防止未授權訪問。

經常升級系統

保持最新的軟體是你可以在任何作業系統上採取的最大的安全預防措施。軟體更新的範圍從關鍵漏洞補丁到小 bug 的修復,許多軟體漏洞實際上是在它們被公開的時候得到修補的。

自動安全更新

有一些用於伺服器上自動更新的引數。Fedora 的 Wiki 上有一篇很棒的剖析自動更新的利弊的文章,但是如果你把它限制到安全更新上,自動更新的風險將是最小的。

自動更新的可行性必須你自己判斷,因為它歸結為在你的伺服器上做什麼。請記住,自動更新僅適用於來自倉庫的包,而不是自行編譯的程式。你可能會發現一個複製了生產伺服器的測試環境是很有必要的。可以在部署到生產環境之前,在測試環境裡面更新來檢查問題。

新增一個受限使用者賬戶

到目前為止,你已經作為 root 使用者訪問了你的伺服器,它有無限制的許可權,可以執行任何命令 - 甚至可能意外中斷你的伺服器。 我們建議建立一個受限使用者帳戶,並始終使用它。 管理任務應該使用 sudo 來完成,它可以臨時提升受限使用者的許可權,以便管理你的伺服器。

不是所有的 Linux 發行版都在系統上預設包含 sudo,但大多數都在其軟體包倉庫中有 sudo。 如果得到這樣的輸出 sudo:command not found,請在繼續之前安裝 sudo

要新增新使用者,首先透過 SSH 登入到你的伺服器。

CentOS / Fedora

1、 建立使用者,用你想要的名字替換 example_user,並分配一個密碼:

useradd example_user && passwd example_user

2、 將使用者新增到具有 sudo 許可權的 wheel 組:

usermod -aG wheel example_user

Ubuntu

1、 建立使用者,用你想要的名字替換 example_user。你將被要求輸入使用者密碼:

adduser example_user

2、 新增使用者到 sudo 組,這樣你就有管理員許可權了:

adduser example_user sudo

Debian

1、 Debian 預設的包中沒有 sudo, 使用 apt-get 來安裝:

apt-get install sudo

2、 建立使用者,用你想要的名字替換 example_user。你將被要求輸入使用者密碼:

adduser example_user

3、 新增使用者到 sudo 組,這樣你就有管理員許可權了:

adduser example_user sudo

建立完有限許可權的使用者後,斷開你的伺服器連線:

exit

重新用你的新使用者登入。用你的使用者名稱代替 example_user,用你的伺服器 IP 地址代替例子中的 IP 地址:

ssh example_user@203.0.113.10

現在你可以用你的新使用者帳戶管理你的伺服器,而不是 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 4096

在輸入密碼之前,按下 回車使用 /home/your_username/.ssh 中的預設名稱 id_rsaid_rsa.pub

Windows

這可以使用 PuTTY 完成,在我們指南中已有描述:使用 SSH 公鑰驗證

2、將公鑰上傳到您的伺服器上。 將 example_user 替換為你用來管理伺服器的使用者名稱稱,將 203.0.113.10 替換為你的伺服器的 IP 地址。

Linux

在本機上:

ssh-copy-id example_user@203.0.113.10

OS X

在你的伺服器上(用你的許可權受限使用者登入):

mkdir -p ~/.ssh && sudo chmod -R 700 ~/.ssh/

在本機上:

scp ~/.ssh/id_rsa.pub example_user@203.0.113.10:~/.ssh/authorized_keys

如果相對於 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_keys
    

    上面命令將在文字編輯器中開啟一個名為 authorized_keys 的空檔案。 將公鑰複製到文字檔案中,確保複製為一行,與 PuTTY 所生成的完全一樣。 按下 CTRL + X,然後按下 Y,然後回車儲存檔案。

最後,你需要為公鑰目錄和金鑰檔案本身設定許可權:

sudo chmod 700 -R ~/.ssh && chmod 600 ~/.ssh/authorized_keys

這些命令透過阻止其他使用者訪問公鑰目錄以及檔案本身來提供額外的安全性。有關它如何工作的更多資訊,請參閱我們的指南如何修改檔案許可權

3、 現在退出並重新登入你的伺服器。如果你為私鑰指定了密碼,則需要輸入密碼。

SSH 守護程式選項

1、 不允許 root 使用者透過 SSH 登入。 這要求所有的 SSH 連線都是透過非 root 使用者進行。當以受限使用者帳戶連線後,可以透過使用 sudo 或使用 su - 切換為 root shell 來使用管理員許可權。

# Authentication:
...
PermitRootLogin no

2、 禁用 SSH 密碼認證。 這要求所有透過 SSH 連線的使用者使用金鑰認證。根據 Linux 發行版的不同,它可能需要新增 PasswordAuthentication 這行,或者刪除前面的 # 來取消註釋。

# Change to no to disable tunnelled clear text passwords
PasswordAuthentication no

如果你從許多不同的計算機連線到伺服器,你可能想要繼續啟用密碼驗證。這將允許你使用密碼進行身份驗證,而不是為每個裝置生成和上傳金鑰對。

3、 只監聽一個網際網路協議。 在預設情況下,SSH 守護程式同時監聽 IPv4 和 IPv6 上的傳入連線。除非你需要使用這兩種協議進入你的伺服器,否則就禁用你不需要的。 這不會禁用系統範圍的協議,它只用於 SSH 守護程式。

使用選項:

  • AddressFamily inet 只監聽 IPv4。
  • AddressFamily inet6 只監聽 IPv6。

預設情況下,AddressFamily 選項通常不在 sshd_config 檔案中。將它新增到檔案的末尾:

echo 'AddressFamily inet' | sudo tee -a /etc/ssh/sshd_config

4、 重新啟動 SSH 服務以載入新配置。

如果你使用的 Linux 發行版使用 systemd(CentOS 7、Debian 8、Fedora、Ubuntu 15.10+)

sudo systemctl restart sshd

如果您的 init 系統是 SystemV 或 Upstart(CentOS 6、Debian 7、Ubuntu 14.04):

sudo service ssh restart

使用 Fail2Ban 保護 SSH 登入

Fail2Ban 是一個應用程式,它會在太多的失敗登入嘗試後禁止 IP 地址登入到你的伺服器。由於合法登入通常不會超過三次嘗試(如果使用 SSH 金鑰,那不會超過一個),因此如果伺服器充滿了登入失敗的請求那就表示有惡意訪問。

Fail2Ban 可以監視各種協議,包括 SSH、HTTP 和 SMTP。預設情況下,Fail2Ban 僅監視 SSH,並且因為 SSH 守護程式通常配置為持續執行並監聽來自任何遠端 IP 地址的連線,所以對於任何伺服器都是一種安全威懾。

有關安裝和配置 Fail2Ban 的完整說明,請參閱我們的指南:使用 Fail2ban 保護伺服器

刪除未使用的面向網路的服務

大多數 Linux 發行版都安裝並執行了網路服務,監聽來自網際網路、迴環介面或兩者兼有的傳入連線。 將不需要的面向網路的服務從系統中刪除,以減少對執行程式和對已安裝軟體包攻擊的機率。

查明執行的服務

要檢視伺服器中執行的服務:

sudo netstat -tulpn

如果預設情況下 netstat 沒有包含在你的 Linux 發行版中,請安裝軟體包 net-tools 或使用 ss -tulpn 命令。

以下是 netstat 的輸出示例。 請注意,因為預設情況下不同發行版會執行不同的服務,你的輸出將有所不同:

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      7315/rpcbind
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      3277/sshd
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      3179/exim4
tcp        0      0 0.0.0.0:42526           0.0.0.0:*               LISTEN      2845/rpc.statd
tcp6       0      0 :::48745                :::*                    LISTEN      2845/rpc.statd
tcp6       0      0 :::111                  :::*                    LISTEN      7315/rpcbind
tcp6       0      0 :::22                   :::*                    LISTEN      3277/sshd
tcp6       0      0 ::1:25                  :::*                    LISTEN      3179/exim4
udp        0      0 127.0.0.1:901           0.0.0.0:*                           2845/rpc.statd
udp        0      0 0.0.0.0:47663           0.0.0.0:*                           2845/rpc.statd
udp        0      0 0.0.0.0:111             0.0.0.0:*                           7315/rpcbind
udp        0      0 192.0.2.1:123           0.0.0.0:*                           3327/ntpd
udp        0      0 127.0.0.1:123           0.0.0.0:*                           3327/ntpd
udp        0      0 0.0.0.0:123             0.0.0.0:*                           3327/ntpd
udp        0      0 0.0.0.0:705             0.0.0.0:*                           7315/rpcbind
udp6       0      0 :::111                  :::*                                7315/rpcbind
udp6       0      0 fe80::f03c:91ff:fec:123 :::*                                3327/ntpd
udp6       0      0 2001:DB8::123           :::*                                3327/ntpd
udp6       0      0 ::1:123                 :::*                                3327/ntpd
udp6       0      0 :::123                  :::*                                3327/ntpd
udp6       0      0 :::705                  :::*                                7315/rpcbind
udp6       0      0 :::60671                :::*                                2845/rpc.statd

netstat 告訴我們服務正在執行 RPCrpc.statdrpcbind)、SSH(sshd)、NTPdatentpd)和Eximexim4)。

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 的連線狀態(例如 LISTENESTABLISHEDCLOSE_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_name

CentOS

sudo yum remove package_name

Debian / Ubuntu

sudo apt-get purge package_name

Fedora

sudo dnf remove package_name

再次執行 sudo netstat -tulpn,你看到監聽的服務就只會有 SSH(sshd)和 NTP(ntpdate,網路時間協議)。

配置防火牆

使用防火牆阻止不需要的入站流量能為你的伺服器提供一個高效的安全層。 透過指定入站流量,你可以阻止入侵和網路測繪。 最佳做法是隻允許你需要的流量,並拒絕一切其他流量。請參閱我們的一些關於最常見的防火牆程式的文件:

  • iptables 是 netfilter 的控制器,它是 Linux 核心的包過濾框架。 預設情況下,iptables 包含在大多數 Linux 發行版中。
  • firewallD 是可用於 CentOS/Fedora 系列發行版的 iptables 控制器。
  • UFW 為 Debian 和 Ubuntu 提供了一個 iptables 前端。

接下來

這些是加固 Linux 伺服器的最基本步驟,但是進一步的安全層將取決於其預期用途。 其他技術可以包括應用程式配置,使用入侵檢測或者安裝某個形式的訪問控制

現在你可以按你的需求開始設定你的伺服器了。


via: https://www.linode.com/docs/security/securing-your-server/

作者:Phil Zona 譯者:geekpi 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出

相關文章