Monthly Archives: January 2010

Evitar el doble gateway después de instalar el puente para KVM con wicd en Linux Ubuntu 9.10

Introducción.

Después de configurar el puente entre las interfaces de red para permitirle el acceso a la red a las máquinas virtuales basadas en KVM encontré un problema: el servidor podía ser accedido pero este no tenía acceso a Internet.

Después de algunas pruebas determiné el problema sin embargo su solución me tomó mas de lo esperado ya que previamente había instalado wicd para administrar con mayor sencillez las interfaces de red, especialmente la inalámbrica, y esto hizo que mis intentos previos de solución sin tenerlo en cuenta fracasaran miserablemente.

El problema.

Después de la creación del puente sobre la interfaz de red alámbrica (eth0)  se crea la interfaz bridge (br0) la cual toma su información de red.  El problema radica en que, aparentemente wicd, se crean dos gateways por defecto.

$ sudo route

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.1.0     *               255.255.255.0   U     0      0        0 br0
192.168.1.0     *               255.255.255.0   U     0      0        0 eth0
192.168.122.0   *               255.255.255.0   U     0      0        0 virbr0
default         192.168.1.1     0.0.0.0         UG    0      0        0 eth0
default         192.168.1.1     0.0.0.0         UG    100    0        0 br0

La solución.

Versión temporal.

El problema se soluciona removiendo el camino establecido a través de la interfaz de red alámbrica de la siguiente manera.

$ sudo route del -net default netmask 0.0.0.0 dev eth0

De esta manera el servidor ya puede acceder a la red WAN, sin embargo al reiniciarse el problema se vuelve a presentar.

Version final.

Probablemente en condiciones normales el problema se solucione agregando el comando mencionado anteriormente en /etc/rc.local y asignándole permisos de ejecución a este archivo, sin embargo esta estrategia resultó infructuosa en el servidor ya que este estaba utilizando wicd.

Para solucionar el problema de manera definitiva utilizando wicd se deben realizar los siguientes pasos.

$ sudo vi /etc/wicd/wired-settings.conf

Agregar un elemento afterscript de la siguiente manera.

[wired-default]
afterscript = /etc/wicd/scripts/postconnect/removeEth0GatewayRoute

Crear el script asociado.

$ sudo vi /etc/wicd/scripts/postconnect/removeEth0GatewayRoute

route del -net default netmask 0.0.0.0 dev eth0

$ sudo chmod +x /etc/wicd/scripts/postconnect/removeEth0GatewayRoute

Reiniciar el servidor y verificar que el script se ha ejecutado exitosamente.

$ sudo route

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.1.0     *               255.255.255.0   U     0      0        0 br0
192.168.1.0     *               255.255.255.0   U     0      0        0 eth0
192.168.122.0   *               255.255.255.0   U     0      0        0 virbr0
default         192.168.1.1     0.0.0.0         UG    100    0        0 br0

Problemas de autenticación/autorización de un 3Com OfficeConnect Wireless Router

Introducción.

El viernes pasado mientras aprendía acerca de Team Software Process se me ocurrió echar una mirada para intentar encontrar la dirección del filtro de contenido de la red que en la que estaba que la hacía prácticamente inútil bloqueando la mayoría de los sitios web de interés general.

Un traceroute de los sitios bloqueados no me mostró la ubicación que quería, sólo permitía llegar hasta el enrrutador inalámbrico que me estaba permitiendo acceder a la red LAN.  Decepcionado terminé saludándolo para darme cuenta de un problema de seguridad que ocultaba.

Conociendo al dispositivo.

Inicialmente no me dijo mucho, sólo que aparentemente era un dispositivo 3Com (o al menos su interfaz de red lo era).

$ sudo nmap -sA -O 192.168.2.1

Starting Nmap 5.00 ( http://nmap.org ) at 2010-01-16 08:10 COT
All 1000 scanned ports on 192.168.2.1 are unfiltered
MAC Address:
00:FF:C1:4D:FF:EE (3com Europe)
Too many fingerprints match this host to give specific OS details
Network Distance: 1 hop

Posteriormente lo confirmé al ver que el dispositivo 3Com ejecutaba aparentemente una versión de Linux con el kernel 2.6 lo cual es relativamente reciente.

$ sudo nmap -sS -O 192.168.2.1

Starting Nmap 5.00 ( http://nmap.org ) at 2010-01-16 08:09 COT
Interesting ports on 192.168.2.1:
Not shown: 998 closed ports
PORT   STATE SERVICE
53/tcp open  domain
80/tcp open  http
MAC Address: 00:FF:C1:4D:FF:EE (3com Europe)
Device type: general purpose
Running: Linux 2.6.X
OS details: Linux 2.6.22

Network Distance: 1 hop

También se hizo evidente que el dispositivo permitía su administración a través de web (puerto 80).

Accediendo a el dispositivo utilizando un navegador web encontré que era finalmente un 3Com OfficeConnect Wireless 11g.  Sabiendo esto investigué un poco si había problemas conocidos con este dispositivo.

La vulnerabilidad.

Resulta que estos dispositivos manejan incorrectamente la autenticación/autorización de su módulo web de administración, protegiendo correctamente a las páginas pero permitiendo el acceso directo a los CGIs.  Esto unido a que el método de copia de seguridad de la configuración del router genera un archivo (config.bin) con esta información y lo almacena en su memoria interna para que el administrador lo descargue, termina convirtiéndose en un grave problema de seguridad.

El archivo puede descargarse mediante un CGI llamado SaveCfgFile así que para obtenerlo sólo es necesario acceder a él mediante un navegador web.

http://192.168.2.1/SaveCfgFile.cgi

El archivo contiene toda la configuración del enrrutador, incluyendo su información de red y contraseñas de administración!


httpd_username=admin
httpd_password=admin

mradius_username=admin
mradius_password=admin
mradius_secret=mradius1218
mradius_port=1812

http_username=admin
login_password=admin
http_passwd=admin

Conclusiones.

Esta vulnerabilidad fue reportada a 3Com por Luca Carettoni de ikkisoft.com en diciembre de 2008 y fue conocida por el público en general en febrero del 2009.

Supongo que desde hace tanto tiempo para acá 3Com ya ha solucionado esta vulnerabilidad y se encuentra disponible una actualización del firmware que la soluciona.

Debe tenerse especial cuidado en los dispositivos que tengan la opción de Remote Administration activa ya que esta vulnerabilidad podrá ser explotada desde Internet.

Enlaces.

Actualizar Linux CentOS 5.4 desde línea de comando utilizando Yum

Introducción.

Linux CentOS utiliza Yum como herramienta para administrar sus paquetes, de manera análoga a como Debian utiliza al Aptitude.

A continuación se describe el breve proceso que se debe realizar para actualizar para actualizar los paquetes y el sistema operativo desde la línea de comando utilizando esta herramienta.

Procedimiento.

Verificar si hay actualizaciones disponibles.

$ yum check-update

Descargar e instalar las actualizaciones disponibles.

$ sudo yum update

Enlaces.

Permitirle a un usuario ejecutar el comando "sudo" en Linux CentOS 5.4

Introducción.

Por defecto en Linux CentOS, hijo de RedHat, la configuración del comando sudo viene restringida.  Su filosofía es la de utilizar al usuario root directamente.  Si intentamos ejecutar cualquier comando mediante sudo se obtiene siempre este mensaje de error.

xxxxx is not in the sudoers file.  This incident will be reported.

Quienes utilizamos Ubuntu, hijo de Debian, estamos acostumbrados a un usuario root sin contraseña y a utilizar el sudo cada vez que se va a desarrollar alguna actividad de administración que requiera los privilegios del superusuario. A continuación se detallan los pasos necesarios para configurar de esta manera el comportamiento del comando sudo.

Procedimiento.

Configuración de sudoers.

Realice los pasos de esta sección como usuario administrador.

$ su – # visudo

Remueva el comentario inicial de la siguiente línea según como se muestra a continuación.

## Allows people in group wheel to run all commands
%wheel    ALL=(ALL)    ALL

Autorización a los usuarios.

Utilizando las herramientas de administración gráficas.

Ejecute la herramienta de administración de usuarios y grupos.

Administración de los usuarios y los grupos

Seleccione las preferencias del Administrador de Usuarios y Grupos mediante el siguiente menú.

Edit > Preferences.

Remueva la marca de la casilla de verificación llamada Hide system users and groups.

Mostrar los usuarios y grupos del sistema

Seleccione la hoja Groups y en ella ubique al grupo wheel y presione el botón de Properties en la parte superior.

Editar las propiedades del grupo wheel.

Seleccione los usuarios que estarán autorizados para ejecutar el comando sudo y presione el botón de Ok .

Agregar usuarios al grupo wheel.

Utilizando las herramientas de administración de línea de comando.

# usermod -G wheel jimezam

Listo!

Aposteriori.

Si se desea una aproximación un poco mas cercana a la forma como Debian maneja este tipo de autorizaciones, puede que le sea interesante bloquear el acceso directo al usuario root mediante su contraseña.  Para hacer esto ejecute el siguiente comando.

$ sudo passwd -l root

De esta manera no será posible iniciar sesión de ninguna manera con el usuario root y las tareas administrativas sólo podrán ser ejecutadas mediante la invocación del sudo por los sudoers, es decir, por los usuarios que se hayan inscrito en el grupo wheel. Este procedimiento se revierte fácilmente al asignarle una nueva contraseña al usuario root con passwd.

Instalación básica de Linux CentOS 5.4 en KVM

Introducción.

A continuación se realizará la instalación de un Linux CentOS 5.4 básico en una máquina virtual basada en KVM utilizando LibVirt.

Preparación preliminar.

  • La infraestructura necesaria para la virtualización basada en KVM se encuentra instalada y configurada.
  • Se ha descargado la imagen ISO de la última distribución (5.4 en este caso) de Linux CentOS de su sitio web.
    http://www.centos.org/modules/tinycontent/index.php?id=15
  • La imagen ISO de Linux CentOS se ha ubicado en /u/isos.
  • La imagen del disco duro de la máquina virtual se creará en /u/vms.
  • La red de la máquina virtual se implementará sobre una interfaz puente (br0) en el huésped.  Puede utilizarse también la configuración de NAT por defecto de KVM sin nigún problema.
  • La máquina virtual (dominio) será identificada por la etiqueta centos-general.
  • Se le asignarán 256MB de memoria RAM y un disco duro de 7GB a la máquina virtual.

Creación de la máquina virtual.

$ virt-install \
–connect qemu:///system \
-n centos-general \
-r 256 \
–os-type linux \
–os-variant generic26 \
–hvm \
–cdrom /u/isos/CentOS-5.4-i386-bin-DVD.iso \
–network bridge:br0 \
–disk path=/u/vms/centos-general.img,size=7 \
–vnc –noautoconsole \
–accelerate

Conexión a la interfaz gráfica de la máquina virtual.

$ /usr/bin/virt-viewer -c qemu+ssh://IP_SERVIDOR/system centos-general

  • Si la conexión es remota utilice el protocolo qemu+ssh y reemplace la constante IP_SERVIDOR por la dirección IP o nombre FQDN del huésped.
  • En caso de realizarse una conexión local utilice el protocolo qemu y obvie la dirección del servidor.

Instalación normal de Linux CentOS.

Realice la instalación habitual de Linux CentOS 5.4 mediante el visor de la máquina virtual recién invocado.

Configurando un puente en la interfaz de red para las KVM en Linux Ubuntu 9.10

Introducción.

Cuando se instala KVM se crea una red privada por defecto (192.168.122.0) para las máquinas virtuales las cuales sólo son accesibles desde el mismo huésped.

(revisar) Si lo que se desea, como en mi caso, es que las máquinas virtuales obtengan una dirección del servicio de DHCP y puedan ser accedidas desde la red LAN como un servidor real es necesario crear un puente en la interfaz de red del servidor para permitirle a las máquinas virtuales acceder a la red física a través de este.

El procedimiento para hacer esto es simple y se describe a continuación.

Advertencia acerca de la red inalámbrica.

Utilizando el método convencional para la creación de puentes no es posible utilizar interfaces de red inalámbricas ya que sus tarjetas no permiten realizar ip spoofing necesario para su implementación.  Es necesario entonces contar con un acceso alámbrico a la red LAN para poder realizar el procedimiento descrito en este artículo.

Investigando en Internet encontré varios foros en los que se menciona que es posible dar solución a este problema sin utilizar el procedimiento estándar sino utilizando aproximaciones alternativas que no estarían supeditadas a la red alámbrica, sin embargo después de cuatro días de intentos y pruebas no me funcionaron así que tuve que utilizar la red cableada.  Las aproximaciones alternativas que sugieren mayor posibilidad de éxito son las siguientes.

En mi caso lo que revisió mayor dificultad para realizar las pruebas de estos procedimientos resultó, mas que la implementación de los mismos que de por si es bastante simple, la configuración de las máquinas KVM (he utilizado libvirt para su manipulación) para que utilicen la nueva interfaz de red ya que los ejemplos mejor descritos que encontré hacían referencia a Virtualbox y para KVM su configuración es notoriamente diferente.

Procedimiento.

Configurar el huésped (servidor de máquinas virtuales).

Instalar el paquete de utilidades para la creación de puentes de red.

$ sudo apt-get install bridge-utils

Editar el archivo de configuración de interfaces de red para agregar la configuración del puente.

$ sudo vi /etc/network/interfaces

Este procedimiento se puede realizar de dos maneras: de manera estática especificando la información precisa de conexión a la red o de manera dinámica permitiendo adquirir la configuración automática desde un servidor DHCP.

De manera estática se realiza de la siguiente manera.

auto br0
iface br0 inet static
address 192.168.1.10
network 192.168.1.0
netmask 255.255.255.0
broadcast 192.168.1.255
gateway 192.168.1.1
bridge_ports eth0
bridge_stp off
bridge_fd 0
bridge_maxwait 0

De manera dinámica se realiza de la siguiente manera.

auto br0
iface br0 inet dhcp
bridge_ports eth0
bridge_stp off
bridge_fd 0
bridge_maxwait 0

En ambos casos se está creando el puente br0 para acceder a la red a través de la interfaz eth0 (red alámbrica).

Reiniciar la configuración de red para tomar en cuenta los cambios recién realizados.

$ sudo /etc/init.d/networking restart

Verificar el estado de los cambios.

$ ifconfig

br0 Link encap:Ethernet  HWaddr 00:24:21:b6:12:11
inet addr:192.168.1.99 Bcast:192.168.1.255  Mask:255.255.255.0
inet6 addr: fe80::224:21ff:feb6:1211/64 Scope:Link
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
RX packets:991 errors:0 dropped:0 overruns:0 frame:0
TX packets:90 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:62573 (62.5 KB)  TX bytes:14537 (14.5 KB)

eth0 Link encap:Ethernet  HWaddr 00:24:21:b6:12:11
inet addr:192.168.1.99 Bcast:192.168.1.255  Mask:255.255.255.0
inet6 addr: fe80::224:21ff:feb6:1211/64 Scope:Link
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
RX packets:991 errors:0 dropped:0 overruns:0 frame:0
TX packets:898 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:77339 (77.3 KB)  TX bytes:67197 (67.1 KB)
Interrupt:27

Nótese como aparece la nueva interfaz de red del puente (br0) que toma igual configuración de red de su destino (eth0).

Configurar el invitado (máquinas virtuales).

Editar la información de especificación de la máquina virtual.

$ virsh edit IDENTIFICADOR_DOMINIO

Modificar la sección de la configuración de red (<interface>) con el siguiente estilo.

<interface type='bridge'>
<source bridge='br0'/>
<model type='virtio'/>
<mac address='00:11:22:33:44:55'/>
</interface>

Actualice la información de la máquina virtual en el Hypervisor e iníciela.

$ virsh -c qemu:///system define /etc/libvirt/qemu/IDENTIFICADOR_DOMINIO.xml

$ virsh -c qemu:///system start IDENTIFICADOR_DOMINIO

Para confirmar el éxito de la configuración, en la máquina virtual consulte su dirección IP, la cual deberá coincidir con la especificada durante la configuración (estática) o la proporcionada por el servidor DHCP (dinámica).

Acerca de la dirección MAC de las interfaces virtuales.

Siempre es conveniente especificar una dirección MAC y que esta sea única entre las diferentes máquinas virtuales para evitar cualquier tipo de confusión.  Con respecto a esta dirección se recomienda que el primer valor sea par (como por ejemplo 00).

Para facilitar la generación de direcciones MAC al azar, la documentación de KVM en Ubuntu incluye un script muy útil.

$ sudo apt-get install randomize-lines

$ vi ~/bin/kvmGenMac               # Almacénelo donde desee.

#!/bin/sh
echo -n "54:52:00"
for i in 1 2 3; do
    echo -n ":"
    for j in 1 2; do
        for k in 0 1 2 3 4 5 6 7 8 9 A B C D E F; do
            echo $k
        done|rl|sed -n 1p
    done|while read m; do
        echo -n $m
    done
done
echo

$ chmod +x ~/bin/kvmGenMac

Para ejecutarlo simplemente invoque el shell y obtenga la dirección MAC al azar de la salida estándar.

$ ./bin/kvmGenMac

Enlaces.

Misterioso renombramiento de interfaces de red en Ubuntu Server 9.10 bajo KVM

Introducción.

Haciendo -muchas- pruebas con la configuración de red de las máquinas virtuales utilizando KVM empecé a tener un extraño problema.  La interfaz de red habitual, eth0, empezó a desaparecerse de la máquina virtual en la que estaba haciendo las pruebas.  Después de una inspección rápida a los mensajes del sistema encontré que había sido renombrada la interfaz a eth2.

$ dmesg | grep eth0

udev: renamed network interface eth0 to eth2

El problema.

En las pruebas que había hecho varias veces había cambiado la configuración de red de la máquina virtual, cambiando también la dirección MAC de la tarjeta de red virtual que KVM le asignaba al dominio provocando que al parecer, el sistema operativo se confundiera pensando que tenía todas esas tarjetas y sólo al inicio cuando verificaba las interfaces se daba cuenta cual era la tarjeta activa.

La solución.

$ vi /etc/udev/rules.d/70-persistent-net.rules

Remueva o comente las líneas correspondientes a las tarjetas de red con que ya no cuenta el servidor dejando únicamente la correspondiente a la MAC en uso.

Reinicie el servicio de red, el servidor o máquina virtual si es posible.

Enlaces.

Desactivar un procesador (o núcleo) en Linux Ubuntu 9.10

CPU History for CPU 0 & 1

Desactivar un procesador o núcleo.

$ echo 0 | sudo tee /sys/devices/system/cpu/cpu1/online

Activar un procesador o núcleo.

$ echo 1 | sudo tee /sys/devices/system/cpu/cpu1/online

Al ejecutar este comando tenga en cuenta el reemplazar los siguientes valores.

  • El valor de activación: 0 desactiva el procesador o núcleo mientras 1 lo activa.
  • El identificador de la CPU: la primera CPU es la número 0, así un equipo de doble núcleo tendrá cpu0 y cpu1.

Iniciar la conexión WiFi aún antes de iniciar el manejador de ventanas en Linux Ubuntu 9.10 con wicd

Introducción.

Después de lograr realizar la conexión a la red inalámbrica en el equipo con Linux Ubuntu Server 9.10 desde la línea de comando instalé el ambiente de ventanas GNOME.  Si, yo se que por seguridad es mucho mejor que un servidor no ejecute un ambiente de ventanas, pero este es algo así como un servidor casero para pruebas y experimentos y por ende me es muy útil contar con un ambiente gráfico que me facilite su administración, tanto local como remota a través de SSH y VNC.

Para configurar la red instalé el applet que conocía hasta el momento, el network-manager de GNOME.  Todo iba perfecto hasta que reinicié el equipo y noté que con esta configuración la red inalámbrica no estaba siendo conectada sino hasta que el usuario hacía sesión.  Así que si el servidor iniciaba hasta la pantalla principal del GDM o si elegía iniciar en modo sólo texto no habría acceso a la red.

Revisando algunos foros leí a varias personas recomendando utilizar wicd como administrador de redes inalámbricas.  Al revisar su página encontré que proveía la característica que estaba buscando.

  • Once configured, will connect even if the X display does not start.
  • Can be configured via the command line using wicd-curses.

Así que me dí a la tarea de instalarlo y funciona a la perfección según mis necesidades.

Instalación.

Desinstalar el network-manager (si cuenta con él).

$ sudo aptitude install network-manager network-manager-gnome

Instalar el wicd.

$ sudo aptitude install wicd

Configuración.

Acceda a la aplicación mediante el menú Applications > Internet > Wicd Network Manager.

Wicd - Network Manager

Seleccione la red con el SSID apropiado, ingrese su información de conexión y presione el botón de conectarse.  Seleccione además la casilla de verificación marcada con el texto "Automatically connect to this network".

Enlaces.

Iniciar Linux Ubuntu 9.10 en modo sólo texto

Introducción.

Después de instalar los paquetes del escritorio, el Ubuntu Server 9.10 quedó iniciando el login gráfico (gdm) automáticamente.  Se me ocurrió que sería interesante probar cuanto se demoraba en iniciar el sistema operativo hasta la consola sólo texto (nivel de ejecución 3 en la mayoría de Linux).  Para hacer esto sólo era necesario editar el archivo /etc/inittab y modificar la siguiente línea, pasando el nivel predeterminado de ejecución, del 5 al 3.

id:3:initdefault:

Pues bien, parece que muchas cosas han cambiado desde esto, Ubuntu 9.10 ya no tiene /etc/inittab.  Desde la versión 6.10 se está migrando paulatinamente a un nuevo esquema llamado Upstart donde los scripts de ejecución ya no vivirán en /etc/init.d como estabamos acostumbrados sino que ahora son archivos de configuración que se almacenan en /etc/init y que son interpretados con el comando service o initctl.

El nivel de ejecución predeterminado de Ubuntu se encuentra ahora definido por la variable DEFAULT_RUNLEVEL en /etc/init/rc-sysinit.conf y que tiene el valor por defecto de 2.

Otra cosa interesante que noté fue que Ubuntu 9.10 tampoco incluye un GRUB como el que conocía hasta ahora (versión 1) sino que trae una nueva versión (2, bueno 1.97~beta4 en realidad) y por ende presenta una distribución y ubicación de archivos diferente.

Basado en esta información y en las pruebas que realicé encontré dos soluciones para esta actividad, una basada en modificar el GRUB (mi preferida) y otra en modificar el nivel de ejecución en el que se activa el GDM.  Ambas aproximaciones parecen funcionar adecuadamente.

Solución #1: Modificación del GRUB.

Básicamente lo necesario es indicarle a Linux que se desea un inicio en modo texto y esto se hace especificando el parámetro text en la lista de parámetros por defecto del GRUB.

$ sudo vi /etc/default/grub

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash text"

Se actualiza la configuración del GRUB para generar un nuevo /boot/grub/grub.cfg.

$ sudo update-grub

Solución #2: Modificar el nivel de ejecución del GDM.

El nivel de ejecución por defecto de Ubuntu es el 2 así que el procedimiento se basa en indicarle al Upstart que ejecute al GDM en un nivel diferente a este: 3.

$ sudo vi /etc/init/gdm.conf

Reemplace la línea de la sección start on mostradas a continuación.

start on (filesystem

Por las siguientes.

start on (runlevel [3]
and filesystem

En ambos casos, reinicie el sistema operativo para verificar que los cambios surtan el efecto deseado.

Iniciar el manejador de ventanas.

Si tuvo éxito llevando a cabo la solución elegida, cuando inicie el sistema operativo lo dejará siempre en la consola basada en texto.  Si en algún momento desea iniciar el ambiente gráfico, puede hacerlo de las siguientes formas.

Para el usuario actual.

$ startx

Iniciar el GDM (temporalmente).

$ sudo service gdm start

Enlaces.