Registre todos los comandos ejecutados por administradores en servidores de producción

71

Es política de la compañía que los administradores inicien sesión en los servidores a través de un nombre de usuario personal y luego se ejecuten sudo -ipara convertirse en root. Al ejecutarse sudo -i, sudo creará una variable de entorno llamada SUDO_USER, que contiene el nombre de usuario del usuario original.

¿Hay alguna manera de registrar TODOS los comandos dentro de syslog con algo similar a la siguiente sintaxis:

${TIME/DATE STAMP}: [${REAL_USER}|${SUDO_USER}]: ${CMD}

Una entrada de ejemplo sería:

Sat Jan 19 22:28:46 CST 2013: [root|ksoviero]: yum install random-pkg

Obviamente, no tiene que ser exactamente la sintaxis anterior, solo tiene que incluir un mínimo del usuario real (por ejemplo, root), el usuario de sudo (por ejemplo, ksoviero) y el comando completo que se ejecutó (por ejemplo, yum instalar random-pkg).

Ya lo intenté snoopy, pero no incluyó la SUDO_USERvariable.

Soviero
fuente
13
Es necesario auditd.
Michael Hampton
1
Esta es una breve introducción para auditar
Deer Hunter
1
¿Podría alguien publicar esto como respuesta? Incluya cómo registraría estrictamente todos los comandos ejecutados por los usuarios. La "breve introducción a auditado" fue útil, pero no incluyó nada relacionado con el registro de comandos reales (por lo que pude ver de todos modos).
Soviero
1
Ok, comencé a jugar auditd, y aunque logré registrar todos los comandos que se ejecutan, no incluye la SUDO_USERvariable (o información equivalente), y no puedo encontrar una manera de incluirla. Cualquier ayuda sería muy apreciada!
Soviero
2
Y lo que la empresa hacer con este registro de todos los comandos introducidos por los administradores?
ewwhite

Respuestas:

83

Actualización : 2 cosas más que han aparecido en los comentarios y en las preguntas de seguimiento:

  • El uso de auditdesta manera aumentará drásticamente su volumen de registro, especialmente si el sistema se usa mucho a través de la línea de comandos. Ajuste su política de retención de registros.
  • AuditdLos registros en el host donde se crean son tan seguros como otros archivos en el mismo cuadro. Reenvíe sus registros a un servidor de recopilación de registros remoto como ELK o Graylog para preservar la integridad de sus registros. Además, agregando al punto anterior, permite eliminar de manera más agresiva los registros antiguos.

Como sugirió Michael Hampton, auditdes la herramienta correcta para el trabajo aquí.

Probé esto en una instalación de Ubuntu 12.10, por lo que su kilometraje puede variar en otros sistemas.

  • Instalar auditd:

    apt-get install auditd

  • Agregue estas 2 líneas a /etc/audit/audit.rules:

    -a salida, siempre -F arch = b64 -F euid = 0 -S execve
    -a salida, siempre -F arch = b32 -F euid = 0 -S execve

Estos rastrearán todos los comandos ejecutados por root ( euid=0). ¿Por qué dos reglas? La execvesyscall debe rastrearse en código de 32 y 64 bits.

  • Para deshacerse de los auid=4294967295mensajes en los registros, agréguelos audit=1al cmdline del núcleo (editando /etc/default/grub)

  • Coloca la línea

    session required pam_loginuid.so

en todos los archivos de configuración de PAM que son relevantes para login ( /etc/pam.d/{login,kdm,sshd}), pero no en los archivos que son relevantes para suo sudo. Esto permitirá auditdobtener el usuario que llama uidcorrectamente al llamar sudoo su.

  • Reinicie su sistema ahora.

  • Iniciemos sesión y ejecutemos algunos comandos:

    $ id -u
    1000
    $ sudo ls /
    bin boot data dev etc inicio initrd.img initrd.img.old lib lib32 lib64 perdido + encontrado medios mnt opt ​​proc root run sbin scratch selinux srv sys tmp usr var vmlinuz vmlinuz.old
    $ sudo su -
    # ls / etc
    [...]

Esto producirá algo como esto en /var/log/audit/auditd.log:

----
time->Mon Feb  4 09:57:06 2013
type=PATH msg=audit(1359968226.239:576): item=1 name=(null) inode=668682 dev=08:01 mode=0100755 ouid=0 ogid=0 rdev=00:00
type=PATH msg=audit(1359968226.239:576): item=0 name="/bin/ls" inode=2117 dev=08:01 mode=0100755 ouid=0 ogid=0 rdev=00:00
type=CWD msg=audit(1359968226.239:576):  cwd="/home/user"
type=EXECVE msg=audit(1359968226.239:576): argc=2 a0="ls" a1="/"
type=SYSCALL msg=audit(1359968226.239:576): arch=c000003e syscall=59 success=yes exit=0 a0=10cfc48 a1=10d07c8 a2=10d5750 a3=7fff2eb2d1f0 items=2 ppid=26569 pid=26570 auid=1000 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=1 comm="ls" exe="/bin/ls" key=(null)
----
time->Mon Feb  4 09:57:06 2013
type=PATH msg=audit(1359968226.231:575): item=1 name=(null) inode=668682 dev=08:01 mode=0100755 ouid=0 ogid=0 rdev=00:00
type=PATH msg=audit(1359968226.231:575): item=0 name="/usr/bin/sudo" inode=530900 dev=08:01 mode=0104755 ouid=0 ogid=0 rdev=00:00
type=CWD msg=audit(1359968226.231:575):  cwd="/home/user"
type=BPRM_FCAPS msg=audit(1359968226.231:575): fver=0 fp=0000000000000000 fi=0000000000000000 fe=0 old_pp=0000000000000000 old_pi=0000000000000000 old_pe=0000000000000000 new_pp=ffffffffffffffff new_pi=0000000000000000 new_pe=ffffffffffffffff
type=EXECVE msg=audit(1359968226.231:575): argc=3 a0="sudo" a1="ls" a2="/"
type=SYSCALL msg=audit(1359968226.231:575): arch=c000003e syscall=59 success=yes exit=0 a0=7fff327ecab0 a1=7fd330e1b958 a2=17cc8d0 a3=7fff327ec670 items=2 ppid=3933 pid=26569 auid=1000 uid=1000 gid=1000 euid=0 suid=0 fsuid=0 egid=1000 sgid=1000 fsgid=1000 tty=pts0 ses=1 comm="sudo" exe="/usr/bin/sudo" key=(null)
----
time->Mon Feb  4 09:57:09 2013
type=PATH msg=audit(1359968229.523:578): item=1 name=(null) inode=668682 dev=08:01 mode=0100755 ouid=0 ogid=0 rdev=00:00
type=PATH msg=audit(1359968229.523:578): item=0 name="/bin/su" inode=44 dev=08:01 mode=0104755 ouid=0 ogid=0 rdev=00:00
type=CWD msg=audit(1359968229.523:578):  cwd="/home/user"
type=EXECVE msg=audit(1359968229.523:578): argc=2 a0="su" a1="-"
type=SYSCALL msg=audit(1359968229.523:578): arch=c000003e syscall=59 success=yes exit=0 a0=1ceec48 a1=1cef7c8 a2=1cf4750 a3=7fff083bd920 items=2 ppid=26611 pid=26612 auid=1000 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=1 comm="su" exe="/bin/su" key=(null)
----
time->Mon Feb  4 09:57:09 2013
type=PATH msg=audit(1359968229.519:577): item=1 name=(null) inode=668682 dev=08:01 mode=0100755 ouid=0 ogid=0 rdev=00:00
type=PATH msg=audit(1359968229.519:577): item=0 name="/usr/bin/sudo" inode=530900 dev=08:01 mode=0104755 ouid=0 ogid=0 rdev=00:00
type=CWD msg=audit(1359968229.519:577):  cwd="/home/user"
type=BPRM_FCAPS msg=audit(1359968229.519:577): fver=0 fp=0000000000000000 fi=0000000000000000 fe=0 old_pp=0000000000000000 old_pi=0000000000000000 old_pe=0000000000000000 new_pp=ffffffffffffffff new_pi=0000000000000000 new_pe=ffffffffffffffff
type=EXECVE msg=audit(1359968229.519:577): argc=3 a0="sudo" a1="su" a2="-"
type=SYSCALL msg=audit(1359968229.519:577): arch=c000003e syscall=59 success=yes exit=0 a0=7fff327ecab0 a1=7fd330e1b958 a2=17cc8d0 a3=7fff327ec670 items=2 ppid=3933 pid=26611 auid=1000 uid=1000 gid=1000 euid=0 suid=0 fsuid=0 egid=1000 sgid=1000 fsgid=1000 tty=pts0 ses=1 comm="sudo" exe="/usr/bin/sudo" key=(null)
----
time->Mon Feb  4 09:57:09 2013
type=PATH msg=audit(1359968229.543:585): item=1 name=(null) inode=668682 dev=08:01 mode=0100755 ouid=0 ogid=0 rdev=00:00
type=PATH msg=audit(1359968229.543:585): item=0 name="/bin/bash" inode=6941 dev=08:01 mode=0100755 ouid=0 ogid=0 rdev=00:00
type=CWD msg=audit(1359968229.543:585):  cwd="/root"
type=EXECVE msg=audit(1359968229.543:585): argc=1 a0="-su"
type=SYSCALL msg=audit(1359968229.543:585): arch=c000003e syscall=59 success=yes exit=0 a0=13695a0 a1=7fffce08a3e0 a2=135a030 a3=7fffce08c200 items=2 ppid=26612 pid=26622 auid=1000 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=1 comm="bash" exe="/bin/bash" key=(null)
----
time->Mon Feb  4 09:57:11 2013
type=PATH msg=audit(1359968231.663:594): item=1 name=(null) inode=668682 dev=08:01 mode=0100755 ouid=0 ogid=0 rdev=00:00
type=PATH msg=audit(1359968231.663:594): item=0 name="/bin/ls" inode=2117 dev=08:01 mode=0100755 ouid=0 ogid=0 rdev=00:00
type=CWD msg=audit(1359968231.663:594):  cwd="/root"
type=EXECVE msg=audit(1359968231.663:594): argc=3 a0="ls" a1="--color=auto" a2="/etc"
type=SYSCALL msg=audit(1359968231.663:594): arch=c000003e syscall=59 success=yes exit=0 a0=7fff8c709950 a1=7f91a12149d8 a2=1194c50 a3=7fff8c709510 items=2 ppid=26622 pid=26661 auid=1000 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=1 comm="ls" exe="/bin/ls" key=(null)

La auidcolumna contiene el usuario llamante uid, que le permite filtrar los comandos ejecutados por este usuario con

 ausearch -ua 1000

Esto incluso enumerará los comandos que el usuario ejecutó como root.

Fuentes:

fuero
fuente
+50 Esta respuesta parece la más completa, aunque estoy un poco decepcionado de que haya resultado bastante complicado. Gracias por tu contribución.
base
Tenga en cuenta que estos cambios pueden aumentar considerablemente el volumen de registro en /var/log/audit/audit.log. Mi volumen de registro en este archivo se duplicó con creces después de agregar las dos líneas de ejecución a audit.rules
JDS
11

Recuerde que sudo en sí registra todos los comandos de sudo en el syslog, por lo que todos los usuarios deben ser educados para que no solo sudo obtenga un shell raíz sino que:

sudo command p1 p2 ... pn

El problema con este o cualquier otro enfoque que he pensado es que, como rootusuario, es bastante difícil evitar que un usuario evada cualquier tipo específico de registro. Por lo tanto, cualquier cosa que intente será <100%, siento decirlo.

Educación, documentación, aplicación y sobre todo confianza es lo que se necesita.

mdpc
fuente
3
Entiendo que nada será perfecto, pero nunca podremos lograr que todos trabajen como usted describe. Estamos hablando de administradores de sistemas;)
Soviero
3
No es cierto ... ¡al menos dos grandes empresas con las que he trabajado personalmente, que consisten en una gran cantidad de administradores de sistemas, tienen esta política en vigor! Nuevamente, con educación y cumplimiento funciona.
mdpc
2
mdpc es 100% correcto. Para esto es exactamente el comando sudo. Estoy en una tienda de diez administradores de sistemas con cientos de hosts, y usamos comandos sudo individuales para todo; hay una política específica que prohíbe convertirse en root a través de su -. Es la única forma razonable de garantizar que las operaciones administrativas se auditen adecuadamente.
Jeff Albert
44
-1 La educación nunca lo hará. Vivimos en un mundo subcontratado donde usted es solo uno de los muchos clientes de sus administradores de sistemas.
base
7

Una vez me enfrenté al mismo problema y tuve que encontrar una solución rápida y sucia: cada usuario de sudo tendrá su propio archivo de historial una vez que ejecute el comando sudo -i

En /root/.bashrcagregué la siguiente línea:

 export HISTFILE=/root/.bash_history-$SUDO_USER
 export HISTTIMEFORMAT="%F %T "

Por lo tanto, cada usuario que sudos a la raíz tendrá un archivo de historial .bash_history-username.

Otro método -

Agregue el siguiente código /root/.bashrcy agregará el nombre de usuario, sudo-user y el comando al archivo de registro, donde se establezca el nivel de notificación, muy probablemente / var / log / messages.

function log2syslog
{
   declare COMMAND
   COMMAND=$(fc -ln -0)
   logger -p local1.notice -t bash -i -- "${USER}:${SUDO_USER}:${COMMAND}"
}
trap log2syslog DEBUG

Crédito a - http://backdrift.org/logging-bash-history-to-syslog-using-traps

Daniel t.
fuente
Buen enfoque, aunque no exactamente lo que se pidió. Me gustaría ver una solución auditada o similar.
base el
ok, lo he actualizado para confiar en el método de trampa.
Daniel t.
3
Y para usuarios legítimos, esto funciona. Pero si esa cuenta se rompió, el cracker podría deshabilitar rápidamente el historial de bash ejecutando /bin/sh, unset HISTFILEo /bin/bash --norc.
Stefan Lasiewski 01 de
3

Varios establecimientos prohíben el uso de auditado porque consume muchos recursos y puede dar lugar a la posibilidad de ataques de denegación de servicio.

Una solución es configurar el último shell Korn (ksh-93, consulte http://kornshell.com/ para más detalles) para registrar todos los comandos ejecutados como root en un servidor remoto de syslog, y luego exigir por política que, excepto en casos de emergencia situaciones, los administradores del sistema inician sesión con cuentas personales y ejecutan el shell Korn mejorado a través de sudo. El examen de los registros puede detectar cuando un administrador lanza otro shell desde el shell aprobado para cubrir sus huellas, y la SA puede ser educada según sea necesario.

Mike McManus
fuente
3

Sudo tiene algo llamado sudoreplay cuando las sesiones habilitadas se registran y se pueden reproducir más tarde, funciona de manera similar al scriptcomando que crea un mecanografiado de sesión terminal que luego se puede reproducir con el scriptreplaycomando.

noche
fuente
2

No es que haya nada malo con ninguna de las otras respuestas hasta el momento, pero si decide que sudoel inicio de sesión sysloges satisfactorio, ¿puedo sugerir una arruga?

Eso evita el problema de "ahora que me he convertido en root, puedo eliminar cualquier rastro de mi malversación de los registros". Ahora puede ser root en el cuadro local, pero no puede recuperar ese paquete de registro desde la red y (presumiblemente) no tiene privilegios de root en el host de auditoría remota.

He estado haciendo esto con algunas de las redes que administro durante años, y tiene otras dos ventajas de señal:

En primer lugar, hay un lugar en la red para revisar todos los syslogs, lo que permite una correlación mucho más fácil de los incidentes, y también lo es una ventanilla única para investigaciones como "Cuando alguien junose quejaba de que el servidor NFS herano respondía, alguien más se quejaba de ¿Es lo mismo al mismo tiempo? Si es así, heraes probable que sea el problema, veamos qué ha registrado; si no, junola conexión de red es más sospechosa, veamos qué más junoha registrado en ese momento ".

En segundo lugar, la rotación de registros de syslog se vuelve más fácil: no guarda copias de registros en hosts locales durante más de unos pocos días, pero se asegura de que el servidor de auditoría tenga una gran cantidad de espacio en disco y mantenga todos los registros de syslog allí durante varios años. Además, si, por ejemplo, desea escribirlos en medios WORM para, por ejemplo, fines de auditoría forense, solo tiene que comprar una unidad WORM.

MadHatter
fuente
2

Desde la versión 2.0.0, snoopy puede registrar variables ambientales arbitrarias.

Sin embargo, una contribución reciente señaló que el propietario del registro de tty es una respuesta bastante efectiva y elegante a la pregunta "¿Quién ejecutó ese comando, como root?".

Divulgación: soy el mantenedor de Snoopy.

Bostjan Skufca
fuente
Proporcione instrucciones sobre cómo configurarlo de acuerdo con los requisitos de OP, en lugar de un simple enlace. Gracias.
Andrea Lazzarotto
1
-1. Esto es solo un complemento para snoopy. Seguiste la divulgación, pero aún no respondiste la pregunta en tu publicación; te acabas de vincular a tu proyecto.
Duncan X Simpson