天天看點

Linux 伺服器安全簡明指南

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

<a target="_blank"></a>

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

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

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

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

要添加新使用者,首先通過 ssh 登入到你的伺服器。

1、 建立使用者,用你想要的名字替換 <code>example_user</code>,并配置設定一個密碼:

<code>useradd example_user &amp;&amp; passwd example_user</code>

2、 将使用者添加到具有 sudo 權限的 <code>wheel</code> 組:

<code>usermod -ag wheel example_user</code>

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

<code>adduser example_user</code>

2、 添加使用者到 <code>sudo</code> 組,這樣你就有管理者權限了:

<code>adduser example_user sudo</code>

1、 debian 預設的包中沒有 <code>sudo</code>, 使用 <code>apt-get</code> 來安裝:

<code>apt-get install sudo</code>

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

3、 添加使用者到 <code>sudo</code> 組,這樣你就有管理者權限了:

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

<code>exit</code>

重新用你的新使用者登入。用你的使用者名代替 <code>example_user</code>,用你的伺服器 ip 位址代替例子中的 ip 位址:

<code>ssh [email protected]</code>

現在你可以用你的新使用者帳戶管理你的伺服器,而不是 <code>root</code>。 幾乎所有超級使用者指令都可以用<code>sudo</code>(例如:<code>sudo iptables -l -nv</code>)來執行,這些指令将被記錄到 <code>/var/log/auth.log</code> 中。

預設情況下,密碼認證用于通過 ssh 連接配接到您的伺服器。加密密鑰對更加安全,因為它用私鑰代替了密碼,這通常更難以暴力破解。在本節中,我們将建立一個密鑰對,并将伺服器配置為不接受 ssh 密碼登入。

1、這是在你本機上完成的,不是在你的伺服器上,這裡将建立一個 4096 位的 rsa 密鑰對。在建立過程中,您可以選擇使用密碼加密私鑰。這意味着它不能在沒有輸入密碼的情況下使用,除非将密碼儲存到本機桌面的密鑰管理器中。我們建議您使用帶有密碼的密鑰對,但如果你不想使用密碼,則可以将此字段留白。

linux / os x

如果你已經建立了 rsa 密鑰對,則這個指令将會覆寫它,這可能會導緻你不能通路其它的作業系統。如果你已建立過密鑰對,請跳過此步驟。要檢查現有的密鑰,請運作 <code>ls〜/ .ssh / id_rsa *</code>。

<code>ssh-keygen -b 4096</code>

在輸入密碼之前,按下 回車使用 <code>/home/your_username/.ssh</code> 中的預設名稱 <code>id_rsa</code> 和<code>id_rsa.pub</code>。

windows

2、将公鑰上傳到您的伺服器上。 将 <code>example_user</code> 替換為你用來管理伺服器的使用者名稱,将<code>203.0.113.10</code> 替換為你的伺服器的 ip 位址。

linux

在本機上:

<code>ssh-copy-id [email protected]</code>

os x

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

<code>mkdir -p ~/.ssh &amp;&amp; sudo chmod -r 700 ~/.ssh/</code>

<code>scp ~/.ssh/id_rsa.pub [email protected]:~/.ssh/authorized_keys</code>

一旦 winscp 連接配接後,你會看到兩個主要部分。 左邊顯示本機上的檔案,右邊顯示服務區上的檔案。 使用左側的檔案浏覽器,導航到你已儲存公鑰的檔案,選擇公鑰檔案,然後點選上面工具欄中的“上傳”。

系統會提示你輸入要将檔案放在伺服器上的路徑。 将檔案上傳到 <code>/home/example_user/.ssh /authorized_keys</code>,用你的使用者名替換 <code>example_user</code>。

選擇 2:将公鑰直接從 putty 鍵生成器複制到連接配接到你的伺服器中(作為非 root 使用者):

<code>mkdir ~/.ssh; nano ~/.ssh/authorized_keys</code>

上面指令将在文本編輯器中打開一個名為 <code>authorized_keys</code> 的空檔案。 将公鑰複制到文本檔案中,確定複制為一行,與 putty 所生成的完全一樣。 按下 <code>ctrl + x</code>,然後按下 <code>y</code>,然後回車儲存檔案。

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

<code>sudo chmod 700 -r ~/.ssh &amp;&amp; chmod 600 ~/.ssh/authorized_keys</code>

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

1、 不允許 root 使用者通過 ssh 登入。 這要求所有的 ssh 連接配接都是通過非 root 使用者進行。當以受限使用者帳戶連接配接後,可以通過使用 <code>sudo</code> 或使用 <code>su -</code> 切換為 root shell 來使用管理者權限。

<code># authentication:</code>

<code>...</code>

<code>permitrootlogin no</code>

2、 禁用 ssh 密碼認證。 這要求所有通過 ssh 連接配接的使用者使用密鑰認證。根據 linux 發行版的不同,它可能需要添加 <code>passwordauthentication</code> 這行,或者删除前面的 <code>#</code> 來取消注釋。

<code># change to no to disable tunnelled clear text passwords</code>

<code>passwordauthentication no</code>

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

3、 隻監聽一個網際網路協定。 在預設情況下,ssh 守護程序同時監聽 ipv4 和 ipv6 上的傳入連接配接。除非你需要使用這兩種協定進入你的伺服器,否則就禁用你不需要的。 這不會禁用系統範圍的協定,它隻用于 ssh 守護程序。

使用選項:

<code>addressfamily inet</code> 隻監聽 ipv4。

<code>addressfamily inet6</code> 隻監聽 ipv6。

預設情況下,<code>addressfamily</code> 選項通常不在 <code>sshd_config</code> 檔案中。将它添加到檔案的末尾:

<code>echo 'addressfamily inet' | sudo tee -a /etc/ssh/sshd_config</code>

4、 重新啟動 ssh 服務以加載新配置。

如果你使用的 linux 發行版使用 systemd(centos 7、debian 8、fedora、ubuntu 15.10+)

<code>sudo systemctl restart sshd</code>

如果您的 init 系統是 systemv 或 upstart(centos 6、debian 7、ubuntu 14.04):

fail2ban 可以監視各種協定,包括 ssh、http 和 smtp。預設情況下,fail2ban 僅監視 ssh,并且因為 ssh 守護程式通常配置為持續運作并監聽來自任何遠端 ip 位址的連接配接,是以對于任何伺服器都是一種安全威懾。

大多數 linux 發行版都安裝并運作了網絡服務,監聽來自網際網路、回環接口或兩者兼有的傳入連接配接。 将不需要的面向網絡的服務從系統中删除,以減少對運作程序和對已安裝軟體包攻擊的機率。

要檢視伺服器中運作的服務:

<code>sudo netstat -tulpn</code>

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

以下是 <code>netstat</code> 的輸出示例。 請注意,因為預設情況下不同發行版會運作不同的服務,你的輸出将有所不同:

<code>proto recv-q send-q local address foreign address state pid/program name</code>

<code>tcp 0 0 0.0.0.0:111 0.0.0.0:* listen 7315/rpcbind</code>

<code>tcp 0 0 0.0.0.0:22 0.0.0.0:* listen 3277/sshd</code>

<code>tcp 0 0 127.0.0.1:25 0.0.0.0:* listen 3179/exim4</code>

<code>tcp 0 0 0.0.0.0:42526 0.0.0.0:* listen 2845/rpc.statd</code>

<code>tcp6 0 0 :::48745 :::* listen 2845/rpc.statd</code>

<code>tcp6 0 0 :::111 :::* listen 7315/rpcbind</code>

<code>tcp6 0 0 :::22 :::* listen 3277/sshd</code>

<code>tcp6 0 0 ::1:25 :::* listen 3179/exim4</code>

<code>udp 0 0 127.0.0.1:901 0.0.0.0:* 2845/rpc.statd</code>

<code>udp 0 0 0.0.0.0:47663 0.0.0.0:* 2845/rpc.statd</code>

<code>udp 0 0 0.0.0.0:111 0.0.0.0:* 7315/rpcbind</code>

<code>udp 0 0 192.0.2.1:123 0.0.0.0:* 3327/ntpd</code>

<code>udp 0 0 127.0.0.1:123 0.0.0.0:* 3327/ntpd</code>

<code>udp 0 0 0.0.0.0:123 0.0.0.0:* 3327/ntpd</code>

<code>udp 0 0 0.0.0.0:705 0.0.0.0:* 7315/rpcbind</code>

<code>udp6 0 0 :::111 :::* 7315/rpcbind</code>

<code>udp6 0 0 fe80::f03c:91ff:fec:123 :::* 3327/ntpd</code>

<code>udp6 0 0 2001:db8::123 :::* 3327/ntpd</code>

<code>udp6 0 0 ::1:123 :::* 3327/ntpd</code>

<code>udp6 0 0 :::123 :::* 3327/ntpd</code>

<code>udp6 0 0 :::705 :::* 7315/rpcbind</code>

<code>udp6 0 0 :::60671 :::* 2845/rpc.statd</code>

tcp

請參閱 <code>netstat</code> 輸出的 <code>local address</code> 那一列。程序 <code>rpcbind</code> 正在偵聽 <code>0.0.0.0:111</code> 和<code>:::111</code>,外部位址是 <code>0.0.0.0:*</code> 或者 <code>:::*</code> 。這意味着它從任何端口和任何網絡接口接受來自任何外部位址(ipv4 和 ipv6)上的其它 rpc 用戶端的傳入 tcp 連接配接。 我們看到類似的 ssh,exim 正在偵聽來自回環接口的流量,如所示的 <code>127.0.0.1</code> 位址。

udp

我們的 <code>netstat</code>輸出說明 ntpdate :1)接受伺服器的公網 ip 位址的傳入連接配接;2)通過本地主機進行通信;3)接受來自外部的連接配接。這些連接配接是通過端口 123 進行的,同時支援 ipv4 和 ipv6。我們還看到了 rpc 打開的更多的套接字。

你可能主要通過 ssh 連接配接管理你的伺服器,是以讓這個服務需要保留。如上所述,rsa 密鑰和 fail2ban 可以幫助你保護 ssh。

然而,exim 和 rpc 是不必要的,除非你有特定的用途,否則應該删除它們。

本節針對 debian 8。預設情況下,不同的 linux 發行版具有不同的服務。如果你不确定某項服務的功能,請嘗試搜尋網際網路以了解該功能是什麼,然後再嘗試删除或禁用它。

如何移除包取決于發行版的包管理器:

arch

<code>sudo pacman -rs package_name</code>

centos

<code>sudo yum remove package_name</code>

debian / ubuntu

<code>sudo apt-get purge package_name</code>

fedora

<code>sudo dnf remove package_name</code>

再次運作 <code>sudo netstat -tulpn</code>,你看到監聽的服務就隻會有 ssh(<code>sshd</code>)和 ntp(<code>ntpdate</code>,網絡時間協定)。

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

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

原文釋出時間為:2017-12-30

本文來自雲栖社群合作夥伴“linux中國”

繼續閱讀