ssh免密碼登錄
來自: 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>