缺省方式
如果我們希望從localhost主機通過SSH登錄remotehost主機,執行如下命令:
ssh username@centos-i1
這是 ssh
處理認證的缺省方式,它會要求我們輸入username的密碼,如果我們輸入密碼,ssh
就會用安全密碼認證協議,把我們的密碼傳送給 remotehost進行驗證。但是,和 telnet
的情況不同,這裏我們的密碼是加密的,因此它不會被偷看到我們的數據連接的人截取。一旦 remotehost把我們提供的密碼同它的密碼數據庫相對照進行認證,成功的話,我們就會被允許登錄。
通過TSA和RSA的公私密鑰認證方式
爲了使用這種認證方式,我們首先得生成一對密鑰:一把專用密鑰和一把公用密鑰。公用密鑰用於對消息進行加密,只有擁有專用密鑰的人才能對該消息進行解密。公用密鑰只能用於加密,而專用密鑰只能用於對由匹配的公用密鑰編碼的消息進行解密。RSA(和 DSA)認證協議利用密鑰對的這些特殊性質進行安全認證,並且不需要在網上傳輸任何保密的信息。
然後把公用密鑰拷貝到 remotehost。公用密鑰之所以被稱作是“公用的”有一個原因是因爲它只能用於對那些給我們的消息進行加密,所以我們不需要太擔心它會落入其它人手中。一旦我們的公用密鑰已經被拷貝到 remotehost 中,並且爲了讓remotehost 的 sshd 能夠定位它而把它放在一個專門的文件(~/.ssh/authorized_keys)裏,我們就爲使用 RSA 認證登錄到 remotehost 上做好了準備。
要用 RSA 登錄的時候,就象我們常做的一樣,我們只要在 localhost 的控制檯鍵入ssh username@centos-i1。但是這一次,ssh 告訴 remotehost 的 sshd 它想使用 RSA 或DSA認證協議。Remotehost 的 sshd 會生成一個隨機數,並用我們先前拷貝過去的公用密鑰對這個隨機數進行加密。然後, sshd 把加密了的隨機數發回給正在 localhost 上運行的 ssh。接下來,輪到localhost的 ssh 用專用密鑰對這個隨機數進行解密後,再把它發回給 remotehost,實際上等於在說:“瞧,我確實有匹配的專用密鑰;我能成功的對您的消息進行解密!”。這樣remotehost的 sshd 得出結論,既然我們持有匹配的專用密鑰,就應當允許我們登錄。
兩項注意事項
關於 RSA 和 DSA 認證有兩項重要的注意事項。
我們的確只需要生成一對密鑰。然後我們可以把我們的公用密鑰拷貝到想要訪問的那些遠程機器上,並進行恰當的認證配置。換句話說,我們並不需要爲想要訪問的每個系統都準備一對密鑰。只要一對就足夠了。
專用密鑰不應落入其它人手中。正是專用密鑰授權我們訪問遠程系統,任何擁有我們的專用密鑰的人都會被授予和我們完全相同的特權。我們應該保護我們的專用密鑰以防未授權的使用。
ssh 的開發者們當然知道專用密鑰的重要性,而且他們已經在 ssh 和 ssh-keygen 里加入了一些防範措施,以防止我們的專用密鑰被濫用。首先,ssh 被設置成了如果我們的密鑰的文件權限允許除我們之外的任何人讀取密鑰,就打印出一條大大的警告消息。其次,在我們用 ssh-keygen 創建公用/專用密鑰對的時候,ssh-keygen 會要求我們輸入一個密碼短語。如果我們輸入了密碼短語,ssh-keygen 就會用該密碼短語加密我們的專用密鑰,這樣,即使專用密鑰被盜,對於那些碰巧不知道密碼短語的人而言,這把專用密鑰是毫無用處的。
具體配置步驟
以主機centos-i2免密碼登錄centos-i1爲例。
1.在主機centos-i2生成公私密鑰
[root@centos-i2 ~]# ssh-keygen #缺省使用RSA協議,也可以通過-t dsa參數來使用DSA協議
Generating public/private rsa key pair.
Enter file in which to save the key(/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase): #此處直接回車
Enter same passphrase again:
Your identification has been saved in/root/.ssh/id_rsa.
Your public key has been saved in/root/.ssh/id_rsa.pub.
The key fingerprint is:
33:3e:b4:b5:bb:76:e3:6d:c9:2a:53:93:24:31:0b:40root@centos-i2
這樣就會如程序提示在/home/.ssh目錄生成兩個文件,分別是公私密鑰。
2.把生成的公鑰文件id_rsa.pub複製到centos-i1主機上
[root@ce[root@centos-i2 .ssh]# scpid_rsa.pub root@centos-i1:/root/.ssh
root@centos-i1's password: #此時免密碼設置還沒有配好,所以需要密碼
id_rsa.pub 100% 396 0.4KB/s 00:00
3.在centos-i1主機上配置centos-i2的公鑰
[root@centos-i1 .ssh]# cat id_rsa.pub>> authorized_keys
上述3步驟配置完成後,就可以通過ssh和scp命令在centos-i2上免密碼ssh登錄centos-i1了。示例如下:
[root@centos-i2 .ssh]# ssh root@centos-i1
[root@centos-i2 lb]# scp fio-2.2.10.tar.gzroot@centos-i1:/home/lb
但是,由於步驟一中我們沒有使用密碼短語來保護私鑰,如果私鑰被不恰當使用,可能會帶來風險。爲了避免由此帶來的隱患,可以使用ssh-agent。關於ssh-agent的使用方法,可以看參考文獻。
DSA協議的配置
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 文件拷貝到 remotehost,然後把它附加到remotehost 上的~/.ssh/authorized_keys2 文件。請注意這個文件的名字和 RSA 的 authorized_keys 文件名不同。一旦配置完畢,輸入我們的 DSA 專用密鑰的密碼短語就應該能登錄到 remotehost,而不需要我們輸入在 remotehost 上真正的密碼。
參考文獻
https://www.ibm.com/developerworks/cn/linux/security/openssh/part1/index.html
https://www.ibm.com/developerworks/cn/linux/security/openssh/part2/