Linux系統(tǒng)開發(fā)之OpenSSH服務安全最佳實踐
2018-03-02 14:08:01
1846瀏覽
OpenSSH是SSH協(xié)議的一個實現(xiàn)。一般通過scp或sftp用于遠程登錄、備份、遠程文件傳輸?shù)裙δ?。SSH能夠完美保障兩個網(wǎng)絡或系統(tǒng)間數(shù)據(jù)傳輸?shù)谋C苄院屯暾?。盡管如此,它最大的優(yōu)勢是使用公匙加密來進行服務器驗證。時不時會出現(xiàn)關于OpenSSH零日漏洞的傳言。本文將描述如何設置你的Linux或類Unix系統(tǒng)以提高sshd的安全性。
OpenSSH默認設置
TCP端口-22
OpenSSH服務配置文件-sshd_config(位于/etc/ssh/)
1、基于公匙的登錄
OpenSSH服務支持各種驗證方式。推薦使用公匙加密驗證。首先,使用以下ssh-keygen命令在本地電腦上創(chuàng)建密匙對:
1024位或低于它的DSA和RSA加密是很弱的,請不要使用。當考慮ssh客戶端向后兼容性的時候,請使用RSA密匙代替ECDSA密匙。所有的ssh密鑰要么使用ED25519,要么使用RSA,不要使用其它類型。
$ssh-keygen-tkey_type-bbits-C"comment"
示例:
$ssh-keygen-ted25519-C"Logintoproductionclusteratxyzcorp"
或
$ssh-keygen-trsa-b4096-f~/.ssh/id_rsa_aws_$(date+%Y-%m-%d)-C"AWSkeyforabccorpclients"
下一步,使用ssh-copy-id命令安裝公匙:
$ssh-copy-id-i/path/to/public-key-fileuser@host
或
$ssh-copy-iduser@remote-server-ip-or-dns-name
示例:
$ssh-copy-idvivek@rhel7-aws-server
提示輸入用戶名和密碼的時候,確認基于ssh公匙的登錄是否工作:
$sshvivek@rhel7-aws-server
2、禁用root用戶登錄
禁用root用戶登錄前,確認普通用戶可以以root身份登錄。例如,允許用戶vivek使用sudo命令以root身份登錄。
在Debian/Ubuntu系統(tǒng)中如何將用戶vivek添加到sudo組中
允許sudo組中的用戶執(zhí)行任何命令。將用戶vivek添加到sudo組中:
$sudoadduserviveksudo
使用id命令驗證用戶組。
$idvivek
在CentOS/RHEL系統(tǒng)中如何將用戶vivek添加到sudo組中
在CentOS/RHEL和Fedora系統(tǒng)中允許wheel組中的用戶執(zhí)行所有的命令。使用usermod命令將用戶vivek添加到wheel組中:
$sudousermod-aGwheelvivek
$idvivek
測試sudo權限并禁用sshroot登錄
測試并確保用戶vivek可以以root身份登錄執(zhí)行以下命令:
$sudo-i
$sudo/etc/init.d/sshdstatus
$sudosystemctlstatushttpd
添加以下內(nèi)容到sshd_config文件中來禁用root登錄:
PermitRootLoginno
ChallengeResponseAuthenticationno
PasswordAuthenticationno
UsePAMno
3、禁用密碼登錄
所有的密碼登錄都應該禁用,僅留下公匙登錄。添加以下內(nèi)容到sshd_config文件中:
AuthenticationMethodspublickey
PubkeyAuthenticationyes
CentOS6.x/RHEL6.x系統(tǒng)中老版本的sshd用戶可以使用以下設置:
PubkeyAuthenticationyes
4、限制用戶的ssh訪問
默認狀態(tài)下,所有的系統(tǒng)用戶都可以使用密碼或公匙登錄。但是有些時候需要為FTP或者email服務創(chuàng)建UNIX/Linux用戶。然而,這些用戶也可以使用ssh登錄系統(tǒng)。他們將獲得訪問系統(tǒng)工具的完整權限,包括編譯器和諸如Perl、Python(可以打開網(wǎng)絡端口干很多瘋狂的事情)等的腳本語言。通過添加以下內(nèi)容到sshd_config文件中來僅允許用戶root、vivek和jerry通過SSH登錄系統(tǒng):
AllowUsersvivekjerry
當然,你也可以添加以下內(nèi)容到sshd_config文件中來達到僅拒絕一部分用戶通過SSH登錄系統(tǒng)的效果。
DenyUsersrootsarojanjalifoo
你也可以通過配置LinuxPAM來禁用或允許用戶通過sshd登錄。也可以允許或禁止一個用戶組列表通過ssh登錄系統(tǒng)。
5、禁用空密碼
你需要明確禁止空密碼賬戶遠程登錄系統(tǒng),更新sshd_config文件的以下內(nèi)容:
PermitEmptyPasswordsno
6、為ssh用戶或者密匙使用強密碼
為密匙使用強密碼和短語的重要性再怎么強調(diào)都不過分。暴力破解可以起作用就是因為用戶使用了基于字典的密碼。你可以強制用戶避開字典密碼并使用約翰的開膛手工具來檢測弱密碼。以下是一個隨機密碼生成器(放到你的~/.bashrc下):
genpasswd(){
locall=$1
["$l"==""]&&l=20
tr-dcA-Za-z0-9_</dev/urandom|head-c${l}|xargs
}
運行:
genpasswd16
輸出:
uw8CnDVMwC6vOKgW
使用mkpasswd/makepasswd/pwgen生成隨機密碼
Linux/UNIX:生成密碼
Linux隨機密碼生成命令
7、為SSH的22端口配置防火墻
你需要更新iptables/ufw/firewall-cmd或pf防火墻配置來為ssh的TCP端口22配置防火墻。一般來說,OpenSSH服務應該僅允許本地或者其他的遠端地址訪問。
Netfilter(Iptables)配置
更新/etc/sysconfig/iptables(Redhat和其派生系統(tǒng)特有文件)實現(xiàn)僅接受來自于192.168.1.0/24和202.54.1.5/29的連接,輸入:
-ARH-Firewall-1-INPUT-s192.168.1.0/24-mstate--stateNEW-ptcp--dport22-jACCEPT
-ARH-Firewall-1-INPUT-s202.54.1.5/29-mstate--stateNEW-ptcp--dport22-jACCEPT
如果同時使用IPv6的話,可以編輯/etc/sysconfig/ip6tables(Redhat和其派生系統(tǒng)特有文件),輸入:
-ARH-Firewall-1-INPUT-sipv6network::/ipv6mask-mtcp-ptcp--dport22-jACCEPT
將ipv6network::/ipv6mask替換為實際的IPv6網(wǎng)段。
Debian/UbuntuLinux下的UFW
UFW是UncomplicatedFireWall的首字母縮寫,主要用來管理Linux防火墻,目的是提供一種用戶友好的界面。輸入以下命令使得系統(tǒng)僅允許網(wǎng)段202.54.1.5/29接入端口22:
$sudoufwallowfrom202.54.1.5/29toanyport22
*BSDPF防火墻配置
如果使用PF防火墻/etc/pf.conf配置如下:
passinon$ext_ifinetprototcpfrom{192.168.1.0/24,202.54.1.5/29}to$ssh_server_ipportsshflagsS/SAsynproxystate
8、修改SSH端口和綁定IP
ssh默認監(jiān)聽系統(tǒng)中所有可用的網(wǎng)卡。修改并綁定ssh端口有助于避免暴力腳本的連接(許多暴力腳本只嘗試端口22)。更新文件sshd_config的以下內(nèi)容來綁定端口300到IP192.168.1.5和202.54.1.5:
Port300
ListenAddress192.168.1.5
ListenAddress202.54.1.5
當需要接受動態(tài)廣域網(wǎng)地址的連接時,使用主動腳本是個不錯的選擇,比如fail2ban或denyhosts。
9、使用TCPwrappers(可選的)
TCPwrapper是一個基于主機的訪問控制系統(tǒng),用來過濾來自互聯(lián)網(wǎng)的網(wǎng)絡訪問。OpenSSH支持TCPwrappers。只需要更新文件/etc/hosts.allow中的以下內(nèi)容就可以使得SSH只接受來自于192.168.1.2和172.16.23.12的連接:
sshd:192.168.1.2172.16.23.12
在Linux/MacOSX和類UNIX系統(tǒng)中參見TCPwrappers設置和使用的常見問題。
10、阻止SSH破解或暴力攻擊
暴力破解是一種在單一或者分布式網(wǎng)絡中使用大量(用戶名和密碼的)組合來嘗試連接一個加密系統(tǒng)的方法??梢允褂靡韵萝浖響獙Ρ┝簦?br />
DenyHosts是一個基于PythonSSH安全工具。該工具通過監(jiān)控授權日志中的非法登錄日志并封禁原始IP的方式來應對暴力攻擊。
RHEL/Fedora和CentOSLinux下如何設置DenyHosts。
Fail2ban是另一個類似的用來預防針對SSH攻擊的工具。
sshguard是一個使用pf來預防針對SSH和其他服務攻擊的工具。
security/sshblock阻止濫用SSH嘗試登錄。
IPQBDBfilter可以看做是fail2ban的一個簡化版。
11、限制TCP端口22的傳入速率(可選的)
netfilter和pf都提供速率限制選項可以對端口22的傳入速率進行簡單的限制。
Iptables示例
以下腳本將會阻止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--stateNEW-mrecent--update--seconds60--hitcount5
在你的iptables腳本中調(diào)用以上腳本。其他配置選項:
$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
#anotheronelineexample
#$IPT-AINPUT-i${inet_if}-mstate--stateNEW,ESTABLISHED,RELATED-ptcp--dport22-mlimit--limit5/minute--limit-burst5-jACCEPT
*BSDPF示例
以下腳本將限制每個客戶端的連入數(shù)量為20,并且5秒內(nèi)的連接不超過15個。如果客戶端觸發(fā)此規(guī)則,則將其加入abusive_ips表并限制該客戶端連入。最后flush關鍵詞殺死所有觸發(fā)規(guī)則的客戶端的連接。
sshd_server_ip="202.54.1.5"
table<abusive_ips>persist
blockinquickfrom<abusive_ips>
passinon$ext_ifprototcpto$sshd_server_ipportsshflagsS/SAkeepstate(max-src-conn20,max-src-conn-rate15/5,overload<abusive_ips>flush)
12、使用端口敲門(可選的)
端口敲門是通過在一組預先指定的封閉端口上生成連接嘗試,以便從外部打開防火墻上的端口的方法。一旦指定的端口連接順序被觸發(fā),防火墻規(guī)則就被動態(tài)修改以允許發(fā)送連接的主機連入指定的端口。以下是一個使用iptables實現(xiàn)的端口敲門的示例:
$IPT-Nstage1
$IPT-Astage1-mrecent--remove--nameknock
$IPT-Astage1-ptcp--dport3456-mrecent--set--nameknock2
$IPT-Nstage2
$IPT-Astage2-mrecent--remove--nameknock2
$IPT-Astage2-ptcp--dport2345-mrecent--set--nameheaven
$IPT-Ndoor
$IPT-Adoor-mrecent--rcheck--seconds5--nameknock2-jstage2
$IPT-Adoor-mrecent--rcheck--seconds5--nameknock-jstage1
$IPT-Adoor-ptcp--dport1234-mrecent--set--nameknock
$IPT-AINPUT-m--stateESTABLISHED,RELATED-jACCEPT
$IPT-AINPUT-ptcp--dport22-mrecent--rcheck--seconds5--nameheaven-jACCEPT
$IPT-AINPUT-ptcp--syn-jdoor
13、配置空閑超時注銷時長
用戶可以通過ssh連入服務器,可以配置一個超時時間間隔來避免無人值守的ssh會話。打開sshd_config并確保配置以下值:
ClientAliveInterval300
ClientAliveCountMax0
以秒為單位設置一個空閑超時時間(300秒=5分鐘)。一旦空閑時間超過這個值,空閑用戶就會被踢出會話。更多細節(jié)參見如何自動注銷空閑超時的BASH/TCSH/SSH用戶。
14、為ssh用戶啟用警示標語
Banner/etc/issue
`/etc/issue示例文件:
----------------------------------------------------------------------------------------------
YouareaccessingaXYZGovernment(XYZG)InformationSystem(IS)thatisprovidedforauthorizeduseonly.
ByusingthisIS(whichincludesanydeviceattachedtothisIS),youconsenttothefollowingconditions:
+TheXYZGroutinelyinterceptsandmonitorscommunicationsonthisISforpurposesincluding,butnotlimitedto,
penetrationtesting,COMSECmonitoring,networkoperationsanddefense,personnelmisconduct(PM),
lawenforcement(LE),andcounterintelligence(CI)investigations.
+Atanytime,theXYZGmayinspectandseizedatastoredonthisIS.
+Communicationsusing,ordatastoredon,thisISarenotprivate,aresubjecttoroutinemonitoring,
interception,andsearch,andmaybedisclosedorusedforanyXYZGauthorizedpurpose.
+ThisISincludessecuritymeasures(e.g.,authenticationandaccesscontrols)toprotectXYZGinterests--not
foryourpersonalbenefitorprivacy.
+Notwithstandingtheabove,usingthisISdoesnotconstituteconsenttoPM,LEorCIinvestigativesearching
ormonitoringofthecontentofprivilegedcommunications,orworkproduct,relatedtopersonalrepresentation
orservicesbyattorneys,psychotherapists,orclergy,andtheirassistants.Suchcommunicationsandwork
productareprivateandconfidential.SeeUserAgreementfordetails.
----------------------------------------------------------------------------------------------
以上是一個標準的示例,更多的用戶協(xié)議和法律細節(jié)請咨詢你的律師團隊。
15、禁用.rhosts文件(需核實)
禁止讀取用戶的~/.rhosts和~/.shosts文件。更新sshd_config文件中的以下內(nèi)容:
IgnoreRhostsyes
SSH可以模擬過時的rsh命令,所以應該禁用不安全的RSH連接。
16、禁用基于主機的授權(需核實)
禁用基于主機的授權,更新sshd_config文件的以下選項:
HostbasedAuthenticationno
17、為OpenSSH和操作系統(tǒng)打補丁
推薦你使用類似yum、apt-get和freebsd-update等工具保持系統(tǒng)安裝了最新的安全補丁。
18、ChrootOpenSSH(將用戶鎖定在主目錄)
默認設置下用戶可以瀏覽諸如/etc、/bin等目錄??梢允褂胏hroot或者其他專有工具如rssh來保護ssh連接。從版本4.8p1或4.9p1起,OpenSSH不再需要依賴諸如rssh或復雜的chroot(1)等第三方工具來將用戶鎖定在主目錄中??梢允褂眯碌腃hrootDirectory指令將用戶鎖定在其主目錄,參見這篇博文。
19.禁用客戶端的OpenSSH服務
工作站和筆記本不需要OpenSSH服務。如果不需要提供ssh遠程登錄和文件傳輸功能的話,可以禁用sshd服務。CentOS/RHEL用戶可以使用yum命令禁用或刪除openssh-server:
$sudoyumeraseopenssh-server
Debian/Ubuntu用戶可以使用apt命令/apt-get命令刪除openssh-server:
$sudoapt-getremoveopenssh-server
有可能需要更新iptables腳本來移除ssh的例外規(guī)則。CentOS/RHEL/Fedora系統(tǒng)可以編輯文件/etc/sysconfig/iptables和/etc/sysconfig/ip6tables。最后重啟iptables服務:
#serviceiptablesrestart
#serviceip6tablesrestart
20.來自Mozilla的額外提示
如果使用6.7+版本的OpenSSH,可以嘗試下以下設置:
#################[WARNING]########################
#Donotuseanysettingblindly.Readsshd_config#
#manpage.Youmustunderstandcryptographyto#
#tweakfollowingsettings.Otherwiseusedefaults#
####################################################
#SupportedHostKeyalgorithmsbyorderofpreference.
HostKey/etc/ssh/ssh_host_ed25519_key
HostKey/etc/ssh/ssh_host_rsa_key
HostKey/etc/ssh/ssh_host_ecdsa_key
#SpecifiestheavailableKEX(KeyExchange)algorithms.
KexAlgorithmscurve25519-sha256@libssh.org,ecdh-sha2-nistp521,ecdh-sha2-nistp384,ecdh-sha2-nistp256,diffie-hellman-group-exchange-sha256
#Specifiestheciphersallowed
Cipherschacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr
#SpecifiestheavailableMAC(messageauthenticationcode)algorithms
MACshmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,umac-128@openssh.com
#LogLevelVERBOSElogsuser'skeyfingerprintonlogin.Neededtohaveaclearaudittrackofwhichkeywasusingtologin.
LogLevelVERBOSE
#Logsftplevelfileaccess(read/write/etc.)thatwouldnotbeeasilyloggedotherwise.
Subsystemsftp/usr/lib/ssh/sftp-server-fAUTHPRIV-lINFO
使用以下命令獲取OpenSSH支持的加密方法:
$ssh-Qcipher
$ssh-Qcipher-auth
$ssh-Qmac
$ssh-Qkex
$ssh-Qkey
最后想要了解更多關于Linux發(fā)展前景趨勢,請關注扣丁學堂Linux培訓官網(wǎng)、微信等平臺,扣丁學堂IT職業(yè)在線學習教育平臺為您提供權威的Linux培訓視頻教程系統(tǒng),通過千鋒扣丁學堂金牌講師在線錄制的Linux視頻教程課程,讓你快速掌握Linux從入門到精通開發(fā)實戰(zhàn)技能??鄱W堂Linux技術交流群:422345477。
【關注微信公眾號獲取更多的學習資料】
查看更多關于“Linux培訓資訊”的相關文章>>
標簽:
Linux命令
Linux視頻教程
Linux培訓
Linux在線學習
Linux在線視頻
Linux系統(tǒng)