パスワード認証への攻撃と対策


## はじめに

サービス運用に必要不可欠なセキュリティ対策。
大事な認証を担うサービスを運用している方はしっかりと取り組む必要があります。
そこで、今回は、パスワード認証への攻撃手段と対策について紹介していきます。


## パスワード認証への攻撃

パスワード認証は、ユーザをIDとパスワードによって認証するインターネット黎明期の1990年代から長く使われている認証技術のひとつです。
最近では、生体認証によりパスワード認証を利用しないサービスもありますが、パスワードによる認証方式は、システムを提供するサーバー側に特別な仕組みを導入することなく実装でき、ユーザもパスワード認証は手間がかからないというメリットがある為、多くのサービスで利用されています。

パスワード認証の隙をついた代表的な攻撃例を紹介します。


### 総当たり攻撃

総当たり攻撃は、ユーザのID・パスワードを解読する為、考えられる全てのパターンで手当たり次第に試行する攻撃です。力任せに全ての可能性を試すことから、ブルートフォースアタック（Brute-force attack）とも呼ばれています。

総当たり攻撃は多くの場合自動化されています。人間がやろうとすると天文学的な回数の試行が必要になる為、攻撃用ツールが使用されています。
攻撃用ツールは、昔から多く開発されており、入手するのは非常に簡単なのが現状です。

独立行政法人[情報処理推進機構(IPA)](https://www.ipa.go.jp/)が2008年に行った試験によれば、パスワード解析には以下の時間が必要となると試算されています。

![IPA.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37423/4b782b2d-b581-4653-0931-41adcd58bdc7.png)
※ 上記試験に使用したパソコンはIntel Core 2 Duo T7200 2.00GHz、メモリ：3GB

現在(2020年)の市販のパソコン上記より大幅に高速化されている為、解析できる速度も大幅に上がっていると推測されます。

総当たり攻撃は、ログインが成功するまで連続的かつ短期間にログイン試行を続ける攻撃です。
その為、システム側で検知される可能性が高く、アカウントロックによって攻撃が失敗する可能性が高いという特徴があります。


### パスワードスプレー攻撃

総当たり攻撃の一種にパスワードスプレー攻撃があります。
パスワードスプレー攻撃は、同じパスワードを使用して同時に複数のアカウントにログインを試みます。
ログイン機能を持つシステムでは、一定期間に一定の回数のログインエラーが起こると、アカウントが一定時間ロックされる仕組みを持つものがありますが、パスワードスプレーは、このアカウントロックを回避する手法を持つパスワード攻撃です。
アカウントロックを回避することで、総当たり攻撃よりも不正なログイン試行を検知されないという特徴があります。

パスワードスプレー攻撃も総当たり攻撃と同様に、多くの場合自動化されています。


### パスワードリスト型攻撃

2013年ごろから見られるようになり、2020年時点でも多くの被害が報告されているのが、パスワードリスト型攻撃です。ここ数年、国内のサイトでアカウントの漏洩が相次いで発生しました。これらの多くはパスワードリスト型攻撃によるものです。

パスワードリスト型攻撃では、過去に漏洩したアカウントを基に辞書を作ります。もしユーザが複数サイトで同じパスワードを使いまわしていた場合、この辞書によってログインが成功してしまいます。
総当たり攻撃の場合、何百回、何万回試行しないと成功しないような攻撃が数回で成功してしまうため、攻撃者にとって効率が良い手法となります。

また、残念ながらパスワードを使い回しているユーザは多く、日本人の80%以上がパスワードを複数のWebサービスで使いまわしているという調査結果もあります。
これにより、パスワードリスト型攻撃の被害が継続して発生していると考えられます。


## パスワード認証への攻撃の対策

こうしたパスワード認証の隙を突く攻撃への対策を紹介します。

### CAPTCHA

「CAPTCHA」とは、「**C**ompletely **A**utomated **P**ublic **T**uring test to tell **C**omputers and **H**umans **A**part」の頭文字をつなげたもので、直訳するとコンピュータと人間とをはっきりと自動識別するテストのことを指します。

画像に描かれた内容など、その判別が人間には可能でコンピュータのプログラムには不可能なものを使って、人間の操作であることを認証する技術です。

CAPTCHAとして有名なものあげると、「Google reCAPTCHA v2」です。
以下の画像のような認証画面を見たことがある人も多いと思います。

![Goolge reCAPTCHA.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37423/a9407b3d-2390-6a74-b158-b0fb819ddac1.png)

記載した文字を理解した上で、画像を選択させる事で、相手が攻撃用ツールではなく人間であることを確認します。これにより、攻撃用ツールを利用した不正行為の防止に効果があります。

ただ、CAPTCHAは、コンピュータと人間とを自動識別する仕組みです。その為、人の手によって行う不正行為に対しては防止効果はありません。


### 二要素認証

二要素認証とは種類の異なる2つの情報を組み合わせて安全性を高めた認証方式で、「マルチファクター認証」とも呼ばれています。要素は認証の3つの要素に分類されます。

1. 記憶
    - ユーザが知っていること。
    - パスワードや秘密の質問などが該当します。
2. 所持
    - ユーザが持っているもの。
    - スマートフォンやハードウェアトークン、乱数表などが該当します。
    - 登録したスマートフォンに送られてくる、短時間のみ有効なパスワード（ワンタイムパスワード）も、持っている本人にしか届かないので所持情報に分類されます。
3. 生体情報
    - ユーザの身体的特性。
    - 指紋や静脈、虹彩などが該当します。

3つの要素を表に整理すると以下になります。

|要素  |概要  |例  |
|---|---|---|
| 記憶 | 本人のみが記憶しているデータに基づいて認証する | パスワード、PIN |
| 所持 | 本人のみが所持している物によって認証する | ICカード、ハードウェアトークン |
| 生体情報 | 本人の生体に基づくデータにより認証する | 指紋認証、顔認証 |


二要素認証は、これらの中から**異なる2つの要素を組み合わせる仕組み**になります。


例えばGoogleアカウントはIDとパスワードでログインしますが、二要素認証の際の2つめの認証はアプリを使用します(2020年現在)。
これは自身が覚えているID・パスワードを入力し（記憶）、認証されているアプリからのアクセスを確認する（所持）ので、ログイン時に2つの要素が求められます。

このように、二要素認証は3つの要素から2つ選択できていることが重要です。

万が一パスワードが漏洩したり、攻撃が成功した場合でも二要素認証を使用することによって、本人である事を確認できる可能性が高まるので、ユーザの情報は保護される可能性が高まります。
しかしながら、幅広いユーザに使用されているサービスは二要素認証にすることによりユーザの離脱が懸念されることもあります。


###（参考）二要素認証と二段階認証

同じ種類の要素を2つ組み合わせても二要素認証にはなりません。
よくある例ですと、パスワードと秘密の質問を使うユーザ認証は、2つの情報を使っていますが、どちらも記憶情報なので、この場合、二要素認証とは呼ばず、二段階認証と呼ばれます。
所持情報または生体情報を追加することで、二要素認証となります。

違いを要約すると以下の通りです。

- 二段階認証は同じ1要素での認証が2回ある
- 二要素認証は記憶・所持・生体情報のなかから異なる要素を使った認証を1回ずつ行う


### リスクベース認証

リスクベース認証とは、ユーザがサービスを利用する際の環境（IPアドレス・Webブラウザ等）の履歴に基づきユーザを分析し、リスクが高いと判断された場合には追加認証などを行うことで、なりすましを防ぐ認証技術です。

日頃使用しているSNSアカウントに、普段とは違うブラウザやデバイスでログインしようとした際、元のブラウザ・デバイスになんらかのアラートが来た、別途ログインコードによる認証が求められた、という経験がある人も多いと思います。これもリスクベース認証の一例です。

通常と同じ環境からのアクセスのようにリスクが低いと判断された場合には追加認証を行わず、リスクが高いと判断された場合には追加認証を行うことから、一定の利便性を保ちつつ、不正アクセスに対する防衛力を高めることができます。


## まとめ

様々な攻撃への対策として、認証機能を追加します。
認証機能を追加し、セキュリティを向上させる理由は、ユーザが安心してサービスを利用できるようにするためです。
ユーザにも解けない難解な認証や特定の環境でないと機能しない認証は、ユーザの負担になります。セキュリティ向上によって、ユーザの離脱につながることは避けるべきです。
運営されているサービスが持っているユーザの情報や、想定される脅威を一度洗い出し、必要な認証機能を選定されることをお勧めします。