Ict-innovation/LPI/110.2
考生应了解如何设置基本的主机安全级别
关键知识领域
- 了解影子密码及其工作原理。
- 关闭未使用的网络服务。
- 了解 TCP 包装器的作用。
许多网络服务,如 sshd 和 httpd,在启动时启动并持续运行。它们处理自己的网络连接,接受来自客户端的连接并为其提供服务。
但是,有些服务依赖于超级服务器来监听并接受代表它们的连接请求。当接受连接时,超级服务器启动所需的服务并将网络连接通过一对文件描述符传递给它。
这种工作方式减少了系统中等待客户端连接而阻塞的进程数量。它还可以提供一个中心位置,用于在收到服务请求时进行访问控制和日志记录。但是,按需创建服务进程会产生少量开销,因此此技术通常不适用于可能会经历高连接请求速率的服务。
有两个超级服务器。第一个是 inetd。它非常古老,在任何当前的 Linux 发行版中都没有使用;但是它包含在 LPI-1 目标中。更现代的超级服务器是 xinetd。它添加了访问控制和日志记录功能。
inetd 守护进程(旧)
此守护进程在启动时启动并监听特定端口上的连接。这允许服务器仅在需要时运行特定的网络守护进程。例如,旧的 telnet 服务有一个守护进程 in.telnetd 用于处理 telnet 会话。inetd 被指示监听端口 23,而不是一直运行此守护进程。另一个例子是 swat(一个基于浏览器的 samba 配置工具),它也依赖于超级服务器来监听连接。
接受连接并启动服务的流程如下所示。
inetd 在文件 /etc/inetd.conf 中配置。每行定义一个 inetd 应该监听的服务。
/etc/inetd.conf 中的字段包含以下内容
service-name | 来自 ** /etc/services ** 的有效名称 |
套接字类型 | TCP 的 stream 和 UDP 的 dgram |
协议 | 来自 ** /etc/protocols ** 的有效协议 |
标志 | 如果多线程则为 nowait,如果单线程则为 wait |
用户/组 | 以用户或组身份运行应用程序。 |
程序 | 要运行的程序的名称 |
参数 | 要传递给程序的参数(如果有) |
示例
daytime stream tcp nowait root internal
telnet stream tcp nowait root /usr/sbin/in.telnetd
pop-3 stream tcp nowait root /usr/sbin/tcpd ipop3d
第一行显示一个简单的 TCP 服务,它在 inetd 内部实现。没有外部服务器要启动。第二行启动 telnet 服务器的“inet 感知”版本。第三行显示一个通过称为 TCP 包装器 (tcpd) 的中间程序启动的服务。该程序添加了一个访问控制层,将在本主题中稍后讨论。
此文件第一字段中出现的服务名称将在 /etc/services 文件中查找,以查找关联的端口号。 /etc/services 中的字段如下
service-name port/protocol [别名]
例如,pop3 的条目如下所示
pop3110/tcppop-3
如果更改了 /etc/inetd.conf 文件,请向 inetd 发送一个 HUP 信号以使其重新读取文件
# pkill -HUP inetd |
TCP 包装器
TCP 包装器是一个程序,它在文件 /etc/hosts.allow 和 /etc/hosts.deny 的控制下,为服务添加了一个访问控制层。通常,TCP 包装器 (tcpd 守护进程) 与 inetd 结合使用以添加访问控制。它的工作原理如下
- inetd 服务器监听并接受到特定服务的连接(例如 pop3)
- inetd 启动其配置文件中为该服务指定的程序。若要使用 TCP 包装器,该程序被指定为 /usr/sbin/tcpd
- 实际服务器的名称 (ipop3d,在本例中) 作为参数传递给 tcpd
- tcpd 咨询文件 /etc/hosts.allow 和 /etc/hosts.deny(将在下面讨论)以决定是否允许连接。
- 如果允许连接,tcpd 将启动实际服务器并将与来自客户端的网络连接相关的文件描述符传递给它。
下图显示了检查 hosts.allow 和 hosts.deny 文件中的条目的逻辑。
请注意,默认情况(如果 hosts.allow 和 hosts.deny 文件为空)是允许访问。
这两个文件中行的格式是
daemon-list : client-host-list [ : shell-command ]
典型的配置在 hosts.deny 中放置一行
ALL: ALL
有了此文件,所有连接都将被拒绝,除非它们与 hosts.allow 中的规则匹配。
以下是一些来自 hosts.allow 的示例条目
sshd: ALL except 192.168.1.11
pop3: 192.168.1.0/24
在这些示例中,客户端主机通过 IP 地址(或 IP 地址块)识别。您也可以在此处指定主机名,或使用关键字 ALL 来匹配所有主机。
TCP 包装器还将记录到服务的每个连接。检查日志以查找未经授权的连接尝试的证据,可能会提供对系统攻击的证据。
TCP 包装器通常通过 tcpd 守护进程(通过 inetd)调用。但是,一些服务(如 sshd 和 vsftpd)与 libwrap 库(处理针对 hosts.allow 和 hosts.deny 的访问控制检查的库)链接,因此遵守这些访问控制。
您可以通过检查 ldd 的输出(显示可执行文件需要哪些动态链接库 (.so 文件))来检查服务是否使用 libwrap 库。例如
$ ldd /usr/sbin/sshd libwrap.so.0 => /usr/lib64/libwrap.so.0 (0x00002b4c09fe3000) libpam.so.0 => /lib64/libpam.so.0 (0x00002b4c0a1ec000) libdl.so.2 => /lib64/libdl.so.2 (0x00002b4c0a3f7000) libselinux.so.1 => /lib64/libselinux.so.1 (0x00002b4c0a5fc000) libaudit.so.0 => /lib64/libaudit.so.0 (0x00002b4c0a814000) libcrypto.so.6 => /lib64/libcrypto.so.6 (0x00002b4c0aa29000) ... 删除的几行 ... |
一些命令行技巧可以找到目录中所有使用 libwrap 的文件
$ find /usr/sbin -type f -exec grep -l libwrap {} \; 2> /dev/null /usr/sbin/mailstats /usr/sbin/makemap /usr/sbin/stunnel /usr/sbin/conmand /usr/sbin/sendmail.sendmail /usr/sbin/smrsh /usr/sbin/rpc.rquotad /usr/sbin/praliases /usr/sbin/sshd |
xinetd 守护进程
在现代 Linux 发行版中,xinetd 已经取代了 inetd。它执行基本上相同的工作,但它也能够根据客户端机器、时间、机器负载等来强制执行访问控制限制。它还记录每个连接,因此不再使用 tcpd 守护进程,而是 xinetd 完成所有操作。配置是通过单个文件 /etc/xinetd.conf 和/或 /etc/xinetd.d/ 中以正在由 xinetd 监控的服务命名的各个文件完成的。
在大多数发行版中,文件 /etc/xinetd.conf 提供默认设置,这些设置可能会被 /etc/xinetd.d/ 中服务特定文件中的条目覆盖
xinetd.d 中服务文件的结构
Service-name { disable = yes/no socket_type = stream for TCP and dgram for UDP protocol = valid protocol from /etc/protocols wait = <yes or no> user= the user the application runs as group= the group the application runs as server= the name of the program to be run for this service }
以下是一个“顶层”文件 /etc/xinetd.conf 的示例
defaults { log_type= SYSLOG daemon info log_on_failure= HOST log_on_success= PID HOST DURATION EXIT cps= 50 10 instances= 50 per_source= 10 v6only= no groups= yes umask= 002 }
includedir /etc/xinetd.d
在此示例中,我们设置了 xinetd 发送消息到 syslog 的工具和优先级,并指定了这些消息中包含哪些信息。我们还实施了一些简单的访问控制,这些控制限制了机器的负载。在此示例中,cps 指令将传入连接的速率限制为每秒 50 个。如果超过此速率,该服务将暂时禁用 10 秒。(您也可以将此视为攻击者对机器发动拒绝服务攻击的一种方式!)instances 指令确定同时可以为服务激活的服务器的最大数量。
以下是一个特定于服务的示例文件
service rsync { disable = no socket_type = stream wait = no user = root server = /usr/bin/rsync server_args = --daemon log_on_failure += USERID only_from = 192.168.0.0/24 }
您最有可能需要在此处更改的字段是“disable”字段。将“disable = no”设置为开启服务,或将“disable = yes”设置为关闭服务。对 xinetd 配置进行更改后,向其发送一个 SIGHUP 信号
# pkill -HUP xinetd |
有关更多详细信息,请参阅 xinetd.conf(5) 的手册页
以下是使用过的文件、术语和实用程序的部分列表:* /etc/nologin
- /etc/passwd
- /etc/shadow
- /etc/xinetd.d/*
- /etc/xinetd.conf
- /etc/inetd.d/*
- /etc/inetd.conf
- /etc/inittab
- /etc/init.d/*
- /etc/hosts.allow
- /etc/hosts.deny