pacman/パッケージの署名
関連記事
パッケージが本物かどうか判断するために、pacman は 信頼の輪 モデルに則った GnuPG 鍵 を使用します。最新のマスター署名鍵は こちら から確認できます。開発者や Trusted User の鍵を署名するときはマスター署名鍵が最低でも3つ以上使うことになっています。開発者や Trusted User が作成したパッケージはマスター署名鍵によって署名された鍵によって署名されます。開発者だけでなくユーザーもそれぞれ PGP 鍵を持っており、pacman-key のセットアップ時に生成されます。信頼の輪によってユーザーの鍵からマスター鍵までひとつなぎで繋がります。
信頼の輪の例:
- カスタムパッケージ: 自分で作ったパッケージに自分の鍵で署名します。
- 非公式パッケージ: 他のユーザーがパッケージを作成して署名します。ユーザーはユーザーの鍵でパッケージ作成者の鍵に署名します。
- 公式パッケージ: 開発者がパッケージを作成して署名します。開発者の鍵は Arch Linux のマスター鍵で署名されています。ユーザーはユーザーの鍵でマスター鍵に署名することで、開発者の鍵で署名されたパッケージを間接的に信用します。
セットアップ
pacman の設定
/etc/pacman.conf
の SigLevel
オプションでパッケージをインストールするときに必要な信頼のレベルを設定できます。SigLevel
について詳しくは pacman.conf(5) § PACKAGE AND DATABASE SIGNATURE CHECKING やファイル内のコメントを見てください。署名のチェックはリポジトリ別に設定したり、全てのリポジトリで共通に設定することが可能です。[options]
セクションで SigLevel
を設定して全てのパッケージに署名を必要とした場合、あなた自身が makepkg で作成したパッケージにも署名が必要になります。
デフォルト設定では信頼できる鍵によって署名されたパッケージのみインストールするようになっています:
/etc/pacman.conf
SigLevel = Required DatabaseOptional
デフォルトの pacman のパラメータは TrustedOnly
となっているため、上記の設定は全体的に以下のように設定したのと同じです:
SigLevel = Required DatabaseOptional TrustedOnly
上記と同じ設定をリポジトリ別で行うには以下のように設定します:
[core] SigLevel = PackageRequired Include = /etc/pacman.d/mirrorlist
上記ではリポジトリのパッケージの署名チェックを行うように明示的に設定していますが、データベースは必ずしも署名を必要としません。上記の Required
を Optional
とすれば、設定したリポジトリに限り、全体設定の Required
がオフになります。
キーリングの初期化
pacman のキーリングをセットアップするには:
# pacman-key --init
初期化にはエントロピーが必要です。マウスを動かしたり、キーボードでランダムに文字列を打ち込んだり、ディスク操作を伴うユーティリティを実行 (例えば別のコンソールで ls -R /
, find / -name foo
, dd if=/dev/sda8 of=/dev/tty7
などを実行) したりしてエントロピーを生成してください。システムに十分なエントロピーが溜まっていない場合、初期化が完了するまで何時間もかかります。積極的にエントロピーを生成することで、素早く初期化を終わらせることができます。
生成したエントロピーはキーリング (/etc/pacman.d/gnupg
) や GPG 署名鍵のセットアップに使われます。
キーリングの管理
マスター鍵の検証
以下のコマンドで鍵の初期設定を行います:
# pacman-key --populate archlinux
マスター署名鍵 は全ての他のパッケージ作成者の鍵に連署するのに使われるため、時間をかけて検証してください。
PGP 鍵は人間が使うには長すぎる (2048ビット以上) ため、大抵はハッシュ化された40桁の16進数のフィンガープリントを使って鍵が等しいかどうか確かめます。フィンガープリントの末尾8桁は鍵の名前として使われ、'(短い) 鍵 ID' と呼ばれます (同じくフィンガープリントの末尾16桁は '長い鍵 ID' です)。
開発者の鍵を追加
公式開発者や TU の鍵はマスター鍵で署名されているため、ユーザーが pacman-key を使って署名を行う必要はありません。pacman は未確認の鍵を認識したら、/etc/pacman.d/gnupg/gpg.conf
に設定されている keyserver
から鍵をダウンロードします (またはコマンドラインの --keyserver
オプションでサーバーを指定することもできます)。Wikipedia には鍵サーバーのリストがあります。
開発者の鍵は一度ダウンロードすれば、もう一度ダウンロードする必要はありません。同じ開発者による他のパッケージもダウンロードした鍵で検証することができます。
非公式な鍵を追加
pacman のキーリングに自分の鍵を追加したり、署名されている非公式ユーザーリポジトリを使うときに以下の操作で鍵を追加できます。
まずは鍵の所有者から鍵 ID (keyid
) を入手してください。それからキーリングに鍵を追加してください:
- 鍵サーバーに鍵が存在する場合、以下のコマンドでインポート:
# pacman-key --recv-keys keyid
- または、鍵ファイルがダウンロードできる場合、ダウンロードして以下のコマンドを実行:
# pacman-key --add /path/to/downloaded/keyfile
マスター鍵など他の鍵と同じように、署名する前にフィンガープリントを確認してください:
$ pacman-key --finger keyid
確認できたら、インポートした鍵をローカルで署名してください:
# pacman-key --lsign-key keyid
これで上記の鍵で署名されたパッケージを信頼するようになります。
gpg によるデバッグ
以下のように gpg を使って直接 pacman のキーリングにアクセスすることもできます:
# gpg --homedir /etc/pacman.d/gnupg --list-keys
ヒントとテクニック
システムの定期的な更新
pacman#パッケージのアップグレード によるシステムの定期的なアプグレード作業は、たいていの署名に関するエラーの発生を防ぎます。しかし、もしアップグレード作業の時間間隔が長くなってしまう場合には、システムのアップグレードの前に手動でパッケージのデータベースを更新して archlinux-keyring パッケージを先にアップグレードして下さい:
# pacman -Sy archlinux-keyring && pacman -Su
このコマンドは始めにパッケージデータベースを更新した後にキーリングのパッケージをアップグレードするため、 システムの部分的なアップグレード は考慮されていません。全てのパッケージの署名が正しく検証されるようにするために、どちらの作業もシステムアップグレードの直前に処理される必要があります。
システム時刻の定期的な更新
システム時刻がずれている場合、鍵の署名が期限切れ (や無効) として扱われてしまい署名の検証が失敗することがあります。Network Time Protocol daemon を使うことによってシステム時刻を定期的に同期するようにして下さい。
トラブルシューティング
無効な署名によるエラー
pacman-key はシステム時刻に依存しています。システムクロックが間違っている場合、以下のように表示されます:
error: PackageName: signature from "User <email@archlinux.org>" is invalid error: failed to commit transaction (invalid or corrupted package (PGP signature)) Errors occured, no packages were upgraded.
ntpd
を使っている場合、ルート権限で hwclock -w
の後に ntpd --qg
を実行してシステム時刻を修正してください。
他の NTP クライアントも使うことができます。その場合は 時刻同期 も参照して下さい。
システム時刻を修正してもエラーを解決できない場合は、下に示す方法を試して下さい。
パッケージのキャッシュからの削除
パッケージはダウンロードの途中で壊れる可能性があり、エラーを引き起し得ます。新しくダウンロードするために、rm /var/cache/pacman/pkg/pkgname
として問題となっているパッケージをキャッシュから削除して下さい。
全ての鍵のリセット
システムにインストールされた全ての鍵を削除・リセットして下さい。root で /etc/pacman.d/gnupg
フォルダを削除し pacman-key --init
を実行して pacman-key --populate archlinux
としてデフォルトの鍵を再度追加してください。
- 動作しない場合は、まず
pkill gpg-agent
を試してみてください。
署名チェックの無効化
パッケージの署名について拘りがないのであれば、PGP の署名チェックを完全に無効化することもできます。/etc/pacman.conf
を編集して [options]
の以下の行をアンコメントしてください:
SigLevel = Never
リポジトリごとの SigLevel の設定は全てコメントアウトしてください。上記の設定よりも優先して使われるためです。設定を行うと pacman 4 以前の署名チェックが全くない状態と同じになります。署名チェックを無効化する場合、pacman-key でキーリングを設定する必要もありません。署名チェックのオプションはいつでも後から変更することができます。
鍵をインポートできない
鍵がインポートできない原因は複数考えられます:
- archlinux-keyring パッケージが古くなっている。
- 現在時刻が間違っている。
- 使用している ISP によって PGP 鍵のインポートに必要なポートが塞がれている。
- pacman のキャッシュに以前使用した未署名のパッケージが残っている。
dirmngr
が正しく設定されていない。- 長い間アップグレードをしておらず、gpg/pacman がうまく対処できていない。
archlinux-keyring パッケージが古いとアップグレードの同期時に止まってしまうことがあります。
以下にいくつかの解決策を示します。
システムのアップグレード
まず始めに、pacman#パッケージのアップグレード を試してみて下さい。
鍵サーバーの変更
鍵サーバーの不調が疑われる場合は、Ubuntu の鍵サーバーに切り替えてみる事を試してみて下さい。/etc/pacman.d/gnupg/gpg.conf
を編集して keyserver
行を以下のように変更してください:
keyserver hkp://keyserver.ubuntu.com
パッケージキャッシュの削除
/var/chache/pacman/pkg/
の pacman のキャッシュに署名されていないパッケージが含まれている事が疑われる場合、次のようにしてキャッシュを全て削除してみて下さい:
# pacman -Sc
これによってインストールされていないパッケージのキャッシュを全て削除します。
信頼されていない不明な署名
pacman -Suy
を実行すると、次のエラーが発生する場合があります。
error: package-name: signature from "packager" is unknown trust
これは、パッケージ package-name
で使用されている packager
の鍵が存在しないか、ローカルの pacman-key のデータベースで信頼されていないために発生します。 pacman は鍵が受信され、信頼できるものとしてマークされているかどうかを常に確認できるとは限りません。 これは、キーチェーンに追加されてから鍵の有効期限が切れていることによる可能性もあります。
対応策としては以下の通りです:
pacman-key --refresh-keys
を使用して鍵を更新する、または- ローカルで信頼できない鍵を手動で署名する または
- すべての鍵をリセットする
- 一時的に
SigLevel
をTrustAll
に変更する。ただし推奨しません。
プロキシを使って鍵をアップデート
鍵の更新時にプロキシを使うには /etc/gnupg/dirmngr.conf
と /etc/pacman.d/gnupg/dirmngr.conf
の両方で honor-http-proxy
オプションを設定してください。詳しくは GnuPG#鍵サーバーを使用するを参照。