原文轉載: http://blog.163.com/darkness@yeah/blog/static/1317744842011325111433803/
Namenode作爲客戶端,要實現無密碼公鑰認證,連接到服務端datanode上時,需要在namenode上生成一個密鑰對,包括一個公鑰和一個私鑰,而後將公鑰複製到datanode上。
當namenode通過ssh連接datanode時,datanode就會生成一個隨機數並用namenode的公鑰對隨機數進行加密,併發送給namenode。
namenode收到加密數之後再用私鑰進行解密,並將解密數回傳給datanode,datanode確認解密數無誤之後就允許namenode進行連接了。
這就是一個公鑰認證過程,其間不需要用戶手工輸入密碼。
重要過程是將客戶端namenode公鑰複製到datanode上。
1)所有機器上生成密碼對
所有節點上執行以下命令:
# ssh-keygen
這將在/root/.ssh/目錄下生成一個私鑰id_rsa和一個公鑰id_rsa.pub。把namenode節點上面的id_rsa.pub 複製到所有datanode節點/root/.ssh/位置。
(注意:原文沒有細說,這是指把id_rsa.pub先拷貝成authorized_keys,再將authorized_keys複製到其它datanode上的)
# cp id_rsa.pub authorized_keys
namenode的公鑰
# chmod 644 authorized_keys
使用SSH協議將namenode的公鑰信息authorized_keys複製到所有DataNode的.ssh目錄下(.ssh下最初沒有authorized_keys,如果有,則需要複製追加,後面會講到如何追加)。
# scp authorized_keys [data節點ip地址]:/root/.ssh
這樣配置過後,namenode可以無密碼登錄所有datanode,可以通過命令來驗證
# ssh [節點ip地址]
2)配置每個Datanode無密碼登錄Namenode
(a)原理
Namenode連接datanode時namenode是客戶端,需要將namenode上的公鑰複製到datanode上,那麼,如果datanode主動連接namenode,datanode是客戶端,此時需要將datanode上的公鑰信息追加到namenode中的authorized_keys之中。(此時,由於namenode中已經存在authorized_keys文件,所以這裏是追加)。
如果進一步需要datanode之間實現公鑰無密碼驗證,則同樣需要相互之間追加公鑰信息
(b)將各個datanode上的id_rsa.pub追加到namenode的authorized_keys
在所有datanode上依次執行如下命令:
scp id_rsa.pub [namenode ip地址]:/root/.ssh/[datanode ip地址.id_rsa].pub
這將datanode上之前產生的公鑰id_rsa.pub複製到namenode上的.ssh目錄中,並重命名爲datanode ip地址.id_rsa.pub,這是爲了區分從各個datanode上傳過來的公鑰。
複製完畢,在namenode上執行以下命令,將每個datanode的公鑰信息追加:
# cat [datanode ip地址].id_rsa.pub >> authorized_keys
這樣,namenode和datanode之間便可以相互ssh上並不需要密碼......
注意:整個過程中只涉及到創建密鑰,複製公鑰,添加公鑰內容,沒有更改配置文件,實際上配置文件/etc/ssh/sshd_config中開啓了公鑰驗證
{
RSAAuthentication yes
PubkeyAuthentication yes
}
3) 注意
1.以上過程爲兩臺機器的無密碼訪問, 如果需要N臺電腦訪問無需密碼, 道理跟上面操作相同。
2.以上過程必須保證每臺機器都安裝和配置好了ssh, 並且保證每臺機器固定了IP (不然你弄好了無密碼訪問,關機重啓後IP一變你就白配了)。