Creación de un paquete RPM utilizando Nginx como ejemplo
15:21, 27.01.2023
RPM es un gestor de paquetes utilizado en los sistemas operativos Linux basados en Red Hat. El almacenamiento de datos RPM se realiza utilizando el contenedor de archivos cpio, que comprime los datos utilizando la utilidad gzip, bzip2, LZMA, XZ o XAR, dependiendo de la versión. El nombre de cada paquete RPM incluye 4 elementos:
- nombre del programa;
- versión;
- designación del número de versión;
- la arquitectura bajo la que se construyó el paquete.
En el siguiente artículo le contaremos cómo construir su propio paquete RPM para CentOS usando Nginx con el módulo SPNEGO como ejemplo. Avanzaremos hacia este objetivo en varios pasos: desde la creación de un paquete sencillo hasta la adición de módulos individuales y la edición del archivo de configuración.
Preconfiguración del sistema operativo CentOS
Lo primero que hay que hacer es instalar algunos paquetes importantes:
yum install wget rpm-build rpmdevtools gcc make
Sólo con este comando, cargamos en el sistema una utilidad para descargar archivos a través de la red, una utilidad para construir el paquete de instalación, un compilador SI, una utilidad para construir el código fuente y un programa para crear un entorno de trabajo basado en directorios. Todo esto lo necesitaremos a continuación.
A continuación, es necesario configurar las dependencias:
yum install openssl-devel zlib-devel pcre-devel
Todos los paquetes mencionados en el comando son necesarios para nuestra versión de la compilación RPM. En su caso, puede que necesite otras dependencias, sólo tiene que escribirlas con un espacio. Si los paquetes requeridos no están presentes en su sistema, obtendrá un mensaje de error la primera vez que intente compilar.
El último paso de la preconfiguración del sistema operativo es crear un usuario independiente. Esto no debe hacerse como usuario con privilegios de root, porque cualquier error en las rutas puede hacer que se pierdan algunos ficheros o incluso directorios enteros. Para ello, ejecute el comando:
useradd creator -m
De esta manera hemos creado el usuario creador y un directorio home separado para él. Para realizar todas las acciones posteriores en su nombre, puede escribir:
su - creator
Configurar un entorno de usuario
Asegúrese de que se encuentra en el directorio correcto. Ya que este directorio puede ser absolutamente cualquier carpeta creada para este fin. En este ejemplo, utilizamos el directorio personal del usuario creador, que se creó anteriormente.
Para asegurarse de que está en el directorio correcto, escriba el comando:
$ pwd
Si la consola le da el mensaje "/home/creator", está en el lugar correcto. Si ves otra cosa, simplemente navega al directorio home con el comando:
$ cd ~
Y luego crear una estructura de directorios para la asamblea:
$ rpmdev-setuptree
Ahora tendremos una carpeta rpmbuild en el directorio home de nuestro usuario creador que contiene esta estructura:
- BUILD - aquí están los archivos que aparecen durante la creación del paquete RPM.
- RPMS - aquí es donde estarán los paquetes terminados.
- SOURCES - contiene las fuentes para construir los paquetes RPM.
- SPECS - aquí se encuentran los archivos de descripción de la compilación.
- SRPMS - contiene las fuentes de los archivos RPM.
Ahora estamos listos para cargar el código fuente y prepararlo para procesos posteriores.
Creación de paquetes RPM a partir del código fuente
Vaya a la página de descarga de paquetes Nginx y seleccione los paquetes que necesita específicamente para su sistema operativo. Estamos construyendo RPM en CentOS 7. Si usted también - puede ir directamente a la sección correspondiente. Aquí encontrará las fuentes para su versión particular del sistema operativo. Copie el enlace y descargue el código fuente a través de la consola:
$ wget https://nginx.org/packages/mainline/centos/7/SRPMS/nginx-1.19.3-1.el7.ngx.src.rpm
Y ahora instale la fuente con el comando:
$ rpm -Uvh nginx-1.19.3-1.el7.ngx.src.rpm
Después en el directorio rpmbuild/SOURCES podrá ver los ficheros fuente para construir el RPM con la versión del servidor web Nginx deseada.
Pasamos a crear el ensamblado del paquete RPM de instalación:
$ rpmbuild -bb rpmbuild/SPECS/nginx.spec
El resultado será un paquete en el directorio rpmbuild/RPMS/x86_64, que contiene dos archivos:
- nginx-1.19.3-1.el7.ngx.x86_64.rpm: paquete de instalación.
- nginx-debuginfo-1.19.3-1.el7.ngx.x86_64.rpm: paquete de instalación con información de depuración.
Ahora estamos listos para instalar.
Operaciones básicas con el paquete de instalación
Para instalar el paquete ensamblado, podemos escribir el comando:
rpm -Uvh <path to compiled package>
Las claves -Uvh proporcionan actualizaciones secuenciales, información sobre el progreso de la instalación y una demostración del estado. Debe estar ubicado en el directorio donde se encuentra el paquete RPM cuando se inicia el comando.
A continuación, para iniciar Nginx, escribimos los comandos uno a uno:
systemctl enable nginx systemctl start nginx
El primer comando es necesario para iniciar el servidor web automáticamente, mientras que el segundo lo inicia aquí y ahora.
Si necesita eliminar un paquete, también tendrá que introducir dos comandos:
systemctl disable nginx systemctl stop nginx
Para obtener información sobre el nombre completo del paquete instalado en su sistema operativo, escriba este comando:
rpm -qa | grep nginx
Después de detener el servidor web, puede eliminar el paquete con el comando:
rpm -e nginx-1.19.3-1.el7.ngx.x86_64
¿Cómo puedo añadir un módulo SPNEGO?
Añadir el módulo SPNEGO al conjunto es muy sencillo. Introduzca una serie de comandos uno a uno:
yum install git su - creator $ cd ~ $ git clone https://github.com/stnoonan/spnego-http-auth-nginx-module.git /tmp/spnego-http-auth-nginx-module $ vi rpmbuild/SPECS/nginx.spec
El archivo nginx.spec se abre frente a usted:
Encuentra la línea "%define BASE_CONFIGURE_ARGS ...".
Después de --with-. puede añadir --add-dynamic-module=/tmp/spnego-http-auth-nginx-module.
Ahora busque %description y puede añadir después:
%package module-spnego Group: %{_group} Requires: nginx = %{?epoch:%{epoch}:}%{main_version}-%{main_release} Summary: nginx spnego module %description module-spnego Dynamic Spnego module for nginx.
Entonces encontramos %build y podemos añadir:
echo 'load_module "%{_libdir}/nginx/modules/ngx_http_auth_spnego_module.so";' \ > %{buildroot}%{_sysconfdir}/nginx/modules/spnego-http-auth-nginx-module.conf
Por último, busque %files y puede añadirlo:
%files module-spnego %{_libdir}/nginx/modules/spnego-http-auth-nginx-module.conf %{_libdir}/nginx/modules/ngx_http_auth_spnego_module.so
Ahora, para iniciar la construcción, introduzca el comando:
$ rpmbuild -bb rpmbuild/SPECS/nginx.spec
Para instalar un ensamblaje, necesitamos dos paquetes RPM:
- nginx-1.19.3-1.el7.ngx.x86_64.rpm
- nginx-module-spnego-1.19.3-1.el7.ngx.x86_64.rpm
Ambos se encuentran en el directorio RPMS.
Una vez finalizada la instalación, ejecute el comando:
nginx -V
Busque la opción ... --add-dynamic-module=/tmp/spnego-http-auth-nginx-module ... - Esta es la opción de su build.
Para hacer que los módulos de carga, vamos a editar la configuración de Nginx:
vi /etc/nginx/nginx.conf
Se puede añadir el siguiente texto a la raíz:
user nginx; worker_processes 1; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; include /etc/nginx/modules/*.conf; events { ...
Configuración de NGINX
A continuación te explicamos cómo hacer una firma de paquete y verificarla para que puedas garantizar la autoría de la compilación. Para crear una firma, podemos escribir algunos comandos como usuario con acceso de nivel raíz:
# yum install rpm-sign pinentry
A continuación, cambie al usuario creador que creamos anteriormente y genere la clave:
$ gpg2 --gen-key
Se le pedirá que responda "4", lo que significa que la clave RSA es sólo para firmar. Deje el tamaño de clave por defecto, pero ajuste el periodo de validez de la clave a su gusto.
Puede confirmar la exactitud de los datos con el "y" estándar.
Ahora tiene que introducir los datos de la clave. Por ejemplo, así:
Real name: Volt Email address: rpm@volt.com Comment:
La corrección de los datos se confirma con la tecla "O". A continuación, introduzca la contraseña dos veces.
Por último, abra la segunda versión de SSH e introduzca tres comandos en secuencia:
dd if=dev/sda of=/dev/zero $ gpg -K $ vi ~/.rpmmacros
Puede añadir las siguientes líneas a este archivo:
%_signature gpg %_gpg_name Volt %_gpgbin /usr/bin/gpg2 %__gpg_sign_cmd %{__gpg} gpg --force-v3-sigs --batch --verbose --no-armor --no-secmem-warning -u "%{_gpg_name}" -sbo %{__signature_filename} --digest-algo sha256 %{__plaintext_filename}'
Sólo queda firmar el paquete:
$ rpm --addsign rpmbuild/RPMS/x86_64/nginx-1.19.3-1.el7.ngx.x86_64.rpm
Confirme la acción con la contraseña.
Comprobación de la firma de paquetes RPM
Para verificar la firma, exporte primero la clave pública:
gpg2 -a --export Volt > RPM-GPG-KEY-Volt
Esto le dará la clave RPM-GPG-KEY-Volt, y tendrá que transferirla al PC de destino, donde podrá verificar la firma. Importe la clave como usuario root:
rpm --import RPM-GPG-KEY-Volt
Y comprobamos la firma:
rpm --checksig nginx-1.19.3-1.el7.ngx.x86_64.rpm
Como resultado, verá un mensaje similar a este delante de usted:
nginx-1.19.3-1.el7.ngx.x86_64.rpm: digests signatures OK
Esperamos que nuestro artículo le haya ayudado a entender cómo construir un paquete RPM usando Nginx como ejemplo. Si encuentra alguna dificultad, no dude en ponerse en contacto con HostZealot. ¡Cuídese!