3. Especificaci´ on y Dise˜ no
4.5. Seguridad
4.5.2. Auditor´ıa de usuarios
Otro de los aspectos que es muy importante de cara a la seguridad general del sistema es la implantanci´on de alg´un tipo de sistema de auditor´ıa, tanto de los usuarios que se encuentran en un momento dado en el sistema como de los comandos que ejecutan en cualquiera de las estaciones. En este sentido, no hemos encontrado ninguna aplicaci´on en sistemas operativos Linux que realize esta tarea de forma autom´atica. En concreto, para la auditor´ıa de comandos realizados por los usuarios, existe un parche para el kernel de Linux llamado process accounting a trav´es del cual, el kernel del sistema operativo vuelca en un fichero (situado en el directorio /proc) que puede ser leido en principio por aplicaciones que obtienen en un formato legible por humanos la informaci´on concerniente a los diversos comandos que los usuarios ejecutan en el sistema.
No obstante, esta informaci´on es demasiado verbosa, ya que a˜nade una entrada por cada proceso que el usuario ejecuta en un momento dado. Cuando realizamos algunas pruebas de este sistema de auditor´ıa nos encontramos con que en un s´olo d´ıa podemos obtener miles y miles de l´ıneas de informaci´on (debido al elevado n´umero de estaciones y de usuarios) con el consecuente problema de almacenamiento que ello supon´ıa (adem´as del indexado posterior en un momento determinado).
Sin embargo, la auditor´ıa de los usuarios conectados en el sistema en un momento dado no resulta ni tan verbosa ni tan costosa en t´erminos de almacenamiento. Es por ello que nos planteamos la creaci´on de un sistema que registre en cualquier momento los usuarios que se encuentran logueados en el sistema, en cualquier m´aquina del laboratorio.
Como ya hemos comentado anteriormente, no encontramos ninguna aplicaci´on que nos resolviera esta funcionalidad de forma satisfactoria, por lo que optamos por programar nuestro propio sistema de auditor´ıa a medida. El sistema no debe tener grandes pretensiones: simplemente debe almacenar en un sistema de almacenamiento (por ejemplo, una base de datos) las entradas de los usuarios que en ese momento se encuentran en el sistema. Para ello, podemos apoyarnos en scripts b´asicos de shell que recojan la salida de comandos est´andar de Unix que devuelven la informaci´on relativa a los usuarios conectados en el sistema en un momento dado (como por ejemplo los comandos w o who).
En principio, la informaci´on que nos gustar´ıa almacenar de cada usuario ser´ıa la siguiente: Host o estaci´on en la que el usuario se encuentra conectado o logueado.
4.5. SEGURIDAD
Consola en la que ha iniciado sesi´on (una consola virtual, de texto o la consola gr´afica). Fecha y hora en la que ha iniciado sesi´on
Fecha y hora actual
Host remoto desde el que ha iniciado la sesi´on.
El almacenamiento de esta informaci´on en una base de datos MySQL supondr´a la creaci´on de una base de datos y una tabla a tal efecto. Para la informaci´on que necesitamos almacenar, podemos usar las siguientes sentencias de SQL mostradas en el el listado 4.65.
Listado 4.65: Creaci´on de una tabla en MySQL para almacenar la informaci´on relativa a auditor´ıa de usuarios
CREATE TABLE ‘ who ‘ (
2 ‘id ‘ int (20) NOT NULL auto_increment ,
‘ hostname ‘ varchar (255) NOT NULL default ’’,
4 ‘ logname ‘ varchar (12) NOT NULL default ’’,
‘ pts ‘ varchar (255) NOT NULL default ’’,
6 ‘ login ‘ d a t e t i m e NOT NULL default ’0000 -00 -00 00:00:00 ’ ,
‘ now ‘ d a t e t i m e NOT NULL default ’0000 -00 -00 00:00:00 ’ ,
8 ‘ from ‘ varchar (255) NOT NULL default ’’,
PRIMARY KEY ( ‘ id ‘) ,
10 KEY ‘ hostname ‘ ( ‘ hostname ‘ , ‘ logname ‘)
) ENGINE = MyISAM ;
Por supuesto asumimos que en cualquier host disponemos de un sistema gestor MySQL con los permisos suficientes para realizar las anteriores tareas. Una vez que la base de datos ha sido creada, podemos usar el script mostrado en el listado 4.66 para poder registrar la informaci´on relativa a la auditor´ıa de usuarios:
Listado 4.66: Script b´asico para registrar informaci´on de auditor´ıa de usuarios
#!/ bin / bash
2
T M P _ F I L E 1 = ‘ mktemp -p $HOME / bin / ‘
4 T M P _ F I L E 2 = ‘ mktemp -p $HOME / bin / ‘
6 / usr / bin / who | sed s / ’ ’/ ’_ ’/ g > $ T M P _ F I L E 1 8 for linea in ‘ cat $TMP_FILE1 ‘; do
i = ‘ echo $linea | sed s / ’_ ’/ ’ ’/g ‘
10 H O S T N A M E = ‘ hostname ‘
LOGNAME = ‘ echo $i | awk ’{ print $1 } ’ ‘
12 PTS = ‘ echo $i | awk ’{ print $2 } ’ ‘
DATE = ‘ echo $i | awk ’{ print $3 } ’ ‘" " ‘ echo $i | awk ’{ print $4 } ’ ‘
14 FROM = ‘ echo $i | awk ’{ print $5 } ’ | sed s / ’) ’/ ’ ’/ g | sed s / ’( ’/ ’ ’/ g ‘
NOW = ‘ date + %F " " %T ‘
16 echo " INSERT INTO who VALUES ( ’ ’ , ’" $ H O S T N A M E " ’ , ’" $ L O G N A M E " ’ , ’" $PTS " ’ , ’" $DATE " ’ , ’" $NOW
" ’ , ’" $FROM " ’) "
echo " INSERT INTO who VALUES ( ’ ’ , ’" $ H O S T N A M E " ’ , ’" $ L O G N A M E " ’ , ’" $PTS " ’ , ’" $DATE " ’ , ’" $NOW " ’ , ’" $FROM " ’) " > $ T M P _ F I L E 2
18 done
20 cat $ T M P _ F I L E 2 | / usr / bin / mysql -u who -h $ M Y S Q L _ H O S T -- p a s s w o r d = $ M Y S Q L _ P A S S W O R D
$ M Y S Q L _ D A T A B A S E 1 > / dev / null 2 > / dev / null
22 rm $ T M P _ F I L E 1
rm $ T M P _ F I L E 2
A trav´es del script anterior, se registrar´an los usuarios que est´an conectados en una m´aquina en un momento dado. Combinando el script anterior con una sentencia de cron, podemos registrar
CAP´ITULO 4. IMPLANTACI ´ON
autom´aticamente todos los usuarios que est´en conectados en una estaci´on, con una frecuencia muy baja (cada minuto). La siguiente l´ınea de cron puede ser suficiente para dejar definida la tarea:
Listado 4.67: L´ınea de cron para la automatizaci´on de la auditor´ıa de usuarios en el sistema
*/1 * * * * sh / root / who - m o s t o l e s . sh
La posterior consulta de datos en un momento determinado, dado que ´estos son almacenados en una base de datos MySQL, se puede realizar a trav´es de sentencias b´asicas de SQL. Incluso, se puede realizar a trav´es de un portal PhpMyAdmin35
, para minimizar la dificultad en la consulta de estos datos.