我運行著幾臺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 [email protected]
如果你能成功登錄進去,就搞定了。
無密碼登錄
你可以通過無密碼登錄更容易通過ssh進入到服務器,并且完全禁用密碼驗證,增添另一層安全。務必要牢記一點:你只能夠從創建ssh密鑰的那臺機器登錄進入到你的服務器。
不妨使用下列命令,在本地系統上創建ssh密鑰(見圖3):
ssh-keygen - t rsa
wKioL1XKol_RqJx5AABrrgponrI360_meitu_3
圖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進入到服務器。如果你經常從不同的機器登錄進入到服務器,千萬不要使用這一方法。
結束語
這些是試圖自行運行服務器的新用戶需要考慮的一些基本方面。牢記一點:黑客總是先行一步;他們不斷尋找進而闖入你服務器的任何漏洞。因而,最佳實踐就是對你的服務器做一套始終最新的備份。我建議你在對站點做任何變化前后都應該進行備份。那樣一來,萬一你的服務器中了招,總是能夠從上一套備份恢復過來。
要是你有什么問題或建議,歡迎留言交流!