Linux伺服器安全技巧

餘二五發表於2017-11-15

更改SSH預設埠

在搭建好一臺全新的伺服器後要做的第一件事情就是更改SSH的預設埠。這個小小的改動能夠使你的伺服器避免受到成千上萬的暴力攻擊(LCTT 譯註:不更改預設埠相當於黑客們知道你家的門牌號,這樣他們只需要一把一把的試鑰匙就可能開啟你家的鎖)。

要更改預設的SSH埠,先開啟sshd_config檔案:

sudo vim /etc/ssh/sshd_config

找到下面這行:

#Port 22

“#”號表示這行是註釋。首先刪除#號,然後把埠號改成目的埠。埠號不能超過65535,確保要指定的埠號沒有被系統或其它服務佔用。建議在[維基百科]上檢視常用埠號列表。在本文中,使用這個埠號:

Port 16543

然後儲存並關閉檔案,等待更改生效。

接下來的一步是:

使用SSH金鑰認證

在通過SSH訪問伺服器時,使用SSH金鑰進行認證是尤其重要的。這樣做為伺服器增加了額外的保護,確保只有那些擁有金鑰的人才能訪問伺服器。

在本地機器上執行下面命令以生成SSH金鑰:

ssh-keygen -t rsa

你會看到下面的輸出,詢問要將金鑰寫到哪一個檔案裡,並且設定一個密碼:

Generating public/private rsa key pair.Enter file in which to save the key (/root/.ssh/id_rsa): my_keyEnter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in my_key.Your public key has been saved in my_key.pub.The key fingerprint is:SHA256:MqD/pzzTRsCjZb6mpfjyrr5v1pJLBcgprR5tjNoI20A

完成之後,就得到兩個檔案:

my_key

my_key.pub

接下來把my_key.pub拷貝到~/.ssh/authorized_key中

cp my_key.pub ~/.ssh/authorized_keys

然後使用下面命令將金鑰上傳到伺服器:

scp -P16543 authorized_keys user@yourserver-ip:/home/user/.ssh/

至此,你就可以從這臺本地機器上無密碼地訪問伺服器了。

關閉SSH的密碼認證

既然已經有了SSH金鑰,那麼關閉SSH的密碼認證就會更安全了。再次開啟並編輯sshd_config,按如下設定:

ChallengeResponseAuthentication noPasswordAuthentication noUsePAM no

關閉Root登入

下面關鍵的一步是關閉root使用者的直接訪問,而使用sudo或su來執行管理員任務。首先需要新增一個有root許可權的新使用者,所以編輯這個路徑下的sudoers檔案:

/etc/sudoers/

推薦使用如visudo這樣的命令編輯該檔案,因為它會在關閉檔案之前檢查任何可能出現的語法錯誤。當你在編輯檔案時出錯了,這就很有用了。

接下來賦予某個使用者root許可權。在本文中,使用使用者sysadmin。確保在編輯後這個檔案時使用的使用者是系統已有的使用者。找到下面這行:

root ALL=(ALL) ALL

拷貝這行,然後貼上在下一行,然後把root更改為“sysadmin”,如下所示:

root ALL=(ALL) ALLsysadmin ALL=(ALL) ALL

現在解釋一下這行的每一個選項的含義:

(1) root  (2)ALL=(3)(ALL) (4)ALL

(1) 指定使用者

(2) 指定使用者使用sudo的終端

(3) 指定使用者可以擔任的使用者角色

(4) 這個使用者可以使用的命令

(LCTT 譯註:所以上面的配置是意思是:root 使用者可以在任何終端擔任任何使用者,執行任何命令。)

使用這個配置可以給使用者訪問一些系統工具的許可權。

這時,可以放心儲存檔案了。

為了關閉通過SSH直接訪問root,需要再次開啟sshd_config,找到下面這行:

#PermitRootLogin yes

更改為:

PermitRootLogin no

然後儲存檔案,重啟sshd守護程式使改動生效。執行下面命令即可:

sudo /etc/init.d/sshd restart

設定防火牆

防火牆有助於過濾出入埠和阻止使用暴力法的登入嘗試。我傾向於使用SCF(Config Server Firewall)這個強力防火牆。它使用了iptables,易於管理,而且對於不擅於輸入命令的使用者提供了web介面。

要安裝CSF,先登入到伺服器,切換到這個目錄下:

cd /usr/local/src/

然後以root許可權執行下面命令:

wget https://download.configserver.com/csf.tgztar -xzf csf.tgzcd csfsh install.sh

只需等待安裝程式完成,然後編輯CSF的配置檔案:

/etc/csf/csf.conf

預設情況下CSF是以測試模式執行。通過將“TESTING”的值設定成0,切換到product模式。

TESTING = "0"

下面要設定的就是伺服器上允許通過的埠。在csf.conf中定位到下面的部分,根據需要修改埠:

# 允許入站的 TCP 埠TCP_IN = "20,21,25,53,80,110,143,443,465,587,993,995,16543"# 允許出站的 TCP 埠TCP_OUT = "20,21,22,25,53,80,110,113,443,587,993,995,16543"# 允許入站的 UDP 埠UDP_IN = "20,21,53"# 允許出站的 UDP 埠# 要允許發出 traceroute 請求,請加 33434:33523 埠範圍到該列表 UDP_OUT = "20,21,53,113,123"

請根據需要逐一設定,推薦只使用那些需要的埠,避免設定對埠進行大範圍設定。此外,也要避免使用不安全服務的不安全埠。比如只允許埠465和587來傳送電子郵件,取代預設的SMTP埠25。(LCTT 譯註:前提是你的郵件伺服器支援 SMTPS)

重要:千萬不要忘記允許自定義的 ssh 埠。

允許你的IP地址通過防火牆,而絕不被遮蔽,這一點很重要。IP地址定義在下面的檔案中:

/etc/csf/csf.ignore

被遮蔽了的IP地址會出現在這個檔案中:

/etc/csf/csf.deny

一旦完成更改,使用這個命令重啟csf:

sudo /etc/init.d/csf restart

下面是在某臺伺服器上的csf.deny檔案的部分內容,來說明CSF是很有用的:

211.216.48.205 # lfd: (sshd) Failed SSH login from 211.216.48.205 (KR/Korea, Republic of/-): 5 in the last 3600 secs - Fri Mar 6 00:30:35 2015103.41.124.53 # lfd: (sshd) Failed SSH login from 103.41.124.53 (HK/Hong Kong/-): 5 in the last 3600 secs - Fri Mar 6 01:06:46 2015103.41.124.42 # lfd: (sshd) Failed SSH login from 103.41.124.42 (HK/Hong Kong/-): 5 in the last 3600 secs - Fri Mar 6 01:59:04 2015103.41.124.26 # lfd: (sshd) Failed SSH login from 103.41.124.26 (HK/Hong Kong/-): 5 in the last 3600 secs - Fri Mar 6 02:48:26 2015109.169.74.58 # lfd: (sshd) Failed SSH login from 109.169.74.58 (GB/United Kingdom/mail2.algeos.com): 5 in the last 3600 secs - Fri Mar 6 03:49:03 2015

可以看到,嘗試通過暴力法登入的IP地址都被遮蔽了,真是眼不見心不煩啊!

鎖住賬戶

如果某個賬戶在很長一段時間內都不會被使用了,那麼可以將其鎖住以防止其它人訪問。使用如下命令:

passwd -l accountName

當然,這個賬戶依然可以被root使用者使用(LCTT 譯註:可用 su 切換為該賬號)。

瞭解伺服器上的服務

伺服器的本質是為各種服務提供訪問功能。使伺服器只執行所需的服務,關閉沒有使用的服務。這樣做不僅會釋放一些系統資源,而且也會使伺服器變得更加安全。比如,如果只是執行一個簡單的伺服器,顯然不需要X顯示或者桌面環境。如果不需要Windows網路共享功能,則可以放心關閉Samba。

使用下面的命令能檢視伴隨系統啟動而啟動的服務:

chkconfig --list | grep "3:on"

如果系統執行了systemd,執行這條命令:

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

然後使用下面的命令關閉服務:

chkconfig service off或systemctl disable service

在上面的例子中,把“service”替換成真正想要停止的服務名稱。例項如下:

chkconfig httpd off或systemctl disable httpd
本文轉自 chengxuyonghu 51CTO部落格,原文連結:http://blog.51cto.com/6226001001/1675086,如需轉載請自行聯絡原作者


相關文章