YubiKey

提供: ArchWiki
ナビゲーションに移動 検索に移動

Yubikey はワンタイムパスワード (OTP) を生成する小さな USB トークンです。Yubikey は Yubico によって製造されています。

Yubikey は USB キーボードをエミュレートして OTP をテキストとして送信するため、特別なドライバーが必要ないという利点があります。

イントロダクション

仕組み

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