Embora essa pergunta tenha sido feita por um indivíduo que deseja gravar suas próprias sessões, um caso de uso alternativo pode ser um administrador do sistema que deseja acompanhar o que vários usuários estão fazendo.
I fear running script
inside the system-wide bashrc
might not be suitable in the case when users of the machine are reluctant to have recordings made of their sessions.
Users who wish to remain incognito could bypass the logging by asking sshd to open a different shell (e.g. zsh
) or run bash --rcfile ___
to prevent /etc/bash.bashrc
from being loaded.
Uma abordagem alternativa
Este guia de 2008 ( arquivado ) usa um método diferente para forçar o script
a ser executado quando um usuário efetua login com ssh, o que requer que os usuários efetuem login com uma chave pública / privada.
Isso é feito adicionando um script ao arquivo .ssh/authorized_keys
do usuário, na frente da chave:
command="/usr/local/sbin/log-session" ssh-dss AAAAB3NzaC1kc3MAAAEBAMKr1HxJz.....
O log-session
( arquivado ) script decide se deve ou não executar /usr/bin/script
para registrar a sessão deste usuário.
exec script -a -f -q -c "$SSH_ORIGINAL_COMMAND" $LOGFILE
Para evitar que o usuário remova o comando adicionado, o administrador precisará assumir a propriedade do arquivo authorized_keys
do usuário.
chown root:root ~user/.ssh/authorized_keys
Infelizmente, isso significa que o usuário não poderá adicionar nenhuma chave adicional ou, mais importante, revogar a chave existente se estiver comprometida, o que está longe de ser ideal.
Advertências
É comum que a configuração padrão do sshd permita que os usuários executem SFTP através de seu login ssh. Isso oferece uma maneira de os usuários editarem arquivos sem que as alterações sejam registradas. Se o administrador não quiser que os usuários façam isso, ele deverá habilitar algum log para SFTP ou desabilitar o serviço. Embora, mesmo assim, os usuários ainda possam fazer alterações invisíveis nos arquivos executando algo parecido com isso no terminal:
curl "http://users.own.server/server/new_data" > existing_file
Pode ser possível monitorar mudanças como essa usando um sistema de arquivos copy-on-write que registra todo o histórico de arquivos.
Mas um truque semelhante permitiria que um usuário executasse comandos sem que eles fossem registrados:
curl "http://users.own.server/server/secret_commands_824" | sh
Eu não conheço nenhuma solução fácil para isso. Possibilidades podem ser:
- Registrando todos os dados da rede (e desemaranhando-os depois).
- Registrando todas as chamadas do sistema.
Esse tipo de coisa pode ser possível com auditd .
Mas de qualquer forma ...
It is unlikely that logging user sessions provides any real security for administrators. By default a user can only manipulate their own files, and cannot harm the system. If a malicious user did manage to escalate privileges, then he could disable logging and delete the logs (unless the administrator has configured logs to be stored on a separate machine, in an append-only fashion).
Administrators who do automatically log user sessions should probably inform the users that this is being done. In some jurisdictions, this form of data collection might violate data or privacy laws. And at the very least, it would be respectful to users to make them aware.
It is more likely that an administrator would be interested in logging the sessions of sudo
users. That could perhaps be tackled in a different answer, or indeed a different question.