おうちで作れる生体認証システムのご提案

これは VOYAGE GROUP Advent Calendar 2015 の 21 日目のエントリです。

みなさん認証 [1] してますか? ご多分に漏れず僕ももちろん認証させていただいております。日々認証ですね。

認証の「要素」 (factor)

さて、認証が認証であるために必要な要素 (factor) ——その人があるサービスを受けるに値する人本人であるらしい、と断定するに足る要素——として、以下の 3 つが挙げられます。

  • 記憶 (Something you know) : パスワードなど
    • 漏洩、使い回し、総当たり、推測などの脅威に対して脆弱
  • 所有 (Something you have) : カードキー、TOTP (Time-Based One Time Password; RFC 6238) による認証、SMS による認証など
    • 紛失、盗難などの脅威に対して脆弱
  • 生体 (Something you are) : 指紋など
    • ユーザー側に物理的な認証デバイスがほとんど必須
    • 生体情報は不変かつ個人を一意に特定するため、プライバシー上のリスクが高い
    • 身体機能の欠損といった脅威に対して脆弱

これらの要素を複数組み合わせた認証を、「多要素認証」 (MFA; Multi-Factor Authentication) と呼びます。また、特に二要素を組み合わせたものについては「二要素認証」(Two-Factor Authentication) としてよく知られています。

要素の組み合わせですから、「記憶」 + 「記憶」のような認証——たとえば「パスワード」 + 「暗証番号」による認証は、「記憶」の単一要素のみの認証となりますから、「多要素認証」や「二要素認証」と呼ぶことは適切ではありません [2]

多要素認証のメリット

先述したように、それぞれの認証要素にはデメリットがあります。複数の要素を組み合わせることで、それぞれのデメリットを補うというのが多要素認証の目的です。

一つの認証符号が破られた場合でもリスクを低減することができる、というのは単一要素による複数回の認証と同じですが、多要素認証にはそれぞれの要素にリスクが分散するという重要なメリットもあります。

たとえばカードキーなどを用いた「所有」による認証は盗難や紛失等の脅威に弱いことで知られていますが、本人確認のパスワードなどによる「記憶」と組み合わせることで、全体の認証システムにおけるリスクを抑えることができます。これが「記憶」ではなく複数の「所有」による認証、たとえば複数のカードキーを用いた認証では、すべてのカードキーが盗難や紛失といった脅威に対して脆弱であるため、複数要素に比べてリスクを軽減しにくいという欠点があります。

一般家庭による認証の問題点

認証に関する基本的な知識をおさらいしたところで、ご家庭において一般的に採用されている認証にどういった脅威があるか考えてみましょう。

一般的なオートロックマンションを想定した図が以下のとおりです。

オートロックと玄関ドアのふたつの認証機構によって家が守られていることがわかります。が、オートロックも玄関ドアも物理的なシリンダー錠用の鍵によって解錠することができますから、これは「所有」といった単一要素のみによる複数回の認証であるということになります。

オートロック用の鍵と玄関ドア用の鍵は同一なこともあれば別なこともあります。しかしながら、鍵が別々であったとしても、ほとんどの人は一緒にまとめて持ち歩いているのでしょうから、残念ながら盗難や紛失といった脅威に対するリスク軽減はほとんど期待できないと言えるでしょう。

これは困ったことになりました。我が家には価値のある情報資産 [3] がたくさんあります。しかし肝心の認証機構がこのような脅威にさらされているというのでは不安で仕方がありません。

※なお、家には他にも窓からの侵入による認証機構の回避、盗聴やゴミ漁りによる情報漏洩、鍵穴の溶接やバリケードの設置などによるサービス拒否 (DoS)、放火等による改竄、といった脅威が存在しますが、あくまでも本エントリでは認証にフォーカスを当てたいと思います。本エントリで説明するものを含むこれらの脅威について不安がある方は、お近くの警察官や警備員にご相談ください。

生体認証を手作りしてみる

そこで今回提案したいのは生体認証機構の導入です……が、ざっと Web 検索してみるだけでも数十万円ほどする高級品ばかりで、我が家が所有する情報資産の価値に見合うセキュリティ対策にはなりそうもありません。

現実に見合うものを、ということで、どこのご家庭にもありそうなものを使って手作りしてみることにします。

必要なものは、

  • 以下をインストールしたマシン一台
    • 現時点の最新版の Google Chrome もしくは Mozilla Firefox [4]
    • Node.js (v4.2.3 LTS で動作確認しています)
  • 犬一頭

それから、スマートロックが必要です。僕は Ninja Lock を使ってみましたが、 Web 経由で操作できる機能を持つスマートロックであればなんでもいいと思います。これに関してはどこのご家庭にもあるとは限らないので購入と設置はしておいてください。

……さて、準備はできましたか?

0. 作るものの概要

以下の図のようなものを作ります。

我が家の犬 (名前は教えてあげないよ) は知らない人が入ってくるとよく吠えます。持ち前の耳のよさでドアの開閉状況を素早くキャッチし、なんらかの根拠に基づき人間の素性を確認し、そして見知らぬ人間であるとわかるとがむしゃらに吠えまくるのです。さながら番犬のようですね。

犬は我々の生体情報のなにか (声とか匂いかな) によって人間を判別しているのでしょうから、これも立派な生体認証であると言うことができます [5]

部屋の中には後述するようにご家庭の Node.js によるサーバと、そのサーバ上の Web ページを表示したご家庭のブラウザを立ちあげたままの状態にしておきます。 Web ページ上で読み込まれた JavaScript では Web Audio API を使用しており、マイクから拾ってきた音声が特定条件にマッチするかどうかを一秒おきに判別しています。

ここまで準備ができれば、以下の手順によって遠隔で鍵が閉まることになります。

  1. Web Audio API を用いて入力された音声データが特定条件にマッチするかどうかを確認する
  2. マッチする場合はご家庭の Node.js によって書かれた Web サーバに対して POST する
  3. POST された Web サーバは Ninja Lock の Web サーバ [6] にログインをしたのち、 Web ページ上にある鍵を閉めるためのボタンを押下する
  4. 鍵が閉まる

これで、攻撃者が鍵 (所有) を開けたとしても、ドアを開ける前に犬が吠えてくれれば (生体) 鍵がすかさず閉まるような状態になります。おっしゃ多要素!

いや、あの、本当は、家の内側にある扉にも鍵がないといけないとは思いますが、我が家にはそんなものはないので、本当はそういうスマートロックを買わないといけなかったという話なのです。みなさんで手作りする場合はそのあたりお気をつけください。

1. ご家庭の Node.js による Web サーバと Web Audio API を利用した Web ページの準備

サンプルのコードを以下のリポジトリに置いておきます。ただし Ninja Lock を叩く部分のコードはどうしても危なっかしくなるので削らせていただきました。まあそのあたりを手作りするのも楽しみのうちということで (過剰な試行回数にならないよう気をつけて実装してください)。 https://github.com/co3k/dog-authenticator

まずもろもろの依存ライブラリ等を make install を叩いてインストールし、 src 以下をいい感じに書き換え、手を加えたら make build してください。

サーバ側で Ninja Lock を叩く部分も、クライアント側で Web Audio API を使う部分もさして難しいものではありません。

難しいのがどういう条件の音声にマッチさせるか、という部分です。 AnalyserNode さえ使えれば波形データが取れるので、これならきっといい感じにしてくれているだろうからまったくの素人でもノー勉強でそれっぽいことができるはず、と高を括っていたのですが……

  • getByteFrequencyData() によって取得できた波形データの配列のうち、 0 以上の値を持つ要素数と、その平均を出す
  • あらかじめ録音しておいた鳴き声をベースに、いい感じの閾値を設定する

という強引な対応をしてお茶を濁すハメになりました。この程度の雑な実装では容易にフォルス・ポジティブとなってしまうので、たとえば簡単に思いつく限りでも、以下のような改善策ができそうではあります。

  • getFloatFrequencyData() を使った方が絶対にいいでしょ
  • 安易に平均化とかせずに波形の特徴量によるマッチングをおこなう
  • 何回かサンプルを取ったうえで判定した方がいい
  • 一秒に一回、はちょっと間隔が開きすぎ

が、ひとまず今回はコンセプトのみということで、現状のような実装となりました……

2. Web サーバを立ちあげてご家庭のブラウザでページを表示する

以下のコマンドを叩けば http://localhost:8887/ でページが開けるようになるはずです。

$ make server

あとはご家庭の Google Chrome かご家庭の Mozilla Firefox でページを開いた後、放置するだけです。

3. 実際に動いている様子

動画に撮りましたので是非ご覧ください。

この認証の利点と問題点

利点

そもそも攻撃者に認証を突破されて家の中に入られるという事態は、犬にとってもピンチなわけですから、犬自身の手で、いや声で、身の安全を確保できるというナイスシステムなわけです。

また一般的によく知られる生体認証とは異なり、生体情報をデジタルデータとして保存しないという特徴があります。犬がもしさらわれてしまったとしても [7] プライバシー上機微な情報の漏洩には繋がりません。

どこのご家庭にでもいる犬にご活躍いただくため、初期導入コストが低いというのも非常に魅力的です。

あと、まだ試していないのでわかりませんが、結構な身体機能が欠損したとしても、ちゃんと本人確認してくれるんじゃないでしょうか。そう、愛さえあれば……

問題点

容易にフォルス・ポジティブとなる現状の実装上の問題、あと容易にこの認証機構を回避できる我が家の構造上の問題を解決できたとしても、以下の問題は引き続き残留することになるでしょう。

攻撃者が近くに犬を繋ぐことによる DoS

攻撃者が近くに犬を繋ぐことにより、その犬の鳴き声に認証機器が反応してしまう可能性があります。果たして犬にも人と同じように声紋というものがあるのかどうか、寡聞にして知らないのですが、一般家庭でカジュアルに実装できる範囲を超えそうな気がしています。

でも冷静に考えてみると、人の家に侵入するような悪い奴が犬を飼うわけがないですよね! なんか大丈夫かもしれない……!

犬が別な目的で吠えることによる DoS

というか前述の動画の鳴き声なのですが、検証のために僕が外に出たことによって鳴いてしまっています。したがって、そのタイミング次第では、家を出ようとすると犬が吠え鍵がかかり出られなくなる、いわば外の世界に対する DoS になりかねません。

ゴメン。ほんとゴメン。仕事に行ったりしてゴメン。あと検証のために 3 回くらい外と中を往復したりしてゴメン……。

とはいえ

まああの、割とジョークな感じのエントリなんですけど、家に対する非常事態に犬が頑張ってくれているところを技術で手助けしてあげる、みたいなのはちょっと夢がある話かもしれません。できれば頑張って実用化したいなあ。

私信

ところで、我が家の玄関ドアの形状では Ninja Lock が取り付けられなかった [8] 、みたいなオチがつくわけなんですけど、僕のリアルな知り合いの方でほしい方がいらっしゃるなら譲らせていただきたく! ご連絡お待ちしております。

次のアドベントカレンダーは

次の担当は、弊社自慢のアイドル jewel です! 我が家の犬の次に好きです! ねえねえ、だから Ninja Lock いらない???????

[1]本エントリの「認証」はすべて本人認証 (資格認証も含む) の意です。
[2]「多段階認証 (二段階認証)」? 知らない子ですね。
[3]……えっと、通帳とか。
[4]他のご家庭のブラウザでも動作する可能性はありますが、僕の手元では確認していません。
[5]言うことができるんです!
[6]本当は Web サーバを内蔵しているスマートロックがあれば一番よかったんですけど、まあメンテとかいろいろ厳しいですね。
[7]そんなひどいことをするのは誰だ! 許さん!!
[8]アタッチメントがたくさん売っているみたいなんですけど、ちょっとそういう感じで解決できそうな問題ではなく……
comments powered by Disqus

Recently entries