1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

YubiKeyを使用したGPGキーの設定ガイド

Last updated at Posted at 2024-07-07

はじめに

このガイドでは、YubiKeyを使用してGPG(GNU Privacy Guard)キーを設定する方法を詳しく説明します。GPGは、データの暗号化と署名に広く使用されているオープンソースのツールです。YubiKeyと組み合わせることで、セキュリティをさらに強化し、物理的な二要素認証を実現します。また、GPGエージェントを使用してSSHログインした先でのGit操作にも対応します。

前提条件

開始する前に、以下の点を確認してください:

  • YubiKeyのファームウェアバージョンを確認する。
    • 古いYubiKeyはed25519暗号化をサポートしていない可能性があります。YubiKeyはファームウェアの更新には対応していないため、ファームウェアが古い場合にはあたらしいYubiKeyを購入してください。
    • 完全な互換性のリストはfirmware compatibility matrixを確認してください。
  • GPGがインストールされていることを確認する。
  • コマンドラインの基本的な操作に慣れていること。

セットアップ

このセクションでは、GPG鍵の生成と基本的な設定を行います。

まず、環境変数を設定します。これにより、後続のコマンドが正しいディレクトリとアイデンティティを使用することを保証します。

export GNUPGHOME=~/.gnupg
export IDENTITY="your name <your-name@example.com>"

注意: GNUPGHOMEは通常~/.gnupgを使用します。特別な理由がある場合のみ、別のディレクトリを指定してください。

次に、強力なパスフレーズを生成します。このステップは非常に重要です。生成されたパスフレーズは、マスターキーを保護するために使用されます。

export CERTIFY_PASS=$(LC_ALL=C tr -dc 'A-Z1-9' < /dev/urandom | \
tr -d "1IOS5U" | fold -w 30 | sed 's/./&-/5;s/./&-/11;s/./&-/17;s/./&-/23' | \
cut -c2- | head -1) ; echo -e "\n$CERTIFY_PASS\n"

重要: 生成されたパスフレーズは安全な場所に保存してください。このパスフレーズを失うと、鍵にアクセスできなくなります。

キーの種類と有効期限を設定します。RSA 4096ビットは現在のセキュリティ標準に適しています。

export KEY_TYPE=rsa4096
export EXPIRATION=2y

マスターキーを生成します。このキーは証明用(cert)に使用され、有効期限は設定しません。

gpg --batch --passphrase "$CERTIFY_PASS" \
    --quick-generate-key "$IDENTITY" "$KEY_TYPE" cert never

生成されたキーのIDとフィンガープリントを取得します。これらは後続の操作で使用されます。

export KEYID=$(gpg -k --with-colons "$IDENTITY" | awk -F: '/^pub:/ { print $5; exit }')
export KEYFP=$(gpg -k --with-colons "$IDENTITY" | awk -F: '/^fpr:/ { print $10; exit }')

署名、暗号化、認証用のサブキーを生成します。これらのサブキーは日常的な操作に使用され、YubiKeyに保存されます。

for SUBKEY in sign encrypt auth ; do \
  gpg --batch --pinentry-mode=loopback --passphrase "$CERTIFY_PASS" \
      --quick-add-key "$KEYFP" "$KEY_TYPE" "$SUBKEY" "$EXPIRATION"
done

バックアップ

キーのバックアップは非常に重要です。マスターキー、サブキー、公開鍵のバックアップを作成します。これらは安全な場所に保管してください。

gpg --output $GNUPGHOME/$KEYID-Certify.key \
    --batch --pinentry-mode=loopback --passphrase "$CERTIFY_PASS" \
    --armor --export-secret-keys $KEYID

gpg --output $GNUPGHOME/$KEYID-Subkeys.key \
    --batch --pinentry-mode=loopback --passphrase "$CERTIFY_PASS" \
    --armor --export-secret-subkeys $KEYID

gpg --output $GNUPGHOME/$KEYID-$(date +%F).asc \
    --armor --export $KEYID

重要: これらのバックアップファイルは暗号化されていないため、非常に安全な場所に保管してください。

公開鍵のエクスポート

公開鍵を他の人と共有するためにエクスポートします。この鍵は、あなたに暗号化されたメッセージを送信したり、あなたの署名を検証したりするために使用されます。

gpg --armor --export $KEYID > public/$KEYID-$(date +%F).asc
chmod 0444 public/*.asc

注意: sudoの使用は環境によっては不要です。ユーザーの権限に応じて適切に調整してください。

YubiKeyの設定

このセクションでは、YubiKeyの初期設定と鍵の転送を行います。

YubiKeyの現在の状態を確認します。

gpg --card-status

安全なPINを設定します。これらのPINは、YubiKeyでの操作を認証するために使用されます。

export ADMIN_PIN=$(LC_ALL=C tr -dc '0-9' < /dev/urandom | fold -w8 | head -1)
export USER_PIN=$(LC_ALL=C tr -dc '0-9' < /dev/urandom | fold -w6 | head -1)

gpg --command-fd=0 --pinentry-mode=loopback --change-pin <<EOF
3
12345678
$ADMIN_PIN
$ADMIN_PIN
q
EOF

重要: 生成されたADMIN_PINとUSER_PINは安全な場所に保存してください。これらのPINを忘れるとYubiKeyをリセットする必要があります。

YubiKeyを再接続し、PINのリトライ回数を設定します。これにより、ブルートフォース攻撃からの保護が強化されます。

ykman openpgp access set-retries 5 5 5 -f -a $ADMIN_PIN

YubiKeyの属性を設定します。これにより、YubiKeyに個人情報が関連付けられます。

gpg --command-fd=0 --pinentry-mode=loopback --edit-card <<EOF
admin
login
$IDENTITY
$ADMIN_PIN
quit
EOF

サブキーの転送

生成したサブキーをYubiKeyに転送します。これにより、YubiKeyが実際の暗号操作を行うことができるようになります。

gpg --edit-key $KEYID
key 1
keytocard
1
save

gpg --edit-key $KEYID
key 2
keytocard
2
save

gpg --edit-key $KEYID
key 3
keytocard
3
save

YubiKeyの使用

公開鍵をインポートし、信頼度を設定します。これにより、システムがあなたの鍵を信頼するようになります。

gpg --import public/*.asc
gpg --edit-key ${KEYID}
trust
5
y
save

GPGエージェントの転送設定

このセクションでは、リモートマシンでのGit commit署名など、リモート操作のためにGPGエージェントの転送を設定します。

ローカルマシンの設定

SSHの設定を行い、GPGエージェントのソケットを転送します。~/.ssh/configに以下を追加します:

Host ${HOST_NAME}
  User ${USERNAME}
  Port 2222
  StreamLocalBindUnlink yes
  RemoteForward /run/user/0/gnupg/S.gpg-agent /Users/${LOCAL_USER_HOME}/.gnupg/S.gpg-agent

リモートマシンの設定

GPGエージェントの設定ファイルをダウンロードします。

cd ~/.gnupg
wget https://raw.githubusercontent.com/drduh/config/master/gpg-agent.conf

公開鍵をリモートマシンに転送します。

scp ~/.gnupg/pubring.kbx remote:~/.gnupg/

~/.gnupg/gpg-agent.confファイルを適切に設定し、PINエントリーやSSHサポートなどの動作を制御します。以下は例です:

pinentry-program /usr/bin/pinentry-curses
enable-ssh-support
ttyname $GPG_TTY
default-cache-ttl 60
max-cache-ttl 120

注意: pinentry-programのパスは使用するOSによって異なります。上記はLinux用の例です。macOSの場合は/opt/homebrew/bin/pinentry-mac、Windowsの場合は適切なパスに変更してください。

リモートマシンでのGit設定

リモートマシンでGPG署名付きのコミットを行うためには、.gitconfigファイルを適切に設定する必要があります。

GPGキーIDの確認

以下のコマンドを使用して、あなたのGPGキーIDを確認します:

gpg --list-secret-keys --keyid-format LONG

このコマンドの出力から、"sec" で始まる行を探し、スラッシュの後ろの16文字の文字列がキーIDです。例えば:

sec   rsa4096/0x58D8576394B9513F 2024-07-07 [C]

この例では、0x58D8576394B9513F がキーIDです。

.gitconfigの設定

確認したキーIDを使用して、以下の設定をリモートマシンの~/.gitconfigファイルに追加してください。

[user]
        email = you@example.com
        name = you
        signingkey = 0x58D8576394B9513F  # ここに確認したキーIDを入力
[safe]
        directory = /home/your/project
[commit]
        gpgsign = true

この設定により、リモートマシンでGPG署名付きのGitコミットが可能になります。

設定後、以下のコマンドでGPG署名が正しく機能しているか確認できます:

git commit -S -m "Test signed commit"
git log --show-signature

署名付きコミットが正常に作成され、署名が検証できることを確認してください。

デバッグ

問題が発生した場合のデバッグ方法です。

GPGエージェントを再起動します:

gpgconf --kill gpg-agent
gpg-agent --daemon

エージェントソケットのパスを確認します:

gpgconf --list-dirs agent-socket

詳細なデバッグ情報を得るために、GPGエージェントをデバッグモードで起動します:

pkill gpg-agent; gpg-agent --daemon --no-detach -v -v --debug-level advanced --homedir ~/.gnupg

定期的なメンテナンス

セキュリティを維持するために、以下の定期的なメンテナンスを行うことをお勧めします:

  1. バックアップの更新:少なくとも年に1回はバックアップを更新してください。
  2. 鍵の有効期限の確認:有効期限が近づいている場合は、更新を検討してください。
  3. PINの定期的な変更:少なくとも年に1回はYubiKeyのPINを変更してください。
  4. ファームウェアの更新:YubiKeyのファームウェアに更新がある場合は、適用を検討してください。

以上で、YubiKeyを使用したGPGキーの設定が完了します。この設定により、高度なセキュリティを実現し、暗号化、署名、認証の機能を安全に利用できるようになります。

chaetsheet

公開鍵の表示

gpg --export -a you@example.com
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?