Instalar
Snort en Debian Lenny o Ubuntu , para detectar intrusos en la red
Primeramente tendremos que instalar mysql y php desde
aquí.
Podéis descargar la última versión desde
sección de descargas de la web de snort (clic aquí).
En mi ejemplo, descargaré la última versión a dia de hoy, la 2.8.5.1
Instalando Snort: Nos situaremos en el directorio donde hemos descargado Snort y:
tar xvzf snort-2.8.5.1.tar.gz
cd snort-2.8.5.1.tar.gz
Instalamos dependencias que nos haran falta para compilar snort:
# aptitude install php5-gd php5-ldap php5-dev php5-mysql php-pear libnet1 libnet1-dev libpcap0.8 libpcap-dev libpcap0.8-dev libpcre3 expect gobjc libpcre3-dev flex libnet0 libnet0-dev bison libmysql++-dev libapache2-mod-php5 php5-cgi -y
configuramos, compilamos e instalamos:
./configure --with-mysql --enable-flexresp --enable-sourcefire --enable-targetbased
make
# make install
crearemos los directorios para Snort:
# mkdir -p /etc/snort
# mkdir -p /var/log/snort
# mkdir -p /etc/snort/rules
copiaremos ficheros necesarios:
# cp -r preproc_rules/ /etc/snort/
# cp etc/*.conf* /etc/snort/
# cp etc/*.map /etc/snort/
Ahora ya tenemos Snort instalado, ahora necesitaremos descargar las reglas, para ello,
descargaremos oinkmaster desde su web (clic aqui).
La versión a dia de hoy es la 2.0. la descargaré y me situare en el directorio de descarga y :
tar xvzf oinkmaster-2.0.tar.gz
cd oinkmaster-2.0
Ahora deberemos registrarnos a la página de Snort, nos enviaran un correo para confirmar el registro; cuando esté confirmado entraremos a nuestra área privada (sign in), > my account > subscriptions and oinkcodes > oinkcodes : veremos algo así:
Oinkcodes
xxxx92xxxxx .....
Copiaremos esa cadena de números y letras y lo incluiremos a la configuración del oinkmaster:
nano oinkmaster.conf
Buscaremos esta línea:
# url = http://www.snort.org/pub-bin/oinkmaster.cgi//snortrules-snapshot-2.4.tar.gz
Eliminaremos la almohadilla del principio, cambiaremos <oinkcode> por nuestro código y también la versión del fichero por la versión de nuestro Snort; en mi ejemplo, la 2.8. Quedará así:
url = http://www.snort.org/pub-bin/oinkmaster.cgi/aquí tu código/snortrules-snapshot-2.8.tar.gz
Guardaremos el fichero con Control+o y saldremos del editor con Control+x
Ahora ejecutaremos oinkmaster para que nos descargue las reglas:
perl oinkmaster.pl -C oinkmaster.conf -o ./
Esperaremos un rato a que se descarguen y se descompriman.
Ahora moveremos las reglas (*.rules) que se nos an descomprimido en el actual directorio a snort:
# mv *.rules /etc/snort/rules/
creamos enlace simbólico:
# ln -s /usr/local/bin/snort /usr/sbin/snort
Crearemos un grupo y usuario específicos para manejar snort:
# groupadd snort
# useradd -g snort snort
Cambiamos grupo y dueño del directorio de logs de snort para que pueda ser utilizado por dicho dueño y grupo:
# chown snort:snort /var/log/snort/
# touch /var/log/snort/alert
# chown snort:snort /var/log/snort/alert
# chmod 600 /var/log/snort/alert
# touch /etc/snort/rules/local.rules
Configuraremos snort:
# nano /etc/snort/snort.conf
Buscaremos la línea :
var RULE_PATH ../rules y la cambiaremos por:
var RULE_PATH /etc/snort/rules
también modificaremos la línea:
var PREPROC_RULE_PATH ../preproc_rules y la cambiaremos por:
var PREPROC_RULE_PATH /etc/snort/preproc_rules
Buscaremos:
# output database: log, mysql, user=root password=test dbname=db host=localhost y eliminaremos la almohadilla del principio y también haremos las siguientes modificaciones:
output database: log, mysql, user=snort password=un_password dbname=dbsnort host=localhost
Nota: cambiaremos un_password por una contraseña que queramos, la utilizaremos más adelante, no te la olvides ;-)
Ahora buscamos:
# include $PREPROC_RULE_PATH/preprocessor.rules y eliminamos la almohadilla del principio, quedando:
include $PREPROC_RULE_PATH/preprocessor.rules
También eliminaremos la almohadilla de:
# include $PREPROC_RULE_PATH/decoder.rules , quedando:
include $PREPROC_RULE_PATH/decoder.rules
Guardaremos el fichero con Control+o y cerraremos con Control+x
Creando la Base de Datos para Snort:
Ingresaremos:
mysql -u root -p
(ingresaremos la contraseña de nuestro usuario root de mysql).
Crearemos y configuraremos la BD:
CREATE DATABASE dbsnort;
GRANT CREATE, INSERT, SELECT, DELETE, UPDATE ON dbsnort.* TO snort@LOCALHOST;
SET PASSWORD FOR snort@LOCALHOST=PASSWORD('un_password');
FLUSH PRIVILEGES;
exit
Recordad sustituir un_password por vuestro password anterior.
Nos situaremos en el directorio donde descomprimimos snort, en mi caso es:
cd ~/snort-2.8.5.1/
Ejecutaremos el setup schema para la DB:
cd schemas
mysql -p -u snort dbsnort < create_mysql
Nos pedirá la contraseña que pusimos de
un_password , la introducimos.
Instalando BASE para interpretar Snort gráficamente:
descargamos BASE de su web
http://base.secureideas.net/
y descargamos ADOdb de su web
http://adodb.sourceforge.net/
Por ejemplo, a dia de hoy descargo BASE 1.4.4 y ADOdb 5.10
Descomprimo con:
tar xvzf base-1.4.4.tar.gz && tar xvf adodb510.tgz
Cambio el nombre del directorio BASE para ser más ameno:
mv base-1.4.4 base
Los muevo a /var/www
# mv base/ adodb5/ /var/www
Damos acceso a apache:
# chown www-data /var/www/base/
Editamos php.ini :
# nano /etc/php5/cli/php.ini
Buscamos:
error_reporting = E_ALL & ~E_NOTICE
Ahora existen dos posibilidades: tenemos la línea anter comentada (; delante) pero unas líneas más abajo la volvemos a tener descomentada o tenemos la línea anterior comentada y más abajo tenemos:
error_reporting = E_ALL
Si estamos en el primer caso: no haremos nada.
Si estamos en el segundo: añadiremos a error_reporting = E_ALL lo que le falta para ser igual a la línea buscada, quedando:
error_reporting = E_ALL & ~E_NOTICE , guardaremos el fichero y saldremos del editor. Reiniciaremos apache: /etc/init.d/apache2 restart
Instalaremos las extensiones PHP necesarias para BASE desde el repositorio de PHP (PEAR):
# aptitude install php-pear -y
# pear channel-update pear.php.net
# pear upgrade PEAR
# pear install Image_Color Image_Canvas Log Mail Mail_Mime Numbers_Roman Numbers_Words
Configuraremos BASE:
Introduciremos en el navegador :
http://localhost/base
En la página clic en continue.
Ahora seleccionaremos idioma, y le diremos la ruta de ADOdb, en mi caso: /var/www/adodb5
Clicaremos a Enviar Consulta (o lo que sea en vuestro idioma).
Ahora:
Pick a Database type: Dejaremos MySQL
Database Name: dbsnort
Database Host: localhost
Database Port: Pondremos el puerto que queramos, si lo dejamos en blanco será el que viene por defecto (3306). En mi caso, lo dejaré en blanco.
Database User Name: snort
Database Password: poned el que tengáis de un_password
Pulsaremos en Enviar Consulta.
Ahora nos pedirá un usuario y contraseña para acceder a BASE, lo ponemos y le damos a Enviar Consulta.
Ahora pulsamos sobre el botón: Create BASE AG
pulsamos sobre: step 5...
Ya estamos en la página principal de BASE.
Ahora nos falta iniciar Snort, crearemos un script:
# nano /etc/init.d/snort
Que contenga, el siguiente código:
#!/bin/bash
# This is a "simple" script written by bodhi.zazen to start snort.
# This script is released under the GPL V3.
# Feel free to make modifications.
# If you modify or redistribute this script please give the courtesy of credit.
# This script requires zenity if you wish to run it in X.
# Test root and display
############################################################
### Configuration options ###
############################################################
############################################################
# The following sections are used to configure snort
# Change "eth0" to the interface you wish to use with snort
#
IFACE="eth0"
# To Add hosts you wish to ignore to a "white list,
# Add them into the "WHITELIST"
# Be sure separate each ip address by a space
# Example WHITELIST='192.168.1.1 192.168.1.2'
WHITELIST=''
# The following section formats the $WHITELIST into proper syntax for snort
if [ -z "$WHITELIST" ] ; then
HOST=''
else
c='1'
for i in $WHITELIST; do
if [ "$c" = "1" ]; then
HOST="host "$i""
c='2'
else
HOST=""$HOST" or host "$i""
fi
done
fi
############################################################
#
# To start snort at boot, put :
#
# "/etc/init.d/snort boot"
#
# in /etc/rc.local (without quotes, above the line exit 0)
#
############################################################
# Sanity checks
if [ -z "$DISPLAY" ] || [ ! -x "/usr/bin/zenity" ]; then
D="e"
else
D="z"
fi
uid=$(/usr/bin/id -u)
if [ ! "$uid" = "0" ];then
case "$D" in
e)
sudo bash $0 $@
exit 0
;;
z)
if [ -x "/usr/bin/gksu" ];then
gksu "$0 $@"
exit 0
else
kdesu "$0 $@"
exit 0
fi
;;
esac
fi
# Check for stale lock files
if [ -z "$PID" ]; then
rm -f /var/run/snort_"${IFACE}"*
fi
# Declair variables
SNORT='/usr/local/bin/snort -c /etc/snort/snort.conf -u snort -g snort -D'
ZEN="/usr/bin/zenity"
ZENINF='$ZEN --width=700 --title "Bodhis snort script" --info --text'
ZENWARN='$ZEN --width=700 --title "Bodhis snort script" --warning --text'
ZENMSG='"$TXT"'
PID=`pidof snort`
#Set prompt colors
RED='\e[0;31m'
GREEN='\e[0;32m'
BLUE='\e[0;34m'
NC='\e[0m' # No Color
# functions
zeninfo ()
{
case "$D" in
e)
echo -e $BLUE"${TXT}" $NC
;;
z)
eval $ZENINF $ZENMSG
;;
esac
}
zenwarn ()
{
case "$D" in
e)
echo -e $RED"${TXT}" $NC
;;
z)
eval $ZENWARN $ZENMSG
;;
esac
}
start ()
{
#start snort
if [ -z "$HOST" ];then
$SNORT -i "$IFACE" &
else
$SNORT -i "$IFACE" not \(`echo "$HOST"`\)&
fi
# This sleep is necessary to allow snort to initialize.
# If you shorten it, snort may start, but fail.
# this sleep is skipped if you use the boot option
sleep 20
PID=`pidof snort`
if [ ! -z "$PID" ]; then
if [ ! -z "$WHITELIST" ]; then
TXT="Snort successfully started, using a Whitelist of "$WHITELIST""
else
TXT="Snort started successfully ..."
fi
zeninfo &
exit 0
else
TXT="Snort failed to start ..."
zenwarn &
exit 1
fi
}
stop ()
{
if [ ! -z "$PID" ]; then
kill -9 ""$PID""
rm -f /var/run/snort_"${IFACE}"*
TXT="Snort stopped ..."
zeninfo &
exit 0
else
TXT="Snort is not running ..."
zenwarn &
exit 1
fi
}
restart ()
{
if [ ! -z "$PID" ]; then
kill -9 "$PID"
rm -f /var/run/snort_"${IFACE}"*
fi
start
}
status ()
{
if [ ! -z $PID ] ; then
TXT="Snort is running ..."
else
TXT="Snort is not running ..."
fi
zeninfo &
}
case "$1" in
boot)
if [ ! -z "$PID" ]; then
exit 0
fi
if [ -z "$HOST" ];then
$SNORT -i "$IFACE" &
else
$SNORT -i "$IFACE" not \(`echo "$HOST"`\)&
fi
;;
start)
if [ ! -z "$PID" ]; then
TXT="Snort is already running ..."
zenwarn &
exit 1
else
start
fi
start
;;
stop)
stop
;;
restart|reload)
restart
;;
status)
status
;;
*)
TXT="Usage start|stop|restart|reload|status|boot"
zenwarn
exit 1
;;
esac
exit 0
Si vuestra interfaz es eth0 no tocaremos nada, pero si es diferente, por ejemplo eth1 , en el script cambiaremos IFACE="eth0" por IFACE="eth1"
Guardaremos con Control+o y saldremos con Control+x
Damos permisos:
# chown root:root /etc/init.d/snort
# chmod 500 /etc/init.d/snort
Iniciamos Snort:
# update-rc.d snort defaults
# /etc/init.d/snort restart
Ya tenemos nuestro Snort corriendo y ejecutándose en cada inicio.
Saludos.
Fuente principal: B!n@ry | Script Snort.init : bodhi.zazen | Adaptación a la actualidad, solución de errores y inclusión de oinkmaster por mí.