refactor(ansible): Estandariza nombres de roles y actualiza Koji

Se estandarizan los nombres de los directorios de roles, cambiando guiones por guiones bajos.

Se añaden nuevos scripts para limpieza y callbacks en Koji Hub. Además, se actualizan las configuraciones de Kojid, Kojira y PostgreSQL, incluyendo la instalación de paquetes, ajustes de mock y la gestión de variables.
This commit is contained in:
Rénich Bon Ćirić 2025-11-15 20:07:11 -06:00
commit 39aeb2d6b6
Signed by: renich
GPG key ID: AB2A9F49384FE324
91 changed files with 1037 additions and 957 deletions

View file

@ -10,198 +10,180 @@ Fase 1: Autoridad de Certificación y Generación de Certificados SSL
===================================================================
Esta fase establece la base criptográfica para que los componentes de Koji se comuniquen de forma segura.
#. Crea la Autoridad de Certificación (CA):
Crea la Autoridad de Certificación (CA):
Crea un directorio dedicado para tu infraestructura PKI de Koji (p. ej., `/etc/pki/koji`).
Genera un certificado de CA Raíz autofirmado y su clave privada correspondiente. Usarás esta CA para firmar todos los demás certificados de componentes de Koji.
Genera Certificados de Componentes y Usuarios:
Para cada componente de Koji que requiere autenticación (koji_hub, koji-web, kojid, kojira y usuarios administradores), genera
una solicitud de firma de certificado (CSR) única y una clave privada.
* Crea un directorio dedicado para tu infraestructura PKI de Koji (p. ej., `/etc/pki/koji`).
* Genera un certificado de CA Raíz autofirmado y su clave privada correspondiente. Usarás esta CA para firmar todos los demás certificados de componentes de Koji.
Certificados del Lado del Servidor (koji_hub, koji-web):
El Common Name (CN) en estos certificados *debe* coincidir con el
Nombre de Dominio Completo (FQDN) del servidor donde los desplegarás. Estos certificados deben incluir `serverAuth` en su
`extendedKeyUsage`.
Certificados del Lado del Cliente (kojid, kojira, usuarios administradores):
El CN para estos certificados debe coincidir con
el nombre de usuario de Koji que usarás para la autenticación. Estos certificados deben incluir `clientAuth` en su
`extendedKeyUsage`.
#. Genera Certificados de Componentes y Usuarios:
* Para cada componente de Koji que requiere autenticación (koji-hub, koji-web, kojid, kojira y usuarios administradores), genera
una solicitud de firma de certificado (CSR) única y una clave privada.
* Certificados del Lado del Servidor (koji-hub, koji-web): El Common Name (CN) en estos certificados *debe* coincidir con el
Nombre de Dominio Completo (FQDN) del servidor donde los desplegarás. Estos certificados deben incluir `serverAuth` en su
`extendedKeyUsage`.
* Certificados del Lado del Cliente (kojid, kojira, usuarios administradores): El CN para estos certificados debe coincidir con
el nombre de usuario de Koji que usarás para la autenticación. Estos certificados deben incluir `clientAuth` en su
`extendedKeyUsage`.
* Firma cada CSR con tu CA Raíz recién creada para generar los certificados de componente/usuario.
* Combina la clave privada de cada componente y su certificado firmado en un único archivo `.pem`. Los clientes de Koji usan a
menudo este archivo `.pem`.
* Para que los usuarios administradores accedan a través del navegador web, genera un paquete PKCS12 (`.p12`) a partir del
certificado y la clave del usuario, que incluya el certificado de la CA.
Firma cada CSR con tu CA Raíz recién creada para generar los certificados de componente/usuario.
Combina la clave privada de cada componente y su certificado firmado en un único archivo `.pem`. Los clientes de Koji usan a
menudo este archivo `.pem`.
Para que los usuarios administradores accedan a través del navegador web, genera un paquete PKCS12 (`.p12`) a partir del
certificado y la clave del usuario, que incluya el certificado de la CA.
Fase 2: Configuración de la Base de Datos PostgreSQL
====================================================
Koji usa una base de datos PostgreSQL para almacenar todos los metadatos relacionados con la compilación, la información del usuario y la configuración.
#. Instala e Inicializa PostgreSQL:
Instala e Inicializa PostgreSQL:
Instala el paquete `postgresql-server` en tu host de base de datos.
Inicializa el clúster de la base de datos PostgreSQL.
Crea la Base de Datos y el Usuario de Koji:
Como el usuario `postgres`, crea una base de datos dedicada para Koji (p. ej., `koji`).
Crea un usuario de PostgreSQL dedicado (p. ej., `koji`) que Koji usará para conectarse a la base de datos. Asígnale una
contraseña segura a este usuario.
Carga el Esquema de Koji:
Carga el esquema de la base de datos de Koji desde el archivo SQL proporcionado (normalmente `/usr/share/koji/schema.sql` del
paquete `koji`) en la base de datos de Koji que acabas de crear. Asegúrate de hacerlo como el usuario de la base de datos de
Koji para mantener la propiedad correcta.
Configura el Acceso a la Base de Datos (`postgresql.conf` y `pg_hba.conf`):
Edita `postgresql.conf` para:
* Instala el paquete `postgresql-server` en tu host de base de datos.
* Inicializa el clúster de la base de datos PostgreSQL.
* Habilitar SSL (`ssl = on`).
* Especificar los archivos de certificado y clave del servidor (`ssl_cert_file`, `ssl_key_file`).
* Especificar el archivo del certificado de la CA (`ssl_ca_file`).
* Configurar `listen_addresses` para permitir conexiones desde Koji Hub (p. ej., `'*'`).
* Aumentar `max_connections` para satisfacer las necesidades de Koji (p. ej., `200`).
#. Crea la Base de Datos y el Usuario de Koji:
* Como el usuario `postgres`, crea una base de datos dedicada para Koji (p. ej., `koji`).
* Crea un usuario de PostgreSQL dedicado (p. ej., `koji`) que Koji usará para conectarse a la base de datos. Asígnale una
contraseña segura a este usuario.
#. Carga el Esquema de Koji:
* Carga el esquema de la base de datos de Koji desde el archivo SQL proporcionado (normalmente `/usr/share/koji/schema.sql` del
paquete `koji`) en la base de datos de Koji que acabas de crear. Asegúrate de hacerlo como el usuario de la base de datos de
Koji para mantener la propiedad correcta.
#. Configura el Acceso a la Base de Datos (`postgresql.conf` y `pg_hba.conf`):
* Edita `postgresql.conf` para:
* Habilitar SSL (`ssl = on`).
* Especificar los archivos de certificado y clave del servidor (`ssl_cert_file`, `ssl_key_file`).
* Especificar el archivo del certificado de la CA (`ssl_ca_file`).
* Configurar `listen_addresses` para permitir conexiones desde Koji Hub (p. ej., `'*'`).
* Aumentar `max_connections` para satisfacer las necesidades de Koji (p. ej., `200`).
* Edita `pg_hba.conf` para permitir conexiones desde Koji Hub a la base de datos de Koji con SSL y un método de autenticación seguro (p. ej., `scram-sha-256`). Además, configura el acceso local para el usuario `postgres`.
Edita `pg_hba.conf` para permitir conexiones desde Koji Hub a la base de datos de Koji con SSL y un método de autenticación seguro (p. ej., `scram-sha-256`). Además, configura el acceso local para el usuario `postgres`.
Fase 3: Configuración de Koji Hub
=================================
El Koji Hub es el plano de control central para el sistema de compilación Koji.
#. Instala Koji Hub y Dependencias:
* Instala `koji-hub`, `koji-web`, `httpd`, `mod_ssl`, `mod_wsgi`, `python3-cryptography`, `nmap-ncat`, `postgresql` (bibliotecas
de cliente) y `policycoreutils-python-utils`.
#. Configura el Hub (`/etc/koji-hub/hub.conf` y el directorio `.d`):
* Configura los parámetros de conexión de la base de datos (`DBName`, `DBUser`, `DBHost`, `DBPass`).
* Establece `KojiDir` en la ruta donde Koji almacenará los datos de compilación (p. ej., `/mnt/koji`).
* Configura los ajustes de autenticación, incluyendo `DNUsernameComponent` y `ProxyDNs` para la autenticación de certificados de
cliente SSL.
* Coloca las configuraciones sensibles (como `DBPass`) in un archivo separado dentro de `/etc/koji-hub/hub.conf.d/` con permisos
restringidos.
#. Configura Apache para el Hub:
* Asegúrate de que `mod_ssl` y `mod_wsgi` estén habilitados.
* Edita `/etc/httpd/conf.d/ssl.conf` para que apunte al certificado del servidor, la clave y el certificado de la CA de Koji del
Koji Hub.
* Configura el bloque `<Location /kojihub/ssllogin>` en `/etc/httpd/conf.d/kojihub.conf` para que requiera certificados de
cliente SSL (`SSLVerifyClient require`).
#. Crea la Estructura del Sistema de Archivos de Koji:
* Crea los subdirectorios necesarios en `KojiDir` (p. ej., `packages`, `repos`, `work`, `scratch`, `repos-dist`, `certs`,
`clients`).
* Asegúrate de que el usuario `apache` tenga la propiedad y los permisos de escritura adecuados en estos directorios.
#. Despliega Plugins de Koji Hub:
* Copia cualquier complemento personalizado de Koji Hub (p. ej., `sigul_sign.py`) a `/usr/lib/koji-hub/plugins`.
Instala Koji Hub y Dependencias:
Instala `koji_hub`, `koji-web`, `httpd`, `mod_ssl`, `mod_wsgi`, `python3-cryptography`, `nmap-ncat`, `postgresql` (bibliotecas
de cliente) y `policycoreutils-python-utils`.
Configura el Hub (`/etc/koji_hub/hub.conf` y el directorio `.d`):
Configura los parámetros de conexión de la base de datos (`DBName`, `DBUser`, `DBHost`, `DBPass`).
Establece `KojiDir` en la ruta donde Koji almacenará los datos de compilación (p. ej., `/mnt/koji`).
Configura los ajustes de autenticación, incluyendo `DNUsernameComponent` y `ProxyDNs` para la autenticación de certificados de
cliente SSL.
Coloca las configuraciones sensibles (como `DBPass`) in un archivo separado dentro de `/etc/koji_hub/hub.conf.d/` con permisos
restringidos.
Configura Apache para el Hub:
Asegúrate de que `mod_ssl` y `mod_wsgi` estén habilitados.
Edita `/etc/httpd/conf.d/ssl.conf` para que apunte al certificado del servidor, la clave y el certificado de la CA de Koji del
Koji Hub.
Configura el bloque `<Location /kojihub/ssllogin>` en `/etc/httpd/conf.d/kojihub.conf` para que requiera certificados de
cliente SSL (`SSLVerifyClient require`).
Crea la Estructura del Sistema de Archivos de Koji:
Crea los subdirectorios necesarios en `KojiDir` (p. ej., `packages`, `repos`, `work`, `scratch`, `repos-dist`, `certs`,
`clients`).
Asegúrate de que el usuario `apache` tenga la propiedad y los permisos de escritura adecuados en estos directorios.
Despliega Plugins de Koji Hub:
Copia cualquier complemento personalizado de Koji Hub (p. ej., `sigul_sign.py`) a `/usr/lib/koji_hub/plugins`.
Fase 4: Configuración de Koji Web
=================================
La interfaz Koji Web te proporciona una forma fácil de usar para interactuar con Koji.
#. Configura Koji Web (`/etc/kojiweb/web.conf` y el directorio `.d`):
* Establece `KojiHubURL` y `KojiFilesURL` en las URL apropiadas.
* Para la autenticación SSL, especifica `WebCert` (el archivo PEM del componente koji-web) y `KojiHubCA` (el certificado de la CA de Koji).
* Establece el valor de `Secret` en una contraseña segura y única.
#. Configura Apache para Koji Web:
* Configura el bloque `<Location /koji/login>` en `/etc/httpd/conf.d/kojiweb.conf` para que requiera certificados de cliente SSL si los usuarios se autenticarán a través de navegadores web.
Configura Koji Web (`/etc/kojiweb/web.conf` y el directorio `.d`):
Establece `KojiHubURL` y `KojiFilesURL` en las URL apropiadas.
Para la autenticación SSL, especifica `WebCert` (el archivo PEM del componente koji-web) y `KojiHubCA` (el certificado de la CA de Koji).
Establece el valor de `Secret` en una contraseña segura y única.
Configura Apache para Koji Web:
Configura el bloque `<Location /koji/login>` en `/etc/httpd/conf.d/kojiweb.conf` para que requiera certificados de cliente SSL si los usuarios se autenticarán a través de navegadores web.
Fase 5: Configuración de Kojid (Constructor) y Kojira (Administrador de Repos)
==============================================================================
#. Configura Kojid (en cada host constructor):
* Instala `koji-builder`, `rpm-build`, `rpmdevtools` y `mock`.
* Edita `/etc/kojid/kojid.conf` para que apunte a la URL del servidor XML-RPC de Koji Hub.
* Especifica el certificado de cliente del componente `kojid` y el certificado de la CA de Koji.
* Establece el parámetro `user` en el FQDN del host constructor.
* Establece `topdir` en el directorio de Koji montado (p. ej., `/mnt/koji`).
* Establece `workdir` en un directorio local (p. ej., `/var/lib/kojid-work`).
* Asegúrate de que el servicio `kojid` se ejecute como `root` (predeterminado) y tenga los permisos adecuados en `workdir`.
* Agrega los usuarios que necesitan compilar paquetes (p. ej., `kojiadmin`) al grupo `mock`.
#. Configura Kojira (en el hub o en un host dedicado):
* Instala `koji-utils`.
* Edita `/etc/kojira/kojira.conf` para que apunte a la URL del servidor XML-RPC de Koji Hub.
* Especifica el certificado de cliente del componente `kojira` y el certificado de la CA de Koji.
Configura Kojid (en cada host constructor):
Instala `koji-builder`, `rpm-build`, `rpmdevtools` y `mock`.
Edita `/etc/kojid/kojid.conf` para que apunte a la URL del servidor XML-RPC de Koji Hub.
Especifica el certificado de cliente del componente `kojid` y el certificado de la CA de Koji.
Establece el parámetro `user` en el FQDN del host constructor.
Establece `topdir` en el directorio de Koji montado (p. ej., `/mnt/koji`).
Establece `workdir` en un directorio local (p. ej., `/var/lib/kojid-work`).
Asegúrate de que el servicio `kojid` se ejecute como `root` (predeterminado) y tenga los permisos adecuados en `workdir`.
Agrega los usuarios que necesitan compilar paquetes (p. ej., `kojiadmin`) al grupo `mock`.
Configura Kojira (en el hub o en un host dedicado):
Instala `koji-utils`.
Edita `/etc/kojira/kojira.conf` para que apunte a la URL del servidor XML-RPC de Koji Hub.
Especifica el certificado de cliente del componente `kojira` y el certificado de la CA de Koji.
Estos componentes manejan los procesos de compilación reales y la gestión de repositorios.
#. Configura Kojira (en el hub o en un host dedicado):
* Instala `koji-utils`.
* Edita `/etc/kojira/kojira.conf` para que apunte a la URL del servidor XML-RPC de Koji Hub.
* Especifica el certificado de cliente del componente `kojira` y el certificado de la CA de Koji.
Configura Kojira (en el hub o en un host dedicado):
Instala `koji-utils`.
Edita `/etc/kojira/kojira.conf` para que apunte a la URL del servidor XML-RPC de Koji Hub.
Especifica el certificado de cliente del componente `kojira` y el certificado de la CA de Koji.
Fase 6: Configuración de SELinux y Firewall
===========================================
Un contexto de seguridad y un acceso a la red adecuados son cruciales para que Koji funcione.
#. Configuración de SELinux:
Configuración de SELinux:
Establece los siguientes booleanos de SELinux para permitir el acceso a la red y a los archivos necesarios para `httpd`:
* Establece los siguientes booleanos de SELinux para permitir el acceso a la red y a los archivos necesarios para `httpd`:
* `setsebool -P httpd_can_network_connect_db=1` (permite que httpd se conecte a PostgreSQL)
* `setsebool -P httpd_can_network_connect=1` (permite que httpd realice conexiones de red generales)
* `setsebool -P allow_httpd_anon_write=1` (permite que httpd escriba en áreas de contenido público)
* `setsebool -P httpd_use_nfs=1` (si `/mnt/koji` está en un recurso compartido NFS)
* `setsebool -P httpd_can_network_connect_db=1` (permite que httpd se conecte a PostgreSQL)
* `setsebool -P httpd_can_network_connect=1` (permite que httpd realice conexiones de red generales)
* `setsebool -P allow_httpd_anon_write=1` (permite que httpd escriba en áreas de contenido público)
* `setsebool -P httpd_use_nfs=1` (si `/mnt/koji` está en un recurso compartido NFS)
Aplica los contextos de archivo de SELinux correctos:
* Aplica los contextos de archivo de SELinux correctos:
* `semanage fcontext -a -t public_content_rw_t "/mnt/koji(/.*)?"` (para contexto persistente)
* `restorecon -r -v /mnt/koji` (para aplicar el contexto inmediatamente)
* Alternativamente, para recursos compartidos NFS donde `semanage fcontext` podría no aplicarse, usa `chcon -R -t
public_content_rw_t /mnt/koji/*` (aunque esto no es persistente entre reinicios).
Configuración del Firewall:
Abre los puertos de firewall necesarios en los hosts respectivos:
* `semanage fcontext -a -t public_content_rw_t "/mnt/koji(/.*)?"` (para contexto persistente)
* `restorecon -r -v /mnt/koji` (para aplicar el contexto inmediatamente)
* Alternativamente, para recursos compartidos NFS donde `semanage fcontext` podría no aplicarse, usa `chcon -R -t
public_content_rw_t /mnt/koji/*` (aunque esto no es persistente entre reinicios).
#. Configuración del Firewall:
* Abre los puertos de firewall necesarios en los hosts respectivos:
* Koji Hub: HTTP (80/tcp), HTTPS (443/tcp), Servidor Mock Sigul (8080/tcp, si se despliega en el hub).
* Servidor PostgreSQL: PostgreSQL (5432/tcp) desde el Koji Hub.
* Servidor NFS: NFS (servicios nfs, rpc-bind, mountd).
* Koji Hub: HTTP (80/tcp), HTTPS (443/tcp), Servidor Mock Sigul (8080/tcp, si se despliega en el hub).
* Servidor PostgreSQL: PostgreSQL (5432/tcp) desde el Koji Hub.
* Servidor NFS: NFS (servicios nfs, rpc-bind, mountd).
Fase 7: Arranque del Entorno de Compilación de Koji
===================================================
Esta fase final prepara a Koji para que realice compilaciones reales.
#. Otorga Privilegios de Administrador al Usuario Inicial:
* Inserta manualmente un registro en la tabla `user_perms` en la base de datos de Koji para otorgarle al usuario administrador
inicial (p. ej., `kojiadmin`) el permiso de `admin`. Este es un paso único para el administrador inicial.
#. Crea Etiquetas y un Destino de Compilación:
* Crea una etiqueta de destino (p. ej., `cs10`) donde terminarán los RPM finales: `koji add-tag cs10`.
* Crea una etiqueta de compilación (p. ej., `cs10-build`) que defina el contenido del buildroot y agrégale arquitecturas: `koji
add-tag --parent
cs10 --arches "x86_64" cs10-build`.
* Crea un destino de compilación que vincule la etiqueta de compilación y la etiqueta de destino: `koji add-target cs10-build
cs10-build cs10`.
#. Puebla el Grupo de Compilación:
* Agrega los paquetes esenciales que se requieren para compilar (p. ej., `rpm-build`, `gcc`, `make`) al grupo `build` de tu
etiqueta de compilación: `koji add-group-pkg cs10-build build <package_name>`.
* Alternativamente, importa definiciones de grupo desde una instancia de Koji existente (p. ej., el `comps.xml` de Fedora).
#. Regenera el Repositorio:
* Después de agregar paquetes al grupo de compilación, regenera el repositorio para la etiqueta de compilación: `koji regen-repo
cs10-build`. Esto pone los paquetes a disposición de `kojid` para crear los buildroots.
#. Importa Paquetes Iniciales:
* Importa cualquier SRPM base y RPMs binarios a Koji y etiquétalos en tu etiqueta de destino. Esto proporciona una base de
paquetes para la resolución de dependencias durante las compilaciones.
Otorga Privilegios de Administrador al Usuario Inicial:
Inserta manualmente un registro en la tabla `user_perms` en la base de datos de Koji para otorgarle al usuario administrador
inicial (p. ej., `kojiadmin`) el permiso de `admin`. Este es un paso único para el administrador inicial.
Crea Etiquetas y un Destino de Compilación:
Crea una etiqueta de destino (p. ej., `cs10`) donde terminarán los RPM finales: `koji add-tag cs10`.
Crea una etiqueta de compilación (p. ej., `cs10-build`) que defina el contenido del buildroot y agrégale arquitecturas: `koji
add-tag --parent
cs10 --arches "x86_64" cs10-build`.
Crea un destino de compilación que vincule la etiqueta de compilación y la etiqueta de destino: `koji add-target cs10-build
cs10-build cs10`.
Puebla el Grupo de Compilación:
Agrega los paquetes esenciales que se requieren para compilar (p. ej., `rpm-build`, `gcc`, `make`) al grupo `build` de tu
etiqueta de compilación: `koji add-group-pkg cs10-build build <package_name>`.
Alternativamente, importa definiciones de grupo desde una instancia de Koji existente (p. ej., el `comps.xml` de Fedora).
Regenera el Repositorio:
Después de agregar paquetes al grupo de compilación, regenera el repositorio para la etiqueta de compilación: `koji regen-repo
cs10-build`. Esto pone los paquetes a disposición de `kojid` para crear los buildroots.
Importa Paquetes Iniciales:
Importa cualquier SRPM base y RPMs binarios a Koji y etiquétalos en tu etiqueta de destino. Esto proporciona una base de
paquetes para la resolución de dependencias durante las compilaciones.
Este procedimiento detallado debería servirte como una guía completa para que configures un entorno Koji.
Fase 8: Características Adicionales
===================================
Recolección de Basura:
Un servicio de systemd (`koji-cleanup.timer`) se ejecuta semanalmente para limpiar compilaciones antiguas
y directorios de trabajo, ayudando a conservar el espacio en disco.
Notificaciones:
Koji está configurado para registrar todos los eventos en `/var/log/koji_callbacks.log`. Este es un sistema
de notificación básico que puede ser extendido para integrarse con otros sistemas.
Permisos Granulares:
Se crea un usuario `builder` con permisos limitados. Este usuario solo puede realizar compilaciones,
lo que mejora la seguridad al limitar el acceso a funciones administrativas.
Autoincremento de NVR:
La etiqueta de compilación `mxos0-build` está configurada para incrementar automáticamente el número
de release de los paquetes, simplificando el proceso de compilación.