Я работаю на RedHat7 с установленными apache 2.4 и redis. Apache не будет подключаться к Redis, пока не будут решены проблемы с selinux. Я знаю, что один из способов исправить это - разрешить все соединения с:
setsebool -P httpd_can_network_connect=1
но я бы предпочел разрешить подключения только к redis, который выполняется локально, а не ко всем портам tcp. Я следил за предложениями в:
SElinux: разрешить httpd подключаться к определенному порту
но для меня это не совсем сработало. Первое предложение не удалось, потому что порт redis уже определен (redis):
semanage port -l | egrep '(^http_port_t|6379)'
http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000
redis_port_t tcp 6379, 16379, 26379
semanage port -a -t http_port_t -p tcp 6379
ValueError: Port tcp/6379 already defined
Второе предложение:
semanage port -m -t http_port_t -p tcp 6379
работал, и apache смог правильно подключиться к Redis. Однако после перезагрузки redis не хотел запускаться, что привело к еще одной ошибке selinux («SELinux предотвращает / opt / rh / rh-redis32 / root / usr / bin / redis-server от доступа name_bind к порту tcp_socket 6379 "):
SELinux is preventing /opt/rh/rh-redis32/root/usr/bin/redis-server from name_bind access on the tcp_socket port 6379.
***** Plugin catchall (100. confidence) suggests
If you believe that redis-server should be allowed name_bind access on the port 6379 tcp_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 'redis-server' --raw | audit2allow -M my-redisserver
semodule -i my-redisserver.pp
Additional Information:
Source Context system_u:system_r:redis_t:s0
Target Context system_u:object_r:http_port_t:s0
Target Objects port 6379 [ tcp_socket ]
Source redis-server
Source Path /opt/rh/rh-redis32/root/usr/bin/redis-server
Port 6379
Кто-нибудь знает, как правильно разрешить apache подключаться к (локально установленному) redis, не устанавливая "httpd_can_network_connect"?
Примечание: жалоба selinux на то, что httpd не может использовать redis, перед выполнением каких-либо команд semanage была:
SELinux is preventing /opt/rh/httpd24/root/usr/sbin/httpd from name_connect access on the tcp_socket port 6379.
***** Plugin catchall_boolean (89.3 confidence) suggests ******************
If you want to allow httpd to can network connect
Then you must tell SELinux about this by enabling the 'httpd_can_network_connect' boolean.
Do
setsebool -P httpd_can_network_connect 1
***** Plugin catchall (11.6 confidence) suggests **************************
If you believe that httpd should be allowed name_connect access on the port 6379 tcp_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 'httpd' --raw | audit2allow -M my-httpd
# semodule -i my-httpd.pp
Additional Information:
Source Context system_u:system_r:httpd_t:s0
Target Context system_u:object_r:redis_port_t:s0
Target Objects port 6379 [ tcp_socket ]
Source httpd
Source Path /opt/rh/httpd24/root/usr/sbin/httpd
Port 6379
Host <Unknown>
Source RPM Packages httpd24-httpd-2.4.27-8.el7.1.x86_64
Target RPM Packages
Policy RPM selinux-policy-3.13.1-192.el7_5.6.noarch
Selinux Enabled True
Policy Type targeted
Enforcing Mode Enforcing
[...]
Raw Audit Messages
type=AVC msg=audit(1540322412.65:21558): avc: denied { name_connect } for pid=26250 comm="httpd" dest=6379 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:redis_port_t:s0 tclass=tcp_socket
type=SYSCALL msg=audit(1540322412.65:21558): arch=x86_64 syscall=connect success=no exit=EACCES a0=11 a1=7efca766b050 a2=10 a3=5bcf746c items=0 ppid=11656 pid=26250 auid=4294967295 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=4294967295 comm=httpd exe=/opt/rh/httpd24/root/usr/sbin/httpd subj=system_u:system_r:httpd_t:s0 key=(null)
Hash: httpd,httpd_t,redis_port_t,tcp_socket,name_connect
Я думаю, что лучше всего вернуть номер порта к исходному типу, разрешить ему собирать AVC, а затем построить модуль локальной политики. Затем вы можете вернуться к принудительному исполнению.