
Basicamente, quero registrar todo e qualquer arquivo enviado ou recebido via SCP no servidor.
Digamos que um usuário faça um SCP do Servidor-1 para o Servidor-2. Eu descobri uma maneira de obter registros do lado dos remetentes,mas como conseguir o que foi transferido do lado do receptor?
Quero os logs do lado do destinatário contendo os nomes dos arquivos que são transferidos para ele via SCP.
Além disso, para obter logs do lado dos remetentes, estou usando meu script bash, que primeiro salva o nome do arquivo em um arquivo de log e depois usa o SCP para transferi-lo. Existe alguma abordagem melhor para fazer isso.
Agradecemos antecipadamente por qualquer sugestão.
Responder1
Acabei de encontrar uma solução interessante na qual outras pessoas podem estar interessadas:
Ao usá-lo scp
, na verdade, também chama o binário no servidor com o -f
sinalizador. Isso significa que é possível escrever um wrapper simples para o lado do servidor scp
, como este:
Primeiro mude scp
o nome do seu original:
mv /usr/bin/scp /usr/bin/scp-org
Em seguida, crie um script simples em seu nome:
sudo nano /usr/bin/scp
com o conteúdo:
#/bin/bash
scp-org $@ | tee >(grep -aEo "[CD][0-7]{4} [0-9]* .*$" --line-buffered >> /var/log/scp.log)
É claro que isso poderia ser refinado, mas funciona como exemplo. Agora você pode usar tail -f /var/log/scp.log
e ver todos os arquivos sendo transferidos em tempo real
Responder2
Você pode tentar substituir o scp
comando no servidor por uma versão modificada que faça o que você precisa. scp
é um programa muito simples e adicionar algum código de registro a ele não deve ser uma tarefa difícil.
Responder3
Você provavelmente está usando o pacote de software OpenSSH. O scp
utilitário OpenSSH não registra nada. Ele suporta saída de depuração para a sessão SSH subjacente, mas não registra as transferências reais de arquivos que estão ocorrendo.
Da mesma forma, o servidor OpenSSH pode ser configurado para registrar detalhes sobre o que está fazendo e pode ser configurado para registrar o fato de que um usuário se conectou e executou scp
, mas não registrará as transferências reais de arquivos que estão ocorrendo.
Se você não conseguir fazer com que esses usuários usem SFTP, existem três abordagens disponíveis:
Investigue servidores SSH/SFTP/SCP alternativos (em outras palavras, comerciais). Eles geralmente devem suportar transferências de arquivos de log.
Substitua o
scp
utilitário no servidor por um que registre os dados desejados. OpenSSH é de código aberto. Alguém que saiba programar em C para Unix poderiabaixe a fontee modificá-lo.Substitua o
scp
utilitário por um "wrapper" que inicia o programa scp original e monitora o que ele faz. Existem ferramentas de depuração para Unix que podem monitorar o que outro processo está fazendo.
Precisei registrar scp
as transferências uma vez e usei a terceira abordagem. Eu escrevi um script Perl que lançou o programa scp original emtraço. Strace geraria os nomes dos arquivos que estão sendo abertos e fechados pelo processo scp. O script Perl analisou a saída do strace e descobriu quais arquivos estavam sendo transferidos.
Responder4
Acredito que as soluções que sugerem criar um wrapper em torno do scp
binário no servidor não funcionarão com scp
clientes recentes.
Since OpenSSH 8.8 (8.7 in Red Hat/Fedora builds), scp has use the SFTP protocol for transfers by default.
Para esses clientes mais novos, esse mecanismo de encapsulamento scp
no servidor só funcionará se o cliente estiver invocando scp
com o -O
sinalizador (para impor o protocolo antigo).
Para tais necessidades, talvez usar rsync
em vez de scp
possa ajudar? rsync
parece ter a capacidade de registrar acessos a arquivos: na rsyncd.conf
página de manual:
log format
This parameter allows you to specify the format used for logging file transfers when transfer logging is enabled.
[..]
%f the filename (long form on sender; no trailing lq/rq)