Ubuntu 22.04で外部リポジトリを追加するためのgpgを使用したapt-keyとadd-apt-repositoryの非推奨の処理方法

紹介

apt-keyは、APTがパッケージを認証するために使用するキーを管理するためのユーティリティです。これは、外部リポジトリを追加するadd-apt-repositoryユーティリティと密接に関連しており、キーサーバーを使用してAPTインストールの信頼されたソースのリストに外部リポジトリを追加します。ただし、apt-keyおよびadd-apt-repositoryを使用して追加されたキーは、aptによってグローバルに信頼されます。これらのキーは、それらが意図された単一のリポジトリの認証に制限されません。この方法で追加された任意のキーは、他の外部リポジトリの追加を認証するために使用できるため、重要なセキュリティ上の懸念があります。

Ubuntu 20.10から、apt-keyの使用は近い将来非推奨になるという警告が表示されます。同様に、add-apt-repositoryも間もなく非推奨になります。これらの非推奨の警告は、Ubuntu 22.04でapt-keyおよびadd-apt-repositoryを使用することを厳密に防ぐものではありませんが、無視することはお勧めしません。

現在のベストプラクティスは、apt-keyadd-apt-repositoryの代わりにgpgを使用することであり、将来のUbuntuのバージョンでは唯一のオプションになります。apt-keyadd-apt-repository自体が常にバックグラウンドでgpgを呼び出すラッパーとして機能していました。直接gpgを使用することで、中間処理が削除されます。このため、gpgメソッドは古いバージョンのUbuntuと後方互換性があり、apt-keyの代替として使用することができます。

このチュートリアルでは、apt-keyadd-apt-repositoryの代替手段を使用した2つの手順を概説します。まず、apt-keyを使用せずにgpgを使用して公開鍵を使用して外部リポジトリを追加する方法です。次に、付録として、このチュートリアルでは、add-apt-repositoryを使用する代わりにgpgを使用してキーサーバーを使用して外部リポジトリを追加する方法をカバーします。

前提条件

このチュートリアルを完了するには、Ubuntu 22.04サーバーが必要です。Ubuntu 22.04の初期サーバーセットアップガイドに従って、sudo権限を持つ非rootユーザーとファイアウォールが有効になっていることを確認してください。

ステップ1 — コンポーネントとキー形式の識別

PGP、またはプリティグッドプライバシーは、署名、暗号化、およびファイルやディレクトリの復号化に使用されるプロプライエタリな暗号化プログラムです。PGPファイルは公開鍵ファイルであり、このプロセスでリポジトリを有効なソースとして認証するために使用されます。GPG、またはGNUプライバシーガードは、PGPのオープンソースの代替です。GPGファイルは通常、複数のキーを保持するファイルであるキーリングです。キーリングと呼ばれます。これらのファイルタイプは、ファイルに署名して暗号化するために一般的に使用されます。

gpgは、GPGのコマンドラインツールであり、aptと使用する外部リポジトリを承認するために使用できます。ただし、gpgはGPGファイルのみを受け入れます。PGPファイルをこのコマンドラインツールで使用するには、それらを変換する必要があります。

Elasticsearchはキーの変換の一般的なシナリオを提供し、このセクションの例として使用されます。PGP用にフォーマットされたキーをダウンロードし、.gpgファイル拡張子を持つapt互換の形式に変換します。これは、--dearmorフラグを付けてgpgコマンドを実行することで行います。次に、パッケージソースのリストにリポジトリリンクを追加し、変換されたキーへの直接参照を添付します。最後に、このプロセスをElasticsearchパッケージのインストールによって検証します。

リポジトリの追加にキーの検証が必要なプロジェクトでは、公開鍵とリポジトリのURIが提供されます。Elasticsearchの例では、インストールページのドキュメントにこれらのコンポーネントが記載されています。

以下はElasticsearchのコンポーネントの一覧です:

  • キー:https://artifacts.elastic.co/GPG-KEY-elasticsearch
  • リポジトリ:https://artifacts.elastic.co/packages/7.x/apt stable main

次に、作業するためにPGPまたはGPGファイルが提供されているかを確認する必要があります。URLをcurlで開いてキーファイルを調べることができます:

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

これにより、キーファイルの内容が出力され、以下で始まります:

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

URLにはGPGが含まれていますが、最初の行は実際にはPGPキーファイルであることを示しています。これに注意してください、なぜならaptはGPG形式のみを受け入れるからです。元々、apt-keyはPGPファイルを検出し、バックグラウンドでgpgを呼び出して自動的にGPG形式に変換していました。ステップ2では、PGPからGPGへの手動変換と、変換が不要な場合の対処方法について説明します。

ステップ2 — キーのダウンロードとapt互換のファイル形式への変換

gpgメソッドを使用する場合、パッケージソースのリストに追加する前に常にキーをダウンロードする必要があります。以前のapt-keyでは、この順序が常に強制されていませんでした。現在は、ダウンロードしたキーファイルのパスをソースリストで参照する必要があります。キーをダウンロードしていない場合は、既存のパスを参照することはできません。

Elasticsearchでは、PGPファイルを使用するため、ダウンロード後にGPGファイル形式に変換する必要があります。次の例では、curlを使用してキーをダウンロードし、ダウンロードがgpgコマンドにパイプされます。gpg--dearmorフラグを使用して、PGPキーをGPGファイル形式に変換し、-oを使用してファイルの出力を指定します。

Ubuntuでは、変換されたGPGファイルの推奨される場所は/usr/share/keyringsディレクトリです。これはUbuntuがキーリングを保存するデフォルトの場所です。この例ではファイル名はelastic-7.x.gpgですが、任意の名前でも構いません。

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

これにより、PGPファイルが正しいGPG形式に変換され、aptのソースリストに追加する準備が整います。

注意: ダウンロードしたファイルが既にGPG形式の場合、次の例のように直接/usr/share/keyringsにファイルをダウンロードすることもできます:

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

この場合、curlコマンドの出力はteeにパイプされ、ファイルが正しい場所に保存されます。

ステップ3 — リポジトリをパッケージソースのリストに追加

ダウンロードした鍵が正しいGPGファイル形式であれば、そのリポジトリをaptパッケージソースに追加し、明示的に取得した鍵とリンクさせることができます。これを達成するための3つの方法があります。すべてがaptがソースを見つける方法に関連しています。aptは中央のsources.listファイル、sources.list.dディレクトリ内の.listファイル、およびsources.list.dディレクトリ内の.sourceファイルからソースを取得します。これらの3つのオプションの間に機能的な違いはありませんが、これらの選択肢を検討し、ニーズに最適な方法を選択することが推奨されています。

オプション1 — 直接sources.listに追加

最初の方法は、ソースを表す行を直接/etc/apt/sources.listに挿入する方法です。これは、aptのソースを格納している主要なファイルです。このファイルには複数のソースが含まれており、Ubuntuに付属しているデフォルトのソースも含まれています。このファイルを直接編集することは完全に許容されますが、Option 2とOption 3はよりモジュラーなソリューションを提供し、編集とメンテナンスが容易になります。

/etc/apt/sources.listnanoまたはお好みのテキストエディタで開きます:

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

次に、外部リポジトリをファイルの末尾に追加します:

/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

この行には、ソースに関する以下の情報が含まれています:

  • deb:これは、ソースが通常のDebianアーキテクチャを使用していることを指定します。
  • arch=amd64,arm64は、APTデータがダウンロードされるアーキテクチャを指定します。ここではamd64arm64です。
  • signed-by=/usr/share/keyrings/elastic-7.x.gpg:これは、このソースを承認するために使用されるキーを指定します。ここでは/usr/share/keyringsに保存されている.gpgファイルを指しています。この行のこの部分は必ず含める必要がありますが、以前のapt-keyの方法では必要ではありませんでした。この追加は、キーを単一のリポジトリに関連付けて承認できるようにし、apt-keyの元のセキュリティの欠陥を修正するためのものです。
  • https://artifacts.elastic.co/packages/7.x/apt stable main:これは、リポジトリ内のデータが正確に見つかる場所を示すURIです。
  • /etc/apt/sources.list.d/elastic-7.x.list: これは新しいファイルの場所と名前です。
  • /dev/null: これはコマンドの出力が必要ない場合に使用されます。この場所にteeを指定すると、出力が省略されます。

CTRL+Oを押して保存し、その後CTRL+Xを押して終了します。

オプション2 — sources.list.dで新しい.listファイルを作成する

このオプションでは、代わりにsources.list.dディレクトリに新しいファイルを作成します。aptはこのディレクトリとsources.listの両方をリポジトリの追加に解析します。この方法により、リポジトリの追加を物理的に別々のファイルに分離できます。この追加を後で削除したり編集したりする必要がある場合は、このファイルを削除するだけでなく、中央のsources.listファイルを編集する必要があります。追加を別々に保持すると、管理が容易になり、sources.listの編集は他のリポジトリに影響を与える可能性がある方法でよりエラーが発生しやすくなります。

これを行うには、echoコマンドをteeコマンドにパイプして、この新しいファイルを作成し、適切な行を挿入します。次の例では、ファイルの名前はelastic-7.x.listですが、ディレクトリ内のユニークなファイル名であれば何でも機能します:

  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

このコマンドは、ファイルを手動で作成し、適切なテキスト行を挿入することと同じです。

オプション3 — sources.list.d内の.sourcesファイルの作成

3番目の方法は、.listファイルではなく.sourcesファイルに書き込みます。この方法は比較的新しいもので、deb . . .の宣言よりも曖昧性が少ないdeb822複数行形式を使用しますが、機能的には同一です。新しいファイルを作成します:

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

その後、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

テキストを挿入した後に保存して終了します。

これは、1行の形式に類似しており、1行ずつ比較すると、両者の情報が同一であることがわかりますが、異なる形式で整理されています。1つ注意すべき点は、この形式では複数の引数(amd64,arm64など)がある場合にはコンマを使用せず、代わりにスペースを使用することです。

次に、テストインストールを行うことで、このプロセスを検証します。

ステップ4 — 外部リポジトリからのパッケージのインストール

必ず apt update を呼び出す必要があります。これにより、apt がメインの sources.list ファイルと、sources.list.d 内のすべての .list および .sources ファイルを確認します。更新せずに apt install を呼び出すと、インストールが失敗するか、apt からの古いデフォルトパッケージのインストールが行われます。

リポジトリを更新してください:

  1. sudo apt update

その後、パッケージをインストールしてください:

  1. sudo apt install elasticsearch

このステップでは、apt-key メソッドと同じです。このコマンドが完了すると、インストールが完了します。

追加情報 – キーサーバーを使用した外部リポジトリの追加

このセクションでは、公開鍵ではなくキーサーバーを使用して外部リポジトリを追加する方法について簡単に説明します。このプロセスは公開鍵の方法とほとんど同じですが、gpg の呼び出し方が異なります。

add-apt-repositoryは、apt-keyに対応するキーサーバーベースの代替手段であり、両方とも非推奨の対象となっています。このシナリオでは、異なるコンポーネントが使用されます。キーとリポジトリの代わりに、キーサーバーのURLとキーIDが与えられます。この場合、何も変換せずにキーサーバーから直接適切な.gpg形式にダウンロードすることができます。add-apt-repositoryはまもなく非推奨となるため、既存のキーリングにインポートするgpgのデフォルトの動作をオーバーライドしながら、gpgを使用してファイルにダウンロードします。

例としてオープンソースのプログラミング言語Rを使用します。以下は、公式プロジェクトサイトのインストール手順でも見つかる可能性のある与えられたコンポーネントです。

  • キーサーバー:keyserver.ubuntu.com
  • キーID:E298A3A825C0D65DFD57CBB651716619E084DAB9
  • リポジトリ:https://cloud.r-project.org/bin/linux/ubuntu jammy-cran40/

まず、gpgを使用してキーサーバーから直接ダウンロードします。ダウンロードトラフィックに応じて、このダウンロードコマンドには時間がかかる場合があります。

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

このコマンドには、公開キーを使用する場合とは異なる次のフラグが含まれています:

  • --no-default-keyringは、既存のキーリングにインポートする代わりに新しいファイルに出力することを許可します。これは、このシナリオでのgpgのデフォルトの動作です。
  • --keyserver--recv-keysを組み合わせると、特定のキーとダウンロード元の場所が提供されます。
  • --homedirは、一時ファイルを作成するためのgpgのデフォルトの場所を上書きするために使用されます。gpgは、このコマンドを完了するためにこれらのファイルを作成する必要があります。そうでない場合、gpgはパーミッションエラーを引き起こす/rootに書き込もうとします。その代わりに、このコマンドは一時ファイルを適切な/tmpディレクトリに配置します。

次に、リポジトリを.listファイルに追加します。これは、echoコマンドを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

次に、リポジトリのリストを更新します:

  1. sudo apt update

その後、パッケージをインストールできます:

  1. sudo apt install r-base

外部リポジトリを追加するためにgpgを使用する方法は、公開キーとキーサーバー間で類似していますが、gpgを呼び出す方法の違いがあります。

結論

{
“error”: “Upstream error…”
}

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