COMO actualizar de manera segura su sistema

Antes de comenzar es importante hacer notar que esta guía se enfocará al mundo Debian GNU/Linux y sus derivadas, en donde por supuesto se incluye Ubuntu Linux. Después de hacer la breve aclaratoria podemos comenzar.

¿Es importante la firma de los paquetes?

La firma de los paquetes es una funcionalidad fundamental para evitar el posible cambio adrede en los ficheros binarios o fuentes distribuidos a través de sitios espejos (mirrors), de esta manera nos libramos de la posibilidad de un ataque man in the middle, el cual básicamente consiste en la intercepción de la comunicación entre el origen y el destino, el atacante puede leer, insertar y modificar los mensajes (en este caso particular, los ficheros) compartidos entre las partes sin que cada una de ellas se percate que la comunicación se ha visto comprometida.

Nuestro objetivo

Un sistema automatizado de actualización de paquetes, también es sumamente importante eliminar cualquier posibilidad de amenaza que pueda surgir al aprovecharse de la automatización del proceso de actualización, por ejemplo, debemos evitar a toda costa la distribución de troyanos que comprometarán la integridad de nuestros sistemas.

Un poco de historia…

No fue sino hasta la aparición de la versión 0.6 de la interfaz apt en donde se realiza la autenticación de ficheros binarios y fuentes de manera transparente haciendo uso de una Infraestructura de clave pública (en inglés, Public Key Infrastructure o PKI). La PKI se basa en el modelo GNU Privacy Guard (GnuPG) y se ofrece un enorme despliegue de keyservers internacionales.

Detectando la autenticidad de los paquetes

Como se menciono anteriormente desde la versión 0.6 de la interfaz apt se maneja de manera transparente el proceso de autentificación de los paquetes. Asi que vamos a hacer una prueba, voy a simular la instalación del paquete clamav.

$ sudo aptitude --simulate install clamav

Obteniendo por respuesta lo siguiente:

Leyendo lista de paquetes... Hecho
Creando árbol de dependencias
Leyendo la información de estado extendido
Inicializando el estado de los paquetes... Hecho
Se instalarán automáticamente los siguientes paquetes NUEVOS:
  arj clamav-base clamav-freshclam libclamav1 libgmp3 unzoo
Se instalarán los siguiente paquetes NUEVOS:
  arj clamav clamav-base clamav-freshclam libclamav1 libgmp3 unzoo
0 paquetes actualizados, 7 nuevos instalados, 0 para eliminar y 0 sin actualizar.
Necesito descargar 3248kB de ficheros. Después de desempaquetar se usarán 4193kB.
¿Quiere continuar? [Y/n/?] Y
The following packages are not AUTHENTICATED:
  clamav clamav-freshclam clamav-base libclamav1

Do you want to continue? [y/N] N
Cancela.

Si nos fijamos bien en la respuesta anterior notaremos que ciertos paquetes no han podido ser autentificados. A partir de este punto es responsabilidad del administrador del sistema el instalar o no dichos paquetes, por supuesto, cada quien es responsable de sus acciones, yo prefiero declinar mi intento por el momento y asegurarme de la autenticidad de los paquetes, para luego proceder con la instalación normal.

Comienza la diversión

Ahora bien, vamos a mostrar la secuencia de comandos a seguir para agregar las llaves públicas dentro del keyring por defecto. Antes de entrar en detalle es importante aclarar que el ejemplo agregará la llave pública del grupo os-cillation, quienes se encargan de mantener paquetes para el entorno de escritorio Xfce (siempre actualizados y manera no-oficial) para la distribución Debian GNU/Linux (también sirven para sus derivadas, como por ejemplo Ubuntu Linux).

Importando la llave pública desde un servidor GPG

$ gpg --keyserver hkp://wwwkeys.eu.pgp.net --recv-keys 8AC2C0A6

El comando anterior simplemente importara la llave especificada (8AC2C0A6) desde el servidor con el cual se ha establecido la comunicación, el valor de la opción --keyserver sigue cierto formato, el cual es: esquema:[//]nombreservidor[:puerto], los valores ubicados entre corchetes son opcionales, cuando hablamos del esquema nos referimos al tipo de servidor, regularmente utilizaremos como esquema hkp para servidores HTTP o compatibles.

Si el comando anterior se ejecuto de manera correcta, el proceso nos arrojará una salida similar a la siguiente:

gpg: key 8AC2C0A6: public key "os-cillation Debian Package Repository
(Xfld Package Maintainer) <[email protected]>" imported

La instrucción anterior solamente variará de acuerdo al keyserver y la clave que deseemos importar. En www.pgp.net está disponible un buscador que le facilitará la obtención de los datos necesarios.

Exportando y añadiendo la llave pública

$ gpg --armor --export 8AC2C0A6 | sudo apt-key add -

Con el comando anterior procedemos a construir la salida en formato ASCII producto de la exportación de la llave especificada y a través del pipe capturamos la salida estándar y la utilizamos como entrada estándar en el comando apt-key add, el cual simplemente agregará una nueva llave a la lista de llaves confiables, dicha lista puede visualizarse al hacer uso del comando apt-key list.

Aunque parezca evidente la aclaratoria, recuerde que si usted no puede hacer uso de sudo, debe identificarse previamente como superusuario.

Finalmente…

Para finalizar recuerde que debe actualizar la lista de paquetes.

$ sudo aptitude update

Ahora podemos proceder a instalar los paquetes desde el repositorio que hemos añadido como fuente confiable.

4 min read

aptitude, ¿aún no lo usas?

Si usted es de los que piensa que aptitude por ser simplemente un frontend de apt no puede aportar alguna ventaja al manejo óptimo de paquetes, trataré en lo posible en este artículo hacerle cambiar de parecer, o por lo menos mostrarle que en realidad aptitude si ofrece ciertas ventajas sobre apt.

La útil y avanzada herramienta que le permite manejar cómodamente los paquetes, apt (y dpkg) no lleva un registro (ni hace distinciones) de las aplicaciones que se instalan de manera explícita y las que se instalan de manera implícita por consecuencia del primer punto (es decir, para establecer la resolución de dependencias). Esta característica genera ciertos inconvenientes a la hora de desinstalar un paquete que posee dependencias que no son empleadas por otros programas, al momento de realizar la desinstalación lo más seguro es que no queden las cosas muy “limpias” en el sistema.

Un remedio que en principio puede servirle es hacer uso de deborphan (también puede hacer uso de orphaner, un frontend para deborphan); una herramienta de mayor potencia es debfoster, el primero de los mencionados busca librerias huérfanas (como se explico en un artículo anterior) y al pasarle estos resultados al apt-get remove se puede resolver de cierta manera el problema.

El problema de deborphan es que su campo de acción es limitado, por lo que la “limpieza” puede no ser muy buena del todo. En cambio debfoster si hace la distinción de la cual hablaba al principio de este artículo, los paquetes instalados de manera explícita y aquellos que son instalados de manera implícita para resolver las dependencias, por lo tanto debfoster eliminará no solamente las librerias huérfanas tal cual lo hace deborphan si no que también eliminará aquellos paquetes que fueron instalados de manera implícita y que actualmente ningún otro programa dependa de él, también serán eliminados en el caso en que se de una actualización y ya la dependencia no sea necesaria.

Ahora bien, se presenta otra alternativa, aptitude, este frontend de apt si recuerda las dependencias de un programa en particular, por lo que el proceso de remoción del programa se da correctamente. Ya anteriormente había mencionado que apt y dpkg no hacen distinción de las aplicaciones instaladas y Synaptic apenas lleva un histórico, esto en realidad no cumple con las espectativas para mantener un sistema bastante “limpio”.

Aparte de lo mencionado previamente, otra ventaja que he encontrado en la migración a aptitude es que tienes dos opciones de manejo, la linea de comandos, la cual ha sido mi elección desde el comienzo, debido a la similitud de los comandos con los de apt y porque consigo lo que deseo inmediatamente, la interfaz gráfica no me llama la atención, pero quizás a usted si le guste. Adicionalmente, aptitude maneja de manera más adecuada el sistema de dependencias.

Para lograr ejecutar la interfaz gráfica de aptitude simplemente debe hacer:

$ sudo aptitude

De verdad le recomiendo emplear aptitude como herramienta definitiva para el manejo de sus paquetes, primero, si es usuario habitual de apt, el cambio prácticamente no lo notará, me refiero al tema de la similitud de los comandos entre estas dos aplicaciones, segundo, no tendrá que estar buscando “remedios” para mantener limpio el sistema, aptitude lo hará todo por usted.

2 min read

Elive

Elive es un proyecto alojado en debianitas.net, este LiveCD contiene una distribución basada en Debian que trabaja con el ambiente de escritorio enlightenment (tanto la version 16.7 como la 17), contiene todas las librerias EFL, las cuales son requeridas para ejecutar aplicaciones relacionadas a dichas librerias.

Elive incluye una gran parte de los programas relacionados con el proyecto Enlightenment, adicionalmente se incluyen aquellos que son programados usando las EFL (Enlightenment Foundation Libraries), sin dejar de lado una buena selección de las mejores aplicaciones del mundo GNU/Linux.

La versión 0.2 de Elive (la cual aún está en desarrollo) promete la posibilidad de ser instalada en el disco duro, una excelente personalización del ambiente E17, drivers para Nvidia, entre otras nuevas características.

~1 min read

Creando un repositorio local

Planteamiento del Problema:

Mantener actualizada una laptop (u ordenador de escritorio) de bajos recursos, con varios años de uso, el caso que se presenta es que el laptop en cuestión posee solo un puerto para conexiones por modem de velocidades topes de 56kbps, lo anterior puede ser traumático al realizar actualizaciones del sistema.

Consideraciones:

Nos aprovecharemos del hecho de la disponibilidad de un puerto USB en el ordenador de bajos recursos, el cual nos facilita en estos tiempos el almacenamiento masivo de paquetes, en caso de no tener puerto USB, podemos recurrir a unidades de CD como medio de almacenamiento masivo.

Adicionalmente, aprovecharemos conexiones de gran bando de ancha, lo cual nos facilitará la descarga de los paquetes necesarios desde los repositorios disponibles en la red.

Posible solución:

Después de plantear las consideraciones anteriores, una posible alternativa para mantener actualizados nuestros ordenadores de bajos recursos es utilizar dispositivos de almacenamiento masivo como repositorios locales, almacenando en ellos solo los paquetes que sean realmente necesarios.

En los siguientes puntos trataré de ampliar la manera de crear un repositorio local valiéndonos del uso de un Pen Drive.

Comenzamos:

En primer lugar vamos a respaldar los paquetes *.deb que se ubican en /var/cache/apt/archives, esta actividad la vamos a realizar en el ordenador que dispone de una conexión banda ancha.

$ mkdir $HOME/backup
$ sudo cp /var/cache/apt/archives/*.deb $HOME/backup

Después de respaldar los paquetes, vamos a remover todos los ficheros *.deb que han sido descargados al directorio cache que almacena los paquetes, usualmente esto quiere decir, eliminar todos los paquetes *.deb ubicados en /var/cache/apt/archives, para ello hacemos lo siguiente:

$ sudo aptitude clean

Ahora que se encuentra limpio el directorio cache procederemos a descargar (sin instalar) los paquetes que sean necesarios para nuestro ordenador de bajos recursos. Para ello hacemos lo siguiente:

$ sudo aptitude -d install <paquetes>

El comando anterior simplemente descargará la lista de paquetes especificada (recuerde que debe sustituir por la lista de paquetes que necesita), la opción `-d` (equivalente a `--download-only`) nos permite realizar simples descargas de paquetes, sin que estos se instalen, se ha usado el argumento `install` para manejar las dependencias de dichos paquetes. En resumen, estamos **descargando** (sin instalar) la lista de paquetes especificada y sus dependencias.

Para trabajar mas cómodamente crearemos una carpeta temporal y desde allí procederemos a crear nuestro repositorio local en cuestión, el cual finalmente se guardará en el medio de almacenamiento masivo correspondiente.

$ mkdir /tmp/debs
$ mv /var/cache/apt/archives/*.deb /tmp/debs/
$ cd /tmp

Estando ubicados en el directorio /tmp realizaremos una revisión de los paquetes que se ubican en el directorio debs/ y crearemos el fichero comprimido Packages.gz (el nombre del fichero debe ser exacto, no es cuestión de elección personal).

$ dpkg-scanpackages debs/.* | gzip > debs/Packages.gz

Guardando el repositorio en un dispositivo de almacenamiento masivo

En nuestro caso procederé a explicar como almacenar el repositorio en un Pen Drive, por ciertas cuestiones prácticas, primero, facilidad de movilidad que presentan, la capacidad de almacenamiento, la cual regularmente es mayor a la de un CD.

En la versión actual (Hoary) de Ubuntu Linux los Pen Drive son montados automáticamente, si esto no ocurre, puede realizar lo siguiente:

$ sudo mount -t vfat /dev/sda1 /media/usbdisk

Recuerde ajustar los argumentos de acuerdo a sus posibilidades. Luego de montado el dispositivo de almacenamiento masivo proceda a copiar de manera recursiva el directorio debs/.

$ cp -r /tmp/debs/ /media/usbdisk

Estableciendo el medio de almacenamiento masivo como un repositorio.

Si ha decidido utilizar un Pen Drive como medio de almacenamiento.

Después de copiar los ficheros en el medio de almacenamiento masivo, proceda a desmontarlo (en nuestro caso: $ sudo umount /media/usbdisk) y conectelo a su ordenador de bajos recursos, recuerde que si el ordenador de bajos recursos no monta automáticamente el dispositivo, debe montarlo manualmente como se explico anteriormente.

Después de haber sido reconocido el dispositivo de almacenamiento masivo en el ordenador de bajos recursos proceda a editar el fichero /etc/apt/sources.list y agregue la linea deb file:/media/usbdisk debs/. Comente los demás repositorios existentes, recuerde que para ello simplemente debe agregar el carácter almohadilla (#) al principio de la linea que especifica a dicho repositorio.

Si ha decidido utilizar un CD como medio de almacenamiento

Simplemente haciendo uso de apt-cdrom add le bastará, esto añadirá el medio a la lista de recursos del fichero sources.list

Finalizando…

Para finalizar deberá actualizar la lista de paquetes disponibles y proceder con la instalación de dichos paquetes en el ordenador de bajos recursos, para ello, simplemente bastará con hacer lo siguiente:

$ sudo aptitude update
$ sudo aptitude install <paquetes>

Recuerde restaurar en el ordenador que dispone de conexión banda ancha los paquetes que se respaldaron previamente.

$ sudo mv $HOME/backup/*.deb /var/cache/apt/archives/

¡Que lo disfrute! :D

3 min read

Organizando nuestros proyectos web

Antes de plantearme el rediseño de este sitio, pensé en organizar ciertas cosas para no complicarme la vida. En primera instancia procedi a instalar el servidor Apache, el soporte del lenguaje PHP, el servidor de bases de datos MySQL y finalmente el phpMyAdmin.

Lo anterior se resume de la siguiente manera en mi querido Ubuntu Linux.

$ sudo aptitude install apache2
$ sudo aptitude install mysql-server
$ sudo aptitude install php4
$ sudo aptitude install libapache2-mod-auth-mysql
$ sudo aptitude install php4-mysql
$ sudo /etc/init.d/apache2 restart
$ sudo aptitude install phpmyadmin

Recuerde después de instalar el servidor de bases de datos MySQL establecer la contraseña del usuario root de dicho servidor por seguridad. Si no sabe como hacerlo a través de la línea de comandos existe la alternativa de establecer la contraseña utilizando phpMyAdmin.

Por defecto el servidor Apache habilita el directorio /var/www/ como directorio principal, el problema que se plantearía el trabajar en dicho directorio es que cada vez que tuviese que realizar cambios a los ficheros tendría que hacer uso de la cuenta de superusuario o root, lo cual no me agrada mucho, así que para evitar lo mencionado previamente tenía dos opciones.

La primera de ellas era modificar el fichero /etc/apache2/apache.conf y habilitar que todos los usuarios tuviesen la posibilidad de publicar sus documentos dentro del directorio /home/*/public_html, esta opción no me llamaba mucho la atención, adicionalmente, la dirección queda de cierta manera algo extensa (p.ej. http://localhost/~usuario/proyectoweb), así que opte por recurrir a una segunda opción, la cual describiré detalladamente a continuación.

En primera instancia creé dos directorios, public_html como subdirectorio de $HOME, el segundo, milmazz como subdirectorio de public_html.

$ mkdir $HOME/public_html
$ mkdir $HOME/public_html/milmazz

Seguidamente procedi a crear el fichero /etc/apache2/sites-enabled/001-milmazz, este fichero contendrá las directivas necesarias para nuestro proyecto desarrollado en un ambiente local.

<VirtualHost *>
  DocumentRoot "/home/milmazz/public_html/milmazz/"
  ServerName milmazz.desktop

  <Directory "/home/milmazz/public_html/milmazz/">
    Options Indexes FollowSymLinks MultiViews
    AllowOverride None
    Order deny,allow
    Deny from all
    Allow from 127.0.0.0/255.0.0.0 ::1/128
  </Directory>
</VirtualHost>

Ahora bien, necesitamos crear el host para que la directiva realmente redireccione al directorio /home/milmazz/public_html/milmazz/ simplemente tecleando milmazz.desktop en la barra de direcciones de nuestro navegador preferido. Por lo tanto, el siguiente paso es editar el fichero /etc/hosts y agregar una línea similar a 127.0.0.1 milmazz.desktop, note que el segundo parámetro especificado es exactamente igual al especificado en la directiva ServerName.

Seguidamente procedi a instalar WordPress (Sistema Manejador de Contenidos) en el directorio $HOME/public_html/milmazz y todo funciona de maravilla.

Evitando el acceso de usuarios no permitidos

Si queremos restringir aún más el acceso al directorio que contendrá los ficheros de nuestro proyecto web, en este ejemplo, el directorio es $HOME/public_html/milmazz/, realizaremos lo siguiente:

$ touch $HOME/public_html/milmazz/.htaccess
$ nano $HOME/public_html/milmazz/.htaccess

Dentro del fichero .htaccess insertamos las siguientes lineas.

AuthUserFile /var/www/.htpasswd
AuthGroupFile /dev/null
AuthName "Acceso Restringido"
AuthType Basic

require valid-user

Guardamos los cambios realizados y seguidamente procederemos a crear el fichero que contendrá la información acerca de los usuarios que tendrán acceso al directorio protegido, también se especificaran las contraseñas para validar la entrada. El fichero a editar vendra dado por la directiva AuthUserFile, por lo tanto, en nuestro caso el fichero a crear será /var/www/.htpasswd.

htpasswd -c /var/www/.htpasswd milmazz

Seguidamente introducimos la contraseña que se le asignará al usuario milmazz, la opción -c mostrada en el código anterior simplemente se utiliza para crear el fichero /var/www/.htpasswd, por lo tanto, cuando se vaya a autorizar a otro usuario cualquiera la opción -c debe ser ignorada.

Estableciendo la contraseña del usuario root del servidor de bases de datos a través de phpMyAdmin.

Si usted no sabe como establecer en línea de comandos la contraseña del usuario root en el servidor de bases de datos MySQL es posible establecerla en modo gráfico haciendo uso de phpMyAdmin.

A continuacion se describen los pasos que deberá seguir:

  1. Acceder a la interfaz del phpMyAdmin, para lograrlo escribe en la barra de direcciones de tu navegador http://localhost/phpmyadmin.
  2. Selecciona la opción de Privilegios, ésta se ubica en el menú principal.
  3. Debemos editar los dos últimos registros, uno representa el superusuario cuyo valor en el campo servidor será equivalente al nombre de tu máquina, el otro registro a editar es aquel superusuario cuyo valor en el campo servidor es igual a localhost. Para editar los registros mencionados anteriormente simplemente deberá presionar sobre la imagen que representa un lapíz.
  4. Los únicos campos que modificaremos de los registros mencionados previamente son aquellos que tienen relación con la contraseña. Recuerde que para guardar los cambios realizados al final debe presionar el botón Continúe. Si deseas evitar cualquier confusión en cuanto al tema de las contraseñas es recomendable que establezcas la misma en ambos registros.

Agradecimientos

A José Parella por sus valiosas indicaciones.

3 min read