Accounting. Pablo Sanz Mercado. 1 Cuando en un equipo hay más de un usuario, y sobre todo cuando hay usuarios que no son administradores, es conveniente saber qué comandos se han ejecutado en el sistema para tener un poco de control sobre el mismo, saber si los usuarios utilizan comandos no permitidos o incluso están intentando acceder al sistema de forma no permitida compilando y/o utilizando cracks que permitan la escalada de privilegios en el sistema.La forma de controlar este tipo de a ctividades es mediante el accounting, llevado a cabo mediante acct, que lo podemos obtener de: http://ftp.gnu.org/gnu/acct/ Para poderlo instalar en nuestro sistema, nos bajamos de este URL la última versión disponible de acct y la descomprimimos en un directorio temporal. El archivo resultante lo desempaquetamos mediante tar, y accedemos al directorio creado. Ejecutamos entonces: ./configure --prefix=/usr/local/seguridad/accounting/ make make check make install siendo root. Esto nos generará una estructura de directorios y archivos a partir del directorio que hemos indicado al script configure. Además de esta estructura, crearemos varios directorios: mkdir /usr/local/seguridad/accounting/logs mkdir /var/account/ mkdir /usr/local/seguridad/accounting/scripts En el primero permanecerán los logs que se vayan generando dı́a a dı́a, en el segundo directorio será el sistema el que vaya guardando la información de accounting que se vaya generando en cada momento y finalmente, en el tercer directorio, guardaremos los scripts que vamos a utilizar para el formateo y tratamiento que hagamos de la información de accounting. Antes de poner todo en funcionamiento, también deberı́amos crear el grupo adm, pues es el que utiliza acct para generar los datos. Este grupo lo crearemos con el comando groupadd Para arrancar y parar el servicio de accounting, utilizaremos el script acct generado inicialmente por Ian Murdock (utilizaremos la versión modificada de Dirk Eddelbuettel) que es distribuido con estas herramientas. El script de arranque de acct es: 2 #! /bin/sh # # Start or stop process accounting # # Initial version written by Ian Murdock # <[email protected]> # This version written by Dirk Eddelbuettel <[email protected]> set -e directorio=/usr/local/seguridad/accounting/sbin/ compare_kernel_version_and_exit_if_needed() { # thanks to Joey Hess for this shell script snippet # -- easier than my previous perl code cmp_major=2 cmp_minor=2 # thanks for Ralf Hildebrandt # <[email protected]> # for a simpler uname -r solution which also works for # hppa #kernel_major=‘uname -a | cut -d’ ’ -f 3 | cut -d. -f 1‘ #kernel_minor=‘uname -a | cut -d’ ’ -f 3 | cut -d. -f 2‘ kernel_major=‘uname -r | cut -d. -f 1‘ kernel_minor=‘uname -r | cut -d. -f 2‘ if [ $kernel_major -gt $cmp_major ] then valid=true elif [ $kernel_major -eq $cmp_major ] && [ $kernel_minor -ge $cmp_minor ] then valid=true else valid=false fi if [ "$valid" = "false" ]; then echo "Skipping process accounting: Package requires kernel 2.2.*." exit 0 fi } 3 test -x $directorio/accton || exit 0 # If you want to keep acct installed, but not started # automatically, set this variable to 0. Because # /etc/cron.daily/acct calls this file daily, it is # not sufficient to stop acct once after booting if # your machine remains up. START_ACCT=1 if [ $START_ACCT -eq 1 ] then compare_kernel_version_and_exit_if_needed fi case "$1" in start) # We start acct only if the switch variable tells us to if [ $START_ACCT -eq 1 ] then # Have to turn this on to be able to test the return code set +e echo -n "Starting process accounting: " mv /var/account/pacct /var/account/pacct‘date +%d-%m-%Y-%s‘ touch /var/account/pacct chown root:adm /var/account/pacct chmod 640 /var/account/pacct $directorio/accton /var/account/pacct 2>/dev/null rv=$? if [ $rv -eq 0 ] then echo "done." elif [ $rv -eq 38 ] then echo "failed" echo "Process accounting not available on this system." elif [ $rv -eq 16 ] then echo "failed" echo "Process accounting already running on this system." 4 else logger -f /var/log/daemon.log \ "Unexpected error code $rv received in /etc/init.d/acct" fi set -e fi ;; stop) echo -n "Stopping process accounting: " # Have to turn this on to be able to test the return code set +e $directorio/accton 2>/dev/null if [ $? -eq 0 ] then echo "done." else echo "failed." echo "Process accounting not available on this system." fi set -e ;; restart|force-reload) echo -n "Restaring process accounting: " # Have to turn this on to be able to test the return code set +e $directorio/accton 2>/dev/null if [ $? -eq 0 ] then echo "done." else echo "failed." echo "Process accounting not available on this system." fi set -e # We start acct only if the switch variable tells us to if [ $START_ACCT -eq 1 ] then # Have to turn this on to be able to test the return code set +e echo -n "Starting process accounting: " $directorio/accton /var/account/pacct 2>/dev/null 5 rv=$? if [ $rv -eq 0 ] then echo "done." elif [ $rv -eq 38 ] then echo "failed" echo "Process accounting not available on this system." elif [ $rv -eq 16 ] then echo " failed" echo "Process accounting already running on this system." else logger -f /var/log/daemon.log \ "Unexpected error code $rv received in /etc/init.d/acct" fi set -e fi ;; *) echo "Usage: /etc/init.d/acct {start|stop|restart |force-reload}" exit 1 esac exit 0 Este script lo copiaremos en /etc/init.d y lo llamaremos acct, dándole por supuesto permisos de ejecución. Requiere atención la variable directorio, que deberá ser cargada con el valor correspondiente a lo que hemos indicado en –prefix a la hora de ejecutar el script configure en la instalación de acct. Este script lo que hará es empezar a guardar en /var/account los datos relativos al accounting, datos que podremos luego procesar para estar informados de los comandos que han utilizado los usuarios del sistema. Para obtener un listado con los comandos ejecutados por los usuarios, programaremos en el cron la siguiente tarea: 0 0 * * * /usr/local/seguridad/accounting/scripts/control > /dev/null 2>&1 siendo el script control al que hace referencia: 6 #!/bin/bash directorio=/usr/local/seguridad/accounting/logs/ log=‘date +%d-%m-%Y-%s‘ maquina=‘hostname‘ direccion=root filtrado="" /etc/init.d/acct stop /etc/init.d/acct start ultimo=‘ls -ltrsia /var/account/pacct-* |awk ’{print $11}’ |tail -1‘ echo > ${directorio}/${log} echo "Control de procesos ejecutados en $maquina." >> ${directorio}/${log} echo >> ${directorio}/${log} echo "El fichero de accounting utilizado es:" >> ${directorio}/${log} echo $ultimo >> ${directorio}/${log} echo >> ${directorio}/${log} echo >> ${directorio}/${log} /usr/local/seguridad/accounting/sbin/sa -a -u -f $ultimo > ${directorio}/${log}.sa 2>&1 cp -f ${directorio}/${log}.sa ${directorio}/tempoa for comando in $filtrado do grep -v " $comando " ${directorio}/tempoa > ${directorio}/ tempob cp -f ${directorio}/tempob ${directorio}/tempoa done cp -f ${directorio}/tempoa ${directorio}/${log}.sa-limpio echo "La salida filtrada es:" >> ${directorio}/${log} echo >> ${directorio}/${log} cat ${directorio}/${log}.sa-limpio |awk ’{print $1,$7,$8}’ |sort -u >> ${directorio}/${log} echo >> ${directorio}/${log} 7 /bin/mail -s "Control de procesos de $maquina" $direccion < ${directorio}/${log} rm -f ${directorio}/tempob ${directorio}/tempoa /usr/bin/bzip2 ${directorio}/${log}* que lo que hará es, una vez al dı́a (según hayamos programado en el cron), enviarnos un mensaje de correo electrónico con la información de los procesos ejecutados por los distintos usuarios del sistema, convenientemente formateada e incluso filtrada ya que no mostrará aquellos comandos existentes en la variable filtrado. El filtrar comandos es debido a que muchas veces la lista de los comandos ejecutados en el sistema es tan grande que supera el tiempo que disponemos para leer el mensaje (acordémonos que este script se ejecutarı́a una vez al dı́a en cada una de las máquinas que administremos). Si localizamos los comandos fiables, es decir, carentes de peligro potencial, podemos incluirlos en esta variable y por lo tanto no ser procesados a la hora de enviarnos el mensaje de correo electrónico. Por supuesto el script aquı́ utilizado puede cambiarse con el fin de obtener un mejor resultado cara a la administración, si bien es un buen comienzo para tener el sistema de accounting funcionando desde el primer momento. Para que acct empiece a funcionar deberı́amos teclear: /etc/init.d/acct start o esperar a la ejecución del script control, que en su ejecución para y arranca este script. En nuestra mano queda además realizar un enlace simbólico para que arranque de forma conveniente al pasar al nivel de ejecución por defecto (o utilizar la herramienta chkconfig). 8