通配符
访问控制语言支持显式通配符,包括:
- 'ALL' - 通用通配符,始终匹配。
- 'LOCAL' - 匹配名称不包含点字符的任何主机。
- 'UNKNOWN' - 匹配名称未知的任何用户,并匹配名称或者地址未知的任何主机。应谨慎使用此模式:由于临时名称服务器问题,主机名可能不可用。当软件无法确定它正在通话的网络类型时,网络地址将不可用。
- 'KNOWN' - 匹配名称已知的任何用户,并匹配名称和地址已知的任何主机。应谨慎使用此模式:由于临时名称服务器问题,主机名可能不可用。当软件无法确定它正在通话的网络类型时,网络地址将不可用。
- 'PARANOID' - 匹配名称与其地址不匹配的任何主机。当使用 -DPARANOID(默认模式)构建 tcpd 时,它甚至在查看访问控制表之前就丢弃来自此类客户端的请求。当我们想要更多地控制此类请求时,无需 -DPARANOID 即可构建。
使用 Hosts.allow 文件
/etc/hosts.allow 文件允许我们选择哪些计算机可以访问系统。
在该文件中,我们可以以纯文本形式指定简单的规则来告诉计算机如何处理连接。
首先,创建一个规则,允许任何计算机使用所有服务。
ALL: ALL
就这么简单。
然后,如果我们想排除有问题的计算机,我们也可以这样做。
ALL: ALL EXCEPT 192.168.1.110
我们可以使用其他几个关键字来处理不同的计算机组。
例如,我们可以像这样允许所有本地流量:
ALL: 192.168.1.0/24
或者,我们可以改用“LOCAL”关键字。
ALL: LOCAL
我们也可以使用域名。
例如:
ALL: .example.com
我们也可以在此处使用“EXCEPT”关键字来排除可能有问题的子域。
ALL: .example.com EXCEPT testing.example.com
我们还可以为特定守护程序指定规则。
因此,如果我们想控制 SSH 访问,我们需要为“sshd”设置规则。
sshd: LOCAL
hosts.allow 文件支持在同一行中列出守护程序,如果它们的规则相同。
例如:
sshd, in.ftpd: LOCAL
注意“入”。
参与“in.ftpd?”这使我们可以指定传入流量。
然后,我们可以选择将它们放在一起。
sshd, in.ftpd: LOCAL EXCEPT 192.168.1.110
这些是我们在 Linux 系统上使用 /etc/hosts.allow 文件的最常见方式。
查找我们允许的主机
我们可能来到这里寻找一种方法来查看允许访问 Linux 系统的主机(其他计算机)。
好吧,除非我们已经设置了限制,否则默认情况下它可能是任何尝试的计算机。
事实上,这并不完全正确。
如果没有在 /etc/hosts.allow 文件或者 /etc/hosts.deny 文件中定义任何规则,计算机会将连接传递给它们各自的应用程序。
因此,如果有人尝试通过 SSH 进行连接,该连接将到达 Linux 系统,在那里它将被移交给 SSH 进行登录。
如果未提供正确的凭据,连接将被拒绝。
如果允许或者拒绝某些主机,Linux 将首先检查这些规则以查看是否应允许传入请求通过。
然后,它将遵循与以前相同的模式。
我们可以通过列出 /etc/hosts.allow 文件的内容来检查我们允许的主机。
cat /etc/hosts.allow
如果我们在那里没有看到任何东西,系统可能会让任何连接通过。
访问控制规则
每个访问控制文件由零行或者多行文本组成。
这些线按出现的顺序处理。
当找到匹配项时,搜索终止。
当换行符前面有反斜杠字符时,它会被忽略。
这允许我们分解长行,以便更容易编辑。
空行或者以“#”字符开头的行将被忽略。
这允许我们插入注释和空格,以便表格更易于阅读。
所有其他行应满足以下格式,[] 之间的内容是可选的:
daemon_list : client_list [: shell_command ]
daemon_list 是一个或者多个守护进程名称(argv[0] 值)或者通配符(见下文)的列表。
client_list 是将与客户端主机名或者地址匹配的一个或者多个主机名、主机地址、模式或者通配符(见下文)的列表。
更复杂的形式 daemon@host 和 user@host 分别在有关服务器端点模式和客户端用户名查找的部分中进行了解释。
列表元素应该用空格和/或者逗号分隔。
除了 NIS (YP) 网络组查找之外,所有访问控制检查都不区分大小写。
“运算符”
- 'EXCEPT' — 预期用途的格式为:
list_1 EXCEPT list_2
;此构造匹配任何与 list_1 匹配的内容,除非它与 list_2 匹配。 EXCEPT 运算符可用于 daemon_lists 和 client_lists。 EXCEPT 运算符可以嵌套:如果控制语言允许使用括号,a EXCEPT b EXCEPT c' 将解析为
(a EXCEPT (b EXCEPT c))'。 - Shell 命令——如果第一个匹配的访问控制规则包含一个 shell 命令,则该命令受制于 %substitutions(见下一节)。结果由 /bin/sh 子进程执行,标准输入、输出和错误连接到 /dev/null。如果我们不想等到它完成,请在终端命令的末尾指定一个“&”。
Shell 命令不应依赖 inetd 的 PATH 设置。相反,它们应该使用绝对路径名,或者它们应该以显式的 PATH=whatever 语句开始。
hosts_options(5) 文档描述了一种以不同且不兼容的方式使用 shell 命令字段的替代语言。
% 扩展
以下扩展在 shell 命令中可用:
- %a (%A) — 客户端(服务器)主机地址。
- %c — 客户端信息:user@host、user@address、主机名或者地址,具体取决于可用信息的数量。
- %d — 守护进程名称(argv[0] 值)。
- %h (%H) — 客户端(服务器)主机名或者地址,如果主机名不可用。
- %n (%N) — 客户端(服务器)主机名(或者“未知”或者“偏执”)。
- %p — 守护进程 ID。
- %s — 服务器信息:daemon@host、daemon@address 或者只是守护程序名称,具体取决于可用信息的数量。
- %u — 客户端用户名(或者“未知”)。
- %% — 扩展为单个“%”字符。
% 扩展中可能混淆 shell 的字符被下划线替换。
访问控制文件
访问控制软件查阅两个文件。
搜索在第一个匹配处停止。
当 (daemon,client) 对匹配 /etc/hosts.allow 文件中的条目时,将授予访问权限。
否则,当 (daemon,client) 对匹配 /etc/hosts.deny 文件中的条目时,访问将被拒绝。
否则,将授予访问权限。
不存在的访问控制文件被视为空文件。
因此,可以通过不提供访问控制文件来关闭访问控制。