SSH的全稱是Secure Shell,簡單說來ssh是一種安全的外殼協議,用於兩個計算機間安全的遠程登錄,說它安全,是由於ssh採用公鑰加密的機制。最開始時用做遠程管理的工具是telnet,這個協議工做時在網絡上傳輸的數據全是明文,出於安全性的考慮,此協議的使用率愈來愈少。而ssh的安全性使用它成爲一種互聯網上遠程登錄主機的解決方案。在windows系統上經常使用到的有Putty、SecureCRT、XManager中的Xshell工具,而XManager工具是我見到的IT工做者中使用頻率極高的一個工具,在windows上好像沒有ssh協議的服務器端的實現,ssh協議的實現也分爲商業的實現和開源的實現,在這裏將是對ssh協議的一個開源實現的學習與記錄。Openssh便是Linux系統下開源的實現,它開放且免費。linux
從客戶端來看,SSH提供兩種級別的安全驗證。算法
第一種級別(基於用戶名和口令的安全驗證)只要你知道本身賬號和口令,就能夠登陸到遠程主機。全部傳輸的數據都會被加密,可是不能保證你正在鏈接的服務器就是你想鏈接的服務器。可能會有別的服務器在冒充真正的服務器,也就是受到「中間人」這種方式的攻擊。shell
第二種級別(基於密匙的安全驗證也叫基於公鑰的驗證)須要依靠密匙,也就是你必須爲本身建立一對密匙,並把公用密匙放在須要訪問的服務器上。若是你要鏈接到SSH服務器上,客戶端軟件就會向服務器發出請求,請求用你的密匙進行安全驗證。服務器收到請求以後,先在你在該服務器的家目錄下尋找你的公用密匙,而後把它和你發送過來的公用密匙進行比較。若是兩個密匙一致,服務器就用公用密匙加密「質詢」(challenge)並把它發送給客戶端軟件。客戶端軟件收到「質詢」以後就能夠用你的私人密匙解密再把它發送給服務器。windows
用這種方式,你必須知道本身密匙的口令。可是,與第一種級別相比,第二種級別不須要在網絡上傳送口令。安全
上述2種方式通常選其一。bash
putty這2種都支持,咱們通常用putty的時候,須要輸入用戶名和密碼,就是基於口令的驗證。服務器
其過程:網絡
應對中間人攻擊,SSH有2種方法應對,一是遠程主機把本身的公鑰拿到CA處作認證,申請一個數字證書;二是遠程主機把本身公鑰的指紋信息公佈出來,好比公佈在網站上,你們均可查看到公鑰的指紋信息。這樣用戶在登錄時就能夠鑑別主機的真僞了。提取主機的指紋信息的方法以下:dom
[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去遠程鏈接時就可對比一下指紋信息是否是同樣,若是是同樣的那就能證實我鏈接的是真實的主機。ssh
在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.
#直接經過命令完成.推薦使用,可是並非每臺機器上都會裝有這個命令.
|