コラム - お役立ち情報

2022.06.01

システムの【認証】って安全なの?

「認証」とは?

コンピュータシステムを利用するとき欠かせない「ログイン」。
サインイン、と呼ばれることもありますがどちらも「認証」を行うための行為です。
今システムを触ろうとしているあなたが、システムに登録されている人物リストの中の誰であるかを照合すること、これが認証です。

システムの心臓部であるサーバに直接侵入されてデータを丸ごと盗まれてしまうようなケースは別として、利用者がシステムを利用しようとする通常の手順を装って、利用を許可されていない(=ユーザアカウントを発行されていない)人物がログインを試みる、こういう行為を「不正ログイン」と呼ぶことにし、以下不正ログインについての耐性を考えてみます。

パスワードの歴史

コンピュータシステムの初期から現在に至るまで広く使用されてきたスキームは【ユーザID】と【パスワード】を組み合わせで使用する方法です。
ユーザIDが個人特定の申告であり、非公開の秘密情報であるパスワードを「知っている」ことが本人であると証明する根拠としています。
この方式は実に永い間大きな問題もなく使用されてきました。
千夜一夜物語でアリババの「開けゴマ」のエピソードは既にパスワードを使用していたことを示しています。
スキームとしては同じままであっても、パスワードを長くしたり、パスワードに使用される文字種類を数字・大文字小文字・記号を混用することを強制したりすることでパスワードスキームは今日でも使われ続けています。

状況が変わってきたのは専用の端末を使用せず、PCやスマートフォン等の汎用機を端末として使用し始めてからです。
ログインしたいシステムを人間ではなくプログラムから操作できるようになったため、例えばパスワードを 0000 から始めて 9999 までの1万回の試行をあっという間に行わせることができるようになりました。
またインターネット上で動作するWebアプリケーションが遠隔地からの攻撃を容易にしている側面も攻撃の増加に寄与しています。

不正ログインの方法

1万回の試行のような総当り方式の攻撃をBFA(Brute Force Attack)と呼びます。
Bruteは「野蛮人」「けだもの」のような意味があり、「知性を使わず力ずくでパスワードを当てる攻撃」がBFAです。

BFAよりも「知的」な攻撃方法として「辞書アタック」と呼ばれる方法もあります。
世界でパスワードとして使用される頻度の高い文字列のセットが裏社会で販売されており、不正ログインを試みようとする者がこれを使用してログイン試行すればBFAよりもパスワードを当てる確率が高くなる、というものです。
調査会社のレポートによれば、ここ数年変わらず世界で最も多く使用されているパスワードの筆頭が
 ・password
 ・123456
 ・123456789
 ・12345678
 ・qwertyuiop ←キーボードのアルファベット最上段
のようなものだそうで、実際にこんなパスワード使っていたら辞書アタックの餌食になってしまいます。

対抗手段は・・・

BFAへの対抗手段もなかなか力ずくで、
 ・パスワードを長くする:長さに応じて指数関数的に当てるまでの時間が増えます
 ・パスワード不一致を一定回数連続発生させたらユーザをロックして使用不可にする
 ・パスワード不一致を一定回数連続発生させたら応答時間を長くしてBFAの次の試行を妨害する
等の仕組みが考案され、実装されてきました。

これらの対策には副作用もあります。
 ・長いパスワードは覚えにくいのでメモに書かれたりする頻度が増し、漏洩の危険がかえって増える
 ・同じく、長いパスワードを強制すると覚えやすい文字列が選ばれる傾向が高まる
  辞書攻撃にヒットしがちな文字列が採用されやすくなる
 ・攻撃者がBFAでユーザをロックさせてしまうと本来の使用者に迷惑がかかる
 ・どの対策もReverse-BFA(逆BFA攻撃)に対して効果がない
  ※ありがちなパスワードを使用しユーザIDを総当たりで変えながらログインできるアカウントを探す方法。
   同じIDでログインを1回しか試行しないのでロックされない。

「2段階認証」の必要性

そこでパスワードを長くするのも実用的には限界があるので、追加の情報で「認証」の精度を高めようという動きが出てきます。
例えばログインは通常のIDとパスワードだけで行いますが、システムの中で重要な機能、ネットバンキングでの振込のような行為のときだけ「第2パスワード」の入力を必要とする方式。
他にはユーザ登録時に「秘密の質問」を登録しておき、ログイン時にパスワードに続いて秘密の質問に答えさせる方式。
これらは総して「2段階認証」と呼ばれます。
2段階認証はパスワードを長くしたのと同じような効果がありますが、単に1パスワードを長くするよりは覚えやすく利用者の抵抗が少ないという利点があります。

ログイン時に読みにくく加工された画像が表示されて、その中から文字を拾って入力させる CAPTCHA というものを見たことがあるかも知れません。

これは2段階認証ではなく、ロボットプログラムが代理でログインするのを防ぐための機能です。BFAにはある程度の効果が期待できますが、最近の攻撃者は人工知能の文字認識機能を使ってCAPTCHAを読んでしまうという事例もあるそうです。

どんな対策をしようと、パスワードを使っている以上逃れられないリスクがあります。それがフィッシングやソーシャルエンジニアリングという攻撃です。
フィッシングというのは、実在するシステムのログイン画面にソックリな偽サイトを作成し、偽のメールなどで正規のユーザをその偽サイトに誘導、ログインを試行させます。偽サイトは入力されたユーザIDとパスワードを保存し、本物のサイトへのログインに使用してしまうというものです。
皆さんのメーラーの「迷惑メール」フォルダに、某通販サイトやネットバンキングなどからの通知を偽装したメールが届いていませんか?このメールがフィッシングサイトへの誘導を担っていることが多いのです。

※フィッシング(phishing)というのは釣り(fishing)のことではありませんよ!
 
 
ソーシャルエンジニアリングというのはシステム外のユーザの行動や情報から認証を突破することで、例えばオフィス内でPCモニタ周辺に付箋紙でパスワードが貼ってあるのをコッソリ覚えて後で使うとか、ユーザの生年月日や電話番号のようなプロフィールを入手してパスワードとして使用しているかも知れない、と考えて試行してみる、というような方法を指します。
攻撃者も強かで、金融機関のようなフリをして「フィッシング対策のためパスワード更新をお願いします」のような偽メールを送りつけて、フィッシングサイトに誘導するという手口が既に観測されています。

2段階認証はパスワード突破しようとする攻撃者を多少は遠ざけますが、フィッシングやソーシャルエンジニアリングを考えると解決とはいい難いスキームです。
そこで近年提唱されているのが「2要素認証」です。
2要素とは2段階の一種ではありますが、異なる「要素」を2つ以上組み合わせて認証することを意味します。

ここで言う「要素」とは、
 1)知識(パスワードを知っている等)
 2)生体(指紋、顔、網膜、静脈掌紋等)
 3)所有(世界に2つ存在しないものを持っている、携帯電話やワンタイムキー生成器)
と決められており、これらを2種類以上を組み合わせないと2要素認証とは認められません。
携帯電話に固有のシリアルナンバーを付番して、ここに認証に使用するアプリをインストールしておくことで「登録済みの携帯電話の所有者である」ことを高精度に判断できます。
これが「所有」の要素の一例です。

生体認証は言うまでもなく個人を特定する強力な手段です。ログイン時に専用のセンサを持った端末を必要とするため大規模に実用化しずらい方式ですが、覚えたり持ち運んだりする手間がないので利用者には最も優しい方式でしょう。スマートフォンが指紋認証や顔認証の機能を備えるケースが増えてきているので、これから普及して来ることが期待されます。

「所有」の一種として「メールアドレス」を採用するケースがあります。ログインを試みた際に、システム側に登録されているユーザのメールアドレスへ有効期間の短い「ワンタイムパスワード」を送信します。ログイン時にこのワンタイムパスワードを入力させることで「メールアドレス」を「所有」していることが確認できる、という趣旨です。
メールは複数箇所で受信できたり、転送も容易なので「世界に2つ以上存在しない」と言えるか微妙なところですが、運用コストが極めて安いので多く利用されています。
インターネットメールを使わずに、スマートフォンの「ショートメッセージ(SMS)」を使って同様の仕組みを構築した場合には、SMSは電話番号に紐付いているので普通のメールよりは厳格な「所有」の要素となります。しかしSMSは通話と同じベース技術が使用されているので、送信文字数に応じた費用が毎回発生してしまうのが難点です。セキュリティ要件の厳しいシステムでは多少費用をかけても安全性優先でSMSが好んで使用されているようです。

パスワードとPINコードの違い

皆さんは「パスワード」と「PINコード」の違いをご存知ですか?
PINは数字だけ、パスワードは英数混在で文字数が・・・
というのは表面的な違いで、システム的には大きな違いがあります。
※PINコードを実質的にパスワードと同じ意味で使用しているサービスも世の中にはありますが、ここでは厳格なケースの話をします。
パスワードを画面に入力すると、集中管理を行っているサーバにユーザIDと共に送信されます。つまりネットワーク上を流れるわけです。勿論通信経路の暗号化は行われているでしょうから即危険というわけではありませんが、サーバ側にも同じパスワードを保存しておいて照合することが前提なので、サーバ上のパスワードが流出のリスクを孕んでいるわけです。
これがPINの場合は、ユーザIDとPINの組み合わせの正当性を端末内で完了させて、「認証に成功した」旨を示す一種の証明書のようなものを作成してサーバに送信します。ネットワーク上をPINは流れませんし、そもそもサーバ上にPINは保存されていません。
PINを使うとネットワーク盗聴に対して暗号化よりも更に強い防御になりますし、送信される証明書は盗聴複製しても無効な仕組みになっています。サーバが侵入を受けてデータ盗難されてもログインに必要な情報が揃わないので漏洩対策としても優秀です。
最近のWindowsでは「パスワード認証をPINに変える」という機能がありますが、ここでPINにすると以上のような認証の仕組みの変更が起こります。PINの方が覚えやすいにも関わらず安全性が高い、ということは知っておきましょう。
尚、PINの仕組み上、企業ネットワーク上で使用するWindowsでPIN認証に切り替えることができてもPIN設定したPC1台でしか登録したPINが使えません。(企業ネットではポリシーでPIN禁止にしているところが多いと思います)
PINを使用するとPINを検証するための情報がPCに保存され、世界唯一のPCになります。そのため、PINを知っている「知識」とPCを「所有」していることで2要素認証の要件を満たします。不思議ですがパスワードでは要件を満たさないのにPINだと満たされるのです。
最新のWindows 11はPCのハードウェア要件が厳しく、過去のPCを使いまわして導入できないケースがありますが、この要件の1つとして「TPM 2.0」対応のセキュリティチップを搭載していることが求められています。TPMがPINで認証する際のPIN番号の保管管理と照合を安全に行う要となっており、これからのWindowsはセキュリティのためのハードウェアを必須としているのです。

IT業界の今後

2要素認証は実際、かなり安全な仕組みではあります。が、それでも多少のリスクが残りますし、利用者から見てもパスワードを覚えさせられるサービスが増えていけば覚えきれずに「同じパスワードの使いまわし」「パスワードをメモして保存」が避けられません。
そこでIT業界は今、「パスワードレス」に向かっています。
指紋だけでロック解除できるとか、カメラに顔を晒すだけでログインできるとかの仕組みがパスワードレスでしょ?というのはちょっと違います。
考え方はPINでの認証に近く、「サーバ側にユーザの秘密情報(パスワード)を置かない」ことを目指しています。そもそもパスワードを認証に使わなければパスワードを管理する必要もなく、流出や盗難も起こりません。

この分野で「FIDOアライアンス」という団体がパスワードレス認証の標準化を進めていて、 Microsoft、Google、Apple、Amazon、Intel、Meta(Facebook)といった業界大手がほぼ全て参画しています。

FIDO認証の詳しい仕組みはここでは説明しません。簡単に流れを示すと、
 ・ユーザは認証用のデバイス(スマホ)にFIDO認証用のアプリをインストールし、システムに当スマホを登録しておく
 ・認証アプリはスマホの認証機能、指紋、顔、PIN等を使用して使用者を識別、
  正しい利用者と判断されたらサーバが配布した公開鍵で暗号化した認証証明をサーバに返す
 ・サーバは秘密鍵で認証証明を検証し利用者の正当性を認識する
となります。
サーバ側はどのような物理的手段で認証が行われたのか知りませんし、知る必要もありません。パスワードはどこにも登場しません。
認証スマホを「所有」していることがFIDO認証の要になっており、2要素認証のもう一つの要素は認証アプリでスマホが持つどの認証要素(指紋、顔、PIN、、)を採用するか、に委ねられています。

システムはスマホを片手にログインすることが求められる、そんな時代が近づいているようです。