「Pacman/パッケージの署名」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(文字列「[[zh-cn:」を「[[zh-hans:」に置換)
(同期)
1行目: 1行目:
 
{{Lowercase title}}
 
{{Lowercase title}}
 
[[Category:パッケージ管理]]
 
[[Category:パッケージ管理]]
[[Category:Pacman 開発]]
 
 
[[en:Pacman/Package signing]]
 
[[en:Pacman/Package signing]]
 
[[es:Pacman/Package signing]]
 
[[es:Pacman/Package signing]]
9行目: 8行目:
 
[[tr:pacman paket imzaları]]
 
[[tr:pacman paket imzaları]]
 
[[zh-hans:Pacman/Package signing]]
 
[[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|SigLevel}} オプションでパッケージをインストールするに必要な信頼がどのレベル設定ます。{{ic|SigLevel}} [https://www.archlinux.org/pacman/pacman.conf.5.html#_package_and_database_signature_checking pacman.conf man page] やファイル内のコメントを見てさい。署名チェックはリポジトリ、全設定することができます。{{ic|SigLevel}} を [options] セクション設定して全てのパッケージに署名必要にすると、あなたがビルドしたパッケージにも {{ic|makepkg}} を使って署名をしなくてはならなくなります。
+
{{ic|/etc/pacman.conf}} の {{ic|SigLevel}} オプションでパッケージをインストールするときに必要な信頼のレベル設定できます。{{ic|SigLevel}} についてしく{{man|5|pacman.conf}} やファイル内のコメントを見てください。署名チェックはリポジトリ設定したり、全てのリポジトリで共通に設定することが可能です。{{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|公式のパッケージは全て署名されていますが、2012年6月現在、データベースの署名は作業途中です。{{ic|Required}} を設定するときは {{ic|DatabaseOptional}} も設定してください。}}
===キーリングの初期化===
 
  +
  +
デフォルト設定では信頼できる鍵によって署名されたパッケージのみインストールするようになっています:
  +
  +
{{hc|1=/etc/pacman.conf|
  +
output=SigLevel = Required DatabaseOptional
  +
}}
  +
  +
デフォルトの ''pacman'' のパラメータは {{ic|TrustedOnly}} となっているため、上記の設定は全体的に以下のように設定したのと同じです:
  +
  +
SigLevel = Required DatabaseOptional TrustedOnly
  +
  +
上記と同じ設定をリポジトリ別で行うには以下のように設定します:
  +
  +
[core]
  +
SigLevel = PackageRequired
  +
Include = /etc/pacman.d/mirrorlist
  +
  +
上記の設定ではリポジトリのパッケージの署名チェックが明示的に行われますが、データベースは必ずしも署名を必要としません。上記の {{ic|PackageRequired}} を {{ic|Optional}} とすれば、設定したリポジトリに限り、全体設定の {{ic|Required}} がオフになります。
  +
  +
{{warning|SigLevel の {{ic|TrustAll}} オプションはデバッグのためのオプションです。検証されていない鍵も簡単に信用するようになります。公式リポジトリでは {{ic|TrustedOnly}} を使うようにしてください。}}
  +
  +
=== キーリングの初期化 ===
  +
  +
''pacman'' のキーリングをセットアップするには:
   
pacman のキーリングを設定するには、以下を実行してください:
 
 
# 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}} を実行する) エントロピー生成されます。システムに十分なエントロピーが溜まっていない、初期化にはかなりの時間かかります; 積極的にエントロピーを生成すれば、早く初期化が完了するでしょう
+
初期化には[[Wikipedia:Entropy_(computing)|エントロピー]]が必要です。マウスを動かたり、キーボードランダムに文字列を打ち込んだり、ディスク操作を伴うユーティリティを実行 (例えばのコンソールで {{ic|ls -R /}}, {{ic|find / -name foo}}, {{ic|1=dd if=/dev/sda8 of=/dev/tty7}} などを実行) したりしてエントロピー生成してくだ。システムに十分なエントロピーが溜まっていない場合、初期化が完了するまで何時間かかります積極的にエントロピーを生成することで早く初期化を終わらせことがきます
   
され乱数はキーリング ({{ic|/etc/pacman.d/gnupg}}) とあなたのシステムの GPG 署名キーのセットアップに使用されます。
+
エントロピーはキーリング ({{ic|/etc/pacman.d/gnupg}}) GPG 署名のセットアップに使れます。
   
{{Note|エントロピーがあまり生成されないコンピュータ (ヘッドレスサーバーなど) で {{ic|pacman-key --init}} を実行する必要があるときは、鍵の生成にはとても長い時間がかかります。擬似エントロピー生成するために、対象のマシンに [[haveged]] [[rng-tools]] をインストールして {{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/ Master Signing Keys] を検証するの時間ががかります、他の全てのパッケージ作成者のキーに連署(そして信頼)するのに使われるからです
+
[https://www.archlinux.org/master-keys/ マスター署名鍵] は全ての他のパッケージ作成者のに連署するのに使われるため、時間をけて検証してください
   
PGP 鍵は人間には手に余る (2048 ビット以上) なので通常ハッシュ化され16進数で40桁のフィンガープリントが作成されます。これを使って手動で2つのキー同一であることを認できます。フィンガープリントの最後の8桁はキーの名前として使われ 'key ID' と呼ばれます。
+
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 のリスト]]を保守しています。
 
   
  +
公式開発者や 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>}}
 
これでパッケージを署名するキーを信頼できました。
 
   
===gpg使う===
+
=== 非公式な鍵追加 ===
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
 
  +
* 鍵サーバーに鍵が存在する場合、以下のコマンドでインポート: {{bc|# pacman-key -r ''keyid''}}
error: failed to commit transaction (invalid or corrupted package (PGP signature))
 
  +
  +
* または、鍵ファイルがダウンロードできる場合、ダウンロードして以下のコマンドを実行: {{bc|# 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
  +
  +
== トラブルシューティング ==
  +
  +
{{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.
 
Errors occured, no packages were upgraded.
 
}}
 
}}
   
===キーをインポートできない===
+
===をインポートできない ===
   
  +
鍵がインポートできない原因は複数考えられます:
ISP によっては PGP キーをインポートするために使われるポートをブロックされていることがあります。1つの解決方法としては、他のポートを提供している、MIT キーサーバーを使う方法があります。これを行うには、{{ic|/etc/pacman.d/gnupg/gpg.conf}} を編集して keyserver の行を次のように修正してください:
 
{{bc|keyserver hkp://pgp.mit.edu:11371}}
 
   
  +
* {{Pkg|archlinux-keyring}} パッケージが古くなっている。
{{ic|pacman-key --populate archlinux}} を実行するのを忘れていると、キーをインポートするときにエラーが表示されるかもしれません。
 
  +
* 現在時刻が間違っている。
  +
* 使用している ISP によって PGP 鍵のインポートに必要なポートが塞がれている。
  +
* ''pacman'' のキャッシュに以前使用した未署名のパッケージが残っている。
  +
* {{ic|dirmngr}} が正しく設定されていない。
   
  +
{{Pkg|archlinux-keyring}} パッケージが古いとアップグレードの同期時に止まってしまうことがあります。[[Pacman#パッケージのアップグレード|システムのアップグレード]]によって問題が解決しないか試してみてください。
===署名チェックの無効化===
 
  +
{{warning|気をつけて使って下さい。パッケージの署名を無効化すると pacman は信頼されてないパッケージを自動でインストールします。}}
 
  +
システムを更新しても問題が解決せず時刻も間違っていない場合、MIT の鍵サーバーに切り替えてみる方法があります。MIT のサーバーは別のポートを提供しています。{{ic|/etc/pacman.d/gnupg/gpg.conf}} を編集して {{ic|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
  +
  +
そのほかに {{ic|pacman-key --populate archlinux}} を実行していないと鍵のインポート時にエラーが表示されることがあります。
  +
  +
上記の解決方法が全く役に立たない場合、{{ic|/var/cache/pacman/pkg/}} に存在する ''pacman'' のキャッシュに未署名のパッケージが含まれている可能性があります。キャッシュを手動で消去するか、以下のコマンドを実行してインストールしていないパッケージのキャッシュを全て削除してください:
  +
  +
# pacman -Sc
  +
  +
=== 署名チェックの無効化 ===
  +
  +
{{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'' でキーリングを設定する必要もありません。署名チェックのオプションはいつでも後から変更することができます。
===全てのキーのリセット===
 
  +
  +
=== 全ての鍵のリセット ===
  +
  +
システムにインストールされた全ての鍵を削除・リセットしたい場合、root で {{ic|/etc/pacman.d/gnupg}} フォルダを削除し {{ic|pacman-key --init}} を再度実行してから上の記述に従って鍵を追加してください。
  +
  +
=== 古いパッケージの削除 ===
  +
  +
同じパッケージが署名チェックに失敗し続けていて、''pacman-key'' に関することを全て正しく行っている場合、{{ic|rm /var/cache/pacman/pkg/''badpackage''*}} を実行するなどしてパッケージを一度削除してから新しくダウンロードしてみてください。
  +
  +
アップグレードの際に {{ic|error: linux: signature from "Some Person <Some.Person@example.com>" is invalid}} とメッセージが表示される場合、削除によって解決することが実際にあります (つまり、あなたは MITM 攻撃の犠牲者などではなく、単にダウンロードしたファイルが壊れていたということです)。
   
  +
=== プロキシを使って鍵をアップデート ===
システムにインストールされた全てのキーを削除・リセットしたい場合、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 攻撃の犠牲者などではなく、単にダウンロードしたファイルが壊れていたということです)。
 
   
==参考資料==
 
* [[en2: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]

2017年12月7日 (木) 22:25時点における版

関連記事

パッケージが本物かどうか判断するために、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) やファイル内のコメントを見てください。署名のチェックはリポジトリ別に設定したり、全てのリポジトリで共通に設定することが可能です。[options] セクションで SigLevel を設定して全てのパッケージに署名を必要とした場合、あなた自身が makepkg で作成したパッケージにも署名が必要になります。

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

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

/etc/pacman.conf
SigLevel = Required DatabaseOptional

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

SigLevel = Required DatabaseOptional TrustedOnly

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

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

上記の設定ではリポジトリのパッケージの署名チェックが明示的に行われますが、データベースは必ずしも署名を必要としません。上記の PackageRequiredOptional とすれば、設定したリポジトリに限り、全体設定の 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) を入手してください。それからキーリングに鍵を追加してください:

  • 鍵サーバーに鍵が存在する場合、以下のコマンドでインポート:
    # 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

トラブルシューティング

警告: 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 攻撃の犠牲者などではなく、単にダウンロードしたファイルが壊れていたということです)。

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

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

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

参照