# pacman-key (日本語)

pacman-key は Arch Linux においてパッケージの署名を設定・管理するために使われるツールです。

## イントロダクション

Pacman は GnuPG keys を使っており web of trust モデルによってパッケージの信頼性を決定します。現在、5つの 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 を使って) サーバーから署名済みのキーを取得するには、このポートが開かれている必要があります。

## 設定

### pacman の設定

`/etc/pacman.conf` 内の `SigLevel` オプションで、パッケージをインストールするのに必要な信頼がどのレベルか設定します。`SigLevel` の詳細は pacman.conf man page やファイル内のコメントを見て下さい。署名チェックはリポジトリ毎にも、全体にも設定することができます。`SigLevel` を [options] セクションに設定して、全てのパッケージに署名が必要にすると、あなたがビルドしたパッケージにも `makepkg` を使って署名をしなくてはならなくなります。

Note: 現在全ての公式パッケージは署名されていますが、2012年6月現在データベースの署名は作業中です。`Required` が設定されている場合 `DatabaseOptional` も設定するべきです。
デフォルト設定では

    /etc/pacman.conf

    SigLevel = Required DatabaseOptional

信頼されたキーで署名されたパッケージだけをインストールするようになっています。これは pacman のデフォルトパラメータが `TrustOnly` になっているためです。よって上記設定は全体のオプションとして以下を設定するのと同じになります。

    SigLevel = Required DatabaseOptional TrustedOnly

上記の設定と同じことを設定ファイルの下の方でリポジトリレベルで行うことができます、例えば:

    [core]
    SigLevel = PackageRequired   # ’Optional’ here would turn off a global ’Required’ for this repository
    Include = /etc/pacman.d/mirrorlist

リポジトリのパッケージの署名チェックを明示的に追加していますが、データベースが署名されていることは要求しません。

Warning: SigLevel の `TrustAll` はデバッグのためのオプションで、検証されていないキーも信頼するようになります。公式リポジトリには全て `TrustedOnly` を使うようにしてください。

### キーリングの初期化

pacman のキーリングを設定するには、以下を実行してください:

    # pacman-key --init

この初期化には、エントロピーが必要です。マウスを動かいたり、キーボードの文字をランダムで押したり、ディスク操作を伴うコマンドを実行したりすることで (例えば、他のコンソールで `ls -R /` や `find / -name foo`, `dd if=/dev/sda8 of=/dev/tty7` を実行する) エントロピーが生成されます。システムに十分なエントロピーが溜まっていないと、初期化にはかなりの時間がかかります; 積極的にエントロピーを生成すれば、早く初期化が完了するでしょう。

作成された乱数はキーリング (`/etc/pacman.d/gnupg`) とあなたのシステムの GPG 署名キーのセットアップに使用されます。

Note: SSH を通して `pacman-key --init` を実行する必要があるときは、ターゲットのマシンに haveged パッケージをインストールしてください。SSH で接続してから以下を実行してください:

    # haveged -w 1024
    # pacman-key --init

pacman-key が無事終わったら、haveged を止めてパッケージを削除してください。

    # pkill haveged
    # pacman -Rs haveged

haveged を使う方法は SSH だけのものではありません: エントロピーを素早く得るのにどこでも使えます。`pacman-key --init` が終わるのを待っていると日が暮れてしまうような場合、この方法を試してみると良いでしょう。

## キーリングの管理

### 5つのマスターキーを検証する

キーの初期設定は次を実行してください:

    # pacman-key --populate archlinux

Master Signing Keys を検証するのは時間ががかります、他の全てのパッケージ作成者のキーに連署（そして信頼）するのに使われるからです。

PGP 鍵は人間には手に余る長さ (2048 ビット以上) なので、通常ハッシュ化されて16進数で40桁のフィンガープリントが作成されます。これを使って手動で2つのキーが同一であることを確認できます。フィンガープリントの最後の8桁はキーの名前として使われ 'key ID' と呼ばれます。

### 開発者のキーの追加

公式開発者と TU のキーはマスターキーによって署名されています。なので pacman-key を使ってそれらに署名をする必要はありません。pacman は未確認のキーに遭遇した時、`/etc/pacman.d/gnupg/gpg.conf` に設定されている `keyserver` から (もしくはコマンドラインの `--keyserver` オプションを使って) キーをダウンロードするようになっています。Wikipedia が keyserver のリストを保守しています。

開発者のキーは一度ダウンロードすれば、またダウンロードする必要はありません。開発者によって署名されたパッケージ全てを、そのキーで確認することができます。

Note: archlinux-keyring パッケージ (pacman の依存パッケージ) には最新のキーが含まれていますが、次を実行してキーを更新することもできます:

    # pacman-key --refresh-keys

`--refresh-keys` の実行中、あなたのローカルキーも外部のキーサーバーで調べられます。なのでキーが見つからないというメッセージが表示されるでしょう。このメッセージは気にしないで下さい。

### 非公式のキーの追加

まず、キーの所有者から ID を取得してください。次を実行してキーサーバーからダウンロードしましょう:

    # pacman-key -r <keyid>

マスターキー（やその他署名をするキー）でしたように、フィンガープリントの検証を必ずしてください。フィンガープリントの検証後、キーをローカルで署名する必要があります:

    # 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

## トラブルシューティング

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.

### キーをインポートできない

ISP によっては PGP キーをインポートするために使われるポートをブロックされていることがあります。1つの解決方法としては、他のポートを提供している、MIT キーサーバーを使う方法があります。これを行うには、`/etc/pacman.d/gnupg/gpg.conf` を編集して keyserver の行を次のように修正してください:

    keyserver hkp://pgp.mit.edu:11371

`pacman-key --populate archlinux` を実行するのを忘れていると、キーをインポートするときにエラーが表示されるかもしれません。

### 署名チェックの無効化

Warning: 気をつけて使って下さい。パッケージの署名を無効化すると 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 攻撃の犠牲者などではなく、単にダウンロードしたファイルが壊れていたということです)。

## 参考資料

- DeveloperWiki:Package Signing Proposal for Pacman
- Pacman Package Signing – 1: Makepkg and Repo-add
- Pacman Package Signing – 2: Pacman-key
- Pacman Package Signing – 3: Pacman
- Pacman Package Signing – 4: Arch Linux

Categories:

- Package management (日本語)
- Pacman development (日本語)