在管理 Linux Server 的時候,SSH 應該是 MIS 們最常用的工具,不管人在天涯海角,不管今天有沒有休假,不管現在是不是三更半夜,只要老闆電話一通,隨時都能使命必達,快速的排除異常狀況。(苦命的 MIS 在角落哭泣中~~~~)
不過,每次連線老是要打帳號密碼,實在是很麻煩。如果只是麻煩也就算了,要是不小心被側錄程式錄了下來,那明天不就不用去上班了(興奮的意味!!!)。
所以,是不是有什麼方法可以利用 SSH 本身的特性,自動檢查我們的金鑰來登入呢 ???
最後更新日期 - 2015/05/25
簡介
很久很久以前,在 WWW 還沒出生的時代,統治網路世界的連線程式叫做 Telnet。沒錯!!! 就是鄉民們用來上 PTT BBS 的連線協定。
它很好用,速度又快,只要有帳號密碼就可以連線,不過有個天生的致命傷 - 傳輸過程不加密。所以,在現在這個萬事問網路的時代,實在太不安全,後來 SSH (Secure Shell) 橫空出世,很快的就搶走了 Telnet 的光環了。
SSH 預設是以金鑰為基礎來驗證及加密傳輸,相對之下,安全性提高許多,自然就受到大家的喜愛,更別提除了遠端連線的功能之外,還具有遠端傳送檔案及傳送操作指令的功能。
事前準備
- SSH Server 端
這邊以 CentOS 6.5 x86 來作示範,現在常見的 Linux 發行版預設都己經安裝 OpenSSH,並且會自動啟用,所以不需要額外自行安裝設定。
- SSH Client 端
Windows 大多會使用 PuTTY、PieTTY 或是 MobaXterm。
OSX 可以用內建的終端機來連線,也可以用 iTerm 2。
Linux 當然就直接在 shell 直接使用 ssh 指令即可,若是在 X-Window 裡也有 Terminal 可以用。
產生 OSX 與 Linux 的 SSH Client 金鑰
由於 OS X 跟 Linux 都是 Unix-Like 系統,所以產生的方式都一樣。這邊以 OS X 為例,先打開終端機或 iTerm 2。
先驗明正身一下,這台 MacBook 上面跑的是 OS X 10.10.2。
使用者家目錄的 .ssh 目錄裡,目前只有一個 known_hosts 檔案,這個是用來記錄曾經連線過的 SSH Server 的公鑰。
產生一組這台電腦的 SSH 公鑰+私鑰,預設是使用 RSA 演算法。
ssh-keygen
有三個選項要使用者設定,不過我們都不必修改,全部直接按 Enter 用預設值就好了。
- Enter file in which to save the key - 輸入金鑰的檔案路徑及名稱,預設是 ~/.ssh/id_rsa。
- Enter passphrase - 輸入自訂密碼。
- Enter same passphrase again - 再輸入一次自訂密碼。
我們來看一下公鑰的內容,其實它也就只是一堆的加密過的文字而已。
使用 scp 指令將 Client 端的公鑰 ~/.ssh/id_rsa.pub 複製到 SSH_Server 裡,登入的帳號是 USER,把公鑰存到 USER 的家目錄 ~。
scp ~/.ssh/id_rsa.pub USER@SSH_SERVER:~
千萬不要照上面這一行指令執行,保證不會成功 ...... XDDD
SSH_SERVER 請改成實際環境裡 Server 端的 Domain Name 或 IP,USER 就是我們想要免密碼的使用者帳號,~ 指定使用者的家目錄只是用來暫存公鑰檔案而已。
在 SSH Server 加入 OSX 與 Linux 的 Client 公鑰
用 SSH 連回 CentOS SSH Server。
登入 SSH Server,確認一下 Client 的公鑰 id_rsa.pub 已經被複製進來。
ls -l ~
如果家目錄沒有 .ssh 目錄就自行建立。
mkdir ~/.ssh
把 .ssh 目錄的權限改成只有本人才可讀寫。
chmod 700 ~/.ssh
把剛剛複製過來的 Client 端公鑰,匯入 Server 的授權清單裡。
cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
同樣把 authorized_keys 檔案的權限只有本人可讀寫。
chmod 600 ~/.ssh/authorized_keys
原本登入的時候,會詢問密碼。
將 Client 端的公鑰加到 Server 的授權名單後,就可以直接登入了。
產生 Windows 的 SSH Client 金鑰
先到 PuTTY 官網下載 SSH 金鑰的產生器 PuTTY Key Generator。
http://the.earth.li/~sgtatham/putty/latest/x86/puttygen.exe
執行它,按「Generate」開始產生公鑰和私鑰。
把滑鼠游標移到空白處的範圍裡,任意的上下左右移動。
產生器就會依照這個隨機產生的軌跡來做成金鑰。
把公鑰全部的內容複製下來。
打開記事本,把公鑰暫時先貼在這邊,等等要用到。
點選「Save private key」。
點選「是」,因為不用密碼來保護私鑰,所以千萬別讓私鑰被流出去了。
檔案名稱可以自訂,我設定與 OSX 上一樣的名稱 id_rsa。
預設的副檔名是 *.ppk。
在 SSH Server 加入 Windows 的 Client 公鑰
這裡用的是 PieTTY。
先進行錯誤示範,如果我們直接輸入 IP 或 Domain Name 連上 SSH Server。
打開「選項」裡的「詳細設定」。
保證找不到任何選項可以指定 Client 端的私鑰。
正確的作法是,輸入 IP 或 Domain 之後,勾選「PuTTY 模式」。
點選「是」,這個警告訊息是提醒我們只是暫時切換成相容於 PuTTY 的模式。
在「Connection」-「SSH」-「Auth」選項裡,才找的到「Private Key file for authentication」,用來指定 Client 端的私鑰,點選「Browse」按鈕。
找到剛剛用 puttygen 產生的私鑰。
在「session」確認一下「Host Name (or IP Address)」跟「Port」是否正確,就可以按「Open」開始連線。
照正常輸入帳號密碼的方法連進 SSH Server。
打開 authorized_keys,這邊可以看到剛剛從 OSX 匯入的公鑰。
sudo vi ~/.ssh/authorized_keys
貼上剛剛在 Windows 產生的公鑰。
重新登入 SSH Server,輸入使用者帳號,這時就可以免密碼登入了。
不過,每次都要這樣子指定私鑰,實在太麻煩,不如把設定值儲存起來吧。
點選「連線」-「儲存設定」。
自訂設定值的名稱。
之後,在連線時選擇這一組設定。
只要輸入帳號,就可以免密碼登入了。
異常排除
狀況一:
SSH Server 很不幸的回覆我們「Server refused our key」的話,下面有幾個可能的原因。
- 修改 SSH Server 的設定值
在 Server 編輯 sshd_config
sudo vi /etc/ssh/sshd_config
找到 #StrictModes yes 改成 StrictModes no。
找到 #PubkeyAuthentication yes 改成 PubkeyAuthentication yes。
找到 #AuthorizedKeysFile .ssh/authorized_keys 改成 AuthorizedKeysFile .ssh/authorized_keys。
改完之後,重新啟動 SSH Service。
- 檢查一下 ~/.ssh 目錄的權限是否為 700,~/.ssh/authorized_keys 檔案的權限是否為 600,因為 SSH Service 會檢查權限,若是非本人也可以讀取的話,會視同找不到金鑰。
sudo chmod 700 ~/.ssh
sudo chmod 600 ~/.ssh/authorized_keys
- 被 SELinux 擋掉了,重新還原家目錄的 SELinux 設定即可。
sudo restorecon -R -v /home
此外,如果要在同一台 SSH Server 上,讓更多的 SSH Client 免密碼登入的話,一樣也是編輯 Server 裡的 ~/.ssh/authorized_keys 檔案,將這些 Client 端的公鑰內容,以一行一支公鑰的方式貼上去就可以了。
狀況二:
如果在 SSH 連線過程中,出現「WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!」的訊息。
這代表 SSH Server 或 Client 端的金鑰曾經變更過,與先前儲存的驗證資訊已經不同,所以被拒絕登入。
處理的方式不難,在 Client 端編輯驗證記錄檔的內容。
vi ~/.ssh/known_hosts
這個檔案會儲存所有曾經連線過的 SSH Server 驗證資訊,找到 SSH Server 的 IP,把這條記錄刪掉。
在 OS X 或 Linux 的環境可以直接執行 ssh-keygen -R 「SSH Server 的 IP 或 Domain Name」。
再重新連線一次就可以了。
參考資料
- Disp BBS - [CentOS] 主機間使用公鑰免密碼登入ssh
- Tsung's Blog - ssh keygen 免輸入密碼
- 行知小筑 - Putty server refused our key的三种原因和解决方法
圖片來源
更新記錄
- 2015/03/03 撰文。。
- 2015/05/25 加入連線錯誤時的處理步驟。
0 意見 :
張貼留言