pacman/パッケージの署名

提供: ArchWiki
ナビゲーションに移動 検索に移動

関連記事

パッケージが本物かどうか判断するために、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.

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 を試してみてください。

署名チェックの無効化

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

パッケージの署名について拘りがないのであれば、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 は鍵が受信され、信頼できるものとしてマークされているかどうかを常に確認できるとは限りません。 これは、キーチェーンに追加されてから鍵の有効期限が切れていることによる可能性もあります。

対応策としては以下の通りです:

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

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

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

参照