「二段階認証…?」と言わないためのMFA入門 --- あるいはIDシステム地獄への案内

はじめに

さて、7 Payの社長が2段階認証知らなかった問題が良い感じに炎上していますね。 個人的には常に知っておく必要が絶対あるかというと専門分野の問題があるから議論の余地あるとして、セキュリティの問題で会見するなら部下にちゃんとレクさせろよ、とは思う。

7 PayとMFAの話は下記の動画でも話したんですが、7 Pay云々は忘れて「そもそもMFAってなに?」ってところをもう少し整理してまとめていきたいと思います。

www.youtube.com

認証と認可

まずはおきまりの「認証(Authentication)」と「認可(Authorization)」の違いです。

日本語で書いても英語で書いてもややこしいのですが、「認証」とは「Identify」すなわち誰であるかの確認です。対して「認可」は「Access Control」すなわち誰に何をさせる事を許可するか、という事です。

基本的にはMFAは「認証」の技術ですがアクセスコントロールとも実際には絡みます。

二段階認証? 二要素認証? 多要素認証? 2FA? MFA?

二段階認証(2-Step Verification)と呼ばれることが多いですが、2FAあるいは多要素認証(Multi-factor authentication/MFA)と呼ぶこともありますよね?

そもそもこの違いが分かりますか? 基本的には「結果として」同じことを指しますが、1つ以上の認証要素(つまり1種類でも良い)を2回重ねるのが2段階認証で必ず2つ以上の要素を使うのが多要素認証---すなわちMFAです。

定義的に二要素認証は必ず二段階認証ですがその逆は真では無いので要注意です。

では、「認証要素」とは何でしょう? セキュリティ情報の定義を調べるのに便利なNISTの「電子的認証に関するガイドライン(EN, JP)」には以下のように定義されています。

3 つの認証の基本要素

  • Something you(they) know/本人だけが知っていること
  • Something you(they) have/本人だけが持っているもの
  • Something you(they) are/本人だけが持っている特徴

Something you knowは「知識要素」とも言います。本人だけが知ってることつまりパスワードや秘密の質問が典型的な知識要素です。

生年月日や電話番号、親の氏名などもここに含まれはしますがこれらは友人知人はもちろんSNSを介して多くの人が知っているほぼ公知の情報です。

そのため、単独で認証に使うのは弱いでしょう。今回、7 Payで問題になってるのはこれを単独で使ってるからですね。

Something you haveは「所有要素」とも言います。分かりやすいのは昔銀行とかで配ってたセキュリティカード(乱数表カード)ですね。

他にもスマートフォンを用いたSMS認証やメールアドレスによる認証もこれに入ります。二段階認証と聞いて多くの人がイメージするのは今は多分これかな?

他にも端末認証やGoogleのTitanみたいなセキュリティキーやRFID/磁気カードによるスマートカードスマホや専用デバイスを使ったOTPもここに含まれます。あと、自宅とか。

Something you areは「生体要素」とも言います。いわゆる生体認証ですね。スマホ指紋認証に対応したのを皮切りに今では顔認証とかも結構一般的ですよね。他にも静脈認証とか虹彩認証もあります。

これを組み合わせて認証を行うのがMFAです。つまり、パスワードの後に第二パスワードや秘密の質問を聞くようなパターンは「二段階認証」ではあっても、「二要素認証」ではありません。

なんで、多要素が必要なの?

さて、なぜ多要素認証が必要でしょうか? それは単純に複数の要素を同時に揃えるのは難しいからです。

7 Payを例にとってみましょう。7 Payではパスワードやメールアドレスの変更に必要な認証として「ID(現在のメールアドレス)」「電話番号」「生年月日」というとても弱い知識要素を使って本人認証をしています。

なので、容易に攻撃されるわけですがパスワードなどが使えないかつ重要度の高い操作を行うときの鉄板は「変更用URLを登録済みのメールアドレスまたは電話番号のSMSに送信する」ですよね? これは基本情報処理試験にも載っているごく初歩的なテクニックです。

MFAという言葉が無い時代から使われていますが、これは「メールアドレスという所有要素」を足しているMFAなんですね。このように本人確認に複数要素を使うのは一般的で金融機関だと「家に郵送する」という手段によって「自宅」という所有要素を確認するケースも多いです。

同じ要素による二段階認証がなぜセキュリティ的に微妙かというと「同じ手段で抜かれてしまう可能性が高い」からです。例えば、現代は正しいIDとパスワードの組み合わせは普通に流出しているので攻撃者は把握していますが、同じ知識要素である秘密の質問や第二パスワードも同じ手段で抜かれる可能性が高いです。

そのため、違う系統の要素を足すことで効果的にセキュリティを高めようというのが基本的な発想です。

認証要素の組み合わせに関しては、こうしす!さんの「イマドキの小学生は「多要素認証」を正しく使いこなすらしい 」が分かりやすかったです。

www.atmarkit.co.jp

MFAとリスクベース認証とCAAC

MFAそのものでは無いのですが、MFAと合わせて使われる技術としてMFAとCAACがあります。 ついでなのでこれも簡単に説明します。

リスクベース認証

リスクベース認証とは、怪しい振る舞いをしたユーザ認証に対して追加の認証用を加える仕組みです。

例えば、5分前までに日本でログインしたのに次のアクセスがいきなりアメリカだとおかしいですよね? このように強い認証基盤には不正検知(Fraud detection)が必須です。 不正検知は時間やGeo Locationを利用した仕組みが基本だとは思いますが最近はAIなども活用されてかなり高度な分野です。 加えて、現代のセキュリティの常識として「攻撃者は正しいIDとパスワードを知っている」という前提があります。なので、単にブルートフォースを単純に弾けば良いという物でもなくなってきておりいかに「怪しいログインであるか?」を特定するのが鍵となってきています。

でも、怪しいけど正しい動作のこともありますよね? 5分でワープは出来なくても次の日にアメリカに行くこともあるでしょう。普段と違ってカフェの公衆WiFiから繋ぐかもしれません。いつもとは違うPCを使うことだって当然ありますよね?

なので、不正検知により「リスクのある認証」と判定した物は追加の認証を行うのがリスクベース認証です。この時に別な要素、例えばSMS認証とかOTPを使う事が一般的だと思うのでMFAとも大きく関連する技術要素です。

Context-Aware Access Control(CAAC)

アクセスコントロールというと昔からロールベースアクセス制御 (RBAC)とかあるわけですが、ロールだけではなくコンテキストをより適切に見ていこうという認証方式です。

コンテキストとはアクセス時にダイナミックに決まる情報なのですが、まあザックリ書くと

  • 誰が
  • どのデバイス
  • どこから
  • どのシステムの
  • どの操作をするか

といった複数の要素を加味してアクセス権を付与する方式です。

この辺、実装が先行してる気がしていて学術的な定義があるんだか無いんだが分からん感じです。論文だとこの辺りだと思いますが、普通にGoogleのCloud IAPやAzureADの「条件付きアクセス」ですね。

この仕組みの良いところは、人が同じでもアクセスしてる場所や対象機能が異なれば権限を変えれる事です。なので、例えば同じ人でも会社からアクセスする時と自宅からアクセスする時で権限を変更できるんですね。 しかも、通常はリスクベースの認証と組み合わせて自宅などから作業するときは認証を追加することも可能です。

ロケーションとかを加味せずに例えば同じアカウントでも明細を見るときはパスワードだけで良いけど決済機能を使うときはOTPを経由する、みたいなのも一般的な実装になってきたと思いますがこれがRBACの範疇なのかCAACに含まれるのか勉強不足で判断が出来ないです。。。詳しい人の解説を求む。

IDシステムを自作するのは止めよう!

読んで分かる通りMFAというか認証システムは奥が深いです。とりあえず関連することを図にしてみましたが特に認証がAIとか必要だしやること多い。アクセスコントロールも実装は状態遷移複雑でめんどそう。 f:id:pascal256:20190706151859p:plain

MFA周りは実はライブラリも充実してるしどうとでもなる気はしますが、真の闇は不正検知とリスクベース認証です。 この辺りを真っ当に運用するためには相当の技術と監視体制が必要です。国内外を問わず昔からtoCのサービスを出してる所は内部にそれなりのコストをかけて仕組みを作っています。戦いの歴史なので。

でも、スタートアップはもちろん大手企業ですらいきなりそのレベルの仕組みを作るのは困難だと思います。何しろ「認証システムなんてビジネス的にはどうでも良い」事がほとんどでしょうから。。。

そんなところに予算を積むほうがおかしいです。なので、特別な理由が無い限りは自作はやめましょう。

エンタープライズシステムならAzureADなどのIDaaSに乗っかるのが一番です。何しろMSは「世界で2番目にアタックされてる組織」なので投資規模が計り知れないです。とりあえずSAML2対応しとけばなんとかなる。

コンシューマーはベストプラクティスがまだなくて、CIAM(Customer Identity Access Management)という言葉もで始めてるようですが代名詞的な製品はまだ無い気がします。 とりあえず、Google/Twitter/Github/FacebookあたりのSNS認証を使って自前では認証を作らないのが基本でしょうか? 独自ID作りたいのは分かるけど「認証の不正検知を作り込む予算と時間を得るまで」我慢しましょう。

まとめ

さて、MFA周りについてざっと書きましたが如何でしたでしょうか。今回はFIDOがどうとか規格/実装側には触れず概念的なことを中心に書きました。 とりあえず大事なこととしては「MFAの要素として如何ありそれを複数個組み合わせるのが重要!」ですね。

  • Something you(they) know/本人だけが知っていること
  • Something you(they) have/本人だけが持っているもの
  • Something you(they) are/本人だけが持っている特徴

あと、不用意に自前で認証システム作るのは脆弱性の元だからやめましょう!

それではHappy Hacking!

参考