
Básicamente, quiero registrar todos y cada uno de los archivos que se envían o reciben a través de SCP en el servidor.
Digamos que un usuario realiza un SCP del Servidor-1 al Servidor-2. Descubrí la manera de obtener registros del lado de los remitentes,pero ¿cómo obtener lo que se ha transferido del lado del receptor?
Quiero que los registros del lado del receptor contengan los nombres de los archivos que se le transfieren a través de SCP.
Además, para obtener registros del lado de los remitentes, estoy usando mi script bash que primero guarda el nombre del archivo en un archivo de registro y luego usa SCP para transferirlo. ¿Existe algún enfoque mejor para hacerlo?
Gracias de antemano por cualquier sugerencia.
Respuesta1
Acabo de encontrar una solución interesante que podría interesar a otros:
Cuando se usa, scp
en realidad también llama al binario en el servidor con la -f
bandera. Esto significa que se puede escribir un contenedor simple para el lado del servidor scp
, como este:
Primero cambia scp
el nombre de tu original:
mv /usr/bin/scp /usr/bin/scp-org
Luego cree un script simple en su nombre:
sudo nano /usr/bin/scp
con el contenido:
#/bin/bash
scp-org $@ | tee >(grep -aEo "[CD][0-7]{4} [0-9]* .*$" --line-buffered >> /var/log/scp.log)
Por supuesto, esto podría perfeccionarse, pero funciona como ejemplo. Ahora puede usar tail -f /var/log/scp.log
y ver todos los archivos que se transfieren en tiempo real
Respuesta2
Puede intentar reemplazar el scp
comando en el servidor por una versión modificada que haga lo que necesita. scp
es un programa muy simple y agregarle código de registro no debería ser una tarea desalentadora.
Respuesta3
Probablemente esté utilizando el paquete de software OpenSSH. La scp
utilidad OpenSSH no registra nada. Admite resultados de depuración para la sesión SSH subyacente, pero no registrará las transferencias de archivos reales que se están llevando a cabo.
De manera similar, el servidor OpenSSH se puede configurar para registrar detalles sobre lo que está haciendo, y se puede configurar para registrar el hecho de que un usuario se conectó y ejecutó scp
, pero no registrará las transferencias de archivos reales que se están llevando a cabo.
Si no puede lograr que estos usuarios utilicen SFTP, existen tres métodos disponibles:
Investigue servidores SSH/SFTP/SCP alternativos (en otras palabras, comerciales). Por lo general, deberían admitir el registro de transferencias de archivos.
Reemplace la
scp
utilidad en el servidor con una que registre los datos que desea. OpenSSH es de código abierto. Alguien que sepa programar en C para Unix podríadescargar la fuentey modificarlo.Reemplace la
scp
utilidad con un "contenedor" que inicia el programa scp original y monitorea lo que hace. Existen herramientas de depuración para Unix que pueden monitorear lo que está haciendo otro proceso.
Necesitaba registrar scp
transferencias una vez y utilicé el tercer método. Escribí un script Perl que lanzó el programa scp original enrastro. Strace generaría los nombres de los archivos que el proceso scp abre y cierra. El script Perl analizó la salida de strace y descubrió qué archivos se estaban transfiriendo.
Respuesta4
Creo que las soluciones que sugieren crear un contenedor alrededor del scp
binario en el servidor no funcionarán con scp
clientes recientes.
Since OpenSSH 8.8 (8.7 in Red Hat/Fedora builds), scp has use the SFTP protocol for transfers by default.
Para clientes más nuevos, este mecanismo de empaquetar scp
en el servidor solo funcionará si el cliente invoca scp
con la -O
bandera (para hacer cumplir el protocolo anterior).
Para tales necesidades, ¿tal vez usar rsync
en lugar de scp
podría ayudar? rsync
parece tener la capacidad de registrar accesos a archivos: desde la 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)