「Pacman/パッケージの署名」の版間の差分
細 |
Kusanaginoturugi (トーク | 投稿記録) (delete Category.) |
||
(5人の利用者による、間の24版が非表示) | |||
1行目: | 1行目: | ||
{{Lowercase title}} |
{{Lowercase title}} |
||
− | [[Category: |
+ | [[Category:OpenPGP]] |
− | [[Category: |
+ | [[Category:パッケージマネージャー]] |
− | [[en:Pacman |
+ | [[en:Pacman/Package signing]] |
− | [[es:Pacman |
+ | [[es:Pacman/Package signing]] |
[[fr:pacman-key]] |
[[fr:pacman-key]] |
||
− | [[it:Pacman |
+ | [[it:Pacman/Package signing]] |
− | [[ |
+ | [[pt:Pacman/Package signing]] |
+ | [[ru:Pacman/Package signing]] |
||
− | [[tr:pacman paket imzaları]] |
||
− | [[zh- |
+ | [[zh-hans:Pacman/Package signing]] |
+ | {{Related articles start}} |
||
− | pacman-key は Arch Linux においてパッケージの署名を設定・管理するために使われるツールです。 |
||
+ | {{Related|GnuPG}} |
||
+ | {{Related articles end}} |
||
+ | パッケージが本物かどうか判断するために、''pacman'' は [http://www.gnupg.org/gph/en/manual.html#AEN385 信頼の輪] モデルに則った [http://www.gnupg.org/ GnuPG 鍵] を使用します。最新のマスター署名鍵は [https://www.archlinux.org/master-keys/ こちら] から確認できます。開発者や Trusted User の鍵を署名するときはマスター署名鍵が最低でも3つ以上使うことになっています。開発者や Trusted User が作成したパッケージはマスター署名鍵によって署名された鍵によって署名されます。開発者だけでなくユーザーもそれぞれ PGP 鍵を持っており、''pacman-key'' のセットアップ時に生成されます。信頼の輪によってユーザーの鍵からマスター鍵までひとつなぎで繋がります。 |
||
+ | 信頼の輪の例: |
||
− | ==イントロダクション== |
||
− | Pacman は [http://www.gnupg.org/ GnuPG keys] を使っており [http://www.gnupg.org/gph/en/manual.html#AEN385 web of trust] モデルによってパッケージの信頼性を決定します。現在、5つの [https://www.archlinux.org/master-keys/ Master Signing Key] が存在します。最低でも3つの Master Signing Key が開発者や Trusted User のキーに署名するのに使われ、署名されたキーはパッケージに署名するのに使われます。ユーザーにも、pacman-key を設定した時に、固有の PGP キーが生成されます。そして web of trust はユーザーのキーと5つのマスターキーを結合させます。 |
||
+ | * '''カスタムパッケージ''': 自分で作ったパッケージに自分の鍵で署名します。 |
||
− | webs of trust の例: |
||
+ | * '''非公式パッケージ''': 他のユーザーがパッケージを作成して署名します。ユーザーはユーザーの鍵でパッケージ作成者の鍵に署名します。 |
||
+ | * '''公式パッケージ''': 開発者がパッケージを作成して署名します。開発者の鍵は Arch Linux のマスター鍵で署名されています。ユーザーはユーザーの鍵でマスター鍵に署名することで、開発者の鍵で署名されたパッケージを間接的に信用します。 |
||
+ | {{Note|HKP プロトコルは 11371/tcp を使って通信します。(''pacman-key'' を使って) サーバーから署名済みの鍵を取得するには、このポートが開かれている必要があります。}} |
||
− | * '''カスタムパッケージ''': あなた自身がパッケージを作成し、あなた自身のキーを使って署名をします。 |
||
− | * '''非公式パッケージ''': 開発者がパッケージを作成し署名します。あなたはあなたのキーを使って開発者のキーに署名します。 |
||
− | * '''公式パッケージ''': 開発者がパッケージを作成し署名します。開発者のキーは Arch Linux のマスターキーによって署名されています。あなたはあなたのキーを使ってマスターキーに署名をすることで、開発者だと信頼することができます。 |
||
+ | == セットアップ == |
||
− | {{Note|HKP プロトコルは通信に 11371/tcp を使います。(pacman-key を使って) サーバーから署名済みのキーを取得するには、このポートが開かれている必要があります。}} |
||
− | ==設定== |
||
=== pacman の設定 === |
=== pacman の設定 === |
||
− | {{ic|/etc/pacman.conf}} |
+ | {{ic|/etc/pacman.conf}} の {{ic|SigLevel}} オプションでパッケージをインストールするときに必要な信頼のレベルを設定できます。{{ic|SigLevel}} について詳しくは {{man|5|pacman.conf|PACKAGE AND DATABASE SIGNATURE CHECKING}} やファイル内のコメントを見てください。署名のチェックはリポジトリ別に設定したり、全てのリポジトリで共通に設定することが可能です。{{ic|[options]}} セクションで {{ic|SigLevel}} を設定して全てのパッケージに署名を必要とした場合、あなた自身が ''makepkg'' で作成したパッケージにも署名が必要になります。 |
− | {{Note|現在全ての公式パッケージは署名されていますが、2012年6月現在データベースの署名は作業中です。{{ic|Required}} が設定されている場合 {{ic|DatabaseOptional}} も設定するべきです。}} |
||
− | デフォルト設定では {{hc|1=/etc/pacman.conf|output=SigLevel = Required DatabaseOptional}} 信頼されたキーで署名されたパッケージだけをインストールするようになっています。これは pacman のデフォルトパラメータが {{ic|TrustOnly}} になっているためです。よって上記設定は全体のオプションとして以下を設定するのと同じになります。 {{bc|1=SigLevel = Required DatabaseOptional TrustedOnly}}上記の設定と同じことを設定ファイルの下の方でリポジトリレベルで行うことができます、例えば: |
||
− | {{bc|1=[core] |
||
− | SigLevel = PackageRequired # ’Optional’ here would turn off a global ’Required’ for this repository |
||
− | Include = /etc/pacman.d/mirrorlist}} |
||
− | リポジトリのパッケージの署名チェックを明示的に追加していますが、データベースが署名されていることは要求しません。 |
||
− | {{warning|SigLevel の {{ic|TrustAll}} はデバッグのためのオプションで、検証されていないキーも信頼するようになります。公式リポジトリには全て {{ic|TrustedOnly}} を使うようにしてください。}} |
||
+ | {{Note|公式のパッケージは全て署名されていますが、2018年11月現在、データベースの署名は作業途中です。{{ic|Required}} を設定するときは {{ic|DatabaseOptional}} も設定してください。}} |
||
− | ===キーリングの初期化=== |
||
+ | デフォルト設定では信頼できる鍵によって署名されたパッケージのみインストールするようになっています: |
||
− | pacman のキーリングを設定するには、以下を実行してください: |
||
− | # pacman-key --init |
||
+ | {{hc|1=/etc/pacman.conf| |
||
− | この初期化には、[[Wikipedia:Entropy_(computing)|エントロピー]]が必要です。マウスを動かいたり、キーボードの文字をランダムで押したり、ディスク操作を伴うコマンドを実行したりすることで (例えば、他のコンソールで {{ic|ls -R /}} や {{ic|find / -name foo}}, {{ic|1=dd if=/dev/sda8 of=/dev/tty7}} を実行する) エントロピーが生成されます。システムに十分なエントロピーが溜まっていないと、初期化にはかなりの時間がかかります; 積極的にエントロピーを生成すれば、早く初期化が完了するでしょう。 |
||
+ | output=SigLevel = Required DatabaseOptional |
||
+ | }} |
||
+ | デフォルトの ''pacman'' のパラメータは {{ic|TrustedOnly}} となっているため、上記の設定は全体的に以下のように設定したのと同じです: |
||
− | 作成された乱数はキーリング ({{ic|/etc/pacman.d/gnupg}}) とあなたのシステムの GPG 署名キーのセットアップに使用されます。 |
||
+ | |||
+ | SigLevel = Required DatabaseOptional TrustedOnly |
||
+ | |||
+ | 上記と同じ設定をリポジトリ別で行うには以下のように設定します: |
||
+ | |||
+ | [core] |
||
+ | SigLevel = PackageRequired |
||
+ | Include = /etc/pacman.d/mirrorlist |
||
+ | |||
+ | 上記ではリポジトリのパッケージの署名チェックを行うように明示的に設定していますが、データベースは必ずしも署名を必要としません。上記の {{ic|Required}} を {{ic|Optional}} とすれば、設定したリポジトリに限り、全体設定の {{ic|Required}} がオフになります。 |
||
+ | |||
+ | {{warning|SigLevel の {{ic|TrustAll}} オプションはデバッグのためのオプションです。検証されていない鍵も簡単に信用するようになります。公式リポジトリでは {{ic|TrustedOnly}} を使うようにしてください。}} |
||
+ | |||
+ | === キーリングの初期化 === |
||
+ | |||
+ | ''pacman'' のキーリングをセットアップするには: |
||
− | {{Note|SSH を通して {{ic|pacman-key --init}} を実行する必要があるときは、ターゲットのマシンに {{Pkg|haveged}} パッケージをインストールしてください。SSH で接続してから以下を実行してください: |
||
− | # haveged -w 1024 |
||
# pacman-key --init |
# pacman-key --init |
||
+ | 初期化には[[Wikipedia:Entropy_(computing)|エントロピー]]が必要です。マウスを動かしたり、キーボードでランダムに文字列を打ち込んだり、ディスク操作を伴うユーティリティを実行 (例えば別のコンソールで {{ic|ls -R /}}, {{ic|find / -name foo}}, {{ic|1=dd if=/dev/sda8 of=/dev/tty7}} などを実行) したりしてエントロピーを生成してください。システムに十分なエントロピーが溜まっていない場合、初期化が完了するまで何時間もかかります。積極的にエントロピーを生成することで、素早く初期化を終わらせることができます。 |
||
− | pacman-key が無事終わったら、haveged を止めてパッケージを削除してください。 |
||
+ | |||
− | # pkill haveged |
||
+ | 生成したエントロピーはキーリング ({{ic|/etc/pacman.d/gnupg}}) や GPG 署名鍵のセットアップに使われます。 |
||
− | # pacman -Rs haveged |
||
+ | |||
− | {{Pkg|haveged}} を使う方法は SSH だけのものではありません: エントロピーを素早く得るのにどこでも使えます。{{ic|pacman-key --init}} が終わるのを待っていると日が暮れてしまうような場合、この方法を試してみると良いでしょう。 |
||
+ | {{Note|(ヘッドレスサーバーなど) エントロピーがあまり生成できないコンピュータで {{ic|pacman-key --init}} を実行すると、鍵の生成に長い時間がかかります。{{ic|pacman-key --init}} を実行する前に、マシンに [[haveged]] または [[rng-tools]] をインストールしてそれぞれのサービスを起動することで擬似的にエントロピーを生成することが可能です。}} |
||
− | }} |
||
+ | |||
+ | == キーリングの管理 == |
||
+ | |||
+ | === マスター鍵の検証 === |
||
+ | 以下のコマンドで鍵の初期設定を行います: |
||
− | ==キーリングの管理== |
||
− | ===5つのマスターキーを検証する=== |
||
− | キーの初期設定は次を実行してください: |
||
# pacman-key --populate archlinux |
# pacman-key --populate archlinux |
||
− | [https://www.archlinux.org/master-keys/ |
+ | [https://www.archlinux.org/master-keys/ マスター署名鍵] は全ての他のパッケージ作成者の鍵に連署するのに使われるため、時間をかけて検証してください。 |
− | PGP 鍵は人間には |
+ | PGP 鍵は人間が使うには長すぎる (2048ビット以上) ため、大抵はハッシュ化された40桁の16進数のフィンガープリントを使って鍵が等しいかどうか確かめます。フィンガープリントの末尾8桁は鍵の名前として使われ、'(短い) 鍵 ID' と呼ばれます (同じくフィンガープリントの末尾''16''桁は '長い鍵 ID' です)。 |
− | ===開発者の |
+ | === 開発者の鍵を追加 === |
− | 公式開発者と TU のキーはマスターキーによって署名されています。なので pacman-key を使ってそれらに署名をする必要はありません。pacman は未確認のキーに遭遇した時、{{ic|/etc/pacman.d/gnupg/gpg.conf}} に設定されている {{ic|keyserver}} から (もしくはコマンドラインの {{ic|--keyserver}} オプションを使って) キーをダウンロードするようになっています。Wikipedia が [[wikipedia:Key server (cryptographic)|keyserver のリスト]]を保守しています。 |
||
+ | 公式開発者や [[Trusted Users|TU]] の鍵はマスター鍵で署名されているため、ユーザーが ''pacman-key'' を使って署名を行う必要はありません。''pacman'' は未確認の鍵を認識したら、{{ic|/etc/pacman.d/gnupg/gpg.conf}} に設定されている {{ic|keyserver}} から鍵をダウンロードします (またはコマンドラインの {{ic|--keyserver}} オプションでサーバーを指定することもできます)。Wikipedia には[[wikipedia:Key server (cryptographic)|鍵サーバー]]のリストがあります。 |
||
− | 開発者のキーは一度ダウンロードすれば、またダウンロードする必要はありません。開発者によって署名されたパッケージ全てを、そのキーで確認することができます。 |
||
+ | 開発者の鍵は一度ダウンロードすれば、もう一度ダウンロードする必要はありません。同じ開発者による他のパッケージもダウンロードした鍵で検証することができます。 |
||
− | {{Note|{{Pkg|archlinux-keyring}} パッケージ (pacman の依存パッケージ) には最新のキーが含まれていますが、次を実行してキーを更新することもできます: |
||
− | # pacman-key --refresh-keys |
||
− | {{ic|--refresh-keys}} の実行中、あなたのローカルキーも外部のキーサーバーで調べられます。なのでキーが見つからないというメッセージが表示されるでしょう。このメッセージは気にしないで下さい。}} |
||
+ | {{Note|({{Pkg|pacman}} の依存パッケージとなっている) {{Pkg|archlinux-keyring}} パッケージには最新の鍵が含まれていますが、(root で) {{ic|pacman-key --refresh-keys}} を使って手動で鍵を更新することができます。{{ic|--refresh-keys}} の実行時、ローカルの鍵もリモートの鍵サーバーに存在しないか調べられるため、鍵が見つからないというメッセージが表示されますが気にする必要はありません。}} |
||
− | ===非公式のキーの追加=== |
||
− | まず、キーの所有者から ID を取得してください。次を実行してキーサーバーからダウンロードしましょう: |
||
− | {{bc|# pacman-key -r <keyid>}} |
||
− | マスターキー(やその他署名をするキー)でしたように、フィンガープリントの検証を必ずしてください。フィンガープリントの検証後、キーをローカルで署名する必要があります: |
||
− | {{bc|# pacman-key --lsign-key <keyid>}} |
||
− | これでパッケージを署名するキーを信頼できました。 |
||
− | === |
+ | === 非公式な鍵を追加 === |
− | pacman-key だけでは満足な操作が行えない場合、以下のように '''gpg''' を使って pacman のキーリングを管理することができます: |
||
− | # gpg --homedir /etc/pacman.d/gnupg $OPTIONS |
||
− | 又は |
||
− | # env GNUPGHOME=/etc/pacman.d/gnupg gpg $OPTIONS |
||
+ | ''pacman'' のキーリングに自分の鍵を追加したり、署名されている[[非公式ユーザーリポジトリ]]を使うときに以下の操作で鍵を追加できます。 |
||
− | ==トラブルシューティング== |
||
+ | まずは鍵の所有者から鍵 ID ({{ic|''keyid''}}) を入手してください。それからキーリングに鍵を追加してください: |
||
− | {{Warning|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. }} |
||
+ | # 鍵サーバーに鍵が存在する場合、以下のコマンドでインポート: {{bc|# pacman-key --recv-keys ''keyid''}} |
||
− | ===キーをインポートできない=== |
||
+ | # または、鍵ファイルがダウンロードできる場合、ダウンロードして以下のコマンドを実行: {{bc|# pacman-key --add ''/path/to/downloaded/keyfile''}} |
||
+ | マスター鍵など他の鍵と同じように、署名する前にフィンガープリントを確認してください: |
||
− | ISP によっては PGP キーをインポートするために使われるポートをブロックされていることがあります。1つの解決方法としては、他のポートを提供している、MIT キーサーバーを使う方法があります。これを行うには、{{ic|/etc/pacman.d/gnupg/gpg.conf}} を編集して keyserver の行を次のように修正してください: |
||
+ | $ pacman-key --finger ''keyid'' |
||
− | {{bc|keyserver hkp://pgp.mit.edu:11371}} |
||
+ | 確認できたら、インポートした鍵をローカルで署名してください: |
||
− | {{ic|pacman-key --populate archlinux}} を実行するのを忘れていると、キーをインポートするときにエラーが表示されるかもしれません。 |
||
+ | # pacman-key --lsign-key ''keyid'' |
||
+ | これで上記の鍵で署名されたパッケージを信頼するようになります。 |
||
− | ===署名チェックの無効化=== |
||
+ | |||
− | {{warning|気をつけて使って下さい。パッケージの署名を無効化すると pacman は信頼されてないパッケージを自動でインストールします。}} |
||
+ | === gpg によるデバッグ === |
||
+ | |||
+ | 以下のように ''gpg'' を使って直接 ''pacman'' のキーリングにアクセスすることもできます: |
||
+ | |||
+ | # gpg --homedir /etc/pacman.d/gnupg --list-keys |
||
+ | |||
+ | == ヒントとテクニック == |
||
+ | |||
+ | === システムの定期的な更新 === |
||
+ | |||
+ | [[pacman#パッケージのアップグレード]] によるシステムの定期的なアプグレード作業は、たいていの署名に関するエラーの発生を防ぎます。しかし、もしアップグレード作業の時間間隔が長くなってしまう場合には、システムのアップグレードの前に手動でパッケージのデータベースを更新して {{Pkg|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. |
||
+ | |||
+ | {{ic|ntpd}} を使っている場合、ルート権限で {{ic|hwclock -w}} の後に {{ic|ntpd --qg}} を実行してシステム時刻を修正してください。 |
||
+ | |||
+ | 他の NTP クライアントも使うことができます。その場合は [[時刻#時刻同期|時刻同期]] も参照して下さい。 |
||
+ | |||
+ | システム時刻を修正してもエラーを解決できない場合は、下に示す方法を試して下さい。 |
||
+ | |||
+ | ==== パッケージのキャッシュからの削除 ==== |
||
+ | |||
+ | パッケージはダウンロードの途中で壊れる可能性があり、エラーを引き起し得ます。新しくダウンロードするために、{{ic|rm /var/cache/pacman/pkg/''pkgname''}} として問題となっているパッケージをキャッシュから削除して下さい。 |
||
+ | |||
+ | ==== 全ての鍵のリセット ==== |
||
+ | |||
+ | システムにインストールされた全ての鍵を削除・リセットして下さい。root で {{ic|/etc/pacman.d/gnupg}} フォルダを削除し {{ic|pacman-key --init}} を実行して {{ic|pacman-key --populate archlinux}} としてデフォルトの鍵を再度追加してください。 |
||
+ | * 動作しない場合は、まず {{ic|pkill gpg-agent}} を試してみてください。 |
||
+ | |||
+ | ==== 署名チェックの無効化 ==== |
||
+ | |||
+ | {{Warning|パッケージ署名を無効化すると ''pacman'' は信頼されていないパッケージをインストールするようになるので注意してください。}} |
||
+ | |||
+ | パッケージの署名について拘りがないのであれば、PGP の署名チェックを完全に無効化することもできます。{{ic|/etc/pacman.conf}} を編集して {{ic|[options]}} の以下の行をアンコメントしてください: |
||
− | パッケージの署名について心配がないのなら、PGP 署名のチェックを完全に無効化することができます。{{ic|/etc/pacman.conf}} を編集して [options] の以下の行をアンコメントしてください: |
||
SigLevel = Never |
SigLevel = Never |
||
− | 個々のリポジトリの SigLevel の設定もコメントアウトする必要があります、なぜならそれらは全体の設定を上書きするからです。 |
||
− | この設定により署名チェックが無効化され、pacman 4 以前の挙動になります。署名チェックを無効にする場合、pacman-key でキーリングを設定する必要はありません。このオプションは後から(パッケージ検証を有効にしたいと思った時から)変更することができます。 |
||
+ | リポジトリごとの SigLevel の設定は全てコメントアウトしてください。上記の設定よりも優先して使われるためです。設定を行うと pacman 4 以前の署名チェックが全くない状態と同じになります。署名チェックを無効化する場合、''pacman-key'' でキーリングを設定する必要もありません。署名チェックのオプションはいつでも後から変更することができます。 |
||
− | ===全てのキーのリセット=== |
||
+ | |||
+ | === 鍵をインポートできない === |
||
+ | |||
+ | 鍵がインポートできない原因は複数考えられます: |
||
+ | |||
+ | * {{Pkg|archlinux-keyring}} パッケージが古くなっている。 |
||
+ | * 現在時刻が間違っている。 |
||
+ | * 使用している ISP によって PGP 鍵のインポートに必要なポートが塞がれている。 |
||
+ | * ''pacman'' のキャッシュに以前使用した未署名のパッケージが残っている。 |
||
+ | * {{ic|dirmngr}} が正しく設定されていない。 |
||
+ | * 長い間アップグレードをしておらず、gpg/pacman がうまく対処できていない。 |
||
+ | |||
+ | {{Pkg|archlinux-keyring}} パッケージが古いとアップグレードの同期時に止まってしまうことがあります。 |
||
+ | |||
+ | 以下にいくつかの解決策を示します。 |
||
+ | |||
+ | ==== システムのアップグレード ==== |
||
+ | |||
+ | まず始めに、[[pacman#パッケージのアップグレード]] を試してみて下さい。 |
||
+ | |||
+ | ==== 鍵サーバーの変更 ==== |
||
+ | |||
+ | 鍵サーバーの不調が疑われる場合は、Ubuntu の鍵サーバーに切り替えてみる事を試してみて下さい。{{ic|/etc/pacman.d/gnupg/gpg.conf}} を編集して {{ic|keyserver}} 行を以下のように変更してください: |
||
+ | |||
+ | keyserver hkp://keyserver.ubuntu.com |
||
+ | |||
+ | ==== パッケージキャッシュの削除 ==== |
||
+ | |||
+ | {{ic|/var/chache/pacman/pkg/}} の pacman のキャッシュに署名されていないパッケージが含まれている事が疑われる場合、次のようにしてキャッシュを全て削除してみて下さい: |
||
+ | |||
+ | # pacman -Sc |
||
+ | |||
+ | これによってインストールされていないパッケージのキャッシュを全て削除します。 |
||
+ | |||
+ | ==== 信頼されていない不明な署名 ==== |
||
+ | |||
+ | {{ic|pacman -Suy}} を実行すると、次のエラーが発生する場合があります。 |
||
+ | |||
+ | error: ''package-name'': signature from "''packager''" is unknown trust |
||
+ | |||
+ | これは、パッケージ {{ic|''package-name''}} で使用されている {{ic|''packager''}} の鍵が存在しないか、ローカルの pacman-key のデータベースで信頼されていないために発生します。 pacman は鍵が受信され、信頼できるものとしてマークされているかどうかを常に確認できるとは限りません。 これは、キーチェーンに追加されてから鍵の有効期限が切れていることによる可能性もあります。 |
||
+ | |||
+ | 対応策としては以下の通りです: |
||
+ | * {{ic|pacman-key --refresh-keys}} を使用して鍵を更新する、または |
||
+ | * [[#非公式な鍵を追加|ローカルで信頼できない鍵を手動で署名する]] または |
||
+ | * [[#全ての鍵のリセット|すべての鍵をリセットする]] |
||
+ | * 一時的に {{ic|SigLevel}} を {{ic|TrustAll}} に変更する。ただし推奨しません。 |
||
+ | === プロキシを使って鍵をアップデート === |
||
− | システムにインストールされた全てのキーを削除・リセットしたい場合、root で {{ic|/etc/pacman.d/gnupg}} フォルダを削除し {{ic|pacman-key --init}} を再度実行してから上の記述に従ってキーを追加してください。 |
||
+ | 鍵の更新時にプロキシを使うには {{ic|/etc/gnupg/dirmngr.conf}} と {{ic|/etc/pacman.d/gnupg/dirmngr.conf}} の両方で {{ic|honor-http-proxy}} オプションを設定してください。詳しくは [[GnuPG#鍵サーバーを使用する]]を参照。 |
||
− | ===腐ったパッケージを削除する=== |
||
+ | {{Note|{{ic|honor-http-proxy}} オプションを使わずに ''pacman-key'' を使用していて更新に失敗する場合、再起動することで問題が解決する場合があります。}} |
||
− | 同じパッケージが失敗し続けていて、pacman-key に関することを全て正しく行っている場合、{{ic|rm /var/cache/pacman/pkg/badpackage*}} を実行するなどしてパッケージを一度削除してから新しくダウンロードしてみてください。 |
||
+ | == 参照 == |
||
− | アップグレードの際に <code>error: linux: signature from "Some Person <Some.Person@example.com>" is invalid</code> のようなメッセージが表示される場合、これが解決策になることが実際にあります (つまり、あなたは MITM 攻撃の犠牲者などではなく、単にダウンロードしたファイルが壊れていたということです)。 |
||
+ | * [[DeveloperWiki:パッケージの署名]] |
||
− | ==参考資料== |
||
− | * [[Package Signing Proposal for Pacman|DeveloperWiki:Package Signing Proposal for Pacman]] |
||
* [http://allanmcrae.com/2011/08/pacman-package-signing-1-makepkg-and-repo-add/ Pacman Package Signing – 1: Makepkg and Repo-add] |
* [http://allanmcrae.com/2011/08/pacman-package-signing-1-makepkg-and-repo-add/ Pacman Package Signing – 1: Makepkg and Repo-add] |
||
* [http://allanmcrae.com/2011/08/pacman-package-signing-2-pacman-key/ Pacman Package Signing – 2: Pacman-key] |
* [http://allanmcrae.com/2011/08/pacman-package-signing-2-pacman-key/ Pacman Package Signing – 2: Pacman-key] |
2024年5月1日 (水) 21:15時点における最新版
関連記事
パッケージが本物かどうか判断するために、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#鍵サーバーを使用するを参照。