O que você está sugerindo é quase impossível de ser feito corretamente com as ferramentas padrão.
Como você notou, salvar o histórico de comandos é comum não funcionará, já que o arquivo será de propriedade do usuário, e eles podem excluir, limpar ou editar o arquivo à vontade. Mesmo que pudéssemos resolver isso, talvez tornando o arquivo de histórico de comandos um canal lido por algum processo confiável, não há nada que impeça o usuário de simplesmente desativar o arquivo de histórico ou apontá-lo para outro local.
Poderíamos criar um novo shell com o log de comando obrigatório para evitar isso (com os logs enviados para outro processo via pipe, soquete ou syslog), mas o usuário poderia simplesmente iniciar um shell normal ou um interpretador Perl ou Python entre outras coisas, para contornar o registro. Registrar o que os subprocessos fizeram requereria encapsular a sessão inteira em script
ou similar para registrar tudo o que o usuário vê. Mesmo assim, existe a possibilidade de apenas baixar o código e executá-lo, sem imprimi-lo no terminal. Evitar que o usuário execute programas arbitrários faria isso, mas também evitaria fazer as coisas mais úteis. Evitar a execução de shells ou scripts Perl também impediria o funcionamento de muitas ferramentas comuns.
Esse resultado não é surpreendente, considerando que o shell e outros utilitários são entendidos como uma ferramenta para o usuário, e não contra eles.
Talvez você possa organizar a sessão do usuário em strace
ou similar para ver todas as interações que seus processos tiveram com o sistema, mas ler o log strace
de uma sessão longa não seria muito divertido.
Além disso, acho que seus usuários se oporiam a esse nível de monitoramento, sei que sim.