一、ssh詳解
1、什麼是ssh
簡單來說,ssh是一種網絡協定,用于計算機之間的加密登入。
如果一個使用者從本地計算機,使用ssh協定登入另一台遠端計算機,我們就可以認為,這種登入是安全的,即使被中途截獲,密碼也不會洩露。
需要指出的是,ssh隻有一種協定,存在多種實作,既有商業實作,也有開源實作。
2、基本用法
(1)使用某個使用者(例如user)登入遠端主機host
指令:ssh user@host
(2)如果本地使用者名和遠端使用者名一緻,則登入時可以省略使用者名
指令:ssh host
(3)ssh的預設端口是22,也就是說,你的登入請求會送進遠端主機的22端口。使用-p參數,可以修改這個端口
指令:ssh –p 端口号 user@host
3、中間人攻擊
SSH之是以能夠保證安全,原因在于它采用了公鑰加密。整個過程如下:
(1)遠端主機收到使用者的登入請求,把自己的公鑰發給使用者。
(2)使用者使用這個公鑰,将登入密碼加密後,發送回來。
(3)遠端主機用自己的私鑰,解密登入密碼,如果密碼正确,就同意使用者登入。
這個過程本身是安全的,但是實施的時候存在一個風險:如果有人截獲了登入請求,然後冒充遠端主機,将僞造的公鑰發給使用者,那麼使用者很難辨識真僞。因為不像https協定,SSH協定的公鑰是沒有證書中心(CA)公證的,也就是說,都是自己簽發的。可以設想,如果攻擊者插在使用者與遠端主機之間(比如在公共的wifi區域),用僞造的公鑰,擷取使用者的登入密碼。再用這個密碼登入遠端主機,那麼SSH的安全機制就蕩然無存了。這種風險就是著名的"中間人攻擊"。
4、ssh的安全驗證
SSH有自己的一套驗證方式,可以阻攔大部分的攻擊,當然如果有人想通過撞庫來嘗試密碼的話,就隻有設定防火牆或者做其它的安全措施了。
從用戶端來看,SSH提供兩種級别的安全驗證。
(1)第一種級别(基于密碼的安全驗證)
隻要你知道自己帳号和密碼,就可以登入到遠端主機。所有傳輸的資料都會被加密,但是不能保證你正在連接配接的伺服器就是你想連接配接的伺服器。可能會有别的伺服器在冒充真正的伺服器,也就是受到“中間人”這種方式的攻擊。
(2)第二種級别(基于密匙的安全驗證)
需要依靠密匙,也就是你必須為自己建立一對密匙,并把公用密匙放在需要通路的伺服器上。如果你要連接配接到SSH伺服器上,用戶端軟體就會向伺服器送出請求,請求用你的密匙進行安全驗證。伺服器收到請求之後,先在該伺服器上你的主目錄下尋找你的公用密匙,然後把它和你發送過來的公用密匙進行比較。如果兩個密匙一緻,伺服器就用公用密匙加密“質詢”(challenge)并把它發送給用戶端軟體。用戶端軟體收到“質詢”之後就可以用你的私人密匙解密再把它發送給伺服器。
用這種方式,你必須知道自己密匙的密碼。但是,與第一種級别相比,第二種級别不需要在網絡上傳送密碼。第二種級别不僅加密所有傳送的資料,而且“中間人”這種攻擊方式也是不可能的(因為他沒有你的私人密匙)。但是整個登入的過程可能需要10秒。
5、密碼登入
(1)如果是第一次登入對方主機,系統會出現如下圖的提示

這段話的意思是,無法确認host主機的真實性,隻知道它的公鑰指紋,問你還想繼續連接配接嗎?
所謂"公鑰指紋",是指公鑰長度較長(這裡采用RSA算法,長達1024位),很難比對,是以對其進行MD5計算,将它變成一個128位的指紋。上例中是20:42:b3:d6:79:dc:79:ec:26:1a:54:8c:72:b7:a7:e3,再進行比較,就容易多了。
很自然的一個問題就是,使用者怎麼知道遠端主機的公鑰指紋應該是多少?回答是沒有好辦法,遠端主機必須在自己的網站上貼出公鑰指紋,以便使用者自行核對。
(2)假設經過風險衡量後,使用者決定接受這個遠端主機的公鑰
(3)、系統會出現一句提示,表示192.168.10.13主機已經得到認可
(4)、輸入密碼(如果密碼正确,就可以登入了)
說明:
當遠端主機的公鑰被接受以後,它就會被儲存在檔案$HOME/.ssh/known_hosts之中。下次再連接配接這台主機,系統就會認出它的公鑰已經儲存在本地了,進而跳過警告部分,直接提示輸入密碼。
每個SSH使用者都有自己的known_hosts檔案,此外系統也有一個這樣的檔案,通常是/etc/ssh/ssh_known_hosts,儲存一些對所有使用者都可信賴的遠端主機的公鑰。
6、公鑰登入
使用密碼登入,每次都必須輸入密碼,非常麻煩。好在SSH還提供了公鑰登入,可以省去輸入密碼的步驟。
所謂"公鑰登入",原理很簡單,就是使用者将自己的公鑰儲存在遠端主機上。登入的時候,遠端主機會向使用者發送一段随機字元串,使用者用自己的私鑰加密後,再發回來。遠端主機用事先儲存的公鑰進行解密,如果成功,就證明使用者是可信的,直接允許登入shell,不再要求密碼。
(1)這種方法要求使用者必須提供自己的公鑰。如果沒有現成的,可以直接用ssh-keygen生成一個,如下圖所示
運作上面的指令以後,系統會出現一系列提示,可以一路回車。其中有一個問題是,要不要對私鑰設定密碼(passphrase),如果擔心私鑰的安全,這裡可以設定一個。
運作結束以後,在$HOME/.ssh/目錄下,會新生成兩個檔案:id_rsa.pub和id_rsa。id_rsa.pub是公鑰,id_rsa是私鑰。
(2)這時再輸入下面的指令,将公鑰傳送到遠端主機host上面
指令:ssh-copy-id 192.168.10.12
第一次是需要輸入密碼的,但之後ssh就不需要輸密碼了。
如果ssh-copy-id不行的話,就打開遠端主機的/etc/ssh/sshd_config這個檔案,檢查下面幾行前面"#"注釋是否取掉。
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
然後,重新開機遠端主機的ssh服務。
7、authorized_keys檔案
遠端主機将使用者的公鑰,儲存在登入後的使用者主目錄的$HOME/.ssh/authorized_keys檔案中。公鑰就是一段字元串,隻要把它追加在authorized_keys檔案的末尾就行了。
(1)這裡不使用上面的ssh-copy-id指令,改用下面的指令,解釋公鑰的儲存過程: ssh user@host 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub
1)、"$ ssh user@host",表示登入遠端主機;
2)、單引号中的mkdir .ssh && cat >> .ssh/authorized_keys,表示登入後在遠端shell上執行的指令;
3)、"$ mkdir -p .ssh"的作用是,如果使用者主目錄中的.ssh目錄不存在,就建立一個;
4)、'cat >> .ssh/authorized_keys' < /.ssh/id_rsa.pub的作用是,将本地的公鑰檔案/.ssh/id_rsa.pub,重定向追加到遠端檔案authorized_keys的末尾。
5)、寫入authorized_keys檔案後,公鑰登入的設定就完成了。
(2)通過安裝lrzsz服務實作
1)、安裝lrzsz服務後,使用sz +公鑰路徑下載下傳下來
2)、通過rz指令将下載下傳下來的公鑰上傳到遠端主機上,将公鑰重定向追加到檔案authorized_keys的末尾
3)、寫入authorized_keys檔案後,公鑰登入的設定就完成了。
二、ssh自定義安全設定
1、為了ssh登陸的時候加一層保護,可以修改預設端口。修改ssh服務配置檔案/etc/ssh/sshd_config
port 2222
這樣遠端連接配接時加上端口
ssh 192.168.10.13 -p 2222
2、ssh使用時加-l後面跟使用者名,表示登陸到對方的這個使用者下面。
ssh -l user 192.168.10.13 -p 2222
等同于
ssh [email protected] -p 2222
3、限制ssh登陸的來源ip,白名單設定(hosts.allow優先級最高)
1)、通過iptables設定ssh端口的白名單,如下設定隻允許192.168.1.0/24網段的客戶機可以遠端連接配接本機
Iptables -A INPUT -s 192.168.1.0/24 -p tcp -m state --state NEW -m tcp --dport 2222 -j ACCEPT
或者
vim /etc/sysconfig/iptables
-A INPUT -s 192.168.1.0/24 -p tcp -m state --state NEW -m tcp --dport 2222 -j ACCEPT
2)、通過/etc/hosts.allow裡面進行限制(如下),/etc/hosts.deny檔案不要任何内容編輯,保持預設!
vim /etc/hosts.allow
sshd:192.168.1.,192.168.9.,124.65.197.154,61.148.60.42,103.10.86.7:allow
sshd:all:deny
4、僅允許特定的使用者通過SSH登陸
如不允許root使用者登入;
隻允許幾個指定的使用者登入(比如wangshibo、guohuihui、liuxing使用者)
禁止某些指定的使用者登入(比如zhangda,liqin使用者)
但是要注意:設定的這幾個使用者必須同時存在于本機和對方機器上
修改ssh服務配置檔案/etc/ssh/sshd_config
PermitRootLogin no //将yes修改為no
AllowUsers wangshibo guohuihui liuxing //這個參數AllowUsers如果不存在,需要手動建立,使用者之間空格隔開;
DenyUsers zhagnda liqin //這個參數DenyUsers如果不存在,需要手動建立,使用者之間空格隔開;
也可以設定僅允許某個組的成員通過ssh通路主機。
AllowGroups wheel ops
5、取消密碼驗證,隻用密鑰對驗證
PasswordAuthentication no
PubkeyAuthentication yes
6、給賬号設定複雜的密碼:将密碼儲存到文本進行複制和粘帖就可以了
#rpm -ivh expect-5.43.0-5.1.i386.rpm| yum -y install expect
mkpasswd -l 128 -d 8 -C 15 -s 10 //将下面密碼儲存到文本進行複制、粘貼即可
lVj.jg&sKrf0cvtgmydqo7qPotxzxen9mefy?ej!kcaX2gQrcu2ndftkeamllznx>iHikTagiVz0$cMtqOcIypkpd,vvD*kJhs3q@sb:CiCqgtqdqvse5lssfmranbtx
參數說明:
-l 密碼長度
-d 多少個數字
-C 大寫字母個數
-s 特殊符号的個數
7、隻允許通過指定的網絡接口來通路SSH服務,(如果本伺服器有多個IP的時候)
仍然是修改/etc/ssh/sshd_config,如下:
ListenAddress 192.168.1.15 //預設監聽的是0.0.0.0
這樣,就隻允許遠端機器通過ssh連接配接本機的192.168.1.15内網ip來進行登陸了。
8、禁止空密碼登入
如果本機系統有些賬号沒有設定密碼,而ssh配置檔案裡又沒做限制,那麼遠端通過這個空密碼賬号就可以登陸了,這是及其不安全的,是以一定要禁止空密碼登陸。修改/etc/ssh/sshd_config,如下:
PermitEmptyPasswords no //這一項,預設就是禁用空密碼登陸
9、 ssh_config和sshd_config
ssh_config和sshd_config都是ssh伺服器的配置檔案,二者差別在于,前者是針對用戶端的配置檔案,後者則是針對服務端的配置檔案。兩個配置檔案都允許你通過設定不同的選項來改變用戶端程式的運作方式。
三、ssh配置檔案詳解
1、/etc/ssh/ssh_config配置檔案
2、/etc/ssh/sshd_config配置檔案
四、ssh練習
1、配置ssh隻能使用key登入
(1)、遠端主機的配置過程(主機192.168.10.13)
①修改主機192.168.10.13的配置檔案,使其支援使用ssh私鑰登入
Vim /etc/ssh/sshd_config
取消下面三行的注釋,如圖1所示
RSAAuthentication yes ##設定是否使用RSA算法進行安全驗證
PubkeyAuthentication yes ##是否允許 Public Key ?隻有 version 2
AuthorizedKeysFile .ssh/authorized_keys ##設定若要使用不需要密碼登入的賬号時,那麼那個賬号的存放檔案所在檔名!
圖1、取消相關注釋
重新開機sshd服務即可
②關閉root使用者使用密碼登入
修改主機192.168.10.13的配置檔案/etc/ssh/sshd_config,将PasswordAuthentication 後面的yes改為no,如圖2所示
PasswordAuthentication no ##設定是否使用密碼驗證
圖2、把yes改為no
(2)本機的配置過程(主機192.168.10.11)
①使用ssh-keygen生成公鑰和私鑰,如圖3所示
圖3、ssh-keygen生成公鑰和私鑰
②直接使用ssh密碼登入來驗證剛剛的配置是否成功
在主機192.168.10.11上,ssh 192.168.10.13我們可以發現ssh不進去了,如圖4所示
圖4、驗證使用密碼是否ssh成功
③将主機192.168.10.11的公鑰上傳到主機192.168.10.13上
a.安裝lrzsz服務
Yum install –y lrzsz
b.使用sz指令下載下傳公鑰,如圖5所示
圖5、下載下傳公鑰
c.将公鑰上傳要主機192.168.10.13上,如圖6所示
圖6、上傳公鑰
d.将公鑰追加到檔案authorized_keys裡
[root@localhost ~]# cat id_rsa.pub >> /root/.ssh/authorized_keys
e.在主機192.168.10.11上驗證是否能夠成功ssh到主機192.168.10.13上,如圖7所示
圖7、成功ssh到主機192.168.10.13
2、指定可以登入的主機和不可以登入的主機
(1)方法一、修改檔案/etc/hosts.allow和/etc/hosts.deny
①修改主機192.168.10.13的檔案/etc/hosts.allow和/etc/hosts.deny
在檔案/etc/hosts.allow添加一條允許主機192.168.10.11 ssh的記錄,如圖8所示
圖8、允許主機192.168.10.11 ssh
在檔案/etc/hosts.deny添加一條拒絕主機192.168.10.12 ssh的記錄,如圖9所示
圖9、拒絕主機192.168.10.12 ssh
②驗證
在主機192.168.10.11上驗證成功ssh到主機192.168.10.13上,如圖10所示
圖10、主機192.168.10.11成功ssh到主機192.168.10.13
在主機192.168.10.12上驗證不能ssh到主機192.168.10.13上,如圖11所示
圖11、主機192.168.10.12不能ssh到主機192.168.10.13
(2)方法二、修改檔案/etc/ssh/sshd_config
①修改檔案/etc/ssh/sshd_config,在最後面添加如圖12所示的兩行,然後重新開機sshd服務
圖12、添加的内容
AllowUsers [email protected] ##允許主機192.168.10.11 ssh登入
DenyUsers [email protected] ##禁止主機192.168.10.12 ssh登入
在主機192.168.10.11上驗證成功ssh到主機192.168.10.13上,如圖13所示
圖13、主機192.168.10.11成功ssh到主機192.168.10.13
在主機192.168.10.12上驗證不能ssh到主機192.168.10.13上,如圖14所示
圖14、主機192.168.10.12不能ssh到主機192.168.10.13
③檢視Linux日志中有關ssh登入成功和登入失敗的日志
ssh的日志存放在檔案/var/log/ secure裡
例如:
檢視ssh登入失敗的日志,如圖15所示
圖15、ssh登入失敗日志
檢視通過RSA成功ssh的日志,如圖16所示
圖16、通過RSA成功ssh的日志
五、在SecureCRT上配置公鑰的方法
在SecureCRT上配置公鑰的方法:
1、首先生成公鑰。
打開SecureCRT程式,點選菜單欄的“工具”-》“建立公鑰”。按照步驟執行。其中一步比較重要就是選擇公鑰的格式。建議選擇“OpenSSH”,否則在伺服器端使用時需要轉換為OpenSSH格式。如果選錯了。重新生成一次就可以了。然後選擇公鑰私鑰存放的地方。預設Identity是私鑰,Identity.pub是公鑰。
2、把Identity.pub檔案上傳到你要登陸的Linux伺服器上。方法有很多,比如ssh(先不要配置為公鑰登陸),ftp等。上傳時選擇ASCII方式。
3、在SecureCRT建立伺服器連接配接。協定使用ssh。在“鑒權”方法中,取消勾選“密碼”。選擇“公鑰”,然後點選右邊的屬性按鈕,在對話框中。
使用全局公鑰設定:表示所有連接配接都使用該公鑰連接配接伺服器。
使用會話公鑰設定:可以分别為每個連接配接指定不同的公鑰。
下面的路徑就是指明私鑰的具體路徑。注意了,這裡要指明私鑰的路徑。
儲存連接配接就可以了。
抟扶搖而上者九萬裡