紹介
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
権限を持つ非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
で開いてキーファイルを調べることができます:
- 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
ですが、任意の名前でも構いません。
- 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
にファイルをダウンロードすることもできます:
- 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.list
をnano
またはお好みのテキストエディタで開きます:
- sudo nano /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データがダウンロードされるアーキテクチャを指定します。ここではamd64
とarm64
です。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
ですが、ディレクトリ内のユニークなファイル名であれば何でも機能します:
- 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
複数行形式を使用しますが、機能的には同一です。新しいファイルを作成します:
- sudo nano /etc/apt/sources.list.d/elastic-7.x.sources
その後、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
テキストを挿入した後に保存して終了します。
これは、1行の形式に類似しており、1行ずつ比較すると、両者の情報が同一であることがわかりますが、異なる形式で整理されています。1つ注意すべき点は、この形式では複数の引数(amd64,arm64
など)がある場合にはコンマを使用せず、代わりにスペースを使用することです。
次に、テストインストールを行うことで、このプロセスを検証します。
ステップ4 — 外部リポジトリからのパッケージのインストール
必ず apt update
を呼び出す必要があります。これにより、apt
がメインの sources.list
ファイルと、sources.list.d
内のすべての .list
および .sources
ファイルを確認します。更新せずに apt install
を呼び出すと、インストールが失敗するか、apt
からの古いデフォルトパッケージのインストールが行われます。
リポジトリを更新してください:
- sudo apt update
その後、パッケージをインストールしてください:
- 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
を使用してキーサーバーから直接ダウンロードします。ダウンロードトラフィックに応じて、このダウンロードコマンドには時間がかかる場合があります。
- 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
コマンドにパイプして外部リポジトリを追加するのとまったく同じ方法で行われます:
- 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
次に、リポジトリのリストを更新します:
- sudo apt update
その後、パッケージをインストールできます:
- sudo apt install r-base
外部リポジトリを追加するためにgpg
を使用する方法は、公開キーとキーサーバー間で類似していますが、gpg
を呼び出す方法の違いがあります。
結論
{
“error”: “Upstream error…”
}