Instalar y configurar Sistema Detección de Intrusiones-Snort en ubuntu server

Instalar y configurar Sistema Detección de Intrusiones-Snort en ubuntu 

En primer lugar recomiendo que este sistema se instale en una maquina dedicada, donde la topología ideal sería:

TOPOLOGÍA IDEAD SNORT

  • Comenazaremos por instalar dependencias:

sudo su

apt-get install mysql-server nmap nbtscan apache2 php5 php5-mysql php5-gd
libpcap0.8-dev libpcre3-dev g++ bison flex libpcap-ruby make zlib1g-dev
libmysqld-dev libdnet libdnet-dev libpcre3 libpcre3-dev gcc make flex byacc
bison linux-headers-generic libxml2-dev libdumbnet-dev zlib1g zlib1g-dev 
checkins
 

 

  • Tras haber elegido una contraseña segura para el usuario root(mysql) y saltarnos la configuración de el paquete DECnet, actualizamos nuestro sistema, para asegurarnos que estamos a la última en lo que a parches de seguridad se refiere y reiniciamos.

apt-get update

apt-get upgrade

reboot

1. En primer lugar descargaremos e instalaremos la API de adquisición de datos que utiliza snort:

mkdir -p /usr/local/src/snort

cd /usr/local/src/snort

wget http://www.snort.org/dl/snort-current/daq-0.6.2.tar.gz

tar zxvf daq-0.6.2.tar.gz

cd daq-0.6.2

./configure

make

checkinstall

2. Instalar y configurar snort:

cd /usr/local/src/snort wget http://www.snort.org/dl/snort-current/snort-
2.9.2.3.tar.gz

tar zxvf snort-2.9.2.3.tar.gz

cd snort-2-9-2-3

./configure –prefix /usr/local/snort “/usr/local/snort es la ruta de instalación”

make

checkinstall

3. Creamos el usuario y grupo snort:

groupadd snort

useradd -g snort snort 
4. Ceamos enlaces hacia los archivos snort:

ln -s /usr/local/snort/bin/snort /usr/sbin/ ln -s /usr/local/snort/etc /etc/snort


5. Instalación de snort-rules:

5.1 Nos descargaremos las reglas que snort utilizara para detectar amenazas(debemos registrarnos):

cd /usr/local/src/snort

5.2 instalación snort-rules:

tar zxvf snortrules-snapshot-2923.tar.gz -C /usr/local/snort

mkdir /usr/local/snort/lib/snort_dynamicrules

cp /usr/local/snort/so_rules/precompiled/Ubuntu-10-4/x86-64/2.9.2.3/*o /usr/local/snort/lib/snort_dynamicrules (para sistemas 64 bits, para 32 bits sustituir x86-64 por i386)

6. Creamos el directorio donde se albergaran los log de snort, y lo asignamos al usuario snort y se crean los enlaces necesarios:

mkdir –p /usr/local/snort/var/log
mkdir /var/log/snort
chown snort:snort /usr/local/snort/var/log

ln –s /usr/local/snort/var/log /var/log/snort 
 
7. Creamos los enlaces para reglas dinamicas y le damos permisos a snort 
 
ln -s /usr/local/snort/lib/snort_dynamicpreprocessor /usr/local/lib/snort_dynamicpreprocessor 
 
ln -s /usr/local/snort/lib/snort_dynamicengine /usr/local/lib/snort_dynamicengine

ln -s /usr/local/snort/lib/snort_dynamicrules /usr/local/lib/snort_dynamicrules 
 
chown -R snort:snort /usr/local/snort
 

8. Configuración snort:

8.1 Editar  /usr/local/snort/etc/snort.confy buscamos:

– La sección # Reputation preprocessor y comentamos todas las lineas de esta sección

# Reputation preprocessor. For more information see README.reputation
#preprocessor reputation:
# memcap 500,
# priority whitelist,
# nested_ip inner,
# whitelist $WHITE_LIST_PATH/white_list.rules,
# blacklist $BLACK_LIST_PATH/black_list.rules

 – Y por último buscamos la linea:

#output unified2: filename merged.log, limit 128, nostamp, mpls_event_types, vlan_event_typesy debajo añadiremos output unified2: filename snort.u2, limit 128

9. Volcamos las reglas dinamicas:

snort -c /usr/local/snort/etc/snort.conf –dump-dynamic-rules=/usr/local/snort/so_rules

- Al introducir este comando puede dar un error con las librerias, bien basta con hacer lo siguiente

LD_LIBRARY_PATH=/usr/local/lib

export LD_LIBRARY_PATH 
 
10. Habilitamos las dynamicrules,para lo cual editamos /usr/local/snort/etc/snort.conf, buscamos la
sección dynamic library rules y descomentamos todas las lineas.
# dynamic library rules include $SO_RULE_PATH/bad-traffic.rules include $SO_RULE_PATH/chat.rules include $SO_RULE_PATH/dos.rules include $SO_RULE_PATH/exploit.rules include $SO_RULE_PATH/icmp.rules include $SO_RULE_PATH/imap.rules include $SO_RULE_PATH/misc.rules include $SO_RULE_PATH/multimedia.rules include $SO_RULE_PATH/netbios.rules include $SO_RULE_PATH/nntp.rules include $SO_RULE_PATH/p2p.rules include $SO_RULE_PATH/smtp.rules include $SO_RULE_PATH/snmp.rules include $SO_RULE_PATH/specific-threats.rules include $SO_RULE_PATH/web-activex.rules include $SO_RULE_PATH/web-client.rules include $SO_RULE_PATH/web-iis.rules include $SO_RULE_PATH/web-misc.rules
11. Comprobamos el correcto funcionamiento de snort:

snort -c /usr/local/snort/etc/snort.conf -T
  Debemos obtener esta salida:
  Snort successfully validated the configuration! Snort exiting
 12. Arrancar snort automáticamente:
– Primero creamos el script lanzador de snort dentro de /etc/init.d touch /etc/init.d/snortd
 – Editamos el script e introducimos el siguiente codigo:
 nano /etc/init.d/snortd
  ******script*******

#!/bin/sh
# $Id$
#
# snortd Start/Stop the snort IDS daemon.
#
# chkconfig: 2345 40 60
# description: snort is a lightweight network intrusion detection tool that
# currently detects more than 1100 host and network
# vulnerabilities, portscans, backdoors, and more.
#


# Source the local configuration file
. /etc/default/snort

# Convert the /etc/sysconfig/snort settings to something snort can
# use on the startup line.
if [ "$ALERTMODE"X = "X" ]; then
ALERTMODE=""
else
ALERTMODE="-A $ALERTMODE"
fi

if [ "$USER"X = "X" ]; then
USER="snort"
fi

if [ "$GROUP"X = "X" ]; then
GROUP="snort"
fi

if [ "$BINARY_LOG"X = "1X" ]; then
BINARY_LOG="-b"
else
BINARY_LOG=""
fi

if [ "$CONF"X = "X" ]; then
CONF="-c /etc/snort/snort.conf"
else
CONF="-c $CONF"
fi

if [ "$INTERFACE"X = "X" ]; then
INTERFACE="-i eth0"
else
INTERFACE="-i $INTERFACE"
fi

if [ "$DUMP_APP"X = "1X" ]; then
DUMP_APP="-d"
else
DUMP_APP=""
fi

if [ "$NO_PACKET_LOG"X = "1X" ]; then
NO_PACKET_LOG="-N"
else
NO_PACKET_LOG=""
fi

if [ "$PRINT_INTERFACE"X = "1X" ]; then
PRINT_INTERFACE="-I"
else
PRINT_INTERFACE=""
fi

if [ "$PASS_FIRST"X = "1X" ]; then
PASS_FIRST="-o"
else
PASS_FIRST=""
fi

if [ "$LOGDIR"X = "X" ]; then
LOGDIR=/var/log/snort
fi

# These are used by the 'stats' option
if [ "$SYSLOG"X = "X" ]; then
SYSLOG=/var/log/messages
fi

if [ "$SECS"X = "X" ]; then
SECS=5
fi

if [ ! "$BPFFILE"X = "X" ]; then
BPFFILE="-F $BPFFILE"
fi

######################################
# Now to the real heart of the matter:

# See how we were called.
case "$1" in
start)
echo -n "Starting snort: "
cd $LOGDIR
if [ "$INTERFACE" = "-i ALL" ]; then
for i in `cat /proc/net/dev|grep eth|awk -F ":" '{ print $1; }'`
do
mkdir -p "$LOGDIR/$i"
chown -R $USER:$GROUP $LOGDIR
/usr/sbin/snort $ALERTMODE $BINARY_LOG $NO_PACKET_LOG $DUMP_APP -D $PRINT_INTERFACE -i $i -u $USER -g $GROUP $CONF -l $LOGDIR/$i $PASS_FIRST $BPFFILE $BPF
done
else
for i in `echo $INTERFACE | sed s/"-i "//`
do
mkdir -p "$LOGDIR/$i"
chown -R $USER:$GROUP $LOGDIR
/usr/sbin/snort $ALERTMODE $BINARY_LOG $NO_PACKET_LOG $DUMP_APP -D $PRINT_INTERFACE -i $i -u $USER -g $GROUP $CONF -l $LOGDIR/$i $PASS_FIRST $BPFFILE $BPF
done
fi
touch /var/lock/snort
echo
 ;;
stop)
echo -n "Stopping snort: "
killall snort
rm -f /var/lock/snort
echo
 ;;
reload)
echo "Sorry, not implemented yet"
 ;;
restart)
$0 stop
$0 start
 ;;
condrestart)
[ -e /var/lock/snort ] && $0 restart
 ;;
status)
status snort
 ;;
stats)
TC=125 # Trailing context to grep
SNORTNAME='snort' # Process name to look for

if [ ! -x "/sbin/pidof" ]; then
echo "/sbin/pidof not present, sorry, I cannot go on like this!"
exit 1
fi

#Grab Snort's PID
PID=`pidof -o $$ -o $PPID -o %PPID -x ${SNORTNAME}`

if [ ! -n "$PID" ]; then # if we got no PID then:
echo "No PID found: ${SNORTNAME} must not running."
exit 2
fi

echo ""
echo "*******"
echo "WARNING: This feature is EXPERIMENTAL - please report errors!"
echo "*******"
echo ""
echo "You can also run: $0 stats [long | opt]"
echo ""
echo "Dumping ${SNORTNAME}'s ($PID) statistics"
echo "please wait..."

# Get the date and tell Snort to dump stats as close together in
# time as possible--not 100%, but it seems to work.
startdate=`date '+%b %e %H:%M:%S'`

# This causes the stats to be dumped to syslog
kill -USR1 $PID

# Sleep for $SECS secs to give syslog a chance to catch up
# May need to be adjusted for slow/busy systems
sleep $SECS

if [ "$2" = "long" ]; then # Long format
egrep -B 3 -A $TC "^$startdate .* snort.*: ={79}" $SYSLOG |
grep snort.*:
elif [ "$2" = "opt" ]; then # OPTimize format
# Just show stuff useful for optimizing Snort
egrep -B 3 -A $TC "^$startdate .* snort.*: ={79}" $SYSLOG |
egrep "snort.*: Snort analyzed |snort.*: dropping|emory .aults:"
else # Default format
egrep -B 3 -A $TC "^$startdate .* snort.*: ={79}" $SYSLOG |
grep snort.*: | cut -d: -f4-
fi
 ;;
*)
echo "Usage: $0 {start|stop|reload|restart|condrestart|status|stats (long|opt)}"
exit 2
esac

exit 0

12. Lo hacemos ejecutable.  

chmod +x /etc/init.d/snortd

13. configurar servicio para que arranque al inicio:

 update-rc.d snortd defaults
 
14. Instalación y configuración de Barnyard2:

14.1  La anterior linea, output unified2: filename snort.u2, limit 128, escribe las alertas en un fichero local, con limite de 128 MB, y no directamente escribe la alerta en la base de datos. Esto es recomendable hacerlo en entornos donde snort va ha procesar gran cantidad de información, ya que snort no procesa el siguiente paquete hasta que no se ha escrito la aleta en la base de datos, proceso bastante lento, por lo que cabe la posibilidad de que se descarten paquetes. Bien pues Barnyard2 nos va ha interpretar este fichero y escribir las alertas en base de datos.

– Acceder como administrador a mysql.

mysql -h localhost -u root -p;

– Crear base de datos snort.

CREATE DATABASE snort;

– Creamos usuario snort con contraseña snort.

CREATE USER snort IDENTIFIED BY ‘snort’;

Se le da permisos al usuario snort en la base de datos snort en nuestro servidor(localhost, en este caso) y salimos.

GRANT ALL PRIVILEGES ON snort.* TO 'snort'@'localhost' IDENTIFIED BY 'snort' with grant option;

quit;
 
– Para crear las tablas necesarias en la base de datos usamos la siguiente instrucción:

 /usr/local/src/snort/snort-2.9.2.3/schemas/create_mysql

14.2 Descargaremos el paquete de barnyard2, lo compilaremos y configuraremos:

wget http://www.securixlive.com/download/barnyard2/barnyard2-1.9.tar.gz

tar zxvf barnyard2-1.9.tar.gz

cd barnyard2-1.9

./configure –with-mysql

make

checkinstall

cp etc/barnyard2.conf /usr/local/snort/etc

mkdir /var/log/barnyard2

chmod 666 /var/log/barnyard2

touch /var/log/snort/barnyard2.waldo

chown snort.snort /var/log/snort/barnyard2.waldo

nano /usr/local/snort/etc/barnyard2.conf y buscamos la linea:

#output database: log, mysql, user=root password=test dbname=db host=localhost, la descomentamos y la sustituiremos por output database: log, mysql, user=snort password=snort dbname=snort host=localhost

15. Hacemos que barnyard se ejecute al inicio:

– Alocamos script dentro de /etc/init.d:

touch /etc/init.d/barnyard2

– Editamos el script y pegamos el siguiente contenido:

nano /etc/init.d/barnyard2

*****script*****

#!/bin/sh
#
# Init file for Barnyard2
#
#
# chkconfig: 2345 40 60
# description: Barnyard2 is an output processor for snort.
#
# processname: barnyard2
# config: /etc/sysconfig/barnyard2
# config: /etc/snort/barnyard.conf
# pidfile: /var/lock/subsys/barnyard2.pid

[ -x /usr/sbin/snort ] || exit 1
[ -r /etc/snort/snort.conf ] || exit 1

### Default variables
SYSCONFIG="/etc/default/barnyard2"

### Read configuration
[ -r "$SYSCONFIG" ] && . "$SYSCONFIG"

RETVAL=0
prog="barnyard2"
desc="Snort Output Processor"

start() {
echo -n $"Starting $desc ($prog): "
for INT in $INTERFACES; do
PIDFILE="/var/lock/barnyard2-$INT.pid"
ARCHIVEDIR="$SNORTDIR/$INT/archive"
WALDO_FILE="$SNORTDIR/$INT/barnyard2.waldo"
BARNYARD_OPTS="-D -c $CONF -d $SNORTDIR/${INT} -w $WALDO_FILE -l $SNORTDIR/${INT} -a $ARCHIVEDIR -f $LOG_FILE -X $PIDFILE $EXTRA_ARGS"
$prog $BARNYARD_OPTS
done
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/$prog
return $RETVAL
}

stop() {
echo -n $"Shutting down $desc ($prog): "
killall $prog
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && rm -f /var/lock/$prog
return $RETVAL
}

restart() {
stop
start
}

reload() {
echo -n $"Reloading $desc ($prog): "
killall $prog -HUP
RETVAL=$?
echo
return $RETVAL
}

case "$1" in
start)
start
 ;;
stop)
stop
 ;;
restart)
restart
 ;;
reload)
reload
 ;;
condrestart)
[ -e /var/lock/$prog ] && restart
RETVAL=$?
 ;;
status)
status $prog
RETVAL=$?
 ;;
dump)
dump
 ;;
*)
echo $"Usage: $0 {start|stop|restart|reload|condrestart|status|dump}"
RETVAL=1
esac

exit $RETVAL

Lo hacemos ejecutable.

chmod +x /etc/init.d/baryard2

- Configurar servicio para que arranque al inicio:

update-rc.d barnyard2 defaults

- Editamos e insertamos la linea:

nano /etc/default/barnyard2 – LOG_FILE="snort.log"

16. Instalar snort report:

cd /usr/local/src/snort


tar zxvf snortreport-1.3.3.tar.gz -C /var/www/

nano /var/www/snortreport-1.3.3/srconf.php y buscamos la linea:

//Put your snort database login credentials in this section
$server = ”localhost”;
$user = “snort”;
$pass = “snort”;
$dbname = “snort”;

17. Probar snort:

service snortd restart
service baryard2 restart

/usr/local/snort/bin/snort -u snort -g snort -c /usr/local/snort/etc/snort.conf -i eth0

 – En este momento puede devolvernos un error, solución introducir comando:

ldconfig

IMPORTANTE:PONER INTERFAZ DE RED EN MODO POMISCUO.

Este apartado esta dedicado a crear reglas en SNORT, y me encontré con una documentación bastante completa que trataba sobre este aspecto, por lo que me he decidido a compartirlo > Creación reglas SNORT.