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