¿Cómo se evita la suplantación de syslog "kernel.*"?

¿Cómo se evita la suplantación de syslog "kernel.*"?

Estoy encontrando casos en los que syslog-ng escribe basura seguida de una kernel.emerglínea en blanco en uno de nuestros entornos de producción. Ejemplo de uno:

Dec 21 00:14:56 someserver [syslog-ng.err] Error processing log message: <Q▒b
+\c 21 00:14:56 someserver [syslog-ng.err] Error processing log message: <;E0
Dec 21 00:14:56 someserver [syslog-ng.err] Error processing log message: <▒"▒l
Dec 21 00:14:57 someserver [syslog-ng.err] Error processing log message: <▒▒▒▒e▒F
Dec 21 00:14:57 someserver [syslog-ng.err] Error processing log message: <▒▒
Dec 21 00:14:58 someserver [kernel.emerg]

La kernel.emerglínea me preocupa especialmente. De acuerdo a man 3 syslog:

       LOG_KERN
              kernel messages (these can’t be generated from user processes)

Esto parece sugerir que no se puede falsificar la instalación del núcleo. Puedo ver que dónde se llama el sistema podría evitar dicha suplantación, pero ¿tengo razón al pensar que no hay nada que impida que un proceso escriba?directamentey /dev/logfalsificar una instalación de kernel? Quiero decir que lo único que realmente podría detener dicha suplantación sería que el demonio syslog diferencie si obtuvo un mensaje de /proc/kmsgotras fuentes o no.

  • La distribución es RHEL5.5. La versión del núcleo es 2.6.18-194.8.1.el5. Estos no son factores sobre los que tenga control todavía; Considérame regañado.
  • El demonio syslog es un paquete 3.1.4 creado por la empresa syslog-ng(de 32 bits y que se ejecuta en un kernel de 64 bits, pero no esperaría que estuviera relacionado).
  • Hay algunas publicaciones en listas de correo que encontré a través de Google que sugieren que los cambios en kmsgel kernel 3.5 pueden crear errores de salida como este, pero ese definitivamente no es el caso aquí.

Los mensajes no llegan desde la red. Esta es la única fuente definida:

source s_syslog {
# message generated by Syslog-NG
internal();
# standard Linux log source (this is the default place for the syslog()
# function to send logs to)
unix-stream("/dev/log");
# messages from the kernel
file("/proc/kmsg" program_override("kernel: "));
};

Respuesta1

Según la Guía del administrador de syslog-ng (http://www.balabit.com/sites/default/files/documents/syslog-ng-ose-3.3-guides/en/syslog-ng-ose-v3.3-guide-admin-en/html-single/ index.html#mensajes-del-kernel), la función del kernel (al menos como se define de forma predeterminada) lee directamente desde /proc/kmsg, en el que no se puede escribir desde el área de usuario.

(Esto es de memoria, pero estoy bastante seguro de que RHEL 5.5 no necesita klogd o incluso ksymoops para la salida de símbolo a dirección; sin embargo, consulte sus documentos al respecto...)

Si le preocupa (vea mi comentario anterior) que algún proceso fraudulento anteponga la cadena literal "kernel:" a su mensaje, siempre puede agregar un filtro que elimine la cadena "kernel:" al comienzo de cualquier mensaje recibido. estar seguro. Alternativamente, defina /proc/kmsg como una fuente separada con un destino separado.

EDITAR: Al mirar más en esa sección:

"Nota

Si el mensaje no tiene un encabezado syslog adecuado, syslog-ng trata los mensajes recibidos de archivos como enviados por la función kern. Utilice las opciones de instalación predeterminada y prioridad predeterminada en la definición de fuente para asignar una instalación diferente si es necesario."

información relacionada