第 19 章 Squid 缓存代理
Squid 是 Web 客户端的高性能代理缓存服务器,支持 FTP、Gopher 和 HTTP 数据对象。它通过缓存和重复使用频繁请求的网页来缩短带宽并缩短响应时间。[17]
在 Red Hat Enterprise Linux 中,s quid 软件包提供了 Squid 缓存代理。输入以下命令查看是否安装了 squid 软件包:
~]$ rpm -q squid
package squid is not installed
如果没有安装它,并且您想要使用 squid,请以 root 用户身份使用
yum
工具来安装它:
~]# yum install squid
19.1. Squid 缓存代理和 SELinux
启用 SELinux 后,Squid 默认会受到限制。受限制的进程在其自己的域中运行,并且与其他受限制的进程隔开。如果一个受攻击者限制的进程受到 SELinux 策略配置的影响,攻击者对资源的访问权限和可能受到的破坏会受到限制。以下示例演示了在自己的域中运行的 Squid 进程。本例假设安装了 squid 软件包:
- 运行 getenforce 命令,确认 SELinux 是否在 enforcing 模式下运行:
~]$ getenforce Enforcing
当 SELinux 处于 enforcing 模式时,命令会返回Enforcing
。 - 以 root 用户身份输入以下命令启动
squid
守护进程:~]# systemctl start squid.service
确认 服务正在运行。输出中应包括以下信息(只有时间戳有所不同):~]# systemctl status squid.service squid.service - Squid caching proxy Loaded: loaded (/usr/lib/systemd/system/squid.service; disabled) Active: active (running) since Mon 2013-08-05 14:45:53 CEST; 2s ago
- 输入以下命令来查看
squid
进程:~]$ ps -eZ | grep squid system_u:system_r:squid_t:s0 27018 ? 00:00:00 squid system_u:system_r:squid_t:s0 27020 ? 00:00:00 log_file_daemon
与squid
进程关联的 SELinux 上下文为system_u:system_r:squid_t:s0
。上下文的最后一部分squid_t
是类型。类型定义进程的域以及文件的类型。在这种情况下,Squid 进程在squid_t
域中运行。
SELinux 策略定义了在受限制域中运行的进程的方式,如
squid_t
、与文件、其他进程和系统交互。文件必须正确标记,以允许对文件进行 squid 访问。
当配置
/etc/squid/squid.conf
文件以便 squid
侦听默认 TCP 端口 3128, 3401 或 4827 以外的端口时,必须使用 semanage port 命令,将所需的端口号添加到 SELinux 策略配置中。以下示例演示了将 squid
配置为监听最初在 SELinux 策略配置中定义的端口,因此服务器无法启动。本例还演示如何配置 SELinux 系统,以允许 守护进程成功侦听策略中尚未定义的非标准端口。本例假定已安装了 squid 软件包。以 root 用户身份运行示例中的每个命令:
- 确认
squid
守护进程没有运行:~]# systemctl status squid.service squid.service - Squid caching proxy Loaded: loaded (/usr/lib/systemd/system/squid.service; disabled) Active: inactive (dead)
如果输出不同,请停止该进程:~]# systemctl stop squid.service
- 输入以下命令查看 SELinux 允许
squid
侦听的端口:~]# semanage port -l | grep -w -i squid_port_t squid_port_t tcp 3401, 4827 squid_port_t udp 3401, 4827
- 以 root 用户身份编辑
/etc/squid/squid.conf
。配置http_port
选项,以便它列出在squid
的 SELinux 策略配置中未配置的端口。在这个示例中,守护进程被配置为侦听端口 10000:# Squid normally listens to port 3128 http_port 10000
- 运行 setsebool 命令,以确保
squid_connect_any
布尔值设为 off。这样可确保squid
只允许在特定端口上运行:~]# setsebool -P squid_connect_any 0
- 启动
squid
守护进程:~]# systemctl start squid.service Job for squid.service failed. See 'systemctl status squid.service' and 'journalctl -xn' for details.
记录类似如下的 SELinux 拒绝信息:localhost setroubleshoot: SELinux is preventing the squid (squid_t) from binding to port 10000. For complete SELinux messages. run sealert -l 97136444-4497-4fff-a7a7-c4d8442db982
- 对于 SELinux,允许
squid
侦听端口 10000,如下例所示:~]# semanage port -a -t squid_port_t -p tcp 10000
- 再次启动
squid
,并使其侦听新端口:~]# systemctl start squid.service
- 现在 SELinux 已配置为允许 Squid 侦听非标准端口(本示例中为 TCP 10000),它在此端口上成功启动。