最近一個月沒有寫過文章,主要是剛剛換的新工作。新公司伺服器OS使用的是ubuntu server版,和以前熟悉的centos還是有很多不同的。
剛好這幾天有時間,也是工作需要,學習了下有關ssh密鑰的知識。
在平時的工作中,我們登陸伺服器,一般是使用ssh密碼的方式。其實還有一種方式,那就是通過ssh密鑰登陸伺服器。
這兩種方法都是ssh的安全驗證方式,,根據驗證方式的不同我們把其分為:基于密碼的安全驗證和基于密鑰的安全驗證。
注意:在一些文章中提到的ssh證書,其實就是ssh密鑰。
一、ssh兩種安全驗證介紹
通過以上介紹,我們知道了ssh有兩種安全驗證方式,下面我們一一介紹其工作原理。
1.1 基于密碼的安全驗證
這種方式,隻需要知道遠端伺服器的帳号和密碼,就可以登入到遠端伺服器。所有傳輸的資料都會被加密,但是不能保證你正在連接配接的伺服器就是你想連接配接的伺服器。可能會有别的伺服器在冒充真正的伺服器,也就是說這種方式的連接配接有可能會受到“中間人”這種方式的攻擊。
1.2 基于密鑰的安全驗證
這種方式,需要依靠密鑰,也就是說你必須為自己建立一對密鑰對(公鑰和私鑰),并且把該公鑰放到需要通路的伺服器上。
注意:不能在需要通路的伺服器上建立密鑰,否則無法通過該密鑰連接配接該伺服器,但是通過該密鑰連接配接其他伺服器是正常的。
如果你要連接配接到ssh伺服器,ssh用戶端會向ssh伺服器送出請求,請求用你的密鑰進行安全驗證。ssh伺服器在收到該請求之後,會先在ssh伺服器上,檢查你登陸的使用者的主目錄下尋找對應的公鑰,然後把它和你發送過來的公鑰進行比較。如果兩個公鑰一緻,ssh伺服器就用公鑰加密“質詢”(challenge)并把它發送給ssh用戶端。ssh用戶端在收到“質詢”之後就可以用你的私鑰解密該“質詢”,再把它發送給ssh伺服器。
這種安全驗證方式,你必須知道自己密鑰的加密密碼。當然,自己的密鑰也可以不加密,而且這種不加密密鑰的方式,在平時工作中使用的也比較多。
通過以上對比,我們可以很容易看出。與基于密碼的安全驗證相比,基于密鑰的安全驗證是不需要在網絡上傳輸密碼。除此之外,我們還可以看出,“中間人”這種攻擊方式也是不可能的(因為他沒有你的私鑰)。
二、測試ssh無密碼登陸
在第一章中我們介紹了,ssh的兩種安全驗證方式。要達到ssh無密碼登陸伺服器,我們就要使用ssh密鑰驗證這種方式。
PS:本次試驗OS為Ubuntu 14.04.02 64bit,如下:
uname –a
cat /etc/issue
<a href="http://s3.51cto.com/wyfs02/M02/6C/D3/wKioL1VTVnjS-TlnAADvHS49Pr4615.jpg" target="_blank"></a>
2.1建立ssh密鑰
通過第一章我們知道了,要使用ssh密鑰驗證。我們必須要建立一個ssh密鑰對。
ssh密鑰的建立,我們可以有兩種方式。第一就是在linux OS上通過ssh-kengen這個指令來建立,第二就是在windows下通過ssh用戶端工具來建立。
下面我們對其建立密鑰的方法一一進行介紹,如下。
2.1.1 通過ssh-kengen指令建立密鑰
使用ssh-kengen指令建立ssh密鑰很簡單,直接使用該指令建立即可。如下:
ssh-keygen
<a href="http://s3.51cto.com/wyfs02/M00/6C/D3/wKioL1VTVnjT3PVEAAHoYDH6R4U591.jpg" target="_blank"></a>
通過上圖,我們可以很明顯的看出剛剛新建立的密鑰存放在/home/ilanni/.ssh目錄下,而且私鑰檔案是id_rsa,公鑰檔案是id_rsa.pub。
除此之外,我們還需要注意ssh-kengen指令中:
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
這兩行是表示設定私鑰的加密密碼,我們在此是沒有設定私鑰的加密密碼。
現在我們來檢視密鑰的檔案屬性,如下:
ll .ssh/
<a href="http://s3.51cto.com/wyfs02/M01/6C/D3/wKioL1VTVnmj17ATAADWgj2LEzg087.jpg" target="_blank"></a>
通過上圖,我們可以很明顯的看出:
.ssh目錄的使用者權限是700,私鑰id_rsa的權限是600,公鑰id_rsa.pub的權限是644。
注意:有關私鑰id_rsa和公鑰id_rsa.pub檔案權限非常重要,如果權限沒有設定對的話,在使用ssh密鑰登陸時,系統還是會提示需要輸入密碼。
ssh-keygen預設使用的密鑰加密類型是rsa,這個我們可以通過檢視公鑰檔案id_rsa.pub得知。如下:
cat .ssh/id_rsa.pub
<a href="http://s3.51cto.com/wyfs02/M02/6C/D3/wKioL1VTVnqjmkEJAADqHlK7BUY952.jpg" target="_blank"></a>
如果要使用其他類型的加密方式,我們可以通過ssh-keygen的-t參數來指定使用的加密類型。如下:
ssh-keygen -t dsa
<a href="http://s3.51cto.com/wyfs02/M00/6C/D3/wKioL1VTVnvyoIXRAAGlowrn8vI883.jpg" target="_blank"></a>
cat .ssh/id_dsa.pub
<a href="http://s3.51cto.com/wyfs02/M01/6C/D3/wKioL1VTVnzTU_4TAADVsjkPkFc980.jpg" target="_blank"></a>
有關ssh-kengen指令的詳細使用方法,我們可以通過檢視ssh-kengen的幫助指令獲得。如下:
ssh-keygen --help
<a href="http://s3.51cto.com/wyfs02/M02/6C/D3/wKioL1VTVn2AqTQLAAOt0QXIvbA186.jpg" target="_blank"></a>
注意:該密鑰是在192.168.1.8機器上生成的,如下:
hostname
ifconfig
<a href="http://s3.51cto.com/wyfs02/M00/6C/D3/wKioL1VTVoGyYQhVAAGIJgfTGRU049.jpg" target="_blank"></a>
2.1.2 通過xshell建立密鑰
windows下ssh用戶端的連接配接工具比較多,但是我使用最多的還是xshell這個工具。
下面我們就通過xshell工具,來建立ssh的密鑰。
打開xshell,點選“工具”--“建立使用者密鑰生成向導”,如下:
<a href="http://s3.51cto.com/wyfs02/M01/6C/D3/wKioL1VTVoKzifseAAGODZAW4Cg109.jpg" target="_blank"></a>
下面這個界面,我們可以選擇密鑰的類型和密鑰的長度,如下:
<a href="http://s3.51cto.com/wyfs02/M02/6C/D3/wKioL1VTVoPBRXo1AAGqiCKLWpo723.jpg" target="_blank"></a>
生成密鑰對,如下:
<a href="http://s3.51cto.com/wyfs02/M00/6C/D3/wKioL1VTVoTQcrC8AAHAZW8_RnA904.jpg" target="_blank"></a>
輸入密鑰名稱以及密鑰的加密密碼,如下:
<a href="http://s3.51cto.com/wyfs02/M01/6C/D3/wKioL1VTVoXzi0LbAAF_WAEj-iA665.jpg" target="_blank"></a>
注意:這個密鑰的加密密碼就是ssh私鑰的加密密碼,我們可以為空。
為了下面試驗區分通過ssh-kengen生成的密鑰id_rsa,在此密鑰的名稱我們命名為id_rsa_1024。
生成公鑰,如下:
<a href="http://s3.51cto.com/wyfs02/M02/6C/D3/wKioL1VTVofCoVQEAAH85uduxNo303.jpg" target="_blank"></a>
公鑰生成後,我們需要把該公鑰儲存到一個檔案中。如下:
<a href="http://s3.51cto.com/wyfs02/M02/6C/D8/wKiom1VTVRHBMozwAAI3-loKhfc473.jpg" target="_blank"></a>
公鑰儲存完畢後,xshell就會跳轉到私鑰的界面。如下:
<a href="http://s3.51cto.com/wyfs02/M00/6C/D8/wKiom1VTVRKQukLUAAEhEOvzwys743.jpg" target="_blank"></a>
通過上圖,我們可以看到目前私鑰的名稱就是我們前面命名的id_rsa_1024,而且密鑰的長度是1024位元組。
現在我們來導出該私鑰,如下:
<a href="http://s3.51cto.com/wyfs02/M01/6C/D8/wKiom1VTVRPDRJweAAKtrFOu-Jw123.jpg" target="_blank"></a>
這樣我們就得到了一對ssh密鑰,如下:
<a href="http://s3.51cto.com/wyfs02/M02/6C/D8/wKiom1VTVRSDw4ekAABaI_oYXPs417.jpg" target="_blank"></a>
2.2 上傳ssh公鑰
在2.1章節中,我們已經建立好了ssh的公鑰與私鑰,現在我們開始把公鑰上傳到需要被通路的伺服器上,即ssh伺服器上。
在把公鑰上傳到ssh伺服器上,我們還有幾件事要做:
1)、确定要登陸ssh伺服器的使用者
2)、修改ssh伺服器的ssh配置檔案sshd_config
3)、建立authorized_keys檔案
4)、上傳公鑰并把内容重定向到authorized_keys檔案
注意:本章節是在192.168.1.7機器上操作,如下:
<a href="http://s3.51cto.com/wyfs02/M00/6C/D8/wKiom1VTVRWi_j3iAAF6WPo1g6s940.jpg" target="_blank"></a>
2.2.1 确定要登陸ssh伺服器的使用者
因為我們是要免密碼登陸ssh伺服器,是以我們必須要确定使用哪一個使用者登陸ssh伺服器。
注意:該使用者一定要在ssh伺服器存在,并且是可以登陸ssh伺服器的。
在此我們使用的是ilanni這個使用者登陸ssh伺服器的。如下:
whoami
cat /etc/passwd |grep ilanni
<a href="http://s3.51cto.com/wyfs02/M01/6C/D8/wKiom1VTVRawHbbTAADI7hMChz0110.jpg" target="_blank"></a>
2.2.2 修改ssh配置
ssh存放使用者登陸的公鑰是通過sshd_config檔案配置的,但是預設該選項是沒有啟用的。需要我們通過修改sshd_config檔案來啟用,如下:
sudo vi /etc/ssh/sshd_config
<a href="http://s3.51cto.com/wyfs02/M02/6C/D8/wKiom1VTVReipBSHAAE9IPWbuf0048.jpg" target="_blank"></a>
我們隻需要把#AuthorizedKeysFile %h/.ssh/authorized_keys行前的#去掉即可。如下:
<a href="http://s3.51cto.com/wyfs02/M00/6C/D8/wKiom1VTVRjghZIUAAE7OMFHjkk525.jpg" target="_blank"></a>
AuthorizedKeysFile存放該使用者可以用來登入的RSA/DSA公鑰。該指令中%h表示使用者的主目錄,最後公鑰會存放到主目錄的.ssh/authorized_keys檔案中。
注意:這個步驟不是必須的,因為通過ssh-copy-id指令進行配置時,就無需修改ssh配置檔案。
2.2.3 建立authorized_keys檔案
在上一章節中,我們知道了使用者的公鑰是存放在authorized_keys檔案中的,現在我們來建立該檔案。
先建立.ssh目錄并修改其使用者屬性,如下:
mkdir .ssh
chmod 700 .ssh
<a href="http://s3.51cto.com/wyfs02/M01/6C/D8/wKiom1VTVRmDnBAwAAH2KIvwYSQ469.jpg" target="_blank"></a>
.ssh目錄建立完畢後,我們現在來建立authorized_keys檔案。如下:
touch authorized_keys
<a href="http://s3.51cto.com/wyfs02/M02/6C/D8/wKiom1VTVRqhifWMAAELsZG5p8w275.jpg" target="_blank"></a>
2.2.4 把公鑰内容重定向到authorized_keys檔案
在2.1章節中,我們介紹了ssh密鑰的生成方法。一是通過ssh-kengen指令生成,二是通過xshell生成。
我們現在把這兩個公鑰都上傳到192.168.1.7機器上,然後重定向到authorized_keys檔案中。如下:
<a href="http://s3.51cto.com/wyfs02/M00/6C/D8/wKiom1VTVRuB_E3PAACzpyW430A623.jpg" target="_blank"></a>
把192.168.1.8公鑰複制到192.168.1.7機器上,如下:
scp .ssh/id_rsa.pub [email protected]:/home/ilanni
<a href="http://s3.51cto.com/wyfs02/M01/6C/D3/wKioL1VTVpaTnxUAAAFd1DRj9oA226.jpg" target="_blank"></a>
把xshell生成的公鑰上傳到192.168.1.7上,如下:
<a href="http://s3.51cto.com/wyfs02/M01/6C/D8/wKiom1VTVR2A8sO2AAIMu01_hhg377.jpg" target="_blank"></a>
現在把兩個公鑰都重定向到authorized_keys檔案,如下:
cat id_rsa.pub >.ssh/authorized_keys
cat id_rsa_1024.pub>>.ssh/authorized_keys
cat .ssh/authorized_keys
<a href="http://s3.51cto.com/wyfs02/M01/6C/D8/wKiom1VTVR6wbztMAAGNtNZIUJ0706.jpg" target="_blank"></a>
2.3 連接配接ssh伺服器
公鑰上傳完畢後,我們來連接配接ssh伺服器,也就是連接配接192.168.1.7機器。
連接配接192.168.1.7,我們也可以分為linux和windows,下面對其連接配接方法一一講解。
2.3.1 在linux上連接配接ssh伺服器
我們先在linux機器192.168.1.8上連接配接192.168.1.7,如下:
ifconfig eth0|grep "inet addr"|awk '{print $2}'|cut -d: -f2
<a href="http://s3.51cto.com/wyfs02/M02/6C/D8/wKiom1VTVR-hKJSBAAJqbMQVyyQ741.jpg" target="_blank"></a>
通過上圖,我們可以很明顯的看出在192.168.1.8上連接配接192.168.1.7時,系統沒有提示我們輸入密碼。
這也就實作了,我們免密碼登陸ssh伺服器的功能。
2.3.2 在windows上連接配接ssh伺服器
我們現在切換到windows系統上,來連接配接192.168.1.7。 ssh用戶端工具,我們使用的還是xshell,還是在生成密鑰的那台windows機器上。如下:
<a href="http://s3.51cto.com/wyfs02/M00/6C/D8/wKiom1VTVSCjym3BAAH1i7Y6tnU545.jpg" target="_blank"></a>
注意:使用者身份驗證方法,在此我們需要選擇的是Public Key也就是密鑰驗證方式,并且使用者密鑰就是我們前面生成時的密鑰時的私鑰id_rsa_1024。
<a href="http://s3.51cto.com/wyfs02/M01/6C/D8/wKiom1VTVSGjzJheAAKl9zRXCIk921.jpg" target="_blank"></a>
通過上圖,我們可以很明顯的看到在windows用戶端連接配接192.168.1.7,系統也沒有要求我們輸入密碼,這也就實作了ssh的無密碼登陸。
2.4 使用ssh-copy-id上傳ssh公鑰
看了第2.2章節有關上傳ssh公鑰,你是不是覺得很麻煩。其實ssh還給我們提供了另外一個指令ssh-copy-id,ssh-copy-id指令可以把上述的步驟一次性執行完畢。
注意:ssh-copy-id指令隻存在于linux系統中,目前沒有發現windows系統的ssh用戶端工具有該指令。
ssh-copy-id指令使用方法,如下:
ssh-copy-id -i .ssh/id_rsa.pub [email protected]
<a href="http://s3.51cto.com/wyfs02/M02/6C/D3/wKioL1VTVp_zDgBdAAIlSvSSJt4514.jpg" target="_blank"></a>
<a href="http://s3.51cto.com/wyfs02/M00/6C/D3/wKioL1VTVqCDRiDQAADfgWO9qOk146.jpg" target="_blank"></a>
登陸192.168.1.9,檢視公鑰。如下:
ll --full-time .ssh/
<a href="http://s3.51cto.com/wyfs02/M01/6C/D3/wKioL1VTVqHD6kXvAAE7IhcwyAM308.jpg" target="_blank"></a>
<a href="http://s3.51cto.com/wyfs02/M01/6C/D8/wKiom1VTVSfiDDH0AADWtLnPqBc237.jpg" target="_blank"></a>
通過以上兩張截圖,我們很明顯的看出,使用ssh-copy-id指令可以直接在ssh伺服器對應使用者的家目錄下建立.ssh目錄,并且在該目錄下建立authorized_keys檔案。同時也會把公鑰id_rsa.pub檔案中的内容,複制到authorized_keys檔案中。
檢視ssh配置檔案是否修改。如下:
cat /etc/ssh/sshd_config |grep authorized_keys
<a href="http://s3.51cto.com/wyfs02/M02/6C/D8/wKiom1VTVSizsPQKAACuI78vqlM221.jpg" target="_blank"></a>
通過上圖,我們可以很明顯的看出ssh-copy-id沒有修改ssh配置。
現在我們來連接配接192.168.1.9測試下,如下:
<a href="http://s3.51cto.com/wyfs02/M01/6C/D3/wKioL1VTVqPjsw-YAAHPmGtfp0w499.jpg" target="_blank"></a>
通過上圖,我們可以很明顯的看到即使不修改ssh的配置檔案,隻要有authorized_keys檔案,也能實作ssh的無密碼登陸。
有關ssh-copy-id詳細的使用方法,可以檢視其幫助指令。如下:
ssh-copy-id -h
<a href="http://s3.51cto.com/wyfs02/M02/6C/D3/wKioL1VTVqSDF844AADOV336WDA852.jpg" target="_blank"></a>
以上就是有關ssh無密碼登陸的全部内容。
本文轉自 爛泥行天下 51CTO部落格,原文連結:http://blog.51cto.com/ilanni/1651103