miércoles, 4 de noviembre de 2015

IPS Suricata con Centos 7 /RHEL 7 y Oinkmaster



Desde marzo de este año no escribía en mi viejo blog, y no perdiendo la costumbre de publicar algo de vez en cuando y no frecuente, que no me gusta publicar todo lo que vea o haga, pero si lo que pueda ser útil, vamos a ver esta vez como configurar suricata un IDS muy nombrado últimamente y que se a hecho con méritos suficientes para ser considerado, ayudado claramente por unas reglas que alimenten su motor en este caso las reglas de emerging threats y estas descargadas y actualizadas por oinkmaster un script en perl que cumple con lo que dice.

Bien como es costumbre no voy a entrar en definiciones de lo que vamos a usar, para eso los enlaces de los proyectos que explican mejor que nadie sus proyectos y no adjudicarme malas definiciones o cosas que no existen.

http://suricata-ids.org/
http://oinkmaster.sourceforge.net/

Bien pues iniciemos.


1.Oinkmaster
1.1.Instalación y Configuración base Oinkmaster


Lo primero que debemos tener en cuenta es que al momento de escribir esta guía el software no esta dentro de los repositorios comunes de software, por ende requiere se descarguen los paquetes al servidor.

Se creará un directorio sobre /etc de la siguiente forma.

mkdir /etc/oinkmaster

Seguidamente ingresaremos al directorio con el comando "cd /etc/oinkmaster"

Se descarga el software como tal.

wget http://prdownloads.sourceforge.net/oinkmaster/oinkmaster-2.0.tar.gz


Descomprimimos el archivo dentro del directorio.

tar xvzf oinkmaster/oinkmaster-2.0.tar.gz


Movemos el contenido al directorio base "mv oinkmaster-2.0/* ."

Ahora ingresaremos al archivo de configuración oinkmaster.conf y agregaremos la siguiente linea al inicio o mitad del archivo.

url = https://rules.emergingthreatspro.com/open/suricata/emerging.rules.tar.gz

y al final de archivo las siguiente lineas


modifysid emerging-web_specific_apps.rules "alert" | "drop"
modifysid emerging-web_server.rules "alert" | "drop"
modifysid emerging-web_client.rules "alert" | "drop"
modifysid emerging-sql.rules "alert" | "drop"
modifysid emerging-scan.rules "alert" | "drop"
modifysid emerging-shellcode.rules "alert" | "drop"
modifysid emerging-worm.rules "alert" | "drop"
modifysid emerging-malware.rules "alert" | "drop"
modifysid emerging-icmp.rules "alert" | "drop"
modifysid emerging-exploit.rules "alert" | "drop"



Esto lo hacemos ya que nos interesa que se haga el drop de algunas cosas que se detecte y no solo haga el alert, de lo contrario seguiría en modo IDS, es cierto que con esta modificación nos exponemos a falsos positivos, pero preferimos correr el riesgo ;).

Adicionalmente estas reglas están pensadas para un servidor web, en el caso que se tenga otros tipos de servidores protegidos se deben activar otros módulos.

Con esto se finaliza las configuraciones de oinkmaster de momento, mas adelante se automatizará la actualización de las reglas a suricata.


2.Instalación y Configuración suricata IPS
2.1.Configuración del repositorio



Para el caso de suricata si se cuenta con repositorios de software desde el cual se puede obtener un paquete pre-compilado para poder instalarse el empaquetado.


Instalamos el repositorio con el siguiente comando.

yum -y install http://codemonkey.net/files/rpm/suricata/el7/suricata-release-el-7-1.el7.noarch.rpm
yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm



2.2.Instalación de suricata

Debido a que ya se instalaron los repositorios la instalación se puede hacer con el siguiente comando.

yum -y install suricata


2.3.Configuración de suricata

La instalación por paquetes deja las configuraciones en el directorio /etc/suricata y dentro del mismo se encuentra su archivo de configuración suricata.yaml.

En la sección:

# a line based information for dropped packets in IPS mode
- drop:
enabled: no
filename: drop.log
append: yes
#filetype: regular # 'regular', 'unix_stream' or 'unix_dgram'

Se recomienda el registro de las reglas drop, la configuración debería quedar de la siguiente forma.

# a line based information for dropped packets in IPS mode
- drop:
enabled: yes
filename: drop.log
append: yes
#filetype: regular # 'regular', 'unix_stream' or 'unix_dgram'



En la sección se encuentra de la siguiente forma:

nfq:
# mode: accept
#repeat-mark: 1
#repeat-mask: 1
# route-queue: 2
# batchcount: 20
# fail-open: yes

Hay que configurarla de la siguiente manera:

nfq:
mode: repeat
# mode: accept
repeat-mark: 1
repeat-mask: 1
# route-queue: 2
# batchcount: 20
# fail-open: yes


Los valores "mode: repeat" es básicamente para re-inyectar los paquetes a la tabla de netfilter una vez procesados los paquetes.

Los valores "repeat-mark: 1" y "repeat-mask: 1" son para descartar los paquetes que ya fueron procesados previamente, de no habilitar estos valores y en conjunto con las reglas de iptables los paquetes entrarán en un ciclo infinito el cual llevará a una saturación de la máquina y por ende no funcionamiento del router.

Debido a que el IPS es relativamente sencillo y no aporta complejidad en lo referente a infraestructura, las configuraciones se pueden dejar en este momento tal cual.


2.4. Configuración del servicio de inicio

Para que suricata inicie en modo de ips es necesario que haga el hook a la pila de netfilter y por ello es necesario cambiar las lineas de inicio, esto se debe realizar en el archivo "/etc/sysconfig/suricata" la linea de options debe quedar así como se muestra en el siguiente texto:


OPTIONS="-q 0 "


Nota: No se debe especificar la interfaz de red ya que se coloca dentro de la pila de netfilter.
De esta forma cada vez que manipulemos el servicio suricata se colocará en modo IPS.


2.5.Des-configuración de firewall por defecto

Para poder configurar las reglas de iptables necesarias para que funcione y sea un poco mas cómoda la configuración del firewall local se opta por des-habilitar el servicio instalado por defecto, esto lo hacemos con el comando:


systemctl disable firewalld.service
systemctl stop firewalld.service


2.6.Habilitar el firewall basado en iptables

En el paso anterior se deshabilito el firewall por defecto, ahora se debe instalar el firewall clásico, esto lo podemos lograr con el siguiente comando:

yum -y install iptables-services.x86_64


2.7.Configuración de servicio de iptables

Lo primero que debemos hacer es configurar las reglas por defecto que trae el servicio, editaremos el archivo en la ruta "/etc/sysconfig/iptables" el contenido de dicho archivo debe ser igual al siguiente, las demás reglas se agregarán en secciones adelante.

# sample configuration for iptables service
# you can edit this manually or use system-config-firewall
# please do not ask us to add additional ports/services to this default configuration
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A FORWARD -j NFQUEUE
COMMIT


Es de importancia mencionar que estas son las reglas por defecto y es en donde se define la política a denegar, así como se hace el gancho de iptables para que el trafico forward sea manejado por suricata.

Adicionalmente vamos a separar las reglas de iptables en otro archivo, una mala practica inicialmente pero por cuestiones de ser practicos lo voy a hacer, ustedes pueden traducir estas reglas e insertarlas directamente sobre el archivo de iptables, si no hacen esto el reiniciar las reglas de iptables borrará las reglas personalizadas y los dejará sin IPS y sin servicios (no les iba a dejar todo tan fácil no?, pues si fácil pueden exportar las reglas de iptables con iptables-save y luego importarlas y con eso ya estarán cargadas en el archivo anterior, de nada :p)


3.Scripts adicionales
3.1.Script de suricata IPS


Todo sistema necesita de scripts para mejorar o para complementar su funcionalidad y en este caso no es la excepción por lo tanto se a creado un directorio dentro del "/root" llamado "scripts" el cual contiene dos archivos llamados "startsuricata.sh" y "updaterules.sh"; el contenido del primer archivo es el siguiente:


#!/bin/bash
# Activado de FORWARD de paquetes
echo 1 > /proc/sys/net/ipv4/ip_forward

#Reglas de PREROUTING
# segmento de ssh
iptables -t nat -F PREROUTING
iptables -t nat -I PREROUTING -s 200.x.x.x -d 192.168.10.2 -p tcp --dport 22 -j DNAT --to-destination 192.168.2.10

#segmento de servicio
iptables -t nat -I PREROUTING -d 192.168.10.2 -p tcp -m multiport --dports 80,443 -j DNAT --to-destination 192.168.2.10


#Reglas de postrouting o masquerading
iptables -t nat -F POSTROUTING
iptables -t nat -I POSTROUTING -o ens192 -j MASQUERADE



Nota 2: la maquina tiene dos interfaces de red una que apunta a la WAN que es ens192 y otra a la LAN ens224.

La primera sección activamos el forward de paquetes a nivel de kernel, sin esto el IPS y el firewall no funcionarán.

El segmento de PREROUTING es básicamente el direccionamiento interno del trafico acorde al mapeo de puertos.

La ultima sección hace referencia al enmascarado de salida del trafico, esto para que el trafico saliente se vea que es generado por el IPS y no se revele información de las máquinas internas.

Este script debe ser mencionado en el script de inicio del sistema "/etc/rc.local" el cual se debería ver de la siguiente forma (o utilizar el tip de exportar e importar de iptables ;)) :

#!/bin/bash
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
#
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
#
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
#
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.

/root/scripts/startsuricata.sh

touch /var/lock/subsys/local


3.2.Actualización de reglas de suricata con oinkmaster


El siguiente script es "updaterules.sh" el cual se encarga de la actualización de las reglas del IPS, esto es muy importante ya que unas horas pueden marcar la diferencia a la hora de comprometer un sistema; el contenido de dicho script es el siguiente:

#!/bin/bash
/etc/oinkmaster/oinkmaster.pl -C /etc/oinkmaster/oinkmaster.conf -o /etc/suricata/rules


Adicionalmente se debe agregar un contrab al sistema para que la tarea se automatice de lo contrario el script no servirá de nada, ejecutamos el comando "crontab -e" como usuario root y colocamos la siguiente linea:

0 */6 * * * /root/scripts/updaterules.sh

Esto actualizará las reglas de oinkmaster cada seis horas, adicionalmente aplicando las tareas internas de dicho software.


Junto con esto es recomendable hacer un restart de suricata para que refresque las reglas regularmente, esto no corta el trafico forward así que lo pueden hacer con tranquilidad.


Nota3: para un trafico de aproximadamente unos 50 MB/s se estan utilizando dos procesadores en un ambiente virtual y 2 GB de RAM.


Eso a sido todo por esta vez mis queridos lectores de ocasión, espero que le sea útil a alguien y si se puede mejorar el algo (claro que se puede mejorar, sobre todo las reglas de iptables o dejar a un lado iptables y hacer directamente con firewalld :)) son bienvenidos los comentarios.




jueves, 26 de marzo de 2015

Manual basico de instalación y configuración Zoneminder 1.28 en fedora 21

No voy a entrar en definiciones de que es y para que sirve zoneminder, para eso puedes ir a la pagina principal o buscar en otros sitios; Lo que haremos en este pequeño escrito es ver la instalación y configuración del mismo, así que manos a la obra.



[Nota de actualización a v1.29.0]

En el proceso de actualización nos va a dar errores nuevamente con los sockets de apache, el error es como el siguiente:

web_php[19063]: ERR [socket_sendto( /var/lib/zoneminder/sock/zms-329947s.sock ) failed: No such file or directory]

A lo cual debemos modificar nuestro zoneminder de la siguiente forma:

1) cambios en la interfaz web en el menú "Opciones->Rutas" en el campo "PATH_ZMS" y cambiar el valor a "/zoneminder/cgi-bin/zms"
2) El segundo cambio que debemos realizar es a nivel de la configuración del virtualhost de apache, en /etc/httpd/conf.d/zoneminder.conf en la linea

ScriptAlias /cgi-bin-zm "/usr/libexec/zoneminder/cgi-bin"

debemos modificarla de la siguiente forma:

ScriptAlias /zoneminder/cgi-bin "/usr/libexec/zoneminder/cgi-bin"


Reiniamos zoneminder y apache y con esto ya deberían tener funcionando nuevamente el streaming por el ambiente web

Ref: https://forums.zoneminder.com/viewtopic.php?f=34&t=24265&p=92469#p92469


1 Verificar el soporte

Lo primero que debemos tener en cuenta al momento de configurar zoneminder es el dispositivo de captura a usar y ver si esta soportada o al menos hay pruebas con el mismo, esto se puede verificar directamente en la pagina de zoneminder en donde ademas nos indican los ajustes que se le deben hacer a las cámaras.

2 Instalación

Una vez se haya verificado el soporte procedemos a la instalación, tenemos dos métodos para la instalación si bien lo podemos hacer a través de las fuentes, lo mas cómodo para la actualización son los repositorios; por lo cual vamos a utilizar uno en particular el cual nos ofrece las ultimas versiones. En este enlace están las instrucciones de como instalarlo.

2.1 Instalar repositorio y software base

Una vez instalado el repositorio se instala zoneminder y la base de datos mariadb el cual es un clon de mysql.

yum install zoneminder mariadb-server

2.2 Configuración de la base de datos

Ahora es necesario configurar la base de datos y el usuario en mariadb(mysql)
Lo primero que haremos será definir una contraseña al usuario root de la base de datos esto se hace de la siguiente forma:

2.2.1 Configuración de la contraseña del usuario root


mysqladmin -u root password 'mirootpass'

2.2.2 Ingresar a mariadb

mysql -u root -p
Enter password:

2.2.3 crear la base de datos

MariaDB [(none)]> create database zm;

2.2.4 Crear usuario y permisos

grant all on zm.* to zm@localhost identified by 'mizmpass';

Con esto ya tenemos creado el usuario y sus respectivos permisos, ahora debemos cargar la base de datos básica para que zoneminder inicie.

2.2.5 Cargar datos iniciales a la base de datos


Primero vamos al directorio en donde esta el script para inicializar la base de datos:

cd /usr/share/zoneminder/db/

Ahora cargaremos los datos a la base de datos de zoneminder:
mysql -u zm -p zm < zm_create.sql

Con esto ya se debe poder iniciar el servicio de zoneminder, tener en cuenta que la base de datos debe estar activa.

systemctl enable zoneminder.service
systemctl start zoneminder.service



2.2.6 Ajustes adicionales apache

Hay una particularidad con los scripts cgi de zoneminder y fedora, por lo cual hay que modificar la configuración de apache para que funcione correctamente, esto se hace editando el siguiente archivo:

vi /etc/httpd/conf/httpd.conf

Seguidamente buscamos la siguiente linea “#   ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
Con esta modificación terminamos la modificación de apache y procedemos a la configuración.

3 Configuración de zoneminder

3.1 Acceder a la administración

Con el servicio iniciado es hora de acceder a la configuración ingresando la ip en donde se instaló el servicio: http://127.0.0.1/zm



Como se puede observar se permite acceder directamente a la consola sin ningún tipo de autenticación lo cual se debe modificar ademas del idioma, a continuación veremos como modificar estos valores y agregar las cámaras y demás.

3.2 Activar autenticación y cambio de idioma

Hacemos click en el menú “options” y nos desplegá las opciones.


Guardamos los cambios y nos exige el reinicio de zoneminder

systemctl restart zoneminder.service

Ahora cuando se vuelve a intentar ingresar nos exige autenticarnos, el usuario y contraseña es “admin”.

3.3 Agregar una cámara

En la interfaz principal hacemos click en el botón “agregar nuevo monitor” lo cual nos despliega el siguiente menú.



A continuación la descripción de los campos:
Nombre: nombre descriptivo del monitor o como se va a identificar la camara.
Tipo de origen: como su nombre lo dice es como se va a acceder el dispositivo, si es esta conectado directamente al pc debería ser local, en caso que sea una camara ip sería remoto o ffmpeg; o depende de las instrucciones que se den en la wiki en donde se especifica como se deben ajustar estos valores.
Función: en este caso se debería colocar en “modec”, el cual solo graba cuando se detecta movimiento, en caso de querer solo el streaming se debería colocar en “monitor”, en caso de querer grabar solo lapsos de tiempo específicos se debería colocar en “record”, por utlimo se tiene la opción “mocord” la cual grabará continuamente.
Linked monitors: en esta opción se debería seleccionar las cámaras que se deberían activar en caso que en este monitor se presente una alarma, esto es particularmente útil cuando se esta monitoreando un pasillo o espacios los cuales tengan una sola entrada.
Máximos FPS: esto es útil cuando se tiene una cámara potente y un pc con poco rendimiento, lo que se hace es limitar el flujo de fotogramas desde la cámara y procesar solo la cantidad necesaria.
Un monitor configurado en esta pestaña quedaría de la siguiente forma, para una cámara que esta recibiendo un flujo rtsp; en este caso no hay monitores enlazados.



Ahora veremos la pestaña en donde se especifica el origen del dispositivo.






En este espacio es altamente recomendable consultar el hardware soportado ya que de allí tomaremos las instrucciones de configuración de cada dispositivo en particular, en el caso particular para una cámara TL-SC3130 tendremos las siguientes configuraciones para capturar el flujo rtsp.


3.4 Borrar las capturas antiguas

Uno de los puntos mas importantes y que son poco claros es el hecho de borrar la información que ya no es útil o que sencillamente es necesario liberar ese espacio en el disco, aun así la herramienta con la que cuenta para tal fin es muy versátil y podemos jugar muchos valores a la vez, la opción por la que debemos ingresar es por filtros.




Una vez dentro de filtro veremos algo como lo siguiente:

Ahora para crear un nuevo filtro y borrar los videos que sean mayores a 4 días, se deben seleccionar por “fecha”, “menor que” y escribir tal cual “-4 days”, seguidamente en las opciones a ejecutar se seleccionar “borrar todas las coincidencias”.



Ahora se guarda y sin olvidar de marcar la opción “ejecutar filtro en segundo plano” lo cual ejecutara dicho filtro periódicamente.



Con esto se terminaría una instalación básica de zonemider, no sobra mencionar los foros de zoneminder ya que son de mucha ayuda y cuentan con una comunidad muy activa.

Nota: se debe tener selinux desactivado ya que los módulos existentes no son totalmente compatibles para el correcto desempeño.