YubiKey

提供: ArchWiki
2022年6月26日 (日) 12:46時点におけるAshMyzk (トーク | 投稿記録)による版 (→‎USB 接続モード: 追加。英語版より。)
ナビゲーションに移動 検索に移動
この記事あるいはセクションは翻訳の途中です。
ノート: 飜訳へのご協力または英語版をご参照ください。 (議論: トーク:YubiKey#)

関連記事

YubiKey は小さな USB セキュリティトークンです。モデルにも依りますが、以下のようなことができます:

多くの機能を提供する一方、YubiKey の新しいバージョンはオープンソースとしてリリースされていません。代替は Solo です。

インストール

管理ツール

  • YubiKey Manager — USB を通して YubiKey の設定とクエリをするための Python ライブラリとコマンドラインツール(ykman)。オプションの GUI あり。
https://developers.yubico.com/yubikey-manager/ || yubikey-manager, yubikey-manager-qt
ノート: インストール後、pcscd.service有効化してください。
  • YubiKey Personalization — OTP USB 接続を通して YubiKey の設定とクエリをするためのライブラリとツール。ykman よりも強力ですが、使うのが難しいです。オプションの GUI あり。
https://developers.yubico.com/yubikey-personalization/ || yubikey-personalization, yubikey-personalization-gui

認証ツール

  • Yubico PAM — Yubico OTP または チャレンジレスポンス認証による PAM ユーザ認証。
https://developers.yubico.com/yubico-pam/ || yubico-pam
  • Yubico PAM-U2FU2F により PAM ユーザ認証。
https://developers.yubico.com/pam-u2f/ || pam-u2f
  • Yubico Authenticator for Desktop — USB を通して YbiKey から OATH コードを読み込む GUI。古いスロットベースの実装(YubiKey Standard と Edge)と新しい OATH 実装をサポート(YubiKey NEO と 4)。
https://developers.yubico.com/OATH/YubiKey_OATH_software.html || yubioath-desktop
  • libfido2 — クライアントサイドの U2F サポート。ウェブブラウザで U2F プロトコルを YubiKey による認証のために利用できるようになります。
https://developers.yubico.com/libfido2/ || libfido2
  • YubiKey Full Disk Encryption — チャレンジレスポンスモードを使用し、強力な LUKS パスフレーズを生成します。完全なディスク暗号化をサポート。
https://github.com/agherzan/yubikey-full-disk-encryption || yubikey-full-disk-encryption

入力

YubiKey は、USB を通して API を呼び出したりボタンを押したりする形で入力を受け付けます。

ボタンはとても敏感です。状況にも依りますが、ボタンを押すと以下のどれか1つを行います:

  • 静的パスワードやワンタイムパスワード(OTP)をトリガーする(短く押すとスロット1、長く押すとスロット2)。これはデフォルトの挙動で、うっかりトリガーしてしまうことは簡単です。
  • 機能やアクセスを確定/許可する。LED が点灯し、ユーザに入力を促します。
  • スマートカードを挿入/除去する。

出力

YubiKey は以下の入力を出力に変換します:

  • キーストローク(USB キーボードをエミュレートします)、静的パスワードや OTP をタイプするために使用します。(静的パスワードはキーロガーに対して脆弱であることに注意してください。)
  • 組み込みの LED は:
    • 挿入した際に一度光ります。トラブルシューティングに便利です。
    • API の応答を許可するためにボタンを押すことを要求された際に安定して光ります。
  • USB を通した API 応答。これは以下のように使用されます:
    • チャレンジレスポンス認証(Yubico OTP モードか HMAC-SHA1 モードを使って計算されます)
    • U2F チャレンジレスポンス認証
    • CCID スマートカード関連のリクエスト

USB 接続モード

YubiKey のモデルによりますが、デバイスは3つまでの異なる USB インターフェイスを提供します。これらのインターフェイスのうち2つは USB HID (Human Interface Device) デバイスクラスを実装しています; 3つ目はスマートカードインターフェイス(CCID)です。3つすべて独立して有効化/無効化できます。これにより、それらに関連したプロトコルの制御ができます。

以下の表はどのプロトコルがどのインターフェイスを使用するかを示しています:

プロトコル インターフェイス
OTP Keyboard HID
FIDO Other HID
PIV CCID
OpenPGP CCID
OATH CCID

ykman は "modes" という用語を使用します、OTP、FIDO、CCID と名付けられています。

ノート: ykman はリリース 0.6.1 (2018-04-16)で "U2F" を "FIDO" と名前を変更しました。https://developers.yubico.com/yubikey-manager/Release_Notes.html

有効なモードを取得

バージョン 5 以前の YubiKey では:

$ ykman mode
Current connection mode is: OTP+FIDO+CCID
ノート: "ykman mode" というコマンドは非推奨となり、今後削除されるでしょう。

YubiKey バージョン 5 では:

$ ykman info
Device type: YubiKey 5 NFC
Serial number: XXXXXXXXX
Firmware version: 5.4.3
Form factor: Keychain (USB-A)
Enabled USB interfaces: OTP, FIDO, CCID
NFC transport is enabled.

Applications    USB     NFC
FIDO2           Enabled Enabled
OTP             Enabled Enabled
FIDO U2F        Enabled Enabled
OATH            Enabled Enabled
YubiHSM Auth    Enabled Enabled
OpenPGP         Enabled Enabled
PIV             Enabled Enabled

モードをセット

すべてのモードが出荷時から有効化されています。変更するには:

$ ykman mode [OPTIONS] <MODE>

  • <MODE> には文字列を使用できます。例えば、OTP+FIDO+CCID。短い形式もあります: o+f+c
  • <MODE> にはモード番号を使用できます。複数の有効化するモードをエンコードしたものです。

以下にモード番号の表があります:

0 OTP device only.
1 CCID device only.
2 OTP/CCID composite device.
3 U2F device only.
4 OTP/U2F composite device.
5 U2F/CCID composite device.
6 OTP/U2F/CCID composite device.
81 CCID device only, with touch-eject.
ノート: 一部の例では 86 という番号を使用しています。これは無効な番号です。80 は無視され、6 のように振る舞います。

オプション:

  • --touch-eject - ボタンを押すとスマートカードを挿入/除去します。これは CCID のみのモードでのみ動作します; FIDO と OTP は無効化されていなければなりません。
  • --autoeject-timeout <SECONDS> - 一定時間立つとスマートカードを自動的に除去します。--touch-eject と同じような制限があります。
  • --chalresp-timeout <SECONDS> - チャレンジレスポンス認証のタイムアウトを設定します。

さらなる情報は、$ ykman mode --help を見てください。

イントロダクション

仕組み

Yubikey の認証プロトコルは共通鍵暗号に基づいています。より正確に言うと、それぞれの Yubikey には固有の128ビットの AES 鍵が含まれています。この鍵を使用して、キーの ID やカウンター、乱数などからなるトークンを暗号化します。OTP はキーの ID と暗号化されたトークンを連結して作成されます。

作成された OTP は認証を行いたいシステムに送られます。システムは OTP が問題ないか検証サーバーに問い合わせを行います。検証サーバーには Yubikey ID -> AES 鍵の対応表があり、OTP のキー ID を使って、AES 鍵を取得して OTP の他の部分を復号化することが可能です。OTP が問題なければ (平文の ID と暗号化された ID が同じで、(反射攻撃をふせぐため) カウンターが最後に確認された値より大きい場合)、認証は成功します。

検証サーバーは認証結果をシステムに送り返し、そのレスポンスに応じてアクセスを与えるべきかどうか決定します。

セキュリティリスク

AES 鍵の漏洩

ご想像の通り、AES 鍵は絶対に秘密にする必要があります。Yubikey から AES 鍵を抜き取ることはできません (少なくともソフトウェアを使って抜き取るのは不可能に近い)。AES 鍵は検証サーバーにも存在するため、このサーバーのセキュリティというのがとても重要になります。

検証リクエスト/レスポンスの盗聴

システムは検証サーバーの決定に従っているため、検証サーバーになりすます攻撃が考えられます。従って、システムは検証サーバーを認証する必要があります。2つの方法が存在します:

  • HMAC: 共通鍵暗号を使用して、対象サーバーと検証サーバーで鍵を共有して、その鍵を使ってリクエストとレスポンスに署名をします。
  • TLS: リクエストとレスポンスは HTTP で受け取りするので、TLS (HTTPS) を使って接続を認証・暗号化することが可能です。

YubiCloud と検証サーバー

Yubikey を購入した時点で、Yubikey には Yubico だけが知っている AES 鍵が初めから搭載されています。たとえあなたであっても、Yubico はその AES 鍵を教えるようなことはしません。Yubico はフリーの制限付き検証サーバーを提供しています (YubiCloud)。また、サーバーのオープンソース実装も提供しています。

そこで2つの選択肢が出てきます:

  • Yubikey に初めから載っている AES 鍵を使って Yubico の検証サーバーで検証を行う。
  • Yubikey に新しく AES 鍵を書き込んで自分で検証サーバーを運営する。
ノート: Yubico の検証サーバーを認証する場合:
  • HMAC を使用: https://upgrade.yubico.com/getapikey/ から HMAC 鍵と ID を取得してください。
  • HTTPS を使用: 検証サーバーの証明書は GoDaddy によって署名されています。Arch ではデフォルトで GoDaddy を信頼しています (ca-certificates をインストールしていれば)。

SSH で2段階認証

ノート: 参照: https://developers.yubico.com/yubico-pam/Yubikey_and_SSH_via_PAM.html

このセクションでは Yubikey を使って SSH で2段階認証 (パスワードと Yubikey によって生成された OTP を使用) を行う方法を説明します。

要件

yubico-pam をインストールしてください。

ノート: Yubikey を使用するようにリモートサーバーを設定する場合、緊急用に SSH セッションを余分に一つ開いておいたほうが良いでしょう。間違えて設定をしてメインのセッションをうかり終了してしまったときにサーバーからロックアウトされないようにするためです。

PAM の設定

/etc/pam.d/sshd を編集して、以下の行を:

auth		required	pam_unix.so

次のように修正してください:

auth		required	pam_unix.so	use_first_pass

そして以下のどちらかの設定をしてください。HTTPS を使用する方法を推奨しますが、どちらを選んでもかまいません。

HTTPS を使用して検証サーバーを認証する場合

先に編集した pam_unix.so の行のに以下の行を挿入します。

auth            required        pam_yubico.so           id=1 url=https://api.yubico.com/wsapi/2.0/verify?id=%d&otp=%s

id=1 は実際には使われませんがないと動作しません。

ノート: 自分で検証サーバーを動かしている場合は、url パラメータをあなたのサーバーに置き換えて下さい。自分で検証サーバーを動かさない場合、url パラメータを省略してもかまいません。上の設定はデフォルトだからです。

HMAC を使用して検証サーバーを認証する場合

先に編集した pam_unix.so の行のに以下の行を挿入します。

auth            required        pam_yubico.so           id=1234 key=YnVubmllcyBhcmUgY29vbAo=

idkey はあなたの HMAC ID とキーに置き換えて下さい。上で書いたように Yubico からリクエストできます。

ノート:
  • HMAC 証明書はサーバーごとに固有のものです。たとえ攻撃者が証明書を発見したとしても、他のサーバーを認証するレスポンスを作成することはできません。
  • url パラメータは指定していません。デフォルトは Yubico の HTTP (non-TLS) サーバーになっています。

HMAC 証明書を権限がないユーザーが見れないようにファイルを読み込み禁止にすると良いでしょう:

# chmod o-r /etc/pam.d/sshd
ノート: 自分で検証サーバーを運営している場合、url パラメータを追加してあなたのサーバーを指定してください。自分で検証サーバーを動かさない場合、url パラメータを省略してもかまいません。

SSHD の設定

/etc/ssh/sshd_config に以下の行が含まれていること、そしてアンコメントされていることを確認してください。以下の設定はデフォルトです。

ChallengeResponseAuthentication no
UsePAM yes

テスト

PAM 設定ファイルに変更を加えただけで再起動をする必要はありません。

ログインするには、SSH の Password: プロンプトで、エンターを押さないでパスワードを入力します。そして Yubikey のボタンにタッチしてください。Yubikey は OTP の最後にリターンを送信するのでエンターキーに触れる必要はありません。

ノート: pam_unix.so から use_first_pass 行を削除することで、先に YubiKey を使ってからパスワードが要求されるようにできます。

解説

基本的なパスワード認証を行う pam_unix.so よりも前に pam_yubico.so が読み込まれるため、パスワードと OTP を連結した文字列が pam_yubico.so に与えられます。OTP は固定長なので (ここではN文字とします)、与えられた最後のN文字を OTP として、他の文字列はパスワードと認識する必要があります。OTP の認証が成功したら、パスワードは次の PAM モジュールである pam_unix.so に送信されます。ただし use_first_pass がある場合は前のモジュールからパスワードを受け取ります。

Yubikey NEO の OATH アプレットをインストール

以下の手順を踏めば OATH アプレットを Yubikey NEO にインストールすることができます。Google Play ストアの Yubico Authenticator が使えるようになります。

ノート: 以下の手順はファームウェアのバージョン 3.1.2 以下の NEO でのみ必要です。最新の NEO (と U2F) にはあらかじめ OpenPGP アプレットがインストールされています。

NEO を CCID デバイスとして設定

  1. AUR から yubikey-personalization-gui-gitAUR をインストールしてください。
  2. udev ルールを追加して再起動すれば root にならなくても YubiKey を扱えるようになります。
  3. ykpersonalize -m82 を実行して y と入力してエンターを押します。

アプレットのインストール

  • gpshellAUR, gppcscconnectionpluginAUR, globalplatformAUR, pcsclite をインストールしてください。
  • # systemctl start pcscdpcscd.service を起動します。
  • ykneo-oath サイトから最新の CAP ファイルをダウンロード。
  • GitHub から gpinstall.txt をダウンロード。
  • gpinstall.txt を編集して install -file から始まる行を CAP ファイルが置かれているパスに修正。
  • ターミナルを開いて gpshell <location of gpinstall.txt> を実行。
  • 上手く行けば、テキストが流れて、最後に以下のように表示されます:
Command --> 80E88013D7C000C400BE00C700CA00CA00B400BE00CE00D200D500D700B000DB00C700DF00BEFFFF00BE00E400AC00AE00AE00DB00E700A
A00EA00ED00ED00ED00BE00EF00F100F400F100F700FA00FF00BE00F700AA01010103010700CA00C400B400AA00F700B400AA00B600C7010C
010C00AA0140012001B0056810B0013005600000056810E0011006B4B44304B44404B44106B44B4405B443400343B002410636810E06B4B44
407326810B004B43103441003334002B102B404B3B403BB4003B440076820A4100221024405B4341008B44600000231066820A100
Wrapped command --> 84E88013DFC000C400BE00C700CA00CA00B400BE00CE00D200D500D700B000DB00C700DF00BEFFFF00BE00E400AC00AE00AE00DB00E700A
A00EA00ED00ED00ED00BE00EF00F100F400F100F700FA00FF00BE00F700AA01010103010700CA00C400B400AA00F700B400AA00B600C7010C
010C00AA0140012001B0056810B0013005600000056810E0011006B4B44304B44404B44106B44B4405B443400343B002410636810E06B4B44
407326810B004B43103441003334002B102B404B3B403BB4003B440076820A4100221024405B4341008B44600000231066820A15D848CB77
27D0EDA00
Response <-- 009000
Command --> 80E60C002107A000000527210108A00000052721010108A000000527210101010003C901000000
Wrapped command --> 84E60C002907A000000527210108A00000052721010108A000000527210101010003C9010000B4648127914A4C7C00
Response <-- 009000
card_disconnect
release_context
  • NEO を抜いて Yubico Authenticator アプリを試して下さい。

(任意) Yubico Authenticator デスクトップクライアントのインストール

Yubico Authenticator のデスクトップ版は yubico-yubioath-desktop-gitAUR でインストールできます。

Plug-up International の FIDO U2F セキュリティキー

# cat > /etc/udev/rules.d/10-security-key.rules
KERNEL=="hidraw*", SUBSYSTEM=="hidraw", MODE="0664", GROUP="users", ATTRS{idVendor}=="2581", ATTRS{idProduct}=="f1d0"
# udevadm trigger

ブラウザで U2F を有効化

Chromium/Chrome

Chromium で U2F を機能させるには libu2f-host ライブラリのインストールが必要です。Yubikey をユーザーからアクセスするのに必要な udev ルール がインストールされます。デフォルトでは root からしか Yubikey にアクセスできないため、Chromium はエラーを吐きます。

Firefox

Firefox で U2F のサポートを有効にするには、こちらのアドオン をインストールしてください。ネイティブなサポートは現在 開発中 です。

OpenPGP スマートカードモードを有効化

以下の手順を実行することで YubiKey の OpenPGP 機能を使うことができるようになります:

  1. 上に書かれているように YubiKey を CCID デバイスとして設定。
  2. pcsc-tools, ccid, libusb-compat をインストール。
  3. # systemctl enable pcscd.service# systemctl start pcscd.servicepcscd を起動・有効化。
  4. pcsc_scan を実行すると接続されているデバイスの情報が表示され YubiKey が使えるかどうか確認できます。さらに gpg --card-status で GPG からカードを利用できることを確認できます。

トラブルシューティング

Yubikey が最後に機能したときからアップデートを実行した場合、再起動を行ってください。一部の機能が問題なく動いているようでも再起動してください。