¿Cómo detener los mensajes de sudo PAM en auth.log para un usuario específico?

16

Estoy usando Zabbix para monitorear mi entorno y zabbix_agentdejecuta como usuario zabbixun script personalizado cada 60 segundos; se utiliza sudopara ejecutar este script comoroot .

En /var/log/auth.logveo cada 60 segundos:

Aug 11 17:40:32 my-server sudo: pam_unix(sudo:session): session opened for user root by (uid=0)
Aug 11 17:40:32 my-server sudo: pam_unix(sudo:session): session closed for user root

Quiero evitar que este mensaje inunde mi registro. Agregué la siguiente línea al /etc/pam.d/sudoarchivo, inmediatamente antes session required pam_unix.so:

session [success=1 default=ignore] pam_succeed_if.so service in sudo quiet uid = 0

y el mensaje desapareció.

Pero el problema es que esta forma he suprimido todos los mensajes PAM cuando alguien ejecuta un script con sudotanroot .

Quiero detener el mensaje solo para el usuario zabbix(no todos los demás usuarios). sudosabe que el zabbixusuario quiere ejecutar el script con rootprivilegios y ¿hay alguna forma de decirle a PAM eso? ¿Cómo puedo decirle a PAM que no inicie sesión para un usuario específico cuando lo use sudo?

Nota : Intenté filtrar los mensajes en syslog; aunque esto funciona, tiene el mismo problema que el anterior, a saber, que es demasiado indiscriminado, ya que el mensaje de registro no indica qué usuario se está convirtiendo en root.

inivanoff1
fuente
Es compatible con el filtrado y con el filtrado funciona. Lo intenté pero no me gusta, porque el filtrado no es una forma universal. Un día, algún carácter en el mensaje cambiará o algo cambiará y mi filtro fallará. Estoy buscando una solución con parámetro de configuración, directiva o algo similar para asegurarme de que esto se detendrá en todos los casos. Y el mensaje dice session closed for user rooty, si lo filtro, de hecho, estoy filtrando todos los mensajes. Quiero para un usuario específico que no se menciona en el mensaje y no puedo filtrar por su nombre ...
inivanoff1

Respuestas:

11

Pareces bastante cercano con tu línea de conf PAM:

session [success=1 default=ignore] pam_succeed_if.so service in sudo quiet uid = 0

Mirando la página del manual para pam_succeed_if, creo que quieres probar que el usuario solicitante ( ruser)zabbix .

Entonces sugiero:

session [success=1 default=ignore] pam_succeed_if.so quiet uid = 0 ruser = zabbix

Eso suprimirá la próxima prueba cuando el usuario se zabbixconviertaroot (pero no otras transiciones). He probado esto con un par de mis propios usuarios.

Elimine la uid = 0prueba en lo anterior si desea guardar silencio sobrezabbix convertirse en un usuario, en lugar de solo root.

Eliminé la service in sudoprueba: es redundante dado que esta línea está en /etc/pam.d/sudo.

Toby Speight
fuente
1
¡Gracias! Eso es lo que estoy buscando. ¡Perfecto! Y gracias por la sugerencia de eliminar service in sudo.
inivanoff1
1
Si también desea eliminar la [user] : TTY=unknown ; PWD=... ; USER=root ; COMMAND=...línea del registro, puede agregar esto a un sudoers.d / file: Defaults:[user] !logfile, !syslog(reemplace [user]donde corresponda)
thom_nic
@thom_nic ¿Cuál es la ruta a ese archivo?
not2qubit
Cualquier archivo bajo /etc/sudoers.d/: prefiero usar el nombre del usuario, grupo o aplicación a la que se aplica. Ver sudo.ws/man/1.8.15/sudoers.man.html
thom_nic
@thom_nic ¿Podría publicar esto como una respuesta un poco más expandida? No veo el formato que propones arriba. Además, no creo que haya una :allí. ¿Y lo logfilesexplícito o algo que debería ser reemplazado?
not2qubit
3

Basado en la respuesta de Toby, encontré una manera de configurar esto de una manera ligeramente diferente en Debian / Ubuntu. Para el contexto, ver:

Entonces Debian / Ubuntu tiene este pam-auth-updatecomando y cuando lo ves /etc/pam.d/sudose ve así:

#%PAM-1.0

@include common-auth
@include common-account
@include common-session-noninteractive

y se /etc/pam.d/common-session-noninteractiveve así:

#
# /etc/pam.d/common-session-noninteractive - session-related modules
# common to all non-interactive services
#
# This file is included from other service-specific PAM config files,
# and should contain a list of modules that define tasks to be performed
# at the start and end of all non-interactive sessions.
#
# As of pam 1.0.1-6, this file is managed by pam-auth-update by default.
# To take advantage of this, it is recommended that you configure any
# local modules either before or after the default block, and use
# pam-auth-update to manage selection of other modules.  See
# pam-auth-update(8) for details.

# here are the per-package modules (the "Primary" block)
session [default=1]         pam_permit.so
# here's the fallback if no module succeeds
session requisite           pam_deny.so
# prime the stack with a positive return value if there isn't one already;
# this avoids us returning an error just because nothing sets a success code
# since the modules above will each just jump around
session required            pam_permit.so
# and here are more per-package modules (the "Additional" block)
session required    pam_unix.so
# end of pam-auth-update config

Así que claro, podría editar cualquiera de los archivos anteriores, pero claramente hay algo de "mayor potencia" en el trabajo aquí. ¿Cómo hacer que mis cambios funcionen bien con otros paquetes que quieran agregar reglas de pam? Para colmo, parecía que no podía simplemente agregar una línea /etc/pam.d/sudoentre los dos @includes así ...

##### THIS DIDN'T WORK :( ######
@include common-auth
@include common-account
session [default=ignore] pam_succeed_if.so quiet_success service = sudo uid = 0 ruser = myappuser
@include common-session-noninteractive

Después de leer los enlaces anteriores, así como otros ejemplos (ver /usr/share/pam-configs/unix), se me ocurrió esto, en /usr/share/pam-configs/myapp:

# Don't log "session opened" messages for myapp user
# See: https://wiki.ubuntu.com/PAMConfigFrameworkSpec
#      https://manpages.debian.org/stretch/libpam-modules/pam_succeed_if.8.en.html
Name: myapp disable session logging
Default: yes
Priority: 300
Session-Type: Additional
Session:
    [default=ignore] pam_succeed_if.so quiet_success service = sudo uid = 0 ruser = myappuser

Sessiony Session-Typecontrola qué archivos se editan y Prioritydefine en qué orden van. Después de agregar ese archivo y ejecutarlo pam-auth-update, se /etc/pam.d/common-session-noninteractiveve así (en la parte inferior :)

#... omitted
session required            pam_permit.so
# and here are more per-package modules (the "Additional" block)
session [default=ignore] pam_succeed_if.so quiet_success service = sudo uid = 0 ruser = myappuser
session required pam_unix.so 
# end of pam-auth-update config

... que es lo que queremos porque nuestra pam_succeed_iflínea necesita venir antes session required pam_unix.so. (Esa línea proviene /use/share/pam-configs/unixy tiene un resultado, Priority: 256así que termina en segundo lugar). Tenga en cuenta también que dejé el service = sudopredicado ya common-session-noninteractiveque también podría estar incluido en otras configuraciones sudo.

En mi caso, ya había empaquetado mi código como un instalador .deb, así que agregué el /usr/share/pam-configs/myapparchivo, agregué pam-auth-update --packagemi postinsty prermscripts y estoy listo para comenzar.

Consideración...

Si lees el artículo PAMConfigFrameworkSpec que he vinculado anteriormente , define una Session-Interactive-Onlyopción, pero no tiene una forma de especificar solo reglas no interactivas . También /etc/pam.d/common-sessionfue actualizado . No creo que haya una forma de evitar esto. Si está de acuerdo con que las sesiones interactivas no se registren para ese usuario (es una cuenta de servicio, ¿verdad?), Entonces debería estar listo.

Bonificación: cómo eliminar también la salida del registro de sudo

Además de las session openened|closedlíneas que emite PAM, sudoregistra información adicional sobre el comando que se ejecuta. Se parece a esto:

[user] : TTY=unknown ; PWD=... ; USER=root ; COMMAND=...

Si también desea eliminar eso, abra este enlace y luego continúe a continuación ...

Entonces ... probablemente esté familiarizado con la /etc/sudoers.d/___configuración típica que podría hacer algo como esto para una cuenta de servicio que necesita privs de superusuario para algunas acciones:

myuser ALL=(ALL) NOPASSWD: /bin/ping

eso podría entrar /etc/sudoers.d/10_myuser. Bueno, entre otras cosas también puedes especificarDefaults . Tenga en cuenta específicamente esta sintaxis'Defaults' ':' User_List

Ahora, mira la sección OPCIONES DE SUDOERS . Los bits interesantes incluyen log_input, log_outputpero (probablemente) más importante, syslogy logfile. Me parece que en las versiones recientes de Debian, rsyslog o sudoiniciar sesión en stdouto stderrpor defecto. Entonces, para mí, esto se mostraba en el registro de journald para mi servicio, y no, por ejemplo, /var/log/auth.logdonde no se mezclaría con los registros de mi aplicación. Para eliminar el registro de sudo, agregué lo siguiente para /etc/sudoers.d/10_myuserque se vea así:

Defaults:myuser !logfile, !syslog
myuser ALL=(ALL) NOPASSWD: /bin/ping

YMMV, si cree que deshabilitar el registro crea problemas con las auditorías de seguridad, también puede intentar resolverlo a través de los filtros rsyslog.

thom_nic
fuente
La forma en que implementó las cosas de "sesión abierta / cerrada" no funcionó para mí. Hay dos razones: (1) No especificó usar success=1, (lo que omite la siguiente cláusula), y (2) Porque, como especificó service = sudo, cualquier trabajo CRON en ejecución da como resultado requirement "service = sudo" not met by user "root". (Y posiblemente otros efectos secundarios). Sin embargo, ¡tus cosas de bonificación funcionaron muy bien! Gracias.
not2qubit
¿Cómo se ven tus scripts postinsty tu prerm?
not2qubit
@ not2qubit re: success=1- Prefiero no saltarme por pam_unixcompleto. Solo quiero dejar de registrar la salida que [default=ignore]parece lograr muy bien sin omitir pam_unix.
thom_nic
re: cronjobs y service = sudo: ¿Es posible que tus trabajos cron se estén ejecutando como un usuario no privado, pero no estás llamando sudocomo parte de los trabajos cron?
thom_nic
2

Después de bastante pruebas e investigaciones atemorizantes, he encontrado una solución que funciona para Debian Stretch (en Raspberry). Seguramente hay más de una forma de lograr lo que OP solicita. Pero la documentación de PAM es abrumadora, por lo que la mayoría de las cosas son realmente TL; DR.

  1. Puede agregar un filtro de cadena personalizado para rsyslog en: /etc/rsyslog.d/anyname.confmediante el uso de:
    :msg, contains, "session opened for user root by pi" stop
  2. Puedes editar directamente /etc/pam.d/sudo
  3. Puede hacerlo de la manera correcta creando un archivo de configuración PAM personalizado en: /usr/share/pam-configs/
  4. Puede hacer algo creando un archivo de sudoers personalizado en:/etc/sudoers.d/020_pi

Te mostraré cómo hacer (2) y (4).

ADVERTENCIA

No edite ningún archivo /etc/pam.d/sin cambiar primero sus permisos de escritura mundiales. Si no lo hace, y comete un error, ¡puede quedar bloqueado de cualquier uso futuro de sudo / su ! Así que asegúrese de haber probado la nueva configuración antes de volver a cambiarla. (El valor predeterminado es 644 )


Para deshacerse de "sesión abierta / cerrada":

Queremos deshacernos del siguiente /var/log/auth.logspam:

May 10 11:28:03 xxx sudo[26437]: pam_unix(sudo:session): session opened for user root by (uid=0)
May 10 11:28:07 xxx sudo[26437]: pam_unix(sudo:session): session closed for user root

Hacer esto:

# sudo chmod 666 /etc/pam.d/sudo
# sudo cat /etc/pam.d/sudo

#%PAM-1.0

@include common-auth
@include common-account
session [success=1 default=ignore] pam_succeed_if.so quiet_success uid = 0 ruser = pi
@include common-session-noninteractive

Lo que es de importancia crucial aquí es que success=1, si tiene éxito , se saltea la siguiente cláusula 1 (o en la jerga PAM "saltar sobre el siguiente módulo en la pila").

De man pam.conf:

ignorar : cuando se usa con una pila de módulos, el estado de retorno del módulo no contribuirá al código de retorno que obtiene la aplicación.

done - equivalente a ok con el efecto secundario de terminar la pila de módulos y PAM regresando inmediatamente a la aplicación.

N : equivalente a ok con el efecto secundario de saltar sobre los siguientes N módulos en la pila.

A continuación, reinicie y deje que se ejecute unas horas (para verificar trabajos cron, por ejemplo) para comprobar que esto funciona. Luego, asegúrese de reinstalar los permisos del archivo, de lo contrario, tendrá un agujero de seguridad enorme en su sistema. ( sudo chmod 644 /etc/pam.d/sudo)


Para deshacerse de los repetidos mensajes de "TTY PWD COMMAND":

También queremos deshacernos de mensajes como este:

May 11 18:23:20 xxx sudo:       pi : TTY=unknown ; PWD=... ; USER=root ; COMMAND=/usr/bin/arp-scan -q -l

En mi caso, esto fue generado por un script IDS que ejecutaba arp-scan cada pocos minutos. Para evitar que aparezca en los registros, cree el siguiente archivo:

# sudo nano /etc/sudoers.d/020_pi
# sudo cat /etc/sudoers.d/020_pi

Defaults:pi     !logfile, !syslog
pi xxx = (root) NOPASSWD: /usr/bin/arp-scan

(Aquí xxxestá el nombre de su máquina y piel nombre de usuario).

not2qubit
fuente
1
> No edite ningún archivo en /etc/pam.d/ sin cambiar primero sus permisos de escritura en el mundo ... En su lugar, sugiera ejecutar otra sesión de terminal como root, por ejemplo, sudo su - entonces no tiene que establecer permisos peligrosos y arriesgarse a olvidar cambiar de nuevo
thom_nic
@thom_nic ¿Has probado esto? Supongo que si accidentalmente bloquea el uso de sudo / su en PAM, no importa lo que haga, producirá un error, incluso en un shell raíz. Si no es así, entonces PAM probablemente no esté funcionando como debería.
not2qubit
-2

Conseguirás:

pam_succeed_if(sudo:session): unknown attribute "ruser"

con tu respuesta

#%PAM-1.0

@include common-auth
@include common-account
@include common-session-noninteractive
session     [success=1 default=ignore] pam_succeed_if.so service in zabbix quiet use_uid
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid

funciona pero aún obtendrás un:

pam_unix(sudo:session): session opened for user root by (uid=0)

en tus troncos.

golfdq
fuente
1
Especifique: 1. qué archivo está editando, 2. quién es "usted" y qué resuelve.
not2qubit