跳转至内容

OpenSSH/服务器

100% developed
来自 Wikibooks,开放世界中的开放书籍

OpenSSH 服务器,sshd(8),监听来自客户端的连接,并为每个新的传入连接启动一个或两个新进程来处理密钥交换、加密、身份验证、程序执行和数据交换。在多路复用情况下,一些进程会被重用。它可以独立运行并等待在后台,也可以在前景运行,或者可以按需由任何互联网服务守护程序加载。

从 8.2 版开始,ps(1) 中显示的监听进程标题还显示了等待身份验证的连接数。

$ ps -p $(pgrep -u root sshd) -o pid,user,args 
  PID USER     COMMAND
44476 root     sshd: /usr/sbin/sshd [listener] 0 of 10-100 startups (sshd)

请注意,这是等待身份验证的连接数,而不是已经验证的连接数。每个连接都有自己的独立处理程序进程,由已验证的帐户拥有。

sshd(8) 是安全 shell 守护程序,它监听传入的连接。IANA 指定的 ssh(1) 的标准端口是 22 [1]。如果 sshd(8) 不监听特权端口,则无需由 root 启动。但是,很少有(如果有的话)情况下应该考虑使用非标准端口。 sshd(8) 可以绑定到多个地址或仅绑定到某些地址。 sshd(8) 的多个实例(每个实例都有不同的配置)可以在同一台机器上运行,这在多宿主机器上可能很有用。启动 sshd(8) 必须提供绝对路径,例如 /usr/sbin/sshd

配置数据首先从 shell 传递的参数和选项、用户特定文件以及最后从系统范围的配置文件中解析。

sshd(8) - 允许您登录的 SSH 守护程序。
sftp-server(8) - SFTP 服务器子系统,在需要时由 sshd(8) 自动启动。
ssh-keysign(8) - 基于主机的身份验证的辅助程序。
sshd_config(5) - 服务器配置文件。

可以使 sshd(8) 守护程序解析配置文件、测试其有效性,然后报告有效的配置设置。这是通过运行扩展测试模式 (-T) 来完成的。扩展测试将打印出实际的服务器设置。它还可以通过使用 Match 指令与连接规范 (-C) 参数结合使用来报告对设置的修改。-C 的选项是 userhostaddr。其中,hostaddr 分别指的是运行 sshd(8) 的主机和连接来自的地址。

以下将打印出如果用户 'fred' 从地址 192.168.100.5 尝试登录到主机 server.example.org,将应用的配置。

$ /usr/sbin/sshd -TC user=fred,host=server.example.org,addr=192.168.100.5

输出很长,因此可能需要通过管道将其传递到 sort(1) 和类似 less(1) 的分页器。有关更多选项,请参见 调试服务器配置 部分。

默认情况下,所有组都允许登录。但是,如果指定了 AllowGroupsAllowUsers,则不允许列出的所有用户或组登录。允许/拒绝指令按以下顺序处理

  1. DenyUsers,
  2. AllowUsers,
  3. DenyGroups,最后是
  4. AllowGroups.

匹配到的第一个模式将生效,因此,如果存在 AllowUsers,它将完全覆盖 AllowGroups,无论它们在配置文件中的顺序如何。因此,为了获得最大的灵活性,建议使用 AllowGroups。相反,DenyUsersDenyGroups 不会相互干扰,可以一起使用。列出组名或组名模式,用空格隔开。如果指定了,则只允许或拒绝属于与列表中的组或模式匹配的组的用户的登录。仅组名或用户名有效;数字组 ID 或用户 ID 不会被识别。

inetd / xinetd 下的 sshd

[编辑 | 编辑源代码]

互联网服务守护程序是一个服务器,用于按需启动其他服务器。 xinetd(8)inetd(8) 是两种变体,可以利用它们来指定额外的参数和约束,包括以特定用户和组的身份运行启动的服务。通过使一个守护程序处于活动状态,并根据需要调用其他守护程序,可以减少对系统的需求。以这种方式启动 sshd(8) 意味着 inetd(8) 等待传入的请求,启动 sshd(8),然后当 SSH 会话结束时,关闭 sshd(8).

              Packet
 Internet --> Filter --> tcpwrappers --> (x)inetd --> sshd
             (firewall)  (aka tcpd)

两者都可以用于额外的日志记录,例如成功或不成功的登录、访问限制,甚至包括一天中的时间、CPU 优先级和连接数。还有更多可能性。有关配置选项的完整概述,请参见 xinetd.conf(5)inetd.conf(5) 的手册页。

inetd(8) 支持 tcpd,并且可以使用 tcpd' 的 tcpwrappers 来进一步控制访问或日志记录。 sshd(8) 本身也支持 tcpwrappers,直到 6.6 版。请参见手册页,了解有关如何使用配置文件 hosts.allowhosts.deny 的信息。从 6.7 版开始,OpenSSH 本身不再支持 tcpwrappers,因为当前的包过滤程序使它变得多余。

使用 inetd(8) 或 xinetd(8) 的两个主要缺点是,连接开始时可能会略微延迟,并且必须配置 sshd(8) 以允许从服务守护程序启动。延迟只影响初始连接,因此不会妨碍实际操作。互联网服务守护程序不应用于无状态服务,例如 HTTP 和 HTTPS,在这些服务中,每次操作本质上都是一个新的连接。再次,有关更多详细信息,请参见 xinetd.conf(5)inetd.conf(5) 的手册页。

来自 xinetd.conf(5) 的示例

service ssh
{
	socket_type     = stream
	protocol        = tcp
	wait            = no
	user            = root
	server          = /usr/sbin/sshd
	server_args     = -i
	per_source      = UNLIMITED
	log_on_failure  = USERID HOST
	# log_on_success  = PID HOST DURATION TRAFFIC EXIT
	# instances       = 10
	# nice            = 10
	# bind            = 192.168.0.100
	# only_from       = 192.168.0.0
	# access_times    = 08:00-15:25
	# no_access       = 192.168.54.0
	# no_access       += 192.168.33.0
	# banner          = /etc/banner.inetd.connection.txt
	# banner_success  = /etc/banner.inetd.welcome.txt
	# banner_fail     = /etc/banner.inetd.takeahike.txt
}

来自 inetd.conf(5) 的示例

ssh    stream  tcp     nowait  root /usr/sbin/sshd -i
ssh    stream  tcp6    nowait  root /usr/sbin/sshd -i

inetd(8) 相比,xinetd(8) 在功能方面有几个优势,但使用它们的地方很少见。

SFTP 服务器子系统

[编辑 | 编辑源代码]

SFTP 子系统首次出现在 OpenBSD 2.8 / OpenSSH 2.3[2] 中。它由 sshd(8) 根据需要使用 Subsystem 配置指令调用,而不是独立运行。子系统有两种形式。一种是常规的 sftp-server(8)。另一种是在进程中的 SFTP 服务器,在与 ChrootDirectory 指令一起使用时不需要任何支持文件。Subsystem 配置指令可以用于传递选项

-d 为用户指定一个备用起始目录,默认为用户的 home 目录。(6.2 版首次出现)

Subsystem sftp internal-sftp -d /var/www

-e 将日志信息发送到 stderr 而不是 syslog(3)

Subsystem sftp internal-sftp -e

-f 指定从 sftp-server(8) 记录消息时使用的 syslog(3) 设施代码。可能的值有:DAEMON、USER、AUTH、LOCAL0、LOCAL1、LOCAL2、LOCAL3、LOCAL4、LOCAL5、LOCAL6、LOCAL7。

Subsystem    sftp    /usr/libexec/sftp-server -f LOCAL0

-l 指定 sftp-server(8) 记录哪些消息。默认值为 AUTH。其他可能的值为:QUIET、FATAL、ERROR、INFO、VERBOSE、DEBUG、DEBUG1、DEBUG2 和 DEBUG3。INFO 和 VERBOSE 记录 sftp-server 代表客户端执行的事务。DEBUG 和 DEBUG1 等效,而 DEBUG2 和 DEBUG3 分别指定更高级别的调试输出。DEBUG 到 DEBUG3 的日志级别将违反用户隐私,不应在正常操作中使用。默认日志级别为 ERROR。实际路径将根据发行版或操作系统而有所不同。

Subsystem    sftp    /usr/libexec/sftp-server -l VERBOSE

-p-P 分别指定白名单和黑名单协议请求。逗号分隔列表将分别允许或禁止,如果同时使用,则黑名单将首先应用。-Q 提供服务器支持的协议功能列表。所有三个功能从版本 6.5 开始可用。实际路径将根据发行版或操作系统而有所不同。

在版本 6.5 中,requests 是唯一可查询的协议功能。

$ /usr/libexec/sftp-server -Q requests

-R 将 SFTP 子系统置于只读模式。尝试更改文件系统,包括以写入方式打开文件,将失败。

-u 覆盖用户的默认 umask 并显式设置用于创建文件和目录的 umask(2)。有关日志级别或日志设施的更多信息,请参阅 syslog.conf(5) 手册页。sshd(8) 必须能够访问 /dev/log 以使记录工作。因此,将 sftp-server(8) 子系统与主 SSH 服务器的 ChrootDirectory 选项结合使用需要 syslogd(8) 在 chroot 目录中建立一个日志节点。

Subsystem sftp internal-sftp -u 0002

这为 OpenSSH 5.4 及更高版本中的 SFTP 子系统设置了 umask。

环境变量

[编辑 | 编辑源代码]

ssh(1)sshd(8) 在登录时会自动设置一些环境变量。如果文件存在,并且允许用户更改环境,则用户可以在 ~/.ssh/environment 文件中显式定义其他变量。也可以在 authorized_keys 文件中按密钥设置变量,同样只有在允许用户更改环境的情况下才可行。

~/.ssh/environment 中,使用格式 NAME=value 设置变量。在 ~/.ssh/authorized_keys/etc/ssh/authorized_keys 中,格式为 environment="NAME=value" 有关更多信息,请参阅 sshd_config(5) 中的 PermitUserEnvironmentAcceptEnv 配置指令以及 ssh_config(5) 中的 SendEnv 指令。

以下变量可以由 ssh(1) 设置,具体取决于情况。

DISPLAY 如果隧道了 X11,则设置此变量,以便 DISPLAY 变量指示 X11 服务器的位置。当它由 ssh(1) 自动设置时,它指向 hostname:n 形式的值,其中 hostname 指示 shell 运行的主机,而 n 是一个大于或等于 1 的整数。 ssh(1) 使用此特殊值通过安全通道转发 X11 连接。用户通常不应显式设置 DISPLAY,因为这会使 X11 连接不安全,并且需要用户手动复制任何必要的授权 cookie。

HOME 用户主目录的路径。

LOGNAME USER 的同义词。这是为了与使用此变量的系统兼容而设置的。

MAIL 用户邮箱的路径。

PATH 编译 ssh(1) 时指定的默认 PATH。

SSH_ASKPASS 如果 DISPLAYSSH_ASKPASS 都已设置,并且 SSH 会话没有关联的终端或伪终端,则由 SSH_ASKPASS 指定的程序将执行并打开一个 X11 窗口以在需要时读取密码。这在从 xsession 或相关脚本调用 ssh(1) 时特别有用。在某些机器上,可能需要从 /dev/null 重定向输入以使其工作。

SSH_AUTH_SOCK 客户端机器上的路径,用于告诉 ssh(1) 用于与 SSH 密钥代理通信的 UNIX 域套接字。

SSH_CLIENT 标识连接的客户端端。它包含三个空格分隔的值:客户端 IP 地址、客户端端口号和服务器端口号。

SSH_CONNECTION 标识连接的客户端和服务器端。该变量包含四个空格分隔的值:客户端 IP 地址、客户端端口号、服务器 IP 地址和服务器端口号。

SSH_ORIGINAL_COMMAND 如果使用了 ForceCommand 指令,或者在密钥中使用了 Command="...",则此变量包含原始命令,包括原始选项。它可用于提取原始参数。

SSH_TTY 此变量设置为与当前 shell 或命令关联的 TTY 的名称(设备的路径)。如果当前会话没有 TTY,则不会设置此变量。

SSH_USER_AUTH 如果在 sshd_config(5) 中设置了 ExposeAuthInfo,则此变量将包含一个临时文件的名称,该文件包含用于此特定会话的身份验证方法。

TZ 如果在启动守护进程时设置了此变量,则它将设置为指示当前时区。SSH 守护进程将此值传递给新连接。

USER 设置为登录用户的名称。


参考文献

[编辑 | 编辑源代码]
  1. "服务名称和传输协议端口号注册表". IETF. 2012.
  2. "OpenSSH 2.3.0p1 发行说明". OpenSSH.com.

 

华夏公益教科书