Los repositorios RPM grandes y populares generalmente se replican en todo el mundo. Los proyectos y las empresas que proporcionan los paquetes utilizan redes de distribución de contenido (CDN) y sitios espejo para que sus paquetes estén disponibles para los consumidores. Para muchos proyectos de código abierto, eso incluye el alojamiento por parte de voluntarios. Para detectar y evitar paquetes de reemplazo maliciosos, los propietarios de los paquetes pueden firmar los archivos del paquete y los consumidores pueden verificar esas firmas.
Si bien GPG puede firmar cualquier archivo, la verificación manual de firmas de paquetes no es escalable para los administradores del sistema. El formato RPM tiene un área específicamente reservada para contener una firma del encabezado y la carga útil. Las rpm
La utilidad utiliza claves GPG para firmar paquetes y su propia colección de claves públicas importadas para verificar los paquetes. YUM y DNF usan archivos de configuración de repositorio para proporcionar punteros a las ubicaciones de claves públicas de GPG y ayudar a importar las claves para que RPM pueda verificar los paquetes.
Para este artículo, usaré claves y paquetes de EPEL. La clave pública se incluye en un paquete RPM, que también configura el yum repo
. Para algunos proyectos, la clave también puede estar disponible directamente desde un sitio web de origen.
La utilidad rpm tiene su propia gestión de claves
Dado que las rpm
La utilidad tiene su propia gestión de claves, no es necesario importar las claves públicas GPG a su conjunto de claves GPG personal. De hecho, no puede simplemente verificar el archivo con gpg
comandos porque la firma no es del archivo .rpm completo. En cambio, la firma solo se asocia con las partes críticas del paquete.
Ejecute el siguiente comando para usar rpm
para verificar un paquete:
$ rpm -K epel-release-latest-8.noarch.rpm
epel-release-latest-8.noarch.rpm: digests SIGNATURES NOT OK
En este caso, aparece el mensaje "FIRMAS INCORRECTAS" porque la clave aún no se ha importado para RPM. El comportamiento predeterminado de rpm
comandos es verificar la firma de los paquetes durante cualquier instalación o verificar interacciones. Si eso no es posible, porque el paquete no está firmado o la clave pública no está disponible, es posible que deba especificar el --nogpgcheck
opción para omitir este paso.
Si tiene acceso a la clave pública GPG, puede usar el siguiente comando para importar manualmente una clave:
$ rpm --import RPM-GPG-KEY-EPEL-8
Dado que los metadatos de la clave se almacenan en la base de datos de RPM, puede consultar y eliminar claves de la misma manera que cualquier paquete.
Use el siguiente comando para enumerar las claves:
$ rpm -qa gpg-pubkey*
gpg-pubkey-7fac5991-4615767f
gpg-pubkey-2f86d6a1-5cf7cefb
Utilice este comando para obtener la información de una clave:
$ rpm -qi gpg-pubkey-2f86d6a1-5cf7cefb
Name : gpg-pubkey
Version : 2f86d6a1
Release : 5cf7cefb
Architecture: (none)
Install Date: Mon 01 Jun 2020 12:14:38 PM EDT
Group : Public Keys
Size : 0
License : pubkey
Signature : (none)
Source RPM : (none)
Build Date : Wed 05 Jun 2019 10:17:31 AM EDT
Build Host : localhost
Relocations : (not relocatable)
Packager : Fedora EPEL (8) <[email protected]>
Summary : gpg(Fedora EPEL (8) <[email protected]>)
Description :
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: rpm-4.14.2 (NSS-3)
...omitted...
El siguiente comando se utiliza para eliminar una clave:
$ sudo rpm -e gpg-pubkey-2f86d6a1-5cf7cefb
Se describen más opciones para la administración de claves en la página man incluida con rpmkey
paquete.
YUM y DNF pueden agregar claves a la base de datos RPM
Otros administradores de paquetes facilitan aún más la administración de claves. YUM y DNF usan archivos de configuración en /etc/yum.repos.d
para especificar una URL para la clave GPG utilizada para verificar paquetes en ese repositorio. Las utilidades pueden importar la clave si aún no está disponible para su verificación.
En el yum repo
archivo de configuración, la línea gpgcheck=1 indica que se debe realizar una verificación de GPG para todos los paquetes en este repositorio. Es un valor booleano que se puede cambiar en la configuración o anular temporalmente en la línea de comandos con --nogpgcheck
opción.
Si la clave pública GPG aún no se ha importado a RPM cuando comienza la instalación de un paquete, entonces yum
(o dnf
) la utilidad puede iniciar una importación de la clave. El gpgkey=URI línea especifica el origen de la clave que se va a importar. Esta fuente puede ser cualquier URI, incluido un archivo local o un enlace web remoto. El yum
o dnf
la utilidad hará una pausa y pedirá confirmación para importar la clave después de mostrar la identificación de la clave y la huella digital.
warning: /var/cache/dnf/epel-fafd94c310c51e1e/packages/zsh-syntax-highlighting-0.7.1-1.el8.noarch.rpm: Header V3 RSA/SHA256 Signature, key ID 2f86d6a1: NOKEY
Extra Packages for Enterprise Linux 8 - x86_64 1.6 MB/s | 1.6 kB 00:00
Importing GPG key 0x2F86D6A1:
Userid : "Fedora EPEL (8) <[email protected]>"
Fingerprint: 94E2 79EB 8D8F 25B2 1810 ADF1 21EA 45AB 2F86 D6A1
From : /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-8
Is this ok [y/N]: y
La clave se agrega a RPM y luego continúa la verificación e instalación del paquete.
Prepárate para firmar un paquete
Si está creando y distribuyendo sus propios archivos de paquetes RPM, puede firmar esos paquetes con rpmsign
utilidad.
El primer paso es crear un par de llaves GPG para firmar. Asegúrese de exportar y compartir también la clave pública. Para los paquetes que se distribuirán públicamente, es una buena idea usar un nuevo par de claves y un conjunto de claves en una ubicación compartida. Además, use la --full-gen-key
y luego elija crear una clave de solo firma en lugar de la predeterminada, que crea una clave de firma y de cifrado.
$ gpg --keyring /shared/rpm/.gpg --no-default-keyring --full-gen-key
Incluso si solo una persona está usando la clave para firmar paquetes, haga un par de claves separado para usar para firmar. No utilice la misma clave para otras tareas diarias, como el cifrado de correo electrónico personal.
A continuación, necesitamos instalar el rpm-sign
paquete y configure un rpmmacros
archivo especificando la clave a utilizar. El rpm-sign
el paquete incluye una página man para rpmsign
que describe el proceso. Tenga en cuenta que el nombre del paquete tiene un guión que no forma parte del nombre del comando.
$ sudo yum install rpm-sign
$ man rpmsign
Los comandos RPM obtienen su configuración de varios rpmmacros
archivos Hay un archivo predeterminado con muchas muestras ubicado en /usr/lib/rpm/macros
. Si varias personas son responsables de firmar paquetes con la misma clave, coloque un archivo de configuración central en /etc/rpm/macros
localización. Finalmente, para una persona específica que firma los paquetes, el ~/.rpmmacros
del usuario El archivo se puede configurar para que apunte a la clave GPG correcta.
La entrada mínima para rpmmacros
archivo es especificar el nombre de la clave. Puede utilizar un nombre o el ID de clave. Obtenga el ID de clave con gpg --list-keys
comando.
Sugerencia:ejecute rpmsign
comando antes de establecer el gpg_name variable y el mensaje mostrará el formato.
$ rpmsign --addsign my-custom-package.rpm
You must set "%_gpg_name" in your macro file
Además del nombre de la clave, si el conjunto de claves está en cualquier lugar que no sea el usuario predeterminado ~/.gnupg
directorio, utilice gpg_path variable para establecer la ubicación. Este valor será el mismo que se usa con el --keyring
opción cuando se creó la clave.
Hay opciones adicionales disponibles si el binario GPG o la sintaxis de comandos requieren algo más allá de los valores predeterminados esperados.
Firmar y publicar paquetes
Ahora está listo para firmar el paquete o paquetes. Según el rpmsign
página man, el --addsign
y --resign
los comandos son intercambiables. Ambos reemplazarán la parte de la firma de un archivo de paquete RPM con información actual.
El siguiente comando es un ejemplo del uso de --addsign
bandera:
$ rpmsign --addsign myprod-2.x86_64.rpm myprod-libs-2.x86_64.rpm
Versiones anteriores de rpmbuild
incluido un --sign
opción que podría firmar el paquete durante el proceso de compilación si las claves GPG y rpmmacro
los archivos se configuraron correctamente. El --sign
la opción ahora está en desuso en favor del paso separado de usar rpmsign
. Este enfoque fomenta un construir, probar, firmar, publicar flujo de trabajo.
Finalmente, ponga a disposición de los clientes los paquetes y la clave pública GPG. Una opción es imitar el proyecto EPEL y crear un archivo RPM que incluya la clave pública GPG y uno o más yum repo
archivos que apuntan a la ubicación de los paquetes firmados. Para las organizaciones que alojan paquetes en un Red Hat Satellite Server, comience cargando la clave pública GPG y luego asigne esa clave al producto o repositorio que contiene los paquetes firmados. Todos los paquetes en un repositorio deben estar firmados con la misma clave. Esta es una razón común para que los administradores de Satélite renuncien a los paquetes antes de cargarlos.
Terminar
Ahora que sabe más sobre cómo administrar paquetes RPM con GPG, puede comprender mejor cómo trabajar con rpm
, yum
y dnf
.
Para obtener más información, consulte Asegurar las claves de firma de RPM y las guías de administración y administración de contenido en la documentación de Red Hat Satellite.
[ ¿Quiere obtener más información sobre seguridad? Consulte la lista de verificación de cumplimiento y seguridad de TI. ]