Como posso manter um registro local com registro de data e hora de todos os comandos remotos em que uso ssh
(o cliente openssh da linha de comando é iniciado bash
)?
Requisitos:
Essencial:
- 100% do lado do cliente sem depender do log do servidor
- Configurado ou instalado por usuário com logs armazenados no diretório inicial do usuário.
- Suporte para distinguir entre várias sessões simultâneas com vários usuários e hosts.
- Não intrusivo (não é necessário ativá-lo todas as vezes e não interfere significativamente no uso do ssh)
Prioridade máxima:
- A saída não é registrada ou filtrada o máximo possível
- As entradas de senha não são registradas ou o arquivo é criptografado
- Indica os comandos reais usados (após a conclusão da guia / histórico, backspaces, CTRL+ C, etc ... foram processados)
Bom ter:
- Também registra comandos em sessões encadeadas (comandos inseridos durante sessões remotas
ssh
ousu <user>
) - O início e o fim da sessão devem ser registrados
- Uma
bash
solução simples , sem raiz, seria a melhor (talvez um scriptalias
oubash
wrapper para ossh
comando?)
- Também registra comandos em sessões encadeadas (comandos inseridos durante sessões remotas
Meu nível de habilidade:
- Eu não sou novo em programação, mas ainda estou aprendendo
bash
e do "jeito Linux", portanto, exemplos de código com breves explicações seriam muito apreciados.
Estratégias possíveis
- keylogger - Problema: registra senhas, não registra a conclusão da guia / histórico (consulte a resposta de glenn )
screen
com dumping de scrollback uma vez por segundo ediff
entre eles para encontrar novas linhas de scrollback - Problema: como isso pode ser implementado de uma maneira automatizada útil?ssh "$@" | tee >(some_cleaner_function >> $logfile)
- Problema: não é possível manipular comandos de múltiplas linhas ou histórico em sessões encadeadas, é necessária uma limpeza cuidadosa (veja minha resposta)- Uma combinação de algumas das opções acima
Um exemplo
A seguinte sessão SSH:
user@local:~$ ssh user@remote
Last login: Tue Jun 17 16:34:23 2014 from local
user@remote:~$ cd test
user@remote:~/test$ ls
a b
user@remote:~/test$ exit
Pode resultar em um log ~/logs/ssh.log
como:
2014-06-17 16:34:50 [user@remote - start]
2014-06-17 16:34:51 [user@remote] cd test
2014-06-17 16:34:52 [user@remote] ls
2014-06-17 16:34:53 [user@remote] exit
2014-06-17 16:34:53 [user@remote - end]
Ou talvez seja criado um log separado para cada sessão com a linha de comando usada para iniciar a sessão na parte superior do arquivo.
bash
shell
command-line
openssh
Oleg
fonte
fonte
Respostas:
Fiquei intrigado com sua pergunta. Originalmente, eu não daria uma resposta, mas fiquei viciado.
Isso usa
expect
e é realmente um registrador de chaves.Notas:
uptime
comando), você receberá "upt \ t" no arquivo de log, não "uptime"^?
(caracteres de backspace) no arquivo de log.fonte
Atualmente, estou usando o script bash abaixo. Tem muitos problemas, mas é a única solução que encontrei que atende a todos os requisitos, prioridades e "bom ter" (pelo menos na maioria das vezes).
Esta resposta discute por que o registro local de sessões ssh é tão difícil.
Problemas com o script que encontrei até agora:
Comandos de várias linhas causam problemas:
Sessões encadeadas (usando
ssh
ousu
comandos na extremidade remota) fazem com que a rolagem do histórico grave os comandos passados por rolagem, em vez dos comandos reais usadosAs expressões regulares podem ser aprimoradas e podem precisar ser modificadas para determinados ambientes:
cat -v
antes da limpeza. Como resultado, o conteúdo válido pode ser removido se você usar seqüências de caracteres como^[[
em seus comandos.Nenhuma conclusão do bash do comando ssh, como para nome do host.É possível obter a conclusão do bash se você aliasar esse scriptssh
comalias ssh="sshlog"
Origem e instalação do script:
Para instalar, cole o seguinte em ~ / bin / sshlog e torne o executável. Ligue com
sshlog <ssh command options>
. Opcionalmente, alias para 'ssh' no arquivo .bashrc do usuário.Exemplo de conteúdo de log:
fonte
Eu tenho uma resposta menos complicada e certamente não sou um keylogger. Não entendo seu ponto de ser independente do log do servidor (isso significa que todas as ações precisam ser executadas no servidor e todos os logs são logs do lado do servidor) e, portanto, pensei que uma boa idéia é passar para o bashrc em todo o sistema um comando rápido como:
No debian você deve editar o arquivo: /etc/bash.bashrc e no centos o arquivo: / etc / bashrc
Se você deseja iniciar o logon da sessão em que está, precisa originar o arquivo que editou, por exemplo, execute:
em um sistema debian ou
em um sistema de centos.A partir de agora, todos os comandos, todas as sessões ssh serão registradas em / var / log / syslog em um sistema debian e em / var / log / messages em um sistema centos.
Caso deseje registrá-los em um arquivo separado e não mexer com outros arquivos de log, você pode usar:
em vez do exemplo PROMPT_COMMAND anterior e, em seguida, configure o rsyslogd conforme necessário.Por exemplo, em um sistema Debian, edite o arquivo /etc/rsyslog.conf : altere a linha:
para e adicione a seguinte linha ao final do arquivo:então execute:
fonte
Que tal
strace -o /tmp/ssh_log -ff -s8192 -T -ttt -fp $(pidof sshd)
? Isso registra todas as sessões ssh. Você pode precisar de uma ferramenta para analisar o log posteriormente ou apenas usargrep
,awk
etc.-f
: rastrear crianças bifurcadas-ff
: registre cada filho separadamente parassh_log.PID
-s8192
: aumentar o limite de log de string (se necessário)-T -ttt
: carimbo de microssegundos em segundos desde a época-p N
: anexar ao pidN
fonte