名称
hosts_access - 主机访问控制文件的格式
描述
本手册页描述基于客户端(主机名/地址,用户名)和服务器 (进程名称,主机名/地址)模式的简单访问控制语言。 最后给出了例子。 鼓励不耐烦的读者跳到实例部分进行快速介绍。
hosts_options (5)文档中描述了访问控制语言的扩展版本。 在程序构建时通过使用-DPROCESS_OPTIONS构建扩展。
在以下文本中, 守护进程是网络守护进程的进程名称, client是请求服务的主机的名称和/或地址。 网络守护进程进程名称在inetd配置文件中指定。
访问控制文件
门禁软件查阅两个文件 。 搜索停在第一场比赛:
*
当(守护进程,客户端)对匹配/etc/hosts.allow文件中的条目时,访问将被授予。
*
否则,当( 守护进程 ,客户端)对匹配/etc/hosts.deny文件中的条目时,访问将被拒绝。
*
否则,访问将被授予。
一个不存在的访问控制文件被视为一个空文件。 因此,访问控制可以通过不提供访问控制文件来关闭。
访问控制规则
每个访问控制文件由零或多行文本组成。 这些行按照外观顺序进行处理。 当找到匹配项时搜索结束。
*
当换行符前面加上反斜杠字符时,会忽略换行符。 这使您可以分解长行,以便更容易编辑。
*
以'#'开头的空白行或行将被忽略。 这允许您插入注释和空白,以便表格更易于阅读。
*
所有其他行应满足以下格式,[]之间的内容可选:
daemon_list:client_list [:shell_command]
daemon_list是一个或多个守护进程名称(argv [0]值)或通配符(见下文)的列表。
client_list是一个或多个主机名,主机地址,模式或通配符(见下文)的列表,它们将与客户端主机名或地址相匹配。
daemon @ host和user @ host的复杂形式分别在服务器端点模式和客户端用户名查找部分进行说明。
列表元素应该用空格和/或逗号分隔。
除NIS(YP)网络组查找外,所有访问控制检查都不区分大小写。
格局
访问控制语言实现以下模式:
*
以'。'开头的字符串 字符。 如果其名称的最后一个组件与指定的模式匹配,则会匹配主机名。 例如,`.tue.nl'模式匹配主机名'wzv.win.tue.nl'。
*
以'。'结尾的字符串 字符。 如果主机地址的第一个数字字段与给定字符串匹配,则该主机地址相匹 例如,模式'131.155'。 与埃因霍温大学网络(131.155.xx)上的每个主机(几乎)的地址相匹配。
*
以“@”字符开头的字符串被视为NIS(以前称为YP)网络组名称。 如果主机名是指定网络组的主机成员,则会匹配主机名。 守护程序进程名称或客户端用户名称不支持网络组匹配。
*
形式'nnnn / mmmm'的表达式被解释为'net / mask'对。 如果“net”等于地址和“掩码”的按位“与”,则IPv4主机地址匹配。 例如,网络/屏蔽模式`131.155.72.0/255.255.254.0'匹配`131.155.72.0'至`131.155.73.255'范围内的每个地址。
*
形式'[n:n:n:n:n:n:n:n] / m'的表达式被解释为一个'[net] / prefixlen'对。 如果`net'的prefixlen'位等于地址的'prefixlen'位,则IPv6主机地址匹配。 例如,[net] / prefixlen模式`[3ffe:505:2:1 ::] / 64'与范围'3ffe:505:2:1 ::'到'3ffe:505:2: 1:FFFF:FFFF:FFFF:FFFF”。
*
以'/'开始的字符串被视为文件名。 如果主机名或地址与指定文件中列出的任何主机名或地址模式匹配,则该主机名或地址相匹配。 文件格式为零行或多行,零个或多个主机名或地址模式由空格分隔。 文件名称模式可用于任何可以使用主机名或地址模式的地方。
*
通配符`*'和`?' 可用于匹配主机名或IP地址。 这种匹配方法不能与'net / mask'匹配,以'。'开头的主机名匹配。 或以`。'结尾的IP地址匹配。
通配符
访问控制语言支持显式通配符:
所有
通用通配符始终匹配。
本地
匹配名称不包含点字符的任何主机。
未知
匹配名称未知的任何用户,并匹配名称或地址未知的任何主机。 应谨慎使用此模式:由于临时名称服务器问题,主机名可能不可用。 当软件找不到它正在与之通话的网络类型时,网络地址将不可用。
知
匹配名称已知的任何用户,并匹配其名称和地址已知的任何主机。 应谨慎使用此模式:由于临时名称服务器问题,主机名可能不可用。 当软件找不到它正在与之通话的网络类型时,网络地址将不可用。
PARANOID
匹配名称与其地址不匹配的任何主机。 当tcpd使用-DPARANOID(默认模式)构建时,即使在查看访问控制表之前,它也会丢弃来自这些客户端的请求。 如果您希望更多地控制此类请求,请在没有-DPARANOID的情况下构建。
运算符
除
预期使用的形式是:`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命令,那么该命令将受到%替换(请参阅下一节)。 结果由/ bin / sh子进程执行,标准输入,输出和连接到/ dev / null的错误。 如果您不想等待完成,请在命令末尾指定一个“&”。
Shell命令不应该依赖inetd的PATH设置。 相反,它们应该使用绝对路径名,或者它们应该以明确的PATH = whatever语句开始。
hosts_options (5)文档描述了以不同且不兼容的方式使用shell命令字段的替代语言。
%扩展
以下扩展在shell命令中可用:
%a(%A)
客户端(服务器)主机地址。
%C
客户端信息:用户@主机,用户@地址,主机名或地址,具体取决于可用的信息量。
%d
守护进程名称(argv [0]值)。
%h(%H)
客户端(服务器)主机名或地址(如果主机名不可用)。
%n(%N)
客户端(服务器)主机名(或“未知”或“偏执”)。
%p
守护进程ID。
%S
服务器信息:守护进程@主机,守护进程@地址或只是一个守护进程名称,具体取决于可用的信息量。
%u
客户端用户名(或“未知”)。
%%
扩展为一个`%'字符。
可能会混淆外壳的%扩展中的字符被替换为下划线。
服务器端点模式
为了通过它们连接的网络地址来区分客户端,请使用以下格式的模式:
process_name @ host_pattern:client_list ...
当机器具有不同的互联网地址和不同的互联网主机名时,可以使用这些模式。 服务提供商可以使用此工具提供FTP,GOPHER或WWW档案,其中包含可能属于不同组织的互联网名称。 请参阅hosts_options (5)文档中的`twist'选项。 某些系统(Solaris,FreeBSD)可以在一个物理接口上拥有多个互联网地址; 与其他系统一样,您可能不得不求助于SLIP或PPP伪接口,这些接口位于专用网络地址空间中。
host_pattern遵循与client_list上下文中的主机名和地址相同的语法规则。 通常,服务器端点信息仅适用于面向连接的服务。
客户用户名查找
当客户端主机支持RFC 931协议或其后代之一(TAP,IDENT,RFC 1413)时,包装程序可以检索有关连接所有者的附加信息。 客户端用户名信息(如果可用)与客户端主机名一起记录,并可用于匹配以下模式:
daemon_list:... user_pattern @ host_pattern ...
守护程序包装可以在编译时进行配置,以执行规则驱动的用户名查找(默认)或总是询问客户端主机。 在规则驱动的用户名查找的情况下,只有当daemon_list和host_pattern匹配时,上述规则才会导致用户名查找。
用户模式与守护进程模式具有相同的语法,因此应用相同的通配符(不支持网络组成员资格)。 不过,用户名查找不应该被忽略。
*
客户端用户名信息在最需要时不能被信任,即客户端系统已被入侵。 通常,ALL和(UN)KNOWN是唯一有意义的用户名模式。
*
用户名查找只能在基于TCP的服务中使用,并且只能在客户端主机运行适当的守护程序时才能使用; 在所有其他情况下,结果是“未知的”。
*
当用户名查找被防火墙阻止时,一个众所周知的UNIX内核错误可能会导致服务丢失。 包装器的README文件描述了一个程序来确定你的内核是否有这个错误。
*
用户名查找可能会导致非UNIX用户明显延迟。 用户名查询的默认超时时间为10秒:太短而无法应对慢速网络,但时间长到足以激怒PC用户。
选择性的用户名查找可以缓解最后一个问题。 例如,像这样的规则:
daemon_list:@pcnetgroup ALL @ ALL
会匹配pc网络组的成员,而不进行用户名查找,但会执行与所有其他系统的用户名查找。
检测地址欺骗攻击
许多TCP / IP实现的序列号生成器中的缺陷允许入侵者轻松地模拟可信主机并通过例如远程外壳服务来入侵。 IDENT(RFC931等)服务可用于检测此类和其他主机地址欺骗攻击。
在接受客户端请求之前,包装程序可以使用IDENT服务来发现客户端根本没有发送请求。 当客户端主机提供IDENT服务时,负IDENT查询结果(客户端匹配`UNKNOWN @ host')是主机欺骗攻击的有力证据。
积极的IDENT查找结果(客户端匹配`KNOWN @ host')不太可靠。 入侵者可能欺骗客户端连接和IDENT查找,尽管这样做比欺骗客户端连接困难得多。 也可能是客户端的IDENT服务器在说谎。
注意:IDENT查找不适用于UDP服务。
例子
该语言足够灵活,可以用最少的大惊小怪来表达不同类型的访问控制策略。 虽然语言使用两个访问控制表,但最常见的策略可以通过其中一个表变得微不足道甚至为空来实现。
在阅读下面的示例时,了解allow表在deny表之前被扫描是非常重要的,当搜索到匹配时搜索终止,并且在根本找不到匹配时授予访问。
这些示例使用主机名和域名。 可以通过包含地址和/或网络/网络掩码信息来改进它们,以减少临时名称服务器查找失败的影响。
大部分已关闭
在这种情况下,访问被默认拒绝。 只有明确授权的主机才被允许访问。
默认策略(无权访问)通过一个普通的拒绝文件实现:
/etc/hosts.deny:ALL:ALL
这会拒绝所有主机的所有服务,除非它们允许通过允许文件中的条目进行访问。
明确授权的主机列在允许文件中。 例如:
/etc/hosts.allow:ALL:LOCAL @some_netgroup
ALL:.foobar.edu除了terminalserver.foobar.edu
第一条规则允许从本地域中的主机(主机名称中不包含“。”)和some_netgroup网络组成员进行访问 。 第二个规则允许来自foobar.edu域中的所有主机的访问(注意前导点),但terminalserver.foobar.edu除外。
最开放
在此,默认授予访问权限; 只有明确指定的主机被拒绝服务。
默认策略(授予的访问权限)使得允许文件成为冗余,因此可以省略。 明确的非授权主机列在拒绝文件中。 例如:
/etc/hosts.deny:ALL:some.host.name,.some.domain
除.ingerd以外的所有内容:other.host.name,.other.domain
第一条规则拒绝一些主机和域的所有服务; 第二条规则仍允许来自其他主机和域的指纹请求。
BOOBY TRAPS
下一个示例允许来自本地域中主机的tftp请求(注意前导点)。 来自其他主机的请求被拒绝。 而不是所请求的文件,手指探测器被发送到违规主机。 结果邮寄给超级用户。
/etc/hosts.allow中:
in.tftpd:LOCAL,.my.domain /etc/hosts.deny:in.tftpd:ALL:spawn(/ some / where / safe_finger -l @%h | \ / usr / ucb / mail -s%d-% h根)&safe_finger命令随tcpd包装器一起提供,应安装在合适的位置。 它限制了远程finger服务器发送的数据可能造成的损害。 它比标准的finger命令提供更好的保护。
有关shell命令的一节介绍了%h(客户端主机)和%d(服务名称)序列的扩展。
警告:除非你准备好了无限的手指循环,否则不要蛊惑你的手指守护进程。
在网络防火墙系统上,这个技巧可以进一步发挥。 典型的网络防火墙仅向外部世界提供有限的一组服务。 所有其他服务都可以像上面的tftp例子一样被“窃听”。 其结果是一个出色的预警系统。
重要提示:使用man命令( %man )查看特定计算机上的命令使用方式。
相关文章