歡迎光臨
每天分享高質量文章

20 個 OpenSSH 最佳安全實踐

OpenSSH 是 SSH 協議的一個實現。一般透過 scp 或 sftp 用於遠端登入、備份、遠端檔案傳輸等功能。SSH能夠完美保障兩個網路或系統間資料傳輸的保密性和完整性。儘管如此,它最大的優勢是使用公匙加密來進行伺服器驗證。時不時會出現關於 OpenSSH 零日漏洞的傳言。本文將描述如何設定你的 Linux 或類 Unix 系統以提高 sshd 的安全性。


OpenSSH 預設設定


  • TCP 埠 – 22

  • OpenSSH 服務配置檔案 – sshd_config (位於 /etc/ssh/)


1、 基於公匙的登入


OpenSSH 服務支援各種驗證方式。推薦使用公匙加密驗證。首先,使用以下 ssh-keygen命令在本地電腦上建立密匙對:


1024 位或低於它的 DSA 和 RSA 加密是很弱的,請不要使用。當考慮 ssh 客戶端向後相容性的時候,請使用 RSA密匙代替 ECDSA 密匙。所有的 ssh 金鑰要麼使用 ED25519 ,要麼使用 RSA,不要使用其它型別。

$ sshkeygent key_typeb bitsC “comment”

 

示例:

$ sshkeygent ed25519C “Login to production cluster at xyz corp”

$ sshkeygent rsab 4096f ~/.ssh/id_rsa_aws_$(date +%Y-%m-%d)C “AWS key for abc corp clients”

下一步,使用 ssh-copy-id 命令安裝公匙:

$ sshcopyidi /path/to/publickeyfile user@host

$ sshcopyid user@remoteserveripordnsname

示例:

$ sshcopyid vivek@rhel7awsserver

 

提示輸入使用者名稱和密碼的時候,確認基於 ssh 公匙的登入是否工作:

$ ssh vivek@rhel7awsserver

 

2、 禁用 root 使用者登入


禁用 root 使用者登入前,確認普通使用者可以以 root 身份登入。例如,允許使用者 vivek 使用 sudo 命令以 root 身份登入。


在 Debian/Ubuntu 系統中如何將使用者 vivek 新增到 sudo 組中


允許 sudo 組中的使用者執行任何命令。 將使用者 vivek 新增到 sudo 組中:

$ sudo adduser vivek sudo

 

使用 id 命令 驗證使用者組。

$ id vivek

 

在 CentOS/RHEL 系統中如何將使用者 vivek 新增到 sudo 組中


在 CentOS/RHEL 和 Fedora 系統中允許 wheel 組中的使用者執行所有的命令。使用 usermod 命令將使用者 vivek 新增到 wheel 組中:

$ sudo usermodaG wheel vivek

$ id vivek

測試 sudo 許可權並禁用 ssh root 登入


測試並確保使用者 vivek 可以以 root 身份登入執行以下命令:

$ sudoi

$ sudo /etc/init.d/sshd status

$ sudo systemctl status httpd

新增以下內容到 sshd_config 檔案中來禁用 root 登入:

PermitRootLogin no

ChallengeResponseAuthentication no

PasswordAuthentication no

UsePAM no

3、 禁用密碼登入


所有的密碼登入都應該禁用,僅留下公匙登入。新增以下內容到 sshd_config 檔案中:

AuthenticationMethods publickey

PubkeyAuthentication yes

CentOS 6.x/RHEL 6.x 系統中老版本的 sshd 使用者可以使用以下設定:

PubkeyAuthentication yes

 

4、 限制使用者的 ssh 訪問


預設狀態下,所有的系統使用者都可以使用密碼或公匙登入。但是有些時候需要為 FTP 或者 email 服務建立 UNIX/Linux 使用者。然而,這些使用者也可以使用 ssh 登入系統。他們將獲得訪問系統工具的完整許可權,包括編譯器和諸如 Perl、Python(可以開啟網路埠乾很多瘋狂的事情)等的指令碼語言。透過新增以下內容到 sshd_config 檔案中來僅允許使用者 root、vivek 和 jerry 透過 SSH 登入系統:

AllowUsers vivek jerry

 

當然,你也可以新增以下內容到 sshd_config 檔案中來達到僅拒絕一部分使用者透過 SSH 登入系統的效果。

DenyUsers root saroj anjali foo

 

你也可以透過配置 Linux PAM 來禁用或允許使用者透過 sshd 登入。也可以允許或禁止一個使用者組串列透過 ssh 登入系統。

5、 禁用空密碼


你需要明確禁止空密碼賬戶遠端登入系統,更新 sshd_config 檔案的以下內容:

PermitEmptyPasswords no

 

6、 為 ssh 使用者或者密匙使用強密碼


為密匙使用強密碼和短語的重要性再怎麼強調都不過分。暴力破解可以起作用就是因為使用者使用了基於字典的密碼。你可以強制使用者避開字典密碼並使用約翰的開膛手工具來檢測弱密碼。以下是一個隨機密碼生成器(放到你的 ~/.bashrc 下):

genpasswd() {

    local l=$1

    [ “$l” == “” ] && l=20

    trdc AZaz09_ < /dev/urandom | headc ${l} | xargs

執行:

genpasswd 16

 

輸出:

uw8CnDVMwC6vOKgW

 

7、 為 SSH 的 22埠配置防火牆


你需要更新 iptables/ufw/firewall-cmd 或 pf 防火牆配置來為 ssh 的 TCP 埠 22 配置防火牆。一般來說,OpenSSH 服務應該僅允許本地或者其他的遠端地址訪問。

Netfilter(Iptables) 配置


更新 /etc/sysconfig/iptables (Redhat 和其派生系統特有檔案) 實現僅接受來自於 192.168.1.0/24 和 202.54.1.5/29 的連線,輸入:

A RHFirewall1INPUTs 192.168.1.0/24m statestate NEWp tcpdport 22j ACCEPT

A RHFirewall1INPUTs 202.54.1.5/29m statestate NEWp tcpdport 22j ACCEPT

如果同時使用 IPv6 的話,可以編輯 /etc/sysconfig/ip6tables (Redhat 和其派生系統特有檔案),輸入:

A RHFirewall1INPUTs ipv6network::/ipv6maskm tcpp tcpdport 22j ACCEPT

 

將 ipv6network::/ipv6mask 替換為實際的 IPv6 網段。

Debian/Ubuntu Linux 下的 UFW


UFW 是 Uncomplicated FireWall 的首字母縮寫,主要用來管理 Linux 防火牆,目的是提供一種使用者友好的介面。輸入以下命令使得系統僅允許網段 202.54.1.5/29 接入埠 22:

$ sudo ufw allow from 202.54.1.5/29 to any port 22

 

*BSD PF 防火牆配置


如果使用 PF 防火牆 /etc/pf.conf 配置如下:

pass in on $ext_if inet proto tcp from {192.168.1.0/24, 202.54.1.5/29} to $ssh_server_ip port ssh flags S/SA synproxy state

 

8、 修改 SSH 埠和系結 IP


ssh 預設監聽系統中所有可用的網絡卡。修改並系結 ssh 埠有助於避免暴力指令碼的連線(許多暴力指令碼只嘗試埠 22)。更新檔案 sshd_config 的以下內容來系結埠 300 到 IP 192.168.1.5 和 202.54.1.5:

Port 300

ListenAddress 192.168.1.5

ListenAddress 202.54.1.5

當需要接受動態廣域網地址的連線時,使用主動指令碼是個不錯的選擇,比如 fail2ban 或 denyhosts。

9、 使用 TCP wrappers (可選的)


TCP wrapper 是一個基於主機的訪問控制系統,用來過濾來自網際網路的網路訪問。OpenSSH 支援 TCP wrappers。只需要更新檔案 /etc/hosts.allow 中的以下內容就可以使得 SSH 只接受來自於 192.168.1.2 和 172.16.23.12 的連線:

sshd : 192.168.1.2 172.16.23.12

 

10、 阻止 SSH 破解或暴力攻擊


暴力破解是一種在單一或者分散式網路中使用大量(使用者名稱和密碼的)組合來嘗試連線一個加密系統的方法。可以使用以下軟體來應對暴力攻擊:


  • DenyHosts 是一個基於 Python SSH 安全工具。該工具透過監控授權日誌中的非法登入日誌並封禁原始 IP 的方式來應對暴力攻擊。

    • RHEL / Fedora 和 CentOS Linux 下如何設定 DenyHosts。

  • Fail2ban 是另一個類似的用來預防針對 SSH 攻擊的工具。

  • sshguard 是一個使用 pf 來預防針對 SSH 和其他服務攻擊的工具。

  • security/sshblock 阻止濫用 SSH 嘗試登入。

  • IPQ BDB filter 可以看做是 fail2ban 的一個簡化版。


11、 限制 TCP 埠 22 的傳入速率(可選的)


netfilter 和 pf 都提供速率限制選項可以對埠 22 的傳入速率進行簡單的限制。


Iptables 示例


以下指令碼將會阻止 60 秒內嘗試登入 5 次以上的客戶端的連入。

#!/bin/bash

inet_if=eth1

ssh_port=22

$IPTI INPUTp tcpdport ${ssh_port}i ${inet_if}m statestate NEWm recentset

$IPTI INPUTp tcpdport ${ssh_port}i ${inet_if}m statestate NEWm recentupdateseconds 60hitcount 5

在你的 iptables 指令碼中呼叫以上指令碼。其他配置選項:

$IPTA INPUTi ${inet_if}p tcpdport ${ssh_port}m statestate NEWm limitlimit 3/minlimitburst 3j ACCEPT

$IPTA INPUTi ${inet_if}p tcpdport ${ssh_port}m statestate ESTABLISHEDj ACCEPT

$IPTA OUTPUTo ${inet_if}p tcpsport ${ssh_port}m statestate ESTABLISHEDj ACCEPT

# another one line example

# $IPT -A INPUT -i ${inet_if} -m state –state NEW,ESTABLISHED,RELATED -p tcp –dport 22 -m limit –limit 5/minute –limit-burst 5-j ACCEPT

其他細節參見 iptables 使用者手冊。

*BSD PF 示例


以下指令碼將限制每個客戶端的連入數量為 20,並且 5 秒內的連線不超過 15 個。如果客戶端觸發此規則,則將其加入 abusive_ips 表並限制該客戶端連入。最後 flush 關鍵詞殺死所有觸發規則的客戶端的連線。

sshd_server_ip = “202.54.1.5”

table <abusive_ips> persist

block in quick from <abusive_ips>

pass in on $ext_if proto tcp to $sshd_server_ip port ssh flags S/SA keep state (maxsrcconn 20, maxsrcconnrate 15/5, overload <abusive_ips> flush)

12、 使用埠敲門(可選的)

埠敲門是透過在一組預先指定的封閉埠上生成連線嘗試,以便從外部開啟防火牆上的埠的方法。一旦指定的埠連線順序被觸發,防火牆規則就被動態修改以允許傳送連線的主機連入指定的埠。以下是一個使用 iptables 實現的埠敲門的示例:

$IPTN stage1

$IPTA stage1m recentremovename knock

$IPTA stage1p tcpdport 3456m recentsetname knock2

 

$IPTN stage2

$IPTA stage2m recentremovename knock2

$IPTA stage2p tcpdport 2345m recentsetname heaven

 

$IPTN door

$IPTA doorm recentrcheckseconds 5name knock2j stage2

$IPTA doorm recentrcheckseconds 5name knockj stage1

$IPTA doorp tcpdport 1234m recentsetname knock

 

$IPTA INPUTmstate ESTABLISHED,RELATEDj ACCEPT

$IPTA INPUTp tcpdport 22m recentrcheckseconds 5name heavenj ACCEPT

$IPTA INPUTp tcpsynj door

13、 配置空閑超時登出時長


使用者可以透過 ssh 連入伺服器,可以配置一個超時時間間隔來避免無人值守的 ssh 會話。 開啟 sshd_config 並確保配置以下值:

ClientAliveInterval 300

ClientAliveCountMax 0

以秒為單位設定一個空閑超時時間(300秒 = 5分鐘)。一旦空閑時間超過這個值,空閑使用者就會被踢出會話。更多細節參見如何自動登出空閑超時的 BASH / TCSH / SSH 使用者。

14、 為 ssh 使用者啟用警示標語


更新 sshd_config 檔案如下行來設定使用者的警示標語:

Banner /etc/issue

 

`/etc/issue 示例檔案:

以上是一個標準的示例,更多的使用者協議和法律細節請諮詢你的律師團隊。

15、 禁用 .rhosts 檔案(需核實)


禁止讀取使用者的 ~/.rhosts 和 ~/.shosts 檔案。更新 sshd_config 檔案中的以下內容:

IgnoreRhosts yes

 

SSH 可以模擬過時的 rsh 命令,所以應該禁用不安全的 RSH 連線。

16、 禁用基於主機的授權(需核實)


禁用基於主機的授權,更新 sshd_config 檔案的以下選項:

HostbasedAuthentication no

 

17、 為 OpenSSH 和作業系統打補丁


推薦你使用類似 yum、apt-get 和 freebsd-update 等工具保持系統安裝了最新的安全補丁。

18、 Chroot OpenSSH (將使用者鎖定在主目錄)


預設設定下使用者可以瀏覽諸如 /etc、/bin 等目錄。可以使用 chroot 或者其他專有工具如 rssh 來保護 ssh 連線。從版本 4.8p1 或 4.9p1 起,OpenSSH 不再需要依賴諸如 rssh 或複雜的 chroot(1) 等第三方工具來將使用者鎖定在主目錄中。可以使用新的 ChrootDirectory 指令將使用者鎖定在其主目錄,參見這篇博文。

19. 禁用客戶端的 OpenSSH 服務


工作站和筆記本不需要 OpenSSH 服務。如果不需要提供 ssh 遠端登入和檔案傳輸功能的話,可以禁用 sshd 服務。CentOS / RHEL 使用者可以使用 yum 命令 禁用或刪除 openssh-server:

$ sudo yum erase opensshserver

 

Debian / Ubuntu 使用者可以使用 apt 命令/apt-get 命令 刪除 openssh-server:

$ sudo aptget remove opensshserver

 

有可能需要更新 iptables 指令碼來移除 ssh 的例外規則。CentOS / RHEL / Fedora 系統可以編輯檔案 /etc/sysconfig/iptables 和 /etc/sysconfig/ip6tables。最後重啟 iptables 服務:

# service iptables restart

# service ip6tables restart

20. 來自 Mozilla 的額外提示


如果使用 6.7+ 版本的 OpenSSH,可以嘗試下以下設定:

使用以下命令獲取 OpenSSH 支援的加密方法:

$ sshQ cipher

$ sshQ cipherauth

$ sshQ mac

$ sshQ kex

$ sshQ key


如何測試 sshd_config 檔案並重啟/重新載入 SSH 服務?


在重啟 sshd 前檢查配置檔案的有效性和密匙的完整性,執行:

$ sudo sshdt

 

擴充套件測試樣式:

$ sudo sshdT

 

最後,根據系統的的版本重啟 Linux 或類 Unix 系統中的 sshd 服務:

$ [sudo systemctl start ssh][38] ## Debian/Ubunt Linux##

$ [sudo systemctl restart sshd.service][39] ## CentOS/RHEL/Fedora Linux##

$ doas /etc/rc.d/sshd restart ## OpenBSD##

$ sudo service sshd restart ## FreeBSD##

其他建議


  1. 使用 2FA 加強 SSH 的安全性 – 可以使用 OATH Toolkit 或 DuoSecurity 啟用多重身份驗證。

  2. 基於密匙鏈的身份驗證 – 密匙鏈是一個 bash 指令碼,可以使得基於密匙的驗證非常的靈活方便。相對於無密碼密匙,它提供更好的安全性。


關於作者


作者是 nixCraft 的創始人,一個經驗豐富的系統管理員和 Linux/Unix 指令碼培訓師。他曾與全球客戶合作,領域涉及 IT,教育,國防和空間研究以及非營利部門等多個行業。請在 Twitter、Facebook、Google+ 上關註他。


英文:Vivek Gite,翻譯:Linux中國/shipsw

linux.cn/article-9394-1.html


《Linux雲端計算及運維架構師高薪實戰班》2018年03月26日即將開課中,120天衝擊Linux運維年薪30萬,改變速約~~~~

    *宣告:推送內容及圖片來源於網路,部分內容會有所改動,版權歸原作者所有,如來源資訊有誤或侵犯權益,請聯絡我們刪除或授權事宜。

    – END –


    更多Linux好文請點選【閱讀原文】

    ↓↓↓

    贊(0)

    分享創造快樂