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的時候,需要輸入用戶名和密碼,就是基於口令的驗證。
其過程:
應對中間人攻擊,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
[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 ~]
#
[root@Server-A ~]
# echo"192.168.0.200 Server-A">> /etc/hosts
[root@Server-A ~]
# echo "192.168.0.201 Server-B" >> /etc/hosts
[root@Server-A ~]
# ssh-copy-id root@192.168.0.201

對於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.
#直接通過命令完成.推薦使用,但是並不是每台機器上都會裝有這個命令.
|