理解OpenSSH的RSA和DSA認證過程

OpenSSH 的 RSA 和 DSA 認證協議的基礎是一對專門生成的密鑰,分別叫作 專用密鑰和 公用密鑰。使用這些基於密鑰的認證系統的優點在於:在許多狀況下,有可能沒必要手工輸入密碼就能創建起安全的鏈接。

儘管基於密鑰的認證協議至關安全,可是當用戶並不徹底瞭解這些簡化操做對安全性的影響,爲了方便而使用某些簡化操做時,就會出現問題。本文中,咱們將詳細討論如何正確使用 RSA 和 DSA 認證協議,使咱們不會冒任何沒必要要的安全性風險。在個人下一篇文章裏,我將向您展現如何使用 ssh-agent 隱藏已經解密的專用密鑰,還將介紹 keychain ,它是 ssh-agent 的前端,能夠在不犧牲安全性的前提下提供許多便利。若是您一直想要掌握 OpenSSH 更高級的認證功能的話,那麼就請您繼續往下讀吧。

RSA/DSA 密鑰的工做原理

下面從總體上粗略的介紹了 RSA/DSA 密鑰的工做原理。讓咱們從一種假想的情形開始,假定咱們想用 RSA 認證容許一臺本地的 Linux 工做站(稱做 localbox)打開 remotebox上的一個遠程 shell, remotebox 是咱們的 ISP 的一臺機器。此刻,當咱們試圖用 ssh 客戶程序鏈接到 remotebox時,咱們會獲得以下提示:


% ssh drobbins@remotebox drobbins@remotebox's password:


此處咱們看到的是 ssh 處理認證的 缺省方式的一個示例。換句話說,它要求咱們輸入 remotebox上的 drobbins 這個賬戶的密碼。若是咱們輸入咱們在 remotebox 上的密碼, ssh 就會用安全密碼認證協議,把咱們的密碼傳送給 remotebox 進行驗證。可是,和 telnet 的狀況不一樣,這裏咱們的密碼是加密的,所以它不會被偷看到咱們的數據鏈接的人截取。一旦 remotebox 把咱們提供的密碼同它的密碼數據庫相對照進行認證,成功的話,咱們就會被容許登陸,還會有一個 remotebox 的 shell 提示歡迎咱們。雖然 ssh 缺省的認證方法至關安全,RSA 和 DSA 認證卻爲咱們開創了一些新的潛在的機會。

可是,與 ssh 安全密碼認證不一樣的是,RSA 認證須要一些初始配置。咱們只須要執行這些初始配置步驟一次。以後, localbox 和 remotebox 之間的 RSA 認證就絕不費力了。要設置 RSA 認證,咱們首先得生成一對密鑰,一把專用密鑰和一把公用密鑰。這兩把密鑰有一些很是有趣的性質。公用密鑰用於對消息進行加密,只有擁有專用密鑰的人才能對該消息進行解密。公用密鑰只能用於 加密,而專用密鑰只能用於對由匹配的公用密鑰編碼的消息進行 解密。RSA(和 DSA)認證協議利用密鑰對的這些特殊性質進行安全認證,而且不須要在網上傳輸任何保密的信息。

要應用 RSA 或者 DSA 認證,咱們要執行一步一次性的配置步驟。咱們把 公用密鑰拷貝到 remotebox。公用密鑰之因此被稱做是「公用的」有一個緣由。由於它只能用於對那些給咱們的消息進行 加密,因此咱們不須要太擔憂它會落入其它人手中。一旦咱們的公用密鑰已經被拷貝到 remotebox而且爲了 remotebox 的 sshd 可以定位它而把它放在一個專門的文件(~/.ssh/authorized_keys)裏,咱們就爲使用 RSA 認證登陸到 remotebox上作好了準備。

要用 RSA 登陸的時候,咱們只要在 localbox 的控制檯鍵入 ssh drobbins@remotebox ,就象咱們常作的同樣。可這一次, ssh 告訴 remotebox 的 sshd 它想使用 RSA 認證協議。接下來發生的事情很是有趣。 Remotebox 的 sshd 會生成一個隨機數,並用咱們先前拷貝過去的公用密鑰對這個隨機數進行加密。而後, sshd 把加密了的隨機數發回給正在 localbox 上運行的 ssh 。接下來,輪到咱們的 ssh 用 專用密鑰對這個隨機數進行解密後,再把它發回給 remotebox,實際上等於在說:「瞧,我 確實有匹配的專用密鑰;我能成功的對您的消息進行解密!」最後, sshd 得出結論,既然咱們持有匹配的專用密鑰,就應當容許咱們登陸。所以,咱們有匹配的專用密鑰這一事實受權咱們訪問 remotebox。 前端

關於 RSA 和 DSA 認證有兩項重要的注意事項。 shell

第一項是咱們的確只須要生成一對密鑰。而後咱們能夠把咱們的公用密鑰拷貝到想要訪問的那些遠程機器上,它們都會根據咱們的那把專用密鑰進行恰當的認證。換句話說,咱們並不須要爲想要訪問的每一個系統都準備一對密鑰。只要一對就足夠了。

另外一項注意事項是 專用密鑰不該落入其它人手中。正是專用密鑰受權咱們訪問遠程系統,任何擁有咱們的專用密鑰的人都會被授予和咱們徹底相同的特權。如同咱們不想讓陌生人有咱們的住處的鑰匙同樣,咱們應該保護咱們的專用密鑰以防未受權的使用。在比特和字節的世界裏,這意味着沒有人是原本就應該能讀取或是拷貝咱們的專用密鑰的。

ssh 的開發者們固然知道專用密鑰的重要性,並且他們已經在 ssh 和 ssh-keygen 里加入了一些防範措施,以防止咱們的專用密鑰被濫用。首先, ssh 被設置成了若是咱們的密鑰的文件權限容許除咱們以外的任何人讀取密鑰,就打印出一條大大的警告消息。其次,在咱們用 ssh-keygen 建立公用/專用密鑰對的時候, ssh-keygen 會要求咱們輸入一個密碼短語。若是咱們輸入了密碼短語, ssh-keygen 就會用該密碼短語加密咱們的專用密鑰,這樣,即便專用密鑰被盜,對於那些碰巧不知道密碼短語的人而言,這把專用密鑰是毫無用處的。具有了這一知識後,讓咱們看一下如何設置 ssh 以應用 RSA 和 DSA 認證協議。 數據庫

ssh-keygen 細探

設置 RSA 認證的第一步從生成一對公用/專用密鑰對開始。RSA 認證是 ssh 密鑰認證的最初形式,所以 RSA 應該能夠用於 OpenSSH 的全部版本,儘管這樣,我仍是推薦您安裝可用的最近版本,在我寫這篇文章的時候是 openssh-2.9_p2。生成一對 RSA 密鑰的方法以下:


% ssh-keygen Generating public/private rsa1 key pair. Enter file in which to save the key (/home/drobbins/.ssh/identity): (hit enter) Enter passphrase (empty for no passphrase): (enter a passphrase) Enter same passphrase again: (enter it again) Your identification has been saved in /home/drobbins/.ssh/identity. Your public key has been saved in /home/drobbins/.ssh/identity.pub. The key fingerprint is: a4:e7:f2:39:a7:eb:fd:f8:39:f1:f1:7b:fe:48:a1:09 drobbins@localbox


當 ssh-keygen 要求輸入存放密鑰的缺省位置時,咱們敲回車鍵接受缺省的 /home/drobbins/.ssh/identity。 ssh-keygen 將把專用密鑰保存在此路徑中, 公用密鑰就存在緊臨它的一個叫作 identity.pub 的文件裏。

還要請您注意一下 ssh-keygen 還提示過咱們輸入密碼短語。當時咱們輸入了一個好的密碼短語(七位或者更多位難以預測的字符)。而後 ssh-keygen 用這個密碼短語加密了咱們的專用密鑰(~/.ssh/identity),以使咱們的專用密鑰對於那些不知道這個密碼短語的人將變得毫無用處。

追求快速的折衷方案

當咱們指定密碼短語時,雖然這使得 ssh-keygen 保護咱們的專用密鑰以防誤用,可是也帶來了一點小小的不便。如今,每當咱們試圖用 ssh 鏈接到 drobbins@remotebox 賬戶時, ssh 都會提示咱們輸入該密碼短語以便它能對咱們的專用密鑰進行解密,並使用咱們的專用密鑰進行 RSA 認證。此外,咱們輸入的不是 remotebox上 drobbins 賬戶的密碼,而是在本地機器上對專用密鑰進行解密所須要的密碼短語。一旦咱們的專用密鑰被解密,咱們的 ssh 客戶程序就會處理其他的事情。雖然使用咱們的遠程密碼和使用 RSA 密碼短語的機制徹底不一樣,但實際上仍是會提示咱們輸入一個「保密的短語」給 ssh 。


# ssh drobbins@remotebox Enter passphrase for key '/home/drobbins/.ssh/identity': (enter passphrase) Last login: Thu Jun 28 20:28:47 2001 from localbox.gentoo.org Welcome to remotebox! %


這裏就是人們常常會被誤導而致使追求快速的折衷方案的地方。有不少時候,僅僅是爲了避免必輸入密碼,人們就會建立不加密的專用密鑰。那樣的話,他們只要輸入 ssh 命令,馬上就會經過 RSA(或是 DSA)認證並登陸。


# ssh drobbins@remotebox Last login: Thu Jun 28 20:28:47 2001 from localbox.gentoo.org Welcome to remotebox! %


然而,儘管這樣很方便,可是在尚未徹底理解這種方法對安全性的影響時,您不該該使用。若是有人在某一時刻闖入了 localbox,一把不加密的專用密鑰使得他們也自動有權訪問 remotebox以及其它全部用這把公用密鑰配置過的系統。

我知道您在想些什麼。無密碼認證,雖然有點冒險,可看起來的確很誘人。我徹底贊成。可是, 還有更好的辦法!請相信我,我將向您展現如何既能夠享受到無密碼認證的好處,又沒必要犧牲專用密鑰的安全性。在個人下一篇文章裏,我還將向您展現如何熟練的使用 ssh-agent (正是它最早使得 安全無密碼認證成爲可能)。如今,讓咱們經過設置 RSA 和 DSA 認證爲使用 ssh-agent 作好準備。下面是逐步的指導。 安全

RSA 密鑰對的生成

要設置 RSA 認證,咱們須要執行生成公用/專用密鑰對的一次性步驟。咱們的輸入以下:


% ssh-keygen


出現提示時,請接受缺省的密鑰位置(典型的狀況下是 ~/.ssh/identity 和存儲公用密鑰的 ~/.ssh/identity.pub),並提供給 ssh-keygen 一個安全的密碼短語。一旦 ssh-keygen 完成,您將會獲得一把公用密鑰和一把用密碼短語加密的專用密鑰。 ssh

RSA 公用密鑰的安裝 ide

接下來,咱們須要把正在運行 sshd 的遠程系統設置成使用咱們的 公用 RSA 密鑰進行認證。典型狀況下,咱們經過象下面這樣把公用密鑰拷貝到遠程系統完成這一步:


% scp ~/.ssh/identity.pub drobbins@remotebox:


因爲 RSA 認證尚未徹底設置好,因此會提示咱們輸入 remotebox上的密碼。請您照作。而後,登陸到 remotebox 並把公用密鑰附加到文件 ~/.ssh/authorized_keys 上,以下所示:


% ssh drobbins@remotebox drobbins@remotebox's password: (enter password) 編碼

Last login: Thu Jun 28 20:28:47 2001 from localbox.gentoo.org Welcome to remotebox! 加密

% cat identity.pub >> ~/.ssh/authorized_keys spa

% exit


如今,配置過 RSA 認證之後,當咱們試圖使用 ssh 鏈接到 remotebox 時,應該會提示咱們輸入 RSA 密碼短語(而不是咱們的 密碼)。


% ssh drobbins@remotebox Enter passphrase for key '/home/drobbins/.ssh/identity':



好哇,RSA 認證的配置完成了!若是剛纔沒有提示您輸入密碼短語,您能夠試驗一下如下幾種狀況: 開發

第一,嘗試經過輸入 ssh -1 drobbins@remotebox 登陸。它會讓 ssh 只應用 ssh 協議版本 1,若是出於某種緣由遠程系統缺省設置的是 DSA 認證的話,可能會要求這麼作。若是不奏效的話,請確認您的 /etc/ssh/ssh_config 裏沒有寫着這麼一行 RSAAuthentication no 。若是有的話,請您在前面加上一個「#」把這行註釋掉。另外,還能夠試着同 remotebox 的系統管理員聯絡,覈實一下在他們那一端已經啓用了 RSA 認證,而且 /etc/ssh/sshd_config 裏的設置是正確的。

DSA 密鑰的生成

ssh 協議的版本 1 使用的是 RSA 密鑰,而 DSA 密鑰卻用於協議級 2,這是 ssh 協議的最新版本。目前全部的 OpenSSH 版本都應該既能使用 RSA 密鑰又能使用 DSA 密鑰。DSA 密鑰以以下相似於 RSA 密鑰的方式使用 OpenSSH 的 ssh-keygen 生成:


% ssh-keygen -t dsa


又會提示咱們輸入密碼短語。輸入一個安全的密碼短語。還會提示咱們輸入保存 DSA 密鑰的位置。正常狀況下,缺省的 ~/.ssh/id_dsa 和 ~/.ssh/id_dsa.pub 就能夠了。在咱們一次性生成 DSA 密鑰完成後,就該把咱們的 DSA 公用密鑰安裝到遠程系統上去了。

DSA 公用密鑰的安裝

DSA 公用密鑰的安裝又是幾乎和 RSA 安裝徹底同樣。對於 DSA,咱們將要把 ~/.ssh/id_dsa.pub 文件拷貝到 remotebox,而後把它附加到 remotebox 上的 ~/.ssh/authorized_keys2 文件。請注意這個文件的名字和 RSA 的 authorized_keys 文件名不一樣。一旦配置完畢,輸入咱們的 DSA 專用密鑰的密碼短語就應該能登陸到 remotebox,而不須要咱們輸入在 remotebox 上真正的密碼。

相關文章
相關標籤/搜索