FW:
http://tetralet.luna.com.tw/inde ... eId=59&blogId=1
使用 RSA 來登入 SSH!
Tetralet | 18 元月, 2006 11:23
在 GNU/Linux 的世界裡,使用網路來遠端操縱主機是極為稀鬆平常的小技巧。我們不必親自跑到 GNU/Linux 前面才能操作主機,只要透過網路,就算是遠在天涯您還是可以輕易得操作 GNU/Linux 主機,就像是您是坐在主機前一樣。
而其中的代表便是 SSH (Secure Shell)。SSH 使用了
公/私鑰
系統來確保您透過網路來操作 GNU/Linux 時的安全性,像是您在鍵入密碼、開啟某份機密文件、修改主機設定... 時,沒有人有辨法能得知您的操作指令及所傳送的內容。您可以在
用 GPG 來保護您的郵件!(一)
裡大略得了解到
公/私鑰
的運作方式。
當我們第一次登入 SSH 伺服器時,您會收到類似的以下資訊:
$ ssh luna.com.tw
The authenticity of host 'luna.com.tw (60.248.131.86)' can't be established.
RSA key fingerprint is 5c:d2:5f:d5:c4:92:15:dc:2b:80:a1:1d:14:f3:7d:2f.
Are you sure you want to continue connecting (yes/no)?
千萬別急著按下『yes』
。記得我們在
用 GPG 來保護您的郵件!(一)
裡的警告嗎?
雖然
公共金鑰
可以亂給,但
千萬不能亂拿。因為您接受了那份
公共金鑰
,就代表您完全信任這份金鑰的擁有者。所以我們不會輕易接受經由網路或是電子郵件所得到的金鑰;我們喜歡當面交付
公共金鑰
,並會要求對方出示身份證或護照以示證明。
所以聰明的我們才不會輕易得按下『yes』。那麼有什麼好方法能夠利用
公/私鑰
系統來確認彼此的身份呢?
解決方案之一便是我們自行建立我們自已的 SSH 金鑰,然後將我們的 SSH
公共金鑰
用磁片當面交付給 SSH 主機的管理者,在 SSH 主機的管理者認可後,我們便能使用我們的
私人密鑰
來和 SSH Server 直接連線。記得嗎?
公/私鑰
的特性:
被
私人密鑰
所加密的訊息,只有
公共金鑰
能解開。而這樣將只有 SSH 主機的管理者認可的人才能使用 SSH 登入系統,而其它像是使用密碼來進行認證就可以廢棄不用了,免得一天到晚有人進來 SSH 主機踹密碼。
實作方法如下。首先,我們要先自行產生一對 SSH 金鑰:
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (
/home/tetralet/.ssh/id_rsa
):
(金鑰存放位置)
Enter passphrase (empty for no passphrase):
(鍵入
私人密鑰的
密碼
,千萬不可使用空密碼)
Enter same passphrase again:
(再鍵入一次以進行確認
)
Your identification has been saved in /home/tetralet/.ssh/id_rsa.
Your public key has been saved in /home/tetralet/.ssh/id_rsa.pub.
The key fingerprint is:
fa:c4:df:a8:48:f1:b2:8c:2d:6e:e7:d1:a4:c2:20:9e tetralet@debian
這樣會在 ~/.ssh 裡產生一對 1024 位元的金鑰,其中
id_rsa.pub
是
公共金鑰
,而
id_rsa
則是
私人密鑰
。請注意
id_rsa
的權限是否為 600:
$ ls -l ~/.ssh
總計 12
-rw-------
1 tetralet tetralet 951 Jan 1 12:00 id_rsa
-rw-r--r-- 1 tetralet tetralet 236 Jan 1 12:00 id_rsa.pub
然後,將
id_rsa.pub
用磁片當面交付給 SSH 主機的管理者。
而 SSH 主機的管理者可以修改 SSH 主機的 /etc/ssh/sshd_config 如下:
# 設定 root 無法以 SSH 登入
PermitRootLogin no
# 設定只有 ming 這個帳號可以登入
AllowUsers ming
# 關閉帳號密碼認證
ChallengeResponseAuthentication no
並重新啟動 SSH。
然後,將拿到的
公共金鑰
加入登入使用者的 ~/.ssh/authorized_keys 中:
cat
id_rsa.pub
>>
/home/ming/.ssh/authorized_keys
請注意到,並沒有限定
公共金鑰
的擁有者和登入帳號必須相同。您可以使用 -l 參數來以其它的帳號登入 SSH 主機。例:
ssh -l ming luna.com.tw
之後,該使用者的 SSH 登入方式就有所差異了:
# ssh -l ming luna.com.tw
Warning: Permanently added the RSA host key for IP address '60.248.131.86' to the list of known hosts.
Enter passphrase for key '/home/tetralet/.ssh/id_rsa':
(請在此鍵入
私人密鑰的
密碼
)
只要在 SSH 主機的
/home/ming/.ssh/authorized_keys
找到對應的
公共金鑰
的人都可以用 ming 來直接登入 SSH 主機。而沒有將
公共金鑰
放在 SSH 主機上的使用者將二話不說直接被踢出去:
# ssh -l ming luna.com.tw
Permission denied (publickey).
從此之後,唯有提供了
公共金鑰
並通過 SSH 主機的管理者所認可帳號才能登入這台 SSH 主機,而其它的人根本就無門可入。這樣子應該能有效得提昇 SSH 主機的安全性了。