4.4. 安全访问网络

4.4.1. 使用 TCP Wrappers 以及 xinetd 保证服务安全

TCP ( Transmission Control Protocol,传输控制协议) Wrapper 程序不仅仅是可以拒绝对某种服务的访问。这个部分将阐明如何使用它们传送连接提示信息程序,警告存在来自某些主机的攻击,以及增强日志记录功能。关于 TCP Wrapper 功能和控制语言的信息,请参阅 hosts_options(5) 手册页。关于可用的状态标志寄存器,请参阅 xinetd.conf(5) 的手册页。您可将此状态标志寄存器作为选项运用于某一服务。

4.4.1.1. TCP Wrapper 和连接提示

在用户连接到服务时显示适当的提示可让潜在的攻击者知道已经惊动了系统管理员。您还可以控制展示给用户的信息内容。要在服务中添加 TCP Wrapper 提示,则须使用 banner 选项。
本例使用 vsftpd 来执行 banner 。要启用,则须创建提示信息文件。它是在系统中随处可见,但必须与守护进程的名称保持一致。在本例中,名为 /etc/banners/vsftpd 的文件含有以下命令行:
220-Hello, %c 
220-All Activity on ftp.example.com is logged.
220-Inappropriate use will result in your access privileges being removed.
%c 令牌提供各种客户端信息,比如用户名和主机名,或者用户名和 IP 地址,这些信息可用来生成连接,甚至造成威胁。
要在连入连接显示此提示信息,则须将下列命令行添加到 /etc/hosts.allow 文件:
vsftpd : ALL : banners /etc/banners/

4.4.1.2. TCP Wrapper 和攻击警告

如果已经探测出某个主机或者网络正在攻击该服务器,那么通过使用 spawn 指令,使用 TCP Wrapper 可警示管理员关于来自该主机或者网络的后续攻击。
在这个示例中,假设已经探测到来自 206.182.68.0/24 网络的破解者尝试攻击服务器。请将下列命令行放入 /etc/hosts.deny 文件,以拒绝任何来自该网络的连接尝试,并将这些尝试记录在特定的文件中:
ALL : 206.182.68.0 : spawn /bin/echo `date` %c %d >> /var/log/intruder_alert
%d 令牌提供破解者企图访问的服务名称。
要允许连接并予以记录,则须将 spawn 指令放入 /etc/hosts.allow 文件 。

注意

因为 spawn 指令可执行所有 shell 命令,所以最好生成一个特定脚本以提示管理员,或者在特定客户端尝试连接到服务器的事件中,执行一系列命令。

4.4.1.3. TCP Wrapper 和改进的日志

如果比起其它连接类型更令人担忧,那么可使用 severity 选项提升该服务的日志级别。
在这个示例中,假设尝试连接到 FTP 服务器 23 端口(Telnet 端口)的任何人就是破解者。要指出这一点,则须在日志文件中使用 emerg 标记替换默认标记 info,并拒绝连接。
要做到这一点,则须将下列命令行放入 /etc/hosts.deny
in.telnetd : ALL : severity emerg
这使用默认 authpriv 日志工具,但会将优先权从默认值 info 提高到 emerg,即将日志信息直接发送到控制台。

4.4.2. 验证使用侦听的端口

应当避免打开不必要的端口,因为这会增加您系统受到攻击的可能性。如果在系统运行之后,您发现有意外打开的端口处于侦听状态,那么这可能就是入侵的迹象,应该对此进行调查。
作为 root 用户,从控制台发出以下命令,以判定哪个端口正在侦听来自网络的连接:
~]# netstat -pan -A inet,inet6 | grep -v ESTABLISHED
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address       Foreign Address     State     PID/Program name
tcp        0      0 0.0.0.0:111         0.0.0.0:*           LISTEN    1608/rpcbind
tcp        0      0 127.0.0.1:53        0.0.0.0:*           LISTEN    2581/unbound
tcp        0      0 0.0.0.0:22          0.0.0.0:*           LISTEN    2048/sshd
tcp        0      0 127.0.0.1:631       0.0.0.0:*           LISTEN    3202/cupsd
tcp        0      0 0.0.0.0:54136       0.0.0.0:*           LISTEN    2279/rpc.statd
tcp        0      0 127.0.0.1:25        0.0.0.0:*           LISTEN    2708/master
tcp        0      0 127.0.0.1:8953      0.0.0.0:*           LISTEN    2581/unbound
tcp        0      0 127.0.0.1:8955      0.0.0.0:*           LISTEN    2634/dnssec-trigger
tcp6       0      0 :::111              :::*                LISTEN    1608/rpcbind
tcp6       0      0 :::60881            :::*                LISTEN    2279/rpc.statd
tcp6       0      0 ::1:53              :::*                LISTEN    2581/unbound
tcp6       0      0 :::22               :::*                LISTEN    2048/sshd
tcp6       0      0 ::1:631             :::*                LISTEN    3202/cupsd
tcp6       0      0 ::1:25              :::*                LISTEN    2708/master
tcp6       0      0 ::1:8953            :::*                LISTEN    2581/unbound
udp        0      0 127.0.0.1:766       0.0.0.0:*                     2279/rpc.statd
udp        0      0 0.0.0.0:59186       0.0.0.0:*                     674/avahi-daemon: r
udp        0      0 0.0.0.0:33639       0.0.0.0:*                     2279/rpc.statd
udp        0      0 0.0.0.0:889         0.0.0.0:*                     1608/rpcbind
udp        0      0 127.0.0.1:53        0.0.0.0:*                     2581/unbound
udp        0      0 0.0.0.0:68          0.0.0.0:*                     2642/dhclient
udp        0      0 0.0.0.0:111         0.0.0.0:*                     1608/rpcbind
udp        0      0 0.0.0.0:46198       0.0.0.0:*                     2642/dhclient
udp        0      0 0.0.0.0:123         0.0.0.0:*                     697/chronyd
udp        0      0 0.0.0.0:5353        0.0.0.0:*                     674/avahi-daemon: r
udp        0      0 127.0.0.1:323       0.0.0.0:*                     697/chronyd
udp6       0      0 :::3885             :::*                          2642/dhclient
udp6       0      0 :::889              :::*                          1608/rpcbind
udp6       0      0 ::1:53              :::*                          2581/unbound
udp6       0      0 :::111              :::*                          1608/rpcbind
udp6       0      0 :::123              :::*                          697/chronyd
udp6       0      0 ::1:323             :::*                          697/chronyd
udp6       0      0 :::33235            :::*                          2279/rpc.statd
raw6       0      0 :::58               :::*                7         2612/NetworkManager
请注意,输入 -l 选项时,并不会显示 SCTP ( stream control transmission protocol,流控制传输协议)服务器。
查核系统所需的服务和命令的输出信息时,关闭那些非特别需要或未经授权的,再重复检查。继续执行,然后使用来自另一系统的 nmap 来进行外部检查,此系统是通过网络连接到第一个系统的。这可用于验证 iptables 的规则。扫描来自外部系统的 ss 输出信息(除了本机 127.0.0.0 或 ::1 区间)中显示的每一个 IP 地址。使用 -6 选项,对 IPv6 (Internet Protocol Version 6,网际网路通讯协定第六版)地址进行扫描。更多信息,请参阅 man nmap(1)
以下示例是从另一系统的控制台发出的命令,用于判定哪个端口正在侦听 TCP 网络连接:
~]# nmap -sT -O 192.168.122.1
关于 ssnmap,以及 services 的更多信息,请参阅手册页。

4.4.3. 禁用源路由

源路由是一种互联网协议机制,可允许 IP 数据包携带地址列表的信息,以此分辨数据包沿途经过的路由器。通过某一路径时,会出现一可选项,记录为中间路径。所列出的中间路径,即“路径记录”,可提供返回至源路由路径上的目的地。这就允许源路由可指定某一路径,无论是严格的还是松散的,可忽略路径列表上的一些或全部路由器。它可允许用户恶意重定向网络流量。因此,应禁用源路由。
accept_source_route 选项会导致网络接口接收“严格源路由选项” (SSR,Strict Source Route) 或“松散源路由选项 ”(LSR,Loose Source Routing) 数据包。源路由数据包的接收是由 sysctl 设置所控制。作为 root 用户,发出以下命令,丢弃 SSR 或 LSR 数据包:
~]# /sbin/sysctl -w net.ipv4.conf.all.accept_source_route=0
如上述所言,可能的话(禁止转发可能会干扰虚拟化技术),也应禁止数据包的转发。作为 root 用户,发出以下所列出的命令:
这些命令禁止在所有界面上对 IPv4 和 IPv6 数据包进行转发。
~]# /sbin/sysctl -w net.ipv4.conf.all.forwarding=0
~]# /sbin/sysctl -w net.ipv6.conf.all.forwarding=0
这些命令禁止在所有界面上对所有组播数据包进行转发。
~]# /sbin/sysctl -w net.ipv4.conf.all.mc_forwarding=0
~]# /sbin/sysctl -w net.ipv6.conf.all.mc_forwarding=0
接收 ICMP (Internet Control Message Protoco,Internet控制报文协议)重定向多为非法使用。除非有特定需要,禁止对此类 ICMP 重定向数据包的接收和传送。
这些命令禁止在所有界面上对所有的 ICMP 重定向数据包进行接收。
~]# /sbin/sysctl -w net.ipv4.conf.all.accept_redirects=0
~]# /sbin/sysctl -w net.ipv6.conf.all.accept_redirects=0
此命令禁止在所有界面上对 ICMP 安全重定向数据包进行接收。
~]# /sbin/sysctl -w net.ipv4.conf.all.secure_redirects=0
此命令禁止在所有界面上对所有的 IPv4 ICMP 重定向数据包进行接收。
~]# /sbin/sysctl -w net.ipv4.conf.all.send_redirects=0
这是禁止传送 IPv4 重定向数据包的指示。关于 IPv6 节点要求 (IPv6 Node Requirements)导致 IPv4 与 IPv6 不同的详细解释,请参阅 〈RFC4294〉 。
要实现永久设定,则必须将其添加到 /etc/sysctl.conf
更多信息,请参阅 sysctl 手册页 sysctl(8) 。关于对源路由及其变量的相关互联网选项的详细解释,请参阅 〈RFC791 〉。

警告

以太网可提供其他方式来实现重定向流量,如 ARP (地址解析协议,Address Resolution Protocol)或 MAC (介质访问控制,Medium/Media Access Control)地址欺骗、未经授权的 DHCP (动态主机配置协议,Dynamic Host Configuration Protocol)服务器、以及 IPv6 路由器或邻居通告。此外,偶尔广播的单播流量会导致信息泄露。这些缺点只能通过网络操作员执行的特定对策才能解决。基于主机的对策并非全部有效。

4.4.4. 反向路径过滤

反向路径过滤可用于防止数据包从一接口传入,又从另一不同的接口传出。输出路径与输入路径不同,这有时被称为 非对称路由 (asymmetric routing)。路由器通常会按某种路径传送数据包,但大多数主机并不需要这么做。在以下此类应用程序中常出现异常现象:从一链接输出流量,又从另一不同的服务提供者链接那接收流量。例如,使用结合 xDSL 的租用线路,或是与 3G 网络调制解调器连接的卫星。如果此类场景适用于您,那么就有必要关闭输入接口的反向路径过滤。简而言之,除非必要,否则最好将其关闭,因为它可防止来自子网络的用户采用 IP 地址欺骗手段,并减少 DDoS (分布式拒绝服务,Distributed Denial of Service)攻击的机会。

注意

红帽企业版 Linux 7 根据 RFC 3704 网络入口滤波器的入站过滤文件所推荐的 严格反向路径 (Strict Reverse Path),默认使用严格反向路径过滤。目前只适用于 IPv4 。

警告

如果要启用转发程序,那么只能禁用反向路径过滤,若有其他方式可用于验证源地址(如 iptables 规则示例)。
rp_filter
通过 rp_filter 指令启用反向路径过滤。 rp_filter 选项可用于指导 kernel (操作系统内核)从三种模式中选择一种。
设置默认行为时,则须采取以下形式:
~]# /sbin/sysctl -w net.ipv4.conf.default.rp_filter=INTEGER
如果 INTEGER 处于以下状态:
  • 0 ——未进行源验证。
  • 1 ——处于如 RFC3704 所定义的严格模式。
  • 2 ——处于如 RFC3704 所定义的松散模式。
通过使用 net.ipv4.interface.rp_filter 可实现对每一网络接口设置的覆写。要在重启时,实现这些设置能够持续存在,则须修改 /etc/sysctl.conf 文件。

4.4.4.1. 附加资源

以下资源对反向路径过滤进行更多的解释。