奇怪的是,Squid 似乎无法启动,如果乌贼用户不受 UID 100 的影响。当尝试使用另一个 PID 时,服务系统地无法启动,并出现以下错误:
2016/03/10 10:53:13| storeDirWriteCleanLogs: Starting...
2016/03/10 10:53:13| Finished. Wrote 0 entries.
2016/03/10 10:53:13| Took 0.00 seconds ( 0.00 entries/sec).
FATAL: Ipc::Mem::Segment::create failed to shm_open(/squid-cf__metadata.shm): (17) File exists
Squid Cache (Version 3.5.15): Terminated abnormally.
CPU Usage: 0.026 seconds = 0.026 user + 0.000 sys
Maximum Resident Size: 48640 KB
Page faults with physical i/o: 0
以下是我通常如何更改服务 PID:
vi /etc/group
更改服务的 GID:前:
squid:*:100:
后:
squid:*:1234:
vipw
更改服务 UID:前:
squid:*:100:100::0:0:squid caching-proxy pseudo user:/var/squid:/usr/sbin/nologin
后:
squid:*:1234:1234::0:0:squid caching-proxy pseudo user:/var/squid:/usr/sbin/nologin
使用以下两个命令恢复文件所有权:
find / -uid 100 -exec chown -v squid {} + find / -gid 100 -exec chgrp -v squid {} +
我正在使用 ezjail 管理的 FreeBSD 监狱中安装 Squid。
我考虑过IPC,但没有发现ipcs -a
Squid正常运行时使用任何IPC。
我也尝试过,在一个新的干净的监狱中,首先创建乌贼具有自定义 UID 的用户,然后安装鱿鱼包以确保从一开始就使用正确的 UID,并且不会乌贼PID 100 的用户在任何时候都存在,但同样的问题(我也从中得出结论,这个问题不可能来自所有权问题)。将 UID 设置为 100 使 Squid 能够启动。
我尝试了几个 PID(包括像 101 这样的较低的 PID),它们都显示相同的行为。
我也尝试过使用squid_user
参数,rc.conf
但没有运气:将其设置为乌贼或者根似乎没有改变任何东西。
我在同一系统上有另一个监狱,其中有一个以 PID 100 运行的 Squid,但关闭它并没有以任何方式改变问题(在所有情况下,我都会对两个监狱之间的干扰感到非常惊讶)。
答案1
好的,我现在明白了。几经检查后在 FreeBSD 论坛上,我现在可以确认,就 SHM 对象而言,FreeBSD 监狱的行为有点像瑞士奶酪。事实上,FreeBSD 根本不为 SHM 对象提供任何隔离:所有监狱都可以访问系统范围内的所有 SHM 对象,而没有办法阻止它。
因此,这个问题中提到的错误是非常合乎逻辑的:
- 当使用不同的 UID 时,Squid 无法启动,因为它尝试访问不同用户拥有的 SHM 对象,因此出现错误消息“创建 shm_open(/squid-cf__metadata.shm) 失败:(17)文件已存在”,
- 当两个安装中使用相同的 UID 时,Squid 成功启动,但情况可能更糟,因为两个实例现在都会对抗相同的内存对象,重写彼此的数据并在关闭时删除该对象......
因此,必须采取特定措施来确保每个 Squid 实例使用不同的 SHM 对象名称。
默认情况下,Squid 在 FreeBSD 系统上创建以下 SHM 对象(具体行为取决于操作系统):
/squid-cf__metadata.shm
/squid-cf__queues.shm
/squid-cf__readers.shm
squid
提供-n
允许为实例指定特定名称的参数。具体来说,这个名称(除其他外)将替换上面 SHM 对象名称中的“squid”,因此 SHM 对象名称将在系统范围内变得唯一。
因此,当在新的监狱中设置新的 Squid 实例时,有必要编辑/etc/rc.conf
并添加如下条目(将“something_unique”替换为主机上唯一的实例名称):
squid_flags="-n something_unique"
这允许正确启动两台 Squid 服务器,每台服务器都有不同的 UID。
显然,虽然有点超出了范围,但可以从任何监狱自由访问 Squid 的 SHM 对象这一事实本身就构成了安全问题,并且不能被忽视......