viernes, 21 de diciembre de 2007

Gentoo from scratch



Gentoo es la instalación más engañosa de todas las que he hecho bajo Virtual PC. Al bajar el livecd-i686-installer-2007.0.iso y cargarlo en una máquina virtual detectó perfectamente la pantalla del laptop a muy buena resolución, lo que me llevó a pensar que la instalación iba a ser pan comido. Pero el primer inconveniente es que dentro de x no detectó el mouse y simplemente no hubo forma que lo detectara.

Con Alt-F1 y usando las teclas conseguí que el sistema de instalación funcionara, pero en la mitad aparecía el error There was an exception received during the install that is outside the normal install errors. This is a bad thing. The error was: Invalid literal for int(): luego de eso me botaba.

Con Ctrl-Alt-F1 salí a la consola y traté de usar installer, que es el instalador en modo de texto. Pero la misma cosa, en la mitad de los procesos el programa daba un error y no podía seguir.

Pensé que era una buena oportunidad de intentar armar el Gentoo a mano, from scratch, usando la excelente documantación del handbook, la mejor que he visto para un Linux y me puse a seguir cada paso, bajando desde Internet, descomprimiendo, compilando, configurando el kernel y todo lo necesario para que el sistema funcionara. Una instalación completa de este tipo toma muchas horas, especialmente si no tenemos una conexión rápida a la web y de nuevo se presentaron problemas de lectura/escritura al disco.

Partí por hacr un checkdisk a mis discos duros, primeros sospechosos del problema, pero estaban perfectos. Después de quebrarme la cabeza un buen rato se me ocurrió que tal vez el problema podría estar en el tamaño dinámico que asigna Virtual PC a los discos web. Así es que borré todo y generé un disco de 5 Gb de tamaño fijo. No sé si esa sería la causa pero después de dejar el disco fijo desaparecieron los problemas.

Otro problema lo tuve con el arhivo /boot/grub/grub.conf que al cargarse el sistema no encontraba un archivo y se quedaba colgado en un loop. Entonces aprendí una característica interesante del Grub que es su modo de comandos al que se entra con c.

El modo de comandos con el prompt > me permitió ingresar manualmente las opciones del kernel con:

>root (hd0,0)
>kernel /boot/kernel-genkernel-i86-2.6.23-gentoo-r3
>boot

lunes, 17 de diciembre de 2007

RFC: algunas convenciones de conectividad

Existen las redes, que por un lado son parte de redes mayores y por otro tienen subredes. Esta es la situación normal del networking por lo que se hace necesario seguir algunas convenciones, para impedir que se generen confusiones o que se nos termine el espacio de nombres o direcciones.

Así es como se han desarrollado muchos RFC (Request for Comments) que son documentos que proponen las mejores prácticas que después se convierten en estándares. En este sitio se puede encontrar una buena cantidad de estos RFC traducidos al español. Me ncionaré brevemente dos referidos a asuntos muy básicos:

RFC1178-es - Cómo elegir un nombre para su ordenador, que entrega recomendaciones de buena práctica para escoger los nombres de los equipos que usaremos en nuestra red. Varias de estas recomendaciones son obvia: evitar nombres ambiguos, nombres de personas, demasiado largos, etc. Entre las recomendaciones encontré una interesante que suguiere crear nombres temáticos: por ejemplo de la mitología o cosas por el estilo (el servidor del Sistema de Impuestos Internos en Chile se llama Zeus) . En mi caso la convención de nombres que uso es de la forma IPC+marca o modelo del equipo (por ejemplo ipclenovolaptop)

RFC1918-es - Asignación de direcciones para Internet privadas, que define los rangos de IP que se recomiendan para usar en nuestras redes internas, estos rangos son:

10.0.0.0 - 10.255.255.255 (prefijo 10/8)
172.16.0.0 - 172.31.255.255 (prefijo 172.16/12)
192.168.0.0 - 192.168.255.255 (prefijo 192.168/16)

El primer bloque se conoce como "bloque de 24 bits", el segundo es el "bloque de 20 bits" y el tercero el "bloque de 16 bits" de acuerdo a la cantidad de direcciones que podemos asignar.

Al diseñar nuestra red privada e importante usar solo las direcciones dentro de los espacios mencionados arriba porque usando otras direcciones se podrían producir graves ambiguedades y pérdida de ruta de los paquetes. También se asignan las IP privadas según la "categoría" de la máquina, según el espacio de acceso que tengan: algunas solo necesitan acceso interno, dentro de la propia red (categoría 1) , otras necesitan solo ciertos servicios de Internet, por ejemplo email, ftp), ect. (categoría 2) y finalmente las que necesitan acceso pleno a nivel de red con Internet (categoría 3).

Networking

Para empezar a aprender lo básico de redes traduje un documento llamado Nociones acerca de redes TCP/IP, que pueden revisar en el link

domingo, 16 de diciembre de 2007

PF Firewalls con Open BSD



El concepto de firewall (cortafuegos) es sencillo: Internet es una red sucia, donde existe una mezcla de tráfico que nos interesa recibir (por ej las páginas que queremos accesar, nuestra administración remota, etc.) junto con otro tráfico que no querremos recibir ](hackers, virus, spam, etc.). Queremos que nuestra red interna sea limpia, es decir que reciba solamente lo que nos interesa y sobre todo que no entregue otrra información que la que específicamente le permitamos. El cortafuegos es una máquina con un programa que hace esa tarea de filtrar desde y hacia nuestra red limpia a la red sucia. Puede ser solo un programa corriendo en nuestra máquina, pero cuando la seguridad es importante se usa una máquina aparte, dedicada exclusivamente a correr un programa con nuestras pol{iticas de filtrado.

Uno de los usos principales del Open BSD es para implementar máquinas cortafuego en sistemas de servidores conectados a Internet. El Open BSD es Unix, es seguro y funciona en muchas plataformas especialmente i386 (o sea los PC). Su uso entonces es conectar Internet (la red externa o sucia) con un equipo corriendo Open BSD que actúa como cortafuegos, es decir filtra los paquetes que entran y salen de nuestra red interna (limpia) adonde se conectan los servidores. O sea tenemos Internet - Cortafuegos - Router y finalmente nuestra red interna limpia.

Open BSD usa un sistema llamado PF (por packets filter) que nos permitirá controlar todo lo que entra y sale a nuestra red. En la práctica el cortafuegos se define en un archivo de texto simple (en formato Unix, sin CR+LF) llamado pf.conf y ubicado en /etc/ o sea el archivo es /etc/pf.conf

Sin embargo no basta con crear o editar el archivo, para que las reglas sean leídas por el kernel se deben cargar con el comando pfctl. El prompt del Open BSD es #, así es que desde la línea de comandos podríamos cargar el archivo /etc/pf.conf usando

# pfctl -o none -R -f /etc/pf.conf

en este ejemplo se usaron varias opciones como:
-o none significa optimizaciones: none (no optimizar) la razón es que las optimizaciones no funcionan con la opción -R en openbsd 4.2

-R para cargar solo las reglas de filtro presentes en /etc/pf.conf ignorando las demás reglas

- f espera the que la opción siguiente sea el archivo a cargar

Las reglas básicas son block (para bloquear) y pass (para dejar pasar)

Las reglas de un archivo /etc/pf.conf se ejecutan consecutivamente y si se contradicen la que queda al final es la que vale, por ejemplo

block in all
pass in all

la primera regla bloquea todo el tráfico de entrada y la segunda deja pasar todo el tráfico de entrada, si están escritas en ese orden, al ejecutarse el archivo prevalecería pass in all porque es la última en ejecutarse

Aunque lo anterior no tiene sentido algo similar se usa en script reales, por ejemplo primero se bloquea todo lo que ingrese y después se permite pasar los paquetes de una dirección determinada:

block in all
pass in from maquina.amiga.org to any

Si una regla tiene un "quick" entonces la ejecución secuencial se detiene en esa regla y no se chequean las otras reglas

En un script real las reglas serían más o menos así:

################################################################################
# Define Interface Shortcuts
################################################################################
IntIF="em0" # Internal (clean) Interface
ExtIF="em2" # External (dirty) Interface
FWAdminIF="em2" # Remote Admin Firewall (SSH only) Interface

Esas reglas por ejemplo definen variables dándoles un valor, en este caso em2 es el nombre de la interfase ethernet que está conectada a Internet y em0 as la interface conectada a los servers detrás del firewall

Otra regla muy común es bloquear las direcciones RFC1918, que son de redes privadas y a veces salen para Internet causando mucho estropicio en las redes internas. El punto aquí es que se pueden usar estas direcciones detrás del firewall, pero este tráfico nunca se debe filtrar para afuera, y si alguien fuera del firewall las está usando ese tráfico no se debe filtrar ahacia adentro.

NoRouteIPs="{ 0.0.0.0/32, 127.0.0.1/8, 192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8 }"

Con eso la red interna queda limpia de los paquetes de esos rangos que se pueden confundir con los que usamos en los mismos rangos para nuestras redes. También se usa scrub, para normalizar los paquetes defectuosos o fragmentados que llegan, por ejemplo con

scrub in all

Y por defecto, al principio del script se bloquea todo el tráfico tanto de entrada como de salida, las reglas más adelante irán permitiendo selectivamente que es lo que puede pasar por el cortafuegos, este bloqueo general se hace con:

block in log all
block out log all

Por ejemplo podríamos permitir que el Administrador tenga acceso a nuestra red interna via SSH (putty o similar) con

# ---
# --- Admin Interface for firewall itself
# ---
# --- Block all except SSH
# ---
block in log on $FWAdminIF all
block out log on $FWAdminIF all
pass in log quick on $FWAdminIF \
inet proto tcp from $RemoteAdmins to $FWAdminIP \
port 84 \
flags S/SA keep state

las líneas con # son comentarios y no tienenefecto, ahora veamos este conjunto de reglas por partes:

block in log on $FWAdminIF all
block out log on $FWAdminIF all

Bloquea por defecto todo tráfico de entrada y salida de $FWAdminIF dejándo los intentos de acceso registrados en un archivo log

pass in log quick on $FWAdminIF \

Deja pasar el tráfico de entrada de $FWAdminIF registrándolo en un archivo log, la regla quick hace que esto se ejecute de inmediato, sin necesidad de buscar otras órdenes posteriores que pudieran contradecir esta. Para que pasen todos los paquetes en protocolo tcp de Internet se usa:

inet proto tcp from $RemoteAdmins to $FWAdminIP \

Donde $RemoteAdmins son las redes externas de administrador remoto y $FWAdminIP es el número IP de firewall del administrador (son variables definidas antes en el mismo script). Finalmente veamos:

flags S/SA keep state

flags se usa para filtrar los paquetes TCP según sus indicadores, flags S/SA permite el paso de tráfico TCP con el indicador SYN activo, y sólo mira a los indicadores SYN y ACK. Un paquete con los indicadores SYN y ECE concordaría con la regla anterior, mientras que un paquete con SYN y ACK, o sólo con ACK, no concordaría.

keep state es para que recuerde la conexión anterior en la memoria del equipo.

Esos son algunos ejemplos de reglas PF, a medida que vaya viendo más las colocaré acá mismo.

viernes, 14 de diciembre de 2007

Instalando OpenBSD y S keys



OpenBSD es el "Unix seguro" que trae incorporadas características de criptografía y seguridad lo que lo hace especial para implementar firewalls en servidores donde la seguridad es un factor crítico, usando PF (packets filter) con scripts de texto que describen las reglas de que tráfico es permitido y cual es bloqueado.

Encontré una excelente guía en la web Open BSD 4.2 que trae todo lo necesario para instalar el sistema, desde donde obtener la imagen ISO hasta el procedimiento detallado de instalación. Para instalar sobre Virtual PC casi no hay que hacer ningún cambio, excepto uno obvio en Network Configuration, en IPv4 address for fxp0? hay que escoger DHCP en lugar de la IP fija que aparece en el ejemplo, en DNS nameserver? ofrecerá por defecto la IP de nuestro servidor DNS así es que solo hay que poner Enter. El resto todo funciona tal cual detalla el ejemplo de la web Open BSD. Luego de configurar la red pasará a la instalación de los paquetes, como esto lo hace online desde un sitio ftp (hay que escoger cualquiera de las varias alternativas que se presentan) se aprovecha de ver enseguida si el networking del paso anterior quedó funcionando.

S keys
Se trata de un sistema seguro para identificarse y accesar remotamente a sistemas Linux, el procedimiento de autenticación tiene varias partes, hay un procedimiento que se hace solo una vez para generar el párrafo secreto a prueba de sniffers:

-Se establece una conexión SSH (con Putty por ejemplo) con el administrador del servidor, quien nos envía un password provisional por un medio inseguro (por ejemplo jabber o cualquier IM). Al conectarse por SSH por primera vez se usa passwd para cambiar el password inseguro. Luego para obtener el nuevo password se usa
skeyinit -n 100 -md5
y con eso se escoge un nuevo párrafo secreto que valdrá para las próximas 100 sesiones

Esto se hace solo una vez y dura para 100 sesiones, para accesar a cada sesión se usa:

- Ingresar a la página de login del servidor remoto y se coloca el nombre de usuario, luego Submit Query, con esto aparece la pregunta de "challenge" del servidor.
- Ingresar a http://www.finnie.org/otp/ y se ingresa el challengue y el párrafo secreto, luego se hace click en Compute with MD5, aparece entonces una "Response" consistente en 6 palabras, por ejemplo: OAR BANK SHE ED KNEE SOWN
-Se vuelve a la página login del servidor y se coloca la respuesta junto con el nombre de usuario, se recarga la página hasta que aparezca el mensaje que el firewall concedió el acceso. Se puede ajustar la duración del acceso entre media hora y dos semanas.

Con eso se puede acceder al servidor traspasando el firewall

miércoles, 12 de diciembre de 2007

Webmin

Después de instalar Samba (ver nota anterior) me puse a buscar una aplicación para administrar con mayor facilidad y me encontré con Webmin, que hasta el momento lo veo muy bueno.

Para instalarlo (no viene dentro de los paquetes estándar) con un poco de Google encontré el Blog Un Lugar en el Mundo donde sale el truco:

$ sudo apt-get install libio-pty-perl libnet-ssleay-perl libauthen-pam-perl libmd5-perl
$ sudo wget -c http://prdownloads.sourceforge.net/webadmin/webmin_1.320_all.deb
$ sudo dpkg --install webmin_1.320_all.deb

Inclusive de un solo clic desde webmin pude instalar el servidor Apache, nice and easy

martes, 11 de diciembre de 2007

Instalando Mandriva en Virtual PC




Y ahora me tocó probar con ZMliveCD_1.22.3.ISO que es una versión Zone Minder del Linux Mandriva, que trae integrada una solución para cámaras de seguridad y vigilancia.

La instalación partió sin novedades con el mismo procedimiento que las anteriores gOS y Ubuntu, excepto que el el live CD de la imagen ISO detectó una resolución de pantalla incorrecta para la máquina virtual por lo que no se podía ver absolutamente nada.

Como al menos el modo consola funcionaba, hice alt-ctrl-F1 para salir a la consola donde apareció un mensaje notificando que no se había podido cargar el modo gráfico y hacía algunas sugerencias. La primera era usar F2 al momento de bootear y agregar la opción
livecd framebuffer
lo que no tuvo ningún efecto, luego probé con
livecd xres=800x600
tampoco tuvo efecto (al parecer hace una detección automática desde el live CD que sobrepasa estas opciones)

Pasé a la otra recomendación que consistía en hacer
user guest
password guest
sudo cmm

Con lo que se ingresa a varias opciones de configuración desde la consola. Allí cambié la resolución bajando la profundidad de colores a 8 bits, usando "test" comprobé que funcionaba bien y luego Quit y Yes para grabar los cambios. Al tratar de volver al modo gráfico con
startx
según decía la recomendación, apareció una serie de mensajes de error del tipo
Error in, Locking Authority File
make sure an x server isnt already running

La explicación, obtenida en chile.comp.unix (gracias Carlos!) fue:
"Tal como dice el msg no puede iniciar x porque ya esta corriendo. al hacer alt-ctrl-f1 solo te cambiaste a una de los tty no mataste el x, par amatar el x o le mandas un alt-ctrl-backspce o un cambio a run level 3 o similar (no cacho mucho mandriva, es solo para maricas) luego haces
los cambios, luego reinicias x."

Probé con alt-ctrl-backspace y no funcionó, luego buscando en Google encontré como cambiar a run level 3 con
sudo /sbin/ init 3

Luego de eso funcionó el startx y pude cargar el live CD para comenzar a instalar.

Pero no quedé satisfecho con la resolución así es que traté de cambiarla repitiendo todo el procedimiento, esta vez al hacer startx nuevamente salió una pantalla azul y se quedó colgado. Intuitivamente probé haciendo
sudo /sbin/ init 1

Y funcionó. Al instalar Mandriva todo bien hasta que me pidió el password para root, donde me encontré de nuevo con el desagradable y conocido problema de la autorepetición de las teclas que funciona muy mal en Virtual PC. Después de mucho bucear en algún lugar del KDE encontré la opción de desactivar la repetición del teclado -tratando de buscarla de nuevo no la encontré- y pude entrar el password. De allí en adelante todo bien, como muestra la imagen, ya tengo Ubuntu gOS y Mandriva corriendo al mismo tiempo en Virtual PC sin problemas.