Freeradius + mysql en debian squeeze

Hoy toca instalar un freeradius en un cliente, para authenticar los accesos de unos hotspots Mikrotik.

Para la parte gráfica, usaremos el DaloRadius… de esta manera, no tendremos que andar con los ficheros de texto.

Suponemos que tenemos instalado ya nuestro Debian Squeeze y, vamos a instalar unos paquetes:


# aptitude install mysql-server php5 php5-mysql php5-gd php-pear php-db freeradius freeradius-mysql subversion

Creamos usuario para mysql y la bbdd para radius:


# mysql -u root -ppassword
mysql> GRANT ALL PRIVILEGES ON *.* TO 'radius'@'%' IDENTIFIED BY 'radius' WITH GRANT OPTION;
FLUSH PRIVILEGES;
mysql> create database radius;

Ahora bajamos el DaloRadius, en la carpeta /usr/src:


# cd /usr/src
# svn co https://daloradius.svn.sourceforge.net/svnroot/daloradius/trunk daloradius

Ahora movemos los directorios:


# cp daloradius/ /var/www -R
# chown www-data:www-data /var/www/daloradius -R
# chmod 644 /var/www/daloradius/library/daloradius.conf.php

Creamos la estructura de la BBDD de radius:


root@radius:/var/www/daloradius/contrib/db# mysql -u radius -pradius radius < fr2-mysql-daloradius-and-freeradius.sql

Editamos el fichero de configuración de daloRadius, para que se conecte a mysql:


# nano /var/www/daloradius/library/daloradius.conf.php

$configValues['CONFIG_DB_ENGINE'] = 'mysql';
$configValues['CONFIG_DB_HOST'] = 'localhost';
$configValues['CONFIG_DB_PORT'] = '3306';
$configValues['CONFIG_DB_USER'] = 'radius';
$configValues['CONFIG_DB_PASS'] = 'radius';
$configValues['CONFIG_DB_NAME'] = 'radius';

Ahora vamos modificando los ficheros de freeradius, para que se conecte a mysql.

En el directorio /etc/freeradius, editamos sql.conf y lo dejamos tal que:


sql {
#
# Set the database to one of:
#
# mysql, mssql, oracle, postgresql
#
database = "mysql"

#
# Which FreeRADIUS driver to use.
#
driver = "rlm_sql_${database}"

# Connection info:
server = "localhost"
#port = 3306
login = "radius"
password = "radius"

El siguiente paso, es que las consultas de usuarios, en vez de mirar en los ficheros locales, haga las consultas en las tablas de mysql. Para ello, modificaremos el fichero:


root@radius:/etc/freeradius/sites-enabled# nano default

Y modificamos:

### authorization Section
#
# Look in an SQL database. The schema of the database
# is meant to mirror the "users" file.
#
# See "Authorization Queries" in sql.conf
sql

### accounting section
#
# Log traffic to an SQL database.
#
# See "Accounting queries" in sql.conf
sql

Y en el fichero /etc/freeradius/radiusd.conf, habilitamos la parte de sql:


# Include another file that has the SQL-related configuration.
# This is another file only because it tends to be big.
#
$INCLUDE sql.conf

Por último, modificamos el fichero clients.conf, con el NAS localhost y una pass para probar .... (nas := network access server 😉 ) y lo dejamos tal que:


# -*- text -*-
##
## clients.conf -- client configuration directives
##
## $Id$

#######################################################################
#
# Define RADIUS clients (usually a NAS, Access Point, etc.).

client localhost {
ipaddr = 127.0.0.1
secret = testing123
nastype = other # localhost isn't usually a NAS...
}

Creamos ahora, desde la interfaz daloRadius, un usuario, para ello, accedemos al daloradius wía web:

http://ip.del.servidor.radius/daloradius

Y nos aparecerá algo tal que:

Usuario: administrator
pass: radius

En el apartado Management / Users , hacemos click en New User

Creamos un usuario, con su password y lo probaremos en la consola.

Paramos el servicio freeradius


# /etc/init.d/freeradius stop

Lanzamos el servicio en modo debug:


# freeradius -X

............
Module: Checking session {...} for more modules to load
Module: Checking post-proxy {...} for more modules to load
Module: Checking post-auth {...} for more modules to load
} # modules
} # server
radiusd: #### Opening IP addresses and Ports ####
listen {
type = "auth"
ipaddr = *
port = 0
}
listen {
type = "acct"
ipaddr = *
port = 0
}
listen {
type = "auth"
ipaddr = 127.0.0.1
port = 18120
}
Listening on authentication address * port 1812
Listening on accounting address * port 1813
Listening on authentication address 127.0.0.1 port 18120 as server inner-tunnel
Listening on proxy address * port 1814
Ready to process requests.

Y ahora desde otra consola, hacemos una prueba con la utilidad radtest :


root@radius:~# radtest pruebas pruebas01 localhost:1812 0 testing123
Sending Access-Request of id 49 to 127.0.0.1 port 1812
User-Name = "pruebas"
User-Password = "pruebas01"
NAS-IP-Address = 127.0.1.1
NAS-Port = 0
rad_recv: Access-Accept packet from host 127.0.0.1 port 1812, id=49, length=20
root@radius:~#

Nuestros datos:

Username: pruebas
pass:pruebas01
NasKey:testing123 (lo hemos puesto en el apartado nas, anteriormente, en localhost
Puerto Radius: 1812

Y el freeradius, nos responde con:


Ready to process requests.
rad_recv: Access-Request packet from host 127.0.0.1 port 37927, id=49, length=59
User-Name = "process"
User-Password = "control10"
NAS-IP-Address = 127.0.1.1
NAS-Port = 0
# Executing section authorize from file /etc/freeradius/sites-enabled/default
+- entering group authorize {...}
++[preprocess] returns ok
++[chap] returns noop
++[mschap] returns noop
++[digest] returns noop
[suffix] No '@' in User-Name = "pruebas", looking up realm NULL
[suffix] No such realm "NULL"
++[suffix] returns noop
[eap] No EAP-Message, not doing EAP
++[eap] returns noop
++[files] returns noop
[sql] expand: %{User-Name} -> pruebas
[sql] sql_set_user escaped user --> 'pruebas'
rlm_sql (sql): Reserving sql socket id: 4
[sql] expand: SELECT id, username, attribute, value, op FROM radcheck WHERE username = '%{SQL-User-Name}' ORDER BY id -> SELECT id, username, attribute, value, op FROM radcheck WHERE username = 'pruebas' ORDER BY id
[sql] User found in radcheck table
[sql] expand: SELECT id, username, attribute, value, op FROM radreply WHERE username = '%{SQL-User-Name}' ORDER BY id -> SELECT id, username, attribute, value, op FROM radreply WHERE username = 'pruebas' ORDER BY id
[sql] expand: SELECT groupname FROM radusergroup WHERE username = '%{SQL-User-Name}' ORDER BY priority -> SELECT groupname FROM radusergroup WHERE username = 'pruebas' ORDER BY priority
rlm_sql (sql): Released sql socket id: 4
++[sql] returns ok
++[expiration] returns noop
++[logintime] returns noop
++[pap] returns updated
Found Auth-Type = PAP
# Executing group from file /etc/freeradius/sites-enabled/default
+- entering group PAP {...}
[pap] login attempt with password "pruebas01"
[pap] Using clear text password "pruebas01"
[pap] User authenticated successfully
++[pap] returns ok
# Executing section post-auth from file /etc/freeradius/sites-enabled/default
+- entering group post-auth {...}
++[exec] returns noop
Sending Access-Accept of id 49 to 127.0.0.1 port 37927
Finished request 0.
Going to the next request
Waking up in 4.9 seconds.
Cleaning up request 0 ID 49 with timestamp +177
Ready to process requests.

Y vemos como hace la consulta en mysql.

Enjoy your radius 😉

Backups automatizados en Cisco IOS

En esta ocasión, aprovechando una funcionalidad de las IOS cisco > 12.3, automatizaremos los backups de nuestras configuraciones.

Para ello, necesitamos:

1º) Servidor TFTP accesible
2º) Acceso a la consola del router

En esta ocasión, programaremos que cada viernes a las 22:00 la copia de la configuración de nuestros routers, para ello, entraremos en la consola y teclearemos:

r01(config)#kron occurrence copiaViernes at 22:00 Fri recurring
r01(config-kron-occurrence)#policy-list respaldo_config
Kron: Policy Accepted, Policy respaldo_config needs to be configured
r01(config-kron-occurrence)#kron policy-list respaldo_config
r01(config-kron-policy)#cli show running-config | redirect tftp://ip.de.srv.tftp/cisco_config.txt
r01(config-kron-policy)#exit

Y con esto ya tenemos nuestro plan de copias de config 😉

Añadiendo seguridad con IPTABLES

Otra entrada que es un apunte.

Estos días, por cuestiones técnicas y de un proyecto donde estoy colaborando, he tenido que unir mi debian / asterisk a un grupo, mediante el software vpn TINC.

La instalación del tinc es sencilla y funciona muy bien, pero mi máquina es completamente accesible desde el otro extremo de la red. No es que no me fie, pero no suelo dejar mis equipos expuestos al exterior; manias personales.

Bien, tras analizar los puertos que debo dejar abiertos, me hice una lista:

– permitir tráfico SIP/UDP (5060 udp) – abierto
– permitir tráfico RTP VoIP (udp 10000 .. 20000) – abierto
– permitir openLdap (en local) – abierto
– permitir SSH en mi redLocal (TCP 22)
– permitir MySQL en mi redLocal (TCP 3306)
– permitir TINC (655 tcp /udp)
– permitir www (80 tcp)
– permitir dundi (4520 tcp/udp)
– permitir tftp (udp 69)
– permitir syslog (udp 514)
– permitir icmp echo-reply
– permitir icmp unracheable
– permitir icmp echo-request
– permitir icmp unracheable
– permitir SMB en red Local

Una vez tenemos las reglas, vaciamos las reglas ip tables :

# iptables -F
# iptables -X

Y ahora hacemos un copy&paste de las reglas en la consola, quedando tal que:

# permitimos tráfico de loopback
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# permitimos tipos de icmp
iptables -A INPUT -i eth1 -p icmp –icmp-type destination-unreachable -j ACCEPT
iptables -A INPUT -i eth1 -p icmp –icmp-type time-exceeded -j ACCEPT
iptables -A INPUT -i eth1 -p icmp –icmp-type echo-reply -j ACCEPT
iptables -A INPUT -i eth1 -p icmp –icmp-type echo-request -j ACCEPT
# permitimos icmp en interface PLN /tinc
iptables -A INPUT -i pln -p icmp –icmp-type destination-unreachable -j ACCEPT
iptables -A INPUT -i pln -p icmp –icmp-type time-exceeded -j ACCEPT
iptables -A INPUT -i pln -p icmp –icmp-type echo-reply -j ACCEPT
iptables -A INPUT -i pln -p icmp –icmp-type echo-request -j ACCEPT
# reglas
#### reglas dundi ###
iptables -A INPUT -p udp -m udp –dport 4520 -j ACCEPT
iptables -A INPUT -p tcp –dport 4520 -j ACCEPT
# reglas sip, iax, rtp #
iptables -A INPUT -p udp -m udp –dport 5060 -j ACCEPT
iptables -A INPUT -p udp -m udp –dport 4569 -j ACCEPT
iptables -A INPUT -p udp -m udp –dport 10000:20000 -j ACCEPT
# reglas syslog #
iptables -A INPUT -p udp -m udp –dport 514 -j ACCEPT
# reglas tftp #
iptables -A INPUT -p udp -m udp –dport 69 -j ACCEPT
# reglas tinc #
iptables -A INPUT -p udp -m udp –dport 655 -j ACCEPT
iptables -A INPUT -p tcp –dport 655 -j ACCEPT
# reglas trafico www #
iptables -A INPUT -p tcp –dport 80 -j ACCEPT
# reglas ssh #
iptables -A INPUT -p tcp –dport 22 -s 192.168.2.0/24 -j ACCEPT
iptables -A INPUT -p tcp –dport 22 -s 127.0.0.0/8 -j ACCEPT
iptables -A INPUT -p tcp –dport 22 -j DROP
# reglas mysql
iptables -A INPUT -p tcp –dport 3306 -s 192.168.2.0/24 -j ACCEPT
# reglas ldap
iptables -A INPUT -p tcp –dport 389 -s 192.168.2.0/24 -j ACCEPT
# reglas SMB
iptables -A INPUT -p udp –dport 137 -s 192.168.2.0/24 -j ACCEPT
iptables -A INPUT -p udp –dport 138 -s 192.168.2.0/24 -j ACCEPT
iptables -A INPUT -p tcp –dport 139 -s 192.168.2.0/24 -j ACCEPT
iptables -A INPUT -p tcp –dport 445 -s 192.168.2.0/24 -j ACCEPT
iptables -A INPUT -p udp –dport 445 -s 192.168.2.0/24 -j ACCEPT
# el resto, rechazamos
iptables -A INPUT -j REJECT

Y con esto, añadimos un granito más de seguridad en nuestra red.