Come gestire la deprecazione di apt-key e add-apt-repository Utilizzando gpg per aggiungere repository esterni su Ubuntu 22.04

Introduzione

apt-key è un’utilità utilizzata per gestire le chiavi che APT utilizza per autenticare i pacchetti. È strettamente correlata all’utilità add-apt-repository, che aggiunge repository esterni utilizzando keyserver alla lista delle fonti attendibili di un’installazione APT. Tuttavia, le chiavi aggiunte tramite apt-key e add-apt-repository sono considerate attendibili globalmente da apt. Queste chiavi non sono limitate ad autorizzare il singolo repository per cui erano destinate. Qualsiasi chiave aggiunta in questo modo può essere utilizzata per autorizzare l’aggiunta di qualsiasi altro repository esterno, presentando una preoccupante problematica di sicurezza.

A partire da Ubuntu 20.10, l’uso di apt-key genera un avviso che l’utility sarà deprecata in un prossimo futuro; allo stesso modo, add-apt-repository sarà presto deprecata. Sebbene questi avvisi di deprecazione non impediscano rigorosamente l’uso di apt-key e add-apt-repository con Ubuntu 22.04, non è consigliabile ignorarli.

La pratica migliore attuale è utilizzare gpg al posto di apt-key e add-apt-repository, e nelle versioni future di Ubuntu sarà l’unica opzione. apt-key e add-apt-repository agiscono come wrapper, chiamando gpg in background. Utilizzando direttamente gpg si elimina l’intermediario. Per questo motivo, il metodo gpg è retrocompatibile con le versioni precedenti di Ubuntu e può essere utilizzato al posto di apt-key.

In questo tutorial saranno illustrate due procedure che utilizzano alternative a apt-key e add-apt-repository. Prima verrà spiegato come aggiungere un repository esterno utilizzando una chiave pubblica con gpg al posto di apt-key. Successivamente, come complemento, verrà descritto come aggiungere un repository esterno utilizzando un keyserver con gpg come alternativa a add-apt-repository.

Prerequisiti

Per completare questo tutorial, sarà necessario un server Ubuntu 22.04. Assicurarsi di configurarlo seguendo la nostra guida per la configurazione iniziale del server Ubuntu 22.04, con un utente non root con privilegi sudo e un firewall abilitato.

Passo 1 — Identificare i Componenti e il Formato Chiave

PGP, o Pretty Good Privacy, è un programma di crittografia proprietario utilizzato per firmare, crittografare e decrittografare file e directory. I file PGP sono file di chiave pubblica, utilizzati in questo processo per autenticare i repository come fonti valide all’interno di apt. GPG, o GNU Privacy Guard, è un’alternativa open source a PGP. I file GPG sono di solito portachiavi, che sono file che contengono più chiavi. Entrambi questi tipi di file sono comunemente utilizzati per firmare e crittografare file.

gpg è lo strumento da riga di comando di GPG che può essere utilizzato per autorizzare repository esterni per l’uso con apt. Tuttavia, gpg accetta solo file GPG. Per utilizzare questo strumento da riga di comando con file PGP, è necessario convertirli.

Elasticsearch presenta uno scenario comune per la conversione delle chiavi e sarà utilizzato come esempio per questa sezione. Scaricherai una chiave formattata per PGP e la convertirai in un formato compatibile con apt con un’estensione di file .gpg. Farai ciò eseguendo il comando gpg con l’opzione --dearmor. Successivamente, aggiungerai il collegamento del repository alla lista delle fonti dei pacchetti, allegando un riferimento diretto alla tua chiave convertita. Infine, verificherai questo processo installando il pacchetto Elasticsearch.

I progetti che richiedono l’aggiunta di repository con la verifica della chiave ti forniranno sempre una chiave pubblica e un URI del repository che ne rappresenta la posizione esatta. Nel nostro esempio di Elasticsearch, la documentazione fornisce questi componenti nella pagina di installazione.

Ecco i componenti forniti per Elasticsearch:

  • Chiave: https://artifacts.elastic.co/GPG-KEY-elasticsearch
  • Repository: https://artifacts.elastic.co/packages/7.x/apt stable main

In seguito, devi determinare se ti viene fornito un file PGP o GPG con cui lavorare. Puoi ispezionare il file chiave aprendo l’URL con curl:

  1. curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch

Ciò restituirà il contenuto del file chiave, che inizia con quanto segue:

Output
-----BEGIN PGP PUBLIC KEY BLOCK----- . . .

Nonostante la presenza di GPG nell’URL, la prima riga indica che si tratta effettivamente di un file chiave PGP. Prendi nota di questo, perché apt accetta solo il formato GPG. Originariamente, apt-key rilevava i file PGP e li convertiva automaticamente in GPG chiamando gpg in background. Il passaggio 2 coprirà sia la conversione manuale da PGP a GPG, sia cosa fare quando la conversione non è necessaria.

Passaggio 2 – Download della chiave e conversione in un tipo di file compatibile con apt

Con il metodo gpg, è necessario sempre scaricare la chiave prima di aggiungerla all’elenco delle sorgenti dei pacchetti. In precedenza, con apt-key, questo ordine non veniva sempre applicato. Ora è necessario fare riferimento al percorso del file chiave scaricato nel tuo elenco delle sorgenti. Se non hai scaricato la chiave, ovviamente non puoi fare riferimento a un percorso esistente.

Con Elasticsearch stai lavorando con un file PGP, quindi lo convertirai in formato file GPG dopo il download. Nell’esempio seguente viene utilizzato curl per scaricare la chiave, con il download inviato a un comando gpg. gpg viene chiamato con il flag --dearmor per convertire la chiave PGP in un formato file GPG, con -o utilizzato per indicare l’output del file.

Su Ubuntu, la directory /usr/share/keyrings è la posizione consigliata per i tuoi file GPG convertiti, poiché è la posizione predefinita in cui Ubuntu memorizza i suoi keyring. Il file viene nominato elastic-7.x.gpg in questo esempio, ma qualsiasi nome funziona:

  1. curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elastic-7.x.gpg

Questo converte il file PGP nel formato GPG corretto, rendendolo pronto per essere aggiunto all’elenco delle sorgenti per apt.

Nota: Se il file scaricato fosse già in formato GPG, potresti invece scaricare il file direttamente in /usr/share/keyrings senza convertirlo utilizzando un comando come nell’esempio seguente:

  1. curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo tee /usr/share/keyrings/elastic-7.x.gpg

In questo caso, l’output del comando curl verrebbe inviato a tee per salvare il file nella posizione corretta.

Passaggio 3 — Aggiunta del Repository alla Tua Lista di Sorgenti dei Pacchetti

Con la chiave scaricata e nel corretto formato di file GPG, puoi aggiungere il repository alle sorgenti dei pacchetti apt collegandolo esplicitamente alla chiave ottenuta. Ci sono tre metodi per raggiungere questo obiettivo, tutti relativi a come apt trova le sorgenti. apt estrae le sorgenti da un file centrale sources.list, da file .list nella directory sources.list.d, e da file .source nella directory sources.list.d. Anche se non c’è alcuna differenza funzionale tra le tre opzioni, è consigliabile considerare le tre opzioni e scegliere il metodo che meglio si adatta alle tue esigenze.

Opzione 1 — Aggiunta Diretta a sources.list

Il primo metodo prevede l’inserimento di una riga che rappresenta direttamente la sorgente all’interno di /etc/apt/sources.list, il file principale che contiene le sorgenti di apt. Ci sono più fonti in questo file, comprese le fonti predefinite fornite con Ubuntu. È perfettamente accettabile modificare questo file direttamente, anche se l’Opzione 2 e l’Opzione 3 presenteranno una soluzione più modulare che può essere più facile da modificare e mantenere.

Apri /etc/apt/sources.list con nano o il tuo editor di testo preferito:

  1. sudo nano /etc/apt/sources.list

Aggiungi quindi il repository esterno alla fine del file:

/etc/apt/sources.list
. . .
deb [arch=amd64,arm64 signed-by=/usr/share/keyrings/elastic-7.x.gpg] https://artifacts.elastic.co/packages/7.x/apt stable main

Questa riga contiene le seguenti informazioni sulla sorgente:

  • deb: Questo specifica che la sorgente utilizza un’architettura regolare di Debian.
  • arch=amd64,arm64 specifica le architetture su cui verranno scaricati i dati di APT. Qui è amd64 e arm64.
  • signed-by=/usr/share/keyrings/elastic-7.x.gpg: Questo specifica la chiave utilizzata per autorizzare questa sorgente, e qui punta al tuo file .gpg archiviato in /usr/share/keyrings. Questa parte della riga deve essere inclusa, mentre in precedenza non era richiesta nel metodo apt-key. Questa aggiunta è il cambiamento più critico nel portare via da apt-key, poiché lega la chiave a un repository singolare a cui è consentito autorizzare e risolve il problema di sicurezza originale in apt-key.
  • https://artifacts.elastic.co/packages/7.x/apt stable main: Questo è l’URI che rappresenta la posizione esatta dei dati all’interno del repository.
  • /etc/apt/sources.list.d/elastic-7.x.list: Questa è la posizione e il nome del nuovo file da creare.
  • /dev/null: Viene utilizzato quando l’output di un comando non è necessario. Indirizzare tee a questa posizione omette l’output.

Salva ed esci premendo CTRL+O poi CTRL+X.

Opzione 2 — Creazione di un Nuovo File .list in sources.list.d

Con questa opzione, invece, creerai un nuovo file nella directory sources.list.d. apt analizza sia questa directory che sources.list per le aggiunte di repository. Questo metodo ti consente di isolare fisicamente le aggiunte di repository all’interno di file separati. Se dovessi mai avere bisogno di rimuovere in seguito questa aggiunta o apportare modifiche, puoi eliminare questo file invece di modificare il file centrale sources.list. Mantenere le tue aggiunte separate rende più facile la manutenzione, e modificare sources.list può essere più propenso agli errori in un modo che influisce su altri repository nel file.

Per fare questo, indirizza un comando echo in un comando tee per creare questo nuovo file e inserire la riga appropriata. Il file è nominato elastic-7.x.list nell’esempio seguente, ma qualsiasi nome funziona purché sia un nome di file univoco nella directory:

  1. echo "deb [arch=amd64,arm64 signed-by=/usr/share/keyrings/elastic-7.x.gpg] https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-7.x.list > /dev/null

Questo comando è identico alla creazione manuale del file e all’inserimento della riga di testo.

Opzione 3 — Creazione di un file .sources in sources.list.d

Il terzo metodo scrive su un file .sources invece di un file .list. Questo metodo è relativamente nuovo e utilizza il formato multilinea deb822 che è meno ambiguo rispetto alla dichiarazione deb . . ., anche se è funzionalmente identico. Crea un nuovo file:

  1. sudo nano /etc/apt/sources.list.d/elastic-7.x.sources

Quindi aggiungi il repository esterno utilizzando il formato deb822:

/etc/apt/sources.list.d/elastic-7.x.sources
Types: deb
Architectures: amd64 arm64
Signed-By: /usr/share/keyrings/elastic-7.x.gpg
URIs: https://artifacts.elastic.co/packages/7.x/apt
Suites: stable
Components: main

Salva ed esci dopo aver inserito il testo.

Questo è analogo al formato in una sola riga, e facendo un confronto riga per riga si nota che le informazioni in entrambi sono identiche, solo organizzate in modo diverso. Da notare che questo formato non utilizza virgole quando ci sono argomenti multipli (come con amd64,arm64), e invece utilizza spazi.

Successivamente, verificherai questo processo facendo un’installazione di prova.

Passaggio 4 — Installazione del pacchetto dal repository esterno

Devi chiamare apt update per far sì che apt esamini il file principale sources.list, e tutti i file .list e .sources in sources.list.d. Chiamare apt install senza prima fare un aggiornamento causerà un’installazione fallita o l’installazione di un pacchetto predefinito non aggiornato da apt.

Aggiorna i tuoi repository:

  1. sudo apt update

Quindi installa il tuo pacchetto:

  1. sudo apt install elasticsearch

Niente cambia in questo passaggio rispetto al metodo apt-key. Una volta completato questo comando, avrai terminato l’installazione.

Aggiunta – Aggiungere un repository esterno usando un keyserver

Questa sezione tratterà brevemente l’utilizzo di gpg con un keyserver anziché una chiave pubblica per aggiungere un repository esterno. Il processo è quasi identico al metodo della chiave pubblica, con la differenza nel modo in cui viene chiamato gpg.

add-apt-repository è il corrispettivo basato su keyserver di apt-key, e entrambi sono destinati alla deprecazione. Questo scenario utilizza componenti diversi. Invece di una chiave e un repository, ti viene fornito un URL del keyserver e un ID chiave. In questo caso, puoi scaricare direttamente dal keyserver nel formato .gpg appropriato senza dover convertire nulla. Poiché add-apt-repository sarà presto deprecato, userai invece gpg per scaricare su un file sovrascrivendo il comportamento predefinito di gpg di importare in un keyring esistente.

Utilizzando il linguaggio di programmazione open-source R come esempio, ecco i componenti forniti, che possono anche essere trovati nelle istruzioni di installazione sul sito del progetto ufficiale:

  • Keyserver: keyserver.ubuntu.com
  • ID chiave: E298A3A825C0D65DFD57CBB651716619E084DAB9
  • Repository: https://cloud.r-project.org/bin/linux/ubuntu jammy-cran40/

Prima, scarica direttamente dal keyserver usando gpg. Tieni presente che a seconda del traffico di download, questo comando di download potrebbe richiedere del tempo per completarsi:

  1. sudo gpg --homedir /tmp --no-default-keyring --keyring /usr/share/keyrings/R.gpg --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9

Questo comando include le seguenti opzioni, che sono diverse dall’utilizzo di gpg con una chiave pubblica:

  • --no-default-keyring combinato con --keyring consente di generare un nuovo file anziché importare in un keyring esistente, che è il comportamento predefinito di gpg in questo scenario.
  • --keyserver combinato con --recv-keys fornisce la chiave specifica e la posizione da cui stai scaricando.
  • --homedir è utilizzato per sovrascrivere la posizione predefinita di creazione dei file temporanei di gpg. gpg deve creare questi file per completare il comando; altrimenti, gpg cercherà di scrivere in /root, causando un errore di autorizzazione. Invece, questo comando colloca i file temporanei nella directory appropriata /tmp.

Successivamente, aggiungi il repository a un file .list. Questo viene fatto allo stesso modo di un repository esterno usando una chiave pubblica, mediante l’inoltro di un comando echo in un comando tee:

  1. echo "deb [arch=amd64 signed-by=/usr/share/keyrings/R.gpg] https://cloud.r-project.org/bin/linux/ubuntu jammy-cran40/" | sudo tee /etc/apt/sources.list.d/R.list > /dev/null

Successivamente, aggiorna la lista dei tuoi repository:

  1. sudo apt update

Quindi puoi installare il pacchetto:

  1. sudo apt install r-base

Utilizzare gpg per aggiungere repository esterni è simile tra chiavi pubbliche e keyservers, con la differenza nel modo in cui chiami gpg.

Conclusione

Aggiungere un repository esterno utilizzando una chiave pubblica o un keyserver può essere fatto tramite gpg, senza l’uso di apt-key o add-apt-repository come intermediari. Utilizza questo metodo per garantire che il tuo processo non diventi obsoleto nelle future versioni di Ubuntu, poiché apt-key e add-apt-repository sono deprecati e saranno rimossi in una versione futura. Aggiungere repository esterni tramite gpg assicura che una chiave verrà utilizzata solo per autorizzare un singolo repository come intendi tu.

Source:
https://www.digitalocean.com/community/tutorials/how-to-handle-apt-key-and-add-apt-repository-deprecation-using-gpg-to-add-external-repositories-on-ubuntu-22-04