2017年11月26日

Yubikeyをオフラインで使う方法を考えてみる

さて、先の記事では長々と公式サイトを見ればわかるようなことを書いてしまいましたが、
Yubikeyのオフラインでの認証の利用方法を考えてみます。

一見、Yubikeyはオンラインでの利用が前提なように見えます。
実際、オンラインで利用する場合は、予め適当な認証情報が
出荷時に書き込まれているため、設定ツール無しで利用できます。
YubiCloudを使えば、無料で強固な認証システムも利用できます。

しかしながら、自PCやプログラムで使いたいといった場合、
オンライン接続必須な状況は嫌われます。その場合どうするか。

簡単なのから順に、難しいものまで考えてみました。

ちなみにですが、OTP(Static Password含む)とU2FとCCID(PIV等)は、
独立した機能であり、それぞれ有効無効が切り替えられます。確か。


※オンラインで利用できる場合、YubiCloudを使うのが一番簡単で安全です。
 出荷時に鍵が書き込まれており、利用者ですら鍵情報を知らないため。

※この文は暗号化や認証に関して全くの素人な人が書いています。
 業務等に使う場合は、専門家の意見を参照してください。


・Static Password
おすすめ度:★★★☆☆
導入容易度:★★★★★
評価: 運用方法に気をつければアリ。公式が想定した使用法の一つ。

まず、一番簡単なのはStatic Passwordですね。
Yubikeyはキーボードとして認識され、タッチすれば入力されます。
それだけだと1要素認証になるので、パスワードの先頭数文字は
手入力するようにすれば擬似的な2要素認証として使えます。

例: 5523vgdksjisnkldscmlskbcjsnckaslmkisd
  ↑手入力 ↑yubikeyに保存したパス

任意のキー入力最大38文字の他、秘密鍵で生成されたmodhex最大64文字を使うことも可能。
人間のパスワード入力の代替であれば前者、yubikey前提なら後者が安全でしょう。

キー入力を覚えさせることができるので、ユーザー名→Tab→パスワード→Enter(合計38文字以内)とすることもできます。
完全な「鍵」としての利用ならこちらも便利。

使用例
・公式で提示された使用法
・BIOSパスワード(Yubicoフォーラム)
・TrueCryptのブート時認証(Yubicoフォーラム)

利点
・プログラムや機器での特別な対応が不要。
・既存のパスワードを使うなら機器側の設定は一切不要。(yubikeyの設定は必要)
・お手軽にセキュリティ強化ができる上に、引き継ぎも楽
・嫌われがちな長いパスフレーズを覚えること無く普及させられる

欠点
・メモ帳を対象に実行すればパスワードが平文で漏出する
・鍵の複製が容易どころか、コピペですら良い
・キーロガーには全くの無力
・初期設定が必要
・もちろんリプレイ攻撃には無力
・フィッシングにも無力
・yubikeyと、手入力や他の機器との区別は不可能

結論
 信頼できる機器だけを対象として使うのであれば有効でしょう。
 ITに不慣れで、パスワードを紙に書いて管理してしまうような
 現場であればなおのこと有効性は高いです。


・Yubico OTPの固定IDの利用
おすすめ度:★★☆☆☆
導入容易度:★★★★☆
評価: あまりおすすめしない

Static Passwordは設定が必要です。
用途にも寄りますが、無設定で運用したいという場合もあるでしょう。
自ツールから鍵の書き込みもできるはずですが、それも面倒と。

Yubico OTPで生成されるワンタイムパスワードは、
全てがランダムな文字列になっているわけではありません。
(特に設定を変えていなければ、ですが)

先頭にpublic idが12文字付き、その後が暗号32文字からなります。
このpublic idは、設定を変えない限り変化せず、後半の暗号を解くための鍵を
サーバー上で探すための、いわば鍵IDの役目をしています。

つまり、先頭12文字だけを切り出して使えば、
差し込まれているyubikeyの個体識別ができるわけです。

使用例
・パスワード管理ソフトのLastPassのオフラインアクセス設定

利点
・先頭12文字を切り出して比較するだけのお手軽実装
・yubikeyは購入したての無設定でよい。(アプリ側に登録する作業は必要)
・一見ランダムな文字列に見えるので、難しそうに見える

欠点
・仕組みがバレれば簡単に漏出する
・鍵の複製が非常に容易。どころか、コピペですら良い
・キーロガーには全くの無力
・もちろんリプレイ攻撃には無力
・フィッシングにも無力
・一見強固に見えるがゆえにむしろ危ない
・yubikeyと、手入力や他の機器との区別は不可能
・独自アプリケーションの開発が必要
・英字小文字12文字(しかも各文字は16種類しかない)ってあまり強くない気がする
 ※通常のパスワードと同様に解析されたとすると、カスペルスキーいわく
  家庭用PCで2世紀、ボットネットで2日、スパコンで16分でアタック完了するとのこと。

結論
 信頼できる機器だけを対象として使うのであれば有効...?
 これ使うくらいならstatic passwordの方がまだ安全なのでは...?
 とりあえずこれでログインして、その後のサービスの利用には
 YubiCloudを使う、とかなら、UXが統一されていて便利...?


・Yubico OTPをオフラインで使う
おすすめ度:★☆☆☆☆
導入容易度:★☆☆☆☆
評価: 全くおすすめしない

Yubico OTPで生成されるワンタイムパスワードは、
public ID、private ID、暗号鍵、内部カウンタの主に4つ(+α)で構成されています。

認証の際は、yubikeyから入力されたデータを元に、
public IDから、暗号鍵, private ID, 前回のカウンタ値をデータベースから取り出します。

そして、暗号文をAES128で復号、出てきたprivate IDが一致するか、
カウンタ値が増えているか、を確認します。

これにより、本物かのチェックと、リプライ攻撃ではないかのチェックをしています。
public ID、private ID、暗号鍵は、設定ツールから設定が可能です。
(取得はできません。あくまで新規設定です)

ので、これらの情報が揃っていれば、オフラインでもYubiCloudと同等の検証が可能です。
これらの仕様は公式に公開されています。

使用例
・おそらくなし

利点
・実装は手間だが、きちんとしたワンタイムパスワードとして動作するため検証は強固
・リプライ攻撃に強い。
・キーロガーの影響もなし。
・コピペはリプライ攻撃として弾かれるのでOK
・鍵の複製は利用者からは難しい
・手打ちは実質不可能

欠点
・フィッシングに対してはさほど強くない(次に認証されるまでは有効なため)
・オフラインでの利用の場合、PC内にAES鍵等が保存されており、
 それを抽出された場合、オンラインでの認証(YubiCloud含む)にまで
 利用できるほぼ完全な複製鍵が作れてしまう
・yubikeyの設定が必要
・独自アプリケーションの開発が必要

結論
 セキュリティが保証された専用機器で使うならともかく、
 PCなどで使うにはおすすめできない。
 ほぼ完全な複製鍵が作れてしまうのが致命的な欠点。


・Challenge ResponseのHMAC-SHA1を普通に使う(共通鍵)
おすすめ度:★★★☆☆
導入容易度:★★★☆☆
評価: 用途次第

yubikeyのChallenge Responseモードを使うと、
アプリケーションがChallengeを送信し、yubikeyからResponseを受け取ることができる。

応答は、あらかじめyubikeyに書き込んでおいた共通鍵と、
アプリケーションが渡すChallengeから生成されるハッシュとなっている。
それにしか起因しないので、Challengeが同じであれば、同じ結果が帰り続けるし、
共通鍵を揃えておけば違う個体でも同じ結果が帰る。

使い方としては、アプリケーションとyubikeyに予め同じ共通鍵を記録させておき、
認証が必要になったら、適当な乱数をyubikeyに送る。
帰ってきたら、自分の手元で計算した結果と同じかどうかをアプリケーションが検証。
同じならOKと言った形。

公式いわく「無人モード」「ドングルモード」と呼ばれていて、
実際、今までの方法とは違い、ユーザーがyubikeyをタッチする必要はない。
(タッチする必要があるように設定を変えることもできる。)

また、継続的に監視でき、突如別のyubikeyに差し替えられても検出できる。
(シリアルナンバーでも監視できるが、シリアルナンバーは不可視にできるので不確実)

使用例
C#でYubikeyのChallenge Response認証を行なうプログラム

利点
・実装は手間だが、きちんとしたワンタイムパスワードとして動作するため検証は強固
・リプライ攻撃に強い。
・キー入力ではないのでキーロガーの影響もなし。
・同じくコピペも手打ちも原理上不可能
・鍵の複製は利用者からは難しい
・フィッシングも無効
・Yubico OTPの鍵とは独立しているので、秘密鍵が漏出しても影響範囲が小さい

欠点
・オフラインでの利用の場合、PC内に共通鍵等が保存されており、
 それを抽出された場合複製鍵が作れてしまう
・yubikeyの設定が必要
・独自アプリケーションの開発が必要

結論
 信頼できる機器だけを対象として使うのであれば有効でしょう。
 秘密鍵の管理が重要になります。これが漏れると大変なことに。
 常にさして置かなければいけない、といったポリシーを適用するならその方向には有効。
 Static Passwordの次くらいにおすすめできる程度


・Challenge ResponseのHMAC-SHA1の次レスポンスを記憶しておく
おすすめ度:★★★★★
導入容易度:★★★☆☆
評価: 十分にあり。公式サンプルにある。

Yubico公式のWindowsログオンサンプルは少々面白い方法を使用しています。
Challenge Responseモードの「Challengeが同じであれば、同じ結果が帰り続ける」という
特性を活かし、以下のような手順で認証しています。

登録
1. まず、Yubikeyに適当なChallenge(0)を投げる
2. Yubikeyから帰ってきたResponse(0)と、Challenge(0)を記録しておく。
 これで登録完了。

認証(初回はn=0)
1. 前回使用した、Response(n)のわかっているChallenge(n)をYubikeyに投げる。
2. Yubikeyから帰ってきたResponse(n)と、手持ちのResponse(n)を比較する。
3. 一致していたら認証は完了だが、次回に向けた再登録処理を続ける。
4. 次回の認証のために、Yubikeyに新たに別の適当なChallenge(n+1)を投げる
5. Yubikeyから帰ってきたResponse(n+1)と、Challenge(n+1)を記録しておく。
6. 次回は(n+1)を使って認証する。

どうですか?このシンプルな仕組み。
認証する側はHMAC-SHA1を処理する必要すらありません。

オンラインではスニッフィングされると無意味ですが、オフラインのUSB経路で
そうなる可能性が非常に低いとするならば、非常に頭の良い実装だと思います。
Yubikeyに触れないで処理が進む、「ドングルモード」ならではの実装でもあります。

使用例
公式のサンプル解説

利点
・実装が容易な上、きちんとしたワンタイムパスワードとして動作するため検証は強固
・リプライ攻撃に強い。(USBパケットが抜かれていない限り)
・キー入力ではないのでキーロガーの影響もなし。
・同じくコピペも手打ちも原理上不可能
・鍵の複製は利用者からは難しい
・フィッシングも無効
・Yubico OTPの鍵とは独立しているので、秘密鍵が漏出しても影響範囲が小さい
・共通鍵をPC側に持たないため、漏出の心配がない
・ハッシュが漏出したとして鍵を求めるのは非常に困難

欠点
・yubikeyの設定が必要
・独自アプリケーションの開発が必要
・何らかのエラーでResponseとChallengeが破損するとロックアウトされる
 (認証の度書き換わるため)

結論
 オフライン認証は多分これが一番バランス取れていると思います。


・FIDO U2Fを使う
おすすめ度:?????
導入容易度:?????
評価: 未評価

筆者が理解できていないため、残念ながらろくに書けないのですが、
一応調べた情報だけ書いておきます。

FIDO U2Fも結局のところ、一種のChallenge-Responseです。
登録時は、Challengeを送ると、Yubikey内に秘密鍵・公開鍵ペアが生成されます。
そして、秘密鍵により署名された公開鍵と鍵ID、Challengeが帰ります。

認証時はChallengeと鍵IDを送ると、Yubikeyから秘密鍵により
署名されたChallengeと鍵IDが帰ります。

認証する側は、公開鍵と鍵IDを持ち、Yubikeyは秘密鍵を持ちます。
※実際にはどうやら、Yubikeyは秘密鍵を持たず毎度生成しているようです。

オンラインでも利用できる以上、オフラインでも利用できるはずです。
(実際、sudo時にU2Fを要求する実装があるようです)

Challenge Responseモードと比較すると、公開鍵による検証が可能なことと、
Yubikeyの設定が不要なこと、安価(2000円くらい安い)なFIDO専用キーが利用できる利点があります。
さらに、原理的に実質無限のサービスを登録できます。

欠点は... どうやって実装しているんだろうなぁ、って思うくらいですかね...
個人的に導入が難しそうだと思います。(出来合いのものを使うならともかく
)

U2FHIDの仕様に従って実装すればできそうです。
Python向けライブラリもあるようですので。

使用例
・LinuxのPAM

・PIV・PGP スマートカード認証
おすすめ度:?????
導入容易度:?????
評価: 未評価

これも筆者が理解できていないため、残念ながらろくに書けないのですが、
一応調べた情報だけ書いておきます。

今まで、Yubikey自体は何の保護もない、差し込まれれば認証情報を渡すタイプの
認証方式を紹介してきましたが、PIVは違います。

Yubikeyには、スマートカードとして、デバイス内部で4個(Yubikey4だと24個!)までの
秘密鍵を生成・保持する機能があります。
また、既存の秘密鍵を入れることもできます。

この秘密鍵は、PIN(暗証番号)で保護され、3回間違えると鍵情報がロックされます。
その状態で、管理者PUKを3回間違えると永久にロックされる。

USB通信の経路上も暗号化されて通信するようです。

SSHの認証や、Windowsのログオン、リモートデスクトップの認証、PGPなど、
かなり色々使えるようです。
自分のソフトウェアで認証に使うのももちろんできるでしょう、多分。

自己署名についてのいろいろがよくわからない...
公開鍵を用意し?秘密鍵を使って証明書署名要求を生成(署名)し?
秘密鍵を使って証明書署名要求にさらに署名して、証明書を生成する?

使用例
・LinuxのPAM
・その他色々


参考文献
ワンタイムパスワードトークンYubiKey |(株)ソフト技研
https://yubikey.yubion.com/yubikey_lineup.html

Yubico Forum • View topic - Challenge-response mode - FAQ :
https://forum.yubico.com/viewtopic.php?f=4&t=632

二要素認証に使われてるYubico OTP の仕組み - 試運転ブログ :
http://otameshi61.hatenablog.com/entry/2016/12/30/211358

Windows Helloに対応したセキュリティ認証デバイス「Yubikey」の使い勝手を試してみた – Dream Seed :
https://www.dream-seed.com/weblog/review/yubikey

spp5: C#でYubikeyのChallenge Response認証を行なうプログラム :
http://spp5.blogspot.jp/2013/03/cyubikeychallenge-response.html

秘密鍵、管理してますか? YubiKeyで鍵の一元管理とSSH接続、2段階認証の高速化を試す - Qiita :
https://qiita.com/dseg/items/77d77467970b1b510285

My Work Day Reflects YubiKey's Flexibility | Yubico :
https://www.yubico.com/2015/03/employees-day-showcases-yubikeys-flexibility/

spp5: YubiCloud認証プログラムを作る :
http://spp5.blogspot.jp/2012/06/yubicloud.html

YubiKeyManual_v3.4.pdf :
https://www.yubico.com/wp-content/uploads/2015/03/YubiKeyManual_v3.4.pdf

YubiKey - もわの書斎 :
https://mowa-net.jp/wiki/YubiKey#Yubico_OTP.2BMG5O1WnY-

Yubikey 4 にSSHの秘密鍵を格納する – n10の個人的なメモ :
http://mirahouse.jp/n10/2017/08/29-121537.html

yubikeyでセキュリティ筋力を鍛える ・ JoeMPhilips : http://joemphilips.com/post/yubikey_setup/

YubiKeyのPIVカードでSSHする - cuspy diary :
http://www.cuspy.org/diary/2015-08-11-yubikey-piv-ssh/

YubikeyのPIVを使ってsshしてみる - 試運転ブログ :
http://otameshi61.hatenablog.com/entry/2017/05/21/144208

家にssh鍵を忘れるという概念 - hiroqnの日記 :
http://hiroqn.hatenablog.com/entry/2017/09/02/213519

RSA鍵、証明書のファイルフォーマットについて - Qiita :
https://qiita.com/kunichiko/items/12cbccaadcbf41c72735
posted by gpsnmeajp at 23:58| Comment(0) | TrackBack(0) | 雑感
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/181685678
※ブログオーナーが承認したトラックバックのみ表示されます。
※言及リンクのないトラックバックは受信されません。

この記事へのトラックバック