如何在 FreeBSD 中更改 Squid 服务 UID?

如何在 FreeBSD 中更改 Squid 服务 UID?

奇怪的是,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:

  1. vi /etc/group更改服务的 GID:

    前:

    squid:*:100:
    

    后:

    squid:*:1234:
    
  2. 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
    
  3. 使用以下两个命令恢复文件所有权:

    find / -uid 100 -exec chown -v squid {} +
    find / -gid 100 -exec chgrp -v squid {} +
    

我正在使用 ezjail 管理的 FreeBSD 监狱中安装 Squid。

我考虑过IPC,但没有发现ipcs -aSquid正常运行时使用任何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 对象这一事实本身就构成了安全问题,并且不能被忽视......

相关内容