Os métodos mais robustos parecem ser auditados:
http://blog.ptsecurity.com/2010/11/requirement-10-track-and-monitor-all.html
O Auditd basicamente intercepta todas as chamadas do sistema e as compara com o seu conjunto de regras. Portanto, em seu /etc/audit/audit.rulesarquivo, 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 encontrei essa pergunta ao procurar alternativas) é que os arquivos de log não processados são bastante enigmáticos e são úteis apenas após a execução do programa de consulta no arquivo de log não processado: 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 bom senso provavelmente seria criar um cron que consultaria seus logs de auditoria brutos e os enviaria para sua solução de log.