从入门到精通:构建SSH安全通道(1)


SSH命令行实用程序是远程系统的工作人员安全访问的通道。SSH代表着安全外壳,所以你可能认为其最常用的使用方法就是用作一个远程外壳。也许这是其最常见的应用,但并非使用SSH的唯一的有趣方法。

一、连接、执行远程命令并使用授权密钥

1、创建一个连接

为通过SSH进行通信,你首先需要建立一个到达远程服务器的连接。使用SSH命令行实用程序时,我们有很多参数选择。最基本的命令行参数是:

1SSH IP地址

在这里,IP地址就是你想要连接的服务器的IP地址。下面是一个简单的例子:

abc:~ jmjones$ ssh 192.168.1.20

The authenticity of host '192.168.1.20 (192.168.1.20)' can't be established.

RSA key fingerprint is 24:1e:2e:7c:3d:a5:cd:a3:3d:71:1f:6d:08:3b:8c:93.

Are you sure you want to continue connecting (yes/no)? yes

Warning: Permanently added '192.168.1.20' (RSA) to the list of known hosts.

注意,上面的消息中有这样一行“The authenticity of host '192.168.1.20 (192.168.1.20)' can't be established.”。这条消息意味着笔者的SSH 客户端并不知道远程服务器。笔者在这里用了客户端,因为SSH命令行实用程序初始化了网络并使其成为网络客户端。

在上面的消息中,SSH程序还询问作者是否希望继续连接(Are you sure you want to continue connecting (yes/no)? )笔者的回答是“yes”,因为笔者知道这台服务器正是笔者想连接的服务器。一般而言,对此问题回答“yes”是比较安全的。(但如果不怀好意的家伙假冒了你想连接的服务器,这样做就危险了。)在回答“yes”继续连接后,笔者的客户端用下面的内容更新了文件$HOME/.ssh/known_hosts

192.168.1.20 ssh-rsa

^4rsa5jmjones6cd7jmjones8^/^9cd10^+9^11yc12yc13rsa14AAAAB15^+^16r

sa17AAAAB18^99u2^19oT20oT21^7N7^22AAAAB23^+^24cd25^5f+^26ykuwQcXI

27EAAAABIwAAAQEAvb28jmjones29oT30commandline31^2Ax3J88^32commandl

ine33yc34^+rOB+gOdRaD+NTkuzrB/^38oT39^50L6^40oT41AAAAB42^61rq+9v+4^

44AAAAB45rsa46ykuwQcXI47^5q1P11^48AAAAB49gcgPr50^==

在笔者再次连接到同样的服务器时,笔者的SSH客户端将检查“known_hosts”文件,检查是否与上次的服务器相同。如果服务器传回的信息与“known_hosts”文件中的信息不匹配,就会看到类似于下面的消息:

abc:~ jmjones$ ssh 192.168.1.20

WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!

Someone could be eavesdropping on you right now (man-in-the-middle attack)!

It is also possible that the RSA host key has just been changed.

The fingerprint for the RSA key sent by the remote host is

24:1e:2e:7c:3d:a5:cd:a3:3d:71:1f:6d:08:3b:8c:93.

Please contact your system administrator.

Add correct host key in /Users/jmjones/.ssh/known_hosts to get rid of this message.

Offending key in /Users/jmjones/.ssh/known_hosts:1

RSA host key for 192.168.1.20 has changed and you have requested strict checking.

Host key verification failed.

2、口令验证

继续上面的例子。在回答了“yes”后,程序要求笔者输入口令。下面是此次交互的部分信息:

jmjones@192.168.1.20's password:

Be careful.

No mail.

Last login: Tue Dec 30 06:36:20 2008 from abc

jmjones@oksir:~$

笔者键入了口令,然后ssh客户端与远程服务器建立了一个交互连接。在此,可以看出登录到一个Linux服务器的证据,如上次登录的时间。

3、授权密钥

如果我们不想在每次登录时都键入口令该怎么办?或者,笔者是一个系统管理员,希望让服务器更强健,让不法之徒难以猜测,又该如何呢?我们可以使用一个公钥/私钥对来让登录到服务器的过程更安全更简单。

为使用公钥私钥对,我们必须创建它。可通过在命令行使用ssh –keygen程序来达此目的。其实,该命令还是有许多参数的,如密钥的类型、想要创建的文件名、密钥文件的注释等,不过我们完全只使用默认选项。下面是笔者在没有使用任何参数时的结果:

abc:~ jmjones$ ssh-keygen

Generating public/private rsa key pair.

Enter file in which to save the key (/Users/jmjones/.ssh/id_rsa):

Created directory '/Users/jmjones/.ssh'.

Enter passphrase (empty for no passphrase):

Enter same passphrase again:

Your identification has been saved in /Users/jmjones/.ssh/id_rsa.

Your public key has been saved in /Users/jmjones/.ssh/id_rsa.pub.

The key fingerprint is:

fe:e9:fa:f5:e2:4e:a1:6c:9e:9e:20:a4:cc:ec:4f:62 jmjones@abc

The key's randomart image is:

+--[ RSA 2048]----+

| |

| |

| |

| |

| . S . |

| + o . . . . |

| E o o + o |

| o o . = *.. |

| ... .=Xoo.. |

+-----------------+

笔者接受了“id_rsa”作为密钥文件,还接受了不输入任何口令短语的默认选项。如果选择了给文件添加一个口令短语,那么在每次使用时都得输入此短语。运行ssh-keygen的结果是在$HOME/.ssh文件中生成了两个文件:

abc:~ jmjones$ ls -l ~/.ssh/

total 16

-rw------- 1 jmjones staff 1675 Dec 30 17:37 id_rsa

-rw-r--r-- 1 jmjones staff 400 Dec 30 17:37 id_rsa.pub

“id_rsa”是笔者的私钥。笔者并不希望任何人可以访问这个文件,以防止其他人冒充自己。注意,对“id_rsa”的限制强于对“id_rsa.pub”的限制。笔者可以将此文件传送给希望连接的任何人。不用担心,任何人都无法猜测我们的私钥是什么。


相关内容