Crear Repositorio Debian

Linux Nivel Alto 26 de dic. de 2022

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

Crea‌ció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"

Etiquetas

Luis GuLo

🐧 SysAdmin GNU/Linux - 🐳 Docker - 🖥️ Bash Scripting - 🐪 Perl - 🐬 MySQL - 👥 Formador de TI - 👥 Formador de SysAdmin's - 💢 Ansible - ☁️ Cloud Computing - ❤️ Debian GNU/Linux