爛泥:學習ssh之ssh無密碼登陸

本文首發於爛泥行天下

最近一個月沒有寫過文章,主要是剛剛換的新工作。新公司服務器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

clip_p_w_picpath001[5]

2.1創建ssh密鑰

通過第一章我們知道了,要使用ssh密鑰驗證。我們必須要創建一個ssh密鑰對。

ssh密鑰的創建,我們可以有兩種方式。第一就是在linux OS上通過ssh-kengen這個命令來創建,第二就是在windows下通過ssh客戶端工具來創建。

下面我們對其創建密鑰的方法一一進行介紹,如下。

2.1.1 通過ssh-kengen命令創建密鑰

使用ssh-kengen命令創建ssh密鑰很簡單,直接使用該命令創建即可。如下:

ssh-keygen

clip_p_w_picpath002[4]

通過上圖,我們可以很明顯的看出剛剛新創建的密鑰存放在/home/ilanni/.ssh目錄下,而且私鑰文件是id_rsa,公鑰文件是id_rsa.pub

除此之外,我們還需要注意ssh-kengen命令中:

Enter passphrase (empty for no passphrase):

Enter same passphrase again:

這兩行是表示設置私鑰的加密密碼,我們在此是沒有設置私鑰的加密密碼。

現在我們來查看密鑰的文件屬性,如下:

ll .ssh/

clip_p_w_picpath003[4]

通過上圖,我們可以很明顯的看出:

.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

clip_p_w_picpath004[4]

如果要使用其他類型的加密方式,我們可以通過ssh-keygen的-t參數來指定使用的加密類型。如下:

ssh-keygen -t dsa

clip_p_w_picpath005[4]

cat .ssh/id_dsa.pub

clip_p_w_picpath006[4]

有關ssh-kengen命令的詳細使用方法,我們可以通過查看ssh-kengen的幫助命令獲得。如下:

ssh-keygen --help

clip_p_w_picpath007[4]

注意:該密鑰是在192.168.1.8機器上生成的,如下:

hostname

ifconfig

clip_p_w_picpath008[4]

2.1.2 通過xshell創建密鑰

windows下ssh客戶端的連接工具比較多,但是我使用最多的還是xshell這個工具。

下面我們就通過xshell工具,來創建ssh的密鑰。

打開xshell,點擊“工具”--“新建用戶密鑰生成嚮導”,如下:

clip_p_w_picpath009[4]

下面這個界面,我們可以選擇密鑰的類型和密鑰的長度,如下:

clip_p_w_picpath010[4]

生成密鑰對,如下:

clip_p_w_picpath011[4]

輸入密鑰名稱以及密鑰的加密密碼,如下:

clip_p_w_picpath012[4]

注意:這個密鑰的加密密碼就是ssh私鑰的加密密碼,我們可以爲空。

爲了下面試驗區分通過ssh-kengen生成的密鑰id_rsa,在此密鑰的名稱我們命名爲id_rsa_1024。

生成公鑰,如下:

clip_p_w_picpath013[4]

公鑰生成後,我們需要把該公鑰保存到一個文件中。如下:

clip_p_w_picpath014[4]

公鑰保存完畢後,xshell就會跳轉到私鑰的界面。如下:

clip_p_w_picpath015[4]

通過上圖,我們可以看到目前私鑰的名稱就是我們前面命名的id_rsa_1024,而且密鑰的長度是1024字節。

現在我們來導出該私鑰,如下:

clip_p_w_picpath016[4]

這樣我們就得到了一對ssh密鑰,如下:

clip_p_w_picpath017[4]

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機器上操作,如下:

hostname

ifconfig

clip_p_w_picpath018[4]

2.2.1 確定要登陸ssh服務器的用戶

因爲我們是要免密碼登陸ssh服務器,所以我們必須要確定使用哪一個用戶登陸ssh服務器。

注意:該用戶一定要在ssh服務器存在,並且是可以登陸ssh服務器的。

在此我們使用的是ilanni這個用戶登陸ssh服務器的。如下:

whoami

cat /etc/passwd |grep ilanni

clip_p_w_picpath019[4]

2.2.2 修改ssh配置

ssh存放用戶登陸的公鑰是通過sshd_config文件配置的,但是默認該選項是沒有啓用的。需要我們通過修改sshd_config文件來啓用,如下:

sudo vi /etc/ssh/sshd_config

clip_p_w_picpath020[4]

我們只需要把#AuthorizedKeysFile %h/.ssh/authorized_keys行前的#去掉即可。如下:

clip_p_w_picpath021[4]

AuthorizedKeysFile存放該用戶可以用來登錄的RSA/DSA公鑰。該指令中%h表示用戶的主目錄,最後公鑰會存放到主目錄的.ssh/authorized_keys文件中。

注意:這個步驟不是必須的,因爲通過ssh-copy-id命令進行配置時,就無需修改ssh配置文件。

2.2.3 創建authorized_keys文件

在上一章節中,我們知道了用戶的公鑰是存放在authorized_keys文件中的,現在我們來創建該文件。

先創建.ssh目錄並修改其用戶屬性,如下:

mkdir .ssh

chmod 700 .ssh

clip_p_w_picpath022[4]

.ssh目錄創建完畢後,我們現在來創建authorized_keys文件。如下:

touch authorized_keys

clip_p_w_picpath023[4]

2.2.4 把公鑰內容重定向到authorized_keys文件

在2.1章節中,我們介紹了ssh密鑰的生成方法。一是通過ssh-kengen命令生成,二是通過xshell生成。

我們現在把這兩個公鑰都上傳到192.168.1.7機器上,然後重定向到authorized_keys文件中。如下:

clip_p_w_picpath024[4]

把192.168.1.8公鑰複製到192.168.1.7機器上,如下:

scp .ssh/id_rsa.pub [email protected]:/home/ilanni

clip_p_w_picpath025[4]

把xshell生成的公鑰上傳到192.168.1.7上,如下:

clip_p_w_picpath026[4]

現在把兩個公鑰都重定向到authorized_keys文件,如下:

cat id_rsa.pub >.ssh/authorized_keys

cat id_rsa_1024.pub>>.ssh/authorized_keys

cat .ssh/authorized_keys

clip_p_w_picpath027[4]

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,如下:

ssh [email protected]

ifconfig eth0|grep "inet addr"|awk '{print $2}'|cut -d: -f2

clip_p_w_picpath028[4]

通過上圖,我們可以很明顯的看出在192.168.1.8上連接192.168.1.7時,系統沒有提示我們輸入密碼。

這也就實現了,我們免密碼登陸ssh服務器的功能。

2.3.2 在windows上連接ssh服務器

我們現在切換到windows系統上,來連接192.168.1.7。 ssh客戶端工具,我們使用的還是xshell,還是在生成密鑰的那臺windows機器上。如下:

ssh [email protected]

clip_p_w_picpath029[4]

注意:用戶身份驗證方法,在此我們需要選擇的是Public Key也就是密鑰驗證方式,並且用戶密鑰就是我們前面生成時的密鑰時的私鑰id_rsa_1024。

clip_p_w_picpath030[4]

通過上圖,我們可以很明顯的看到在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命令使用方法,如下:

ifconfig eth0|grep "inet addr"|awk '{print $2}'|cut -d: -f2

ssh-copy-id -i .ssh/id_rsa.pub [email protected]

clip_p_w_picpath031[4]

cat .ssh/id_rsa.pub

clip_p_w_picpath032[4]

登陸192.168.1.9,查看公鑰。如下:

ifconfig eth0|grep "inet addr"|awk '{print $2}'|cut -d: -f2

ll --full-time .ssh/

clip_p_w_picpath033[4]

cat .ssh/authorized_keys

clip_p_w_picpath034[4]

通過以上兩張截圖,我們很明顯的看出,使用ssh-copy-id命令可以直接在ssh服務器對應用戶的家目錄下創建.ssh目錄,並且在該目錄下創建authorized_keys文件。同時也會把公鑰id_rsa.pub文件中的內容,複製到authorized_keys文件中。

查看ssh配置文件是否修改。如下:

cat /etc/ssh/sshd_config |grep authorized_keys

clip_p_w_picpath035[4]

通過上圖,我們可以很明顯的看出ssh-copy-id沒有修改ssh配置。

現在我們來連接192.168.1.9測試下,如下:

ifconfig eth0|grep "inet addr"|awk '{print $2}'|cut -d: -f2

ssh [email protected]

clip_p_w_picpath036[4]

通過上圖,我們可以很明顯的看到即使不修改ssh的配置文件,只要有authorized_keys文件,也能實現ssh的無密碼登陸。

有關ssh-copy-id詳細的使用方法,可以查看其幫助命令。如下:

ssh-copy-id -h

clip_p_w_picpath037[4]

以上就是有關ssh無密碼登陸的全部內容。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章