Algo de Linux: febrero 2012

miércoles, 29 de febrero de 2012

flashrom: Flashear BIOS desde linux

flashrom (http://flashrom.org), cito textualmente: "es una herramienta que nos permite identificar, leer, escribir, verificar y borrar chips flash".

Esta utilidad ha sido diseñada, no sólo para flashear la BIOS de nuestra placa base, sino también para modificar memorias flash de tarjetas de red, tarjetas gráficas y controladoras de almacenamiento entre otras cosas.

Con ella podremos hacer backups de la BIOS de nuestro equipo y restaurarlos, sin tener que recurrir a un floppy dos, pudiendo:
  • identificar el chip de la BIOS de nuestro equipo.
  • hacer un backup de nuestra rom.
  • flashear la bios.
  • verificar si la escritura se ha realizado correctamente.
  • y borrar los ajustes.
Soporta una gran cantidad de dispositivos: Más de 284 flash chips, 173 chipsets, 306 mainboards, 50 PCI devices, 9 USB devices y varios programadores de puerto serie/paralelo.

Además, para flashear un chip, no necesitamos acceso local a la máquina. Podemos hacerlo remotamente flasheando un sistema en funcionamiento, de manera que los cambios se aplicarán la próxima vez que se inicie la máquina.

Soporta DOS, Linux, FreeBSD, NetBSD, OpenBSD, DragonFly BSD, Solaris, Mac OS X,  y otros sistemas operativos basados en Unix. Windows lo soporta de forma parcial, de manera que es necesario aplicar un parche para tener soporte completo.

Esta herramienta se encuentra disponible en los repositorios de Debian, por lo que instalarla es muy sencillo:

# apt-get install flashrom 

Para usarla es necesario tener privilegios de root.

Si ejecutamos flashrom sin parámetros, la herramienta identificará nuestro chipset/placa base/chip BIOS:  

# flashrom

Si queremos hacer un backup de nuestra rom, ejecutaremos flashrom con el parámetro -r, indicando el nombre del archivo en el que vamos a guardar el volcado de la rom:  

# flashrom -r backup.bin 

Y si queremos flashear y verificar nuestra rom con una imagen de la bios en un archivo:  

# flashrom -wv biosnec.bin 

El parámetro -w sirve para indicar que vamos a escribir la rom con el contenido de un fichero. El parámetro -v sirve para verificarlo. Para más información:

# man flashrom

martes, 28 de febrero de 2012

Freeradius en Debian para autenticación wifi en los IES de Extremadura

En marzo de 2010 publiqué un documento acerca de cómo montar un servidor radius con ZeroShell para autenticación de clientes inalámbricos. Aunque esta instalación estaba muy bien por varias razones, empecé a trabajar en otra idea  que me permitiera autenticar los clientes con los datos de los usuarios del servidor ldap del centro.

Desde entonces, he ido adaptando y mejorando poco a poco el sistema para que la autenticación se haga mediante WPA2 Enterprise + EAP-TTLS/PAP + FREERADIUS en Debian.

A continuación dejo un enlace a un pdf basado en la experiencia de cómo lo he ido montando.



En cuanto a los archivos necesarios para montar el sistema están aquí:
https://www.box.com/s/2f3eb9e6f75c7c177c0f


Esta infraestructura es la que tengo actualmente funcionando en mi centro para controlar el acceso inalámbrico.

miércoles, 22 de febrero de 2012

FreeMyBlackBerry.com: Un servicio gratuito para liberar vuestra BlackBerry

No me gustan las BlackBerry con esas teclas tan pequeñas y juntas, pero aprovechando que he tenido que liberar una, os recomiendo FreeMyBlackBerry (http://www.freemyblackberry.com/). La gente de FreeMyBlackBerry nos ofrece la posibilidad de liberar la BlackBerry de forma totalmente gratuita vía MEP/MEP2.

Aquí encontraréis las instrucciones a seguir, dependiendo del modelo que tengáis: http://www.freemyblackberry.com/instructions.html

Lo he probado y funciona. En menos de 24 horas, me enviaron el código MEP2 con el que pude liberar el dispositivo.

viernes, 17 de febrero de 2012

Error "not authorized" en el automontaje de usb

Algún compañero se ha encontrado con el problema de que al conectar un pendrive, no se produce el automontaje del dispositivo y se muestra un mensaje en pantalla, que dice "Not authorized". 

Por lo que he leído, este error se produce, después de alguna actualización de paquetes, tanto en Nautilus, como en PcManFm o Thunar. 

He visto el error en algún equipo, pero lo cierto es que no se me ha vuelto a dar tras hacer un upgrade.

Buscando por ahí se ofrecen varias formas de solucionar el problema. Una que sí he probado y funciona es crear un fichero de polkit en el que definamos los permisos de acceso a los dispositivos del grupo plugdev:

# cat /etc/polkit-1/localauthority/50-local.d/55-storage.pkla


[Storage Permissions]
Identity=unix-group:plugdev
Action=org.freedesktop.udisks.filesystem-mount;org.freedesktop.udisks.drive-eject;org.freedesktop.udisks.drive-detach;org.freedesktop.udisks.luks-unlock;org.freedesktop.udisks.inhibit-polling;org.freedesktop.udisks.drive-set-spindown
ResultAny=yes
ResultActive=yes
ResultInactive=no

Ya tenía resuelto este problema y tras alguna actualización de paquetes me ha vuelto a aparecer el dichoso "Not authorized". Parece un bug de consolekit.

Ejecutando:

# ck-list-sessions

He visto que la sesión me aparecía active = FALSE:

Session1:
    unix-user = '1000'
    realname = ''
    seat = 'Seat1'
    session-type = ''
    active = FALSE

    x11-display = ':0'
    x11-display-device = '/dev/tty7'
    display-device = ''
    remote-host-name = ''
    is-local = TRUE
    on-since = '2012-09-26T06:23:19.278151Z'
    login-session-id = '4294967295'


La solución ha sido añadir la siguiente línea al fichero /etc/pam.d/common-session:

session optional                    pam_ck_connector.so

lunes, 13 de febrero de 2012

Una pequeña introducción a tcpdump

tcpdump es un potente sniffer de paquetes de línea de comandos que todo administrador de redes ha tenido que usar en alguna ocasión, ya sea para testear el funcionamiento de alguna aplicación, para detectar problemas en red o capturar datos que circulan sin cifrar.

Para usar tcpdump se requiere tener privilegios de root.

Instalar tcpdump en linux es trivial:

# apt-get install tcpdump

Para aquellos que usan windows, decir que existe un port de tcpdump para ellos. Se llama Windump. Windump es completamente compatible con tcpdump y puede ser utilizado para los mismos fines.

Con tcpdump utilizamos una serie de filtros que nos van a permitir seleccionar los paquetes que queramos analizar. No voy a entrar en muchos detalles sobre la sintaxis de tcpdump, tan sólo voy a mostrar algunos ejemplos de cómo usarlo con algunos filtros. Para más info, recomiendo acudir al manual (man tcpdump).

Por defecto, tcpdump escuchará en eth0. Si queremos indicarle que escuche en otra interfaz, se lo indicaremos con el parámetro -i interfaz.

Ejemplos:

Imaginemos que queremos escuchar todo el tráfico que pasa por el interfaz eth0:

# tcpdump
 
Imaginemos que tenemos dos interfaces: eth0 y wlan0 y queremos escuchar en wlan0:

# tcpdump -i wlan0
 
Ahora imaginemos que queremos capturar el tráfico que proviene de un equipo que tiene la IP 192.168.1.12

# tcpdump -i wlan0 src host 192.168.1.12 

Si quisiéramos capturar los paquetes que van destinados al equipo que tiene la IP 192.168.1.12

# tcpdump -i wlan0 dst host 192.168.1.12
 
Y si quisiéramos capturar los paquetes con origen y destino 192.168.1.12

# tcpdump -i wlan0 host 192.168.1.12
 
Si queremos capturar los paquetes dirigidos a una determinada dirección MAC:

# tcpdump ether dst XX:XX:XX:XX:XX:XX (sustituyendo XX:XX:XX:XX:XX:XX por la dirección mac concreta)

Para capturar los paquetes que vengan desde una red, como por ejemplo 192.168.1.0:

# tcpdump src net 192.168.1.0

Si queremos capturar los paquetes dirigidos por ejemplo a la ip 192.168.2.100 en el puerto 3128

# tcpdump dst host 192.168.2.100 and dst port 3128

Si queremos capturar el tráfico web:

# tcpdump tcp and port 80

También podemos capturar lo contrario de algo. Por ejemplo, capturar los paquetes que no vayan dirigidos a un host concreto.

# tcpdump not dst host 192.168.1.100

Si queremos capturar peticiones de DNS:

# tcpdump udp and dst port 53

Si queremos capturar peticiones ldap:

# tcpdump tcp port ldap

Y si queremos capturar peticiones a ldaps:

# tcpdump -n tcp port ldaps

Si queremos capturar el tráfico de telnet:

# tcpdump tcp port 23

Si queremos analizar el tráfico de dhcp:

# tcpdump -i eth0 -n port 67 or port 68

domingo, 12 de febrero de 2012

GRUB2: Una pequeña introducción

Hasta ahora, si queríamos modificar las opciones de arranque de GRUB o añadir nuevas entradas (por ejemplo para arrancar un Windows instalado después de Linux), hacíamos todas las modificaciones en el fichero /boot/grub/menu.lst. Ésto es algo que ha cambiado en GRUB 2, y, a lo que por tanto, tendremos que adaptarnos.

Para empezar, el fichero donde reside la configuración de GRUB 2, sigue residiendo en /boot/grub/ pero ya no se llama menu.lst sino grub.cfg.
Este fichero no debemos editarlo porque es generado automáticamente por grub-mkconfig y todos los cambios que hagamos en él se perderán tarde o temprano.

GRUB 2 tiene sus ficheros de configuración en los siguientes lugares:
  • /etc/default/grub
  • /etc/grub.d/
  • /boot/grub/grub.cfg
 El fichero /etc/default/grub contiene los ajustes, como por ejemplo, la entrada por defecto, el tiempo de espera antes de cargar dicha entrada, etc...

El directorio /etc/grub.d/ contiene un conjunto de scripts. Cada uno de estos scripts forman los bloques con los que será construido el fichero /boot/grub/grub.cfg. Si nos fijamos en los ficheros de este directorio, veremos que comienzan por un número. Ese número va a determinar el orden en que los scripts van a ser leídos a la hora de crear el fichero grub.cfg.

El fichero /boot/grub/grub.cfg es el principal fichero de configuración de grub. Como ya hemos dicho, grub.cfg reemplaza a menu.lst. Pero, a diferencia de menu.lst, grub.cfg no puede ser editado a mano. Mejor dicho, sí puede ser editado, pero no se debe, porque cuando se haga por ejemplo, alguna actualización del kernel, lo que hayamos modificado se perderá.

A continuación muestro el conjunto de scripts de grub que tiene mi equipo en /etc/grub.d/

administrador:/root# ls -l /etc/grub.d/
total 64
-rwxr-xr-x 1 root root 6491 may 22  2011 00_header
-rwxr-xr-x 1 root root 1150 oct 13  2009 05_debian_theme
-rwxr-xr-x 1 root root 5343 ene 17  2011 05_debian_theme.dpkg-dist
-rwxr-xr-x 1 root root 4284 ene 18  2011 10_linux
-rwxr-xr-x 1 root root  296 mar  1  2009 20_memtest86
-rwxr-xr-x 1 root root 1570 jun 27  2010 20_memtest86+
-rwxr-xr-x 1 root root 5789 ago 23  2010 30_os-prober
-rwxr-xr-x 1 root root  214 sep 12  2009 40_custom
-rwxr-xr-x 1 root root   95 ago 23  2010 41_custom
-rw-r--r-- 1 root root  483 ago 10  2009 README


Hace poco, algún compañero que ha utilizado la imagen de una Debian Squeeze que compartí, me ha comentado que la ha utilizado para clonar particiones en equipos duales Linux/Windows  y me preguntaba cómo podía modificar grub para que mostrase una opción que ofreciese la posibilidad de arrancar el windows que tenía instalado en otra partición. Veamos cómo hacerlo.

Imaginemos que tenemos un directorio /etc/grub.d como el que muestro en el listado anterior y queremos añadir una entrada que arranque un Windows que tenemos instalado en la partición 5.

Para añadir una nueva opción de arranque, tendremos que crear un nuevo fichero en /etc/grub.d que comience por un número. Si queremos que la entrada aparezca después de otra, deberemos darle un número mayor. Por ejemplo, si queremos añadir una entrada para el windows del que estamos hablando y que se muestre después de linux, como la entrada de linux comienza por 10 (10_linux), para cargar windows creamos un fichero que comience, por ejemplo por 11 (11_windows).

administrador:/root# nano /etc/grub.d/11_windows 
#!/bin/sh -e
echo "Añadiendo Windows 7 al menu de GRUB 2"
cat << EOF
menuentry "Windows 7" {
set root=(hd0,5)
chainloader (hd0,5)+1
}
EOF


Importante: GRUB 2 usa una notación para las particiones que comienza desde 1 en lugar de 0 como sucedía en la versión anterior de GRUB.

Una vez creado el script, le damos permisos de ejecución:

# chmod +x /etc/grub.d/11_windows  

Y por último, ejecutamos update-grub para regenerar el fichero /boot/grub/grub.cfg.

# update-grub 

Rootear dispositivos con sistema operativo Android

Aquí tenéis un artículo muy sencillito  y bien explicado de Sagrario Pedraza Labrador en el que se explica la utilidad de "rootear" dispositivos con sistema operativo Android y, a modo de ejemplo, como "rootear" el smarphone Motorola Defy.

Android es un conjunto de software que incluye un sistema operativo basado en el kernel de Linux + un conjunto de aplicaciones.
Android no es un GNU/Linux estándar como las distribuciones que existen para PC (Debian, Ubuntu ...), pero sí podemos decir que Android incorpora como motor del sistema operativo el kernel de Linux. ¿Qué implica ésto? Pues que ciertas características del sistema vienen del mundo Linux.
Un sistema Linux es multiusuario, y, como tal, muchos usuarios pueden estar interactuando a la vez con el sistema sin interferirse unos a otros. Entre todos los usuarios hay uno especial que es el administrador del sistema y este usuario administrador se llama root. De este modo:
  • Cada uno de los usuarios del sistema tiene una serie de privilegios limitados.
  • El usuario root tiene todos los privilegios sobre el sistema.
Entonces, ¿qué es rootear un dispositivo Android? Rootear consiste en realizar modificaciones en nuestro sistema para conseguir tener privilegios de root.
Hace años era más o menos difícil rootear un dispostivo, pero hoy en día hay una gran cantidad de aplicaciones que nos permiten conseguirlo de una manera muy fácil y con unos simples clics.
¿Qué beneficios nos aporta rootear nuestro terminal?
  • Mejorar el rendimiento de nuestro dispositivo cambiándole el sistema. A veces, el sistema que incorpora el dispositivo no tiene un buen rendimiento o incluso tiene fallos, como nos sucedía a algunos usuarios de Motorola Defy, en el que se bloqueaban las llamadas salientes ocasionalmente y había que reiniciar el terminal.
  • Tener versiones del sistema más actualizadas que las que nos proporciona el fabricante o el operador telefónico.
  • Poder utilizar aplicaciones que requieren privilegios de root superútiles como Titanium Backup, aplicaciones de captura de pantalla, etc...
  • Poder modificar aspectos del sistema como activar la radio FM o retocar ficheros de configuración del sistema con un editor de textos.
Una desventaja que se suele mencionar siempre es que modificar el sistema de nuestro dispositivo puede anular la garantía del mismo. Pero, eso no tiene por qué ocurrir. El proceso de rooteo es reversible y si vamos a cambiar el sistema, antes podemos hacer un backup del original para restaurarlo antes de tener que enviarlo al servicio técnico.
Bueno, pues ahora que ya sabemos de qué va el tema, como ejemplo práctico, vamos a ver cómo rootear el terminal Android Motorola Defy, utilizando SuperOneClick, una aplicación que permite rootear la mayoría de los teléfonos Android.
Necesitaremos:
Como las aplicaciones son para Windows, si el sistema operativo de nuestro ordenador es Linux, tendremos que usar wine o una máquina virtual Windows.

  • Lo primero que haremos será instalar los drivers USB en nuestro ordenador y reiniciarlo.





  • La aplicación SuperOneClick no requiere instalación. Tan sólo descomprimimos el archivo descargado desde http://shortfuse.org/ en una carpeta
  • A continuación activamos el modo de Depuración USB en el teléfono marcando la casilla "Depuración USB" en:  Menú -> Ajustes -> Aplicaciones -> Desarrollo.

  • Después conectamos el teléfono mediante el cable USB a nuestro ordenador. Al conectarlo, en el teléfono elegiremos el modo de conexión "Solo cargar" (No elegir modo de almacenamiento)
  • Abrimos la carpeta que contiene SuperOneClick en el ordenador y ejecutamos SuperOneClick.exe como administrador.

  •  Se nos abrirá la aplicación.

  • Hacemos clic en el botón “Root” para que comience el proceso de rooteo.

  • Una vez que termine, ya tendremos nuestro teléfono rooteado. Cerramos SuperOneClick, desactivamos "Depuración USB" y reiniciamos el teléfono.

Si en algún momento tuviéramos que "des-rootear"el teléfono, por ejemplo, para mandarlo al servicio técnico:
  1. Activaríamos el modo "Depuración USB".
  2. Conectaríamos el teléfono al ordenador mediante el cable USB.
  3. Abriríamos SuperOneClick.
  4. Ejecutaríamos SuperOneClick.exe como administrador.
  5. Pulsaríamos el botón "Unroot" y lo habríamos des-rooteado.

miércoles, 8 de febrero de 2012

Configuración de red: Servidor LTSP en eth0 y AP con hostapd en wlan0

En el artículo anterior (http://enavas.blogspot.com/2012/02/hostapdfreeradius-en-debian.html) hablaba de sustituir la interfaz eth0 por wlan0 para dar servicio de acceso wifi. Esto está bien para un aula en el que se van a sustituir los terminales por portátiles. Pero, ¿y si lo que quiero es que el aula siga dando servicio a los terminales (en la interfaz eth0) pero también quiero que de servicio de acceso wifi al mismo tiempo (en la interfaz wlan0)?  Para conseguirlo, habría que hacer lo siguiente:

1) Fichero /etc/network/interfaces
Me aseguro de que ya tengo definido el interfaz wlan0 en el fichero /etc/network/interfaces:
a22-pro:~# cat /etc/network/interfaces

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo eth0 eth3 wlan0
iface lo inet loopback

iface eth3 inet dhcp
        ifup eth3
        post-up /usr/sbin/ethtool -s $IFACE wol g
        post-down /usr/sbin/ethtool -s $IFACE wol g


iface eth0 inet static
        address 192.168.0.254
        netmask 255.255.255.0
        network 192.168.0.0
        broadcast 192.168.0.255


iface wlan0 inet static
        address 192.168.1.254
        netmask 255.255.255.0
        network 192.168.1.0
        broadcast 192.168.1.255
 

2) Fichero /etc/default/dhcp3-server
Me aseguro de que dhcp3-server escucha en las dos interfaces: eth0 y wlan0:

a22-pro:~# cat /etc/default/dhcp3-server
# Defaults for dhcp initscript
# sourced by /etc/init.d/dhcp
# installed at /etc/default/dhcp3-server by the maintainer scripts

#
# This is a POSIX shell fragment
#

# On what interfaces should the DHCP server (dhcpd) serve DHCP requests?
#    Separate multiple interfaces with spaces, e.g. "eth0 eth1".
INTERFACES="eth0 wlan0"


3) Fichero /etc/dhcp3/dhcpd.conf


Modifico el fichero de configuración del servidor dhcp y le añado al final las líneas que he resaltado en negrita:

a22-pro:~# cat /etc/dhcp3/dhcpd.conf

ldap-server "ldap";
ldap-port 389;
ldap-base-dn  "dc=instituto,dc=extremadura,dc=es";
ldap-dhcp-server-cn "ldap";
ldap-debug-file "/var/log/dhcp-ldap-startup.log";
ldap-method dynamic;
ddns-update-style none;

subnet 192.168.1.0 netmask 255.255.255.0 {
   range 192.168.1.10 192.168.1.253;
   option routers 192.168.1.254;
   option broadcast-address 192.168.1.255;
   option domain-name-servers 172.19.144.3;
   option domain-name "valledeljerte3";
}


Con las líneas resaltadas en negrita defino la configuración de red que se va a asignar a las máquinas que se conecten vía wifi al servidor que estamos configurando como punto de acceso. Estas máquinas estarán en la red 192.168.1.X.

En cuanto a los terminales, se les seguirá asignando direcciones del rango 192.168.0.X, tal y como está definido en el servidor de ldap.

4) Tomamos como modelo el fichero /etc/init.d/enable-nat
Como en los servidores de terminales ya tenemos un fichero que activa nat para los clientes detrás de la interfaz eth0, lo copiamos y modificamos para hacer nat para los clientes que se conecten a través de wlan0:

a22-pro:~# cp /etc/init.d/enable-nat /etc/init.d/enable-nat-wifi


5) Fichero /etc/init.d/enable-nat-wifi
Modificamos el fichero enable-nat-wifi con los valores que se muestran en negrita. Este fichero activará el enmascaramiento de los paquetes que vengan de la red 192.168.1.X y vayan dirigidos a la interfaz eth3.

a22-pro:~# cat /etc/init.d/enable-nat-wifi

#! /bin/sh
### BEGIN INIT INFO
# Provides:          enable-nat-wifi
# Required-Start:    $remote_fs
# Should-Start:      $network
# Required-Stop:     $remote_fs
# Should-Stop:       $network
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Enabling NAT for clients behind wlan0
# Description:       Enabling Network Address Translation for clients
#                    sitting in the thin client network behind wlan0

### END INIT INFO

IPTABLES=/sbin/iptables

NETWORK_TO_NAT=
OUTSIDE_IF=eth3

# Only enable by default if LTSP or lessdisks is installed
if [ -e /opt/ltsp -o -d /var/lib/lessdisks ] ; then
    NETWORK_TO_NAT="192.168.1.0/24"
fi

if [ -f /etc/default/enable-nat-wifi ] ; then
    . /etc/default/enable-nat-wifi
fi


# Bail out if no iptables binary or no configuration
[ -x ${IPTABLES} -a "$NETWORK_TO_NAT" ] || exit 0

do_status() {
    $IPTABLES -L -t nat |grep -A3 POSTROUTING
}

is_enabled() {
    if do_status | grep -q "$NETWORK_TO_NAT" ; then
    true
    else
    false
    fi
}

do_start() {
    if is_enabled ; then
    echo "NAT for clients on network $NETWORK_TO_NAT already enabled."
    else
    echo "Enabling NAT for clients on network $NETWORK_TO_NAT."
    $IPTABLES -t nat -A POSTROUTING -s $NETWORK_TO_NAT -o $OUTSIDE_IF -j MASQUERADE
    fi

    # Enable IP-forwarding if it isn't enabled already.
    if [ 0 = "`cat /proc/sys/net/ipv4/ip_forward`" ]; then
    echo "Enabling IPv4 forwarding."
    echo 1 > /proc/sys/net/ipv4/ip_forward
    fi

    do_status
}

do_stop() {
    if is_enabled ; then
    echo "Disabling NAT for clients on network $NETWORK_TO_NAT."
    $IPTABLES -F -t nat
    else
    echo "NAT for clients on network $NETWORK_TO_NAT already disabled."
    fi
    do_status
}

case "$1" in
    start)
        do_start
        ;;
    stop)
        do_stop
        ;;
    restart|force-reload)
        do_stop
        do_start
        ;;
    status)
        do_status
        ;;
    *)
        echo "Usage: $0 {start|stop|restart|force-reload|status}"
        exit 2
        ;;
esac
exit 0
 
6) Activar servicio enable-nat-wifi
Por último, pero no menos importante, activamos el servicio que acabamos de crear mediante insserv.

# insserv /etc/init.d/enable-nat-wifi 

insserv leerá las cabeceras del archivo enable-nat-wifi y creará los enlaces necesarios para iniciar y parar el servicio en los niveles definidos en dichas cabeceras.

Naturalmente, reiniciaremos los servicios oportunos y habremos terminado.

hostapd+freeradius en Debian


Para aquellos que no lo sepan, hostapd es un demonio que permite que un ordenador actúe como punto de acceso.

Como me habían dicho que no era posible hacer funcionar hostapd con freeradius, ahora que tenía a mano una tarjeta Dlink DWA-556 y quería montarla en un servidor de terminales para que actuara como punto de acceso, me he puesto a probarlo.

La conclusión, después de unas cuantas pruebas y configuraciones, es que la combinación de hostapd+freeradius funciona sin problemas. Es decir, que es posible montar un punto de acceso en un equipo y que la autenticación se haga mediante un servidor freeradius.

Personalmente prefiero utilizar un punto de acceso Dlink DAP-1353 en lugar de una tarjeta Dlink DWA-556 funcionando con hostapd, por varias razones, pero principalmente por dos:
  • La diferencia de precio no es muy grande.
  • El punto de acceso me aporta más funcionalidad, como por ejemplo, gestionar los canales de forma automática, algo interesante para evitar que las señales de puntos de acceso cercanos se solapen e interfieran.
Teniendo en cuenta que ya tenemos instalado freeradius, lo primero que habría que hacer sería instalar hostapd:

# aptitude install hostapd

Una vez instalado,  vamos a ver qué ficheros tenemos que modificar para usar hostapd con freeradius en el IES:

  • /etc/network/interfaces
  • /etc/default/dhcp3-server
  • /etc/freeradius/clients.conf
  • /etc/hostapd/hostapd.conf

1) Fichero  /etc/network/interfaces
Como vamos a convertir el servidor ltsp en punto de acceso, definimos los valores para la interfaz wlan0, como se muestra en la parte del fichero que marco en negrita:

a22-pro:~# cat /etc/network/interfaces

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo eth0 eth3 wlan0
iface lo inet loopback

iface eth3 inet dhcp
        ifup eth3
        post-up /usr/sbin/ethtool -s $IFACE wol g
        post-down /usr/sbin/ethtool -s $IFACE wol g

iface wlan0 inet static
        address 192.168.0.254
        netmask 255.255.255.0
        broadcast 192.168.0.255


Hasta ahora, la interfaz eth0 tenía la dirección IP 192.168.0.254. Como ya no se va a usar como servidor de terminales, se la ponemos a la interfaz wlan0.

2) Fichero /etc/default/dhcp3-server
En este fichero, añadimos wlan0 a la definición INTERFACES="eth0" de tal forma que quedaría así:  INTERFACES="eth0 wlan0":

a22-pro:~# cat /etc/default/dhcp3-server

# Defaults for dhcp initscript
# sourced by /etc/init.d/dhcp
# installed at /etc/default/dhcp3-server by the maintainer scripts

#
# This is a POSIX shell fragment
#

# On what interfaces should the DHCP server (dhcpd) serve DHCP requests?
# Separate multiple interfaces with spaces, e.g. "eth0 eth1".
INTERFACES="eth0 wlan0"


De este modo, le decimos a DHCP que debe escuchar peticiones en eth0 y wlan0 (aunque eth0 no se va a usar en este caso).

3) Fichero /etc/freeradius/clients.conf
En este fichero, definimos los clientes que se van a poder comunicar con freeradius mediante la clave que especifiquemos en secret:

a22-pro:~# cat /etc/freeradius/clients.conf

client a22-pro {
 ipaddr = 192.168.0.254
 secret = clavecompartida
}


En el caso anterior, estamos diciendo a freeradius que tendrá un cliente con IP 192.168.0.254 y clave "clavecompartida". En el fichero hostapd, tendremos que especificar quién es el servidor freeradius y cuál es la clave compartida entre ambos.

4) Fichero /etc/hostapd/hostapd.conf
En este fichero definimos la configuración que va a tener nuestro punto de acceso. La configuración que muestro a continuación es la que he definido para que hostapd se comunique con un servidor freeradius con seguridad WPA-EAP:

a22-pro:~# cat /etc/hostapd/hostapd.conf

# Configuración ajustada para trabajar con freeradius externo
# EAP-TTLS+PAP
# Esteban M. Navas Martín
# IES Valle del Jerte - Plasencia

interface=wlan0
country_code=ES

driver=nl80211

logger_syslog=-1
logger_syslog_level=2
logger_stdout=-1
logger_stdout_level=2

dump_file=/tmp/hostapd.dump

ctrl_interface=/var/run/hostapd

ssid=IESVALLEDELJERTE3PRUEBAS

macaddr_acl=0

hw_mode=g

channel=11

wme_enabled=1
ieee80211n=1

auth_algs=3

ieee8021x=1
eapol_version=2
eap_message=hello-IES-AP
eapol_key_index_workaround=1

wpa=3
wpa_key_mgmt=WPA-EAP
wpa_pairwise=TKIP CCMP

wpa_group_rekey=600
wpa_gmk_rekey=86400

eap_server=0

own_ip_addr=192.168.0.254
nas_identifier=a22AP

auth_server_addr=192.168.0.254
auth_server_port=1812
auth_server_shared_secret=clavecompartida

acct_server_addr=192.168.0.254
acct_server_port=1813
acct_server_shared_secret=clavecompartida


Como puede verse, en auth_server_addr especificamos la ip del servidor freradius y en auth_server_shared la clave compartida con el servidor. En este caso, el servidor freeradius y hostapd se encuentran en la misma máquina.

Y eso es todo.

Para comprobar que funciona, reiniciamos los servicios afectados:

# /etc/init.d/networking restart
# /etc/init.d/dhcp3-server restart
# /etc/init.d/hostapd restart
# /etc/init.d/freeradius restart

martes, 7 de febrero de 2012

Configurar el acceso wifi de un usuario y cachear sus credenciales

En mi centro tengo montado un sistema de control de acceso wifi con WPA2 Enterprise + EAP-TTLS/PAP + FREERADIUS + LDAP. Cada usuario puede conectarse vía wifi utilizando su propio login y password, almacenados en el servidor ldap.
Para configurar el acceso de cada usuario, he preparado dos versiones de un mismo script:
 El script addusuario.sh nos pide introducir login y password del usuario. Si el usuario es un profesor, le configura el acceso a la red wifi del centro, y si el usuario es un alumno, le configura el acceso a la red wifi de su aula. Además, cachea las credenciales, para que el usuario pueda entrar en el portátil en el caso de que no tenga conexión a la red. Este script lo coloco en el directorio /usr/local/sbin/ de los portátiles mediante puppet para poder usarlo cuando quiera.

addusuario.sh

#!/bin/bash
#
# addusuario.sh: Configura el acceso wifi del usuario y cachea sus credenciales
#
# Esteban M. Navas Martín
# IES Valle del Jerte

HOST=`hostname`
AULA=`expr substr $HOST 1 3`
USOPROFESOR=`grep "portatil-profesor" /etc/escuela2.0`

clear

DIALOG=${DIALOG=dialog}

tempfile=`tempfile 2>/dev/null` || tempfile=/tmp/test$$
trap "rm -f $tempfile" 0 1 2 5 15

$DIALOG --title "Portatil: $HOST" --clear \
--inputbox "Introduzca el login del usuario de este equipo:" 10 51 2> $tempfile

retval=$?

case $retval in
0)

USUARIO=`cat $tempfile`

if [ "$USUARIO" ] ; then

$DIALOG --title "Password del usuario" --clear \
--inputbox "Introduzca la password del usuario" 10 51 2> $tempfile

retval=$?

case $retval in
0)
PASSWORD=`cat $tempfile`
;;
*)
$DIALOG --title "ERROR" --clear \
--msgbox "Es necesario introducir la password del usuario." 12 46
exit 1
esac
fi
;;
*)
$DIALOG --title "ERROR" --clear \
--msgbox "Es necesario introducir el login del usuario." 12 46
exit 1
esac


cd /tmp

if [ "$USOPROFESOR" ]; then
wget -O /tmp/Auto\ IESVALLEDELJERTE3 http://servidor/ficheros/Auto\ IESVALLEDELJERTE3

retval=$?

if [ $retval -eq 0 ]; then
sed "s/USER/$USUARIO/" Auto\ IESVALLEDELJERTE3 > /tmp/Auto\ IESVALLEDELJERTE3.1
sed "s/PASSWORD/$PASSWORD/" /tmp/Auto\ IESVALLEDELJERTE3.1 > /etc/NetworkManager/system-connections/Auto\ IESVALLEDELJERTE3
chmod 600 /etc/NetworkManager/system-connections/Auto\ IESVALLEDELJERTE3

# Borramos los archivos de configuracion temporales por si volvemos a ejecutar el script
rm /tmp/Auto\ IESVALLEDELJERTE3 /tmp/Auto\ IESVALLEDELJERTE3.1
fi
else
if [ -f /etc/NetworkManager/system-connections/Auto\ IESVALLEDELJERTE3 ]; then
rm /etc/NetworkManager/system-connections/Auto\ IESVALLEDELJERTE3
fi

wget -O /tmp/Auto\ $AULA-iesvalledeljerte3 http://servidor/ficheros/Auto\ $AULA-iesvalledeljerte3

retval=$?

if [ $retval -eq 0 ]; then
sed "s/USER/$USUARIO/" Auto\ $AULA-iesvalledeljerte3 > /tmp/Auto\ $AULA-iesvalledeljerte3.1
sed "s/PASSWORD/$PASSWORD/" /tmp/Auto\ $AULA-iesvalledeljerte3.1 > /etc/NetworkManager/system-connections/Auto\ $AULA-iesvalledeljerte3
chmod 600 /etc/NetworkManager/system-connections/Auto\ $AULA-iesvalledeljerte3

# Borramos los archivos de configuracion temporales por si volvemos a ejecutar el script
rm /tmp/Auto\ $AULA-iesvalledeljerte3 /tmp/Auto\ $AULA-iesvalledeljerte3.1
fi
fi

if [ "$USUARIO" ] && [ "$PASSWORD" ]; then
# Cacheamos las credenciales de usuario
cc_test -store any $USUARIO $PASSWORD
fi



El script .bash_login hace lo mismo que el anterior, pero sólo va a realizar la configuración cuando el usuario root haga login en un terminal y no exista el fichero de configuración de acceso a la wifi en /etc/NetworkManager/system-connections/ o cuando forcemos la ejecución del mismo, poniendo a vacío la variable FICHEROCONFIG. Este script lo coloco en el directorio /root de los portátiles mediante puppet.

bash_login.portatil

HOST=`hostname`
AULA=`expr substr $HOST 1 3`
USOPROFESOR=`grep "portatil-profesor" /etc/escuela2.0`

if [ "$USOPROFESOR" ]; then
FICHEROCONFIG=`ls /etc/NetworkManager/system-connections/|grep IESVALLEDELJERTE3`
else
FICHEROCONFIG=`ls /etc/NetworkManager/system-connections/|grep $AULA`
fi

# "Des-comentar" esta condición cuando queramos forzar la reconfiguración de la wifi
#FICHEROCONFIG=""

# Si la wifi ya está configurada, cerramos y no hacemos nada
if [ -z "$FICHEROCONFIG" ]; then

clear

DIALOG=${DIALOG=dialog}

tempfile=`tempfile 2>/dev/null` || tempfile=/tmp/test$$
trap "rm -f $tempfile" 0 1 2 5 15

$DIALOG --title "Portatil: $HOST" --clear \
--inputbox "Introduzca el login del usuario de este equipo:" 10 51 2> $tempfile

retval=$?

case $retval in
0)

USUARIO=`cat $tempfile`

if [ "$USUARIO" ] ; then

$DIALOG --title "Password del usuario" --clear \
--inputbox "Introduzca la password del usuario" 10 51 2> $tempfile

retval=$?

case $retval in
0)
PASSWORD=`cat $tempfile`
;;
*)
$DIALOG --title "ERROR" --clear \
--msgbox "Es necesario introducir la password del usuario." 12 46
esac
fi
;;
*)
$DIALOG --title "ERROR" --clear \
--msgbox "Es necesario introducir el login del usuario." 12 46
esac


WIFICONFIGURADA=`grep $USUARIO "$FICHEROCONFIG"`

if [ -z "$WIFICONFIGURADA" ]; then

if [ "$USOPROFESOR" ] && [ "$USUARIO" ] && [ "$PASSWORD" ]; then
wget -O /tmp/Auto\ IESVALLEDELJERTE3 http://servidor/ficheros/Auto\ IESVALLEDELJERTE3

retval=$?

if [ $retval -eq 0 ]; then
sed "s/USER/$USUARIO/" /tmp/Auto\ IESVALLEDELJERTE3 > /tmp/Auto\ IESVALLEDELJERTE3.1
sed "s/PASSWORD/$PASSWORD/" /tmp/Auto\ IESVALLEDELJERTE3.1 > /etc/NetworkManager/system-connections/Auto\ IESVALLEDELJERTE3
chmod 600 /etc/NetworkManager/system-connections/Auto\ IESVALLEDELJERTE3

# Borramos los archivos de configuracion temporales por si volvemos a ejecutar el script
rm /tmp/Auto\ IESVALLEDELJERTE3 /tmp/Auto\ IESVALLEDELJERTE3.1
else
echo "No existe el fichero de configuración Auto\ IESVALLEDELJERTE3 en http://servidor/ficheros/"
fi
else
if [ "$USUARIO" ] && [ "$PASSWORD" ]; then
if [ -f /etc/NetworkManager/system-connections/Auto\ IESVALLEDELJERTE3 ]; then
rm /etc/NetworkManager/system-connections/Auto\ IESVALLEDELJERTE3
fi

wget -O /tmp/Auto\ $AULA-iesvalledeljerte3 http://servidor/ficheros/Auto\ $AULA-iesvalledeljerte3

retval=$?

if [ $retval -eq 0 ]; then
sed "s/USER/$USUARIO/" /tmp/Auto\ $AULA-iesvalledeljerte3 > /tmp/Auto\ $AULA-iesvalledeljerte3.1
sed "s/PASSWORD/$PASSWORD/" /tmp/Auto\ $AULA-iesvalledeljerte3.1 > /etc/NetworkManager/system-connections/Auto\ $AULA-iesvalledeljerte3
chmod 600 /etc/NetworkManager/system-connections/Auto\ $AULA-iesvalledeljerte3

# Borramos los archivos de configuracion temporales por si volvemos a ejecutar el script
rm /tmp/Auto\ $AULA-iesvalledeljerte3 /tmp/Auto\ $AULA-iesvalledeljerte3.1
else
echo "No existe el fichero de configuración Auto $AULA-iesvalledeljerte3 en http://servidor/ficheros/"
fi
fi
fi
fi

if [ "$USUARIO" ] && [ "$PASSWORD" ]; then
# Cacheamos las credenciales de usuario
cc_test -store any $USUARIO $PASSWORD
fi

fi

viernes, 3 de febrero de 2012

Nuestro espacio Box.net accesible vía davfs2 en Debian Squeeze

Box.net nos ofrece 5GB de almacenamiento gratuito en la nube, algo que no está mal, pero que está mejor si te ofrecen 50GB al instalar su aplicación y darte de alta desde un móvil LG  Android (o desde cualquier otro móvil Android, si seguimos alguno de los tutoriales que circulan por la red), como ya hizo en su día con los usuarios de IPhone.

Lo malo es que no tiene una herramienta de sincronización como Dropbox. Mejor dicho, sí la tiene, pero es sólo para usuarios de pago.

Como actualmente box.net permite conexiones vía WebDAV, podemos aprovechar davfs2, que nos permite montar un recurso WebDAV en el sistema de ficheros.

1) Instalamos davfs2:

# apt-get install davfs2


2) Creamos una carpeta en nuestro home, donde vamos a montar el recurso:

# mkdir ~/box.net


3) Por defecto, los ficheros de configuración de davfs2 se guardan en /etc/davfs2. Como vamos a realizar una configuración particular sólo para nuestro usuario, creamos un directorio en nuesto home se guardará.

# mkdir ~/.davfs2


4) La única configuración que vamos a aplicar va a ser poner use_locks a 0, para evitar posibles problemas a la hora de crear ficheros.

# echo "use_locks 0" > ~/.davfs2/davfs2.conf


5) Guardamos los datos de nuestra conexión vía WebDAV seguro en el fichero ~/.davfs2/secrets:

# echo "https://www.box.net/dav miemail mipassword" > ~/.davfs2/secrets


donde:
  • miemail será la dirección de email con la que nos registramos en box.net
  • mipassword será la password con la que nos registramos en box.net
6) Ajustamos los permisos para que el fichero tan sólo sea de lectura y escritura para nuestro usuario:


# chmod 600 ~/.davfs2/secrets


7) Añadimos la siguiente linea al fichero /etc/fstab que nos va a permitir montar y desmontar este sistema de archivos, ya sea mediante nautilus o mediante comandos:

# echo "https://www.box.net/dav /home/milogin/box.net davfs rw,user,noauto 0 0" >> /etc/fstab


donde sustituiremos milogin por nuestro propio login.

8) Ejecutamos:

# mount -a


Y listo. Ya podemos abrir el explorador de archivos Nautilus para usar el espacio del que disponemos. Desde el explorador podremos montar y desmontar la unidad.