Chinaunix首页 | 论坛 | 博客
  • 博客访问: 533479
  • 博文数量: 135
  • 博客积分: 3568
  • 博客等级: 中校
  • 技术积分: 1942
  • 用 户 组: 普通用户
  • 注册时间: 2006-10-19 17:52
文章分类

全部博文(135)

文章存档

2012年(29)

2011年(41)

2010年(26)

2009年(12)

2008年(9)

2007年(12)

2006年(6)

分类: LINUX

2006-11-05 15:24:30

  最近经常要帮老师配置一下学院的ftp,telent服务器的IP限制,一个一个的添加IP很烦,索性想把hosts.allow的语法弄个明白,所以就自己翻译了一下hosts_access的语法。翻译不很准确,是在自己理解的基础上翻译的。翻译不当之处,还望指点!
                                                            
                                                              2006-11-5
 
文章来源:
 
一些单词的翻译如下:
deamon: 服务,服务进程
netgroup: 网络组
 
名称:
hosts_access, hosts.allow, hosts.deny – 关于主机访问控制文件的格式。
 
说明
  这个用户手册页描述了一个简单的访问控制语言,该语言是基于客户机(主机名/地址,用户名)和服务器(进程名,主机名/地址)模式。在最后给出了示例,心急的读者可以直接跳到示例部分作为一个快速介绍。
 
  一个该访问控制语言的扩展版本在文档hosts_options(5)里有描述。扩展功能在程序编译时用选项 -DPROCESS_OPTIONS 打开了。
 
  在下面的段落里,daemon 是一个网络服务进程名,client 是请求服务的客户机的名称和/或地址。网络服务进程名是指那些在inetd配置文件中指定的名称。
 
访问控制文件
访问控制软件由两个文件配置,匹配查询在第一次匹配时停止:
  * 当(daemon,client)对匹配在文件/etc/hosts.allow 里的某一个条目时访问将被允许。
  * 否则,当(daemon,client)对匹配在文件/etc/hosts.deny里的某一个条目时访问被拒绝。
  * 否则,即在上述两个文件里都没有匹配时,访问将被允许。
 
一个不存在的访问控制文件被当作一个空的配置文件。因此,可以通过不提供访问控制文件来关闭访问控制。
 
访问控制规则
  每个访问控制文件由0行或多行文本组成。文本被按照行的顺序依次处理。当一个匹配找到的时候停止查找。
  * 当行尾是反斜线时,换行符(即’\n’)被忽略。 这样就可以把较长的行拆分成多个短行以便于编辑。
警告:每个条目不能超过2047个字符(包含最后的换行符)
  * 空白行或以#号开始的行被忽略。这样就可以插入注释以方便阅读。
  * 所有其它行应该满足以下的格式,[]中间的是可选的:
        daemon_list : client_list : option : option ...       
         或者
        daemon_list : client_list [ : shell_command ]
  daemon_list 是一个或多个服务进程名称,参数,参数值或通配符(见下)的列表。
   client_list 是 一个或多个主机名,主机地址,模式或通配符(见下)的列表,它们将匹配客户机的名称或地址。当一个client_list 条目需要包含冒号时(如IPv6地址),该条目需要用方括号扩起来。
更复杂的形式 daemon@host 和 user@host 将会分别在服务端模式和客户端用户名查询部分解释。
  * 序列成员应当被 空格 和/或 逗号隔开。
  * 除了NIS (YP) 网络组查询外, 所有的访问控制检查大小写无关。
 
模式
访问控制语言实现了如下模式:
  * 以’.’开始的字符串。
如果一个主机名的后半部分匹配该字符串,则匹配该主机名。例如:模式’.tue.nl'匹配主机名‘wzv.win.tue.nl'。
  * 以’.’结束的字符串。
如果一个主机地址的前半部匹配该字符串,则匹配该主机地址。例如:模式 ’131.155.' 匹配几乎每一个Eindhoven University 的主机(131.155.x.x)。
  * 以’@’开始的字符串被认为是一个 NIS(即原来的YP)网络组名称。
如果一个主机是指定的允许访问的网络组的成员,则该匹配该主机的主机名。网络组匹配不支持服务进程名或客户端用户名。
  * 形如’n.n.n.n/m.m.m.m'的表达式被认为是’ net/mask'对。
如果’net’等于一个主机地址和’mask’的bit与操作的结果,则匹配该主机地址。例如:net/mask模式’131.155.72.0/255.255.254.0'匹配每一个从’131.155.72.0'到’131.155.73.255'的地址。
注意:’m.m.m.m'(即子网掩码部分)部分必须总被指定。
  * 形如‘ipv6-addr/ipv6-mask'的表达式被认为是带掩码的IPv6地址匹配。
这和带掩码的IPv4地址匹配(见上)相同。同样掩码部分(’ipv6-mask')部分应该总是指定 。
  * 形如’ipv6-addr/prefixlen'(也即’[n:n:n:n:n:n:n:n]/m')的表达式被认为是指定掩码长度的IPv6地址。
当客户机地址的前prefixlenbit位与ipv6_addr的前prefixlenbit位相同时,匹配该客户机的地址。例如’[3ffe:505:2:1::]/64'匹配从 ’3ffe:505:2:1::' 到 ’3ffe:505:2:1:ffff:ffff:ffff:ffff' 的每一个地址。
  * 以’/’开头的字符串被认为是一个文件名。
当主机名或地址匹配列在该指定的文件里的某一个主机名或地址的模式时,则发生匹配。该文件的格式是:可以用零行或多行,每行可以有零个或多个被空格隔开的主机名或地址。在主机名或地址模式使用的任何地方也同样可以使用文件名模式。
  * 通配符’*’和’?’可以用来匹配主机名或地址。
注意:但是这种模式不能在 ’net/mask’ 模式,以’.’开式的主机名匹配模式,和以’.’结尾的IP地址匹配模式中使用。
 
通配符
访问控制语言支持的一些其它通配符:
  * ALL
匹配全部的通配符,总是匹配。
  * LOCAL
匹配任何一个主机名不含点号(’.’)的主机。
  * UNKNOWN
匹配任何未知的用户名的用户,未知主机名或地址的主机。这个模式应当被小心应用:主机名可能由于临时的名称查询服务等问题而不可用。一个网络地址在软件尚未计算出它所连接的网络的类型时也是不可用的。
  * KNOWN
匹配任何已知用户名的用户,和任何已知主机名或地址的主机。这个模式应当被小心使用:原因同上。
  * PARANOID
匹配任何其名称不对应其地址的主机。当tcpd 被用参数-DPARANOID (默认模式)编译时,它甚至在查找访问控制表之前就丢弃从这样的客户端的发出请求。如果想要在这种请求上有更多控制时,请不要用参数 -DPARANOID 来编译。
  * {RBL}.domain
匹配任何其颠倒的地址出现在DNS并且在域名domain 里。这主要被用在阻塞一些垃圾邮件。
 
操作符
  * EXCEPT
使用格式如下:’list_1 EXCEPT list_2';这构造了这样一个匹配:如果匹配list_1 但不匹配list_2时则匹配它。若以集合的观点就是匹配list_1  -  list_2 的主机才允许访问。EXCEPT操作符可以被用在 daemon_lists 和 client_lists。EXCEPT操作符可以嵌套使用:如果该控制语言允许使用圆括弧的话,’a EXCEPT b EXCEPT c'可以被解析为如下格式’(a EXCEPT (b EXCEPT c))'。
 
SHELL命令
如果第一个匹配的访问控制规则包含一个一个SHELL命令,则该命令屈从于%替代(见下一部分)。该命令被的 /bin/sh 子进程执行,并把标准输入,标准输出,标准错误输出都对应到 /dev/null 上。如果不想一直等到该命令执行结束才进行下一步的话,可以在命令最后添加’&’将它置于后台运行。
 
SHELL命令不应该依赖于inetd在PATH环境变量中的设置。相反,它们应该使用绝对路径,或者它们应该明确地以PATH=whatever开头。
 
(5) 文档中描述了一种可供选择的语言,该语言可以用一种截然想法的方法来使用SHELL命令。
 
 
% 扩展
如下的扩展在SHELL命令中可用:
  * %a (%A)
客户机(服务器)的主机地址。
  * %c
客户机信息:user@host,  user@address,一个主机名,或者仅仅是一个地址,依赖于可用信息量的多少。
  * %d
服务的进程名(参数 值)
  * %h (%H)
客户机(服务器)主机名 或 地址(如果主机名不可用的话)。
  * %n (%N)
客户机(服务器)主机名(或者是"unknown",或者是"paranoid")
  * %p
服务进程的id
  * %s
服务器信息:daemon@host, daemon@address, 或者仅仅是一个服务名,依赖于可用信息量的多少。
  * %u
客户端用户名(或者是"unknown")。
  * %%
表示单个’%’字符。
注意:在%扩展中那些使SHELL无法解释的字符可能会被替换成下划线。
 
服务端匹配模式
为了通过客户机连接所使用的网络地址来区别客户机,使用如下格式的模式:
          process_name@host_pattern : client_list ...
当电脑有不同的网络地址和不同的网络名称时,像这样的模式可以使用。服务提供者可以使用该方法来用网络名称提供FTP,GOPHER或者WWW档案,即使那些网络名称属于不同的组织。也可参考选项文档中的选项’twist'。一些系统(如Solaris, FreeBSD, NetBSD)可以在一个物理接口上使用多个网络地址;而一些其它系统你可能不得不求助于SLIP或PPP接口来实现。
服务端模式中主机名/地址同样遵守在client_list里的语法规则。通常,只有对于面向连接的服务时,服务端信息才是是可用的。
 
客户端用户名查询
当客户端支持RFC 931 协议或其后续协议(如TAP, IDENT, RFC 1413)时, wrapper 程序能得到连接方更多的信息。客户端用户名信息如果可用,则它将和主机名记录到一起,并且可以使用如下模式加以匹配:
          daemon_list : ... user_pattern@host_pattern ...
wrapper服务可以在编译时配置成rule-driven用户名查询(默认)或总是询问客户端。如果是rule-driven用户名查询(默认)的话,上述形式的规则将会只有在daemon_list部分和host_pattern部分都匹配时才进行用户名查询。
一个用户模式的语法和服务程序模式的相同,因此同样的通配符也可以适用(网络组成员关系不适用)。虽然有以下几种情况,但是不应当被用户名查询而受到影响:
  * 当最需要客户端的用户名信息时,它往往不可靠。例如:当客户机曾危害一般说来,只有用户名模式是ALL和(UN)KNOWN时才有意义。
  * 只有基于TCP的用户名查询是可能的,并且要求此时客户机运行了一个合适的服务进程。在任何其他情况结果是”unknown”。
  * 一个众所周知的UNIX内核bug:当用户名查询被防火墙阻塞时,可能引起服务丢失。wrapper 程序的README文档里描述了一个程序可以检测你的内核是否有这样的bug。
  * 用户名查询对非UNIX用户可能引起明显的的延迟。默认的用户名查询超时时间是10秒:太短就无法适应较慢的网络,但10秒对比较急躁的PC用户来书已经够长了。
 
有选择的用户名查询能缓解最后一个问题。例如:如下规则:
          daemon_list : @pcnetgroup ALL@ALL
将会使匹配pcnetgroup的成员而不需用户名查询。但是对于其它的系统该规则将进行用户名查询。
 
检测地址欺骗攻击
  许多TCP/IP实现中的一个产生序列号的缺点都会允许入侵者轻易的冒充信任的主机。例如:远程shell服务。IDENT (RFC 931 etc.)服务可以用来检测这种或其他方式的址欺骗攻击。
  在接受一个客户端请求之前,warpper程序可以用IDENT服务找出那些根本就没有发送请求的客户机。当服务器上提供IDENT服务时,且IDENT查询结果是否定(客户机匹配’UNKNOWN@host’)时,很可能是收到地址欺骗攻击。
  当IDENT查询结果是肯定(客户机匹配’ KNOWN@host’)时,它也不是很可靠的。这是因为攻击者有可能同时欺骗本次连接和IDENT查询,虽然同时欺骗比仅仅欺骗一个连接要困难得多。也有可能客户机的IDENT服务是在造假。
注意:IDENT 查询不工作在UDP方式下。
 
示例
  该语言足够灵活,它能以将各种不同的访问控制策略用最容易理解的方式表达出来。尽管该语言用两个访问控制表,大多数常用策略能只用一个表甚至是空表来实现。
  当阅读下面的例子的时候一定要意识到allow表比deny表先扫描,并且在第一次找到匹配时停止,最后如果没有找到匹配则默认允许访问。
  这里例子使用了主机名和域名。它们可以用包含地址和/或 network/netmask信息的方式加以改进,以便减少临时名称服务查询出错的影响。
 
  * 大多数拒绝访问的例子
  在这一部分,访问默认是拒绝的。只有明确授权的主机是允许访问的。
默认策略(no access)是用一个deny文件实现:
       /etc/hosts.deny:
          ALL: ALL
  这语句限制了对所有用户的所有服务。除非它们在access文件里被允许。
  这些被明确授权允许访问的主机被列在allow文件里。例如:
/etc/hosts.allow:
          ALL: LOCAL @some_netgroup
          ALL: .foobar.edu EXCEPT terminalserver.foobar.edu
  第一条规则允许本地域(主机名中没有点号)中的主机访问,也允许来自some_netgroup 网络组的成员的访问。第二条语句允许来自域 foobar.edu 的所有主机的访问(注意前面的点号),但是来自域terminalserver.foobar.edu的除外。
 
  * 大多数允许访问的例子
  在这里访问是默认被允许的,只由明确指定的主机才被拒绝服务。
  默认策略(访问允许)使得 allow文件成为多余,因此它可以被忽略。那些明确未被授权的主机被列在deny文件里。例如:
       /etc/hosts.deny:
          ALL: some.host.name, .some.domain
          ALL EXCEPT in.fingerd: other.host.name, .other.domain
  第一条规则拒绝来自两个域的主机的访问。而第二条规则只允许来自上述两个域 的finger请求。
 
  * 一个捉弄人的配置
  这一个例子允许来自本地域(注意前导点号)的主机的tftp请求。而其它主机的请求则拒绝。对于这些禁止访问的客户机,他们请求的文件用一个finger探测器代替,然后把结果用邮件发送给超级用户。
       /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 root) &
  (命令 safe_finger 可以通过tcp_wrappers包获得,然后安装到合时位置。它限制了从远程finger服务器的有可能起破坏作用的数据。它提供了比标准finger命令更好的保护)
%h (客户机) 和 %d (服务机的名称)的扩展的序列在shell命令部分有说明。
  警告:不要这样配置你的finger服务, 除非你准备好了面对无限的finger 循环。
  在有防火墙的系统上这种恶作剧能被更深一步的执行。典型的防火墙只对外部提供有限的一些服务。所有其它的服务会像上面的tftp服务例子一样被打扰,其结果可以作为一个优秀的预警系统。
 
诊断
  当在访问控制规则里出现一个语法错误,或者一个访问控制条目超过内在的缓冲区长度,或者一个访问控制条目没有用换行符结束,又或%扩展造成缓冲区溢出时都会发生一个错误报告。所有的问题都通过syslog服务报告。
 
相关文件
/etc/hosts.allow, 列出了一些允许访问的的 (服务,客户机) 对
/etc/hosts.deny, 列出了一些拒绝访问的(服务,客户机)对
 
参考
tcpdchk(8), tcpdmatch(8), test programs.
 
BUGS
  如果一个名称服务查询时超时,主机名对于访问控制软件来说将不可用,尽管主机是已注册的。
  域名查询服务是大小写无关的,而NIS (原来的 YP)网络组查询服务是区分大小写的。
  控制文件里的每一个条目的长度不能超过2047个字符,包含最后的一个换行符。
 
作者
       Wietse Venema (wietse@wzv.win.tue.nl)
       Department of Mathematics and Computing Science
       Eindhoven University of Technology
       Den Dolech 2, P.O. Box 513,
       5600 MB Eindhoven, The Netherlands
译者:
 
 
阅读(2438) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~