
Tengo algunas comprobaciones de Zabbix que requieren sudo. Estos son los contenidos de /etc/sudoers.d/zabbix
zabbix ALL=(ALL) NOPASSWD: /bin/yum history
zabbix ALL=(ALL) NOPASSWD: /bin/needs-restarting
zabbix ALL=(ALL) NOPASSWD: /sbin/check31
zabbix ALL=(ALL) NOPASSWD: /usr/sbin/crm_mon --as-xml
Cuando fuerzo la verificación desde mi proxy Zabbix, aparece el siguiente error de permiso denegado (pacemaker.status usa /usr/sbin/crm_mon --as-xml
):
bash-5.0$ zabbix_get -s my-server -k pacemaker.status
sudo: PAM account management error: System error
sudo: unable to send audit message: Permission denied
Verifiqué que SELinux efectivamente está bloqueando mis llamadas configurando temporalmente SELinux en modo permisivo.
Luego, intenté permitir estas llamadas siguiendo los siguientes pasos.
Primero, roté el registro de auditoría porque estaba lleno de mensajes irrelevantes de números anteriores:
service auditd rotate
Luego eliminé todas las dontaudits de la política:
semodule -DB
En el proxy Zabbix provoqué el error al ejecutar la zabbix_get
llamada como se indicó anteriormente.
A partir de los registros, creé un módulo SELinux y lo instalé con semodule
:
cat /var/log/audit/audit.log | audit2allow -M zabbix-agent
semodule -i zabbix-agent.pp
Aún así, recibo el mismo error de permiso denegado al enviar el mensaje de auditoría cuando ejecuto zabbix_get
. Investigué un poco, desactivar dontaudits debería funcionar y obligar a SELinux a registrar mensajes adicionales para solucionar este problema, pero lo hice y no funciona para mi situación.
Este es el zabbix-agent.te
archivo audit2allow
que ha creado:
module zabbix-agent 1.0;
require {
type zabbix_agent_t;
type chkpwd_exec_t;
class unix_dgram_socket create;
class file execute_no_trans;
class netlink_audit_socket create;
}
#============= zabbix_agent_t ==============
allow zabbix_agent_t chkpwd_exec_t:file execute_no_trans;
allow zabbix_agent_t self:netlink_audit_socket create;
allow zabbix_agent_t self:unix_dgram_socket create;
Respuesta1
Has probado:
setsebool -P zabbix_can_network=1
Si ya permitió lo anterior, puede intentar esto:
yum install policycoreutils-python
semanage permissive -a zabbix_agent_t
Buena suerte
Respuesta2
Tuve un problema similar (ejecutando una verificación del controlador RAID en una máquina habilitada para Selinux).
El eslabón que me faltaba era el:
semódulo -DB
para permitir algunas políticas distintas a las de auditoría. Luego retome la política.
La referencia fue:https://forums.centos.org/viewtopic.php?t=62829 Es importante tener selinux configurado en permisivo primero cuando realice la captura. Al igual que usted, hice algo como (después de configurarlo en permisivo y capturar y aplicar la política):
rotar registro, eliminar registro antiguo:
service auditd rotate
semodule -DB (no deshabilita reglas de auditoría)
- ejecute el comando desde zabbix (configuración - hosts - ejecutar una vez)
ejecute lo siguiente para obtener el archivo de política
grep -i avc /var/log/audit/audit.log | audit2allow -M políticax
correr
semodule -i políticax.pp
ejecute el comando en Zabbix nuevamente para verificar si funciona
correr
semódulo -B
para habilitar reglas de no auditoría nuevamente.
Mi regla sudoers se ve así:
zabbix ALL=(root) NOPASSWD: /opt/MegaRAID/storcli/storcli64
Intenté si el usuario de zabbix (que tiene shell nologin) podía ejecutar el comando como:
su -s /bin/bash -c 'sudo /opt/MegaRAID/storcli/storcli64 /c0 /eall /sall show' zabbix
Recomiendo probar lo mismo con sus comandos para asegurarse de que se ejecuten correctamente como usuario zabbix.
También utilicé recoverycon en los sudoers y el archivo de sombra, pero no estoy seguro si eso ayudó. También configuré el contexto zabbix_agent_t en el script que ejecuto, pero es posible que eso no haya tenido efecto.
Por último, pero no menos importante, aquí está el archivo de política que apliqué y que me funcionó, tal vez puedas simplemente compilarlo y aplicarlo y ver si funciona:
cat mypolz1.te
module mypolz1 1.0;
require {
type zabbix_exec_t;
type zabbix_agent_t;
type system_dbusd_t;
class capability { net_admin sys_admin };
class dbus send_msg;
class unix_dgram_socket write;
class file { execute execute_no_trans };
class netlink_audit_socket { read write };
}
#============= zabbix_agent_t ==============
#!!!! This avc is allowed in the current policy
allow zabbix_agent_t self:capability net_admin;
allow zabbix_agent_t self:capability sys_admin;
#!!!! This avc is allowed in the current policy
allow zabbix_agent_t self:netlink_audit_socket { read write };
#!!!! This avc is allowed in the current policy
allow zabbix_agent_t self:unix_dgram_socket write;
#!!!! This avc is allowed in the current policy
allow zabbix_agent_t system_dbusd_t:dbus send_msg;
#!!!! This avc is allowed in the current policy
allow zabbix_agent_t zabbix_exec_t:file { execute execute_no_trans };
Como puede ver, tenía algunas políticas configuradas, tal vez el administrador del sistema fue el que hizo el truco (antes de ejecutar el comando pero sin resultados).
Creo que la iteración es clave, porque después de cada paso surgirán diferentes problemas que la política aplicada mitigará. ¡Buena suerte!