¡Te damos la bienvenida al nuevo sysarmy --help! Para recuperar tu usuario pedí un password reset.

Como loguear comandos en historial por variable de bash

La situacion es la siguiente:

Tengo muchos servidores Linux Centos 6/7 y en cada uno de ellos hay uno o dos usuarios noroot y root (root siempre). Muchos clientes SSH se conectan a dichos servidores, y sería ideal mantener un log de qué cliente e IP ejecuta qué comandos.

Es inviable añadir usuarios a cada uno de estos sistemas pues son muchos, y cuando tenga clientes SSH nuevos no voy a estar añadiendo el nuevo usuario a cada uno de los servidores. Al fin y al cabo, los comandos acaban siendo realizados por root.


¿Cómo pretendo hacerlo entonces?

Dado que sí puedo hacer ligeras modificaciones en los servidores y en los clientes, puedo hacer que el cliente envíe por SSH una variable con nombre e IP publica y/o privada, que en el lado servidor se añadiria como info extra al HISTFILE de bash. Eso me funciona.

Idealmente ejecutaria history y el usuario/IP saldría al lado del timestamp, pero lo que estoy intentando de momento es que el historial de cada sesion bash se escriba en dos HISTFILES: uno .bash_history, y otro $VAR.history

De esa forma el uso de history no se veria afectado (los comandos serían navegables mediante [ArrowUp]) y tambien podría ver qué ha hecho tal usuario mirando en $VAR.history.


El problema principal que tengo es cómo escribir hacer que se me grabe el historial al final del mismo en dos ficheros, pero si a alguien se le ocurre otra forma para atajar este problema es totalmente bienvenido.

Saludos ! ^__ ^

Comentarios

  • editado October 2020

    @pq0 algo que puede servirte:

    1) Agregando lo siguiente en /etc/bashrc

    whoami="$(whoami)@$(echo $SSH_CONNECTION | awk '{print $1}')"                                                                                                  
    export PROMPT_COMMAND='RETRN_VAL=$?;logger -p local3.debug "$whoami [$$]: $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" ) [$RETRN_VAL]"'
    

    2) Para que esto funcione adicionalmente deberás agregar el facility local3 (u otro en caso que lo tengas ya ocupado) en /etc/rsyslog.conf  y el path/name del log que quieras (ej):

    local3.*        /var/log/ssh-audit.log
    

    3) Crear el log y reiniciar rsyslog

    touch /var/log/ssh-audit.log && chmod 640 /var/log/ssh-audit.log
    systemctl restart rsyslog
    

    Probando esta solución, en el log resulta esto:

    Oct  9 14:46:07 centos7 pabl0n: [email protected] [1474]:  [0]    <--- (este es el login via SSH)
    Oct  9 14:46:12 centos7 pabl0n: [email protected] [1474]: 2020-10-09 14:46:12 uptime [0]
    Oct  9 14:46:15 centos7 pabl0n: [email protected] [1474]: 2020-10-09 14:46:15 sestatus  [0]
    # -- ahi vino el 'sudo su -' --
    Oct  9 14:46:19 centos7 pabl0n: root@ [1573]: 2020-10-09 14:46:00 uptime [0]
    


    Ref: encontrado en este post.

  • Dame tu telefono te voy a invitar a un cafe o algo...

    No conocía rsyslog.

    Me ha funcionado a la perfección.

    Era la solución que buscaba.


    Mil gracias

  • Jajaja excelente.

    De todos modos lo recomendable es:

    1. Que exista 1 unix user por cada usuario externo (nada se comparte)
    2. Que controles quien ingresa via SSH (AllowUsers en /etc/ssh/sshd_config)
    3. Que root nunca (nunca) pueda ingresar via SSH (PermitRootLogin no en /etc/ssh/sshd_config)
    4. Que sólo puedan hacerse root con sudo (y replicas el /etc/sudoers, ver ansible debajo)

    Lo de crear/gestionar usuarios (y configs) en todos los servers se puede con ansible, pegale una mirada.

    Si querés 1 nivel más: que todos los servers logueen el facility local3.* en un servidor de rsyslog remoto (otro linux) para no dejar logs en cada nodo y te queda todo en 1 lugar centralizado (donde otros no acceden) para guardar logs/correr auditorías.

    Ref:

    1. How to Setup Central Logging Server with Rsyslog in Linux
    2. Registros centralizados en Linux con Rsyslog

    Saludos.

  • Excelente.

    Entiendo el punto de que esta monitorización no vale de mucho si cualquiera puede cambiar cualquier cosa con root, pero solo lo quiero para una monitorizacion basica, como con el history de bash. De todas formas lo del ansible es algo que tambien buscaba y tampoco conocía, y que me vendra muy bien.

    Cielos, ¿que habré estado haciendo todos estos años que me acabo de meter en sysarmy?

Accede o Regístrate para comentar.