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-keyとadd-apt-repositoryの代わりにgpgを使用し、Ubuntuの将来のバージョンではこれが唯一の選択肢となります。apt-keyとadd-apt-repository自体は常に裏でgpgを呼び出すラッパーとして機能してきました。直接gpgを使用することで、中間処理が省かれます。そのため、gpgメソッドは古いバージョンのUbuntuとの互換性があり、apt-keyの代替として簡単に使用できます。

このチュートリアルでは、apt-keyとadd-apt-repositoryの代替手法を使用した2つの手順を説明します。最初に、apt-keyの代わりにgpgを使用して公開鍵で外部リポジトリを追加する方法を説明します。その後、add-apt-repositoryの代わりにgpgを使用してキーサーバーを介して外部リポジトリを追加する方法について補足として説明します。

前提条件

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

ステップ1 — コンポーネントと主要なフォーマットの識別

PGP(プリティ・グッド・プライバシー)は、ファイルやディレクトリを署名、暗号化、復号化するために使用されるプロプライエタリの暗号化プログラムです。PGPファイルは公開鍵ファイルであり、apt内のリポジトリを妥当なソースとして認証するために使用されます。GPG(GNUプライバシーガード)は、PGPのオープンソースの代替です。GPGファイルは通常、複数の鍵を保持するファイルであるキーリングです。どちらのファイルタイプも、ファイルの署名と暗号化によく使用されます。

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

次に示す英文を日本語で一つのオプションで言い換えます:

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

キーの検証が必要なプロジェクトでは、常に公開鍵とリポジトリのURIが提供されます。これらは、その正確な場所を示すものです。例えば、Elasticsearchの場合、ドキュメンテーションはこれらの要素をインストールページで提供しています。

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

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

次に、作業にPGPファイルまたはGPGファイルが与えられているかどうかを判断する必要があります。curlを使用してURLを開き、キーファイルを検査することができます。

  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では、/usr/share/keyringsディレクトリが、変換されたGPGファイルの推奨保存場所です。なぜなら、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のソースリストに追加する準備が整います。

Note

注意:もしダウンロードしたファイルが既にGPG形式である場合、次の例のようなコマンドを使用して、ファイルを変換せずに直接 /usr/share/keyrings にダウンロードすることができます:
curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo tee /usr/share/keyrings/elastic-7.x.gpg

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

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

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

オプション1 – sources.listに直接追加する

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

好きなテキストエディタで、nano や /etc/apt/sources.list を開いてください。

  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: This specifies that the source uses a regular Debian architecture.
  • arch=amd64,arm64 specifies the architectures the APT data will be downloaded to. Here it is amd64 and arm64.
  • signed-by=/usr/share/keyrings/elastic-7.x.gpg: This specifies the key used to authorize this source, and here it points towards your .gpg file stored in /usr/share/keyrings. This portion of the line must be included, while it previously wasn’t required in the apt-key method. This addition is the most critical change in porting away from apt-key, since it ties the key to a singular repository it is allowed to authorize and fixes the original security flaw in apt-key.
  • https://artifacts.elastic.co/packages/7.x/apt stable main: This is the URI representing the exact location the data within the repository can be found.
  • /etc/apt/sources.list.d/elastic-7.x.list: This is the location and name of the new file to be created.
  • /dev/null: This is used when the output of a command is not necessary. Pointing tee to this location omits the output.

「Ctrl+O」を押して保存し、次に「Ctrl+X」を押して終了してください。

オプション2- sources.list.dフォルダに新しい.listファイルを作成する。

このオプションを選択すると、代わりにsources.list.dディレクトリ内に新しいファイルを作成します。aptはこのディレクトリとsources.listの両方を解析して、リポジトリの追加を行います。この方法により、リポジトリの追加を個別のファイルで物理的に分離することができます。これにより、後でこの追加を削除したり編集したりする必要がある場合、中央のsources.listファイルを編集する代わりに、このファイルを削除することができます。追加を別々に保持することで、メンテナンスが容易になり、sources.listを編集することによる他のリポジトリへの影響が少なくなります。

これを実行するには、エコーコマンドをティーコマンドにパイプしてこの新しいファイルを作成し、適切な行を挿入します。以下の例では、ファイルの名前は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ファイルを作成する。

新しいファイルを作成してください。この方法では、.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の日本語での抜粋:
「/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

テキストを挿入した後、保存して終了してください。

これは一行形式と同様であり、一行ずつ比較してみると、両者の情報は同じであることがわかりますが、ただし、異なる形式で組織されています。注意すべき点としては、この形式では複数の引数(たとえばamd64、arm64など)が存在する場合、コンマではなくスペースが使用されることです。

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

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

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

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

  1. sudo apt update

 

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

  1. sudo apt install elasticsearch

 

この手順では、apt-key メソッドと比べて何も変わりません。このコマンドが完了すると、インストールが完了します。

追加事項 – キーサーバーを利用して外部リポジトリを追加する

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

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

オープンソースのプログラミング言語であるRを例に挙げれば、以下に示すコンポーネントがあります。これらは公式プロジェクトサイトのインストール手順でも見つけることができます。

  • Keyserver: keyserver.ubuntu.com
  • Key ID: E298A3A825C0D65DFD57CBB651716619E084DAB9
  • Repository: 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 combined with –keyring allows outputting to a new file instead of importing into an existing keyring, which is the default behavior of gpg in this scenario.
  • –keyserver combined with –recv-keys provides the specific key and location you’re downloading from.
  • –homedir is used to overwrite the gpg default location for creating temporary files. gpgneeds to create these files to complete the command, otherwise gpg will attempt to write to /root which causes a permission error. Instead, this command places the temporary files in the appropriate /tmp directory.

次に、リポジトリを.listファイルに追加します。これは、エコーコマンドをパイプしてティーコマンドによって公開鍵を使用して外部リポジトリを追加するときとまったく同じ方法で行います。

  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

 

次に、リポジトリのリストを更新してください。

(Next, update your list of repositories.)

  1. sudo apt update

 

その後、パッケージをインストールすることができます。

  1. sudo apt install r-base

 

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

結論

公開鍵またはキーサーバーを使用して外部リポジトリを追加する場合、gpgを使用して中間としてapt-keyやadd-apt-repositoryを使わずに行うことができます。この方法を利用することで、apt-keyやadd-apt-repositoryが廃止予定で将来のUbuntuバージョンで削除される可能性に対応することができます。gpgを使用して外部リポジトリを追加することで、意図した通りにキーが一つのリポジトリの承認にのみ使用されることが保証されます。

コメントを残す 0

Your email address will not be published. Required fields are marked *