pacman/パッケージの署名
関連記事
パッケージが本物かどうか判断するために、pacman は 信頼の輪 モデルに則った GnuPG 鍵 を使用します。最新のマスター署名鍵は こちら から確認できます。開発者や Trusted User の鍵を署名するときはマスター署名鍵が最低でも3つ以上使うことになっています。開発者や Trusted User が作成したパッケージはマスター署名鍵によって署名された鍵によって署名されます。開発者だけでなくユーザーもそれぞれ PGP 鍵を持っており、pacman-key のセットアップ時に生成されます。信頼の輪によってユーザーの鍵からマスター鍵までひとつなぎで繋がります。
信頼の輪の例:
- カスタムパッケージ: 自分で作ったパッケージに自分の鍵で署名します。
- 非公式パッケージ: 他のユーザーがパッケージを作成して署名します。ユーザーはユーザーの鍵でパッケージ作成者の鍵に署名します。
- 公式パッケージ: 開発者がパッケージを作成して署名します。開発者の鍵は Arch Linux のマスター鍵で署名されています。ユーザーはユーザーの鍵でマスター鍵に署名することで、開発者の鍵で署名されたパッケージを間接的に信用します。
目次
設定
pacman の設定
/etc/pacman.conf
の SigLevel
オプションでパッケージをインストールするときに必要な信頼のレベルを設定できます。SigLevel
について詳しくは pacman.conf(5) やファイル内のコメントを見てください。署名のチェックはリポジトリ別に設定したり、全てのリポジトリで共通に設定することが可能です。[options]
セクションで SigLevel
を設定して全てのパッケージに署名を必要とした場合、あなた自身が makepkg で作成したパッケージにも署名が必要になります。
デフォルト設定では信頼できる鍵によって署名されたパッケージのみインストールするようになっています:
/etc/pacman.conf
SigLevel = Required DatabaseOptional
デフォルトの pacman のパラメータは TrustedOnly
となっているため、上記の設定は全体的に以下のように設定したのと同じです:
SigLevel = Required DatabaseOptional TrustedOnly
上記と同じ設定をリポジトリ別で行うには以下のように設定します:
[core] SigLevel = PackageRequired Include = /etc/pacman.d/mirrorlist
上記の設定ではリポジトリのパッケージの署名チェックが明示的に行われますが、データベースは必ずしも署名を必要としません。上記の PackageRequired
を 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 -r keyid
- または、鍵ファイルがダウンロードできる場合、ダウンロードして以下のコマンドを実行:
# pacman-key --add /path/to/downloaded/keyfile
マスター鍵など他の鍵と同じように、署名する前にフィンガープリントを確認してください:
$ pacman-key -f keyid
確認できたら、インポートした鍵をローカルで署名してください:
# pacman-key --lsign-key keyid
これで上記の鍵で署名されたパッケージを信頼するようになります。
gpg によるデバッグ
以下のように gpg を使って直接 pacman のキーリングにアクセスすることもできます:
# gpg --homedir /etc/pacman.d/gnupg --list-keys
トラブルシューティング
鍵をインポートできない
鍵がインポートできない原因は複数考えられます:
- archlinux-keyring パッケージが古くなっている。
- 現在時刻が間違っている。
- 使用している ISP によって PGP 鍵のインポートに必要なポートが塞がれている。
- pacman のキャッシュに以前使用した未署名のパッケージが残っている。
dirmngr
が正しく設定されていない。
archlinux-keyring パッケージが古いとアップグレードの同期時に止まってしまうことがあります。システムのアップグレードによって問題が解決しないか試してみてください。
システムを更新しても問題が解決せず時刻も間違っていない場合、MIT の鍵サーバーに切り替えてみる方法があります。MIT のサーバーは別のポートを提供しています。/etc/pacman.d/gnupg/gpg.conf
を編集して keyserver
行を以下のように変更してください:
keyserver hkp://pgp.mit.edu:11371
80番ポートも使えない場合 (例えば会社が透過的なプロキシを使っている場合など)、以下の設定で解決するかもしれません:
keyserver hkps://hkps.pool.sks-keyservers.net:443
IPv6 を無効化している場合、IPv6 アドレスが発見されると gpg はインポートに失敗します。そのようなときは IPv4 のみに対応している鍵サーバーを試してみてください:
keyserver hkp://ipv4.pool.sks-keyservers.net:11371
そのほかに pacman-key --populate archlinux
を実行していないと鍵のインポート時にエラーが表示されることがあります。
上記の解決方法が全く役に立たない場合、/var/cache/pacman/pkg/
に存在する pacman のキャッシュに未署名のパッケージが含まれている可能性があります。キャッシュを手動で消去するか、以下のコマンドを実行してインストールしていないパッケージのキャッシュを全て削除してください:
# pacman -Sc
署名チェックの無効化
パッケージの署名について拘りがないのであれば、PGP の署名チェックを完全に無効化することもできます。/etc/pacman.conf
を編集して [options]
の以下の行をアンコメントしてください:
SigLevel = Never
リポジトリごとの SigLevel の設定は全てコメントアウトしてください。上記の設定よりも優先して使われるためです。設定を行うと pacman 4 以前の署名チェックが全くない状態と同じになります。署名チェックを無効化する場合、pacman-key でキーリングを設定する必要もありません。署名チェックのオプションはいつでも後から変更することができます。
全ての鍵のリセット
システムにインストールされた全ての鍵を削除・リセットしたい場合、root で /etc/pacman.d/gnupg
フォルダを削除し pacman-key --init
を再度実行してから上の記述に従って鍵を追加してください。
古いパッケージの削除
同じパッケージが署名チェックに失敗し続けていて、pacman-key に関することを全て正しく行っている場合、rm /var/cache/pacman/pkg/badpackage*
を実行するなどしてパッケージを一度削除してから新しくダウンロードしてみてください。
アップグレードの際に error: linux: signature from "Some Person <Some.Person@example.com>" is invalid
とメッセージが表示される場合、削除によって解決することが実際にあります (つまり、あなたは MITM 攻撃の犠牲者などではなく、単にダウンロードしたファイルが壊れていたということです)。
プロキシを使って鍵をアップデート
鍵の更新時にプロキシを使うには /etc/gnupg/dirmngr.conf
と /etc/pacman.d/gnupg/dirmngr.conf
の両方で honor-http-proxy
オプションを設定してください。詳しくは GnuPG#鍵サーバーを使用するを参照。