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
の非推奨化はセキュリティ強化のための重要な変更です。新しい方法では:
- キーを
/etc/apt/keyrings/
に保存 - リポジトリ設定で
signed-by
を明示的に指定 - DEB822形式の使用を推奨(ただし従来形式もサポート)
これらの変更により、各リポジトリが独自のGPGキーのみを信頼するようになり、システム全体のセキュリティが向上します。