Para y reiniciar tarea automática
Buenas, He realizado un pequeño script usando tcpdump; no hace más que analizar determinados parámetros de la red y los vuelca en el log de turno. Lo intersante es que se nombra según el día que es para después poder tenr los registros bien ordenaditos. Lanzar el script cuándo arranque la máquina no es problema: lo casco en /init/boot.local y a caminar. Ahora bien, lo que me interesa es que al finalizar el día el script se pare y justo después de comenzar el siguiente día, se lance otra vez de manera automática. Por el tema de los logs, claro. La solución que le he dado es esta: /etc/crontab SHELL=/bin/sh PATH=/usr/bin:/usr/sbin:/sbin:/bin:/usr/lib/news/bin MAILTO=root # # check scripts in cron.hourly, cron.daily, cron.weekly, and cron.monthly # -*/15 * * * * root test -x /usr/lib/cron/run-crons && /usr/lib/cron/run-crons >/dev/null 2>&1 # parar ejecució tcpdump_sniffer al final del día y reinicialo seguidamente 59 23 * * * * root killproc -TERM /usr/sbin/tcpdump 01 00 * * * * root /sbin/scripts/tcpdump_sniffer.sh [*] Lógicamente tcpdump_sniffer.sh es el script y /sbin/scripts/ su path de ubicación. ¿Qué os parece? ¿funcionará? ¿alguna manera más robusta o elegante de hacerlo? También había pensado en crear el servicio a partir de /init.d/skeleton, pero de esa manera no sé como se controlaría automáticamente a partir de un cronjob. -- ¡Share your knowledge! Linux user id 332494 # http://counter.li.org/ PGP id 0xC5ABA76A # http://pgp.mit.edu/
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 El 2005-08-20 a las 11:46 +0200, Aquiles escribió:
¿Qué os parece? ¿funcionará? ¿alguna manera más robusta o elegante de hacerlo?
También había pensado en crear el servicio a partir de /init.d/skeleton, pero de esa manera no sé como se controlaría automáticamente a partir de un cronjob.
La manera correcta y documentada de iniciar y parar servicios es precisamente esa (boot.local se ejecuta antes que cualquier otro servicio: la red no estará en marcha, por ejemplo). Si además quieres reiniciarla diariamente, pues puedes hacer esa parte desde el crontab ("rcmyscript restart" o "reload"). - -- Saludos Carlos Robinson -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.0 (GNU/Linux) Comment: Made with pgp4pine 1.76 iD8DBQFDB8+EtTMYHG2NR9URAg/WAKCAF6UjLNGMGE6UQBhDxwLvfuVVEQCcDVNl 6Ts0kpO02kL/Zy4TKy8TcLQ= =UI++ -----END PGP SIGNATURE-----
La manera correcta y documentada de iniciar y parar servicios es precisamente esa (boot.local se ejecuta antes que cualquier otro servicio: la red no estará en marcha, por ejemplo). Si además quieres reiniciarla diariamente, pues puedes hacer esa parte desde el crontab ("rcmyscript restart" o "reload").
Mmmmm... pues tengo 3 problemillas. Problemilla 1. No sé si vale la pena configurar el servicio a partir de /etc/init.d/skeleton; más que nada porqué el script en si es una mierdecilla tal que así: #!/bin/bash FECHA=$(date +%m-%d-%Y) LOG=/var/log/tcpdump/tcpdump$FECHA.log tcpdump -i eth0 -q >> $LOG & exit 0 Problemilla 2. Si inserto el código de arriba directamente en /etc/init.d/boot.local, efectivamente, se ejecuta al arrancar la máquina y al principio de todo. Pero demasiado al principio y todo... tcpdump me arroja un mensaje de error más que lógico: tcpdump bind: Network is down Lo que es más que lógico: el binario no tira porqué aún no existe ninguna eth0 a la que sniffar. He consultado en profunidad las man del comando así como las mail-lists del proyecto y no parece haber manera de eviat esto: si no hay dispositivos de red a los que sniffar, el binario no tira. Con lo cual el script debe lanzarse rollo runlevel 2 o +. Problemilla 3. En relación del problemilla 2, me armo de valor y hago lo siguiente: ln -s /sbin/scripts/tcpdump_sniffer.sh /etc/rc.d/rc3.d/ ln -s /sbin/scripts/tcpdump_sniffer.sh /etc/rc.d/rc5.d/ Lo que a prori tiene mucha lógica... pero nada de nada; el script tampoco es lanzado. No entiendo porqué. Vaya quebradero de tarro :'-( -- ¡Share your knowledge! Linux user id 332494 # http://counter.li.org/ PGP id 0xC5ABA76A # http://pgp.mit.edu/
2005/8/21, Aquiles:
Problemilla 2. Si inserto el código de arriba directamente en /etc/init.d/boot.local, efectivamente, se ejecuta al arrancar la máquina y al principio de todo. Pero demasiado al principio y todo... tcpdump me arroja un mensaje de error más que lógico:
tcpdump bind: Network is down
Aquiles, Echa un vistazo a este artículo de Novell para la creación de scripts de inicio, lo encuentro bastante completo y práctico, quizá te pueda servir: Creating Custom init Scripts http://www.novell.com/coolsolutions/feature/15380.html Si necesitas que esté iniciado algún servicio antes de la ejecutición de tu script, utiliza el parámetro "Required-Start". Saludos, -- Camaleón
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 El 2005-08-21 a las 12:25 +0200, Aquiles escribió:
La manera correcta y documentada de iniciar y parar servicios es precisamente esa (boot.local se ejecuta antes que cualquier otro servicio: la red no estará en marcha, por ejemplo). Si además quieres reiniciarla diariamente, pues puedes hacer esa parte desde el crontab ("rcmyscript restart" o "reload").
Mmmmm... pues tengo 3 problemillas.
Observa que arriba digo «documentada». No te has leído la documentación :-p
Problemilla 1. No sé si vale la pena configurar el servicio a partir de /etc/init.d/skeleton; más que nada porqué el script en si es una mierdecilla tal que así:
#!/bin/bash
FECHA=$(date +%m-%d-%Y) LOG=/var/log/tcpdump/tcpdump$FECHA.log
tcpdump -i eth0 -q >> $LOG &
exit 0
Si vale la pena porque te evitas el problema 2.
Problemilla 2. Si inserto el código de arriba directamente en /etc/init.d/boot.local, efectivamente, se ejecuta al arrancar la máquina y al principio de todo. Pero demasiado al principio y todo... tcpdump me arroja un mensaje de error más que lógico:
tcpdump bind: Network is down
Lo que es más que lógico: el binario no tira porqué aún no existe ninguna eth0 a la que sniffar. He consultado en profunidad las man del comando así como las mail-lists del proyecto y no parece haber manera de eviat esto: si no hay dispositivos de red a los que sniffar, el binario no tira.
La manera es ponerle en "required start" los servicios de red ($network).
Con lo cual el script debe lanzarse rollo runlevel 2 o +.
Problemilla 3. En relación del problemilla 2, me armo de valor y hago lo siguiente:
ln -s /sbin/scripts/tcpdump_sniffer.sh /etc/rc.d/rc3.d/ ln -s /sbin/scripts/tcpdump_sniffer.sh /etc/rc.d/rc5.d/
En SuSE ¡NUNCA HAGAS ESO! Usa "chkconfig servicio on". Insisto, léete la documentación. Empieza por "7.5.1. Añadir scripts init" del manual de administración.
Lo que a prori tiene mucha lógica... pero nada de nada; el script tampoco es lanzado. No entiendo porqué.
Yo si :-P - -- Saludos Carlos Robinson -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.0 (GNU/Linux) Comment: Made with pgp4pine 1.76 iD8DBQFDCGhCtTMYHG2NR9URAmFbAJ9WdCOIu7kBjUglVYfD2enDRQA6RgCgkg/e Xz/+8AFxJBSv3BcE4IPzDDU= =9WCV -----END PGP SIGNATURE-----
El Sábado, 20 de Agosto de 2005 11:46, Aquiles escribió:
-*/15 * * * * root test -x /usr/lib/cron/run-crons && /usr/lib/cron/run-crons >/dev/null 2>&1
# parar ejecució tcpdump_sniffer al final del día y reinicialo seguidamente
59 23 * * * * root killproc -TERM /usr/sbin/tcpdump 01 00 * * * * root /sbin/scripts/tcpdump_sniffer.sh
[*] Lógicamente tcpdump_sniffer.sh es el script y /sbin/scripts/ su path de ubicación.
¿Qué os parece? ¿funcionará? ¿alguna manera más robusta o elegante de hacerlo?
También había pensado en crear el servicio a partir de /init.d/skeleton, pero de esa manera no sé como se controlaría automáticamente a partir de un cronjob.
* /sbin/scritps/parar-tcpdump ------------------------------------------ #!/bin/bash kill `ps -aef | awk '/.\/tcpdump_sniffer$/ { print $2}'` -------------fin----------------------------- * el cron 01 00 * * * * /sbin/scripts/tcpdump_sniffer.sh 59 23 * * * * /sbin/scripts/parar-tcpdump * Para arrancarlo con la maquina mete el comando en /etc/init.d/postfix por ejemplo, añade al scrit un if ,bla, bla, que vea si esta ya en marcha por horario, acuerdate del script perl para levantar los tuneles ssh inversos. * PD. ¿Para que coño quieres ese script rulando todo el dia?, messages, who, w, lastlog, ntop, logsurfer, etc, etc, tcpdump es para hacer log puntuales y mejor presenciales, es decir se esta auditanto un problema detectado por otros medios.
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 El 2005-08-23 a las 16:56 +0200, jose maria escribió:
* Para arrancarlo con la maquina mete el comando en /etc/init.d/postfix por ejemplo, añade al scrit un if ,bla, bla, que vea si esta ya en marcha por horario, acuerdate del script perl para levantar los tuneles ssh inversos.
¡Ostrás! Y en cuanto a SuSE se le ocurra hacer una actualización del postfix, encima te peta tu script. No. Es mejor hacer las cosas bien, copiar el skeleton, modificarlo adecuadamente, y conectarlo, que son cinco minutos contados. - -- Saludos Carlos Robinson -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.0 (GNU/Linux) Comment: Made with pgp4pine 1.76 iD8DBQFDC3GgtTMYHG2NR9URAsdkAJ44orI/SQLfzB9azEJOQ4H62bXEqgCfSBQO kosAfIpmTXpLlHRcxXUoFE0= =kg+r -----END PGP SIGNATURE-----
El Martes, 23 de Agosto de 2005 20:57, Carlos E. R. escribió:
Y en cuanto a SuSE se le ocurra hacer una actualización del postfix, encima te peta tu script. No. Es mejor hacer las cosas bien, copiar el skeleton, modificarlo adecuadamente, y conectarlo, que son cinco minutos contados.
* Eso son milongas de SuSE, en el script de arranque simplemente va la llamada al script, asi que no peta nada, en el caso que nos ocupa no estamos hablando de un demonio, es un mero script recolector, un script de arranque es nada mas que eso, por tanto no tiene por que cambiar otra cosa es que parezca mas bonito, en caso de precisar cambios de un fichero modificado hara un .rpmnew con el nuevo esto es hacer las cosas bien y si no lo hace, cosa que no me ha ocurrido, apliquese el flag -i a los ficheros de arranque para que el tal yast no tome malas costumbres, de hecho tengo bastantes modificados para lanzar los servidores pasandole opciones en el arranque al binario sin wrappers y nunca ha cambiado ninguno, ssh, apache21, postgresql, etc....
Lo que busco realmente es un sencillo monitor de red que me cree un registro diario completo (aunque no hace falta web, pues lo controlo mediante squid/ SARG), lo volque en bbdd y pueda visualizarse cómodamente en formato logsurfer, swatch y tipo así.
* La auditoria de netfilter esta estandarizada a traves del target ULOG de iptables. * apt-get install ulogd ulogd-pgsql ulogd-mysql ulogd-pcap el demonio, el plugin para postgree, mysql y ficheros pcap elige el que quieras o todos. * arranca la base de datos mysql por ejemplo cambia el pasword de root viene en blanco mysqladmin -u root -p 'pasword_de_administracion' * Conecta con mysql y crea la base de datos y usuarios, mysql -u root -p (te pedira el password_de_administracion) * crea la base de datos mysql> create database ulog; Query OK, 1 row affected (0,00 sec) * inyecta el esquema de tablas mysql> use ulog; Database changed mysql> source /usr/share/doc/packages/ulogd/mysql.table Query OK, 0 rows affected (0,05 sec) * los privilegios de los usuarios escribir y leer mysql> GRANT select,insert ON ulog.* TO escribir@localhost IDENTIFIED BY 'pass_de_escribir'; Query OK, 0 rows affected (0,00 sec) mysql> GRANT select ON ulog.* TO leer@localhost IDENTIFIED BY 'pass_de_leer'; Query OK, 0 rows affected (0,00 sec) mysql> flush privileges; Query OK, 0 rows affected (0,00 sec) mysql> \q Bye * Edita /etc/ulogd.conf y comenta estas lineas para que no loguee a un fichero. # # ulogd_LOGEMU.so - simple syslog emulation target # # where to write to syslogfile /var/log/ulogd.syslogemu # do we want to fflush() the file after each write? syslogsync 1 # load the plugin plugin /usr/lib/ulogd/ulogd_LOGEMU.so * Modifica el siguiente bloque. # # ulogd_MYSQL.so: optional logging into a MySQL database # # database information mysqltable ulog mysqlpass pass_de_escribir mysqluser escribir mysqldb ulog mysqlhost localhost # load the plugin (remove the '#' if you want to enable it) plugin /usr/lib/ulogd/ulogd_MYSQL.so * Cambia las "marcas" LOG de las reglas del cortafuegos por ULOG * Arranca ulogd, recarga el cortafuegos. * Si quieres logs a un fichero, tengo por hay algo con logwatch para que mande la informacion deseada. * Para leer la base de datos por aqui hay un par de kilos de programas, applets, etc, http://www.inl.fr/Nulog.html http://www.inl.fr/download/nulog-1.1.1.tar.gz http://joker.linuxstuff.pl/specter/ http://bonehunter.rulez.org/software/ccze/ http://sourceforge.net/projects/pothos/ http://johoho.eggheads.org/files/ulogd_php.tar.bz2 http://w5.cs.uni-sb.de/~gogo/homepage/ulog-monitor/ no obstante mysql se puede atacar con cualquier cosa, php, perl, etc. * Si no lo ves claro aqui tienes un programilla que te genera logs "round-robin". http://www.signuts.net/projects/rdatad/rdatad.tar.gz
* La auditoria de netfilter esta estandarizada a traves del target ULOG de iptables.
Pues mira, una de esas (tantas, tengo que reconocer) que se me han pasado de las man de iptables; mira que son largas las joías... :P
* apt-get install ulogd ulogd-pgsql ulogd-mysql ulogd-pcap el demonio, el plugin para postgree, mysql y ficheros pcap elige el que quieras o todos.
* arranca la base de datos mysql por ejemplo cambia el pasword de root viene en blanco mysqladmin -u root -p 'pasword_de_administracion'
* Conecta con mysql y crea la base de datos y usuarios, mysql -u root -p (te pedira el password_de_administracion)
* crea la base de datos mysql> create database ulog; Query OK, 1 row affected (0,00 sec)
* inyecta el esquema de tablas
mysql> use ulog; Database changed
mysql> source /usr/share/doc/packages/ulogd/mysql.table Query OK, 0 rows affected (0,05 sec)
* los privilegios de los usuarios escribir y leer mysql> GRANT select,insert ON ulog.* TO escribir@localhost IDENTIFIED BY 'pass_de_escribir'; Query OK, 0 rows affected (0,00 sec)
mysql> GRANT select ON ulog.* TO leer@localhost IDENTIFIED BY 'pass_de_leer'; Query OK, 0 rows affected (0,00 sec)
mysql> flush privileges; Query OK, 0 rows affected (0,00 sec)
mysql> \q Bye
* Edita /etc/ulogd.conf y comenta estas lineas para que no loguee a un fichero.
# # ulogd_LOGEMU.so - simple syslog emulation target # # where to write to syslogfile /var/log/ulogd.syslogemu # do we want to fflush() the file after each write? syslogsync 1 # load the plugin plugin /usr/lib/ulogd/ulogd_LOGEMU.so
* Modifica el siguiente bloque.
# # ulogd_MYSQL.so: optional logging into a MySQL database # # database information mysqltable ulog mysqlpass pass_de_escribir mysqluser escribir mysqldb ulog mysqlhost localhost # load the plugin (remove the '#' if you want to enable it) plugin /usr/lib/ulogd/ulogd_MYSQL.so
* Cambia las "marcas" LOG de las reglas del cortafuegos por ULOG
* Arranca ulogd, recarga el cortafuegos.
* Si quieres logs a un fichero, tengo por hay algo con logwatch para que mande la informacion deseada.
Hay está la clave!!! Tan fácil como crear las reglas que te de la gana con el target ULOG, meterlas en /etc/sysconfig/scripts/SuSEfirewall2-custom y darle paso al arranqued de las mismas mediante la activación de la variable nº 25 de /etc/sysconfig/SuSEfirewall2.
* Para leer la base de datos por aqui hay un par de kilos de programas, applets, etc, http://www.inl.fr/Nulog.html http://www.inl.fr/download/nulog-1.1.1.tar.gz http://joker.linuxstuff.pl/specter/ http://bonehunter.rulez.org/software/ccze/ http://sourceforge.net/projects/pothos/ http://johoho.eggheads.org/files/ulogd_php.tar.bz2 http://w5.cs.uni-sb.de/~gogo/homepage/ulog-monitor/
no obstante mysql se puede atacar con cualquier cosa, php, perl, etc.
Ajá. Perfecto; una vez montado el percal le hecharé un ojo a varios de ellos.
* Si no lo ves claro aqui tienes un programilla que te genera logs "round-robin". http://www.signuts.net/projects/rdatad/rdatad.tar.gz
Ya había contemplado esta posibilidad, que sigue abierta en cierta medida. Aunque el targeta ULOG en volacod MySQL me parece mucho más interesante. Mil gracias. -- ¡Share your knowledge! Linux user id 332494 # http://counter.li.org/ PGP id 0xC5ABA76A # http://pgp.mit.edu/
* /sbin/scritps/parar-tcpdump ------------------------------------------ #!/bin/bash kill `ps -aef | awk '/.\/tcpdump_sniffer$/ { print $2}'` -------------fin----------------------------- * el cron 01 00 * * * * /sbin/scripts/tcpdump_sniffer.sh 59 23 * * * * /sbin/scripts/parar-tcpdump
* Para arrancarlo con la maquina mete el comando en /etc/init.d/postfix por ejemplo, añade al scrit un if ,bla, bla, que vea si esta ya en marcha por horario, acuerdate del script perl para levantar los tuneles ssh inversos.
* Bueno, al final hice caso de los consejos de Camaleón y cree el servicio a partir de /etc/init.d/skeleton; además, no apunta al binario, sino al script ubicado en /sbin/scripts/, con lo cual tengo la operatividad del servicio y su funcionalidad cómodamente separada.
* PD. ¿Para que coño quieres ese script rulando todo el dia?, messages, who, w, lastlog, ntop, logsurfer, etc, etc, tcpdump es para hacer log puntuales y mejor presenciales, es decir se esta auditanto un problema detectado por otros medios.
¿Porqué? Bueno, pues porqué necesito tener una máquina que monitoree la red y probé lo siguiente: * ntop: muy facilito y cómodo; excelente el tema de entrono web en local, pero con el "problema" de trabajar en bbdd tipo robin-round. No puedes volcar los registros. Y me interesa saber qué paso a esa hora de ese día de ese mes. * snort: es una maravilla, pero consume mucha máquina. Además, su curva de aprendizaje es muy alta. Supongo que es dónde acabaré... pero de momento queda "grande. * iptraf: me encanta y además puedes lanzarlo en modo daemon. De hecho tengo un medio script por ahí. Podría ser una posibilidad. * ethereal: otra vez con el tema del volcado en base de datos. Al final me quedo con tcpdump que, realmente es un coñazo depende cómo lo mires; en todo caso siempre puedes crear filtros para no monitorizar lo que va a ocupar gran parte de la red (http, dns...) Lo que busco realmente es un sencillo monitor de red que me cree un registro diario completo (aunque no hace falta web, pues lo controlo mediante squid/ SARG), lo volque en bbdd y pueda visualizarse cómodamente en formato logsurfer, swatch y tipo así. Ah, se me olvidaba. También probé nagios, pero al igual que snort creo que es demasiado grande para lo que requiero; además de estar orientado a tareas diferentes. No sé, de momento lo he solventado con tcpdump, 4 filtros y un poco de shell-scripting.... ¿alguna idea? :D -- ¡Share your knowledge! Linux user id 332494 # http://counter.li.org/ PGP id 0xC5ABA76A # http://pgp.mit.edu/
participants (4)
-
Aquiles
-
Camaleón
-
Carlos E. R.
-
jose maria