Accounting.

Anuncio
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
Descargar