¿Cómo identificar y eliminar claves aptas no utilizadas?

¿Cómo identificar y eliminar claves aptas no utilizadas?

En una instalación típica se agregan varias claves GPG aptas, ya sea para PPA u otras fuentes, y luego no se utilizan.

Es difícil identificar en la GUI (propiedades de software) qué claves se utilizan realmente para qué repositorios.

¿Existe una manera fácil de identificar qué claves se utilizan para poder eliminar todas las demás claves?

En mi opinión, esto tiene algunas implicaciones de seguridad. Si el propietario de un repositorio pierde su clave privada y actualiza el repositorio para usar una nueva clave, muchas personas todavía tienen instalada la clave anterior (no confiable), ¿verdad?

Respuesta1

Eliminar claves no utilizadas es bastante simple, pero al igual que cuando se agregan claves, usted es el encargado de hacer su tarea y decidir qué claves ya no están en uso y se pueden eliminar.

Comience enumerando las claves apt que tiene actualmente sudo apt-key list.

Una vez que identifique una clave que ya no necesita, simplemente puede eliminarla con sudo apt-key del KEYID.

Con el comando list normalmente podrás ver qué es cada clave, especialmente si es de un ppa, ya que normalmente tendrá un uid que incluye algo como "Launchpad PPA para John". Entonces, si eliminó ese ppa de las fuentes y ya no lo usa, puede eliminarlo de manera segura.

A veces es posible que necesites un google rápido para saber de dónde viene una clave específica, por ejemplo, la clave mono tiene el uid "Xamarin Public Jenkins", que si buscas en google xamarin puedes ver de dónde vino esa clave. Además, siempre puedes volver a tu historial de bash y encontrar la clave que agregaste si no estás seguro.

man apt-keyestá ahí para obtener más información y otros comandos.

Respuesta2

Escribí un script que identifica automáticamente (y opcionalmente elimina) las claves GPG no utilizadas.

#!/bin/bash
#------------------------------------
# Script that identifies and optionally removes unused trusted gpg keys.
# These keys are usually added to install software from non-standard repositories (e.g. PPAs)
# TODO:
# - what if source repo is not reachable
# - dunno why but the delete doesn't actually delete keys anymore ¯\_(ツ)_/¯
# - dunno why but slack key gets detected as unused even if slack is on the system ¯\_(ツ)_/¯
#------------------------------------

usage() { 
    echo "Usage: $(basename "$0") [-b] [-d] [-h]" 1>&2
    echo "prints to stdout the unused keys in the format <keyid> <userid>" 1>&2
    echo "-b, backups trusted.gpg and trusted.gpg.d/ appending .bak (requires superuser)" 1>&2
    echo "-d, deletes unused keys (requires superuser)" 1>&2
    echo "-h, shows this help" 1>&2
}

backup=0
delete=0

while getopts ":bdh" o; do
    case "${o}" in
        b)
            backup=1    
            ;;
        d)
            delete=1
            ;;
        h)
            usage
            exit 0
            ;;
        *)
            usage
            exit 1
            ;;
    esac
done
shift $((OPTIND-1))

# create directory in /tmp with random name
tmpdir=$(mktemp -d)
#echo "storing tmp files in $tmpdir" 1>&2

# get list of sources
grep -h ^deb /etc/apt/sources.list /etc/apt/sources.list.d/*.list > "${tmpdir}"/sources

# get list of releases files
# first sed expression removes content between square brackets (such as architecture specifications)
# awk is used to get only the source url and the distro we are using
# the 2 subsequent sed expressions are used piece everything together and generate the url to the Release.gpg file we need
# sort and uniq are used to eliminate duplicate entries
sed -e "s/\[.*\] //" "${tmpdir}/sources" | awk '{print $2" "$3}' | sed -E -e "s/\/? /\/dists\//" | sed -e "s/$/\/Release.gpg/" | sort | uniq > "${tmpdir}"/releases

# for each source, compute the keyid and save it in a file
while read -r url; do
    domain=$(echo $url | awk -F/ '{print $3}')
    #echo "processing ${url}"
    wget -q -T 10 -O "${tmpdir}"/"${domain}"_Release.gpg "$url"
    gpg --list-packets "${tmpdir}"/"${domain}"_Release.gpg | grep "keyid" | grep -Eo "[0-9A-F]{16}" >> "${tmpdir}"/sourcekeyidstemp
done <"${tmpdir}"/releases

# remove duplicate entries
sort "${tmpdir}"/sourcekeyidstemp | uniq > "${tmpdir}"/sourcekeyids

# for each trusted gpg key, extract his keyid and userid
gpg --list-packets /etc/apt/trusted.gpg | grep -A 8 "public key packet" | grep -E "keyid:|user ID" | grep -oE "[0-9A-F]{16}|\".*\""  | awk '{(getline tmp); print $0,tmp}' > "${tmpdir}"/trustedkeys

for f in /etc/apt/trusted.gpg.d/*.gpg; do
    gpg --list-packets "$f" | grep -A 8 "public key packet" | grep -E "keyid:|user ID" | grep -oE "[0-9A-F]{16}|\".*\""  | awk '{(getline tmp); print $0,tmp}' >> "${tmpdir}"/trustedkeys
done

# for each trusted gpg key, check if in use
touch "${tmpdir}"/unusedkeys
while read -r line; do
    keyid=$(echo "$line" | cut -d "\"" -f 1)
    userid=$(echo "$line" | cut -d "\"" -f 2)
    check=$(grep ${keyid} "${tmpdir}"/sourcekeyids)
    if [ -z "$check" ]; then
        echo "${keyid} ${userid}" >> "${tmpdir}"/unusedkeys
    fi 
done <"${tmpdir}"/trustedkeys

# backup gpg keys 
if [ $backup -eq 1 ]; then
    sudo cp /etc/apt/trusted.gpg /etc/apt/trusted.gpg.bak
    sudo cp -r /etc/apt/trusted.gpg.d/ /etc/apt/trusted.gpg.d.bak
fi

# delete unused gpg keys
if [ $delete -eq 1 ]; then
    while read -r line; do
        keyid=$(echo "$line" | cut -d "\"" -f 1)
        sudo apt-key del "$keyid" >/dev/null 
    done <"${tmpdir}"/unusedkeys
    echo "deleted keys:"
fi

# print unused keys
cat "${tmpdir}"/unusedkeys

Es bastante complicado pero funciona. Puede haber errores, utilícelo bajo su propia responsabilidad.

El flujo de trabajo del script es el siguiente:

  • extraiga los KEYID de todas las fuentes aptas obteniendo el archivo Release.gpg del repositorio en línea
  • extraiga los KEYID de todas sus claves locales de confianza.
  • compruebe si algunos KEYID están presentes localmente y no en los extraídos de las fuentes en línea. Esas son las llaves no utilizadas.

Editar: enlace fijo Editar: pegué el código aquí porque estoy cansado de arreglar enlaces

información relacionada