pacman/パッケージの署名

提供: ArchWiki
2021年9月25日 (土) 16:40時点におけるShota (トーク | 投稿記録)による版 (英語版に合わせて →‎ヒントとテクニック: の節を追加)
ナビゲーションに移動 検索に移動

関連記事

パッケージが本物かどうか判断するために、pacman信頼の輪 モデルに則った GnuPG 鍵 を使用します。最新のマスター署名鍵は こちら から確認できます。開発者や Trusted User の鍵を署名するときはマスター署名鍵が最低でも3つ以上使うことになっています。開発者や Trusted User が作成したパッケージはマスター署名鍵によって署名された鍵によって署名されます。開発者だけでなくユーザーもそれぞれ PGP 鍵を持っており、pacman-key のセットアップ時に生成されます。信頼の輪によってユーザーの鍵からマスター鍵までひとつなぎで繋がります。

信頼の輪の例:

  • カスタムパッケージ: 自分で作ったパッケージに自分の鍵で署名します。
  • 非公式パッケージ: 他のユーザーがパッケージを作成して署名します。ユーザーはユーザーの鍵でパッケージ作成者の鍵に署名します。
  • 公式パッケージ: 開発者がパッケージを作成して署名します。開発者の鍵は Arch Linux のマスター鍵で署名されています。ユーザーはユーザーの鍵でマスター鍵に署名することで、開発者の鍵で署名されたパッケージを間接的に信用します。
ノート: HKP プロトコルは 11371/tcp を使って通信します。(pacman-key を使って) サーバーから署名済みの鍵を取得するには、このポートが開かれている必要があります。

セットアップ

pacman の設定

/etc/pacman.confSigLevel オプションでパッケージをインストールするときに必要な信頼のレベルを設定できます。SigLevel について詳しくは pacman.conf(5) § PACKAGE AND DATABASE SIGNATURE CHECKING やファイル内のコメントを見てください。署名のチェックはリポジトリ別に設定したり、全てのリポジトリで共通に設定することが可能です。[options] セクションで SigLevel を設定して全てのパッケージに署名を必要とした場合、あなた自身が makepkg で作成したパッケージにも署名が必要になります。

ノート: 公式のパッケージは全て署名されていますが、2018年11月現在、データベースの署名は作業途中です。Required を設定するときは DatabaseOptional も設定してください。

デフォルト設定では信頼できる鍵によって署名されたパッケージのみインストールするようになっています:

/etc/pacman.conf
SigLevel = Required DatabaseOptional

デフォルトの pacman のパラメータは TrustedOnly となっているため、上記の設定は全体的に以下のように設定したのと同じです:

SigLevel = Required DatabaseOptional TrustedOnly

上記と同じ設定をリポジトリ別で行うには以下のように設定します:

[core]
SigLevel = PackageRequired
Include = /etc/pacman.d/mirrorlist

上記ではリポジトリのパッケージの署名チェックを行うように明示的に設定していますが、データベースは必ずしも署名を必要としません。上記の RequiredOptional とすれば、設定したリポジトリに限り、全体設定の Required がオフになります。

警告: SigLevel の TrustAll オプションはデバッグのためのオプションです。検証されていない鍵も簡単に信用するようになります。公式リポジトリでは TrustedOnly を使うようにしてください。

キーリングの初期化

pacman のキーリングをセットアップするには:

# pacman-key --init

初期化にはエントロピーが必要です。マウスを動かしたり、キーボードでランダムに文字列を打ち込んだり、ディスク操作を伴うユーティリティを実行 (例えば別のコンソールで ls -R /, find / -name foo, dd if=/dev/sda8 of=/dev/tty7 などを実行) したりしてエントロピーを生成してください。システムに十分なエントロピーが溜まっていない場合、初期化が完了するまで何時間もかかります。積極的にエントロピーを生成することで、素早く初期化を終わらせることができます。

生成したエントロピーはキーリング (/etc/pacman.d/gnupg) や GPG 署名鍵のセットアップに使われます。

ノート: (ヘッドレスサーバーなど) エントロピーがあまり生成できないコンピュータで pacman-key --init を実行すると、鍵の生成に長い時間がかかります。pacman-key --init を実行する前に、マシンに haveged または rng-tools をインストールしてそれぞれのサービスを起動することで擬似的にエントロピーを生成することが可能です。

キーリングの管理

マスター鍵の検証

以下のコマンドで鍵の初期設定を行います:

# 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 の依存パッケージとなっている) archlinux-keyring パッケージには最新の鍵が含まれていますが、(root で) pacman-key --refresh-keys を使って手動で鍵を更新することができます。--refresh-keys の実行時、ローカルの鍵もリモートの鍵サーバーに存在しないか調べられるため、鍵が見つからないというメッセージが表示されますが気にする必要はありません。

非公式な鍵を追加

pacman のキーリングに自分の鍵を追加したり、署名されている非公式ユーザーリポジトリを使うときに以下の操作で鍵を追加できます。

まずは鍵の所有者から鍵 ID (keyid) を入手してください。それからキーリングに鍵を追加してください:

  1. 鍵サーバーに鍵が存在する場合、以下のコマンドでインポート:
    # pacman-key --recv-keys keyid
  2. または、鍵ファイルがダウンロードできる場合、ダウンロードして以下のコマンドを実行:
    # 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.

鍵をインポートできない

鍵がインポートできない原因は複数考えられます:

  • 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

署名チェックの無効化

警告: パッケージ署名を無効化すると pacman は無秩序に信頼されていないパッケージをインストールするようになるので注意してください。

パッケージの署名について拘りがないのであれば、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 攻撃の犠牲者などではなく、単にダウンロードしたファイルが壊れていたということです)。

信頼されていない不明な署名

pacman -Suy を実行すると、次のエラーが発生する場合があります。

error: package-name: signature from "packager" is unknown trust

これは、パッケージ package-name で使用されている packager のキーが存在しないか、ローカルの pacman-keygpg で信頼されていないために発生します。 データベース。 パックマンは、続行する前に、キーが受信され、信頼できるものとしてマークされているかどうかを常に確認できるとは限りません。 これは、キーチェーンに追加されてからキーの有効期限が切れていることが原因である可能性もあります。

緩和策:

プロキシを使って鍵をアップデート

鍵の更新時にプロキシを使うには /etc/gnupg/dirmngr.conf/etc/pacman.d/gnupg/dirmngr.conf の両方で honor-http-proxy オプションを設定してください。詳しくは GnuPG#鍵サーバーを使用するを参照。

ノート: honor-http-proxy オプションを使わずに pacman-key を使用していて更新に失敗する場合、再起動することで問題が解決する場合があります。

参照