Como a falsificação de syslog "kernel.*" é evitada?

Como a falsificação de syslog "kernel.*" é evitada?

Estou encontrando instâncias de syslog-ng gravando lixo seguido por uma kernel.emerglinha em branco em um de nossos ambientes de produção. Exemplo de um:

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]

A kernel.emerglinha é particularmente preocupante para mim. De acordo com man 3 syslog:

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

Isto parece sugerir que o recurso do kernel não pode ser falsificado. Posso ver onde as próprias chamadas do sistema podem impedir tal falsificação, mas estou correto ao pensar que não há nada que impeça um processo de gravardiretamentepara /dev/loge falsificar uma instalação de kernel? Quero dizer que a única coisa que poderia realmente impedir tal falsificação seria o daemon syslog diferenciando se obteve uma mensagem de /proc/kmsgoutras fontes ou não.

  • A distribuição é RHEL5.5. A versão do kernel é 2.6.18-194.8.1.el5. Esses ainda não são fatores sobre os quais tenho controle; considere-me repreendido.
  • O daemon syslog é um syslog-ngpacote 3.1.4 desenvolvido pela empresa (32 bits e rodando em um kernel de 64 bits, mas eu não esperaria que isso estivesse relacionado).
  • Existem algumas postagens em listas de discussão que encontrei no Google sugerindo que alterações kmsgno kernel 3.5 podem criar erros de saída como este, mas esse definitivamente não é o caso aqui.

As mensagens não estão vindo da rede. Esta é a única fonte 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: "));
};

Responder1

De acordo com o Guia do Administrador do 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#kernel-messages), o recurso do kernel (pelo menos conforme definido por padrão) lê diretamente de /proc/kmsg, que não pode ser gravado a partir da área do usuário.

(Isso vem da memória, mas tenho certeza que o RHEL 5.5 não precisa de klogd ou mesmo de ksymoops para saída de símbolo para endereço; no entanto, verifique seus documentos sobre isso.)

Se você está preocupado (veja meu comentário acima) com algum processo desonesto acrescentando a string literal "kernel:" à mensagem, você sempre pode adicionar um filtro que removeria a string "kernel:" no início de qualquer mensagem recebida para tenha certeza. Como alternativa, defina /proc/kmsg como uma origem separada com um destino separado.

EDIT: Olhando mais para essa seção:

"Observação

Se a mensagem não tiver um cabeçalho syslog adequado, o syslog-ng trata as mensagens recebidas dos arquivos como enviadas pelo recurso kern. Use as opções default-facility e default-priority na definição de origem para atribuir uma instalação diferente, se necessário."

informação relacionada