假设我们在 hosts.allow 中只有以下访问规则:
1
| telnetd,sshd:192.168.4.: allow
|
现在 tcpdmatch 正在运行,将它解析为 IP 为 192.168.4.12 的 telnetd 守护进程名。以下是输出内容:
1
2
3
4
5
6
7
| # tcpdmatch telnetd 192.168.4.12
tcpdmatch telnetd 192.168.4.12
client: address 192.168.4.12
server: process telnetd
matched:/etc/hosts.allow line 1
option: allow
access: granted
|
在以上输出中,规则说明 IP 192.168.4.12(针对 telnetd)与 IP 范围 192.168.4. 匹配,因此批准访问。
现在,如果我将它解析为 IP 为 192.16.4.12 的 ftpd 守护进程,结果如下:
1
2
3
4
5
6
| # tcpdmatch ftpd 192.168.4.12
client: address 192.168.4.12
server: process ftpd
matched:/etc/hosts.deny line 1
option: DENY
access: denied
|
在以上输出结果中,tcpdmatch 正确说明拒绝访问,因为对 IP 以 192.168.4 结尾的客户端使用 ftpd 没有访问规则。
现在,如果我将它解析为 IP 为 192.168.6.32 的 sshd 守护进程/服务,结果如下:
1
2
3
4
5
6
7
| # tcpdmatch sshd 192.168.6.32
warning: sshd: no such process name in /etc/inetd.conf
client: address 192.168.6.32
server: process sshd
matched:/etc/hosts.deny line 1
option: DENY
access: denied
|
如果 wrappers 并未如您所预料的方式运行,它拒绝或允许了错误的主机,请记住 wrappers 可能在第一条规则匹配时就退出;规则的顺序也很重要。当您有问题时,也可使用 tcpdchk 对客户端主机、IP 地址测试规则。
在此输出中,tcpdmatch 正确地声明访问被拒绝,因为此 IP:192.168.6.32(针对 sshd)不是 IP:192.168.4. 范围内的一部分。
使用标题Wrappers 允许使用标题,如范例中所示。这可以让您在建立连接或拒绝连接时将消息发送到传入的客户端上。我建议只对拒绝的访问使用标题。您可以用 /etc/security/login.cfg 的 herald 段 在登录屏幕上放置授权警告消息,或者在客户端连接后使用 /etc/motd。
要为拒绝的访问创建标题,首先要创建 /etc/banners/deny 目录。
现在,在目录中为每个服务守护进程创建一个文件。每个文件应当包含一个警告信息。当文件名与守护进程一样时,创建一条标题消息。对于 telnetd 守护进程,会创建一个名为 telnetd 的文件。对于 ftp 守护进程,会创建一个名为 ftpd 的文件。而对于 ssh 究竟如何工作,以及 ssh 客户端在哪里履行实际的 ssh 协议,标题消息也可能不会显示在客户端的 ssh 连接上。而在连接断开之前显示给不必要的调用者的消息将会下降到您自己的安全策略级别以下。尽管如此,可以有如下的消息:
1
| Your connection has been refused.Access denied and the event is logged
|
如果要确认,可以在以下位置查看本范例的标题文件:
1
2
3
4
5
6
7
8
| # pwd
/etc/banners/deny
# ls
ftpd telnetd
# cat telnetd
Your connection has been refused.
Access denied and the event is logged
|
下一步,通知 wrappers 此项新的配置添加项。编辑 hosts.deny 文件加入以下条目:
1
| All:ALL: banners /etc/banners/deny ENY
|
当 telnet 或 ftp 客户端连接建立并且访问被拒绝时,就会出现带有守护进程名的标题文件,并且当被拒绝的客户端试图连接时,就会显示如下内容:
1
2
3
| $ tn rs6000
Your connection has been refused.
Access denied and the event is logged
|
Twist 和 spawn本节的示例都是只与 hosts.allow 文件有关。
在之前的章节中,我们讨论了标题。尽管如此,还可以使用 twist 选项发送消息给被拒绝的客户端。twist 选项的基本格式是:
Twist 的实际动作是拒绝访问。Twist 实际上使用指定的操作替换当前服务。在以下示例中,使用 echo 命令将拒绝消息发送给被拒绝的客户端。如果 IP 为 192.168.9.14 的客户端试图用 telnet 或 ssh 连接,那么该示例会发送消息给它。
1
2
| sshd,telnetd:192.168.9.14: twist /bin/echo "Your connection has been refused\
\nAccess denied and the event is logged"
|
spawn 选项的使用与 twist 一样,除了不会发送回复给客户端。Spawn 允许生成 shell 命令。通常,这会通过电子邮件或直接记录关于某个主机被拒绝或被允许的消息到日志文件中。spawn 选项的基本格式是:
1
| spawn '(shell command)'
|
spawn 选项通常用于包含多个命令。使用括号是保证此命令分在一个组中,并且在子 shell 中执行。
看看此例,假设从测试服务器向生产服务器发出连接,此事肯定要通知相关人员,即使公司安全策略允许这种情况。
在以下示例中,所有来自 IP 地址为 192.168.9.24 的 ssh 和 telnet 连接都会被允许访问。一旦客户端连接上,就会执行 logger 命令。请注意在冒号(“:”) 用反斜杠转义的规则条目中保留下一个字符的值。一定要这么做,因为我们不想让 wrappers 认为这是一个分隔符,是访问规则的一部分。实际上,它是 logger 发送的消息的一部分:
1
2
| telnetd,sshd:192.168.9.24 : spawn (/usr/bin/logger 'DEV BOX!!Warning!!\:
%a has connected') :allow
|
还要注意在之前的条目中,使用了特殊的 shell 扩展变量 %a,它们的前缀是 “%&a”。这些可以用来包含客户端信息,如果在您的消息中可以的话。常见的shell变量有:
- %a - 客户端 IP 地址
- %h - 客户端主机名
- %c - 客户端用户名
连接成功后,logger 会通过 syslog 发送消息给 /var/adm/messages:
1
2
| Oct 24 15:47:22 rs6000 user:notice root EV BOX!!Warning!!:192.168.9.24 has connected
Oct 24 15:47:22 rs6000 auth|security telnetd[245806]: connect from uk01dev002
|
还可以更改之前的规则,拒绝此 IP 地址并用 logger 通过 syslog 发送消息,例如:
1
2
| telnetd,sshd:192.168.9.24 : spawn (/usr/bin/logger '* DEV BOX *!!Warning!!\:
%a has tried to connected') :deny
|
当访问被拒绝后,logger 会通过 syslog 发送消息给 /var/adm/messages:
1
2
3
4
| Oct 24 20:02:39 rs6000 user:notice root:* DEV BOX *!!Warning!!:192.168.9.24
Tried to connect
Oct 24 20:02:39 rs6000 auth|security|warning telnetd[237744]: refused connect from
uk01dev002
|
您还可以使用 spawn 通过电子邮件发送给用户。在以下示例中,IP 地址为 192.168.9.24 的客户端连接允许后,会发送电子邮件给用户 secport,允许使用 telnet 或 ssh 访问该客户端:
1
2
| telnetd,sshd:192.168.9.24 : spawn (/usr/bin/echo 'DEV BOX!Warning %a has connected'
|/usr/bin/mail secport) :allow
|
结束语通过使用 TCP Wrappers,或 wrappers,可以轻松地保护您的主机,在客户端接入时,守护进程能安全使用。假设您有相同的硬件,实施起来很简单,只要将所有二进制文件和所有主机文件复制到所有远程主机上即可。惟一需要的手工配置就是编辑 /etc/inetd.conf,但也可以用 sed 工具在脚本中完成。 |