Table of Contents
Guía rápida y completa de YUM / RPM
YUM
El gestor de paquetes Yellowdog Updater Modified (YUM), al contrario que el comando rpm, no tiene opción para instalar aplicaciones sin resolver dependencias. Estos son alguno de sus ficheros más importantes.
- /etc/yum.conf: Archivo de configuración principal.
- /etc/yum.repos.d: Directorio de repositorios.
- /var/log/yum.log: Ficheros de log.
Yum tiene muchas más opciones que las descritas en esta guía rápida, para obtener más información es recomendable ver el manual oficial / google. Si crees que se debe añadir alguna opción interesante a esta guía simplemente envía un correo electrónico y será agregada de inmediato.
Enlace de interés: Administración de paquetes en CentOS 7 / RedHat
Instalar / Reinstalar / Desinstalar
La opción “-y” desactiva el modo interactivo, no preguntará confirmación.
yum install paquete yum groupinstall 'MySQL Database' #(Grupos)
yum reinstall paquete yum reinstall "@Grupo de paquetes" #(Grupos) # Reinstalar todos los paquetes del sistema instalados con yum. yum reinstall \*
Forzar el borrado del paquete únicamente de la base de datos RPM y volver a instalarlo vía Yum.
rpm -e --justdb --nodeps paquete yum install paquete
NOTA: De este modo los ficheros no se borrarán del sistema y a efectos de RPM/YUM este no estará instalado y podrá volver a instalarse, sobrescribiendo los ficheros existentes
yum remove yum groupremove #(Grupos)
No utilizar verificación de clave GPG con YUM (Instalar / Reinstalar / Actualizar)
yum --nogpg install paquete yum --nogpg reinstall paquete yum --nogpgcheck update
Mostrar versiones instaladas y versiones disponibles para actualizar
Primero mostrará “Installed Packages” y posteriormente “Available Packages”. No hay forma de tenerlo todo en una misma linea.
yum list `rpm -qa --qf '%{NAME}'`
Excluir paquetes al actualizar
yum --exclude=httpd update
Para una lista de paquetes.
yum --exclude=mysql\* --exclude=httpd\* update
También se pueden definir exclusiones en los ficheros de repositorio y en /etc/yum.conf con “exclude=procps* kernel*” para que nunca se comprueben dichos paquetes al buscar actualizaciones.
Si queremos desactivar todas las exclusiones en un momento dado se puede hacer lo siguiente.
yum --disableexcludes=all update
Instalar únicamente actualizaciones de seguridad
yum install yum-security yum list-security yum update --security
Instalar actualizaciones de seguridad filtrando por CVE / Advisory
Listar los paquetes con problemas de seguridad indicando su CVE y no la numeración de RedHat.
yum updateinfo list cves
# Muestra información de una determinada vulnerabilidad dando el identificador CVE. yum updateinfo info --cve CVE-2012-3954 # Actualiza los paquetes afectados por esa vulnerabilidad. yum update --cve CVE-2012-3954 # Actualiza los paquetes afectados por ese Advisory. yum update --advisory ELSA-2012-1141
Buscar sabiendo o no el nombre exacto del paquete
# Conociendo el nombre exacto del paquete. yum list paquete # Conociendo solo parte del nombre del paquete. yum list php*
Mostrar información de un paquete instalado / en los repositorios
yum info paquete
NOTA: Si el paquete está instalado mostrará el repositorio origen.
Buscar sin saber el nombre exacto
Buscará en nombres de paquete y descripción, usado cuando no se conoce el nombre exacto del paquete, tiene un resultado similar al de la opción “list”.
yum search My*
Con “all” se busca en nombre, descripción y paquetes relacionados aunque no lo expresen de forma explícita.
yum search all mysql
Actualizar / Desactualizar (Downgrade) paquete
Actualizar un paquete con YUM.
yum update paquete yum groupupdate 'Grupo de paquetes' #(Grupos)
Desactualizar (Downgrade) paquetes con YUM, por ejemplo icinga2.
yum --showduplicates list icinga2 # Revisamos todas las versiones de un paquete en los repositorios, en este caso icinga2. rpm -qa | grep -i icinga2 # Se comprueba la versión instalada actual. yum downgrade icinga2-common-2.8.4 icinga2-bin-2.8.4 icinga2-2.8.4 icinga2-libs-2.8.4 # Downgrade.
Desactualizar (Downgrade) un paquete con YUM mediante el plugin “yum-allowdowngrade”.
yum install yum-allowdowngrade yum --allow-downgrade install httpd
NOTA: Al actualizar un paquete rpm, nunca se sabe qué ficheros de configuración van a ser sobrescritos y cuales no, eso depende de como se haya construido el paquete (Leer). Por norma, si el fichero de configuración se encuentra en el directorio estándar, no se suele sobrescribir, si no que se crean ficheros “.rpmnew” o “.rpmsave”. Pero como comentamos antes, depende de como se haya creado el paquete rpm.
Lista paquetes pendientes de actualizaciones
yum list updates yum check-update
Actualizar todos los paquetes instalados
yum update yum groupupdate 'DNS Name Server' #(grupo)
Automatizar actualizaciones del sistema al arrancar (RedHat, Fedora, Centos,…).
chkconfig --level 345 yum on; service yum start
Mostrar las versiones de los paquetes instalados y sus actualización disponible: Leer.
Listar grupos de paquetes disponibles
Los grupos instalan conjuntos de paquetes: idioma / servidor / etc.
yum grouplist repoquery -i nginx # yum-utils debe estar instalado.
Ver paquetes instalados
Muestra el repositorio desde donde se instalo.
yum list installed
Mostrar el repositorio y paquete al que pertenece un fichero
NOTA: Acepta expresiones regulares.
yum provides "*/nginx.conf"
yum whatprovides "/usr/share/icons/hicolor/16x16/apps/java.png"
Listar paquetes de un repositorio
yumdb search from_repo 'my-*-repo'
Error "Cannot retrieve metalink for repository"
Problema al usar el repositorio XXXX recién agregado.
Error: Cannot retrieve metalink for repository: XXXX. Please verify its path and try again
Solución: Instalar los certificados.
yum upgrade ca-certificates --disablerepo=XXXX
Listar repositorios instalados (activados / desactivados)
yum repolist all
yum repolist disabled
yum repolist enabled
En algunos proyectos como por ejemplo MySQL, se ofrece un fichero RPM que instala varios repositorios (Todo dentro del mismo fichero mysql-community.repo) para así poder tener disponibles la instalación de varias versiones diferentes. Para ello se deben activar los repositorios correspondientes a la versión que se desea instalar. En otros proyectos se ofrece un repositorio en el conviven juntas todas las versiones del software requerido, en estos casos simplemente se debe especificar la versión que se desea instalar a la hora de ejecutar yum.
Especificar un repositorio en concreto para trabajar
yum --disablerepo="*" --enablerepo="google" list available
Ver Historial de yum
Si no especificamos “all” mostrará las últimas transacciones.
yum history list all
Historial de un determinada transacción o paquete. (Cuando se instaló, dependencias, usuario, etc.).Se pueden especificar rangos de transacciones.
yum history info 23 yum history info java-1.5.0-gcj yum history info 1..23
Transacciones donde han estado involucrados paquetes que empiecen con “perl-”.
yum history package-list perl-*
Ver cuantos paquetes fueron modificado en las transacciones de YUM (Instalar, Actualizar y Eliminar). Se pueden especificar rangos.
yum history summary 23 yum history summary 21..23
Repetir o deshacer una determinada transacción.
yum history redo 23 yum history undo 23
Significado de los campos de yum history
ID:Número de transacción.
Login user: Usuario que realizo la tarea.
Date and time: Fecha.
Action(s): Lista de acciones.
- D o Downgrade: Actualización a una versión anterior.
- E o Erase: Desinstalar.
- I o Install:Instalar.
- O o Obsoleting: Paqute marcado como obsoleto.
- R o Reinstall: Reinstalación.
- U o Update: Actualización de una versión superior.
Altered: Número de paquetes afectados por yum
- <: Antes de que finalizara la transacción (acción realizada con YUM), la base de datos rpmdb fue cambiada.
- >: Después de que finalizara la transacción (acción realizada con YUM), la base de datos rpmdb fue cambiada.
- *: La transacción falló y no pudo ser terminada.
- #: La transacción finalizó correctamente pero YUM devolvió un código de salida distinto de 0.
- E: La transacción finalizó correctamente pero se mostró un aviso o error.
- P: La transacción finalizó correctamente pero hay problemas con la base de datos rpmdb.
- s: La transacción finalizó correctamente pero se utilizó “–skip-broken” para no instalar determinados paquetes.
Rehacer / Deshacer instalaciones y desinstalaciones con el historial
Visualizamos el historial de yum.
yum history
Buscamos información sobre una determinada acción realizada en yum.
yum history info 100
Si queremos deshacer una acción (instalación - desinstalacion / desinstalación - instalación).
yum history undo 100
Si queremos rehacer una acción en concreto.
yum history redo 100
Ejemplo (id=100 es una instalación de nmap).
yum history undo 100 yum history redo 100
El primer comando desinstalaría nmap y el segundo comando lo volvería a instalar.
Instalar un paquete rpm con yum
Esto resolvería las dependencias de un paquete rpm descargado e instalaría el paquete.
yum localinstall paquete.rpm paquete2.rpm
Instalar paquetes rpm desde yum es muy socorrido en casos de bucles de dependencias, donde un paquete A necesita primeramente de B para ser instalado y el paquete B necesita a su vez la instalación previa de A. Veamos un ejemplo.
rpm -ivh perl-Git-1.8.3.4-1.1.x86_64.rpm error: Failed dependencies: git = 1.8.3.4-1.1 is needed by perl-Git-1.8.3.4-1.1.x86_64 rpm -ivh git-1.8.3.4-1.1.x86_64.rpm error: Failed dependencies: perl(Git) is needed by git-1.8.3.4-1.1.x86_64 perl-Git = 1.8.3.4-1.1 is needed by git-1.8.3.4-1.1.x86_64
Actualizar un paquete instalado con yum mediante un rpm
yum localupdate paquete rpm
Listar dependencias de un determinado paquete instalado o no
yum deplist <paquete> # Alternativa teniendo yum-utils repoquery --requires --resolve <paquete>
Las dos alternativa mostrarán casi lo mismo dependiendo como se usen, siendo repoquery algo más específica y amigable. deplist mostrará más detalles y mostrará varias arquitecturas, como x86_64 (64 bits) y i686 (32 bits compatible), etc. Si se usa el nombre del paquete completo, incluyendo versión y arquitectura, pero si se filtra se puede conseguir la misma salida. En este ejemplo los dos comandos muestran lo mismo.
yum deplist polkit-0.112-26.el7.x86_64 | grep -i provider | sort | uniq # Se eliminan proveedores de librerías repetidos. repoquery --requires --resolve polkit | sort
Dependencias reversas: Listar de qué paquetes es dependencia un determinado paquete
Para saber qué aplicaciones instaladas necesitan a un paquete en concreto se utiliza “whatrequires”.
rpm -q --whatrequires ImageMagick
rpm -q –whatrequires ImageMagick</code>
Para saber qué aplicaciones de los repositorios necesitan a un paquete en concreto se utiliza repoquery.
repoquery -q --whatrequires texlive
Añadir un repositorio mediante ficheros ".repo"
Otra forma es añadirlos a mano en /etc/yum.repos.d/
yum-config-manager --add-repo http://www.example.com/example.repo
Habilitar / deshabilitar repositorios
Las expresiones regulares aceptadas.
yum-config-manager --enable example\* yum-config-manager --disable example\*
Crear un repositorio yum
yum install createrepo
Metemos los paquetes en un dominio con el servidor web que queramos y ejecutamos el siguiente comando para crear el listado rpm.
createrepo --database /var/www/html/myrepo
Crear el fichero .repo para que de esta forma los clientes pueden añadirlo más fácilmente como vimos anteriormente, en caso contrario, ese fichero .repo debe crearlo los usuarios a mano en /etc/yum.repos.d
[base] name=Red Hat Enterprise Linux $releasever - $basearch - Base baseurl=http://dominio.com/repositorio/ ( Si se usa en local---> file:///var/www/html/iso) gpgcheck=0 enabled=1
Los repositorios de ficheros RPM suelen estar divididos en tres secciones, una para paquetes normales, otra para paquetes debug y otra para paquetes de código fuente.
Conocer la version y cuando se actualizó un paquete RPM
Cuantas veces se ha actualizado el kernel de linux.
rpm -q kernel --last kernel-2.6.32-71.29.1.el6 Sat 29 Oct 2011 01:49:23 PM CEST kernel-2.6.32-71.el6 Fri 28 Oct 2011 05:11:11 PM CEST
Clonar / copiar / migrar los paquetes instalados de una máquina a otra
Antes de nada lo recomendable es comprobar si se tienen los mismos repositorios en los dos sistemas. Hay que tener en cuenta, que aunque se tengan los mismos repositorios, las versiones de los paquetes dependen de un espacio temporal. Es decir, si el equipo a clonar no tiene los paquetes actualizados, al intentar clonar la paquetería, no encontrará muchas versiones de las versiones de los paquetes que necesita.
El entorno ideal, es que esa máquina a clonar este al día (lógicamente requiere que todos sus repositorios estén activos). En caso contrario, valdría con hacer un listado de los paquetes que no se encontraron e instalar las nuevas versiones a posteriori manualmente. Además de estar actualizada la distribución en base a esos repositorios que utiliza, instalar los paquetes de forma ordenada, es decir, por orden cronológico.
También es posible que se instalen las nuevas versiones de forma automática si estas han sido previamente consideradas como dependencias, algo que se comprobará manualmente al buscar esos paquetes que se mostraron como “No package XXXX available” a la hora de clonar.
NOTA: Para tener los mismos repositorios una opción es copiar el directorio /etc/yum.repos.d/ al sistema que se quiere clonar.
Vamos a ver dos opciones, la primera utilizando ssh sería la forma más simple y rápida.
Orden Cronológico (Recomendado).
ssh root@servidor_a_clonar "rpm -qa --last | awk '{print $1}' | sed '1!G;h;$!d'" | xargs yum -y install
Otra forma sería hacerlo manualmente, útil cuando no podemos diponer de ssh.
Creamos el listado de paquetes del sistema a clonar (Opción yum).
yum list installed |tail -n +3|cut -d' ' -f1 > paquetes.txt
Creamos el listado de paquetes (orden cronológico) del sistema a clonar (Opción rpm).
rpm -qa --last | awk '{print $1}' | sed '1!G;h;$!d' > paquetes.txt
Instalar el listado de paquetes anteriormente generado.
yum --nogpg -y install $(cat paquetes.txt)
NOTA: Es posible que algunos paquetes fallen, para saber qué paquetes son:
yum -y install $(cat paquetes.txt) --nogpg | grep -i "No package"
Comprobación / Comparación de paquetería instalada.
1. Generar listado en cada sistema.
Sistema1> rpm -qa --queryformat='%{NAME}\n' | sort > sistema1.txt
Sistema2> rpm -qa --queryformat='%{NAME}\n' | sort > sistema2.txt
2. Comparar los listados.
diff sistema1.txt sistema2.txt
Cuando se tienen varios repositorios con diferentes versiones del mismo paquete (no recomendable), podemos encontrar determinados problemas. Si en el sistema a clonar instala un determinado número de paquetes, posteriormente agrega un repositorio (no oficial) y sigue instalando software, paquetes de ese repositorio pueden utilizar como dependencias paquetes previamente instalados.
El sistema que clona, no tiene instalados esos paquetes previos a la instalación de ese repositorio, por lo tanto, es posible que se instalen otras dependencias desde ese mismo repositorio no oficial al querer instalar algo. Por eso es importante revisar si los paquetes importantes están en la versión que deben estar después de clonar.
Ejemplo: En el sistema a clonar se instaló Mysql desde un repositorio propio, después se agrego otro repositorio, el oficial de MySQL para CentOS con intención de instalar un solo paquete, llamado “X”, el cual no solicitó dependencias ya que estaban instaladas desde el repositorio de la empresa. Al clonar la paquetería de ese sistema, yum instaló como dependencia de X (perteneciente al repositorio oficial de MySQL) las dependencias estipuladas de ese mismo repositorio, no las de la empresa que tenían otra versión (no muy distinta).
Package MySQL-shared-5.5.24-1.el6.x86_64 is obsoleted by mysql-community-libs-5.5.40-2.el6.x86_64 which is already installed
NOTA: Por norma, los repositorios intentan mantener una cierta coherencia, por lo que las versiones no suelen cambiar mucho, siempre versiones de una misma rama (v5.5.24 - v5.5.30 - v5.5.40), pero a veces esa versión concreta es lo que se busca instalar.
Recomendación: Para prevenir estos problemas, se recomienda el hacer un clonado instalando los paquetes cronológicamente y tener una buena configuración de prioridad de uso de repositorios.
Descargar paquete rpm de los repositorios y sus dependencias
yum install yum-plugin-downloadonly #Necesitamos este plugin. yum --downloadonly --downloaddir=. -y install firefox
NOTA: Se puede hacer con otras herramientas, pero muestran muchas más dependencias que carecen de sentido.
Si queremos descargar todas las dependencias de un determinado paquete, las tengamos actualmente instaladas o no, la mejora manera es ver qué dependencias tiene con “yum deplist paquete” y después con “yumdownloader” descargarlas todas manualmente. El paquete “yum-utils” debe estar instalado.
yumdownloader --archlist=i686 paquete
NOTA: Una buena solución es partir siempre de una instalación mínima del sistema (máquina virtual?) y usar los comandos anteriormente comentados para que descargue las dependencias y así no tener problemas a la hora de querer compartir grupos de paquetes con otros sistemas que usen la misma distribución. De esta forma nos aseguramos que las dependencias son las correctas y poder ofrecer un repositorio competente.
Borrar cache de YUM
Útil cuando se obtiene el error: “E: could not open RPM database”
rpmdb: unable to join the environment error: db4 error(11) from dbenv->open: Resource temporarily unavailable error: cannot open Packages index using db3 - Resource temporarily unavailable (11) error: cannot open Packages database in E: could not open RPM database
yum clean all mv /var/cache/yum/ /tmp/ mv /var/lib/rpm/__db* /tmp/ rpm --rebuilddb
Obtener la URL de un paquete RPM en los repositorios
yumdownloader --urls nginx
El paquete “yum-utils” debe estar instalado para disponer de yumdownloader.
GPG key retrieval failed: [Errno 14] PYCURL ERROR 22 - "The requested URL returned error: 404"
Para solucionar el problema con la llave GPG solo es necesario instalar la clave del repositorio.
rpm --import http://dominio/RPM-GPG-KEY.pub
Utilizar un servidor proxy con YUM
Opción 1: Utilizando la variable “proxy” del fichero de configuración de YUM (/etc/yum.conf).
proxy=http://usuario:password@proxy:8080/
Opción 2: Utilizando las variable de entorno http_proxy / ftp_proxy del sistema operativo (/etc/profile).
export http_proxy=http://usuario:password@proxy:8080/ export ftp_proxy=http://usuario:password@proxy:8080/
Ordenar mirrors de un repositorio por velocidad de respuesta
El plug-in “fastestmirror” ordena los servidores espejo (mirrors) de un determinado repositorio (cuando se tienen varios mirrors en un repositorio). El plugin establece una conexión con cada servidor, cronometra las conexiones y los ordena por orden de velocidad de respuesta.
yum install yum-plugin-fastestmirror
Una vez instalado, asegúrese de que está habilitado verificando que en el fichero /etc/yum/pluginconf.d/fastestmirror.conf se contengan las siguientes líneas.
[main] verbose = 0 socket_timeout = 3 enabled = 1 hostfilepath = /var/cache/yum/timedhosts.txt maxhostfileage = 1
Listar todas las versiones disponibles de un paquete junto a su repositorio origen
Esto es útil al agregar repositorios extra a la distribución, normalmente un repositorio ofertado para instalar una determinada aplicación suele ofrecer múltiples versiones. También es común encontrar múltiples versiones de un mismo software cuando se han instalado repositorios adicionales, pero se debe tener cuidado y configurar bien las preferencias de dichos repositorios para no romper la lógica del árbol de dependencias. En los repositorios oficiales rara vez se encontrarán múltiples versiones de un mismo paquete.
yum --showduplicates list php-pear
Para instalar la versión corresponiendite se debe especificar junto al fichero.
yum install "nmap-4.5.1
NOTA: En algunos proyectos como por ejemplo MySQL, se ofrece un fichero RPM que instala varios repositorios (Todo dentro del mismo fichero mysql-community.repo) para así poder tener disponibles la instalación de varias versiones diferentes. Para ello se deben activar los repositorios correspondientes a la versión que se desea instalar.
Buscar y borrar paquetes RPMs duplicados
Útil cuando se tienen instaladas dos o mas versiones diferentes del mismo paquete RPM. El paquete yum-utils contiene el script package-cleanup que entre otras cosas sirve para localizar de forma automática los paquetes RPMs duplicados (también localiza cualquier otro problema con los RPMs como: entradas corruptas en la BBDD, paquetes huerfanos que no han sido instalados desde un repositorio, etc..):
yum install yum-utils package-cleanup --cleandupes
Localizar paquetes RPM huérfanos con rpmorphan
Al instalar paquetes que integran dependencias, si borramos ese paquete “padre”, los paquetes-dependencias seguirán instalados ocupando espacio en disco, a estos paquetes se les llamar huérfanos (no tienen padre). El script rpmorphan nos ayudará a identificarlos. Tiene la misma sintaxis que deborphan.
Descargar rpmorphan: http://sourceforge.net/projects/rpmorphan/files/rpmorphan/
rpmorphan
libdbi-dbd-mysql
libmcrypt
rpmorphan --guess-all
libdbi-dbd-mysql
libmcrypt
sendmail-doc
sgml-common
xml-common
Listar paquetes instalados que no pertenecen actualmente a los repositorios configurados
package-cleanup --orphans
NOTA: Mostrará paquetes instalados manualmente pero tambien paquetes que han desaparecido actualmente de los repositorios, eso no significa que podamos borrarlos del sistema, simplemente que no se encuentran en ese momento en el repositorio por le motivo que sea (actualización, obsoleto, etc.)
Modificar la prioridad de los repositorios
Si se quiere dar más prioridad a un repositorio que a otro a la hora de instalar software podemos hacer uso del plugin yum-priorities.
yum install yum-plugin-priorities
El siguiente paso es asignar prioridad a los repositorios mediante el uso de sus ficheros de configuración en /etc/yum.repos.d/ (Menos valor = Más prioridad), por defecto es 99.
[base] name=CentOS-$releasever - Base mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os #baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/ gpgcheck=1 gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-centos4 priority=1
Leer: http://wiki.centos.org/PackageManagement/Yum/Priorities
Conflicto al tener varios repositorios con distintas versiones de dependencias
Cuando se tienen varios repositorios instalados, normalmente no oficiales y estos a su vez tienen diferentes versiones de una misma dependencia, podemos en algunos casos observar el siguiente mensaje error en yum.
Error: Package: php-xcache-3.0.4-1.el6.x86_64 (epel) Requires: php(api) = 20090626 Installed: php-common-5.4.9-1.el6.fa.x86_64 (@fa-stable) php(api) = 20100412-x86-64 Available: php-common-5.3.3-26.el6.x86_64 (base) php(api) = 20090626 Available: php-common-5.3.3-27.el6_5.x86_64 (updates) php(api) = 20090626 Available: php-common-5.3.3-27.el6_5.1.x86_64 (updates) php(api) = 20090626 Available: php-common-5.4.8-4.el6.fa.x86_64 (fa-testing) php(api) = 20100412-x86-64
Esto se debe a que se ha instalado una dependencia no correspondiente (se requiere php-common-5.3.3-26.el6.x86_64 20090626, que se encuentra en el repositorio base). La solución para este caso, sería desinstalar la actual versión de esa dependencia y reinstalar la correcta o bien, instalar manualmente el paquete rpm php-xcache-3.0.4-1.el6.x86_64.
Recomendación: Aunque los repositorios no oficiales de una determinada versión de una distro intenten siempre mantener una determinada coherencia respecto al software de los repositorios oficiales, precisamente para evitar problemas de este tipo, instalar el mínimo software de repositorios no oficiales es lo más recomendable.
De tener que utilizar repositorios no oficiales, una vez instalado el software pertinente, desactivar los repositorios no oficiales para no generar posibles problemas de dependencias en el futuro. También es factible asignar diferentes niveles de prioridad al uso de repositorios.
Localizar ejecutables / binarios en el $PATH que no pertenecen a ningun paquete RPM
Tras una intrusión con acceso root a una máquina Linux suele ser muy habitual dejar binarios hackeados o ficheros que pertenecen a un rootkit dentro del $PATH. La mayoría de las aplicaciones para detectar rootkits de forma automática no contemplan este escenario, ya que suelen comprobar la integridad de las aplicaciones instaladas basandose en los metadatos de los paquetes RPM/DPKG, etc..
Este pequeño script genera un listado de todos aquellos ficheros que están en el $PATH del usuario que lo ejecuta, y por cada uno de ellos se comprueba si pertenece a algún paquete RPM (con el parámetro –whatprovides), en caso de no pertenecer se genera una alerta.
#!/bin/bash # Localiza binarios que estan en el $PATH y no pertenecen a ningun RPM # $Id: notowned_rpm.sh 1158 2009-09-10 10:55:47Z santi $ # A partir de $PATH generar el listado de directorios a analizar, cambiando # los ":" por un espacio :) DIRS=`echo $PATH | tr ":" " "` # Por cada fichero -que no sea un enlace- comprobar si pertenece a un RPM for FILE in `find $DIRS -type f ! -type l 2> /dev/null` ; do rpm -qf $FILE > /dev/null || echo "$FILE is not owned by any RPM" done
RPM
RPM puede ser usado para interactuar con paquetes instalados en el sistema o con ficheros RPM. Permite instalar, actualizar, consultar, verificar y eliminar paquetes instalados además de otras funciones auxiliares. Antes de comenzar se deben tener claras las siguientes opciones de rpm y su significado.
a Se refiere a paquete instalados. p Se refiere a paquetes rpm (que pueden estar o no instalados). q Realiza consultas.
Verificar integridad y seguridad de paquetes RPM
Verificar todos los paquetes del sistema y sus ficheros, hash, tamaño, usuario, grupo, permisos,…
# Todos los paquetes. rpm -Va # Paquete especifico. rpm -V nmap # Revisar un solo fichero rpm --verify --file /usr/bin/nmap # Niveles de depuración (debug), el máximo vv. rpm -Vvv nmap
Averiguar cuando se instaló el sistema.
rpm -qi basesystem
Códigos de error al verificar paquetes / ficheros RPM.
- 5: Fallo en el checksum MD5.
- S: Discrepancia en el tamaño del fichero.
- T: Fecha de modificación distinta al original.
- L: Enlace simbólico.
- D: Dispositivo.
- U: Usuario.
- G: Grupo.
- M: Permisos.
Simular / Instalar / Reinstalar / Actualizar / Desactualizar
Las opciones “--force”, “--replacepkgs”, “--replacefiles” y “--oldpackage” funcionan de igual manera y se pueden usar indistintamente. Estos comandos son útiles cuando se quieren recuperar ficheros de configuración borrados o sobrescritos por error.
# Simula una instalacion / desinstalación mostrando posibles conflictos, si no muestra nada en la salida, indica que se puede instalar / desinstalar sin conflicto de dependencias. rpm -e --test nginx
rpm -ivh paquete.rpm rpm -ivh 'http://www.dominio.com/.../paquete.rpm'
rpm -ivh --force paquete.rpm
rpm -Uvh paquete.rpm
rpm -Uvh --oldpackage paquete.rpm
NOTA: La opción -U actualiza un paquete existente o instalar el paquete si no está instalado. Por el contrario la opción -F sólo actualiza o refrescar un paquete que se encuentre actualmente instalado.
IMPORTANTE: Dependiendo de como fue creado el paquete RPM, una actualización de la aplicación puede sobrescribir todos los ficheros de configuración de la misma. Esto depende de si se han usado correctamente en el fichero “.spec” (paquetes de código fuente) las opciones “%config(noreplace)” o bien “%config” a la hora de generar el paquete RPM.
Más información: http://people.ds.cam.ac.uk/jw35/docs/rpm_config.html
Es raro que eso pase con paquetes RPM provenientes de repositorios oficiales de la distribuciones GNU/Linux. De todas maneras se recomienda siempre hacer una copia de seguridad ya que algunas veces se puede perder toda la configuración de una aplicación actualizada.
Desinstalar
Con y sin dependencias (Mirar la opción de simulación del punto anterior).
rpm -ev
rpm -ev --nodeps
NOTA: Al desinstalar un paquete RPM podemos pasarle el flag “–repackage” para dejar un backup del RPM borrado en el directorio “/var/spool/repackage”.
Mostrar nombre completo de un paquete instalado
La opción “-i” da información del paquete.
rpm -q paquete
Muestra información de un paquete rpm NO instalado.
rpm -qpi paquete.rpm
Muestra todos los paquetes instalados
Con la opción “–last” tenemos los más recientes.
rpm -qa
NOTA: Para tener un listado de todos los paquetes instalados ordenador alfabéticamente se puede hacer una tubería con sort.
rpm -qa | sort
Lista los archivos de un paquete rpm
rpm -qpl
Lista los ficheros de un paquete instalado
rpm -ql [foo]
Lista solo los ficheros de configuración de un paquete
NOTA: No siempre funciona.
rpm -qc paquete_instalado rpm -qpc paquete.rpm
Saber a qué paquete pertenece un determinado fichero
rpm -qf /usr/bin/dir
Si además queremos saber los repositorios que contienen el paquete al que pertenece un determinado archivo.
yum whatprovides "/usr/share/icons/hicolor/16x16/apps/java.png"
Dependencias en paquetes RPM
Los paquetes RPM pueden tener especificadas sus dependencias mediante las etiquetas “requires”, “provides” y “conflicts”. Estas pueden ser agregadas de forma manual o de forma automática por el empaquetador responsable. La forma automática se basa en la herramienta “ldd” para listar qué librerías requiere cada ejecutable del paquete rpm, una vez averiguadas son agregadas al paquete durante su construcción.
Mostrar dependencias de un paquete instalado
rpm -qR
Muestra las dependencias de un paquete rpm en disco / URL
rpm -qpR
Extraer ficheros de un paquete rpm
rpm2cpio file.rpm | cpio -idv
Instalar un paquete de código fuente rpm (Opción 1)
rpm -ivh paquete.src.rpm ---> /usr/src/RedHat/SPECS rpmbuild -ba package.spec
Instalar un paquete de código fuente rpm (Opción 2)
rpmbuild --rebuild nombre_paquete.src.rpm rpm -Uvih nombre_paquete.rpm
Listar la fecha de todos los paquetes instalados / Buscar los paquetes instalados en una fecha
Visualizar los paquetes instalados con su fecha de instalación.
rpm -qa --queryformat '%{installtime} \"%{vendor}\" %{name}-%{version}-%{release} %{installtime:date}\n'
Mostrar únicamente los paquetes instalados en una fecha determinada.
rpm -qa --queryformat '%{installtime} \"%{vendor}\" %{name}-%{version}-%{release} %{installtime:date}\n' | grep -i "Fri 07 Mar"
Obtener listado de paquetes RPM sin versión ni saltos de linea
rpm -qa --qf "%{NAME}\n" | grep -i php56 | tr "\n " " " php56-php-mcrypt php56-php-pecl-ssh2 php56-runtime php56-php-pecl-json-post ...
Tamaño en bytes de todos los paquetes rpm instalados
echo $((`rpm -qa --queryformat='%{SIZE}+' | sed 's/+$//'`))
Mostrar scriptslets de los paquetes rpm
Los paquetes rpm ejecutan instrucciones de scripting (comandos) antes, después o durante las instalaciones / desinstalaciones, para poder saber qué comandos ejecuta podemos usar la siguiente opción de RPM.
rpm -qp --scripts https://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm postinstall scriptlet (using /bin/sh): # Not needed for el6 as sources has been removed #echo "# epel repo -- added by epel-release " \ # >> /etc/sysconfig/rhn/sources #echo "yum epel http://download.fedora.redhat.com/pub/epel/6/\$ARCH" \ # >> /etc/sysconfig/rhn/sources postuninstall scriptlet (using /bin/sh): #sed -i '/^yum\ epel/d' /etc/sysconfig/rhn/sources #sed -i '/^\#\ epel\ repo\ /d' /etc/sysconfig/rhn/sources
NOTA: Se puede también indicar la ruta a un RPM alojado en disco.
Listar opciones de optimizacion (Opt flags) utilizadas en la compilación de un rpm instalado
rpm -q --queryformat="%{NAME}: %{OPTFLAGS}\n" nginx
Listar paquetes instalados de repositorios no oficiales
rpm -qa --qf '%{NAME} %{VENDOR}\n' | grep -v CentOS
Resetear permisos de un paquete instalado
Restablece los permisos originales que deberían tener los ficheros pertenecientes al paquete.
rpm --setperms paquete
Visualizar el changelog de un paquete instalado
rpm -q --changelog paquete | less
NOTA: Si se quiere obtener el changelog de paquetes no instalados, se debe hacer uso del plugin yum-plugin-changelog.
# El plugin yum-plugin-changelog debe estar instalado, también permite buscar por fecha. yum changelog openssh yum changelog 2015-Jun yum\*
Localizar la documentación de un paquete instalado
Indicando el nombre del paquete.
rpm -qd paquete
Indicando un fichero (que pertenece a un paquete).
rpm -qdf /ruta/fichero
Mostrar información de un paquete instalado
rpm -qi paquete
NOTA: Este comando no muestra el repositorio origen, muestra el “Proveedor”. Si queremos saber el repositorio origen enemos entre otros “yum info” o bien “repoquery -i”.
Mostrar fechas de paquetes instalados
Muestra un listado de todos los paquetes rpm instalados y su fecha de instalación ordenado descendientemente.
rpm -qa --last
Mostrar los disparadores (Triggers) de un paquete RPM
No todos los paquetes tienen disparadores (scripts post instalación).
Disparadores de un paquete rpm instalado.
rpm -q --triggers paquete
Disparadores de un paquete rpm no instalado.
rpm -qp --triggers
Mostrar las llaves GPG instaladas junto con su repositorio
rpm -q gpg-pubkey --qf '%{name}-%{version}-%{release} --> %{summary}\n'
Autocompletado de comandos rpm y yum
Si se quiere tener la posibilidad de autocompletado en comandos rpm y yum (entre otros) se requiere instalar “bash-completion”. Este paquete amplía la capacidad de autocompletado de la bash para un gran número de aplicaciones, no solo rpm y yum.
yum install -y bash-completion