OpenSSH-4.7p1 安装指南

作者:金步国


版权声明

本文作者是一位自由软件爱好者,所以本文虽然不是软件,但是本着 GPL 的精神发布。任何人都可以自由使用、转载、复制和再分发,但必须保留作者署名,亦不得对声明中的任何条款作任何形式的修改,也不得附加任何其它条件。您可以自由链接、下载、传播此文档,但前提是必须保证全文完整转载,包括完整的版权信息和作译者声明。

其他作品

本文作者十分愿意与他人共享劳动成果,如果你对我的其他翻译作品或者技术文章有兴趣,可以在如下位置查看现有作品的列表:

BUG报告,切磋与探讨

由于作者水平有限,因此不能保证作品内容准确无误,请在阅读中自行鉴别。如果你发现了作品中的错误,请您来信指出,哪怕是错别字也好,任何提高作品质量的建议我都将虚心接纳。如果你愿意就作品中的相关内容与我进行进一步切磋与探讨,也欢迎你与我联系。联系方式:MSN: [email protected]


系统需求

你必须在系统上安装有Zlib(1.2.1.2以上)和OpenSSL(0.9.6以上),这两个是必须的。如果你的操作系统提供了 /dev/random ,那么应该将 OpenSSL 配置为使用此文件作为随机数源。

下面这些软件包是可选的:PRNGD,EGD,PAM,GNOME,TCP Wrappers,S/Key Libraries,LibEdit,Autoconf,Basic Security Module (BSM) ;仅在你确实需要使用到它们的时候才需要。

特权分离(Privilege Separation)

所谓特权分离(Privilege Separation)实际上是一种OpenSSH的安全机制,类似于chroot能够提供的安全性。这个特性是默认开启的,配置文件中的 UsePrivilegeSeparation 指令可以开启或关闭这个特性。

使用此特性的关键之处在于设置一个空目录,并将此目录的权限设置为"000",宿主设置为"root"。然后还需要设置一个用于特权分离的非特权用户,比如sshd,并将此用户的家目录设置为这个空目录。比如可以使用下面这样的命令:

	# mkdir -p  /var/empty
	# chown 0:0 /var/empty
	# chmod 000 /var/empty
	# groupadd sshd
	# useradd -g sshd -c 'sshd privsep' -d /var/empty -s /bin/false sshd

然后在运行配置脚本的时候,使用

  --with-privsep-path=/var/empty
  --with-privsep-user=sshd

来指定目录和用户。

配置和编译

将下载回来的压缩包解压,进入解压后的目录,即可使用 configure 脚本进行配置。下面是 configure 选项的说明:

--prefix=PREFIX
安装目录[/usr/local]
--sbindir=DIR
系统管理员使用的可执行程序目录[EPREFIX/sbin]
--sysconfdir=DIR
配置文件目录[PREFIX/etc]
--disable-largefile
禁用大文件(>2G)支持
--disable-strip
禁止在安装时调用strip来剥除不需要的调试符号
--disable-etc-default-login
不使用/etc/default/login文件中提供的PATH环境变量,推荐使用此选项
--disable-lastlog
禁止使用lastlog文件(记录每个用户最后登录成功的信息)
--disable-utmp
禁止使用utmp文件(记录着现在登录的用户)
--disable-utmpx
禁止使用utmpx文件(utmp的扩展)
--disable-wtmp
禁止使用wtmp文件(记录用户登录和退出事件)
--disable-wtmpx
禁止使用wtmpx文件(wtmp的扩展)
--disable-libutil
禁止使用libutil库(包含了很多"标准"函数,比如login()等等)
--disable-pututline
禁止使用pututline()函数(用来记录utmp文件)
--disable-pututxline
禁止使用pututxline()函数(用来记录utmpx文件)
--without-rpath
不在二进制文件中硬编码库文件的路径,也就是禁止添加 -R 连接器选项
--with-cflags
指定额外的编译器选项
--with-cppflags
指定额外的预处理器选项
--with-ldflags
指定额外的连接器选项
--with-libs
指定需要额外连接的库
--with-Werror
使用 -Werror 编译器选项编译代码。也就是将所有警告都当作错误。
--with-solaris-contracts
启用实验性的 Solaris process contracts
--with-osfsia
启用OSF1机器上的SIA(Security Integration Architecture)
--with-zlib=DIR
指定zlib库的安装目录
--without-zlib-version-check
禁止检查zlib的版本是否合适
--with-skey[=PATH]
启用 S/Key 支持。S/Key是一个在密码认证时使用一次性密码的系统。
--with-tcp-wrappers[=DIR]
启用TCP-wrappers支持(/etc/hosts.allow|deny),还可以指定wrapper库的安装目录。TCP-wrappers可以根据源地址执行访问控制。
--with-libedit[=PATH]
在 sftp 中使用libedit支持
--with-audit=debug|bsm
启用实验性的审计支持,目前只有debug(通过syslog记录额外的信息)和bsm(Sun的Basic Security Module)两种模式可选。
--with-ssl-dir=DIR
指定 OpenSSL 的安装目录
--without-openssl-header-check
禁止对OpenSSL的版本一致性进行检查
--with-ssl-engine
启用OpenSSL的ENGINE支持
--with-pam
启用PAM(Pluggable Authentication Modules)支持,使用此选项后还必须在sshd_config中开启UsePAM指令。
--with-random=FILE
指定操作系统提供的随机源文件(通常是/dev/random或/dev/urandom)
--with-rand-helper
仅在操作系统没有提供随机源的时候才需要使用这个选项来使用一个额外的ssh-rand-helper辅助程序来生成随机数。
--with-prngd-port=PORT
如果操作系统没有提供随机源并且还安装了EGD/PRNGD包,那么可以使用这个选项指定从PRNGD/EGD TCP localhost:PORT读取熵,而不使用内置的熵收集器。
--with-prngd-socket=FILE
如果操作系统没有提供随机源并且还安装了EGD/PRNGD包,那么可以使用这个选项指定从PRNGD/EGD socket FILE(默认为/var/run/egd-pool)读取熵,而不使用内置的熵收集器。
--with-entropy-timeout=N
指定熵收集命令的超时时间(毫秒)
--with-privsep-user=USER
指定运行非特权子进程的用户名
--with-privsep-path=xxx
指定非特权用户的chroot目录(默认为:/var/empty)
--with-sectok
使用libsectok以提供对智能卡的支持
--with-opensc[=PFX]
使用OpenSC以提供对智能卡的支持
--with-selinux
启用SELinux支持
--with-kerberos5=DIR
启用 Kerberos 5 支持
--with-xauth=FILE
指定 xauth 程序的绝对路径
--with-mantype=man|cat|doc
指定man page的类型
--with-md5-passwords
支持读取/etc/passwd或/etc/shadow中经过MD5加密的口令
--without-shadow
表明操作系统未使用影子密码(无需读取/etc/shadow而是直接读取/etc/passwd即可)
--with-ipaddr-display
在X转发时,在$DISPLAY中使用ip地址而不是主机名。这样可以解决和一些有缺陷的X库一起工作时遇到的麻烦。
--with-default-path=PATH
指定服务器运行时默认的 PATH 环境变量的值(冒号分隔的路径列表)
--with-superuser-path=PATH
指定服务器运行时默认的root用户的 PATH 环境变量的值(冒号分隔的路径列表)
--with-4in6
OpenSSH默认尽可能使用IPv6,除非明确给出了"-4"命令行选项。这个选项表示对IPv4地址进行检查,并且将其转换成IPv6的映射地址
--with-bsd-auth
启用BSD认证支持
--with-pid-dir=DIR
指定保存当前服务器主进程进程号的 ssh.pid 文件的存放目录[/var/run/sshd.pid]
--with-lastlog=FILE|DIR
指定 lastlog 文件的位置

configure 运行完毕后就可以使用 make 命令进行编译了,你可以在命令行上使用 CFLAGS 和 LDFLAGS 来指定进行编译优化。

测试

如果编译过程一切正常,那么接下来就可以使用 make tests 进行测试了。

OpenSSH的测试套件包含两个部分,第一部分是由Makefile驱动的基于文件的测试;第二部分是由regress/test-exec.sh脚本(会被Makefile多次调用)驱动的基于网络(network)或代理命令(proxycommand)的测试。第一部分测试失败将导致Makefile返回一个错误(make程序会退出),第二部分测试失败将会打印"FATAL"信息并继续执行。

下面是几个与测试相关的环境变量:

SUDO
sudo 命令的路径。需要注意的是,有些系统(特别是使用了PAM的系统)要求必须使用 sudo 来执行某些测试。
TEST_SSH_TRACE
设为"yes"以输出详细且罗嗦的测试信息
TEST_SSH_QUIET
设为"yes"以抑制测试成功的输出信息(仅输出失败信息)
TEST_SSH_x
测试中使用的各个命令的路径,其中的 x=SSH,SSHD,SSHAGENT,SSHADD,SSHKEYGEN,SSHKEYSCAN,SFTP,SFTPSERVER
TEST_SHELL
用于运行测试脚本的shell
TEST_SSH_PORT
用于监听测试的TCP端口
TEST_SSH_SSH_CONFOTPS
在运行每个测试前添加到ssh_config中的配置指令
TEST_SSH_SSHD_CONFOTPS
在运行每个测试前添加到sshd_config中的配置指令

已知的几个问题:

安装和配置

如果测试也通过了,那么接下来就是安装和配置了。安装很简单,一条 make install 命令即可,此命令会同时生成密钥对并安装默认的配置文件。

但是大多数情况下,我们会自己动手,重新生成密钥对,同时也会重新编辑配置文件。具体的细节可以参考 ssh-keygen(1) sshd_config(5) 手册页。