¿Cómo puedo rastrear los ejecutables creados por mi usuario en Linux?


11

Usando Linux, me gustaría rastrear los ejecutables que se ejecutan en mi nombre, incluida la línea de comando completa (en la práctica, cada exec * () hecho como mi propio usuario). Se supone que un programa que no controlo, para manejar una tarea, ejecuta el programa que paso, pero quiero asegurarme de que lo haga, y qué opciones usa. El programa que no controlo es astuto y parece cambiar el comportamiento dependiendo del nombre del programa que se supone que debe ejecutar para la tarea, por lo que no puedo pasar un script de shell que registre la información e invoque lo real programa.

¿Es posible que me informen de todos los exec * () s realizados como mi usuario en el sistema en Linux, incluida la línea de comandos completa? A falta de correr psen un bucle, eso es. Prefiero hacerlo directamente en el sistema en el que trabajo y no requerir acceso de root, pero si es necesario, puedo generar un sistema en el que tengo acceso de root, instalar los programas e investigar allí.

Usando Ubuntu 12.4 LTS.


Estoy preguntando aquí en lugar de Preguntar Ubuntu, ya que es más una pregunta de Unix / Linux que una pregunta real de Ubuntu.
Pierre Lebeaupin

1
¿Qué tan astuto es el programa? ¿Intenta detectar u omitir depuradores? ¿Está vinculado dinámicamente? Si es demasiado astuto, es posible que deba usar una máquina virtual donde sea root. (Esta puede ser la estrategia más simple incluso para un programa que no es particularmente astuto.)
Gilles parada SO ser maligno '

@Gilles Esa es una posibilidad, voy a probar una máquina virtual, luego actualizaré la pregunta si resulta viable.
Pierre Lebeaupin

Nota: parece que realmente quiere el nombre del programa y los argumentos, que la respuesta auditda, pero una 'línea de comando completa' en el shell también podría afectar el proceso secundario al usar la configuración de redirección / canalización y envvar, así como contener sustituciones / expansiones, citas no significativas y espaciado, y estructuras de control como doa && dob, y no las obtendrás.
dave_thompson_085

Respuestas:


10

Necesita configurar auditdpara grabar execveeventos. Ejemplo en RHEL5:

[root@ditirlns01 ~]# auditctl -a always,entry -S execve
WARNING - 32/64 bit syscall mismatch, you should specify an arch
[root@ditirlns01 ~]#

Ignoro la advertencia de arco y no parece importar, pero puede usarla -F arch=b64o -F arch=b32configurarla si lo desea.

El resultado de lo anterior es:

[root@ditirlns01 ~]# ls /tmp/whatever
ls: /tmp/whatever: No such file or directory
[root@ditirlns01 ~]# grep whatever /var/log/audit/audit.log
type=EXECVE msg=audit(1386797915.232:5527206): argc=3 a0="ls" a1="--color=tty" a2="/tmp/whatever"
type=EXECVE msg=audit(1386797927.133:5527241): argc=3 a0="grep" a1="whatever" a2="/var/log/audit/audit.log"
[root@ditirlns01 ~]#

Eso es obviamente rápido y sucio, pero eso es lo básico de cómo lo haces. Lo que necesita hacer exactamente probablemente depende en gran medida de lo que está tratando de hacer exactamente. Puede reducir el flujo de auditoría utilizando varios filtros en el auditctlcomando, pero no conozco esa información, así que no sé qué incluir. Si necesita algo más específico, le sugiero que consulte la página de manual o publique un comentario a esta respuesta y la actualizaré un poco más.

Espero que eso te empuje en la dirección correcta.

EDITAR:

Como su pregunta implica mirar a un usuario en particular, puedo mostrarle que:

[root@ditirlns01 ~]# auditctl -a always,entry -S execve -F euid=16777216
WARNING - 32/64 bit syscall mismatch, you should specify an arch

Idéntico a lo anterior, pero solo será registrado execvepor alguien que se ejecute con la identificación de usuario efectiva 16777216. Si necesita especificar el loginuidvalor del usuario (con quién iniciaron sesión inicialmente en el sistema), entonces filtre por auid:

[root@ditirlns01 ~]# auditctl -a always,entry -S execve -F auid=16777216
WARNING - 32/64 bit syscall mismatch, you should specify an arch

Los filtros AUID / loginuid serían útiles, por ejemplo, si el usuario va a hacer un root suo un sudoroot. En esa situación, habrá muchas cosas ejecutándose como root, pero solo le preocupan las cosas que el usuario en cuestión inició. auditctltambién le permite apilar filtros para que pueda filtrar por ambos euidy auid:

[root@ditirlns01 ~]# auditctl -a always,entry -S execve -F auid=16777216 -F euid=0
WARNING - 32/64 bit syscall mismatch, you should specify an arch
[root@ditirlns01 ~]# ls /tmp/nashly -ltar
ls: /tmp/nashly: No such file or directory
[root@ditirlns01 ~]# grep nashly /var/log/audit/audit.log
type=EXECVE msg=audit(1386798635.199:5529285): argc=4 a0="ls" a1="--color=tty" a2="/tmp/nashly" a3="-ltar"
type=EXECVE msg=audit(1386798646.048:5529286): argc=3 a0="grep" a1="nashly" a2="/var/log/audit/audit.log"

1
"Tenga en cuenta que no tengo acceso de root". (De lo contrario esto sería una buena respuesta.)
Gilles parada SO ser maligno '

Maldición ... tan cerca ...
Bratchley

Gracias, eso funcionó. Debo agregar que tuve que instalar auditctl por apt-get, no estaba preinstalado en Ubuntu.
Pierre Lebeaupin

Gracias. Buenos ejemplos. Pero, ¿hay alguna forma de obtener el código de salida del registro de auditoría?
Kaos

0

Has preguntado algo simple. He hecho un ejemplo con, mplayerpero supongo que se puede adaptar a otras situaciones:

#! /bin/sh
# This executable must be used instead of /usr/bin/mplayer
# do not forget the chmod +x filename...
LOG=/tmp/mplayer.log
echo "$@" >> $LOG
if [ -n "$1" ] && [ -f "$1" ] ; then
        filename="$1"
        echo "$(date "+%F %T") $(basename "$filename")" \
        | tee -a "$(dirname "$filename")/mplayer.log"  >> $LOG
fi
/usr/bin/mplayer "$@"

Como puede ver, esto es muy simple: analiza el primer argumento, ya que es un archivo, se crea un registro en el archivo central $LOGy se concatena en un archivo (que siempre tienen el mismo nombre mplayer.logen el mismo directorio.

Por lo tanto, el usuario puede obtener la última película que ha leído en cada directorio.


La Q específicamente dijo que sustituir un script no funcionaría.
dave_thompson_085

Posible, pero esto se adapta mejor a mi situación: no tengo ningún problema de seguridad y puedo elegir el script que ejecuto. Por increíble que parezca, he pensado en esta solución más simple, tal vez alguien más esté interesado en no entrar en cosas solo para geek. ¡Admito que la solución anterior es más segura!
MUY Bélgica
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.