我维护的一个网站由多个本地应用程序组成,所有应用程序都由同一个nginx实例代理。每个应用程序都在其自己的用户下运行,并公开一个可由 web 服务器组写入的unix 套接字www-data
。
所有应用程序用户都是该www-data
组的一部分,因此他们可以chown他们的套接字。如何改进我的设置,以便不再使用一个应用程序中的漏洞通过直接连接到其他套接字来尝试进一步提升权限?
我以前的解决方案:为每个用户创建一个新组并将 Web 服务器添加到所有这些用户。此解决方案不太可取,因为它使添加/删除应用程序变得复杂,并且需要硬重启 Web 服务器来更新组。
与服务如何从systemd继承特权端口类似,它们可以接收对本地套接字的访问权限,否则它们将无权打开。 Systemd创建 unix 套接字并仅将文件描述传递给服务 - 这样,服务不需要套接字文件的访问权限。
像这样设置套接字
/etc/systemd/system/example.socket
:(阅读man systemd.socket
)并像这样使用该套接字
/etc/systemd/system/example.service
:(阅读man systemd.unit
)请注意,包括 uwsgi 在内的许多程序
LISTEN_FDS
在其环境中都可以理解,因此通常不需要硬编码文件描述符 3。使用以下方法应用并启动设备:
如果服务帐户随后尝试打开另一个服务的套接字,他将不会成功 - 套接字是由其拥有和独占读取的
www-data
(即只有在该用户下运行的 Web 服务器才能访问它们)。