本文首發於爛泥行天下
最近一個月沒有寫過文章,主要是剛剛換的新工作。新公司服務器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
2.1創建ssh密鑰
通過第一章我們知道了,要使用ssh密鑰驗證。我們必須要創建一個ssh密鑰對。
ssh密鑰的創建,我們可以有兩種方式。第一就是在linux OS上通過ssh-kengen這個命令來創建,第二就是在windows下通過ssh客戶端工具來創建。
下面我們對其創建密鑰的方法一一進行介紹,如下。
2.1.1 通過ssh-kengen命令創建密鑰
使用ssh-kengen命令創建ssh密鑰很簡單,直接使用該命令創建即可。如下:
ssh-keygen
通過上圖,我們可以很明顯的看出剛剛新創建的密鑰存放在/home/ilanni/.ssh目錄下,而且私鑰文件是id_rsa,公鑰文件是id_rsa.pub。
除此之外,我們還需要注意ssh-kengen命令中:
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
這兩行是表示設置私鑰的加密密碼,我們在此是沒有設置私鑰的加密密碼。
現在我們來查看密鑰的文件屬性,如下:
ll .ssh/
通過上圖,我們可以很明顯的看出:
.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
如果要使用其他類型的加密方式,我們可以通過ssh-keygen的-t參數來指定使用的加密類型。如下:
ssh-keygen -t dsa
cat .ssh/id_dsa.pub
有關ssh-kengen命令的詳細使用方法,我們可以通過查看ssh-kengen的幫助命令獲得。如下:
ssh-keygen --help
注意:該密鑰是在192.168.1.8機器上生成的,如下:
hostname
ifconfig
2.1.2 通過xshell創建密鑰
windows下ssh客戶端的連接工具比較多,但是我使用最多的還是xshell這個工具。
下面我們就通過xshell工具,來創建ssh的密鑰。
打開xshell,點擊“工具”--“新建用戶密鑰生成嚮導”,如下:
下面這個界面,我們可以選擇密鑰的類型和密鑰的長度,如下:
生成密鑰對,如下:
輸入密鑰名稱以及密鑰的加密密碼,如下:
注意:這個密鑰的加密密碼就是ssh私鑰的加密密碼,我們可以爲空。
爲了下面試驗區分通過ssh-kengen生成的密鑰id_rsa,在此密鑰的名稱我們命名爲id_rsa_1024。
生成公鑰,如下:
公鑰生成後,我們需要把該公鑰保存到一個文件中。如下:
公鑰保存完畢後,xshell就會跳轉到私鑰的界面。如下:
通過上圖,我們可以看到目前私鑰的名稱就是我們前面命名的id_rsa_1024,而且密鑰的長度是1024字節。
現在我們來導出該私鑰,如下:
這樣我們就得到了一對ssh密鑰,如下:
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
2.2.1 確定要登陸ssh服務器的用戶
因爲我們是要免密碼登陸ssh服務器,所以我們必須要確定使用哪一個用戶登陸ssh服務器。
注意:該用戶一定要在ssh服務器存在,並且是可以登陸ssh服務器的。
在此我們使用的是ilanni這個用戶登陸ssh服務器的。如下:
whoami
cat /etc/passwd |grep ilanni
2.2.2 修改ssh配置
ssh存放用戶登陸的公鑰是通過sshd_config文件配置的,但是默認該選項是沒有啓用的。需要我們通過修改sshd_config文件來啓用,如下:
sudo vi /etc/ssh/sshd_config
我們只需要把#AuthorizedKeysFile %h/.ssh/authorized_keys行前的#去掉即可。如下:
AuthorizedKeysFile存放該用戶可以用來登錄的RSA/DSA公鑰。該指令中%h表示用戶的主目錄,最後公鑰會存放到主目錄的.ssh/authorized_keys文件中。
注意:這個步驟不是必須的,因爲通過ssh-copy-id命令進行配置時,就無需修改ssh配置文件。
2.2.3 創建authorized_keys文件
在上一章節中,我們知道了用戶的公鑰是存放在authorized_keys文件中的,現在我們來創建該文件。
先創建.ssh目錄並修改其用戶屬性,如下:
mkdir .ssh
chmod 700 .ssh
.ssh目錄創建完畢後,我們現在來創建authorized_keys文件。如下:
touch authorized_keys
2.2.4 把公鑰內容重定向到authorized_keys文件
在2.1章節中,我們介紹了ssh密鑰的生成方法。一是通過ssh-kengen命令生成,二是通過xshell生成。
我們現在把這兩個公鑰都上傳到192.168.1.7機器上,然後重定向到authorized_keys文件中。如下:
把192.168.1.8公鑰複製到192.168.1.7機器上,如下:
scp .ssh/id_rsa.pub [email protected]:/home/ilanni
把xshell生成的公鑰上傳到192.168.1.7上,如下:
現在把兩個公鑰都重定向到authorized_keys文件,如下:
cat id_rsa.pub >.ssh/authorized_keys
cat id_rsa_1024.pub>>.ssh/authorized_keys
cat .ssh/authorized_keys
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
通過上圖,我們可以很明顯的看出在192.168.1.8上連接192.168.1.7時,系統沒有提示我們輸入密碼。
這也就實現了,我們免密碼登陸ssh服務器的功能。
2.3.2 在windows上連接ssh服務器
我們現在切換到windows系統上,來連接192.168.1.7。 ssh客戶端工具,我們使用的還是xshell,還是在生成密鑰的那臺windows機器上。如下:
注意:用戶身份驗證方法,在此我們需要選擇的是Public Key也就是密鑰驗證方式,並且用戶密鑰就是我們前面生成時的密鑰時的私鑰id_rsa_1024。
通過上圖,我們可以很明顯的看到在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]
cat .ssh/id_rsa.pub
登陸192.168.1.9,查看公鑰。如下:
ifconfig eth0|grep "inet addr"|awk '{print $2}'|cut -d: -f2
ll --full-time .ssh/
cat .ssh/authorized_keys
通過以上兩張截圖,我們很明顯的看出,使用ssh-copy-id命令可以直接在ssh服務器對應用戶的家目錄下創建.ssh目錄,並且在該目錄下創建authorized_keys文件。同時也會把公鑰id_rsa.pub文件中的內容,複製到authorized_keys文件中。
查看ssh配置文件是否修改。如下:
cat /etc/ssh/sshd_config |grep authorized_keys
通過上圖,我們可以很明顯的看出ssh-copy-id沒有修改ssh配置。
現在我們來連接192.168.1.9測試下,如下:
ifconfig eth0|grep "inet addr"|awk '{print $2}'|cut -d: -f2
通過上圖,我們可以很明顯的看到即使不修改ssh的配置文件,只要有authorized_keys文件,也能實現ssh的無密碼登陸。
有關ssh-copy-id詳細的使用方法,可以查看其幫助命令。如下:
ssh-copy-id -h
以上就是有關ssh無密碼登陸的全部內容。