UNIX NetWork

Software, NetBSD, OpenBSD, FreeBSD, Security, NetworkJuly 6, 2007 2:06 am

Most people with a box on public IP, and with a sshd listening on port 22, notices a lot of bruteforce attempts. These attempts are filling up logs, and are a pure annoyance. Here’s how I “solved” it..

In OpenBSD 3.7, pf got a really nice feature called max-src-conn-rate, which specifies how quickly new connections can be made. Connecting hosts exceeding this limit can be put into a table, and all states including that hosts IP address, can also be flushed.

When I have the offending IPs in a table, it can easily be blocked early on in our ruleset. But since I don’t want to block a host forever, or even until the next reboot, I’m gonna use a small utility to clean out this table once in a while.

Let’s start with the magic pf rule:

# special rule for ssh
pass in on $ext_if proto tcp from any to ($ext_if) port ssh \
flags S/SA keep state \
(max-src-conn-rate 3/30, overload flush global)

The keyword here is ofcourse “max-src-conn-rate”. The arguments tell pf to put every IP exceeding a connection rate of more than 3 connections in every 30 seconds, in a table called “ssh-bruteforce”. How often do valid users connect to ssh that often? Ofcourse you can set this to 6/60 or something more apropriate for your environment. Last but not least pf kills all states originating from the bad host.

To keep the bad boys out, I add a block rule early on in my ruleset:

# block the ssh bruteforce bastards
block drop in quick on $ext_if from

Great, now the table are getting populated with bad hosts, and they’re getting blocked. But as I said earlier, I don’t want to block them forever. This is were expiretable comes in handy. This utility, written by Henrik Gustafsson, takes a look at a table, and removes (”expires”) entires older then the specified amount of time.

It’s in ports (sysutils/expiretable), but was commited after 3.8 was tagged, so you’ll have to go -current, or compile/install it by hand. Then add this to roots crontab:

*/5 * * * * /usr/local/sbin/expiretable -t 3600 ssh-bruteforce

Every five minutes, I expire entries older than one hour.

This is how I get rid of thousands of login attempts filling my logs.

NetBSD, OpenBSD, FreeBSD, Security, NetworkJune 30, 2007 8:21 pm

vamos a configurar pf en unos cuantos pasos :)

preparen su pf.conf temporal para trabajar en ese y no regarla en el principal

para validar que las reglas de PF esten bien escritas, pero sin cargarlas al sistema, se ejecuta lo siguiente:

$ pfctl -n -f myarchivopf.conf

ahora, en las primeras lineas deben de escribirse variables que se usaran en las reglas

para nuestro proposito, tendriamos solo 2 variables; una llamada red_internet y la otra red_lan

en esas apuntariamos el nombre de dispositivo de nuestras tarjetas de red: rl0, em0, vr0 o como se llame

en red_internet pondriamos el dispotivo de red que esta conectado hacia la Internet

para nuestro ejemplo pondremos la vr0

en red_lan pondriamos el dispositivo de red que esta conectado a nuestra red local

para nuestro ejemplo podremos la rl0

entonces, en nuestro pf.conf quedaria asi:

red_internet=”vr0″
red_lan=”rl0″

como todos sabemos, en UNIX existe el dispositivo loopback o lo0 que siempre apunta la IP 127.0.0.1; este es indispensable para que los procesos de nuestra maquina se comuniquen entre ellos

entonces, nuestro dispositivo lo0 no debe de estar regido por las reglas del firewall; entonces le diremos a PF que ignore y no ande chingando a nuestro loopback

entonces, la siguiente regla seria:

set skip on lo0

la primera regla de seguridad de un firewall, es que se bloqueen todo paquete que vaya entrar que este corrupto

todo paquete entrante incompleto o corrupto, que lo bloquee nuestro firewall

los paquetes extraños podrian ser algun xploit o vulnerabilidad que pueda afectar al firewall

ahora nuestra politica de filtrado en firewall seria: “bloquea TODOS los paquetes entrantes, y luego, deja pasar unicamente los que te vamos a permitir que pases”

para bloquear toda conexion entrante, nuestra siguiente regla en pf.conf seria:

block in all

no vayan a activar su pf.conf porque se van a desconectar de la red eh

ahora, como queremos que nuestras maquinas en la LAN se puedan comunicar entre estas y tambien el firewall pueda comunicarse con estas; vamos a abrir las conexiones de nuestra LAN

para eso, nuestra siguiente instruccion en nuestro pf seria:

pass quick on $red_lan

recuerden que $red_lan es un llamado de nuestra variable que apunta a nuestro dispositivo de red que esta conectado a la red local

nuestras siguientes reglas; seria, el redirigir las conexiones de entrada a nuestro servidor web

nuestra regla seria: redirige las conexiones entrantes de nuestra tarjeta de red de Internet que provengan de cualquier direccion que pidan el puerto 80 (www) y que las mande a tal IP

entonces, en nuestro pf pondriamos:

rdr on $red_internet proto tcp from any to any port www -> 200.33.45.111 port www

esa es una opcion

la otra forma de ponerla seria:

rdr on $red_internet proto tcp from any to any port 80 -> 200.33.45.111

la ultima que acabo de poner, por logica, dice que las conexiones entrantes por el puerto 80 se las mande a 200.33.45.111; la maquina de esa IP sabe que es una peticion al puerto 80

la del servidor NetBSD que se supone tiene una IP publica asignada

si el firewall y el servidor es el mismo equipo; entonces no seria necesario redirigir

para el caso que, en vez de rdr seria

pass in quick on $red_internet proto tcp from any to port www

ahora, podriamos tener el caso de que nuestro Firewall tenga la IP publica, pero que nuestro servidor web esta en un equipo dentro de nuestra red local; la regla seria:

rdr on $red_internet proto tcp from any to 200.33.45.111 port www -> 192.168.1.4 port www
ahora viene la regla que usaremos para nuestro caso de 2 servidores Web detras de un firewall

suponemos que nuestro servidor NetBSD es 200.33.45.111 y nuestro servidor Debian es 200.33.45.20

serian 2 reglas de redireccion, en nuestro pf.conf estaria asi:

rdr on $red_internet proto tcp from any to 200.33.45.111 port www -> 200.33.45.111 port www

rdr on $red_internet proto tcp from any to 200.33.45.20 port www -> 200.33.45.20 port www

recordemos que en un paquete TCP, siempre vienen los datos del remitente y el destinatario; nuestro Firewall lee los datos del paquete, lee el destinatario y lo manda a donde le corresponde

ahora, hay que probar esas reglas en el firewall; para activar nuestras reglas, se usaria:

# pfctl -e -f mi_pf.conf

si hay broncas, la desactivamos con:

# pfctl -d
una vez que se vio que funciona; hay que activar en /etc/sysctl.conf:

net.inet.ip.forwarding=1

net.inet6.ip6.forwarding=1

y en nuestro /etc/rc.conf:

pf=YES

pf_rules=/etc/pf.conf

y listo ya tenemos funcionando nuestro PF :)

=============================================================================

especial thanks to Hokum :)

NetBSD, OpenBSD, FreeBSDApril 29, 2007 10:56 pm

http://www.zencast.com/channels/showchannel.asp?mc=1&cid=10474

http://bsdtalk.blogspot.com/

NetBSD, OpenBSD, FreeBSDApril 8, 2007 12:06 am

Un portal de BSD en español, muy bien echo :)

http://www.bsdcordoba.com.ar/

NetBSD, OpenBSD, FreeBSDMarch 27, 2007 4:07 pm


A todos los amantes de la seguridad y a los que les gustan los sistemas BSD, aqui esta un libro muy bueno donde encontraran muchas cosas relacionadas a la seguridad y en especial para los sistemas BSD. :)

FreeBSDFebruary 22, 2007 11:28 pm

primero ponemos

#echo “apache22_enable=”YES”" >> /ect/rc.conf

y vamos con mysql

cd /usr/ports/databases/mysql41-server

o el mysql server que gusten

cd /usr/ports/databases/

luego un ls

y ver q versiones de mysql server trae esto x si no quieres la 4.1

bueno ya accedes al mysqlVERSION-server que gustes instalar

y haces un

#make install clean

cd /usr/ports/databases/php5-mysql

#make install clean

cd /usr/ports/www/php5-session

#make install clean

cd /usr/ports/graphics/php5-gd

#make isntall clean

luego

echo ‘mysql_enable=”YES”‘ >> /etc/rc.conf

/usr/local/etc/rc.d/mysql-server start

ahora nos falta agregar al httpd.conf las siguientes lineas

LoadModule php5_module
libexec/apache/libphp5.so

antes de hacer eso checa si no ya te lo agrego el php solito

para probar que el php esta funcinando hacemos un

#touch test.php

#echo “< ? phpinfo(); ?>” >> test.php

y lsito.

FreeBSD Apache Mysql PHP5 :)

FreeBSDFebruary 21, 2007 1:03 am

Encontraremos el “named.conf” situado en “/etc/namedb” lo podemos configurar a nuestro gusto, yo lo he dejado asi:

options {
directory “/etc/namedb”;
pid-file “/var/run/named/pid”;
dump-file “/var/dump/named_dump.db”;
statistics-file “/var/stats/named.stats”;
listen-on { IPLOCAL; };
};
zone “.” {
type hint;
file “named.root”;
};
zone “0.0.127.IN-ADDR.ARPA” {
type master;
file “master/localhost.rev”;
};
zone “subnacion.com” {
type master;
file “master/subnacion.com”;
};

Para crear las local zone debeis ejecutar situado en /etc/named el siguiente script:

sh make-localhost

No respondera nada al ejecutarse. Pero habra creado los archivos de las zonas locales.

Aquí tenéis como se deben escribir las zonas de los DNS Server situadas en “/etc/namedb/master/subnacion.com” en este caso. Como podeis observar se puede situar en el sitio donde mas te guste haciendo un par de retoques a la configuracion.

$TTL 3600
subnacion.com. IN SOA ns0.subnacion.com. admin.subnacion.com. (
1055026205
6H
1H
5D
20M )
subnacion.com. IN A x.x.x.x
mysql.subnacion.com. IN A x.x.x.x
www.subnacion.com. IN CNAME subnacion.com.
ns1.subnacion.com. IN A x.x.x.x
ns2.subnacion.com. IN A x.x.x.x
subnacion.com. IN NS ns0.subnacion.com.
unixgeneration.com. IN NS ns1.subnacion.com.
mail.subnacion.com. IN MX 1 subnacion.com.

Por lo demas, solo teneis que modificar las x.x.x.x por las IP de los servidores. Para comprobar el estado de la configuracion y las zonas:

named-checkconf -z /etc/namedb/named.conf
named-checkzone subnacion.com /etc/namedb/master/subnacion.com

En caso de que todo este perfectamente bien configurado podemos añadir en rc.conf el siguiente texto para que arranque el demonio automaticamente cuando se ejecuten los “scripts de rc”, incluido cuando arranque el ordenador:

named_enable=”YES”

Y ahora podemos arrancar el demonio de named:

/etc/rc.d/named start