別讓 MIS 不開心,免密碼直接登入遠端的 SSH Server

by 3月 03, 2015 0 意見                    

在管理 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 大多會使用 PuTTYPieTTY 或是 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 用預設值就好了。
  1. Enter file in which to save the key - 輸入金鑰的檔案路徑及名稱,預設是 ~/.ssh/id_rsa。
  2. Enter passphrase - 輸入自訂密碼。
  3. Enter same passphrase again - 再輸入一次自訂密碼。
這時就可以看到產生了 id_rsa 私鑰及 id_rsa.pub 公鑰。

我們來看一下公鑰的內容,其實它也就只是一堆的加密過的文字而已。

使用 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」

再重新連線一次就可以了。


參考資料


圖片來源


更新記錄

  • 2015/03/03 撰文。。
  • 2015/05/25 加入連線錯誤時的處理步驟。

Heracles Jam,江湖人稱「海公公」

IT 技術家 - 創站部落客

一個常用 Windows、慣用 macOS、愛用 Linux 的 3C 阿宅
現職 MIS / 業界講師 / 資訊顧問 / 部落客

0 意見 :

張貼留言