¿Cómo puedo mantener un registro local con marca de tiempo de todos los comandos remotos que uso en ssh
(se inició el cliente openssh de línea de comandos bash
)?
Requisitos:
Esencial:
- 100% del lado del cliente sin depender del registro del servidor
- Configurado o instalado por usuario con registros almacenados en el directorio de inicio del usuario.
- Soporte para distinguir entre múltiples sesiones simultáneas con varios usuarios y hosts.
- No intrusivo (no es necesario activarlo cada vez y no interfiere significativamente con el uso de ssh)
Alta prioridad:
- Cualquiera de las salidas no se registra o filtra tanto como sea posible
- Las entradas de contraseña no están registradas o el archivo está encriptado
- Indica los comandos reales utilizados (después de que se haya completado la tabulación / historial, retrocesos, CTRL+ C, etc.)
Agradable tener:
- También registra comandos en sesiones encadenadas (comandos ingresados durante sesiones remotas
ssh
osu <user>
) - El inicio y el final de la sesión deben registrarse
- Un simple
bash
-Basado, solución que no sea root sería mejor (tal vez unaalias
obash
guión envoltorio para elssh
comando?)
- También registra comandos en sesiones encadenadas (comandos ingresados durante sesiones remotas
Mi nivel de habilidad:
- No soy nuevo en programación, pero todavía estoy aprendiendo
bash
y en la "forma de Linux", por lo que agradecería mucho las muestras de código con explicaciones breves.
Posibles estrategias
- keylogger - Problema: registra las contraseñas, no registra la finalización de la pestaña / historial (consulte la respuesta de Glenn )
screen
con volcado de desplazamiento una vez por segundo ydiff
entre ellos para encontrar nuevas líneas de desplazamiento - Problema: ¿cómo se puede implementar de una manera automatizada útil?ssh "$@" | tee >(some_cleaner_function >> $logfile)
- Problema: no puede manejar comandos multilínea o historial en sesiones encadenadas, se necesita una limpieza cuidadosa (vea mi respuesta)- Una combinación de algunos de los anteriores.
Un ejemplo
La siguiente sesión 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
Podría resultar en un registro en ~/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]
O quizás se creará un registro separado para cada sesión con la línea de comando utilizada para iniciar la sesión en la parte superior del archivo.
bash
shell
command-line
openssh
Oleg
fuente
fuente
Respuestas:
Su pregunta me intrigó. Originalmente no iba a dar una respuesta, pero me enganché.
Esto usa
expect
y es realmente un key logger.Notas:
uptime
comando), obtendrá "upt \ t" en el archivo de registro, no "tiempo de actividad"^?
(caracteres de retroceso) en el archivo de registro.fuente
Actualmente estoy usando el script bash a continuación. Tiene muchos problemas, pero es la única solución que he encontrado que aborda todos los requisitos, prioridades y "agradables" (al menos la mayor parte del tiempo).
Esta respuesta discute por qué registrar sesiones ssh localmente es tan difícil.
Problemas con el script que encontré hasta ahora:
Los comandos multilínea causan problemas:
Las sesiones encadenadas (usando
ssh
osu
comandos en el extremo remoto) hacen que el desplazamiento del historial registre los comandos pasados desplazados en lugar de los comandos reales utilizadosLas expresiones regulares se pueden mejorar y es posible que deban modificarse para ciertos entornos:
cat -v
antes de limpiar. Como resultado, el contenido válido puede eliminarse si alguna vez usa cadenas como^[[
en sus comandos.No se completa el comando ssh bash, como por ejemplo para el nombre de host.Puede obtener la finalización de bash si alias este scriptssh
conalias ssh="sshlog"
Fuente de script e instalación:
Para instalar, pegue lo siguiente en ~ / bin / sshlog y haga ejecutable. Llamada con
sshlog <ssh command options>
. Opcionalmente alias a 'ssh' en el archivo .bashrc del usuario.Ejemplo de contenido de registro:
fuente
Tengo una respuesta menos complicada, y seguramente no soy un keylogger. No entiendo su punto de ser independiente del registro del servidor (esto significa que todas las acciones deben tomarse en el servidor y todos los registros son registros del lado del servidor), por lo que pensé que una buena idea es pasar a todo el sistema bashrc un comando rápido como:
En debian debe editar el archivo: /etc/bash.bashrc y en centos el archivo: / etc / bashrc
Si desea iniciar el registro de la sesión en la que se encuentra, debe obtener el archivo que ha editado, por ejemplo, ejecutar:
en un sistema debian o
en un sistema de centos.De ahora en adelante, cada comando de cada sesión ssh se registrará en / var / log / syslog en un sistema debian y en / var / log / messages en un sistema centos.
En caso de que desee registrarlos en un archivo separado y no desordenar con otros archivos de registro, puede usar:
en lugar del ejemplo PROMPT_COMMAND anterior y luego configure el rsyslogd según sea necesario.Por ejemplo, en un sistema Debian edite el archivo /etc/rsyslog.conf : cambie la línea:
a y agregue la siguiente línea al final del archivo:luego ejecuta:
fuente
¿Qué tal
strace -o /tmp/ssh_log -ff -s8192 -T -ttt -fp $(pidof sshd)
? Esto registra todas las sesiones ssh. Es posible que necesite una herramienta para analizar el registro posteriormente, o simplemente usargrep
,awk
etc.-f
: rastrear niños bifurcados-ff
: registrar cada niño por separado enssh_log.PID
-s8192
: aumenta el límite de registro de cadenas (si es necesario)-T -ttt
: sellado en microsegundos en segundos desde la época-p N
: adjuntar a pidN
fuente