Quando olho para journalctl
, ele me diz o PID e o nome do programa (ou nome do serviço?) de uma entrada de log.
Então eu me perguntei, os logs são criados por outros processos, como systemd-journald
saber o PID desses processos quando os processos podem apenas gravar strings brutas no soquete do domínio unix que systemd-journald
está ouvindo. Além disso, sytemd-journald
sempre use a mesma técnica para detectar o PID de um dado de log, mesmo quando os processos estiverem produzindo log usando funções como sd_journal_sendv()
?
Existe alguma documentação que eu deveria ler sobre isso?
Eu li a resposta do JdeBP e sei systemd-journald
escutar em um Unix Domian Socket, mas mesmo sabendo o endereço do soquete do peer que envia a mensagem de log, como ele sabe o PID? E se esse soquete de envio for aberto por muitos processos não pai-filhos?
Ele recebe o pid através dos
SCM_CREDENTIALS
dados auxiliares no soquete unix comrecvmsg()
, vejaunix(7)
. As credenciais não precisam ser enviadas explicitamente.Exemplo:
Processos com
CAP_SYS_ADMIN
dados podem enviar o pid que quiserem viaSCM_CREDENTIALS
; no caso desystemd-journald
, isso significa que eles podem falsificar entradas como se fossem registradas por outro processo:systemd-journald
manipula datagramas e credenciais enviados por meio de dados auxiliares está naserver_process_datagram()
função dejournald-server.c
. Tanto asyslog(3)
função padrão delibc
quantosd_journal_sendv()
delibsystemd
enviará seus dados por meio de umSOCK_DGRAM
soquete por padrão egetsockopt(SO_PEERCRED)
não funciona em soquetes de datagrama (sem conexão). Nemsystemd-journald
nemrsyslogd
aceitarSOCK_STREAM
conexões em/dev/log
.scm_cred.c
fake.c
O kernel diz isso.
O EUID, EGID e PID do processo cliente original que conectou o
AF_LOCAL
soquete de fluxo em/run/systemd/journal/stdout
está disponível no kernel por meio daSO_PEERCRED
opção de soquete, que ele usa . As ferramentas UCSPI-UNIX obtêm esta mesma informação através da mesma chamada de sistema.É claro que os processos de serviço filho herdam seus descritores de arquivo de E/S padrão já abertos (a menos que o processo de serviço pai altere isso, é claro) e, portanto,
systemd-journald
todas as saídas de log têm as credenciais do processo pai original.A saída de log gerada através do
AF_LOCAL
soquete em/run/systemd/journal/socket
que fala que osystemd-journald
protocolo idiossincrático está vindo de um soquete de datagrama, em vez de um fluxo. Este socket é sinalizado usando aSO_PASSCRED
opção socket para que o kernel registre a mesma informação em cada datagrama enviado, que é retirado de cada datagrama porsystemd-journald
.Leitura adicional
getsockopt()
. Manual do programador Linux . 2017-09-15.socket
. Manual do programador Linux . 2018-02-02.local-stream-socket-accept
. Guia de no . Programas.