miércoles, 24 de marzo de 2010

Squid y GOSA

La administración centralizada de cuentas de usuario ha sido una bendición para los administradores de sistemas.

Sin embargo, en ambientes donde no se dispone de un directorio activo ofrecido por Microsoft, surge la duda de que usar.

LDAP es el protocolo por excelencia para implementar un directorio de información de usuarios, y suele ser la principal opción para centralizar la gestión de los mismos.

El funcionamiento de LDAP está más allá del tiempo del cual dispongo para redactar esta entrada. Sin embargo, si alguna vez se encuentran instalando LDAP, pueden darle una mirada a GOSA.

GOSA es una interfaz WEB para controlar un directorio LDAP. Como tal ofrece muchos beneficios, el control de acceso al sistema operativo (Windows usando Samba, Linux usando PAM), el control de Asterisk (usando PostgreSQL), el control de acceso al servidor proxy cache.

Si alguna vez se encuentran desplegando un ambiente de squid + GOSA, puede venir a la mano la inclusión de cadenas de búsqueda del tipo :

(&(objectClass=person)(uid=%s)(objectClass=gosaProxyAccount))

donde van a poder administrar el acceso al cache desde la comodidad de un sistema centralizado de usuarios, como lo es GOSA.

Saludos!

jueves, 18 de marzo de 2010

Cambiar la máscara de creación de directorios home

Configurando un equipo que va a manejar multiples usuarios, he tenido la necesidad de cambiar el comportamiento por defecto (en ubuntu) para la forma en que se crean los nuevos usuarios. Ubuntu crea los directorios de usuario en /home y con una máscara 0755. Sin embargo, para mi caso es necesario utilizar la máscara 0700.

El archivo de configuración ubicado en /etc/adduser.conf permite modificar estas opciones. Haciendo la variable DIR_MODE=0700, los nuevos usuarios crearán su carpeta con dichos privilegios.

Otra de las opciones interesantes es modificar el comportamiento adduser para que no cree nuevos grupos cada vez que se crea un usuario, en mi caso (y el caso más común) los usuarios pertenecerán al grupo con GID 100 (users). Primero hay que hacer la variable "USERGROUPS=no", finalmente verificar que "USERS_GID=100" hace referencia al grupo deseado.

Hasta pronto!

miércoles, 17 de marzo de 2010

KVM y multiples interfaces TUN/TAP

He estado ensayando el hipervisor KVM, una de las razones que me llevaron a probar este hipervisor, es que aprovecha las bondades de virtualización que ofrecen los procesadores modernos como mi nuevo Intel I7.

Hasta ahora ha demotrado tener un buen desempeño, y hay que destacar las innumerables opciones de administración, como la capacidad de asignar un número fijo de procesadores, el uso de imágenes qcow, etc.

Un problema con el que tuve que lidiar, es el uso de interfaces virtuales que den acceso directo a la red donde está conectada la tarjeta del equipo anfitrión.

Resulta que QEMU ofrece muchas opciones para el trabajo en red, el modo usuario (parecido a las interfaces NAT que ofrecen otros productos), el uso de dispositivos TUN/TAP, y una alternativa muy interesante llamada VDE.

Hay mucha documentación en la red sobre como hacer correr estas opciones, y me parece innecesario volver a copiar lo que otros han escrito (y de donde he aprendido).

Lo que quiero registrar es como configurar diferentes interfaces en el sistema invitado (guest) y ubicar dichas interfaces en diferentes puentes (bridges).

Bueno, lo primero que hay que hacer es configurar el puente de red.

El comando `brctl`, permite crear este tipo de dispositivos. Basta hacer algo así como:

# brctl addbr dmz
# brctl addbr internal

Hemos creado dos puentes para conectar nuestros dispositivos TUN/TAP. Ahora hay que añadir la interfaz física (eth0, eth1) a cada uno de los puentes.

# brctl addif dmz eth0
# brctl addif internal eth1

Aquí viene la parte interesante, para poder configurar KVM con un dispositivo TUN es necesario añadir la siguiente línea a la llamada a qemu.

-net nic,model=virtio,macaddr=00:16:3e:11:10:5b -net tap,ifname=internal0,script=/home/virtual/ltsp/ifup.internal

Ahora bien, la primera definición a -net crea una interfaz virtual con los drivers de paravirtualización virtio (si esto no suena muy facil de digerir, digamos que mejoran el desempeño y el acceso desde la máquina anfitrión a los dispositivos de entrada y salida), definir la MAC de manera estática es muy importante, sobretodo si se va a correr equipos Linux donde cada nueva MAC incrementa el número de la interfaz (uno puede terminar escribiendo cosas locas como ifconfig eth45), para crear la MAC se puede usar el script definido en alguna página de RED HAT, aquí va:


#!/usr/bin/python
# macgen.py script to generate a MAC address for Red Hat Virtualization guests
#
import random
#
def randomMAC():
mac = [ 0x00, 0x16, 0x3e,
random.randint(0x00, 0x7f),
random.randint(0x00, 0xff),
random.randint(0x00, 0xff) ]
return ':'.join(map(lambda x: "%02x" % x, mac))
#
print randomMAC()

La segunda línea pide a QEmu crear un dispositivo TAP y pasarlo como el argumento $1 al script de inicialización de la interfaz. El argumento ifname además define el nombre de dicha interfaz. Aquí va una copia del script.

#!/bin/bash

set -x
switch=dmz

if [ -n "$1" ] ; then
ip link set $1 up
sleep 0.5s
brctl addif $switch $1
exit 0

else
echo "Error: no interface specified"
fi

Con esto podemos tener una máquina invitada corriendo su dispositivo de red como si estuviera conectada a la misma red del dispositivo anfitrión.

Para añadir una segunda interfaz, uno podría estar tentado a hacer algo así como:
-net nic,model=virtio,macaddr=00:16:3e:11:10:5b -net tap,ifname=internal0,script=/home/virtual/ltsp/ifup.internal -net nic,model=virtio,macaddr=00:16:3e:11:10:5c -net tap,ifname=dmz0,script=/home/virtual/ltsp/ifup.dmz

Pero de este modo, las tarjetas quedan ubicadas en la misma interfaz, y aunque QEmu crea el segundo TAP parece que no lo conecta con la segunda interfaz definida. La solución es muy sencilla (aunque me llevó mucho tiempo encontrarla), se debe definir cada interfaz en una vlan diferente, como aparece a continuación.

-net nic,vlan=1,model=virtio,macaddr=00:16:3e:11:10:5b -net tap,vlan=1,ifname=internal0,script=/home/virtual/ltsp/ifup.internal -net nic,model=virtio,macaddr=00:16:3e:11:10:5c -net tap,ifname=dmz0,script=/home/virtual/ltsp/ifup.dmz

Hasta pronto!

R y los intervalos de confianza III

El ejercicio del colesterol trae mas preguntas que respuestas. Por ejemplo, como comparar las dos poblaciones?. Una buena alternativa es encontrar el intervalo de confianza para la diferencia de dos medias (x1-x2) con varianzas conocidas.

Vamos a ver como hacerlo en R, nuevamente no voy a expresar los contenidos matemáticos (aunque pueden ser extraídos directamente del código de R).

> cidiffmeanvarknown <- function(mmean1,mmean2,sd1,sd2,n1,n2,alfa=0.05) + c(mmean1-mmean2-qnorm(1-alfa/2)*sqrt((sd1*sd1/n1)+(sd2*sd2/n2)),mmean1-mmean2+qnorm(1-alfa/2)*sqrt((sd1*sd1/n1)+(sd2*sd2/n2)))

Si aplicamos esto a nuestro ejemplo del colesterol, tenemos el siguiente resultado.

> cidifffcidiffmeanvarknown(170.81,181.08,30.55,30.79,96,85,0.10)
[1] -17.785222 -2.754778

Hemos considerado que los hombres son x1, como podemos apreciar el intervalo no incluye al cero, por lo tanto podemos decir que tenemos una confianza del 90% de que el nivel de colesterol en los hombres es inferior que el nivel de colesterol de las mujeres por una cantidad que oscila entre 2.75 mg/dl y 17.78 mg/dl.

Hasta pronto!

martes, 16 de marzo de 2010

Slackware 13.0 y RAID 1 desde la instalación

Es otra vez esa época cuando tienes que hacer una actualización de la infraestructura de TI. En esta ocasión se trata de un servidor corriendo un ambiente LTSP y otros servicios. El hardware usado es impresionante, procesador I7 de 2,8 Ghz, 8 Gb RAM y 2 TB de almacenamiento.

La idea es desplegar todo el sistema utilizando las capacidades de virtualización que ofrece el procesador. Esto quiere decir que se va a virtualizar el servidor LDAP, el proxy, el IDS, el servidor de terminales windows y el servidor de terminales linux (wow, cuando lo escribes suena como mucho trabajo!).

Y como siempre, he olvidado el procedimiento para instalar slackware (mi sistema anfitrión) en arreglos RAID. Así que sólo para que quede documentado, aquí va!...

La idea es utilizar dos discos de 1TB en arreglo RAID 1, dos particiones serán usadas para el sistema anfitrión (/ y swap), mientras que otras particiones serán utilizadas en kvm.

Para evitar la sobrecarga de la indirección (entradas indirectas en el nodo i), se usarán las particiones directamente desde las máquinas virtuales en lugar de utilizar archivos imagen.

Lo primero es crear una tabla de particiones en uno de los discos, y cuando todo esté listo se puede duplicar (siempre y cuando los discos sean semejantes) con el comando

# sfdisk -d /dev/sda | sfdisk /dev/sdb

una vez que están creadas las particiones, sólo resta crear los dispositivos mdX, el siguiente comando creará los dispositivos en RAID 1

# mdadm --create /dev/mdx --level=1 --raid-devices=2 /dev/sd[ab]x

No he creado la partición swap sobre arreglos raid, la verdad no veo el propósito de hacerlo así y puedo aprovechar el espacio del otro disco para las máquinas virtuales.

Hasta la próxima!





lunes, 15 de marzo de 2010

R y los intervalos de confianza II

Vamo a jugar un poco con esto de los intervalos de confianza, tengo por aca un problema que ha llegado a mis manos.

dice así: El nivel de colesterol es un factor de alto riesgo en el desarrollo de la enfermedad de artoesclerosis cardíaca y de la enfermedad de arteria coronaria, por tanto, es importante determinar los niveles que esperamos en los diferentes grupos de edad y sexo. Para comparar el nivel de colesterol en varones de entre 20 y 29 años frente a mujeres del mismo grupo de edad se realizó un estudio cuyos datos estadísticos básicos son los de la siguiente tabla.




















homres

mujeres

numero: 96

numero: 85

media: 170.81 mg

media: 181.08 mg

desviación: 30.55 mg

desviación: 30.79 md


Ahora bien, si calculamos los intervalos del confianza al 90% para la media en los hombres tenemos:

> cimeanvarknown(170.81,30.55,96,0.1)
[1] 165.6814 175.9386

hasta la próxima!

R y los intervalos de confianza I

El tema de intervalos de confianza siempre me pareció dificil de comprender. De hecho la estadística, lenguaje que considero "las matemáticas del mundo real", siempre me parecieron bastante enredadas.

En fín, el doctor Douglas Montgomery dice, mas o menos que

Una estimación por intervalos de un parámetro desconocido, es un intervalo en el que se puede encontrar dicho parámetro (l<x<u), donde los puntos l y u dependen del comportamiento estadístico de x. Por lo tanto, muestras diferentes de la misma población producirán valores distintos y puntos extremos diferentes (y dichos puntos serán valores de variables aleatorias, por ejemplo L y U).

Es posible determinar los valores de L y U de manera que la siguiente proposición sea verdadera:

P(L<x<U) = 1 - a

Como es dificil de entender el parrafo anterior, aquí va mi interpretación. El tema de los intervalos de confianza aparece por que un valor obtenido en una muestra no da mucha información sobre otras muestras, entonces el promedio de una muestra tiene muchas posibilidades de diferir con el promedio de otra muestra (aunque los valores podrían estar cercanos), el intervalo en el que pueden diferir es lo que interesa.

Para tomar decisiones es mejor decir a tu jefe que los costos del proyecto podrían estar alrededor de un valor estimado que decirle el costo exacto y esperar a que se cumpla.

Se llaman intervalos de confianza por que uno de los parámetros que se pueden definir es la "confianza" en la estimación. Por supuesto, un valor muy alto de confianza traerá intervalos muy "amplios", si consideramos que la amplitud del intervalo es una medida de su precisión, entonces tenemos una situación donde se debe intercambiar confianza en la estimación por precisión en los resultados.

No voy a explicar como se calcula (es decir, con las formulas) un intervalo de confianza. Este tema puede encontrarse en libros de estadística y hasta en wikipedia.

R, es un programa para hacer análisis estadístico. Como fue pensado para esto, era obvio que tenía que calcular los intervalos de confianza. El primer caso para hallar estos intervalos es el intervalo de confianza para la media con varianza conocida.

podemos definir la siguiente función:

> cimeanvarknown <- function(mmean,sd,n,alfa=0.05)
+ c(mmean-qnorm(1-alfa/2)*sd/sqrt(n),mmean+qnorm(1-alfa/2)*sd/sqrt(n))

(tomado del documento encontrado en la red con titulo "Estadística I. Análisis estadístico con R. 38")

de este modo podemos hacer estimaciones sobre el intervalo de confianza con varianza conocida.

Hay que hacer algunas aclaraciones que no estaban en el documento, en primer lugar note que el calculo del intervalo llama a la función qnorm(). (qnorm() con es una función que retorna el valor z en la distribución normal.)

Esto quiere decir que se está considerando que la distribución de muestreo es normal si la población es normal y aproximadamente normal si se cumplen las condiciones del teorema del límite central.

hasta la próxima!

Primera publicación

Hace rato quería abrir un Blog, aún cuando reconozco que es muy probable que este sea un proyecto que sufra de abandono temprano.

No le recomiendo a nadie que se subscriba a este blog, de hecho no le recomiendo a nadie que lea las entradas de este blog. No quiere decir que me sienta incomodo con el hecho de que alguien lea las entradas consignadas aquí. Es sólo que el propósito de este blog es tener un "cuaderno de notas" sobre las cosas que no entiendo muy bien o que estoy estudiando por alguna razón. Por lo tanto, los contenidos del blog no serán muy coherentes; y conociendo a la entropía, las cosas se pueden volver bastante difícil de seguir en un tiempo.

De todas formas, si alguien quiere seguir leyendo las entradas de este sitio hagalo bajo su propia responsabilidad y por favor dude de todo lo que aparece consignado aquí.