YubiKey
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 鍵を書き込んで自分で検証サーバーを運営する。
SSH で2段階認証
このセクションでは Yubikey を使って SSH で2段階認証 (パスワードと Yubikey によって生成された OTP を使用) を行う方法を説明します。
要件
yubico-pam をインストールしてください。
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 は実際には使われませんがないと動作しません。
HMAC を使用して検証サーバーを認証する場合
先に編集した pam_unix.so
の行の前に以下の行を挿入します。
auth required pam_yubico.so id=1234 key=YnVubmllcyBhcmUgY29vbAo=
id
と key
はあなたの HMAC ID とキーに置き換えて下さい。上で書いたように Yubico からリクエストできます。
HMAC 証明書を権限がないユーザーが見れないようにファイルを読み込み禁止にすると良いでしょう:
# chmod o-r /etc/pam.d/sshd
SSHD の設定
/etc/ssh/sshd_config
に以下の行が含まれていること、そしてアンコメントされていることを確認してください。以下の設定はデフォルトです。
ChallengeResponseAuthentication no UsePAM yes
テスト
PAM 設定ファイルに変更を加えただけで再起動をする必要はありません。
ログインするには、SSH の Password:
プロンプトで、エンターを押さないでパスワードを入力します。そして Yubikey のボタンにタッチしてください。Yubikey は OTP の最後にリターンを送信するのでエンターキーに触れる必要はありません。
解説
基本的なパスワード認証を行う 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 が使えるようになります。
NEO を CCID デバイスとして設定
- AUR から yubikey-personalization-gui-gitAUR をインストールしてください。
- udev ルールを追加して再起動すれば root にならなくても YubiKey を扱えるようになります。
ykpersonalize -m82
を実行してy
と入力してエンターを押します。
アプレットのインストール
- gpshellAUR, gppcscconnectionpluginAUR, globalplatformAUR, pcsclite をインストールしてください。
# systemctl start pcscd
でpcscd.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 機能を使うことができるようになります:
- 上に書かれているように YubiKey を CCID デバイスとして設定。
- pcsc-tools, ccid, libusb-compat をインストール。
# systemctl enable pcscd.service
と# systemctl start pcscd.service
でpcscd
を起動・有効化。pcsc_scan
を実行すると接続されているデバイスの情報が表示され YubiKey が使えるかどうか確認できます。さらにgpg --card-status
で GPG からカードを利用できることを確認できます。
トラブルシューティング
Yubikey が最後に機能したときからアップデートを実行した場合、再起動を行ってください。一部の機能が問題なく動いているようでも再起動してください。