1 背景
SSH協(xié)議出現(xiàn)之前,在網(wǎng)絡(luò)設(shè)備管理上廣泛應(yīng)用的一種方式是Telnet。Telnet協(xié)議的優(yōu)勢在于通過它可以遠(yuǎn)程地登錄到網(wǎng)絡(luò)設(shè)備上,對網(wǎng)絡(luò)設(shè)備進(jìn)行配置专酗,為網(wǎng)絡(luò)管理員異地管理網(wǎng)絡(luò)設(shè)備提供了極大的方便。但是盗扇,Telnet協(xié)議存在三個致命的弱點:
A祷肯、明文傳輸:數(shù)據(jù)傳輸采用明文方式,傳輸?shù)臄?shù)據(jù)沒有任何機(jī)密性可言疗隶。
B佑笋、認(rèn)證機(jī)制脆弱。用戶的認(rèn)證信息在網(wǎng)絡(luò)上以明文方式傳輸抽减,很容易被竊聽允青; Telnet 只支持傳統(tǒng)的密碼認(rèn)證方式,很容易被攻擊卵沉。
C、“偽服務(wù)器欺騙”:客戶端無法真正識別服務(wù)器的身份法牲,攻擊者很容易進(jìn)行“偽服務(wù)器欺騙”史汗。SSH協(xié)議正是為了克服Telnet協(xié)議存在的問題而誕生的。
D拒垃、數(shù)據(jù)傳輸過程被篡改停撞,無法保證傳輸過程數(shù)據(jù)完整性
2 安全措施
ssh如果解決上述幾個安全問題?我們一個個來分析
2.1明文傳輸問題
通過 在 通信雙方建立“加密通道”悼瓮,保證傳輸?shù)臄?shù)據(jù)不被竊聽戈毒。并且需要有合適的手段保證通信雙方秘鑰的安全
2.1.1使用加密通道保證數(shù)據(jù)不被竊聽
所謂加密通道,是指發(fā)送方在發(fā)送數(shù)據(jù)前横堡,使用加密密鑰對數(shù)據(jù)進(jìn)行加密埋市,然后將
數(shù)據(jù)發(fā)送給對方;接收方接收到數(shù)據(jù)后命贴,利用解密密鑰從密文中獲取明文道宅。
加解密算法分為兩類:? 對稱密鑰算法:數(shù)據(jù)加密和解密時使用相同的密鑰和相同的算法食听。? 非對稱密鑰算法:數(shù)據(jù)加密和解密時使用不同的密鑰,一個是公開的公鑰污茵,
一個是由用戶秘密保存的私鑰樱报。
由于非對稱密鑰算法比較耗時,一般多用于數(shù)字簽名以及身份認(rèn)證泞当。SSH加密通道
上的數(shù)據(jù)加解密使用對稱密鑰算法迹蛤,目前主要支持的算法有DES、3DES襟士、AES
等盗飒,這些算法都可以有效地防止交互數(shù)據(jù)被竊聽,而且由于采用了初始化向量保
護(hù)敌蜂,可以防止類似于密碼流復(fù)用等密碼分析工具的攻擊箩兽。
2.1.2使用密鑰交換算法保證密鑰本身的安全
對稱密鑰算法要求解密密鑰和加密密鑰完全一致,才能順利從密文中解密得到明
文章喉。因此汗贫,要建立加密通道,必須先在通信雙方部署一致的加解密密鑰秸脱。部署加解
密密鑰的方式有多種:手工配置和第三方機(jī)構(gòu)分配等落包。手工配置的方式擴(kuò)展性差,
只適合一些小型的本地網(wǎng)絡(luò)摊唇;使用第三方機(jī)構(gòu)分配密鑰的方式咐蝇,需要額外的第三方
服務(wù)器,而且密鑰在網(wǎng)絡(luò)中傳輸容易被竊聽巷查。
SSH協(xié)議使用一種安全的方式在通信雙方部署密鑰:密鑰交換算法有序。利用密鑰交換
算法可以在通信雙方動態(tài)地產(chǎn)生密鑰,這個密鑰只能被通信的雙方獲得岛请,任何第三
者都無法竊聽旭寿,這就在源頭上保證了加解密使用密鑰的安全性,很好地解決了密鑰
分發(fā)問題崇败。
2.1.3 openssh中傳輸數(shù)據(jù)加密算法/秘鑰交換算法的配置
1盅称、傳輸數(shù)據(jù)加密算法配置
支持的數(shù)據(jù)加密算法有:
3des-cbc
aes128-cbc
aes192-cbc
aes256-cbc
aes128-ctr
aes192-ctr
aes256-ctr
aes128-gcm@openssh.com
aes256-gcm@openssh.com
chacha20-poly1305@openssh.com
默認(rèn)使用的算法:
chacha20-poly1305@openssh.com,
aes128-ctr,aes192-ctr,aes256-ctr,
aes128-gcm@openssh.com,aes256-gcm@openssh.com
可以通過關(guān)鍵字 “Ciphers”指定使用的算法,多個算法間后室,需要使用逗號相隔
有三種方式指定算法
方式一:Ciphers 關(guān)鍵字后接算法名稱缩膝,比如:Ciphers aes256-ctr,aes192-ctr表示只使用
aes256-ctr岸霹,aes192-ctr兩種算法
方式二:Ciphers 關(guān)鍵字后接算法名稱疾层,并且算法名稱前帶上“+”,表示在默認(rèn)算法基礎(chǔ)上松申,新增“+”后的算法
方式三:Ciphers 關(guān)鍵字后接算法名稱云芦,并且算法名稱前帶上“-”俯逾,表示在默認(rèn)算法基礎(chǔ)上,裁剪“-”后的算法
2.密鑰交換算法配置
支持的密鑰交換算法有:
curve25519-sha256
curve25519-sha256@libssh.org
diffie-hellman-group1-sha1
diffie-hellman-group14-sha1
diffie-hellman-group-exchange-sha1
diffie-hellman-group-exchange-sha256
ecdh-sha2-nistp256
ecdh-sha2-nistp384
ecdh-sha2-nistp521
默認(rèn)使用的密鑰交換算法有:
curve25519-sha256,curve25519-sha256@libssh.org,
ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,
diffie-hellman-group-exchange-sha256,
diffie-hellman-group14-sha1
可以通過關(guān)鍵字 “
KexAlgorithms”指定使用的算法舅逸,多個算法間桌肴,需要使用?逗號相隔
有三種方式指定算法
方式一:KexAlgorithms關(guān)鍵字后接算法名稱,比如:KexAlgorithms
diffie-hellman-group-exchange-sha256琉历,diffie-hellman-group14-sha1
表示只使用diffie-hellman-group-exchange-sha256坠七,diffie-hellman-group14-sha1
兩種算法
方式二:KexAlgorithms關(guān)鍵字后接算法名稱苏章,并且算法名稱前帶上“+”阳似,表示在默認(rèn)算法基礎(chǔ)上朽肥,新增“+”后的算法
方式三:KexAlgorithms關(guān)鍵字后接算法名稱币厕,并且算法名稱前帶上“-”,表示在默認(rèn)算法基礎(chǔ)上栋齿,裁剪“-”后的算法
2.2認(rèn)證機(jī)制脆弱問題(服務(wù)端認(rèn)證客戶端)
2.2.1密碼認(rèn)證
傳統(tǒng)的方式甘晤,采用的是密碼認(rèn)證模式:用戶在ssh客戶端輸入賬號狐血、密碼撮弧,openssh完成對登錄用戶進(jìn)行密碼認(rèn)證潘懊。用戶的身份信息等關(guān)鍵數(shù)據(jù)都保存在認(rèn)證服務(wù)器上
2.2.2公鑰認(rèn)證
由于密碼認(rèn)證方式的認(rèn)證強(qiáng)度較弱,SSH協(xié)議引入了公鑰認(rèn)證方式贿衍。目前授舟,openssh
可以利用RSA和DSA兩種非對稱密鑰算法實現(xiàn)公鑰認(rèn)證。
公鑰認(rèn)證的過程分為兩個部分::
(1)? 公鑰驗證:客戶端首先將自己本地密鑰對的公鑰部分贸辈,按照字符串格式發(fā)送
到服務(wù)器释树。服務(wù)器使用本地保存的客戶端公鑰,與報文中攜帶的客戶端公鑰
進(jìn)行比較擎淤,驗證客戶端持有公鑰的正確性奢啥。
(2)? 數(shù)字簽名驗證:如果公鑰驗證成功,客戶端繼續(xù)使用自己本地密鑰對的私鑰
部分嘴拢,對特定報文進(jìn)行摘要運(yùn)算扫尺,將所得的結(jié)果(即數(shù)字簽名)發(fā)送給服務(wù)
器,向服務(wù)器證明自己的身份炊汤;服務(wù)器使用預(yù)先配置的該用戶的公鑰,對客
戶端發(fā)送過來的數(shù)字簽名進(jìn)行驗證弊攘。
公鑰驗證和數(shù)字簽名驗證中任何一個驗證失敗抢腐,都會導(dǎo)致本次公鑰認(rèn)證失敗。
2.2.3 openssh中服務(wù)端認(rèn)證客戶端相關(guān)配置
2.2.3.1 配置項目
AuthenticationMethods
PubkeyAuthentication:是否使用公鑰認(rèn)證襟交,默認(rèn)為yes
UsePAM:該關(guān)鍵字只有在移植版中支持迈倍,PAM為“可插拔認(rèn)證模塊”,用于
PubkeyAcceptedKeyTypes:公鑰認(rèn)證算法
ecdsa-sha2-nistp256-cert-v01@openssh.com, ecdsa-sha2-nistp384-cert-v01@openssh.com, ecdsa-sha2-nistp521-cert-v01@openssh.com, ssh-ed25519-cert-v01@openssh.com, ssh-rsa-cert-v01@openssh.com, ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521, ssh-ed25519,ssh-rsa
公鑰認(rèn)證配置方法:
1. 首先捣域,在客戶端生成一個對鑰:
# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
fa:49:6c:0a:90:0e:0f:57:2e:21:79:f6:65:7f:8d:42
這里我們用的是rsa算法,我們也可以使用dsa算法:
ssh-keygen -t dsa
從上面可以看到啼染,提示輸入私鑰的保護(hù)密碼宴合,我們也可以不選,直接ENTER就行了迹鹅!
現(xiàn)在密鑰已經(jīng)生成:
id_rsa(私鑰) id_rsa.pub(公鑰)
如果是dsa算法生成的話:
id_dsa id_dsa.pub
2. 我們將公鑰傳到服務(wù)器的.ssh目錄下.
scp id_rsa.pub user@hostname:/home/user/.ssh/authorized_keys
3. 將/etc/ssh/sshd_config
中的rsa認(rèn)證功能打開.(去掉注釋)
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
然后重新啟動sshd就行了.
如果是dsa算法的話同理.
2.2.4 參考
疑問:公鑰認(rèn)證卦洽,是否使用了PAM?還是openssh自己搞的斜棚?
可插拔認(rèn)證模塊的介紹:
http://www.infoq.com/cn/articles/wjl-linux-pluggable-authentication-module
http://www.infoq.com/cn/articles/linux-pam-one
ChrootDirectory:
Specifies
2.3 對“偽服務(wù)器欺騙”的防御
2.3.1 ?原理
用戶認(rèn)證機(jī)制只實現(xiàn)了服務(wù)器端對客戶端的認(rèn)證阀蒂,而客戶端無法認(rèn)證服務(wù)器端,因
此存在著“偽服務(wù)器欺騙”的安全隱患弟蚀。
圖4 偽服務(wù)器欺騙
如圖4所示蚤霞,當(dāng)客戶端主機(jī)需要與服務(wù)器建立連接時,第三方攻擊者冒充真正的服
務(wù)器义钉,與客戶端進(jìn)行數(shù)據(jù)交互昧绣,竊取客戶端主機(jī)的安全信息,并利用這些信息去登
錄真正的服務(wù)器捶闸,獲取服務(wù)器資源夜畴,或?qū)Ψ?wù)器進(jìn)行攻擊。
為了防止類似這樣的偽服務(wù)器欺騙鉴嗤,SSH協(xié)議支持客戶端對服務(wù)器端進(jìn)行認(rèn)證斩启。服
務(wù)器端在密鑰交換階段,使用自己的私鑰對一段固定格式的數(shù)據(jù)進(jìn)行數(shù)字簽名醉锅,并
將該簽名發(fā)往客戶端兔簇,客戶端使用本地保存的服務(wù)器公鑰,對簽名進(jìn)行鑒別硬耍,從而
達(dá)到認(rèn)證服務(wù)器的目的垄琐。
2.3.3 openssh中相關(guān)配置
HostKey
HostKeyAlgorithms
ecdsa-sha2-nistp256-cert-v01@openssh.com, ecdsa-sha2-nistp384-cert-v01@openssh.com, ecdsa-sha2-nistp521-cert-v01@openssh.com, ssh-ed25519-cert-v01@openssh.com, ssh-rsa-cert-v01@openssh.com, ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521, ssh-ed25519,ssh-rsa
2.4數(shù)據(jù)傳輸過程被篡改
2.4.1 openssh中相關(guān)配置
Macs
支持的消息認(rèn)證碼(Mac)算法有:
hmac-md5
hmac-md5-96
hmac-sha1hmac-sha1-96
hmac-sha2-256
hmac-sha2-512
umac-64@openssh.com
umac-128@openssh.com
hmac-md5-etm@openssh.com
hmac-md5-96-etm@openssh.com
hmac-sha1-etm@openssh.com
hmac-sha1-96-etm@openssh.com
hmac-sha2-256-etm@openssh.com
hmac-sha2-512-etm@openssh.com
umac-64-etm@openssh.com
umac-128-etm@openssh.com
默認(rèn)使用的密鑰交換算法有:
umac-64-etm@openssh.com,umac-128-etm@openssh.com,
hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,
hmac-sha1-etm@openssh.com,
umac-64@openssh.com,umac-128@openssh.com,
hmac-sha2-256,hmac-sha2-512,hmac-sha1
可以通過關(guān)鍵字 “Macs”指定使用的算法,多個算法間经柴,需要使用?逗號相隔
有三種方式指定算法
方式一:Macs關(guān)鍵字后接算法名稱狸窘,比如:KexAlgorithms
hmac-sha2-256,hmac-sha2-512
表示只使用hmac-sha2-256坯认,hmac-sha2-512
兩種算法
方式二:Macs關(guān)鍵字后接算法名稱翻擒,并且算法名稱前帶上“+”,表示在默認(rèn)算法基礎(chǔ)上牛哺,新增“+”后的算法
方式三:Macs關(guān)鍵字后接算法名稱陋气,并且算法名稱前帶上“-”,表示在默認(rèn)算法基礎(chǔ)上引润,裁剪“-”后的算法
2.5總結(jié)
openssh通過 以下4類算法巩趁,保證傳輸過程網(wǎng)絡(luò)安全:
A、傳輸數(shù)據(jù)加密:傳輸加密算法淳附,密鑰協(xié)商算法议慰,
B蠢古、公鑰認(rèn)證算法
C、Mac算法