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