万书网 > 文学作品 > 深度探索Linux操作系统 > 6.6 安装并配置ssh服务

6.6 安装并配置ssh服务



既然网络已经配置好了,一般情况下就不必再通过第三方系统(即虚拟机)更新vita系统了,可以直接通过网络和vita系统打交道了。当然如果是更新内核、initramfs或者整个文件系统,还是要通过虚拟机系统的。我们在宿主系统和vita系统之间使用ssh服务进行通信。因此在这一节,我们为vita系统安装并配置ssh服务。

我们使用ssh协议的开源实现openssh,其依赖zlib和openssl,因此首先编译安装这两个软件包。

使用如下命令编译安装zlib:



使用如下命令编译安装openssl:



openssh的依赖已经安装完成,下面安装openssh,命令如下:



在openssh的编译脚本中,调用链接器时传递了参数-fstack-protector-all。链接器不允许链接可执行文件时使用以"-f"开头的参数,以"-f"开头的参数只能用于链接动态库。解决这个问题的方法之一就是避免直接调用链接器进行链接,而是通过gcc间接调用链接器。这就是在配置openssh时设定LD=i686-none-linux-gnu-gcc,覆盖系统环境变量中定义的LD=i686-none-linux-gnu-ldd的目的。

读者可能会有个疑问:在宿主系统上编译openssh时并不会遇到类似问题啊!那是因为在非交叉编译环境下,一般系统环境变量中不会定义LD,而如果环境变量中没有定义,那么openssh的编译脚本则将LD定义为编译器,从而绕过了这个问题,脚本如下:



当然读者不必纠结这个问题,这仅是openssh在交叉编译环境中的一个小插曲而已。安装完ssh后,下面我们开始配置ssh服务。

openssh支持一种安全机制,称为特权分离(Privilege  Separation),这个机制是默认开启的。但是这个机制要求一些附加操作,比如建立非特权用户等。为简单起见,我们关掉了这个机制。

为了方便,vita系统允许ssh服务使用root用户登录。同样为了方便,笔者将vita系统的root密码设置为空,因此也需要配置ssh服务允许登录用户密码为空。

最终,ssh服务的配置文件sshd_config中的相关变量按照如下进行修改:



除了配置ssh服务外,根据ssh协议2.0的要求,还需要为ssh服务创建dsa、rsa和ecdsa三种类型的密钥。而创建密钥需要一些账户信息,因此,我们首先要为vita系统添加账户信息。

用户信息保存在文件/etc/passwd中,格式为:



其中,name是用户名;password是用户密码;uid是用户ID;gid是用户所属的组;comment保存如用户的真实姓名等一些信息;home是用户的属主目录;shell是用户登录后执行的命令。

组信息保存在文件/etc/group中,格式为:



其中,group_name是组名;password是组的密码;gid是组ID;user_list部分记录属于该组的所有用户(用户之间使用逗号分隔)。

我们在vita系统上创建的的具体的passwd和group文件分别如下:



一切准备就绪后,更新vita的文件系统。重启后,在vita系统上使用命令ssh-keygen创建密钥,这个工具也是软件包openssh提供的。

在默认情况下,dsa、rsa和ecdsa分别存储在文件/etc/ssh/ssh_host_dsa_key、/etc/ssh/ssh_host_rsa_key以及/etc/ssh/ssh_host_ecdsa_key中,当然也可以在ssh服务的配置文件sshd_config中修改这些默认的设置。创建密钥的命令分别如下:



当ssh-keygen提示输入"passphrase"时,直接按回车即可。图6-11是在笔者构建的vita系统上创建dsa密钥的过程:

图 6-11 创建dsa密钥

其他两个密钥rsa和ecdsa按照dsa的创建如法炮制即可。

密钥创建一次即永久保存在文件系统了,如果删除了vita系统的根文件系统,需要再次重新创建这几个密钥。

从宿主系统远程登录vita系统时,vita系统需要为登录的用户分配伪终端(PTY),而伪终端设备节点建立在/dev/pts目录下,并且/dev/pts要求挂载devpts文件系统。如果没有挂载devpts,登录将失败,报错信息类似如下:



为此,修改init程序,挂载devpts,方法如下:



一切就绪,在vita系统启动时,默认启动ssh服务:



更新vita系统的init程序,重启后,就可以顺利地从宿主系统登录到vita系统了。一旦可以远程登录到vita,工作的效率就会大大提高,我们可以使用宿主系统的强大的终端。而且,更重要的一点是,除非对根文件系统进行彻底的更新,或者更新内核,否则不再需要频繁地重启系统。