¿Cómo agrego datos de conexión de red o fuente de usuario a las entradas del historial?

8

Me gustaría modificar la configuración del historial de todos los usuarios en los sistemas que administro. Me gustaría que contenga la información del terminal de conexión como dewho

sysadmin:/ # who
sysadmin  pts/0        Mar 26 07:11 (sysadmin.doofus.local)

Actualmente modifico mi historial de las siguientes maneras. Sé que muchas de estas configuraciones se han cubierto aquí varias veces. Sin embargo, saqué este código de " Recetas de administración del sistema Linux por: Juliet Kemp " hace mucho tiempo.

shopt -s histappend
PROMPT_COMMAND='history -n;history -a'
HISTSIZE=100000
HISTFILESIZE=100000
HISTTIMEFORMAT="%m/%d/%y %T  "

shopt -s histappend soluciona el problema cuando tienes múltiples terminales, la información abierta puede perderse.

PROMPT_COMMAND='history -n;history -a' se extiende para proporcionar anexos en tiempo real al historial en múltiples terminales.

HISTSIZE=100000 HISTFILESIZE=100000 extiende la cantidad de historyretención

HISTTIMEFORMAT="%m/%d/%y %T "precede a cada línea del historial con una marca de tiempo

Lo que normalmente obtienes con history

835  ls
836  cd ..

Mis historyresultados actuales modificados

5853  03/26/12 07:16:49  ls
5854  03/26/12 07:16:50  ll

El regreso de historyme gustaría ver

5853  03/26/12 07:16:49  sysadmin.doofus.local    ls
5854  03/26/12 07:16:50  sysadmin.doofus.local    ll

001  03/26/12 05:11:29  demo_user.doofus.local    cd
002  03/26/12 05:11:30  demo_user.doofus.local    ll

No estoy "casado" para ver el DNSnombre. Solo lo querría allí si lo extrae de whou otra ubicación sin la necesidad de realizar una búsqueda o consulta de ningún tipo. Estaría contento con la dirección IP.

002  03/26/12 05:11:30  192.168.0.2    ll

¿Por qué? Administro varios sistemas donde un ID de usuario que comparten varios usuarios del mismo grupo para realizar sus tareas diarias. Esto me permitiría correlacionar su ubicación real y el usuario real dentro de la organización con lo que hicieron en la historia.

Soy consciente de que esto no es óptimo y me gustaría cambiarlo, pero cuando estás en un barco del tamaño de un crucero no intentas dar vueltas. (Nota: cuando lo haces, los pasajeros intentan arrojarte por la borda)

De todos modos, hasta que pueda migrarlos a una mejor solución, me gustaría tener esta capacidad de seguimiento.

Además, si tiene alguna recomendación sobre lo que estoy usando actualmente para mis historymodificaciones, me encantaría escucharla.

Gracias,

Editar: 1

No quiero ejecutar otros programas ni tener que configurar nada adicional "dentro de lo razonable".

Quiero agregar 0gastos generales, si tengo que agregarlo, debe ser pequeño.

Confío en mis usuarios. Solo me gustaría (en caso de que ocurriera algo) ver cuál de los 10 usuarios que iniciaron sesión en el sistema con el mismo usuario: contraseña. O bien, podría no haber sido un usuario, podría haber sido olvidado cronen un sistema que realiza una conexión como usuario para hacer algo. O una aplicación Ej: BMC Control-Mque se conecta sshy ejecuta tareas. No se trata tanto de encontrar "malos usuarios" como de poder rastrearlo con un mínimo de esfuerzo.

Edición 2:

Los sistemas ejecutan SLES y RHEL

2bc
fuente
1
Parece que la contabilidad de procesos puede ser útil. El historial de shell nunca se diseñó para iniciar sesión, y si desea utilizarlo, debe confiar en todos sus usuarios. Vea la pregunta relacionada sobre la actividad de monitoreo y una respuesta relacionada .
jw013
@ jw013 Gracias por el comentario. Sin embargo, eso tiene que ser configurado y administrado, además, dado la información que he leído, sería mejor excluir directorios como /proc /devy /homedirectorios de usuarios . Esto agrega gastos generales. Mientras historyque ya se está grabando y su información de conexión es conocida por el sistema que conecta la IP, etc. Esta información, si aún no está disponible "estáticamente", podría establecerse de esa manera o almacenarse en una variable o archivo e ingresarse a los historyregistros y al rendimiento. sería muy pequeño o 0.
2bc
Si esto está en Linux, considere usar auditd. No estoy seguro si sus registros le darán suficiente información. La dificultad de lo que quieres es precisamente por qué las cuentas compartidas son tan criticadas.
Gilles 'SO- deja de ser malvado'
Está en Linux, editaré mi pregunta para que quede claro. auditdes muy parecido a inotifyque tiene que decirle qué monitorear para detectar cambios. Archivos individuales, directorios, etc. No quiero ir a ese nivel de configuración. De hecho (lo hago) pero esencialmente no me importa tanto. Tengo puppetque manejar esas cosas. auditdviene con la carga adicional y el tiempo de configuración también. Si una cuenta está modificando algo, todavía me gustaría mirar hacia atrás en el historial y ver quién o qué está iniciando sesión e intentando.
2bc
2
hm, dado que PROMPT_COMMAND=solo ejecuta comandos normales antes del siguiente mensaje, ¿no podría escribir una función que llame a sed / awk que funcione en la última línea del archivo de historial para agregar la información? entonces llame a esa función PROMPT_COMMAND=para agregar los datos? sería hack pero debería hacer el trabajo.
llua

Respuestas:

1

Por sugerencia de llua, podemos trabajar un poco más con la historia. Agregue una línea al archivo BASH RC de todo el sistema, quizás /etc/bash.bashrc.

export PROMPT_COMMAND='RETRN_VAL=$?;logger -p local6.debug "$(whoami) [$$]: $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" ) [$RETRN_VAL]"'

Configure el registro para "local6" en el registrador del sistema. Tal vez algo como esto:

local6.*    /var/log/commands.log

Reinicie el registrador del sistema. Quizás configure la rotación del archivo de registro. Cerrar sesión; iniciar sesión; y, el historial ahora está escrito en /var/log/commands.log en un formato como este:

fecha hora hostname logger: username [audit_pid]: command [return_val]

Esto podría modificarse aún más al gusto.

Christopher
fuente
1

Los siguientes párrafos describen la idea en general y están desactualizados en algunos aspectos, pero puede usarlos y usar los últimos de esta página. Usemos un archivo grande ~ / .bash_history.archive (separado de HISTFILE = ~ / .bash_history). Y luego, al salir de cada sesión bash, agreguemos nuevas líneas de historial.

El primer problema con este enfoque fue: ¿cómo hacer que bash llame a este script en cada salida? Claro, si sale al escribir 'exit', entonces puede usar el alias de la función 'exit', pero utilizo el atajo Ctrl-D para eso y no pude encontrar una forma de reasignarlo a algo pero no a la función de salida incorporada.

Entonces el primer intento fue: prohibir Ctrl-D por

export IGNOREEOF=10

y defina la combinación doble Ctrl-X para llamar a la función de salida.

Pero el enfoque correcto es usar el vagabundo de salida de bash, que es una solución perfecta porque se llama independientemente de la forma en que salga de bash: Ctrl-D, salir, cerrar la ventana xterm.

trap 'archive_history' EXIT

El siguiente paso es definir una línea de inicio en nuestro bash_history para que podamos guardar solo nuevas líneas y asegurarnos de que agreguemos a un archivo de historial.

export CURBASHSTART=`grep -v "^[ \t]*$" $HISTFILE | wc -l | awk '{print $1}'` CURBASHDATE=`date`

shopt -s cmdhist histappend

Eso es todo lo que necesitamos al comienzo de bash: ahora sabemos desde qué línea de historial comienza el historial (nuevo) actual. Para guardar el historial, agregue la siguiente pieza a su ~ / .bashrc.

archive_history()
{
    HISTORYOLD=${HISTFILE}.archive
    CURTIME=`date`
    CURTTY=`tty`
    if  [ x$HISTDUMPPED = x ]; then
      echo "#-${HOSTNAME}-- ${CURBASHDATE} - ${CURTIME} ($CURTTY) ----" >>   $HISTORYOLD

      history $(($HISTCMD-${CURBASHSTART-0})) | sed -e 's/^[ ]*[0-9][0-9]* [ ]*//g'  >> $HISTORYOLD
      export HISTDUMPPED=1
    fi
}

exit ()
{
   archive_history
   builtin exit

}

El archivo ~ / .inputrc debe contener las siguientes líneas para redefinir el acceso directo de salida a Ctrl-x x. En un primer intento, puede sentir que es un atajo terrible, pero luego se acostumbra, créame.

$if Bash
# to exit through calling exit function which will archive the history
"\C-x\C-x": "exit\n"
# to dump history we have so far
"\C-x\C-w": "archive_history\n"

$endif

Además, si su sesión bash es una sesión de inicio de sesión y sale llamando al ' logout', entonces puede agregar la siguiente línea a su~/.bash_logout

archive_history

Después de realizar todas las acciones mencionadas, puede encontrar su ~/.bash_history.archivearchivo que contiene secciones como estas

#-belka-- Sun Oct 12 21:52:13 EDT 2003 - Sun Oct 12 21:53:25 EDT 2003 (/dev/pts/13) ----
exit
aptitude
exit
#-washoe-- Sun Oct 12 18:03:16 EDT 2003 - Sun Oct 12 23:06:48 EDT 2003 (/dev/pts/3) ----

exit
cd progr/letters/resume/
e resume.tex

que en general se puede leer como archivo de historial habitual si lo desea.

Rahul Patil
fuente