牢記這七點 讓你的Linux伺服器變得更安全

51cto發表於2015-08-12

  我執行著幾臺Linux伺服器;家裡一臺,充當檔案伺服器,還有三臺活動伺服器,分別用作我的站點伺服器、郵件伺服器和雲端儲存伺服器。雖然我並不擔心家裡那臺伺服器,因為它並不與外界進行聯絡,可是另外三臺伺服器卻要精心維護,而且始終要精心維護。有些Linux新手想執行自己的伺服器,必須牢記幾個事項,這正是本文的重點所在。

圖1:執行中的服務。

  安裝所需的服務

  如果你打算執行一臺伺服器,可能會想“我有來自Linode的40GB固態硬碟(SSD)儲存系統,於是我可以安裝想要安裝的任何服務。”沒錯,你的地盤你作主:可以在伺服器上安裝任意軟體。不過,別犯想當然的毛病。連最固若金湯的伺服器也會因有人鑽了在該伺服器上執行的任何未打補丁或易受攻擊的軟體元件的空子而被劫持。

  所以,頭一條規則就是讓你的伺服器儘量精簡。只安裝你確實需要的那些程式包。要是有不需要的程式包,那就清除。程式包數量越少,程式碼沒打上補丁的可能性就越小。在安裝任何軟體和依賴程式包(比如ownCloud)之前,你應該讀一下ownCloud的說明文件,只安裝它需要的那些程式包。

  執行所需的服務

  第二條規則就是隻執行需要的那些服務。許多發行版或程式包可能會開啟某些服務,在不同的埠上執行。這可能會帶來安全風險。於是,開啟終端,執行下列命令:

netstat -npl

  輸出結果會顯示哪些服務在哪些埠上執行。如果你發現任何不應該執行的服務,停止它。你還應該密切關注已被啟用、系統啟動時執行的服務。只要在執行systemd的系統上執行下列命令,就可以來檢查這方面:

systemctl list-unit-files --type=service | grep enabled

  視系統而定,你會獲得如上圖1中所示的輸出結果。要是你發現任何不需要的服務,可以使用強大的systemct1命令來禁用它:

systemctl disable service_name

  限制對伺服器的訪問

  就好比你不會把自家鑰匙隨隨便便交給認識的人,也不會將訪問伺服器的許可權交隨隨便便授予認識的人。一旦明確了這個規則,就可以限制對伺服器的訪問。要牢記這點:這一切打消不了決意要破壞你伺服器的壞人的念頭。不過,其作用在於為你的伺服器增添了多一層的安全,防範只是撿漏的不法分子。

  千萬不要以根使用者的身份登入

  以超級使用者的身份通過ssh進入到伺服器不是一個好做法。我們後面會禁止以根使用者身份通過ssh進入到伺服器,不過在這麼做之前,不妨建立一個擁有sudo許可權的使用者,那樣你就能通過ssh進入到伺服器,執行管理員任務了。一旦你登入進入到伺服器,總是可以將使用者切換成根使用者,如果需要的話。如果你已經在系統上有了使用者,就跳過幾步;不然,跟著我走。

  不同的發行版使用不同的方法來新增新使用者;Red Hat/CentOS使用useradd,Ubuntu/Debian使用user adduser。

  在Fedora/CentOS上建立新使用者:

useradd swapnil

  然後,為該使用者建立密碼:

passwd swapnil

  它會要求你為它提供使用者的新密碼。現在,你需要為該使用者授予sudo許可權。執行下列命令:

EDITOR=nano visudo

  尋找下面這一行(見圖2):

# %wheel ALL=(ALL) ALL

圖2:為使用者授予sudo許可權。

  去掉該行的註釋(#符號意味著該行被註釋;只要去掉這個符號,即可去掉註釋),那樣它看起來就像這樣:

%wheel ALL=(ALL) ALL

  現在,儲存並關閉檔案。如果使用者不屬於wheel組,你只要執行下面這個命令,就可以將它輕鬆新增到組:

# usermod -aG wheel swapnil

  在Ubuntu系統上,你可以新增新使用者,為此執行下列命令:

adduser swapnil

  回答系統提出的一些問題,包括為該使用者建立密碼。一旦建立完畢,為使用者授予sudo許可權:

gpasswd -a swapnil sudo

  開啟另一個終端視窗,試著以剛建立的使用者的身份登入進入到伺服器,試著以sudo許可權執行一些管理員任務。要是一切正常,進入到下一步。

  禁用根使用者登入

  我們現在要禁用根使用者登入,這意味著沒人能夠以根使用者的身份通過ssh或登入進入到伺服器。為此,開啟sshd配置檔案:

nano /etc/ssh/sshd_conf

  下一步,尋找顯示下列內容的這一註釋行:

#PermitRootLogin no

  然後儲存並關閉該檔案,重啟服務:

service ssh restart

  或者

systemctl restart sshd

  重要提醒:這時切莫退出伺服器。你要測試能不能使用剛建立的使用者成功地通過ssh進入到伺服器。開啟終端的另一個例項,以之前建立的使用者通過ssh進入到伺服器。你不希望完全被鎖在伺服器外面。要是一切都正常,你可以以根使用者身份安全地登出退出伺服器。

  變更埠

  我們對sshd配置檔案要進行的第二個變化就是更改預設埠。這主要是增添一層隱匿性,讓你的伺服器確保安全,而不是給伺服器果真增添任何實際的安全機制。這就好比保安服務公司派一樣的車輛來運送重要人物,那樣攻擊者就不知道該攻擊哪些車了。

  開啟sshd_config檔案(這回以sudo許可權開啟,因為你再也不能以根使用者身份登入進入到伺服器了):

sudo nano /etc/ssh/sshd_conf

  然後,找到這一註釋行:

#Port 22

  去掉該行註釋,選擇一個埠號。在選擇埠時,務必要確保它沒有被你係統上的其他任何服務所使用。你可以從維基百科的這篇文章(https://en.wikipedia.org/wiki/Port_%28computer_networking%29#Common_port_numbers)詳細瞭解哪些埠通常已使用,避免此類埠。我為伺服器選擇了埠1977:

Port 1977

  下一步,儲存並關閉檔案,重啟sshd服務。再一次,登出退出伺服器之前,檢查一下設定,為此可以開啟另一個終端視窗,然後使用該模式登入進去:

ssh -p{port_number}@server_IP

  示例:

ssh -p1977
swapnil@10.14.190.118

  如果你能成功登入進去,就搞定了。

  無密碼登入

  你可以通過無密碼登入更容易通過ssh進入到伺服器,並且完全禁用密碼驗證,增添另一層安全。務必要牢記一點:你只能夠從建立ssh金鑰的那臺機器登入進入到你的伺服器。

  不妨使用下列命令,在本地系統上建立ssh金鑰(見圖3):

ssh-keygen - t rsa

圖3:建立ssh金鑰。

  它會提出一些問題;你不用更改金鑰位置,保留其預設值,為它提供一個難以猜中的通行碼。下一步,你需要將這些金鑰拷貝到伺服器上,那樣兩臺機器就能使用金鑰與對方進行聯絡了。

cat ~/.ssh/id_rsa.pub | ssh -p 1977 swapnil@remote-server ";mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

  現在,試著從另一個終端通過ssh進入到伺服器;要是一切正常,它不會要求你輸入密碼。

  這一步主要是為了方便,而不是增添一些實實在在的安全。不過你也可以增添一點安全,只要禁用伺服器的密碼驗證。只需開啟sshd配置檔案,尋找這注釋的一行:

#PasswordAuthentication yes

  去掉該行註釋,將它從yes改成no。儲存並關閉檔案。然後,重啟sshd服務。再一次,切莫從當前視窗關閉伺服器連線。開啟另一個視窗,登入進入到伺服器(確保它沒有要求輸入密碼)。

  這個設定的另一個方面在於,你現在只能從建立ssh金鑰的那一臺機器通過ssh進入到伺服器。如果你經常從不同的機器登入進入到伺服器,千萬不要使用這一方法。

  結束語

  這些是試圖自行執行伺服器的新使用者需要考慮的一些基本方面。牢記一點:黑客總是先行一步;他們不斷尋找進而闖入你伺服器的任何漏洞。因而,最佳實踐就是對你的伺服器做一套始終最新的備份。我建議你在對站點做任何變化前後都應該進行備份。那樣一來,萬一你的伺服器中了招,總是能夠從上一套備份恢復過來。

  要是你有什麼問題或建議,歡迎留言交流!

  英文:How To Make Your Linux Server More Secure

相關文章