Hace unos días hablaba con un amigo que realmente sabe de Asterisk y le comentaba que quería implementar algo de seguridad extra en mi servidor, especialmente para los script-kiddies que se dedican a intentar loguearse via SSH con ataques de fuerza bruta.
En mi caso, utilizo la última versión de Elastix , que incorpora Logwatch ya configurado para que nos envíe un correo local sobre la actividad en nuestro servidor.
Para quien no sepa, Logwatch es un programa que se encarga de verificar los logs del sistema y darnos aviso ya sea mediante un correo local, o directamente a una cuenta de correo. (Siempre y cuando tengamos salida por SMTP)
Se instala en Debian con aptitude install logwatch, y en mi caso en CentOS con yum install logwatch
Siguiendo con la idea de securizar el servidor se me había ocurrido como primer medida instalar un Honeypot para SSH así los nenes se cansaban de probar y probar, mientras el tráfico verdadero se establecía en otro puerto.
Como honeypot SSH utilicé Kippo .
Como segunda medida, en caso que "descubrieran" el verdadero puerto donde corría SSH necesitaba algo que no sólo logueara a los picarones atacantes, sino que también los bloqueara.
Logwatch lo único que me hace es registrarme intentos fallidos de logueo en los distintos tipos de servicios instalados, debajo un ejemplo como para ilustrar cómo funciona:
################### Logwatch 7.3 (03/24/06) ####################
Processing Initiated: Thu Jun 30 10:54:15 2011
Date Range Processed: yesterday
( 2011-Jun-29 )
Period is day.
Detail Level of Output: 0
Type of Output: unformatted
Logfiles for Host: xxx.com.ar
##################################################################
--------------------- httpd Begin ------------------------
Requests with error response codes
401 Unauthorized
/admin/config.php: 2 Time(s)
404 Not Found
/modules/pbxadmin/js/script.legacy.js: 2 Time(s)
---------------------- httpd End -------------------------
--------------------- pam_unix Begin ------------------------
runuser-l:
Unknown Entries:
session closed for user cyrus: 1 Time(s)
session opened for user cyrus by (uid=0): 1 Time(s)
sshd:
Authentication Failures:
root (urban.atmos.pccu.edu.tw): 29 Time(s)
root (60.216.12.25): 27 Time(s)
root (server2.tanintechnology.net): 25 Time(s)
root (94.102.213.133): 4 Time(s)
unknown (server2.tanintechnology.net): 4 Time(s)
bin (server2.tanintechnology.net): 3 Time(s)
unknown (urban.atmos.pccu.edu.tw): 3 Time(s)
Invalid Users:
Unknown Account: 7 Time(s)
---------------------- pam_unix End -------------------------
--------------------- postfix Begin ------------------------
28443 bytes transferred
4 messages sent
4 messages removed from queue
Database files are not up-to-date (probably rehash is needed): 1 File(s), 1 Time(s)
**Unmatched Entries**
975C52B8AD7: to=, orig_to=, relay=local, delay=0.34, delays=0.03/0/0/0.31, dsn=5.1.1, status=bounced (unknown user: "faxmaster")
975C52B8AD7: sender non-delivery notification: ECB932B8AD8
---------------------- postfix End -------------------------
--------------------- Connections (secure-log) Begin ------------------------
New Users:
vnstat (101)
New Groups:
vnstat (102)
---------------------- Connections (secure-log) End -------------------------
--------------------- SSHD Begin ------------------------
Failed logins from:
60.216.12.25: 27 times
94.102.213.133: 4 times
140.137.32.110 (urban.atmos.pccu.edu.tw): 29 times
184.107.18.248 (server2.tanintechnology.net): 28 times
Illegal users from:
140.137.32.110 (urban.atmos.pccu.edu.tw): 3 times
184.107.18.248 (server2.tanintechnology.net): 4 times
Users logging in through sshd:
root:
192.168.1.100: 1 time
Received disconnect:
11: Bye Bye : 95 Time(s)
**Unmatched Entries**
pam_succeed_if(sshd:auth): error retrieving information about user cvs : 1 time(s)
pam_succeed_if(sshd:auth): error retrieving information about user jack : 1 time(s)
pam_succeed_if(sshd:auth): error retrieving information about user nagios : 3 time(s)
pam_succeed_if(sshd:auth): error retrieving information about user test : 1 time(s)
pam_succeed_if(sshd:auth): error retrieving information about user http : 1 time(s)
---------------------- SSHD End -------------------------
--------------------- vsftpd-messages Begin ------------------------
User FTP Logins:
(192.168.1.100): ****** - 2 Time(s)
Incoming FTP Files:
/videos_df.avi < - 192.168.1.100 (User: *******)
(Los asteriscos los pongo para ocultar el nombre de usuario, en el log sale el usuario)
TOTAL KB IN: 215771KB (210MB)
---------------------- vsftpd-messages End -------------------------
--------------------- XNTPD Begin ------------------------
**Unmatched Entries**
sendto(198.137.202.16) (fd=21): Invalid argument: 84 time(s)
sendto(216.45.57.38) (fd=21): Invalid argument: 84 time(s)
sendto(169.229.70.64) (fd=21): Invalid argument: 84 time(s)
---------------------- XNTPD End -------------------------
--------------------- yum Begin ------------------------
Packages Installed:
vnstat-1.6-1.el5.i386
---------------------- yum End -------------------------
--------------------- Disk Space Begin ------------------------
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup01-LogVol00
71G 6.0G 61G 9% /
/dev/hda1 99M 12M 82M 13% /boot
---------------------- Disk Space End -------------------------
###################### Logwatch End #########################
Como podemos ver hubo varios intentos fallidos de logueo como root en SSH.
Tiene la particularidad de no tener que tocar ni agregar nada, por ejemplo .. el Servidor de FTP (vsftpd) lo instalé hace unos días y automáticamente va y busca en los logs para botonearme día a día vía correo..
Pero bueno, ya vimos que podemos empezar por instalar logwatch como para enterarnos qué sucede en nuestro sistema ..
Luego de instalar y configurar logwatch me puse a investigar algo que bloquee un rango de ips y encontré esto:
#!/bin/bash
### Block all traffic from AFGHANISTAN (af) and CHINA (CN). Use ISO code ###
ISO=af cn"
### Set PATH ###
IPT=/sbin/iptables
WGET=/usr/bin/wget
EGREP=/bin/egrep
### No editing below ###
SPAMLIST=countrydrop"
ZONEROOT=/root/iptables"
DLROOT=http://www.ipdeny.com/ipblocks/data/countries"
cleanOldRules(){
$IPT -F
$IPT -X
$IPT -t nat -F
$IPT -t nat -X
$IPT -t mangle -F
$IPT -t mangle -X
$IPT -P INPUT ACCEPT
$IPT -P OUTPUT ACCEPT
$IPT -P FORWARD ACCEPT
}
# create a dir
[ ! -d $ZONEROOT ] && /bin/mkdir -p $ZONEROOT
# clean old rules
cleanOldRules
# create a new iptables list
$IPT -N $SPAMLIST
for c in $ISO
do
# local zone file
tDB=$ZONEROOT/$c.zone
# get fresh zone file
$WGET -O $tDB $DLROOT/$c.zone
# country specific log message
SPAMDROPMSG=$c Country Drop"
# get
BADIPS=$(egrep -v "^#|^$" $tDB)
for ipblock in $BADIPS
do
$IPT -A $SPAMLIST -s $ipblock -j LOG --log-prefix "$SPAMDROPMSG"
$IPT -A $SPAMLIST -s $ipblock -j DROP
done
done
# Drop everything
$IPT -I INPUT -j $SPAMLIST
$IPT -I OUTPUT -j $SPAMLIST
$IPT -I FORWARD -j $SPAMLIST
# call your other iptable script
# /path/to/other/iptables.sh
exit 0
El anterior script lo que hace es bloquear directamente un rango de ips gigante ..
Pero no sirve, no porque no funcione, sino porque no le encuentro sentido a bloquear absolutamente todo, eso no es securizar un servidor, es simplemente ser paranoico ..
Entonces me topé con un amigo que me tiró un script hecho por él, este "pibe" no es ni más ni menos que uno de los desarrolladores de X-wrt - Fabian Omar Franzotti (fofware)
El script se llama logtrigger
Veamos una descripción de lo que es:
Fue escrito para correr en embedded linux como OpenWRT por tal motivo es pequeño, pero funciona muy bien en sistemas más grandes con linux, realizando una tarea muy especifica leer los registros de logs de otros programas y/o servicios para poder lanzar procesos externos cuando uno de estos registros coincide con una regla creada.
Logtrigger lee cada evento registrado, extrae información del mismo y la publica en variables de sistema para que pueda ser leida por un proceso externo llamado por Logtrigger.
Esto lo hace muy flexible y con un gran potencial ya que los procesos pueden ser escritos en cualquier lenguaje de script o programación dándole la posibilidad de automatizar infinidad de tareas en el momento en que el evento sucede.
Todo administrador de un host o una red, en ocasiones necesita leer archivos de logs para poder encontrar porque sucedieron algunas cosas o realizar procesos de mantenimiento cada vez que un error o evento fue registrado en el sistema.
Con Logtrigger ya no necesitará revisar archivos de eventos para ejecutar los procesos necesarios.
Logtrigger lo hace por Ud.
Muchos de estos procesos pueden ser realizados con CRON pero esto puede que sobrecargue mucho nuestro procesador o que la acción llegue tarde, (ej.: un ataque a nuestro ssh, asterisk, o algún otro porceso, donde estan tratando de robarnos una cuenta), ya que en el momento en que CRON ejecuta el proceso esto ya terminó.
Como Logtrigger puede lanzar procesos especificos ante cada evento se convierte en una herramienta de gran ayuda para:
Analizar Eventos
Detección de Errores
Mantenimiento
Seguridad
Auxiliar de otros procesos
Entonces pasando en limpio, lo que hace logtrigger es analizar los logs de los distintos tipos de servicios y actuar en consecuencia ante determinadas alertas..
Por ejemplo, si un usuario intenta loguearse a nuestro SSH y no logra conectarse tras 5 intentos, logtrigger directamente bloquea el puerto que utiliza SSH para la ip de ese usuario, del mismo modo actúa ante logins fallidos en nuestro Asterisk, que es lo que me interesaba a mi

Lo podemos correr de 2 formas, una con el "debug" activado
logtrigger -D 5
O directamente lo dejamos corriendo y ante algún evento nos guardará el log en /tmp/blockedip
logtrigger &
Imagen de cómo funciona al recibir un login incorrecto en nuestro Asterisk
Bueno si, todo muy lindo pero entonces qué onda, qué instalo ?
Yo, recomiendo tener instalado
1) logwatch
2) kippo (honeypot ssh)
3) logtrigger
4) iptables
Y listo, con eso ya estaríamos un poquito más seguros ..