YubiKey

提供: ArchWiki
2015年2月5日 (木) 16:20時点におけるKusakata (トーク | 投稿記録)による版 (ページの作成:「Category:セキュリティ en:Yubikey Yubikey はワンタイムパスワード (OTP) を生成する小さな ...」)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

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段階認証

ノート: 参照: http://code.google.com/p/yubico-pam/wiki/YubikeyAndSSHViaPAM

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

要件

必要なパッケージは AUR にあります。SSH で2段階認証をするのに必要なパッケージは yubico-pam-gitAUR です。このパッケージは以下のパッケージに依存しています:

全てのパッケージをインストールしてください。

ノート: 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 の最後にリターンを送信するのでエンターキーに触れる必要はありません。

ノート: If you remove use_first_pass from the pam_unix.so line, you can just use your YubiKey first, then it will prompt for your password after the YubiKey line.

解説

This works because the prompt is pam_yubico.so's one, since this module is before pam_unix.so, which does basic password authentication. So, you are giving a string that is the concatenation of your password and the OTP to pam_yubico.so. Since the OTPs have a fixed length (let us call this size N), it just has to get the last N characters to retrieve the OTP, and it assumes that the other characters at the start are the password. It tries to validate the OTP, and in case of success, sends the password to the next PAM module, pam_unix.so, which was instructed not to prompt for the password, but to receive it from the previous module, with use_first_pass.

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

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

ノート: These steps are only for NEOs with a firmware version <= 3.1.2. The current generation NEOs (with U2F) come with the OpenPGP applet already installed)

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

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

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

  • gpshellAUR, gppcscconnectionpluginAUR, globalplatformAUR, pcsclite をインストールしてください。
  • sudo systemctl start pcscd pcscd を起動します。
  • 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 アプリを試して下さい。