Os métodos mais robustos parecem ser auditados:
O Auditd basicamente intercepta todas as chamadas do sistema e as verifica em relação ao seu conjunto de regras. Então, no seu arquivo /etc/audit/audit.rules
você teria algo como o seguinte:
# This file contains the auditctl rules that are loaded
# whenever the audit daemon is started via the initscripts.
# The rules are simply the parameters that would be passed
# to auditctl.
# First rule - delete all
-D
# Increase the buffers to survive stress events.
# Make this bigger for busy systems
-b 320
# Feel free to add below this line. See auditctl man page
-a always,exit -F euid=0 -F perm=wxa -k ROOT_ACTION
A última regra é a única regra não padrão.
A principal desvantagem dessa abordagem (e a razão pela qual eu encontrei essa pergunta enquanto procurava alternativas) é que os arquivos de log brutos são bastante ocultos e são úteis somente após a execução do programa de consulta no arquivo de log bruto: ausearch
Um exemplo de consulta para essa regra seria:
ausearch -ts today -k ROOT_ACTION -f audit_me | aureport -i -f
Uma solução de senso comum provavelmente seria criar um cron que consultaria seus logs de auditoria e os enviaria para sua solução de registro.