"Después del juego es antes del juego"
Sepp Herberger

lunes, 19 de enero de 2015

Crear un mirror para actualizar localmente nuestros Linux

Cuando tenemos muchos PC con Linux que mantener viene muy bien tener un mirror local de los repositorios que mas usemos, para tenerlo todo actualizadito lo mas rápido posible. Cada vez que cambiamos de versión de Debian hay que reconstruir los mirrors de nuevo, así que voy a dejar las notas sobre como hacerlo.

En el servidor sobre el que montamos el mirror, en nuestro caso una máquina llamada ldap, seguiremos los siguientes pasos:

Paso 1. Script que actualiza el/los mirrors que necesitemos.

En el blog de mi compañero Esteban se cuenta muy bien como hacer esto. Vamos a ver como crear unos mirrors de los backports de Squeeze y Wheezy .

root@ldap:/var/www# cat mirror-debian-backports.sh
#! /bin/sh

debug="$@"
arch=i386,amd64
base=/var/www/mirrors

#Backports:
destdir=$base/backports-squeeze
dist=squeeze-backports
section=main,contrib,non-free
allopt="$debug --timeout=1200 --ignore-missing-release --ignore-release-gpg --passive --nosource --rsync-extra=none --arch=$arch --ignore=disks-$arch/ --section=$section --method=http"
defopt="$allopt  --host=backports.debian.org --dist=$dist --root=debian-backports"
debmirror -v --getcontent $destdir/ $defopt

destdir=$base/backports-wheezy
dist=wheezy-backports
section=main,contrib,non-free
allopt="$debug --timeout=1200 --ignore-missing-release --ignore-release-gpg --passive --nosource --rsync-extra=none --arch=$arch --ignore=disks-$arch/ --section=$section --method=http"
defopt="$allopt  --host=ftp.debian.org --dist=$dist --root=debian"
debmirror -v --getcontent $destdir/ $defopt

Paso 2. Tareas crontab para ejecutar el script.

Lo ideal es que este script se ejecute automáticamente a diario para tener actualizado el mirror desde los repositorios principales. Para ello usamos dos tareas en crontab para lanzar la actualización del mirror durante la madrugada y matarla a primera hora de la mañana.

root@ldap:/root# cat /etc/cron.d/mirror-debian-backports
30 05 * * * root  /var/www/mirror-debian-backports.sh

root@ldap:/root# cat /etc/cron.d/mirror-debian-backports-die
25 07 * * * root killall -9 mirror-debian-backports.sh

Paso 3. Claves gpg de los repositorios a clonar.

Los equipos clientes que se actualizan desde un mirror y el propio mirror deben confiar en el repositorio origen de los paquetes para evitar que se nos cuele algo indebido. Para ello tenemos que instalar en cada uno de ellos las claves públicas GPG de dichos repositorios. En caso contrario nos saldrán los típicos errores:

[GNUPG:] ERRSIG 8B48AD6246925553 1 2 00 1374050431 9
[GNUPG:] NO_PUBKEY 8B48AD6246925553
gpgv: Can’t check signature: public key not found

al hacer un "apt-get ..." o "debmirror ...."

En Debian suele haber paquetes .deb que incluyen las claves públicas de distintos repositorios (los famosos "keyring"). En el caso de backports (NO_PUBKEY 8B48AD6246925553) el fichero es debian-archive-keyring, en la ubicación https://packages.debian.org/sid/all/debian-archive-keyring/download, descargando este fichero a mano lo podemos instalar con:

dpkg -i  debian-archive-keyring_2014.3_all.deb

Otra opción, si no encontramos el paquete que contiene la clave o no sabemos encontrar directamente dicha clave, es bajar la clave de un repositorio de claves con este comando:

gpg --keyserver pgpkeys.mit.edu --recv-key 8B48AD6246925553
gpg -a --export 8B48AD6246925553 | apt-key add -

o

apt-key adv --keyserver pgpkeys.mit.edu --recv-key 8B48AD6246925553

Estos dos últimos comandos no funcionan dentro de la red de nuestros centros, ya que utilizan el puerto 11371 y este está cortado por el firewall corporativo. Una alternativa que puede funcionar es usar el puerto 80 contra un servidor de claves que lo soporte, como:

gpg --keyserver hkp://keyserver.ubuntu.com:80  --recv-keys 8B48AD6246925553
gpg -a --export 8B48AD6246925553 | apt-key add -

Con esto se instala la clave de dicho repositorio en la máquina donde ejecutamos el "apt-key add". Un problema que siempre me aparece aquí es que el comando "debmirror" se queja de que no confía en los repositorios en cuestión, aún cuando hayamos descargado e instalado bien las claves y el apg-get update no se queje de ellas. El problema está en que debmirror no usa las claves de /etc/apt/..., que es donde las mete el "apt-key add", sino que usa las claves del directorio ~/.gnupg/.., en nuestro caso /root/.gnupg ya que debmirror se ejecuta como root.

Por tanto, despues de haber añadido las claves al equipo que actua de mirror tenemos que copiar dichas claves a su directorio /root/.gnupg, esto lo hacemos con:

gpg --keyring /usr/share/keyrings/debian-archive-keyring.gpg --export | gpg --no-default-keyring --keyring trustedkeys.gpg --import

o de forma mas artesanal, copiando todas las claves y no solo la descargada:

cp /etc/apt/trustdb.gpg /root/.gnupg/trustdb.gpg
cp /etc/apt/trusted.gpg /root/.gnupg/trustedkeys.gpg 

Otros comandos útiles relacionados con la gestión de claves:

  • Lista las claves instaladas en el sistema: apt-key list (gpg --list-keys para las claves locales del usuario en ~/.gnupg)
  • Exportar una clave instalada a un fichero ASCII: apt-key export 8B48AD6246925553 > clave.asc
  • Importar una clave de un fichero ASCII: apt-key add clave.asc

Paso 4. Informar a los clientes Linux de que hay un repositorio en la red local.

Todo esto no sirve de nada si nuestros Linux no saben que hay un mirror local para actualizarse contra él. Para ello usamos una tarea puppet que distribuye el sources.list adecuado para que nuestros equipos tengan acceso al mirror local. Además, en los equipos clientes también debemos meter las claves del repositorio para que puedan instalarse correctamente los paquetes.

Por ejemplo, para añadir a nuestros equipos con Wheezy el mirror de los backport crearíamos una clase puppet backports-wheezy. En dicha tarea puppet el init.pp será:

class backports-wheezy {

#En trustdb.gpg y trusted.gpg están las claves de los repositorios, cogidas del /etc/apt de un equipo con las claves instaladas

file { "/etc/apt/trustdb.gpg":
owner => root, group => root, mode => 600,
source => "puppet:///backports-wheezy/trustdb.gpg",
}

file { "/etc/apt/trusted.gpg":
owner => root, group => root, mode => 600,
source => "puppet:///backports-wheezy/trusted.gpg",
}

file {"/etc/apt/sources.list.d/backports.list":
owner=>root, group=>root, mode=>664,
source=>"puppet:///backports-wheezy/backports.list.ok",
notify => Exec["refresca-paquetes"],
}

exec { "refresca-paquetes":
subscribe => File["/etc/apt/sources.list"],
path => "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
command => "apt-get update; apt-get -y --force-yes install; dpkg --configure -a; ",
refreshonly => true,
}

}

Y en el directorio files de la tarea puppet:

  • trustdb.gpg: cogido del /etc/apt de un equipo con las claves instaladas.
  • trusted.gpg: ídem.
  • backports.list.ok, con el contenido:
deb http://ldap/mirrors/backports-wheezy wheezy-backports main contrib non-free

Siendo "ldap" el nombre del equipo que hace de mirror en la red, como dijimos antes, y donde hemos instalado el script y las tareas de crontab.

Si no tenemos puppet podemos realizar la tarea a mano en cada cliente simplemente copiando  el fichero backports.list.ok sobre:

/etc/apt/sources.list.d/backports.list

y añadiendo las claves tal como hemos visto antes. Finalmente, haremos un apt-get update para comprobar que coge bien el nuevo repositorio.

Con todo esto se construirá nuestro mirror en varias noches, actualizándose después a diario, y una vez hayamos distribuido el fichero de sources backports.list.ok a nuestros clientes estos se actualizarán contra el mirror del centro, haciendo la actualización y gestión de paquetes mucho mas rápida.

Me encantaría tener esto mismo para los Windows, pero WSUS y SMS cuestan un pico y yo soy de los que conduran la pólvora del rey. En Linux esto sólo han sido un par de horas entre investigar, probar y afinar. Tendré que conformarme con hacer artesanalmente paquetes wpkg cada vez que quiera actualizar una aplicación de usuario Windows y dejar la actualización del sistemas operativo con Windows Update.... ¡que eche humo la red!.

No hay comentarios:

Publicar un comentario