OpenSSH客户端和服务器共享一个共同的配置语法。在深入研究任何一个应用程序的细节之前,我们将讨论这些常见元素。熟悉类Unix系统的系统管理员应该对OpenSSH配置没有问题。
默认情况下,所有系统范围的OpenSSH配置文件都位于 /etc/ssh 中。一些操作系统使用其他位置,例如,OSX使用 /private/etc/ssh ,但符号链接到 /etc/ssh 。而FreeBSD的附加openssh-portable 使用 /usr/local/etc/ssh 。找到配置目录后,你将找到一组相当标准的文件。
ssh(1) 客户端的默认设置显示在 ssh_config 中。
以 ssh_host 开头并以 _key 结尾的文件是服务器的私钥。每个文件名的中间给出了加密算法——例如,ssh_host_ecdsa_key 包含使用ECDSA算法的主机密钥。这些文件只能由root读取。
每个私钥都有一个同名的对应文件,但在末尾添加了 .pub 。这是该文件的公钥。服务器将向客户端提供这些文件的内容。
最后,sshd_config 包含服务器配置。虽然你可以使用命令行选项调整 sshd ,但永久配置在配置文件中处理。
这两个配置文件都由一系列关键字组成,后面是关键字设置的值。这些值可以具有对配置目标有有意义的任何格式。以下是OpenSSH如何设置一个通用值:
xxxxxxxxxxPort 22关键字Port 设置为 22 。据推测,这对于Port关键字要表示的任何内容都是有意义的。我们将在【第3章 OpenSSH服务器】中了解这一点。您还将看到设置为文件路径的关键字。在这里,我们看到值 HostKey 设置为 /etc/ssh 目录中的文件路径。
xxxxxxxxxxHostKey /etc/ssh/ssh_host_ed25519_key设置任何关键字时,应遵循现有示例。有问题一定要参考手册页。
# (pound sign,英镑符号)表示注释,以 # 开头的行会被忽略。OpenSSH工作人员在分发他们的配置文件时,将所有选项设置为默认值并注释掉。虽然 sshd(8) 需要一个配置文件才能启动,但你可以使用 touch sshd_config 创建有效、有用和可工作的配置。SSH客户端和服务器在默认设置下运行良好。注释掉的设置仅作为方便的参考。
要修改默认值,删除 # 号并更改值。
某些环境需要将关键字设置为多个值。如何设置这些值取决于关键字。HostKey 和 Port 等关键字可以多次出现,每次都有单独的值:
xxxxxxxxxxPort 22Port 2222像 Host 这样的关键字接受多个值,用空格分割:
xxxxxxxxxxHost envy.mwl.io avarice.mwl.io其他关键字(如 Address)需要逗号分割的值:
xxxxxxxxxxAddress 192.0.2.0/25, 198.51.100.0/24如果 ssh(1) 或 sshd(8) 抱怨配置问题,请验证你是否正确分割了多个条目。这本书包含了许多分配多个值的示例,但OpenSSH手册始终是最后的答案。
通配符——wildcards
OpenSSH服务器和客户端的配置文件接受通配符,称为模式(patterns)。模式不是列出配置设置的所有可能值,而是让你说“任何与此表达式匹配的值”。通配符最常用于匹配规则,如本章后面的“带匹配的条件配置”所述。模式允许您编写配置语句,如“此域中的所有主机”或“此网络中的所有IP地址”。两个通配符是:
? 只匹配一个字符* 匹配零个或更多字符比如,我可以使用pattern将 Host 关键字的值设置为 mwl.io 中的任何主机:
xxxxxxxxxxHost *.mwl.io如果使用问号通配符,此模式将匹配任何具有一个字符主机名的主机。很少有环境根据主机名的长度来分隔安全域,但如果确实如此,你可以使用多个问号来标识条目。以下示例匹配 slath.mwl.io 和 wrath.mwl.io ,但不匹配 gluttony.mwl.io 或 a.mwl.io :
xxxxxxxxxxHost ?????.mwl.iopattern对IP地址也很有用,以下示例匹配主机 203.0.113.10 到 203.0.113.19 :
xxxxxxxxxxAddress 203.0.113.1?如果我使用星号通配符,我可以匹配 /24 网络中的任何IP:
xxxxxxxxxxAddress 203.0.113.*您可以使用具有IP地址范围的网络掩码,如第5章所述。
通过在前面加一个感叹号来否定模式。此模式匹配 mwl.io 中除主机之外的所有内容:
xxxxxxxxxxHost !*.mwl.io当与更大的实体结合时,否定是最有用的——也就是说,“匹配除一小块之外的所有内容”。如果我想匹配 mwl.io 中的每个主机,除了子域名 vermin.mwl.io 中的客户,我可以使用这种模式。并非所有关键字都支持否定;你必须尝试一下,看看它是否适用于你的环境:
xxxxxxxxxxHost !.vermin.mwl.io *.mwl.ioOpenSSH的首席开发人员将否定描述为“有点棘手”。我称之为“可能会给你带来麻烦”。如果你需要否定,请彻底测试。
你的服务器可能需要根据传入连接的源地址或主机名或用户名而采取不同的行为。SSH客户端可能需要为特定的主机组使用不同的用户名,或者在本地网络上使用时激活X转发(第9章)。sshd_config 中的 Match 关键字允许你为这种情况建立特殊配置。
在每条 Match 语句后面都有一组触发匹配的条件,然后是一系列配置语句,OpenSSH应该应用于满足所有这些条件的连接。我们将在下一节中看到几个例子。
在实现 Match 语句之前,请为最常见的设置配置OpenSSH。例如,如果你在配置 sshd ,你可能希望拒绝将X转发给除选定用户之外的所有用户。配置 sshd 以拒绝X转发,然后使用 Match 语句检查用户名并允许X转发给匹配的用户。虽然我们还没有介绍X转发,但它在 sshd_config 中拥有一个条目:
xxxxxxxxxxX11Forwarding no在下面的所有示例中,这样的条目出现在 sshd_config 的开头附近,作为我们将选择性覆盖的默认设置。
您不能使用 Match 语句来调整所有可能的 ssh_config 和 sshd_config 关键字。查看手册页面,了解支持的关键字的完整列表。
我遇到的最常见的情况是,我想为特定用户或组启用选项。User 或 Group 匹配条款允许这样做。
xxxxxxxxxxX11Forwarding noMatch User mwlucasX11Forwarding yes我总是被允许使用X转发,因为我强大的通灵能力消除了所有可能的安全风险。
如果我的所有系统管理员都拥有这些权限,或者如果我满足于消灭授权入侵者的系统管理员,我可以匹配包含我的系统管理员的整个组。
xxxxxxxxxxX11Forwarding noMatch Group wheelX11Forwarding yes如果您需要多个 Match 术语,请用逗号分隔:
xxxxxxxxxxX11Forwarding noMatch User mwlucas, jgballardX11Forwarding yes我知道什么时候使用X转发。我的用户声称他也是。我们拭目以待。
也许你必须允许X转发,但只能来自特定的网络。您可以匹配IP地址:
xxxxxxxxxxX11Forwarding noMatch Address 203.0.113.0/29, 198.51.100.0/24X11Forwarding yes如果在 sshd_config 中将 UseDNS 设置为 yes ,Match 将接受主机名,并附带通常的DNS安全和可用性警告:
xxxxxxxxxxX11Forwarding noMatch Host *.mwl.io, *.michaelwlucas.comX11Forwarding yes仔细检查DNS故障是否不会将您锁定在DNS服务器之外,并阻止您解决问题。
仅适用于 ssh_config ,在使用每台主机配置时跳过 Match 一词:
xxxxxxxxxxX11Forwarding noHost avariceX11Forwarding yesssh_config 中的此配置语句早于 Match 语法。
您可以在一行中列出多个匹配项。在这里,我允许单个用户在从某个IP地址连接时使用密码身份验证。
xxxxxxxxxxMatch Address 192.0.2.8 User djmPasswordAuthentication yes用户 djm 可以通过密码登录,但只能从 192.0.2.8 的主机登录。
Match 语句之后的所有配置语句都属于该 Match 语句,直到出现另一个 Match 语句或直到文件结束。这意味着匹配项必须出现在配置文件的末尾。考虑以下 sshd_config 代码片段。
xxxxxxxxxx…X11Forwarding noPasswordAuthentication no…Match Group wheelX11Forwarding yes Match Address 192.0.2.0/29, 192.0.2.128/27PasswordAuthentication yes关键字 X11Forwarding 和 PasswordAuthentication 设置为 no 。当组 wheel 中的用户登录时,sshd 会将该用户的选项 X11Forwarding 设置为 yes 。当用户从 192.0.2.0/29 或 192.0.2.128/27 中的IP地址登录时,PasswordAuthentication 选项设置为 yes 。如果 wheel 组中的用户从其中一个地址登录,他将获得两个选项。
在本书中,我们将演示 sshd(8) 和 ssh(1) 的 Match 语句。
现在让我们来谈谈OpenSSH服务器。