OpenSSH-4.7p1 安装指南
版权声明
本文作者是一位开源理念的坚定支持者,所以本文虽然不是软件,但是遵照开源的精神发布。
- 无担保:本文作者不保证作品内容准确无误,亦不承担任何由于使用此文档所导致的损失。
- 自由使用:任何人都可以自由的阅读/链接/打印此文档,无需任何附加条件。
- 名誉权:任何人都可以自由的转载/引用/再创作此文档,但必须保留作者署名并注明出处。
其他作品
本文作者十分愿意与他人分享劳动成果,如果你对我的其他翻译作品或者技术文章有兴趣,可以在如下位置查看现有的作品集:
联系方式
由于作者水平有限,因此不能保证作品内容准确无误。如果你发现了作品中的错误(哪怕是错别字也好),请来信指出,任何提高作品质量的建议我都将虚心接纳。
系统需求
你必须在系统上安装有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中的配置指令
已知的几个问题:
- 如果你的编译过程依赖于ssh-rand-helper,那么除非预先安装ssh-rand-helper,否则测试将失败。
- 类似的,如果你的$PATH环境变量中不包含"scp",那么multiplex scp测试将会失败。
- 由于新版本的GNU coreutils反对使用"head -[n]"语法,这将导致yes-head测试失败,解决的办法是在测试前设置_POSIX2_VERSION=199209环境变量。
- 笔者发现测试套件要求 /bin 目录下至少有两个"l"打头的文件,否则 sftp-badcmds 等测试会失败,这应当是一个bug 。
安装和配置
如果测试也通过了,那么接下来就是安装和配置了。安装很简单,一条 make install 命令即可,此命令会同时生成密钥对并安装默认的配置文件。
但是大多数情况下,我们会自己动手,重新生成密钥对,同时也会重新编辑配置文件。具体的细节可以参考 ssh-keygen(1) sshd_config(5) 手册页。