ssh免密碼登錄

xvbaiqing 8年前發布 | 16K 次閱讀 SSH Linux

來自: http://iamlbk.github.io/blog/20160210/ssh-no-password-login/

由于最近在學習hadoop, 需要ssh免密碼登錄, 所以學習了一下ssh免密碼安裝. 在這里記錄一下ssh免密碼登錄的方法和使用場合.

單機免密碼登錄

如果要ssh免密碼登錄本機, 比如是偽分布模式安裝hadoop的話, 就需要ssh免密碼登錄本機. 那么我們可以使用如下的方式實現免密碼登錄:

ssh-keygen -t rsa -f ~/.ssh/id_rsa -P '' # 生成公私鑰 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys # 共享授權密鑰 chmod 600 ~/.ssh/authorized_keys # 修改文件權限 

</div>

命令的解釋

第一行, 使用 ssh-keygen 生成公私鑰. -t rsa 指定生成公私鑰的算法為rsa. -f ~/.ssh/id_rsa 指定生成的公私鑰存放的文件路徑, 其中id_rsa存放的是私鑰, id_rsa.pub存放的是公鑰. -P '' 指定密碼為空.

第二行就不再解釋了.

第三行是因為如果authorized_keys文件的權限允許所有者之外的人修改, 那么這個文件中的內容并不起作用. 也就是所有組和其他人都不能擁有寫權限, 個人建議權限設置成600. 由于初始時沒有authorized_keys文件, 如果authorized_keys文件是由重定向生成的, 那么權限很可能大于644, 所以這里手工修改一下文件權限.

安全性

在生成公私鑰時不指定密碼確實不是很安全. 例如, 如果有人登錄到你的系統, 就可以免密碼登錄到所有經過授權的機器(這里是本機). 如果有人拿到了你的私鑰, 那么也可以免密碼登錄到所有經過授權的機器.

但是由于這里是登錄本機, 基本上也就不存在安全問題了: 都已經登錄到這臺機器了, 再ssh登錄這臺機器也沒有多大的意義; 同樣, 如果都拿到私鑰了, 那么應該也是登錄過這臺機子了. 而且還有一點是, 這很可能是在開發環境中, 那么對安全性的要求可能就沒有那么高了, 而對便利性的要求可能會較高.

一臺主機到多臺主機免密碼登錄

這里我們假設我們有四臺機器, 主機名分別為: master, slave1, slave2, slave3. 我們的目的是從master免密碼登錄到slave1-3主機上.

生成公私鑰

如果還是用上面的方式生成公私鑰. 如果有人登錄了master主機, 那他就可以免密碼登錄到所有的slave主機上. 同樣如果他拷貝走master上的私鑰, 也可以免密碼登錄到所有的slave主機上. 所以這里建議設置密碼. 生成公私鑰的命令如下:

ssh-keygen -t rsa -f ~/.ssh/id_rsa 

</div>

當提示輸入密碼時, 輸入一個密碼即可. 下面我們把生成公私鑰時輸入的密碼簡稱ssh密碼.

共享公鑰

這里我們先使用 ssh-copy-id 完成共享公鑰. 在master主機上執行如下命令:

ssh-copy-id -i ~/.ssh/id_rsa.pub slave1 

</div>

其中 -i ~/.ssh/id_rsa.pub 指定我們需要共享的公鑰文件. slave1為主機名, 也可以寫成對應的ip. 執行這條命令時, 需要輸入slave1主機上對應賬號的密碼. 之后我們就可以使用ssh密碼登錄slave1了. 為了免密碼登錄, 需要為每一個需要免密碼登錄的主機都執行一次這條命令.

配置記住密碼

為了記住密碼, 我們需要在master主機中的~/.bash_profile中添加如下的命令:

eval `ssh-agent` ssh-add 

</div>

其中第一行是啟動ssh-agent服務. 該服務的作用范圍為當前shell. 第二行是把專用密鑰添加到ssh-agent的高速緩存中. 需要注意的是, 在執行 ssh-add 時需要輸入ssh密碼, 所以在開機輸入用戶名、密碼登錄后還會提示輸入ssh密碼. 如果覺得煩人, 可以在以后手動執行 ssh-add .

到這里我們就可以在 這個shell 中免密碼登錄slave1-3了. 可以使用 ssh slave1 登錄slave1試試, 如果還需要密碼, 說明配置有一些問題. 可以在仔細看看上面的步驟.

如果需要多臺主機到多臺主機免密碼登錄, 那么只需要在多臺主機間相互共享公鑰就行了. 都配置好記住密碼就行了.

安全性

我們假設有兩個shell: tty1, tty2. 其中tty1上在登錄過以后輸入了ssh密碼. 而tty2上在登錄過沒有輸入ssh密碼. 那么在tty2上登錄slave1-3時還是需要輸入ssh密碼的. 所以, 即使有人登錄到master主機上, 不知道ssh密碼也是不能免密碼登錄到slave1-3主機的. 同樣的, 就算拷貝走私鑰, 也沒有用. 所以這樣是安全的.

其他共享公鑰的方式

在上面我們是使用 ssh-copy-id 共享公鑰的, 但是當主機很多時, 做好做對這件事將是一個很大的挑戰; 當要修改密碼, 重新生成公私鑰時還得同步所有的公鑰…

為了更加方便, 我們可以這樣做:

在一臺機器上創建好用戶主目錄, 然后生成公私鑰, 然后將公鑰添加到本機的授權文件中. 比如:

cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys 

</div>

接著將該用戶的主目錄設置為nfs共享. 最后其他的主機都不使用自己的主目錄, 而是掛載剛才共享的主目錄. 那么就可以非常方便的共享公鑰了. 具體步驟如下

創建nfs共享

在一(多)臺機器上生成公私鑰. 然后創建nfs共享. 修改 /etc/exports 文件. 添加如下內容:

/home/hadoop 192.168.45.0/24(rw,sync)

</div>

個人建議最少在兩臺機器上生成公私鑰, 然后創建nfs共享. 這樣萬一其中一臺由于網絡等原因無法掛載時, 可以使用另外一臺機器上的數據. 如果有多臺機器, 那么需要注意同步數據.

自動掛載nfs共享

這里應該是可以直接在 /etc/fstab 中添加掛載點的. 但是autofs更加適合這里的情況, 所以我們使用autofs.

首先我們安裝autofs. 然后修改 /etc/auto.master , 添加如下內容:

/home/remoteuser /ect/auto.remoteuser

</div>

其中 /home/remoteuser 是需要掛載的父級目錄, /ect/auto.remoteuser 是具體配置文件的位置. 接下來, 我們需要編輯 /ect/auto.remoteuser (這個文件原本沒有, 需要手工創建). 添加如下內容:

hadoop -fstype=nfs,rw,soft,intr nfsserver1,nfsserver2:/home/hadoop

</div>

其中 hadoop 是掛載點的最后一級目錄, /home/remoteuser/hadoop 就是最終的掛載點. -fstype=nfs,rw,soft,intr 是相應的選項. nfsserver1,nfsserver2:/home/hadoop 中的 nfsserver1 和 nfsserver2 是nfs共享的主機名, /home/hadoop 是共享的目錄.更加靈活的配置方式可以參見 man 5 autofs

之后再修改用戶的主目錄為 /home/remoteuser/hadoop . 接下來, 在任意的主機上使用 ssh-add 添加過密碼后, 就可以在該主機該shell上免密碼登錄所有的主機了.

</div>

 本文由用戶 xvbaiqing 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!