GRUB: Mejorando nuestro gestor de arranque

Anteriormente había comentado en la primera entrega del artículo Debian: Bienvenido al Sistema Operativo Universal que por medidas de seguridad establezco las opciones de montaje ro, nodev, nosuid, noexec en la partición /boot, donde se encuentran los ficheros estáticos del gestor de arranque.

El gestor de arranque que manejo es GRUB. Por lo tanto, el motivo de este artículo es explicar como suelo personalizarlo, tanto para dotarle de seguridad como mejorar su presentación.

Seguridad

Lo primero que hago es verificar el dueño y los permisos que posee el fichero /boot/grub/menu.lst, en mi opinión la permisología más abierta y peligrosa sería 644, pero normalmente la establezco en 600, evitando de ese modo que todos los usuarios (excepto el dueño del fichero, que en este caso será root) puedan leer y escribir en dicho fichero. Para lograr esto recurrimos al comando chmod.

# chmod 600 /boot/grub/menu.lst

Si usted al igual que yo mantiene a /boot como una partición de solo lectura, deberá montar de nuevo la partición /boot estableciendo la opción de escritura, para lo cual hacemos:

# mount -o remount,rw /boot

Después de ello si podrá cambiar la permisología del fichero /boot/grub/menu.lst de ser necesario.

El segundo paso es evitar que se modifique de manera interactiva las opciones de inicio del kernel desde el gestor de arranque, para ello estableceremos una contraseña para poder editar dichas opciones, pero primero nos aseguraremos de cifrar esa contraseña con el algoritmo MD5. Por lo tanto, haremos uso de grub-md5-crypt

# grub-md5-crypt
Password:
Retype password:
$1$56z5r1$yMeSchRfnxdS3QDzLpovV1

La última línea es el resultado de aplicarle el algoritmo MD5 a nuestra contraseña, la copiaremos e inmediatamente procedemos a modificar de nuevo el fichero /boot/grub/menu.lst, el cual debería quedar más o menos como se muestra a continuación.

password --md5 $1$56z5r1$yMeSchRfnxdS3QDzLpovV1

title           Debian GNU/Linux, kernel 2.6.18-3-686
root            (hd0,1)
kernel          /vmlinuz-2.6.18-3-686 root=/dev/sda1 ro
initrd          /initrd.img-2.6.18-3-686
savedefault

title           Debian GNU/Linux, kernel 2.6.18-3-686 (single-user mode)
root            (hd0,1)
kernel          /vmlinuz-2.6.18-3-686 root=/dev/sda1 ro single
initrd          /initrd.img-2.6.18-3-686
savedefault

La instrucción password --md5 aplica a nivel global, así que cada vez que desee editar las opciones de inicio del kernel, tendrá que introducir la clave (deberá presionar la tecla p para que la clave le sea solicitada) que le permitirá editar dichas opciones.

Presentación del gestor de arranque

A muchos quizá no les agrade el aspecto inicial que posee el GRUB, una manera de personalizar la presentación de nuestro gestor de arranque puede ser la descrita en la segunda entrega de la entrada Debian: Bienvenido al Sistema Operativo Universal en donde instalaba el paquete grub-splashimages y posteriormente establecía un enlace simbólico, el problema de esto es que estamos limitados a las imágenes que trae solo ese paquete.

A menos que a usted le guste diseñar sus propios fondos, puede usar los siguientes recursos:

Después de escoger la imagen que servirá de fondo para el gestor de arranque, la descargamos y la colocamos dentro del directorio /boot/grub/, una vez allí procedemos a modificar el fichero /boot/grub/menu.lst y colocaremos lo siguiente:

splashimage=(hd0,1)/grub/debian.xpm.gz

En la línea anterior he asumido lo siguiente:

  • La imagen que he colocado dentro del directorio /boot/grub/ lleva por nombre debian.xpm.gz
  • He ajustado la ubicación de mi partición /boot, es probable que en su caso sea diferente, para obtener dicha información puede hacerlo al leer la tabla de particiones con fdisk -l o haciendo uso del comando mount.

    $ mount | grep /boot /dev/sda2 on /boot type ext2 (rw,noexec,nosuid,nodev)

    fdisk -l | grep ^/dev/sda2

    /dev/sda2 1217 1226 80325 83 Linux

Por lo tanto, la ubicación de la partición /boot es en el primer disco duro, en la segunda partición, recordando que la notación en el grub comienza a partir de cero y no a partir de uno, tenemos como resultado hd0,1.

También puede darse el caso que ninguno de los fondos para el gestor de arranque mostrados en los recursos señalados previamente sean de su agrado. En ese caso, puede que le sirva el siguiente video demostrativo sobre como convertir un fondo de escritorio en un Grub Splash Image (2 MB) haciendo uso de The Gimp, espero le sea útil.

Después de personalizar el fichero /boot/grub/menu.lst recuerde ejecutar el comando update-grub como superusuario para actualizar las opciones.

3 min read

Identificar el Hardware de tu PC en Debian GNU/Linux

Bien, lo que vamos a hacer a continuación es muy fácil, tán fácil como instalar un paquete, luego ejecutarlo y leer la información que él nos “escupe” (me encanta como suena :) ). Como sabrán, soy usuario de Debian GNU/Linux en su versión Etch para la arquitectura AMD64, pero ésto en realidad no es tan relevante ya que el paquete se encuentra tanto en Testing como en Stable para la mayoría de las arquitecturas y en la sección main de los repositorios.

Lo que vamos a instalar es el paquete lshw-gtk, que bien como dice en la descripción del paquete: “es una pequeña herramienta que provee información detallada de la configuración de hardware de la máquina. Puede reportar la configuración exacta de la memoria, versión de firmware, configuración de la tarjeta madre, versión del procesador y su velocidad, configuración de la caché, velocidad del bus, etc. en sistemas x86 con soporte DMI, en algunas máquinas PowerPC (se sabe de su funcionamiento en las PowerMac G4) y ADM64”.

Como ya sabrán, para instalar el paquete es tan sencillo como abrir una terminal y escribir en modo superusuario los siguiente:

 # aptitude install lshw-gtk

El paquete no es muy pesado, de hecho, con todo y dependencias a penas ha de superar el mega de información, por lo que el proceso de instalación es rápido (si se tiene una conexión decente claro).

Una vez instalado el paquete no tenemos que hacer más que ejecutarlo. Para poder ejecutarlo debemos hacerlo desde una terminal, ya que según tengo entendido, no se instala en los menús del Gnome. Así que debemos escribir en una terminal (en modo superusuario):

 # lshw-gtk

y listo, se ejecutará perfectamente, dejándonos navegar por unos paneles donde se encuentran los distintos componentes de nuestro sistema.

Si lo que quieres es tener un lanzador en los menús del Gnome, es muy sencillo, sólo deberás crear uno de la siguiente manera. Abre una terminal en modo superusuario y escribe lo siguiente:

gedit /usr/share/applications/LSHW.desktop

luego de presionar la tecla Enter se abrirá una ventana con el gedit en la cual deberás pegar el siguiente texto:

[Desktop Entry]
Name=LSHW
Comment=Identifica el hardware del sistema
Exec=gksu lshw-gtk
Icon=(el icono que les guste)
Terminal=false
Type=Application
Categories=Application;System;

Y ya con eso deberías tener tu lanzador en el menú Aplicaciones –> Herramientas del sistema. Vas a necesitar de permisos de superusuario para poder ejecutarlo.

Acá una imagen de como se ve el lshw-gtk:

lshw-gtk

2 min read

GoogleEarth en Etch AMD64

Hace días pude darme cuenta que el paquete para instalar Google Earth en Debian se encuentra en los repositorios (en la sección [Contrib]). Debo detenerme un momento acá para mencionar que el paquete googleearth-package es Software Libre, sin embargo, depende de Google Earth que es total y absolutamente Software Propietario, por lo tanto deberás estár dispuesto a “ensuciar” un poco tu Debian.

Bien, hasta ahora sólo he mencionado que el paquete está en los repositorios bla bla bla, pero no he mencionado algo MUY importante, y es que, éste paquete (googleearth-package) no hace nada más que adornar (al menos por los momentos) los repositorios, ya que si se ubican en la sección de descargas de Google Earth se podrán dar cuenta que no existen binarios para la arquitectura AMD64, por lo cual tendrán que crear un chroot para poder correr la versión disponible (la de 32bits). Otra cosa MUY pero MUY importante que debo hacer es recomendarles que, por favor, le echen un vistazo a los requerimiento mínimos para que no tengan una mala experiencia en lo que a ejecutar el Google Earth refiere.

Una vez que han creado el chroot, el primer paso sería instalar el paquete googleearth-packages, lo cual se puede lograr con la siguiente línea de comandos en una terminal:

 # aptitude install googleearth-package

Ésto también lo pueden hacer por el Gestor de Paquetes Synaptic sin ningún problema, es cuestión de gustos y costumbres. Cuando vayan a instalar el googleearth-package, el apt posiblemente les sugiera instalar también el paquete fakeroot, ésta sugerencia deberán aceptarla ya que, el fakeroot es necesario para poder construir el .deb de google-earth que vamos a instalar; él (fakeroot) básicamente lo que hace es quitar la necesidad de trabajar como root para poder construir paquetes. También el apt puede hacerle otras muchas sugerencias, sobre todo si el chroot está recién creado.

Una vez que se haya instalado todo, procedemos a descargar el binario de Google Earth de la página. Éste paso queda a juicio del lector, ya que puede descargarlo como se le de la antojada gana; en lo personal, lo hice utilzando la utilidad wget (Debian definitely rulez!) con la siguiente línea de comandos:

 # wget http://dl.google.com/earth/GE4/GoogleEarthLinux.bin

Por cierto, ésa la URL para la descarga :).

Cuando haya terminado la descarga (el binario ha de “pesar” unos 20 Mb aproximadamente) lo siguiente que hacemos es construir el paquete, lo cual logramos con un simple:

 # make-googleearth-package

Y básicamente ése es todo el proceso para construir el .deb. Lo único que faltaría sería instalarlo (casi nada jeje), pero eso es tan fácil como hacer en la terminal:

# dpkg -i googleearth_4.0.2723.0-1_i386.deb

Cuando ejecutes Google Earth el programa quizá te llame la atención diciéndote que no tienes instalada la fuente Bitstream Vera, pero ésto no es problema alguno ya que el programa corre perfectamente (al menos en mi caso :)); de todas formas para instalar la fuente es tan simple como hacer en una terminal:

 # aptitude install ttf-bitstream-vera

En éste momento ya debería estar todo instalado en su máquina. Que lo disfruten! Aquí un vistazo del Google Earth corriendo en mi PC:

Google Earth en mi Etch AMD64

2 min read

Generando contraseñas aleatorias con Perl

El día de hoy se manifestó la necesidad de generar una serie de claves aleatorias para un proyecto en el que me he involucrado recientemente, la idea es que la entrada que tenemos corresponde más o menos al siguiente formato:

username_1
username_2
...
username_n

La salida que se desea obtener debe cumplir con el siguiente formato:

username_1 pass_1
username_2 pass_2
username_3 pass_3
...
username_n pass_n

En este caso debía cumplir un requisito fundamental, las contraseñas deben ser suficientemente seguras.

No pensaba en otra cosa que usar el lenguaje de programación Perl para realizar esta tarea, así fue, hice uso del poderío que brinda Perl+CPAN y en menos de 5 minutos ya tenía la solución al problema planteado, el tiempo restante me sirvió para comerme un pedazo de torta que me dió mi hermana, quien estuvo de cumpleaños el día de ayer.

En primer lugar, debemos instalar el módulo String::MkPasswd, el cual nos permitirá generar contraseñas de manera aleatoria. Si usted disfruta de una distribución decente como DebianRecuerde, Debian es inexorable la instalación del módulo es realmente trivial.

# aptitude install libstring-mkpasswd-perl

Además, si usted se detiene unos segundos y lee la documentación del módulo String::MkPasswd Este modulo en particular no solo se encuentra perfectamente integrado con nuestra distribución favorita, sino que además sus dependencias están resueltas. Esto es una simple muestra del poderío que ofrece una distribución como Debian., se dará cuenta que la función mkpasswd() toma un hash de argumentos opcionales. Si no le pasa ningún argumento a esta función estará generando constraseñas aleatorias con las siguientes características:

  • La longitud de la contraseña será de 9.
  • El número mínimo de dígitos será de 2.
  • El número mínimo de caracteres en minúsculas será de 2.
  • El número mínimo de caracteres en mayúsculas será de 2.
  • El número mínimo de caracteres no alfanuméricos será de 1.
  • Los caracteres no serán distribuidos entre los lados izquierdo y derecho del teclado.

Ahora bien, asumiendo que el fichero de entrada es users.data, la tarea con Perl es resumida en una línea de la siguiente manera.

perl -MString::MkPasswd=mkpasswd -nli -e 'print $_, " ", mkpasswd()' users.data

La línea anterior hace uso de la función mkpasswd del módulo String::MkPasswd para generar las contraseñas aleatorias para cada uno de los usuarios que se encuentran en el fichero de entrada users.data, además, la opción -iPara mayor información acerca de las distintas opciones usadas se le sugiere referirse a man perlrun permite editar el fichero de entrada in situ, ahora bien, quizá para algunos paranoicos (me incluyo) no sea suficiente todo esto, así que vamos a generar contraseñas aleatorias aún más complicadas.

#!/usr/bin/perl -li

use strict;
use warnings;
use String::MkPasswd qw(mkpasswd);

while(<>){
    chomp;
    print $_, " ", mkpasswd(
	    -length => 16,
	    -minnum => 5,
	    -minlower => 5,
	    -minupper => 3,
	    -minspecial => 3,
	    -distribute => 1
    );
}

En esta ocasión el la función mkpasswd() generará claves aún más complejas, dichas claves cumplirán con las siguientes condiciones.

  • -length: La longitud total de la contraseña, 16 en este caso.
  • -minnum: El número mínimo de digitos. 5 en este caso.
  • -minlower: El número mínimo de caracteres en minúsculas, en este caso 5.
  • -minupper: El número mínimo de caracterés en mayúsculas, en este caso 3.
  • -minspecial: El número mínimo de caracteres no alfanuméricos, en este caso será de 3.
  • -distribute: Los caracteres de la contraseña serán distribuidos entre el lado izquierdo y derecho del teclado, esto hace más díficil que un fisgón vea la contraseña que uno está escribiendo. El valor predeterminado es falso, en este caso el valor es verdadero.

El script mostrado anteriormente lo podemos reducir a una línea, aunque preferí guardarlo en un fichero al que denomine genpasswd.pl por cuestiones de legibilidad.

3 min read

Charla: Desarrollo web en Python usando el framework Django

El profesor Jacinto Dávila, en el marco de actividades del Jueves Libre, me ha invitado a dar una charla sobre Desarrollo web en Python usando el framework Django para el día de mañana, 20 30 de noviembre de 2006, el sitio de la charla será en el salón OS-02 del edificio B de la facultad de ingeniería, sector La Hechicera, a partir de las 11:00 a.m.

Básicamente estaré conversando sobre nuevas metodologías de desarrollo Web, el uso de frameworks, ¿en realidad promueven mejores prácticas de desarrollo?, acerca del modelo MVC y el principio DRY (Don’t Repeat Yourself).

A manera de introducción les dejo lo siguiente.

Django es un framework de alto nivel escrito en el lenguaje de programación Python con el objetivo de garantizar desarrollos web rápidos y limpios, con un diseño pragmático.

Un framework orientado al desarrollo Web es un software que facilita la implantación de aquellas tareas tediosas que se encuentran al momento de la construcción de un sitio de contenido dinámico. Se abstraen problemas inherentes al desarrollo Web y se proveen atajos en la programación de tareas comunes.

Con Django, usted construirá sitios web en cuestion de horas, no días; semanas, no años. Cada una de las partes del framework Django ha sido diseñada con el concepto de productividad en mente.

Django sigue la arquitectura MVC (Modelo-Vista-Controlador), en términos simples, es una manera de desarrollo de software en donde el código para definir y acceder a los datos (el modelo) se encuentra separado de la lógica de negocios (el controlador), a su vez está separado de la interfaz de usuario (la vista).

El framework Django ha sido escrito en Python, un lenguaje de programación interpretado de alto nivel que es poderoso, dinámicamente tipado, conciso y expresivo. Para desarrollar un sitio usando Django, debemos escribir código en Python, haciendo uso de las librerías de Django.

Finalmente, Django mantiene de manera estricta a lo largo de su propio código un diseño limpio, y le hace seguir las mejores prácticas cuando se refiere al desarrollo de su aplicación Web.

En resumen, Django facilita el hacer las cosas de manera correcta.

Para finalizar, espero poder hacer una demostración en vivo, ya que el tiempo que dispongo no es mucho.

1 min read