sábado, 28 de noviembre de 2009

Detectar Intrusos : Instalar Snort ( Debian Lenny / Ubuntu )

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í.

 

10 comentarios:

  1. Si te da un error el pear install con Image-Canvas y Number-Words lo puedes arreglar con:

    # pear install Image-Canvas-alpha Number-Words-alpha

    para ver las gráficas de datos de alerta necesitarás teclear esto:

    # pear install Image-Graph-alpha

    para que entren en acción los cambios:

    # /etc/init.d/apache2 restart

    ResponderEliminar
  2. me sirvio mucho esta guia para un amigo, saludos y gracias

    ResponderEliminar
  3. Puede interactuar Snort con Isa server o Cisco ASA, para tomar decisiones?

    ResponderEliminar
  4. Hola, qué tal!

    Seguí todo paso a paso, pero al llegar al final:

    Bodhis snort script:

    Snort failed to start...


    Sugerencias??
    Gracias!

    ResponderEliminar
  5. Mira, estuve mirando el script, y se supone que en el mismo se le dan permisos para levantar la iface... Claro que yo soy niubi aún. Algún consejo sobre cómo darle permisos? U_U Gracias!

    ResponderEliminar
  6. Me parece que no es cuestión de permisos. Sin embargo, antes del debug puede ser útil lo siguiente: Mirando en los logs de los demons, veo que snort sí inicia, no hay problemas con las librerías, y va todo bien hasta que:

    Jun 23 13:05:53 crazydiamond snort[2883]: FATAL ERROR: /etc/snort/snort.conf(153) => Unable to open the IIS Unicode Map file '/etc/snort/unicode.map'.

    Claramente no puede abrir el archivo IIS Unicode Map >.< Consejos?

    Muchas gracias de antemano =)

    ResponderEliminar
  7. ENCONTRÉ LA SOLUCIÓN!!!

    el problema mencionado anteriormente se debía a un fallo al copiar el archivo unicode.map, al principio. Se puede resolver al final simplemente copiando el archivo desde la carpeta descomprimida snort-2.8.6 (ésa es la versión en mi caso), a /etc/snort/
    Una vez hecho eso, me percaté, también mirando el log, que snort no encontraba las reglas. Cosa extraña, había seguido tu guía paso a paso. Sin embargo, el problema era similar al mencionado anteriormente. Snort busca el siguiente path para las reglas:

    /etc/snort/etc/snort/rules/

    Y nosotros las tenemos en:

    /etc/snort/rules/

    Es tan sencillo como crear el path y copiar las reglas. Entonces, creamos carpetas hasta satisfacer la dirección que nos pide ( /etc/snort/etc/snort/rules/ ), y luego copiamos las reglas a este path que hemos creado. Estoy segura de que debe haber una manera menos engorrosa, pero en estos momentos siento que para ser niubi no estuve nada mal. =D
    Espero que a alguien le sirva.

    ResponderEliminar
  8. Estos pasos tambien son validos para OpenSuse?

    ResponderEliminar
  9. Hola, muy buen post. mi pregunta es que yo he escuchado un Plugin muy importante para snort llamado SPADE (Statitical Packet Anomaly Detector Engine) que permite detectar anomalias, he intentado instalarlo y anadirlo a mi snort pero no puedo, no se si tu tengas informacion de como instalarlo o pasos como este post...

    Muchas Gracias..
    Saludos

    ResponderEliminar
  10. Hola, Mi consulta es si snort soporta wlan0 pq a la hora de configurarlo me dice q no soporta wlan0 y si lo dejo en eth0 tmb me tira error. Alguna idea?

    Muchas Gracias.
    Saludos

    ResponderEliminar