How-To:無密碼的 SSH 服務建置與操作

操作環境:

  • CentOS 7.4.1708
  • OpenSSH 7.4p1

 

雖然網路上已經有很多關於 OpenSSH 免密碼登入的教學了,然而這些文章多半都是在客戶端上產生登入用的公鑰及私鑰,但事實上在伺服端就可以完成相同的動作。因此,本文會示範一種更適合伺服器部署的設定流程,並順便說明如何在幾種常見的 SSH 應用上使用金鑰登入。

 

1. 在伺服器上產生公鑰與私鑰

實作無密碼的 SSH 登入其實非常單純,若無進一步的需求,在預設情況下並不需要修改 OpenSSH 服務的設定檔。首先在伺服器上,須確認欲啟用金鑰登入的帳號,其家目錄已存在隱藏的 .ssh 目錄,且該目錄僅開放給擁有者存取。可以使用以下指令來建立該目錄:

  • mkdir -p -m 700 .ssh

 

然後便執行 ssh-keygen 來產生公鑰與私鑰:

  • ssh-keygen -f .ssh/id_rsa -q -N ""

 

完成後,.ssh 目錄下產生的 id_rsa.pub 與 id_rsa 即分別為公鑰與私鑰。接著,只需要將 id_rsa.pub 複製為 authorized_keys,便完成公鑰在伺服器上的安裝動作:

  • cp .ssh/id_rsa.pub .ssh/authorized_keys

 

2. 藉由私鑰從客戶端登入至伺服器

前一步驟所產生的私鑰(id_rsa),則需要複製到客戶端上。你可以使用任一途徑完成這項動作,並命名為自訂的名稱。在 DR 的範例裡,私鑰是被重新命名為 remote_server.pem,並放置於客戶端家目錄的 keys 目錄下。在使用此私鑰檔之前,首先需要變更它的權限,限定只有擁有者能夠寫入:

  • chmod 600 ~/keys/remote_server.pem

 

接著假設帳號名稱與遠端主機分別為 test_user 與 192.168.1.120,則使用 ssh 的登入指令如下:

  • ssh -i keys/remote_server.pem test_user@192.168.1.120

 

若一切正常,ssh 將會以無須輸入密碼的方式,直接登入伺服器;反之則仍然會要求輸入密碼,屆時請重新確認先前的操作流程是否正確,或是檢查伺服器上的日誌記錄(/var/log/secure)。在伺服器有啟用 SELinux 的情況下,則建議確認 .ssh 目錄是否帶有 ssh_home_t 標籤。

 

3. 建立客戶端的 SSH 設定檔來提高登入的便利性

除了以額外參數指定私鑰外,還可以在客戶端上新增一個 .ssh/config 檔案,並寫入主機與私鑰的對應設定,就能夠以較簡短的指令來登入 SSH。承繼先前的範例,設定檔的內容如下:

Host 192.168.1.120
    User test_user
    IdentityFile ~/keys/remote_server.pem

 

儲存後也同樣需要變更該檔案的權限:

  • chmod 600 .ssh/config

 

完成前述動作後,再次使用 ssh 指令便無須加上私鑰路徑:

  • ssh test_user@192.168.1.120

 

事實上,此設定不僅影響 ssh 指令,包含 rsyncSSHFSGit 等工具也會透過此設定檔來讀取私鑰。

 

4. SSHFS 透過私鑰登入

SSHFS 能夠將遠端的 SSH 檔案目錄視為檔案系統掛載起來,在撰寫與檔案交換有關的腳本程式時相當有用。假設想要將遠端 test_user 家目錄下的 projects 目錄,掛載至本地的 remote_dirs 目錄,則包含私鑰參數的掛載指令如下:

  • sshfs test_user@192.168.1.120:projects remote_dirs -o IdentityFile=~/keys/remote_server.pem

 

不過,如同先前曾提及的,.ssh/config 的效力同樣作用於 SSHFS 上。所以一旦經過設定,就可以省略私鑰參數:

  • sshfs test_user@192.168.1.120:projects remote_dirs

 

5. Git 透過私鑰登入

git 指令本身並無加入私鑰參數的途徑,而實現私鑰登入的其中一種方式,其實就是使用 .ssh/config 設定檔。假設 Git 設定裡的遠端 URL 為:

url = ssh://test_user@192.168.1.120:/home/test_user/projects/

 

則先前的 .ssh/config 範例就能夠發揮作用,自動透過私鑰進行驗證。

 

6. 在 FileZilla 中透過私鑰登入

FileZilla 是相當知名的 FTP 客戶端軟體,同時也支援 SSH 檔案傳輸協定(SFTP)。在 FileZilla 裡,將通訊協定指定為「SFTP - SSH File Transfer Protocol」,並指定登入形式為「Key file」,便會出現金鑰檔案欄位。於該欄位填入私鑰路徑後,就能夠透過私鑰進行登入。

 

7. 在 PuTTY 中透過私鑰登入

PuTTY 是 Windows 平台上相當常見的 SSH 客戶端軟體,不過它無法直接使用 OpenSSH 的私鑰格式。因此,需要先使用 puttygen 工具,於該工具的選單列中選擇【Conversions】→【Import key】,接著選取先前的私鑰檔案後,再點選【Save private key】,將私鑰從 pem 格式另存為 ppk 格式。

 

在取得 ppk 格式的私鑰(例如 remote_server.ppk)後,開啟 PuTTY,於左側選單的【SSH】→【Auth】項目中找到【Private key file for authentication】欄位,在此填入私鑰路徑就能夠使用私鑰登入。