標籤:
使用 RSA 金鑰組進行 SSH 登入驗證
使用 RSA 金鑰組驗證 SSH 的優點是 1) 不用打密碼 2) 比密碼驗證更安全;缺點是 1) 第一次配置的時候有點麻煩 2) 私密金鑰需要小心儲存。Anyway 用密鑰驗證比密碼驗證還是方便不少的。推薦所有使用者使用密鑰認證。
目錄
- 產生金鑰組
- 上傳密鑰
- ~/.ssh 相關檔案許可權
- Over~
- 附:公開金鑰加密原理
- 進一步閱讀
1. 產生金鑰組
OpenSSH 提供了ssh-keygen用於產生金鑰組,不加任何參數調用即可:
% ssh-keygenGenerating public/private rsa key pair.Enter file in which to save the key (/home/xiaq/.ssh/id_rsa):
如果你以前沒有產生過金鑰組,直接斷行符號就行。然後會問你“passphrase”,這是用來加密私密金鑰的密碼。如果你不知道怎麼用,直接用空密碼也行(當然,這樣會降低安全性)。按兩次斷行符號後金鑰組就產生好了:
Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/xiaq/.ssh/id_rsa.2.Your public key has been saved in /home/xiaq/.ssh/id_rsa.2.pub.The key fingerprint is:8a:77:ec:a1:77:42:8d:5d:ab:17:33:ac:87:06:20:3c [email protected]The key‘s randomart image is:+--[ RSA 2048]----+| || || . || E . . || o .S+ o . || . o+ o * || . o.+. + + || . +o.* o || ...+ o |+-----------------+
嗯,會有一堆很花哨的輸出,可以全都不管。這樣在你剛才指定的地方就有了一對密鑰,其中私密金鑰就是上面指定的名字,公開金鑰則多一個“.pub”尾碼。
不要把你的私密金鑰和任何人分享。公開金鑰可以到處分發。
2. 上傳密鑰
把你的公開金鑰用scp上傳到了遠程遠程ssh伺服器,並把公開金鑰的內容追加到ssh伺服器的 ~/.ssh/authorized_keys:
% scp ~/.ssh/id_rsa.pub [email protected]:% ssh [email protected]% cat id_rsa.pub >> ~/.ssh/authorized_keys
或者等價地
% cat ~/.ssh/id_rsa.pub | ssh [email protected] ‘cat >> ~/.ssh/authorized_keys‘
COMMENT: 顧名思義,authorized_keys 裡面可以存多個公開金鑰。所以在這裡用 cat id_rsa.pub >> ~/.ssh/authorized_keys。不過,如果你以前沒有這個檔案,直接 cp id_rsa.pub ~/.ssh/authorized_keys 也是可以的……
如果你的 ~ 下沒有 .ssh 目錄,建立之即可。
NOTE: OpenSSH 提供了一個指令碼ssh-copy-id用於上傳公開金鑰。其作用就是自動化完成以上的操作,例如在自己的機器上執行
$ ssh-copy-id -i .ssh/id_rsa.pub [email protected]
man ssh-copy-id完整文法 ssh-copy-id [-i public_key] [[email protected]]machine
3. ~/.ssh 相關檔案許可權
為防止你的私密金鑰被惡意使用者擷取和/或篡改,以及你的公開金鑰資訊被惡意使用者篡改,ssh 對 ~/.ssh 的檔案許可權有著嚴格的要求。如果許可權不對,公開金鑰驗證不會正常工作。
NOTE: 準確說來,這取決於 sshd 的配置。但不管怎樣,出於安全性考慮,按如下步驟設定檔許可權還是必要的。
在本地和遠程兩台機器上,都確認 ~/.ssh 目錄只有你有 rwx 許可權,其他人沒有任何許可權:
% pwd/home/xiaq% chmod 700 .ssh% ls -dl .sshdrwx------ 2 xiaq xiaq 4096 Jun 6 11:29 .ssh/
在本地機器上,確認私密金鑰只有你有 rw 許可權,其他人沒有任何許可權:
% pwd/home/xiaq/.ssh% chmod 600 id_rsa% ls -l id_rsa-rw------- 1 xiaq xiaq 1679 Apr 1 20:39 id_rsa
類似地,確認遠程機器上的 ~/.ssh/authorized_keys 只有你有 rw 許可權:
% pwd/home/xiaq/.ssh% chmod 600 authorized_keys % ls -l authorized_keys -rw------- 1 xiaq xiaq 394 2011-04-18 13:40 authorized_keys
4. Over~
一切順利的話,你現在就可以不打密碼直接 ssh 了。
不 過,如果你在產生 SSH 金鑰對時,為了更安全設定了 passphrase 了的話,ssh 登入時會請你輸入 passphrase。為了不用每次都輸,可以用 ssh-agent 和 ssh-add,在 X會話或登入session時 ssh-agent 作為 daemon 啟動,它儲存私密金鑰用於公開金鑰認證,其他程式作為 ssh-agent 的客戶就可以在該會話中實現自動認證。Debian, Fedora 上 ssh-agent 已經被自動啟動。
使用 ssh-add 添加私密金鑰:
ssh-add id_rsa_file
不帶檔案參數時,會添加 $HOME/.ssh/id_rsa, $HOME/.ssh/id_dsa 和 $HOME/.ssh/identity。 ssh-add 時需要輸入一次 passphrase。之後在同一次會話中的 ssh 遠程登入都不再需要輸入。
5. 附:公開金鑰加密原理
公開金鑰加密 (public-key cryptography),或非對稱金鑰密碼編譯 (asymmetric key cryptography) 是一類廣泛使用的密碼編譯演算法。這類演算法使用一對密鑰即公開金鑰 (public key) 和私密金鑰 (private key)。其中公開金鑰可以隨便分發,只用於加密 (encryption),私密金鑰則只由一人持有,只用於解密。任何一個資訊用公開金鑰加密之後,用私密金鑰解密即可得到原來的資訊,反之則不一定。
公開金鑰加密的關鍵點在於,一方面,公開金鑰加密是可逆的,但是不能用公開金鑰推斷出私密金鑰。顯然數學上,已知一個公開金鑰是能夠算出對應私密金鑰的,但是只要設計足夠好的密碼編譯演算法(以及使用足夠複雜的金鑰組),使得不能在可以接受的時間內破譯即可。
RSA 是一種常見的公開金鑰加密演算法。RSA 的工作原理依賴於如下事實:破譯 RSA 私密金鑰需要對某些極大的整數進行因數分解,而目前尚未找到快速的對極大整數作因數分解的演算法。換言之,如果有人找到了這樣的演算法,那麼全世界的 RSA 加密都會失效。
RSA是由Ron Rivest, Adi Shamir, Leonard Adleman三人在1978年首次提出的。三人並因此項工作榮獲了2002年Turing Award。周時,Rivest還是演算法導論的作者之一,書中在31章對RSA系統的原理進行了簡要說明,系統實現中利用到了數論中的Euler-Fermat theorem。
COMMENT: 但不管怎麼,極大整數的因數分解還是可能的。RSA_Laboratories舉辦過多次懸賞破譯 RSA 的活動,更多資訊可以看看 RSA_Secret-Key_Challenge。
儘管隨著密碼學的發展,RSA 的安全性已經越來越受到威脅,但是未來能誕生可以在多項式時間內破譯 RSA 的可能性還是非常小的。也就是說,除了軍方、金融等高危目標之外,RSA 還是適用的。
5.1. 進一步閱讀
公開金鑰加密
Public-key_cryptography
[轉] SSH 金鑰認證機制