我有一个连接到 Postgresql 数据库的 PHP 应用程序。当我通过网络连接时,这是有效的,但在尝试使用套接字连接时,我遇到了 SELinux 违规。我相信上下文设置正确并且启用了正确的标志。
httpd_can_network_connect --> on
httpd_can_network_connect_db --> on
失败的 sealert 消息如下所示:
SELinux is preventing /usr/sbin/php-fpm from connectto access on the unix_stream_socket /run/postgresql/.s.PGSQL.5432.
***** Plugin catchall (100. confidence) suggests **************************
If you believe that php-fpm should be allowed connectto access on the .s.PGSQL.5432 unix_stream_socket by default.
Then you should report this as a bug.
You can generate a local policy module to allow this access.
Do
allow this access for now by executing:
# ausearch -c 'php-fpm' --raw | audit2allow -M my-phpfpm
# semodule -X 300 -i my-phpfpm.pp
Additional Information:
Source Context system_u:system_r:httpd_t:s0
Target Context system_u:system_r:unconfined_service_t:s0
Target Objects /run/postgresql/.s.PGSQL.5432 [ unix_stream_socket
]
Source php-fpm
Source Path /usr/sbin/php-fpm
Port <Unknown>
Host localhost.localdomain
Source RPM Packages php-fpm-8.2.13-1.el9.remi.x86_64
Target RPM Packages
SELinux Policy RPM selinux-policy-targeted-38.1.23-1.el9.noarch
Local Policy RPM selinux-policy-targeted-38.1.23-1.el9.noarch
Selinux Enabled True
Policy Type targeted
Enforcing Mode Enforcing
Host Name localhost.localdomain
Platform Linux localhost.localdomain
5.14.0-362.8.1.el9_3.x86_64 #1 SMP PREEMPT_DYNAMIC
Wed Nov 8 17:36:32 UTC 2023 x86_64 x86_64
Alert Count 1080
First Seen 2023-12-29 14:34:45 PST
Last Seen 2024-01-31 12:15:18 PST
Local ID e3bcfa07-6867-47e3-bedf-4d8ca2d16443
Raw Audit Messages
type=AVC msg=audit(1706732118.737:4455): avc: denied { connectto } for pid=516281 comm="php-fpm" path="/run/postgresql/.s.PGSQL.5432" scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:system_r:unconfined_service_t:s0 tclass=unix_stream_socket permissive=0
type=SYSCALL msg=audit(1706732118.737:4455): arch=x86_64 syscall=connect success=no exit=EACCES a0=8 a1=561638666d58 a2=6e a3=7fa9f9d951a0 items=0 ppid=516267 pid=516281 auid=4294967295 uid=984 gid=984 euid=984 suid=984 fsuid=984 egid=984 sgid=984 fsgid=984 tty=(none) ses=4294967295 comm=php-fpm exe=/usr/sbin/php-fpm subj=system_u:system_r:httpd_t:s0 key=(null)
Hash: php-fpm,httpd_t,unconfined_service_t,unix_stream_socket,connectto
一件看起来很奇怪的事情是缺少 postgres 套接字的 RPM 包。
提供了生成本地策略模块的说明;但我不明白这些命令到底会做什么,并且犹豫是否要运行它们。
ausearch -c 'php-fpm' --raw | audit2allow -M my-phpfpm
semodule -X 300 -i my-phpfpm.pp
这些命令创建 selinux 策略。
ausearch
扫描审核日志以查找 PHP 想要执行的操作,并audit2allow
创建允许第一个命令找到的任何内容的策略。然后semodule
激活新创建的策略。我建议在命令中添加
-a 4455
密钥,ausearch
以使其仅允许在此特定事件期间禁止的任何操作。这会更安全,因为它不会意外地允许任何不相关的事情:另请注意,我对该策略的命名略有不同,因为通过此过滤器,我们可以确定它到底允许什么。
详细信息请参见
man ausearch
和。man audit2allow
man semodule
可能没有套接字文件的包。套接字是一个动态文件系统对象,它是动态创建和删除的。认为它是一个“临时文件”,仅在创建它的服务运行时才有效。因此,套接字通常在非易失性内存文件系统中创建,挂载为
/run
,在重新启动期间不会持续存在。真正奇怪的是套接字的selinux类型是
unconfined_service_t
. Postgres 套接字应该有一个预定义的类型,并且有一个允许httd_t
进程访问它的策略。我认为提交功能请求以实现此功能是明智的。这里的问题似乎是您
php-fpm
作为unconfined_service_t
服务运行。你是如何开始这项服务的?如果您通过以下方式启动它,
systemd
我建议在软件包上运行重新标签,因为某些内容标记不正确。php-fpm
在我的系统上出现的是,httpd_t
已经为该服务运行的一堆规则应该适用并为您工作。应该正确地重新标记所有 PHP 包。然后按正常
php-fpm
方式重新启动。systemctl