Wie identifiziere und entferne ich nicht verwendete Apt-Schlüssel?

Wie identifiziere und entferne ich nicht verwendete Apt-Schlüssel?

Bei einer typischen Installation werden mehrere passende GPG-Schlüssel hinzugefügt, sei es für PPAs oder andere Quellen, und bleiben später ungenutzt.

In der GUI (Softwareeigenschaften) ist es schwierig zu erkennen, welche Schlüssel tatsächlich für welche Repositories verwendet werden.

Gibt es eine einfache Möglichkeit, herauszufinden, welche Schlüssel überhaupt verwendet werden, sodass alle anderen Schlüssel entfernt werden können?

Meiner Meinung nach hat dies einige Sicherheitsimplikationen. Wenn ein Repository-Besitzer seinen privaten Schlüssel verliert und das Repository aktualisiert, um einen neuen Schlüssel zu verwenden, haben viele Leute immer noch den alten (nicht vertrauenswürdigen) Schlüssel installiert, oder?

Antwort1

Das Entfernen nicht verwendeter Schlüssel ist ziemlich einfach, aber genau wie beim Hinzufügen von Schlüsseln müssen Sie Ihre Hausaufgaben machen und entscheiden, welche Schlüssel nicht mehr verwendet werden und entfernt werden können.

Beginnen Sie mit der Auflistung der Apt-Schlüssel, die Sie derzeit haben sudo apt-key list.

Wenn Sie einen Schlüssel identifiziert haben, den Sie nicht mehr benötigen, können Sie ihn einfach mit entfernen sudo apt-key del KEYID.

Mit dem Listenbefehl können Sie normalerweise sehen, wofür jeder Schlüssel steht, insbesondere wenn er von einem PPA stammt, da dieser normalerweise eine UID hat, die etwas wie „Launchpad PPA für John“ enthält. Wenn Sie also dieses PPA aus den Quellen entfernt haben und es nicht mehr verwenden, können Sie es problemlos entfernen.

Manchmal müssen Sie vielleicht schnell googeln, um herauszufinden, woher ein bestimmter Schlüssel stammt. Der Mono-Schlüssel hat beispielsweise die UID „Xamarin Public Jenkins“. Wenn Sie also „Xamarin“ googeln, können Sie sehen, woher dieser Schlüssel stammt. Wenn Sie sich nicht sicher sind, können Sie auch immer zu Ihrem Bash-Verlauf zurückkehren und den von Ihnen hinzugefügten Schlüssel suchen.

man apt-keyist für weitere Informationen und andere Befehle da.

Antwort2

Ich habe ein Skript geschrieben, das nicht verwendete GPG-Schlüssel automatisch identifiziert (und optional löscht).

#!/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 ist ziemlich klobig, aber es funktioniert. Es kann Fehler enthalten, die Nutzung erfolgt auf eigene Gefahr.

Der Arbeitsablauf des Skripts ist wie folgt:

  • Extrahieren Sie die KEYIDs aller Apt-Quellen, indem Sie die Datei Release.gpg aus dem Online-Repository abrufen
  • Extrahieren Sie die KEYIDs aller Ihrer lokalen vertrauenswürdigen Schlüssel.
  • Überprüfen Sie, ob einige KEYIDs lokal vorhanden sind und nicht in den aus den Online-Quellen extrahierten Schlüsseln vorhanden sind. Dies sind die nicht verwendeten Schlüssel.

Bearbeiten: Link repariert. Bearbeiten: Code hier eingefügt, weil ich es leid bin, Links zu reparieren.

verwandte Informationen