linux之openssh協議


 

SSH的全稱是Secure Shell,簡單說來ssh是一種安全的外殼協議,用於兩個計算機間安全的遠程登陸,說它安全,是因為ssh采用公鑰加密的機制。最開始時用作遠程管理的工具是telnet,這個協議工作時在網絡上傳輸的數據全是明文,出於安全性的考慮,此協議的使用率越來越少。而ssh的安全性使用它成為一種互聯網上遠程登陸主機的解決方案。在windows系統上常用到的有Putty、SecureCRT、XManager中的Xshell工具,而XManager工具是我見到的IT工作者中使用頻率極高的一個工具,在windows上好像沒有ssh協議的服務器端的實現,ssh協議的實現也分為商業的實現和開源的實現,在這里將是對ssh協議的一個開源實現的學習與記錄。Openssh即是Linux系統下開源的實現,它開放且免費。

 

從客戶端來看,SSH提供兩種級別的安全驗證。

第一種級別(基於用戶名和口令的安全驗證)只要你知道自己帳號和口令,就可以登錄到遠程主機。所有傳輸的數據都會被加密,但是不能保證你正在連接的服務器就是你想連接的服務器。可能會有別的服務器在冒充真正的服務器,也就是受到“中間人”這種方式的攻擊。

第二種級別(基於密匙的安全驗證也叫基於公鑰的驗證)需要依靠密匙,也就是你必須為自己創建一對密匙,並把公用密匙放在需要訪問的服務器上。如果你要連接到SSH服務器上,客戶端軟件就會向服務器發出請求,請求用你的密匙進行安全驗證。服務器收到請求之后,先在你在該服務器的家目錄下尋找你的公用密匙,然后把它和你發送過來的公用密匙進行比較。如果兩個密匙一致,服務器就用公用密匙加密“質詢”(challenge)並把它發送給客戶端軟件。客戶端軟件收到“質詢”之后就可以用你的私人密匙解密再把它發送給服務器。

用這種方式,你必須知道自己密匙的口令。但是,與第一種級別相比,第二種級別不需要在網絡上傳送口令。

上述2種方式一般選其一。

putty這2種都支持,我們一般用putty的時候,需要輸入用戶名和密碼,就是基於口令的驗證。

其過程:

wKioL1LbXejDpvOFAAZV7FsCDpY940.jpg

 

 

應對中間人攻擊,SSH有2種方法應對,一是遠程主機把自己的公鑰拿到CA處做認證,申請一個數字證書;二是遠程主機把自己公鑰的指紋信息公布出來,比如公布在網站上,大家都可查看到公鑰的指紋信息。這樣用戶在登陸時就可以鑒別主機的真偽了。提取主機的指紋信息的方法如下:

[root@Server-A ~]# ssh-keygen -lf/etc/ssh/ssh_host_dsa_key.pub 
102439:61:e5:80:e8:09:b3:83:10:39:c8:b4:5e:ca:45:7e /etc/ssh/ssh_host_dsa_key.pub(DSA)

遠程主機可以把這個采用dsa算法的指紋信息發布在一個網站上,那我用xshell去遠程連接時就可對比一下指紋信息是不是一樣,如果是一樣的那就能證明我連接的是真實的主機。

在linux下用ssh方式登陸另一linux主機時,如果第一次登陸會有如下的提示:

[root@Server-A~]# ssh 192.168.0.201
Theauthenticity of host '192.168.0.201 (192.168.0.201)' can't be established.
RSAkey fingerprint is 4c:a3:2f:29:69:86:f6:0f:38:25:8c:7c:7c:3b:d5:91.
Areyou sure you want to continue connecting (yes/no)?

表示的意義與用xshell登陸時的提示相同,輸入“yes”,再輸入遠程主機的口令即可登陸,登陸成功后本地主機會生成“~/.ssh/known_hosts”文件,這文件里保存着遠程主機的公鑰信息,這樣下次再遠程登陸時就不需要發送公鑰信息了,直接輸入口令即可。

 

基於公鑰的認證:

    基於用戶口令的認證方式每次都要求用戶提供正確的口令,比較麻煩,且增加了口令泄露的機率。而基於公鑰的認證則不需要用戶輸入口令即可完成遠程登陸。這種認證方式是這樣工作的:用戶把自己的公鑰存儲在遠程主機上,在登陸時,遠程主機向用戶發送一段隨機字符串,用戶用自己的私鑰加密這段隨機數字,並把加密后的信息發送給遠程主機,遠程主機用事先存儲的公鑰來解密這個數據,如果解密成功,則說明請求登陸的用戶是可信任的,這樣就直接允許用戶登陸,而不要求輸入密碼了。這種認證方式需要把用戶自己的公鑰保存到遠程主機上。若沒有現成的公鑰,那就生成:

[root@Server-A~]# ssh-keygen -t rsa
Generatingpublic/private rsa key pair.
Enterfile in which to save the key (/root/.ssh/id_rsa): 
Enterpassphrase (empty for no passphrase): 
Entersame passphrase again: 
Youridentification has been saved in /root/.ssh/id_rsa.
Yourpublic key has been saved in /root/.ssh/id_rsa.pub.
Thekey fingerprint is:
9b:ef:2c:6a:92:05:c7:f4:4b:b8:4e:b4:ce:05:2f:0croot@Server-A
Thekey's randomart image is:
+--[RSA 2048]----+
|                 |
|      .         |
|     o o        |
|    E * o       |
|     * *S.      |
|      B +o      |
|     B oo       |
|    o = .o      |
|     o.. o+     |
+-----------------+
[root@Server-A~]# ls .ssh/
id_rsa  id_rsa.pub known_hosts
 
此時在家目錄下的“./ssh”目錄下生成了兩個文件,一個id_rsa(私鑰文件),id_rsa.pub(公鑰文件)。接着把公鑰文件拷貝到遠程主機:

[root@Server-A ~]# scp .ssh/id_rsa.pub 192.168.0.201:/root/.ssh/authorized_keys

這里的“authorized_keys”這個文件名不能更改,這是由“/etc/ssh/sshd_config”文件定義的。

測試一下能否不輸入密碼就能遠程登陸Server_B主機:

[root@Server-A ~]# ssh 192.168.0.201
Address 192.168.0.201 maps to bogon, butthis does not map back to the address - POSSIBLE BREAK-IN ATTEMPT!
[root@Server-B ~]#
沒錯,成功了,但有報告信息,這是因為在/etc/hosts文件里沒有增加兩主機的映射關系,增加就可以了,在兩主機中的“/etc/hosts”文件中都增加以下兩行:
[root@Server-A ~]# echo"192.168.0.200  Server-A">> /etc/hosts
[root@Server-A ~]# echo "192.168.0.201  Server-B" >> /etc/hosts
上邊用“scp”命令直接把主機的公鑰文件拷貝到遠程主機用戶家目錄下的“root/.ssh/authorized_keys”,其實還有一個更好的方法,ssh為我們提供了一個客戶端工具,即“ssh-copy-id”,這個工具能將本地主機的公鑰自動拷貝到遠程主機上生成“authorized_keys”文件,且會讓這個文件的權限為“600”這樣更為安全,此命令的用法如下:
[root@Server-A ~]# ssh-copy-id root@192.168.0.201
建議用這個命令來實現無密碼公鑰登陸,因為用“scp”命令把公鑰拷貝到遠程主機后,不會把authorized_keys文件的權限修改成“600”,在某些linux版本下是無法實現基於公鑰登陸的。
 
wKioL1LbXg6i3chIAAWteYRXX8g912.jpg
 
 

 對於openssh,我們需要關注的配置文件分為兩類,一類是公共配置文件,另一類是私有配置文件。公共配置文件又分為服務端的配件文件和客戶端的配置文件。

/etc/ssh/sshd_config   #服務端配置文件

/etc/ssh/ssd_config    #客戶端配置文件

~/.ssh/*               #私有配置文件

我們主要關注的是服務端的配置文件和私有配置文件。

 

SSH的配置文件主要分為服務器端和客戶端:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
     服務器端:/etc/ssh/sshd_config
     客戶端:/etc/ssh/ssh_config
 1.限制root用戶遠程登錄
     # vi /etc/ssh/sshd_config
     PermitRootLogin no
 2.通過控制用戶訪問限制 SSH 訪問
     # vi /etc/ssh/sshd_config
     AllowUsers fsmythe bnice swilson
     DenyUsers jhacker joebadguy jripper
 3.# vi /etc/ssh/sshd_config
     Protocol 2
 4.不要支持閑置會話,並配置 Idle Log Out Timeout 間隔:
#當客戶端連上服務器端后,若沒有任何操作則,服務器端默認會
#每隔一定時間發送一個alive消息給客戶端尋求客戶端應答,
#默認一共發三次.若都沒有回應,則斷開連其中           
#ClientAliveInterval設置每隔多少秒發送一次alive消息
#ClientAliveCountMax 設置一共發多少次.
     # vi /etc/ssh/sshd_config
     ClientAliveInterval 600     
     # (Set to 600 seconds = 10 minutes)
     ClientAliveCountMax 0
 5.禁用基於主機的身份驗證:(這種認證方式是不安全的)
     # vi /etc/ssh/sshd_config
     HostbasedAuthentication no
 6.使用 Chroot SSHD 將 SFTP 用戶局限於其自己的主目錄
     # vi /etc/ssh/sshd_config
     ChrootDirectory /home/%u
 7.禁用空密碼:
     # vi /etc/ssh/sshd_config
     PermitEmptyPasswords no
 8.指令壓縮
     Compression {yes|no|delayed}
 #默認是delayed 意思就是等到用戶認證結束后再對數據進行壓縮
 9.設置日志級別
 #LogLevel INFO 默認是INFO級別,調試的時候可以選擇DEBUG
 #級別,這樣調試信息更加詳細
 10.支持圖形界面操作
     X11Forwarding yes
 #對Xwindows的數據進行轉發,開啟該項並使用xshell程序遠程登
 #錄服務器是可以打開圖形界面程序

其它選項:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
PrintMotd no            
# 登入后是否顯示出一些信息呢?例如上次登入的時間、地點等,預設是 yes ,但是,如果為了安全,可以考慮改為 no !
PrintLastLog yes     
# 顯示上次登入的信息!可以啊!預設也是 yes !
KeepAlive yes    
# 一般而言,如果設定這項目的話,那么 SSH Server 會傳送
# KeepAlive 的訊息給 Client 端,以確保兩者的聯機正常!
# 在這個情況下,任何一端死掉后, SSH 可以立刻知道!而不會
# 有僵屍程序的發生!
Banner /to/somefile
# 指定在用戶完成認證前輸出到終端的信息
GSSAPIAuthentication no
#指定是否使用基於GSSAPI的用戶認證默認為no
MaxAuthTries 默認值為6
#每一個鏈接最多嘗試驗證的次數為這個值得一半,此外失敗的信息還會記錄在/var/log/message
UseDNS yes
#是否對主機名進行dns解析(常用與沒有固定IP只有域名的場合)

 

 
 

1.生成密鑰(客戶端操作)

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@wwww ~]# ssh-keygen -t rsa -b 4096
#-t 指定生成密鑰的算法 -b指定密鑰的位數
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
#詢問生成的密鑰放在的位置,默認放在家目錄下的.ssh目錄
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:
e7:60:45:fe:d8:09:24:c1:1e:ef:35:cc:c1:c3:24:e4 root@wwww.axhu.com
#生成的指紋信息

注: 這里使用ssh-keygen -t rsa -b 4096 -f /path/to/KEY_FILE -P '指定加密私鑰的密碼' 這樣既可實現自動化,不要交互了

2.傳送密鑰至遠程服務器
有兩種實現方式:
   方式一:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@wwww ~]# scp ~/.ssh/id_rsa.pub root@192.168.157.132:~/
The authenticity of host '192.168.157.132 (192.168.157.132)' can't be established.
RSA key fingerprint is 6e:0f:f8:f8:c7:c2:11:e6:4d:99:aa:16:6a:81:4a:02.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.157.132' (RSA) to the list of known hosts.
root@192.168.157.132's password:
id_rsa.pub                                                                                   100%  740     0.7KB/s   00:00
然后遠程連接到遠程主機進行設置:
[root@wwww ~]# ssh root@192.168.157.132
root@192.168.157.132's password:
Last login: Sat Jan 18 21:16:49 2014 from 192.168.157.128
[root@bogon ~]# mkdir .ssh
#這個目錄默認不存在,但是這太機子若連接過其他服務器就會自動生成.ssh目錄用來保存known_hosts文件
[root@bogon ~]# chmod 700 .ssh
#這個權限很重要,設置不對的話是沒法通過驗證
[root@bogon ~]# cat id_rsa.pub >> ~/.ssh/authorized_keys
#這里最好每次都是以>>追加的形式輸出,不然會覆蓋其他主機的公鑰
[root@bogon ~]# chmod 600 ~/.ssh/authorized_keys
#修改權限放在其他用戶修改查看
到此配置完成


   方式二:

1
2
3
4
5
6
[root@wwww ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.157.132
root@192.168.157.132's password:
Now try logging into the machine, with "ssh 'root@192.168.157.132'", and check in:
  .ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.
#直接通過命令完成.推薦使用,但是並不是每台機器上都會裝有這個命令.

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM