2012年10月20日 星期六

SSH 的「自動認證機制」 - 使用 DSA 密鑰

SSH 是一個安全相當高的「遠端終端機(Remote Terminal)」,也常用以建立「加密通道」重導「遠端桌面」、或是加密的檔案傳輸。如果,這種連線是經常使用,每次都要輸入密碼是有些麻煩,但是不設密碼又不安全。
    所幸 SSH 有個不需輸入密碼的「自動認證」的機制,
  • 建立「公鑰」、「私鑰」
  • 將「公鑰」上傳到將登入的電腦
  • 建立連線時,自動認證並登入
設定後,在整個連線過程(從命令列到登入成功),除密碼不用再輸入外,其它皆與原來相同。設定步驟說明如下:

一、建立「公鑰」「私鑰」

說是不同密碼,還是要有驗證的過程才算安全。在 Linux 的 SSH 套件裏有個『ssh-keygen』的程式,可以產生一組「公鑰」「私鑰」。
[SiB@Celeron-D ~]$ ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/home/SiB/.ssh/id_dsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/SiB/.ssh/id_dsa.
Your public key has been saved in /home/SiB/.ssh/id_dsa.pub.
The key fingerprint is:
51:bd:6e:e7:b6:d0:d8:7f:5e:ca:15:1b:cb:4a:ee:ee SiB@Celeron-D
The key's randomart image is:
+--[ DSA 1024]----+
|        .o       |
|       .  o      |
|      .  o       |
|       .. + .    |
|       .So B     |
|      . o o *    |
|     o .   o +  .|
|      o     o...o|
|     +E      .oo.|
+-----------------+
[SiB@Celeron-D ~]$
基本上,上面過程中的詢問都可以直接按【Enter】鍵直到「金鑰」產生。其中,有個詢問『Enter passphrase (empty for no passphrase):』的作用需要再加以說明。
「密語(passphrase)」的作用是用來保護「私鑰」不被濫用,
怎麼會說『被濫用』呢?
這是假設你儲存「私鑰」的電腦萬一被入侵,所有你曾上傳、儲存「公鑰」的電腦,才不會立即被入侵。至少,駭客還得再破一次「密語」才行。若你有設定「密語」,在做「公、私鑰」驗證時,必須輸一次「密語」,這對想『完全』省掉輸密碼麻煩的人沒有幫助。

二、上傳至「伺服器」

產生的「公鑰」需要上傳到「伺服器」或是你將來想用 SSH 連線的電腦。可以透過 SFTP 或是用 scp 這個只做一次傳輸的簡單命令。
[SiB@Celeron-D ~]$ scp -P 5566 ~/.ssh/id_dsa.pub SiB@192.168.10.15:.ssh/newkey

SiB@192.168.10.15's password:
id_dsa.pub                              100%  601     0.6KB/s   00:00
[SiB@Celeron-D ~]$
上例中假設 5566 是「伺服器」的 SSH 埠號,『~/.ssh/id_dsa.pub』是本地的 dsa「公鑰」,而『SiB@192.168.10.15』是指複製目的端的電腦 IP 為 192.168.10.15、登入帳號為 SiB,『:』後的『.ssh/newkey』是目的端電腦的「公鑰」暫存檔。

三、以平常方式連線至「伺服器」

把「公鑰」上傳到「伺服器」後,還要將之加入「已認證金鑰」檔,才算完成整個設定步驟,這個加入「已認證金鑰」檔的步驟,要在「伺服器」端進行。所以,接下來要建立「本地電腦」到「伺服器」的「遠端終端機」連線。當然,這時候還是要輸入密碼的。
[SiB@Celeron-D ~]$ ssh 192.168.10.15 -p 5566 -l SiB
[SiB@Core-i7 ~]$
上例中的 192.168.10.15 及 5566 分別是「伺服器」的 IP 網址 及 SSH 埠號,而登入帳號為 SiB。

四、將「公錀」附加到「認證金錀」檔

[SiB@Core-i7 ~]$ cd .ssh
[SiB@Core-i7 .ssh]$ cat newkey >> authorized_keys
上例中,第一個命令是將「目前工作目錄」更改為『~/.ssh/』,而第二個命令是將剛才上傳的「公鑰」附加(append)到『authorized_keys』這個檔案的尾巴。

注意:若『authorized_keys』這個檔案不存在,則第二個命令可以改為
[SiB@Core-i7 .ssh]$ mv newkey authorized_keys
將『newkey』更改檔案名為『authorized_keys』,或
[SiB@Core-i7 .ssh]$ cat newkey > authorized_keys
將『newkey』的內容「覆寫(overwrite)」到『authorized_keys』,或
[SiB@Core-i7 .ssh]$ touch authorized_keys
[SiB@Core-i7 .ssh]$ cat newkey >> authorized_keys
以『touch』先產生一個檔名為『authorized_keys』的空檔,再附加內容。

五、將上傳的「公鑰」暫存檔刪除

若上一步驟操作後,剛才上傳的暫存檔還在,可以將之刪除。
[SiB@Core-i7 .ssh]$ rm newkey
註:不用的檔案,確定不會再用的話,最好立即刪除,免得以後忘了其用途時,還會傷腦筋。

六、更換「公鑰」

若是因「本地電腦」重灌作業系統,或是因為安全理由,要更換「公鑰」時,可以到「伺服器」端,修改你的「已認證金鑰」檔。使用你熟悉的「純文字編輯器」,例:gedit 或 vim 編輯這個檔案。
    每一個「金鑰」都是以『ssh-dss』為開始,並以『帳號名@本地電腦名稱』或『帳號名@本地電腦 IP 網址』為結束。將這個金鑰刪除後,再重新附加入新的金鑰即可。

七、延伸說明

有些小經驗,順便在這裏提一下:
  • 有些網路的步驟是產生 RSA「金鑰」而不是 DSA「金鑰」,根據筆者所知,
    • RSA 運算較快,但安全性較差
    • DSA 安全性較佳,但運算較慢
    • 以現在電腦的速度,運算已不是問題,安全性比較重要。
  • 若「本地電腦」的安全程度不足,最好在產生「公、私鑰」時,輸入「密語」以增加「本地電腦」中「私鑰」的安全性,減少「本地電腦」被當做『跳板』的可能性。
  • 需要管理很多電腦的「系統管理者」,利用「公、私鑰」再加上「密語」的安全性,可以有類似「單一密碼登入」的好處,管理時在不同系統切換時,不用記一堆不同的密碼。

已測試版本:

  • Fedora: 14, 17

3 則留言:

  1. 請問一下照上面做完之後還是無法成功不用密碼連線
    可能是什摩原因??

    回覆刪除
    回覆
    1. 試一下這個命令:ssh-add
      將金鑰加入認證機制的列表中。

      刪除

感謝你耐心看完本文,歡迎留下任何指正、建議,筆者會儘快回應。(English is also welcome.)