emmm….最近學習大數據,須要搭建Hadoop框架,當弄好linux系統以後,第一件事就是SSH免密登陸的設置。對於SSH,我以爲使用過linux系統的程序員應該並不陌生。但是吧,用起來簡單,真讓你說出個因此然,仍是件比較困難的事(大佬繞路,此篇文章不屬於你~)。而後,我就好奇心大發,打算寫一篇博客詳細介紹一下SSH和免密登陸的原理及實現。linux
補充:不論是Hadoop的僞分佈仍是全分佈,Hadoop的名稱結點(NameNode)都須要啓動集羣中全部機器的Hadoop守護進程,而這個過程能夠經過SSH登陸來實現。因爲Hadoop並無提供SSH輸入密碼登陸的形式,所以,爲了可以順利登陸每臺機器,就須要對其進行SSH的免密登陸配置。程序員
Secure Shell(安全外殼協議,簡稱SSH)是一種加密的網絡傳輸協議,能夠在不安全的網絡中爲網絡服務提供安全的傳輸環境(來自維基百科的定義)。根據其定義,咱們可以理解SSH最多見的用途就是遠程登陸系統,人們一般利用SSH來傳輸命令行界面和遠程執行命令。算法
早期的互聯網通訊,例如Telnet和非安全shell,都是採用明文進行傳輸,一旦被截獲,內容就會暴露無遺。而SSH就是其上位的替代品。1995年,芬蘭學者Tatu Ylonen設計了SSH協議,將登陸信息所有加密,成爲了互聯網安全的一個基本解決方案,迅速在全世界得到推廣。shell
這裏須要注意一下,SSH只是一種協議(或者能夠理解爲一種規定),而它具體的實現有不少,商業,開源的等等。其最流行的實現應該是OpenSSH,本文所針對的實現也是基於OpenSSH的。centos
做爲以安全性著稱的協議,SSH是怎麼實現的呢?咱們首先想到的確定是對數據進行加密,而SSH的加密方式主要有兩種,一個是對稱加密(密鑰加密),另外一個是非對稱加密(公鑰加密)。安全
所謂的對稱加密就是客戶端與服務器共用一套密鑰進行數據的加解密,詳情見下圖。服務器
圖3-1 對稱加密的過程網絡
這種加密方式很難被破解,可是存在一個問題,若是密鑰泄露,系統數據的安全性將不復存在,爲了解決這個問題,非對稱加密應運而生。框架
非對稱加密有兩個密鑰:公鑰和私鑰。數據使用公鑰加密以後,只能使用私鑰進行解密,而私鑰被破解的機率很低很低,詳情見下圖。ssh
圖3-2 非對稱加密的過程
因爲私鑰是服務器獨有的,因此即便客戶機的登陸信息被截取,也是沒有私鑰進行解密的,保證了數據的安全性,充分利用了非對稱加密的特色。
非對稱加密就必定安全了麼?答案是否認的。若是黑客冒充了服務器,攔截了登陸請求,而且把本身的公鑰發送給客戶機,再使用本身的私鑰對密碼進行解密,就會獲取到客戶機的登陸信息,從而形成數據泄露,這就是中間人攻擊,詳情見下圖。
圖3-3 非對稱加密的缺陷
對於上訴的缺陷,SSH有兩種解決方法,第一種是基於口令的認證;另外一種是基於公鑰的認證,俗稱SSH免密登陸。
根據圖3-3所示,咱們能夠發現問題的關鍵點就在於客戶機無法分辨出公鑰是不是本身想要登陸的服務器給的公鑰,因此說客戶機只能本身對公鑰進行確認,一般第一次登陸的時候會出現下面的提示。
1 The authenticity of host 'ssh-server.example.com (12.18.429.21)' can't be established. 2 RSA key fingerprint is 98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d. 3 Are you sure you want to continue connecting (yes/no)?
提示的內容是在說,沒法肯定ssh-server.example.com (12.18.429.21)主機的真實性,可是知道其公鑰指紋,是否繼續鏈接。
之因此使用公鑰指紋,是由於RSA算法生成的公鑰長達1024位,可是經過對公鑰進行hash獲得的128位的指紋就很容易進行比較。
輸入yes以後,會出現下面的提示。
1 Warning: Permanently added 'ssh-server.example.com,12.18.429.21' (RSA) to the list of known hosts. 2 Password: (enter password)
提示在說,該主機已經添加到known hosts的列表裏了,接着輸入密碼,按照圖3-2的流程走就好了。
4.基於公鑰的認證
4.1 SSH免密登陸的原理
免去密碼進行登陸,不只使得登陸信息不會遭到泄露,並且也簡化、方便了系統之間登陸的操做,提升了工做的效率,工做原理見下圖所示。
圖4-1 免密登陸的原理
第一步:安裝SSH,命令以下。
1 yum install –y openssh-clients openssh-server
這裏解釋一下,一臺機器既能夠是客戶機也能夠是服務器,而且這兩個角色是能夠共存的。openssh-clients的功能相似於XShell,能夠做爲一個客戶端鏈接上openssh-server。openssh-server的功能主要是做爲一個服務(守護進程)運行在後臺,若是這個服務開啓了,咱們就能夠用一些遠程鏈接工具來鏈接centos。因爲我是用了Centos6.4的mimimal版本,該版本已經安裝了openssh-server,可是卻沒有安裝openssh-clients,因此我只須要安裝openssh-clients便可,而具體安裝狀況請根據本身的系統決定。
第二步:生成密鑰,命令以下。
1 ssh-keygen –t rsa –P ‘’ –f –/.ssh/id_rsa
ssh-keygen是用來生產密鑰的工具。-t:指定生成密鑰的類型(rsa、dsa、ecdsa等);-P:指定passphrase,用於確保私鑰的安全;-f:指定存放密鑰的文件(公鑰和私鑰默認放在相同目錄下面,區別是,公鑰的文件名有後綴.pub)
第三步:建立用於保存公鑰的文件authorized_keys,而且把本機公鑰添加到此文件,命令以下。
1 cat ~/.ssh/id_rsa.pub >> ~./ssh/authorized_keys
第四步:對authorized_keys文件進行受權操做,命令以下。
1 chmod 0600 ~/.ssh/authorized_keys
因爲每一個人使用系統的不一樣,文件默認的受權也是不相同的,若是不肯定的話,能夠執行上訴命令,對文件進行受權。
第五步:登陸,命令以下。
1 ssh host
emmm,SSH免密登陸的使用仍是挺常見的,也挺簡單的。我以爲吧,凡事不能知其然而不知其因此然,這是我寫這篇博客的目的。同時我也但願讀者可以經過這篇博客對SSH以及免密登陸能有更好的瞭解。
這篇博客因爲工做的緣由,前先後後寫了個把星期,真的很不容易,雖然文中的原理不少是經過學習大佬的文章纔會的,可是這篇博客中的每一個字我均可以負責任的說是我本身一個一個敲的,全部的圖都是我本身用processOn畫的,若是你有什麼問題,能夠在博客下留言,我有時間會回覆的。
最後祝你們工做、學習愈來愈順利。