投稿日:
更新日:

apt-key 非推奨に伴う gnupg への移行

Authors

目次

はじめに

Ubuntu 22.04(LTS)がリリースされたのでインストールしてみましたが、そのまま放置して数ヶ月が経っていました。 久しぶりに使用する場面が来たので、いつも通り apt update しようとしたところ、『Warning: apt-key is deprecated』というメッセージが表示されました。

Debian 12 からは、apt パッケージの署名に利用している apt-key が非推奨・廃止になるとのことです。

しかし、今のところ、apt-key に変わる、apt リポジトリの署名に使用する GPG 公開鍵の管理手法におけるベストプラクティス的なものが無かったので、とりあえず、GnuPG(gnupg + signed-by) で移行してみました。

発生した事象

いつも通り apt update をする。 すると、以下のようなメッセージが表示されました。 apt リポジトリの公開鍵が欠落しているために署名を検証できず、パッケージリストの更新に失敗したようです。

APT:Advanced Packaging Tool

普段から Ubuntu 等の Debian 派生の Linux を使用している人は当たり前のように apt コマンドを使用していると思います。 APT は Debian で採用されているパッケージ管理ツールであり、/etc/apt/sources.list というファイルに存在するパッケージインデックスファイルを取得して、/var/lib/apt/lists 配下に保存します。

apt update コマンドが実行されると、APT は、以下の手順に従って、パッケージを更新します。

  1. sources.list もしくは、sources.list.d(サードパーティ製リポジトリが格納されている場合が多い)に記録されている URL から InRelease ファイルをダウンロードする
  2. InRelease ファイルを、ローカルにあらかじめ保存しておいたリポジトリの公開鍵で検証する
  3. パッケージファイルをダウンロードする
  4. パッケージファイルのハッシュ値を、InRelease の中の情報で検証する
  5. パッケージのパスに応じて pool/main/ 等から、対象のパッケージファイルをダウンロードする
  6. ダウンロードしたパッケージファイルのハッシュ値を、パッケージファイルの中の情報で検証する

もし、2 の段階で保持しているリポジトリの公開鍵および KeyRing に、欠落・不整合等があった場合、上記のようなエラーが発生する。

そして、Debian 11 までは、パッケージの署名に使用している公開鍵をインポートする際には apt-key が使用されていました。

apt-key の仕組み

  • apt-key は APT KeyRing(デフォルトで /etc/apt/trusted.gpg.d)にリポジトリ鍵として GPG 公開鍵を登録・削除する
    • GPG(GNU Privacy Guard) : GPL に基づいた暗号化ソフト
  • ただし、実態は GPG の KeyRing そのものであり、GPG の鍵管理を行っているだけ
  • Ubuntu のインストール直後は Ubuntu の公式リポジトリとインストーラーイメージの鍵しか登録されていない
  • サードパーティ製のリポジトリを追加する場合、ここに新しい鍵が追加される
  • これにより、公開鍵が APT パッケージマネージャに信頼された KeyRing として追加され、正しく運用されているリポジトリであれば、公式リポジトリと同じように安全にパッケージをダウンロードできる

そんな便利な機能を提供してくれていた、apt-key ですが、apt v2.1.8 / Debian 11 から廃止予定(Deprecated⁠)となり、Debian 12 では削除されることになったらしいです。

廃止理由は こちら で説明されている通りです。

  • apt-key add は単一ファイル(/etc/apt/trusted.gpg)に鍵を追加していくため、複数のリスクの異なるリポジトリの鍵を同じ権限で管理しなくてはならない。
  • リポジトリ鍵として追加した鍵は、すべてのリポジトリに対して適用される。

APT のリポジトリ鍵は「リポジトリの管理者を信頼する」つまり「そのリポジトリサーバーが正しく運用されていることを期待する」前提に立っています。しかしながらリポジトリ鍵を /etc/apt/trusted.gpg.d/ に取り込んでしまうと、あるサードパーティのリポジトリに問題が発生したとき、その影響範囲がシステムにインストールされているすべてのパッケージに波及する可能性がある。

結局のところ /etc/apt/trusted.gpg.d/ は、「⁠ システムで利用するすべてのリポジトリ」に対するチェックを行うための鍵を置く場所なので、リスクの異なるサードパーティのリポジトリの鍵も同じように扱うのはおかしい。

とのことです。

実際に、apt-key list を実行すると、

警告メッセージが表示されました。

ここでバージョンを確認してみま。

リポジトリ鍵はどう運用すべきか

これまでは、apt-key add に渡していたリポジトリ鍵を、単に /etc/apt/trusted.gpg.d/ に保存するだけというシンプルなものであった。 このときバイナリ形式なら拡張子として .gpg を使用し、ASCII 形式なら .asc を利用する。

よって次のような手順で、一旦適当な KeyRing に取り込んでからバイナリ形式でエクスポートするのが安全だと思われる。

しかし、この方法も、サードパーティのリポジトリに対するリスク管理という観点からは、完全な対応とは言えないらしい。

実際、Debian Wiki にあるサードパーティのリポジトリの利用に関する ドキュメント では、apt-key だけでなく /etc/apt/trusted.gpg.d/ の利用も「MUST NOT⁠」の記述がある。

The certificate MUST be downloaded over a secure mechanism like HTTPS to a location only writable by root. The certificate MUST NOT be placed in /etc/apt/trusted.gpg.d or loaded by apt-key add.

そこで、OpenPGP certificate distribution と Sources.list entry に関するドキュメント を参考に GPG 公開鍵の KeyRing を /usr/share/keyrings/ に設けて、配置することにする。

移行作業

作業手順

  1. 次のうちいずれかの方法で、/usr/share/keyrings/ へ配置する
  • 新たに OpenPGP から公開鍵を取得してくるパターン
    • OpenPGP から公開鍵をインポートする
    • gnupg で KeyRing に変換して、/usr/share/keyrings/ へ配置する
  • 既存の KeyRing から直接エクスポートするパターン
    • apt-key からエクスポートした鍵を gnupg で KeyRing に変換して、/usr/share/keyrings/ へ配置する
  1. signed-by オプションで sources.list に紐付ける
  2. apt-key から削除する(/etc/apt/trusted.gpg.d/ ディレクトリも消す)

まず、"不明" となっている以下の 3 つを検索する。

KEY ID (HEX)Repository
AF6ECB3762474EDA9D21B
7022871920D1991BC93C
Ubuntu Archive Automatic Signing Key
BEB4C1BFD4F042F6DDDCC
EC917721F63BD38B4796
Google Inc. (Linux Packages Signing Authority)
CBC528686B50D79E339D3
721CEB3E94ADBE1229CF
Microsoft (Release signing)

💡 A(Default)と B, C(Third-party)で手順が異なるので、分けて書く。

(既に、apt-key に鍵が登録されていれば、② の方法で良いが、自分の場合、作業中の不手際で、A に関しては既存の KeyRing を消してしまったため、① の方法を取っている。)

新たに OpenPGP から公開鍵を取得してくるパターン

Ubuntu Archive Automatic Signing Key の移行作業

  • 公開鍵を OpenPGP から取得する
  • gnupg で KeyRing に変換して、/usr/share/keyrings/ へ配置する
  • KeyRing を確認
  • signed-by オプションで sources.list に紐付ける

signed-by=/usr/share/keyrings/ubuntu-keyring-2018-archive.gpg というオプションを追加する

  • apt-key から削除する

既存の KeyRing から直接エクスポートするパターン

Google Inc.(Linux Packages Signing Authority)/ Microsoft(Release signing) の移行作業

  • apt-key に登録されている既存の公開鍵の KEY ID を指定して、直接 /usr/share/keyrings/ へエクスポートする
  • sources.list.d に登録する
  • apt-key から削除

確認

  • apt-key に何も登録されていないことを確認
  • 従来の KeyRing を削除
  • apt update できることを確認

以上の作業により、/etc/apt/trusted.gpg.d 配下に変換後の KeyRing を配置しなくても、正規のリポジトリからパッケージをインストールできるようになります。 これで、apt-key を使用せずに、信頼済みの署名鍵を使用してパッケージを確認できるようになります。

今後リポジトリ公開鍵を GPG KeyRing に追加する場合

【注意】 sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys [KEY ID] は Deprecated なのでもう使用しない!!

例:google-cloud-sdk を追加する場合

  • 直接 curl コマンドから取得した公開鍵を GPG KeyRing /usr/share/keyrings/ にインポートする
  • 確認

まとめ

今回は、apt-key が Deprecated になってしまったので、KeyRing を自前で立てて、そちらに移行する方法について紹介しました。

Debian 11(Bullseye)が apt-key が使える最後のリリースであり、Debian 12(Bookworm)から完全に削除されてしまうので、早めに移行しておくことを強くお勧めします!

参考・引用