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
:
- 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:
- 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:
- 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:
- sudo nano /etc/apt/sources.list
Aggiungi quindi il repository esterno alla fine del file:
. . .
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
earm64
.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 metodoapt-key
. Questa aggiunta è il cambiamento più critico nel portare via daapt-key
, poiché lega la chiave a un repository singolare a cui è consentito autorizzare e risolve il problema di sicurezza originale inapt-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. Indirizzaretee
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:
- 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:
- sudo nano /etc/apt/sources.list.d/elastic-7.x.sources
Quindi aggiungi il repository esterno utilizzando il formato deb822
:
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:
- sudo apt update
Quindi installa il tuo pacchetto:
- 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:
- 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 digpg
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 digpg
.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
:
- 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:
- sudo apt update
Quindi puoi installare il pacchetto:
- 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.