讓你的 Linux 伺服器更安全的方法
我運行幾個Linux伺服器;在家裡的一個作為文件伺服器,還有三個實時伺服器分別用作站點、郵件、雲儲存。雖然我不用擔心家裡的伺服器的安全問題,因為它不和外界對話,但是另外三個伺服器始終需要維護。對於那些想運行自己的伺服器的Linux新手,他們應該將一些觀點牢記在心,就是本文將要給出的幾個方法。
只安裝你需要的
如果你準備運維一個伺服器,你也許會這樣想「我在 Linode有40GB的固態硬碟存儲空間,所以我可以安裝我想要的任何服務。」好吧,的確是這樣:你的伺服器的系統、軟體什麼的都可以安裝在上面。但是也不能太想當然了。要知道即使是最「堅固」的伺服器也能夠被攻擊的,往往是由於在伺服器上使用未打補丁或者易受攻擊的組件。
所以第一個原則是盡量精簡你伺服器,讓它輕快些。只安裝那些你真正需要的軟體。如果存在不想要的軟體,就要清除它們。軟體少了,未打補丁的代碼也會少的。在你安裝任何軟體包和依賴包之前,你應該閱讀該軟體的文檔並只安裝那些你需要的組件。
運行你需要的
第二個原則是只開啟那些你需要的服務。許多發行版或者軟體包也許已經在不同的埠開啟了相應的服務。其實這會有一些安全風險,先打開終端運行下面這行命令:
[alert style="green"] netstat -npl [/alert]
輸出的結果將會告訴你系統正在哪些埠運行哪些服務。如果你發現有你不想運行的服務,關閉這些服務吧。你也應該注意那些隨系統啟動運行的服務。你可以運行systemd來查看這些服務:
[alert style="green"] systemctl list-unit-files --type=service | grep enabled [/alert]
根據各自的系統,你會得到一個類似下圖所示的輸出。如果你發現任何不想運行的服務,可以運行systemctl命令來關閉:
[alert style="green"] systemctl disable service_name [/alert]
增加進入伺服器的限制
就像你不會把自家門的鑰匙給你認識的每一個人,你也不應該讓你認識的人可以隨便進入你的伺服器。既然明確了這一原則,你就要對伺服器增加一些進入的限制。然而請記住:做這些並不能阻止那些一門心思使你伺服器癱瘓的人。我們做的只不過是增加伺服器的安全級別以應對偶然的攻擊。
不要以Root許可權登陸
以root用戶遠程登陸伺服器可不是什麼好的習慣。我們將要禁止以root用戶遠程登陸伺服器,在做這之前,我們要先創建一個有sudo許可權的普通用戶以便能夠遠程登陸伺服器並且執行管理員許可權。只要你用這個用戶登陸伺服器,你總能夠在你需要時切換為root許可權。如果你在系統上已經有了一個這樣的用戶,跳過下面這些步驟;否則,繼續跟著我做。
不同發行版新建用戶的方式有所不同,Red Hat/CentOS使用useradd命令,Ubuntu/Debian使用adduser命令。
在Fedora/CentOS上新建一個用戶:
[alert style="green"] useradd swapnil [/alert]
接著為這個用戶創建一個密碼:
[alert style="green"] passwd swapnil [/alert]
然後會讓你給該用戶提供一個新密碼。接著是賦予該用戶sudo許可權,運行命令:
[alert style="green"] EDITOR=nano visudo [/alert]
找到下面這一行(如下圖):
[alert style="green"] # %wheel ALL=(ALL) ALL [/alert]
[alert style="green"] %wheel ALL=(ALL) ALL [/alert]
保存關閉文件。如果該用戶不屬於wheel組,你可以運行命令把其加入該組:
[alert style="green"] # usermod -aG wheel swapnil [/alert]
在Ubuntu上,你可以通過以下命令新建一個用戶:
[alert style="green"] adduser swapnil [/alert]
然後系統會有一些問題,根據情況回答就可以了,比如為該用戶創建新密碼等。接著是賦予該用戶sudo許可權:
[alert style="green"] gpasswd -a swapnil sudo [/alert]
開啟另一個終端並嘗試用新建的用戶登陸伺服器,可以試著切換sudo許可權去執行一些管理員許可權。如果沒什麼問題,繼續下一步。
禁止root登陸
我們將禁止root登陸,這意味著將沒有人能以root用戶遠程登陸伺服器。先打開sshd配置文件:
[alert style="green"] nano /etc/ssh/sshd_conf [/alert]
找到下面的注釋行並取消注釋:
[alert style="green"] #PermitRootLogin no [/alert]
保存關閉文件並重啟服務:
[alert style="green"] service ssh restart [/alert]
另一個命令也可以:
[alert style="green"] systemctl restart sshd [/alert]
注意:先不要登出伺服器。你需要先測試一下能否用新建用戶成功地遠程登陸伺服器。開啟另一個終端嘗試用新建用戶遠程登陸伺服器。這樣做的目的是防止你被伺服器「鎖」在了外面。如果一切都正常,你可以安全地登出root身份了。
改變埠
另一個改動是改變sshd文件中的默認埠。這只不過好像是增加一些煙霧來保護你的伺服器安全,並不是對伺服器真的做了什麼。就像是用很多一模一樣的車去運送重要人物一樣,這可以讓意圖不軌之人不知道他乘的是哪輛車。
打開sshd_config文件(這次用sudo許可權,因為你已經不能再以root用戶登陸伺服器了,其實這樣做也很方便。):
[alert style="green"] sudo nano /etc/ssh/sshd_conf [/alert]
找到下面注釋行:
[alert style="green"] #Port 22 [/alert]
取消注釋並選擇一個埠,要確保選擇的埠沒有被系統的其它服務佔用。你可以從Wikipedia介紹中了解到哪些是常用埠,並且應避免使用這些埠。我選擇的埠是1977:
[alert style="green"] Port 1977 [/alert]
接著保存關閉文件並重啟sshd服務。再次提醒,在登出伺服器前,開啟另一個終端並用以下命令嘗試登陸伺服器:
[alert style="green"] ssh -p{port_number}@server_IP [/alert]
具體如下:
[alert style="green"] ssh -p1977 swapnil@10.14.190.118 [/alert]
如果你成功登陸,說明已經設置好了。
無密碼登陸
你能夠通過無密碼方式更簡單地遠程登陸伺服器,並且通過關閉密碼驗證也可以增加一點安全級別。不過你也只能在生成ssh密鑰的機器上登陸伺服器了。
在個人機器上生成ssh密鑰(如下圖),使用如下命令:
[alert style="green"] ssh-keygen - t rsa [/alert]
通常會有一些問題,比如你可以默認密鑰的位置,然後想一個難猜的密碼口令。接著,你需要把生成的密鑰複製到伺服器上,使兩個機器可以通過密鑰進行交流。
[alert style="green"] cat ~/.ssh/id_rsa.pub | ssh -p 1977 swapnil@remote-server ";mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys" [/alert]
現在試著開啟另一個終端遠程登陸伺服器,如果一切順利的話,你就不用再輸入密碼了。
這一步與其說是增加安全性倒不如說是為了方便,但你可以關閉伺服器的密碼驗證服務來增加一點安全性。只需打開sshd_config文件,找到下面的注釋行:
[alert style="green"] #PasswordAuthentication yes [/alert]
取消注釋並把值設為no,保存並關閉,然後重啟sshd服務。記住,不要關閉當前的連接終端,開啟另一個終端測試登陸(再次確定登陸不需要密碼)。
這個設置會使得你只能在生成ssh密鑰的機器上遠程登陸伺服器。如果你需要經常從不同的機器登陸伺服器,就不必使用這種方法了。
結語
有一些基本概念告訴那些嘗試運行自己伺服器的新人,牢記駭客始終比我們想得深想得遠,他們以尋找系統漏洞並攻擊伺服器為樂。因此,最好養成定期備份伺服器的習慣,我建議你在伺服器變動前後做備份。萬一你的伺服器哪天癱瘓了,你還可以從備份中重新恢復起來。
原文鏈接:http://www.linux.com/learn/tutorials/843903-how-to-make-your-linux-server-more-secure/
譯文鏈接:http://www.linuxstory.org/four-ways-to-make-your-linux-server-more-security/
dddd