Skip to content

apt-keyの代替方法:セキュリティを考慮したGPGキー管理

問題の概要

従来、サードパーティのAPTリポジトリを追加する際には、以下のコマンドを使用するのが一般的でした:

bash
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

しかし、現在この方法は非推奨となっており、次の警告メッセージが表示されます:

Warning: apt-key is deprecated. Manage keyring files in trusted.gpg.d instead

この非推奨の背景には、セキュリティ上の重大な問題があります。従来の方法では、追加されたGPGキーがシステム上のすべてのリポジトリに対して無条件に信頼されてしまい、悪意のあるリポジトリが公式パッケージを置き換える可能性があったためです。

推奨される解決策

基本的なアプローチ

現在推奨される方法は、キーを /etc/apt/keyrings/ ディレクトリに保存し、リポジトリ設定で明示的に参照する方式です:

bash
# キーリングディレクトリの作成
sudo mkdir -m 0755 -p /etc/apt/keyrings/

# GPGキーのダウンロードと変換
curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch | \
    sudo gpg --dearmor -o /etc/apt/keyrings/elasticsearch.gpg

# リポジトリの追加(DEB822形式)
echo "Types: deb
URIs: https://artifacts.elastic.co/packages/7.x/apt
Suites: stable
Components: main
Signed-By: /etc/apt/keyrings/elasticsearch.gpg" | \
    sudo tee /etc/apt/sources.list.d/elasticsearch.sources > /dev/null

従来の一行形式を使用する場合

既存のスクリプトとの互換性が必要な場合は、従来の形式でも同じように機能します:

bash
echo "deb [signed-by=/etc/apt/keyrings/elasticsearch.gpg] \
https://artifacts.elastic.co/packages/7.x/apt stable main" | \
    sudo tee /etc/apt/sources.list.d/elasticsearch.list > /dev/null

注意

/etc/apt/trusted.gpg.d/ にキーを追加する方法は安全ではないため、避けてください。この方法ではセキュリティ上の問題が解決されません。

実践的な例

Kubernetesリポジトリの追加例

bash
sudo mkdir -p /etc/apt/keyrings

curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | \
    sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes.gpg

echo "deb [arch=$(dpkg --print-architecture) \
signed-by=/etc/apt/keyrings/kubernetes.gpg] \
https://apt.kubernetes.io/ kubernetes-xenial main" | \
    sudo tee /etc/apt/sources.list.d/kubernetes.list > /dev/null

Yarnリポジトリの追加例

bash
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | \
    sudo gpg --dearmor -o /usr/share/keyrings/yarn.gpg

echo "deb [signed-by=/usr/share/keyrings/yarn.gpg] \
https://dl.yarnpkg.com/debian/ stable main" | \
    sudo tee /etc/apt/sources.list.d/yarn.list > /dev/null

高度な設定

キーをソースファイルに埋め込む方法

apt 2.3.10以降では、GPGキーをソースファイルに直接埋め込むことができます:

bash
echo "Types: deb
URIs: https://example.com/apt
Suites: stable
Components: main
Signed-By:
$(curl -fsSL https://example.com/EXAMPLE.gpg | sed -e 's/^$/./' -e 's/^/ /')" | \
    sudo tee /etc/apt/sources.list.d/example.sources > /dev/null

情報

この方法では、キーファイルを個別に管理する必要がなくなりますが、ソースファイルの可読性が低下します。

既存のキーの削除

以前に apt-key で追加したキーがある場合は、以下のコマンドで削除できます:

bash
# キー一覧を表示
sudo apt-key list

# 特定のキーを削除(メールアドレスまたはフィンガープリントを指定)
sudo apt-key del support@example.com

トラブルシューティング

既存の設定を修正する場合

特定のリポジトリでGPGエラーが発生している場合:

bash
# エラーメッセージからキーIDを確認
# NO_PUBKEY D4D1EAED36962F69 のような形式

# キーサーバーからキーを取得
gpg --keyserver keyserver.ubuntu.com --recv-keys D4D1EAED36962F69

# キーを変換して保存
gpg --export D4D1EAED36962F69 | \
    sudo gpg --dearmor -o /etc/apt/keyrings/custom.gpg

その後、該当するソースファイルに Signed-By: /etc/apt/keyrings/custom.gpg を追加します。

パーミッション問題の解決

パーミッション関連の問題が発生した場合:

bash
sudo chmod 644 /etc/apt/keyrings/*.gpg
sudo chmod 644 /etc/apt/sources.list.d/*.list
sudo chmod 644 /etc/apt/sources.list.d/*.sources

まとめ

apt-key の非推奨化はセキュリティ強化のための重要な変更です。新しい方法では:

  1. キーを /etc/apt/keyrings/ に保存
  2. リポジトリ設定で signed-by を明示的に指定
  3. DEB822形式の使用を推奨(ただし従来形式もサポート)

これらの変更により、各リポジトリが独自のGPGキーのみを信頼するようになり、システム全体のセキュリティが向上します。

参考資料