Crear Repositorio Debian
Cómo crear tu repositorio propio para tus aplicaciones Debian con el nuevo formato de certificado OpenGPG
Motivos para tener un repositorio propio
Si te gusta programar y has desarrollado alguna aplicación para GNU/Linux, quizás quieras compartirla con otras personas, no sólo como código en algún repositorio, sino como aplicación compilada y directamente instalable para un usuario final.La mejor manera de distribuir esa aplicación es empaquetarla para una o varias distribuciones ó unicamente para tu distribución favorita.
En el caso de que lo hayas empaquetado en formato .deb, tu programa se podrá instalar y usar en Debian y derivados (Ubuntu, etc). En este artículo te voy a explicar cómo crear tu propio 'repo' para ofrecer esas aplicaciones al resto de usuarios.
Qué necesitas para crear tu repositorio
Para la instalación y configuración de nuestro repositorio vamos a necesitar:· Servidor Web (para ofrecer la paqueteria)· Programa reprepro (para gestionar el repositorio)
Nota: Todas las operaciones las realizaremos con el usuario root.
Instalación de reprepro
Procedemos a instalar el programa reprepro mediante apt:
apt -y update
apt -y install reprepro
Actualizamos todo los repositorios e instalamos reprepro y las dependencias necesarias.Ahora debemos crear el directorio en donde crearemos toda la estructura necesaria para un repositorio Debian.Vamos a crear el repositorio en la ruta /var/www/html/repositorio, usaremos el comando:
mkdir -p /var/www/html/repositorio/conf
Creamos todas la rutas necesarias (repositorio y conf) en un único paso.
Creación de la firma digital del repositorio
Por seguridad, en las instalaciones de paquetería se debe de confiar en el repositorio del que te vayas a instalar el software.En nuestro caso debemos generar un fichero para la firma de paquetes. Los usuarios deberán instalarse la parte pública de ese fichero en su "anillo de confianza", para instalar de forma segura las aplicaciones de nuestro repositorio.
Vamos a generar la clave de firmado de nuestra paquetería y luego exportarla a formato OpenGPG.
Y procedemos a la generación completa de la clave:
gpg --full-generate-key
Por favor seleccione tipo de clave deseado:
(1) RSA y RSA (por defecto)
(2) DSA y ElGamal
(3) DSA (sólo firmar)
(4) RSA (sólo firmar)
Su elección: 4
Escogemos la opción 4
las claves RSA pueden tener entre 1024 y 4096 bits de longitud.
¿De qué tamaño quiere la clave? (3072) 3072
Escogemos un tamaño de 3072 bits
Por favor, especifique el período de validez de la clave.
0 = la clave nunca caduca
<n> = la clave caduca en n días
<n>w = la clave caduca en n semanas
<n>m = la clave caduca en n meses
<n>y = la clave caduca en n años
¿Validez de la clave (0)? 0
La clave nunca caduca
¿Es correcto? (s/n) s
No queremos que caduque, usamos 0 (cero) y luego validamos indicando s
GnuPG debe construir un ID de usuario para identificar su clave.
Nombre y apellidos: Luis Gu------ Ló---
Dirección de correo electrónico: luisgulo@s*l*c*nlinux.org.es
Comentario: Firma de Paquetes Debian
Está usando el juego de caracteres 'utf-8'.
Ha seleccionado este ID de usuario:
"Luis Gu------- Ló--- (Firma de Paquetes Debian) "
¿Cambia (N)ombre, (C)omentario, (D)irección o (V)ale/(S)alir? V
Completamos nuestro nombre y apellidos, email, y el comentario que saldrá en la firma de los paquetes. Una vez completado usamos v para validar.
Nos mostrará un pequeño mensaje durante unos segundos para que generemos algo de "entropía"...
Es necesario generar muchos bytes aleatorios. Es una buena idea realizar
alguna otra tarea (trabajar en otra ventana/consola, mover el ratón, usar
la red y los discos) durante la generación de números primos. Esto da al
generador de números aleatorios mayor oportunidad de recoger suficiente
entropía.
Nos solicitará la clave:
┌────────────────────────────────────────────────────────────┐
│ Por favor introduzca frase contraseña para │
│ proteger su nueva clave │
│ │
│ Frase contraseña: ************************** │
│ │
│ <OK> <Cancelar> │
└────────────────────────────────────────────────────────────┘
Introducimos dos veces nuestra contraseña.
Terminado el proceso nos mostrará el mensaje de confirmación de que todo ha sido generado correctamente:
gpg: clave ABCDEFGHIJKLMNO marcada como de confianza absoluta
gpg: creado el directorio '/root/.gnupg/openpgp-revocs.d'
gpg: certificado de revocación guardado como '/root/.gnupg/openpgp-revocs.d/1234567890123456789012345ABCDEFGHIJKLMNO.rev'
claves pública y secreta creadas y firmadas.
Tenga en cuenta que esta clave no puede ser usada para cifrar.
Puede usar la orden "--edit-key" para crear una subclave con este propósito.
pub rsa3072 2021-02-02 [SC]
1234567890123456789012345ABCDEFGHIJKLMNO
uid Luis Gu------- Ló--- (Firma de Paquetes Debian)
Ahora necesitarmos exportar la clave pública de nuestra clave para publicarla en nuestro repositorio, podemos usar el código corto o largo para exportarla:
gpg --armor --export ABCDEFGHIJKLMNO > /var/www/html/repositorio/repositorio.key
gpg --armor --export 1234567890123456789012345ABCDEFGHIJKLMNO > /var/www/html/repositorio/repositorio.key
Como el formato KEY se ha deprecado, hay que transformar la clave a OpenGPG Y usar el formato para nombre del fichero: <nombre>-archive-keyring.gpg
cat repositorio.key | gpg --dearmor > repositorio-archive-keyring.gpg
Creación del fichero de distribución de nuestro repositorio
Debemos indicar al gestor de paquetes apt que se conecte, que va a encontrar en nuestro repositorio.
Para ello debemos generar un fichero especial que tiene por nombre distributions, este fichero indica que tipo de distribución de paquetería ofrecemos.
Creamos el fichero en la ruta /var/www/html/repositorio/conf:
cd /var/www/html/repositorio/conf
touch distributions
Editamos el fichero e incluimos las siguientes líneas:
Origin: repositorio.tu-dominio
Label: repositorio.tu-dominio
Codename: buster
Architectures: amd64 i386
Components: main contrib non-free
Description: Repositorio publico y personal
DebIndices: Packages Release . .gz .bz2
SignWith: ABCDEFGHIJKLMNO
En la entrada SignWith, debemos de indicar ABCDEFGHIJKLMNO que es el código de nuestra propia firma de los paquetes.
Si no la recuerdas o no lo apuntaste, lo puedes consultar mediante el comando:
gpg --list-keys
NOTA: Si queremos distribuir paquetería de más de una version de Debian, como por ejemplo buster y bullseye, simplemente deberemos duplicar la entrada en el fichero anterior, deja una linea en blanco entre cada bloque y en cada bloque indicar el Codename de la versión que mantenemos.
Origin: repositorio.tu-dominio
Label: repositorio.tu-dominio
Codename: bullseye
Architectures: amd64 i386
Components: main contrib non-free
Description: Repositorio publico y personal
DebIndices: Packages Release . .gz .bz2
SignWith: ABCDEFGHIJKLMNO
Origin: repositorio.tu-dominio
Label: repositorio.tu-dominio
Codename: buster
Architectures: amd64 i386
Components: main contrib non-free
Description: Repositorio publico y personal
DebIndices: Packages Release . .gz .bz2
SignWith: ABCDEFGHIJKLMNO
Ahora debemos usar el programa reprepro para que genere la estructura de directorios necesarios:
reprepro -VVV export
reprepro -VVV createsymlinks
Configuración del Servidor Web
APACHE2
Si usamos Apache2, debemos configurar un nuevo VirtualHost para ofrecer nuestro repositorio.
Creamos el fichero repositorio.conf en la ruta /etc/apache2/sites-available
<VirtualHost *:80>
ServerName repositorio.tu-dominio
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html/repositorio
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
RewriteEngine on
RewriteCond %{SERVER_NAME} =repositorio.tu-dominio
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
<IfModule mod_ssl.c>
<VirtualHost _default_:443>
ServerName repositorio.tu-dominio
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html/repositorio
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLEngine on
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
<Directory "/var/www/html/repositorio/db/">
Require all denied
</Directory>
<Directory "/var/www/html/repositorio/conf/">
Require all denied
/Directory>
<Directory "/var/www/html/repositorio/incoming/">
Require all denied
</Directory>
</VirtualHost>
</IfModule>
Indicamos ahora a Apache que active el nuevo VirtualHost y recargamos la configuración:
a2ensite repositorio.conf
service apache2 reload
NGINX
Crearemos el fichero repositorio.conf en /etc/nginx/sites-available/
server {
listen 80;
access_log /var/log/nginx/repo-error.log;
error_log /var/log/nginx/repo-error.log;
location / {
root /var/www/html/repositorio;
autoindex on;
}
location ~ /(.*)/conf {
deny all;
}
location ~ /(.*)/db {
deny all;
}
}
Reiniciamos Ngix para que coja la nueva configuración:
systemctl restart nginx
Creación del fichero de lista de ficheros de nuestro repositorio
Ahora necesitamos crear un fichero .list para los equipos clientes, para que puedan localizar mediante apt que ficheros tiene disponibles en nuestro repositorio.
Deberás crear el fichero con el nombre de tu repositorio o servidor en la ruta de configuración de apt, este fichero además lo tienes que dejar disponible para que se lo descarguen y copien a esa misma ruta los que quieran usar tu repositorio:
touch /etc/apt/sources.list.d/tu-dominio.list
El contenido de este fichero debe de estar ajustado para el nuevo uso de OpenGPG:
# Repositorio tu-dominio
deb [signed-by=/usr/share/keyrings/repositorio-archive-keyring.gpg] http://repositorio.tu-dominio/ bullseye main contrib non-free
Importar la clave OpenGPG en tu equipo o servidor
Debemos importar la firma OpenGPG para confiar en la paquetería que usaremos, para ellos tenemos que tener instalado instalado 'apt-transport-https' y descargar e instalar la clave OpenGPG:
apt-get install -y apt-transport-https
wget https://repositorio.tu-dominio/repositorio-archive-keyring.gpg -O /usr/share/keyrings/repositorio-archive-keyring.gpg
wget https://repositorio.tu-dominio/repositorio.list -O /etc/apt/sources.list.d/repositorio.list
apt -y update
Gestión de los paquetes en nuestro repositorio
Incluir paquete Debian en nuestro repositorio
reprepro -b /var/www/html/repositorio/ includedeb VersionSO fichero.deb
El paquete se incluye en la Sección que tenga definida el paquete por defecto en su fichero DEBIAN/control, debemos indicar en VersionSO para que distribución queremos que esté disponible (bullseye, buster, etc.)
Si queremos forzar a que el paquete se deposite en otra sección usaremos el parámetro -S sección:
reprepro -S main -b /var/www/html/repositorio/ includedeb VersionSO fichero.deb
Puedes usar las secciones que creaste en el fichero distributions en la línea Components: main contrib non-free
Eliminar un paquete del Repositorio
Para el borrado es necesario indicar el CodeName o distribución (bullseye/buster), en la que está el paquete (sin .deb) a borrar:
reprepro remove bullseye paquete
Listar la paquetería de nuestro Repositorio
Para listar también es necesario indicar el CodeName o distribución (bullseye/buster):
reprepro -b /var/www/html/repositorio/ list bullseye
Solución de problemas con reprepro
Si en algún momento tienes algun problema con reprepro al realizar alguna operación, puede ser debido a la petición de la clave, simplemente incluye como parámetro --ask-passphrase para forzar a que te pida la clave.
Esta guía es una adaptación y ampliación al documento de la Wiki de Debian sobre la "Configuración de reprepro"
Para más informacion sobre apt-key deprecado y OpenGPG puedes leer el artículo "apt-key Is Deprecate. Add OpenGPG"