OpenSSH 是 SSH 協(xié)議的一個(gè)實(shí)現(xiàn)。一般通過scp或sftp用于遠(yuǎn)程登錄、備份、遠(yuǎn)程文件傳輸?shù)裙δ?。SSH能夠完美保障兩個(gè)網(wǎng)絡(luò)或系統(tǒng)間數(shù)據(jù)傳輸?shù)谋C苄院屯暾?。盡管如此,它最大的優(yōu)勢(shì)是使用公匙加密來進(jìn)行服務(wù)器驗(yàn)證。時(shí)不時(shí)會(huì)出現(xiàn)關(guān)于 OpenSSH 零日漏洞的傳言。本文將描述如何設(shè)置你的 Linux 或類 Unix 系統(tǒng)以提高 sshd 的安全性。
OpenSSH 默認(rèn)設(shè)置
TCP 端口 – 22
OpenSSH 服務(wù)配置文件 –sshd_config(位于/etc/ssh/)
1、 基于公匙的登錄
OpenSSH 服務(wù)支持各種驗(yàn)證方式。推薦使用公匙加密驗(yàn)證。首先,使用以下ssh-keygen命令在本地電腦上創(chuàng)建密匙對(duì):
1024 位或低于它的 DSA 和 RSA 加密是很弱的,請(qǐng)不要使用。當(dāng)考慮 ssh 客戶端向后兼容性的時(shí)候,請(qǐng)使用 RSA密匙代替 ECDSA 密匙。所有的 ssh 密鑰要么使用 ED25519 ,要么使用 RSA,不要使用其它類型。
$ssh-keygen -tkey_type -bbits -C"comment"
示例:
$ssh-keygen -ted25519 -C"Login to production cluster at xyz corp"
或
$ssh-keygen -trsa -b4096 -f ~/.ssh/id_rsa_aws_$(date +%Y-%m-%d) -C"AWS key for abc corp clients"
下一步,使用 ssh-copy-id 命令安裝公匙:
$ssh-copy-id -i /path/to/public-key-file user@host
或
$ssh-copy-id user@remote-server-ip-or-dns-name
示例:
$ssh-copy-id vivek@rhel7-aws-server
提示輸入用戶名和密碼的時(shí)候,確認(rèn)基于 ssh 公匙的登錄是否工作:
$ssh vivek@rhel7-aws-server
2、 禁用 root 用戶登錄
禁用 root 用戶登錄前,確認(rèn)普通用戶可以以 root 身份登錄。例如,允許用戶 vivek 使用sudo命令以 root 身份登錄。
在 Debian/Ubuntu 系統(tǒng)中如何將用戶 vivek 添加到 sudo 組中
允許 sudo 組中的用戶執(zhí)行任何命令。將用戶 vivek 添加到 sudo 組中:
$sudo adduser vivek sudo
使用 id 命令 驗(yàn)證用戶組。
$id vivek
在 CentOS/RHEL 系統(tǒng)中如何將用戶 vivek 添加到 sudo 組中
在 CentOS/RHEL 和 Fedora 系統(tǒng)中允許 wheel 組中的用戶執(zhí)行所有的命令。使用 usermod 命令將用戶 vivek 添加到 wheel 組中:
$sudo usermod -aG wheel vivek
$id vivek
測(cè)試 sudo 權(quán)限并禁用 ssh root 登錄
測(cè)試并確保用戶 vivek 可以以 root 身份登錄執(zhí)行以下命令:
$sudo -i
$sudo /etc/init.d/sshd status
$sudo systemctl status httpd
添加以下內(nèi)容到 sshd_config 文件中來禁用 root 登錄:
PermitRootLogin no
ChallengeResponseAuthentication no
PasswordAuthentication no
UsePAM no
3、 禁用密碼登錄
所有的密碼登錄都應(yīng)該禁用,僅留下公匙登錄。添加以下內(nèi)容到 sshd_config 文件中:
AuthenticationMethods publickey
PubkeyAuthentication yes
CentOS 6.x/RHEL 6.x 系統(tǒng)中老版本的 sshd 用戶可以使用以下設(shè)置:
PubkeyAuthentication yes
4、 限制用戶的 ssh 訪問
默認(rèn)狀態(tài)下,所有的系統(tǒng)用戶都可以使用密碼或公匙登錄。但是有些時(shí)候需要為 FTP 或者 email 服務(wù)創(chuàng)建 UNIX/Linux 用戶。然而,這些用戶也可以使用 ssh 登錄系統(tǒng)。他們將獲得訪問系統(tǒng)工具的完整權(quán)限,包括編譯器和諸如 Perl、Python(可以打開網(wǎng)絡(luò)端口干很多瘋狂的事情)等的腳本語言。通過添加以下內(nèi)容到 sshd_config 文件中來僅允許用戶 root、vivek 和 jerry 通過 SSH 登錄系統(tǒng):
AllowUsers vivek jerry
當(dāng)然,你也可以添加以下內(nèi)容到 sshd_config 文件中來達(dá)到僅拒絕一部分用戶通過 SSH 登錄系統(tǒng)的效果。
DenyUsers root saroj anjali foo
你也可以通過配置 Linux PAM 來禁用或允許用戶通過 sshd 登錄。也可以允許或禁止一個(gè)用戶組列表通過 ssh 登錄系統(tǒng)。
5、 禁用空密碼
你需要明確禁止空密碼賬戶遠(yuǎn)程登錄系統(tǒng),更新 sshd_config 文件的以下內(nèi)容:
PermitEmptyPasswords no
6、 為 ssh 用戶或者密匙使用強(qiáng)密碼
為密匙使用強(qiáng)密碼和短語的重要性再怎么強(qiáng)調(diào)都不過分。暴力破解可以起作用就是因?yàn)橛脩羰褂昧嘶谧值涞拿艽a。你可以強(qiáng)制用戶避開字典密碼并使用約翰的開膛手工具來檢測(cè)弱密碼。以下是一個(gè)隨機(jī)密碼生成器(放到你的 ~/.bashrc 下):
genpasswd(){
locall=$1
["$l" == ""] && l=20
tr -dcA-Za-z0-9_ < /dev/urandom | head -c${l} | xargs
運(yùn)行:
genpasswd16
輸出:
uw8CnDVMwC6vOKgW
7、 為 SSH 的 22端口配置防火墻
你需要更新 iptables/ufw/firewall-cmd 或 pf 防火墻配置來為 ssh 的 TCP 端口 22 配置防火墻。一般來說,OpenSSH 服務(wù)應(yīng)該僅允許本地或者其他的遠(yuǎn)端地址訪問。
Netfilter(Iptables) 配置
更新 /etc/sysconfig/iptables (Redhat 和其派生系統(tǒng)特有文件) 實(shí)現(xiàn)僅接受來自于 192.168.1.0/24 和 202.54.1.5/29 的連接,輸入:
-ARH-Firewall-1-INPUT -s192.168.1.0/24 -mstate --state NEW -ptcp --dport22 -jACCEPT
-ARH-Firewall-1-INPUT -s202.54.1.5/29 -mstate --state NEW -ptcp --dport22 -jACCEPT
如果同時(shí)使用 IPv6 的話,可以編輯 /etc/sysconfig/ip6tables (Redhat 和其派生系統(tǒng)特有文件),輸入:
-ARH-Firewall-1-INPUT -sipv6network::/ipv6mask -mtcp -ptcp --dport22 -jACCEPT
將 ipv6network::/ipv6mask 替換為實(shí)際的 IPv6 網(wǎng)段。
Debian/Ubuntu Linux 下的 UFW
UFW 是 Uncomplicated FireWall 的首字母縮寫,主要用來管理 Linux 防火墻,目的是提供一種用戶友好的界面。輸入以下命令使得系統(tǒng)僅允許網(wǎng)段 202.54.1.5/29 接入端口 22:
$sudo ufw allow from202.54.1.5/29toany port22
*BSD PF 防火墻配置
如果使用 PF 防火墻 /etc/pf.conf 配置如下:
passinon$ext_ifinetprototcpfrom{192.168.1.0/24,202.54.1.5/29}to$ssh_server_ip port ssh flagsS/SA synproxy state
8、 修改 SSH 端口和綁定 IP
ssh 默認(rèn)監(jiān)聽系統(tǒng)中所有可用的網(wǎng)卡。修改并綁定 ssh 端口有助于避免暴力腳本的連接(許多暴力腳本只嘗試端口 22)。更新文件 sshd_config 的以下內(nèi)容來綁定端口 300 到 IP 192.168.1.5 和 202.54.1.5:
Port300
ListenAddress192.168.1.5
ListenAddress202.54.1.5
當(dāng)需要接受動(dòng)態(tài)廣域網(wǎng)地址的連接時(shí),使用主動(dòng)腳本是個(gè)不錯(cuò)的選擇,比如 fail2ban 或 denyhosts。
9、 使用 TCP wrappers (可選的)
TCP wrapper 是一個(gè)基于主機(jī)的訪問控制系統(tǒng),用來過濾來自互聯(lián)網(wǎng)的網(wǎng)絡(luò)訪問。OpenSSH 支持 TCP wrappers。只需要更新文件 /etc/hosts.allow 中的以下內(nèi)容就可以使得 SSH 只接受來自于 192.168.1.2 和 172.16.23.12 的連接:
sshd : 192.168.1.2172.16.23.12
10、 阻止 SSH 破解或暴力攻擊
暴力破解是一種在單一或者分布式網(wǎng)絡(luò)中使用大量(用戶名和密碼的)組合來嘗試連接一個(gè)加密系統(tǒng)的方法??梢允褂靡韵萝浖響?yīng)對(duì)暴力攻擊:
DenyHosts是一個(gè)基于 Python SSH 安全工具。該工具通過監(jiān)控授權(quán)日志中的非法登錄日志并封禁原始 IP 的方式來應(yīng)對(duì)暴力攻擊。
RHEL / Fedora 和 CentOS Linux 下如何設(shè)置DenyHosts。
Fail2ban是另一個(gè)類似的用來預(yù)防針對(duì) SSH 攻擊的工具。
sshguard是一個(gè)使用 pf 來預(yù)防針對(duì) SSH 和其他服務(wù)攻擊的工具。
security/sshblock阻止濫用 SSH 嘗試登錄。
IPQ BDB filter可以看做是 fail2ban 的一個(gè)簡(jiǎn)化版。
11、 限制 TCP 端口 22 的傳入速率(可選的)
netfilter 和 pf 都提供速率限制選項(xiàng)可以對(duì)端口 22 的傳入速率進(jìn)行簡(jiǎn)單的限制。
Iptables 示例
以下腳本將會(huì)阻止 60 秒內(nèi)嘗試登錄 5 次以上的客戶端的連入。
#!/bin/bash
inet_if=eth1
ssh_port=22
$IPT -IINPUT -ptcp --dport${ssh_port} -i${inet_if} -mstate --stateNEW -mrecent --set
$IPT -IINPUT -ptcp --dport${ssh_port} -i${inet_if} -mstate --state NEW -mrecent --update --seconds60 --hitcount5
在你的 iptables 腳本中調(diào)用以上腳本。其他配置選項(xiàng):
$IPT -AINPUT -i${inet_if} -ptcp --dport${ssh_port} -mstate --stateNEW -mlimit --limit3/min --limit-burst3 -jACCEPT
$IPT -AINPUT -i${inet_if} -ptcp --dport${ssh_port} -mstate --stateESTABLISHED -jACCEPT
$IPT -AOUTPUT -o${inet_if} -ptcp --sport${ssh_port} -mstate --stateESTABLISHED -jACCEPT
# 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
其他細(xì)節(jié)參見 iptables 用戶手冊(cè)。
*BSD PF 示例
以下腳本將限制每個(gè)客戶端的連入數(shù)量為 20,并且 5 秒內(nèi)的連接不超過 15 個(gè)。如果客戶端觸發(fā)此規(guī)則,則將其加入 abusive_ips 表并限制該客戶端連入。最后 flush 關(guān)鍵詞殺死所有觸發(fā)規(guī)則的客戶端的連接。
sshd_server_ip = "202.54.1.5"
table
block inquick from
pass inon$ext_if proto tcp to$sshd_server_ip port ssh flagsS/SA keep state(max-src-conn20,max-src-conn-rate15/5,overload
12、 使用端口敲門(可選的)
端口敲門是通過在一組預(yù)先指定的封閉端口上生成連接嘗試,以便從外部打開防火墻上的端口的方法。一旦指定的端口連接順序被觸發(fā),防火墻規(guī)則就被動(dòng)態(tài)修改以允許發(fā)送連接的主機(jī)連入指定的端口。以下是一個(gè)使用 iptables 實(shí)現(xiàn)的端口敲門的示例:
$IPT -Nstage1
$IPT -Astage1 -mrecent --remove --name knock
$IPT -Astage1 -ptcp --dport3456 -mrecent --set --name knock2
$IPT -Nstage2
$IPT -Astage2 -mrecent --remove --name knock2
$IPT -Astage2 -ptcp --dport2345 -mrecent --set --name heaven
$IPT -Ndoor
$IPT -Adoor -mrecent --rcheck --seconds5 --name knock2 -jstage2
$IPT -Adoor -mrecent --rcheck --seconds5 --name knock -jstage1
$IPT -Adoor -ptcp --dport1234 -mrecent --set --name knock
$IPT -AINPUT -m --state ESTABLISHED,RELATED -jACCEPT
$IPT -AINPUT -ptcp --dport22 -mrecent --rcheck --seconds5 --name heaven -jACCEPT
$IPT -AINPUT -ptcp --syn -jdoor
13、 配置空閑超時(shí)注銷時(shí)長(zhǎng)
用戶可以通過 ssh 連入服務(wù)器,可以配置一個(gè)超時(shí)時(shí)間間隔來避免無人值守的 ssh 會(huì)話。 打開 sshd_config 并確保配置以下值:
ClientAliveInterval300
ClientAliveCountMax0
以秒為單位設(shè)置一個(gè)空閑超時(shí)時(shí)間(300秒 = 5分鐘)。一旦空閑時(shí)間超過這個(gè)值,空閑用戶就會(huì)被踢出會(huì)話。更多細(xì)節(jié)參見如何自動(dòng)注銷空閑超時(shí)的 BASH / TCSH / SSH 用戶。
14、 為 ssh 用戶啟用警示標(biāo)語
更新 sshd_config 文件如下行來設(shè)置用戶的警示標(biāo)語:
Banner /etc/issue
`/etc/issue 示例文件:
以上是一個(gè)標(biāo)準(zhǔn)的示例,更多的用戶協(xié)議和法律細(xì)節(jié)請(qǐng)咨詢你的律師團(tuán)隊(duì)。
15、 禁用 .rhosts 文件(需核實(shí))
禁止讀取用戶的 ~/.rhosts 和 ~/.shosts 文件。更新 sshd_config 文件中的以下內(nèi)容:
IgnoreRhosts yes
SSH 可以模擬過時(shí)的 rsh 命令,所以應(yīng)該禁用不安全的 RSH 連接。
16、 禁用基于主機(jī)的授權(quán)(需核實(shí))
禁用基于主機(jī)的授權(quán),更新 sshd_config 文件的以下選項(xiàng):
HostbasedAuthentication no
17、 為 OpenSSH 和操作系統(tǒng)打補(bǔ)丁
推薦你使用類似 yum、apt-get 和 freebsd-update 等工具保持系統(tǒng)安裝了最新的安全補(bǔ)丁。
18、 Chroot OpenSSH (將用戶鎖定在主目錄)
默認(rèn)設(shè)置下用戶可以瀏覽諸如 /etc、/bin 等目錄??梢允褂?chroot 或者其他專有工具如 rssh 來保護(hù) ssh 連接。從版本 4.8p1 或 4.9p1 起,OpenSSH 不再需要依賴諸如 rssh 或復(fù)雜的 chroot(1) 等第三方工具來將用戶鎖定在主目錄中。可以使用新的 ChrootDirectory 指令將用戶鎖定在其主目錄,參見這篇博文。
19. 禁用客戶端的 OpenSSH 服務(wù)
工作站和筆記本不需要 OpenSSH 服務(wù)。如果不需要提供 ssh 遠(yuǎn)程登錄和文件傳輸功能的話,可以禁用 sshd 服務(wù)。CentOS / RHEL 用戶可以使用 yum 命令 禁用或刪除 openssh-server:
$sudo yum erase openssh-server
Debian / Ubuntu 用戶可以使用 apt 命令/apt-get 命令 刪除 openssh-server:
$sudo apt-get remove openssh-server
有可能需要更新 iptables 腳本來移除 ssh 的例外規(guī)則。CentOS / RHEL / Fedora 系統(tǒng)可以編輯文件 /etc/sysconfig/iptables 和 /etc/sysconfig/ip6tables。最后重啟 iptables 服務(wù):
# service iptables restart
# service ip6tables restart
20. 來自 Mozilla 的額外提示
如果使用 6.7+ 版本的 OpenSSH,可以嘗試下以下設(shè)置:
使用以下命令獲取 OpenSSH 支持的加密方法:
$ssh -Qcipher
$ssh -Qcipher-auth
$ssh -Qmac
$ssh -Qkex
$ssh -Qkey
如何測(cè)試 sshd_config 文件并重啟/重新加載 SSH 服務(wù)?
在重啟 sshd 前檢查配置文件的有效性和密匙的完整性,運(yùn)行:
$sudo sshd -t
擴(kuò)展測(cè)試模式:
$sudo sshd -T
最后,根據(jù)系統(tǒng)的的版本重啟 Linux 或類 Unix 系統(tǒng)中的 sshd 服務(wù):
$[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##
其他建議
使用 2FA 加強(qiáng) SSH 的安全性– 可以使用OATH Toolkit或DuoSecurity啟用多重身份驗(yàn)證。
基于密匙鏈的身份驗(yàn)證– 密匙鏈?zhǔn)且粋€(gè) bash 腳本,可以使得基于密匙的驗(yàn)證非常的靈活方便。相對(duì)于無密碼密匙,它提供更好的安全性。
-
服務(wù)器
+關(guān)注
關(guān)注
12文章
9160瀏覽量
85420 -
SSH協(xié)議
+關(guān)注
關(guān)注
0文章
5瀏覽量
1612
原文標(biāo)題:20 個(gè) OpenSSH 最佳安全實(shí)踐
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論