支援士試験における最も重要な分野(当社比)な認証について、基礎/応用に分けてやっていきます
基礎編では認証の基本的な概念とパスワード認証、及びパスワードへの攻撃
応用編ではちょっと進んだ認証技術に触れようと思います。
・認証の3要素
認証を行うにあたって認証に使う要素は3種類あり、これを 認証の3要素 と言います
1 記憶・・・ある秘密の情報を持っていることによる認証
例) パスワード や 暗証番号
2 所持・・・ある物を持っていることによる認証
例)スマートフォン、ICカード
3 生体・・・身体的特徴による認証
例)指紋、目の虹彩
これら要素の内、複数を組み合わせて行う認証を 多要素認証 といいます
多段階認証 とも呼ばれることもありますが、厳密にいえば異なります
多段階認証では 1つの要素 で段階的に認証を行う事があります。
今ではあまり見ないですが、IDとパスワードによる認証の後に 秘密の質問(母親の旧姓は?etc…)を
行う事で多段階認証となり得ます。
そういう意味では、多要素認証は多段階認証を内包しているといえます。
・認証 と 認可 と 課金
情報セキュリティにおいて、認証と認可の違いは明確に理解しておくべきです
>認証(Authentication)
正当なユーザであるかどうかを見極めます。
対象は人だけでなく端末等の機器も対象です
>認可(Authorization)
認証が成功したユーザに対し、権限を付与すること
ここでいう 権限 とは、サーバへのアクセスや
データに対する読み/書きの許可を与えることを言います。
>課金(Accounting)
上記に併せて 課金 も重要です
ここでいう 課金 とはユーザのサーバへのアクセス状況や
データに対する操作のログを取得することを意味しています。
どのくらいリソース(サーバやデータ)を使ったのか、という意味で 課金 です。
上記3つを組み合わせて AAAフレームワーク とも呼ばれます
・パスワードによる認証
最も基本的な認証方法で、IDとそれに紐づくパスワードでユーザを認証します
パスワード認証を安全に運用するには、提供者側だけでなく利用者側も一定の理解が必要です
>提供者側が気を付けること
1 パスワードの保存方法
当然ですが平文で保存してはいけません…が
つい先日あのMeta社が膨大なパスワードを平文で保存していた問題が発覚しました
パスワードを保存する際は ハッシュ化 して保存 が基本です。
また、ハッシュ化と組み合わせる ソルト と ストレッチング も重要です
ソルト とはユーザ毎に異なるランダムな値のことで
ハッシュ化の際にはパスワードとソルトを組み合わせてハッシュ化されます
このようなことを行う理由は主に2つあります
ひとつは パスワードの解析を困難にさせるため。
仮にハッシュ化されたパスワードが漏えいしたとして、そのパスワードの内容と併せて
ソルトの値も解析する必要がある為、パスワードの解析が困難になります
そのため、ソルトは 推測困難な値 であることが求められます
ふたつめは 複数の利用者でパスワードハッシュが同値になることを防ぐためです
ハッシュ関数の特徴として、入力値とハッシュ関数が同じであればハッシュ値は同じになります
仮に複数のユーザでパスワードが「12345」だった場合、そのパスワードの人たちのハッシュ値は同じになってしまいます。
同じハッシュ値が複数あるという事は、その分同じパスワードを設定しているユーザがいるという事で攻撃者にヒントを与えることになり、不正アクセスのリスクが増えてしまいます。
そのため、ソルトはユーザごとに異なる必要があります。
ストレッチング とはパスワードを何度もハッシュ関数にかけることです
パスワード → ハッシュ関数 → ハッシュ値 → ハッシュ関数 → ハッシュ値 → ハッシュ関数…
このようにすることで、攻撃者によるパスワード解析の時間稼ぎを行う事が可能です。
ソルト、ストレッチングと併せて ペッパー(シークレットソルト) を利用される場合もあります
これはソルトと似ていてランダムな値であり、使用用途も似ていますが異なる点として
全てのユーザで共通の値であることと、パスワードの保管場所とは異なる階層で保管される点です
パスワードとソルトは同じ階層(DB)に保管されるため、パスワードが漏えいしたということは
同じ階層にあるソルトも漏えいした考えるべきです
ペッパーを別階層に保管し、ハッシュ化の際にペッパーも組み合わせることで
パスワード + ソルトとは別階層にあるペッパーもパスワード解析に必要になるため
より強固なパスワードハッシュの作成が可能になります。
2 多要素認証(MFA)の実装
ID/パスワードのみの知識による認証だけでなく、所持 や 生体 を組み合わせた
多要素認証を実装すべきです
比較的多いのは ID/パスワードの認証後に登録した電話番号にSMSを飛ばす方法でしょうか
他にもワンタイムパスワードアプリを使用することも考えられます
こうすることで、仮にパスワードが漏えいしたとしても電話(スマホ)が必要になるので
不正ログインを防ぐことができます。
>利用者側が気を付けること
1 単純なパスワードを設定しない
現在、色々なサービスでパスワードポリシーが設けられており
例えば、大文字と小文字、記号を組み合わせて8文字以上 などが多いと思います
なので昔ほど安直なパスワードの設定はできなくなっています。
しかし、上記を満たし、且つ安直なパスワードを設定されることは十分考えられ
P@assword とかのパスワードに意味を持つような単語を設定する等です
このようなパスワードを破る 辞書攻撃 といった攻撃も存在するので
意味を持つような単語を設定するのは控えるべきです。
2 パスワードを使いまわさない
パスワードを使いまわす際の大きなリスクが1つあります。
パスワードリスト攻撃 にて大きな被害を受ける可能性があることです
例えば、3つのサービスでパスワードを使い回していたとして
その内どこかからパスワードが漏えいしたとします。
攻撃者はその漏えいしたパスワードを用いて他2つのサービスに不正ログインを試みます
このような攻撃を パスワードリスト攻撃 といいます。
使いまわせば使いまわすほど、リスクが高まることが分かります。
提供者側でもパスワード設定の際に、使いまわしを避けることをお願いする旨のメッセージを記載すべきで、最近は目にする機会が多くなったと思います。
リスクベース認証
リスクベース認証とは、いつも利用しているサービスをいつもと異なる環境でログインする際
追加で認証を求めるものです。
異なる環境というのは下記のような事が考えられます
・端末が異なる
・ブラウザが異なる
・地理的な位置が異なる
・IPアドレスが異なる
・時間帯が異なる
上記のような場合、不正アクセスを防ぐため追加の認証を行う、というものです
試験でもリスクベース認証の仕組みを答えさせる問題があったので、抑えておくべきだと思います
パスワードへの攻撃
パスワードへの主要な攻撃とその対策をいくつか解説します
・ブルートフォース攻撃
ブルートフォースとは 総当たり を意味します
パスワードを 0000~9999 まで数撃ちゃあたる戦法で突破を試みます
この攻撃は古くからあり、以下の対策が有効です。
>ログインの試行回数を制限する
よく取られる手法だと思います、連続で3回ミスったら5分ログインできない、ってやつですね
サービスによりけりですが、アカウントに制限を掛けたりIPアドレスに制限を掛けたりします
・辞書攻撃
パスワードに意味のある単語を設定する人が多いことを逆手に取った攻撃です
攻撃者は何らかの意味を持つ単語をパスワードとして入力し、不正アクセスを試みます
こちらの対策としては以下です
>ログインの試行回数を制限する
ブルートフォース攻撃と同じです、辞書攻撃も総当たりみたいなものですので。
>パスワードポリシを設ける
利用者に複雑で推測困難なパスワードの設定をお願いします。
・パスワードリスト
どこかから漏えいしたパスワードのリストを利用して不正ログインを試みます
こちらの対策としては以下です
>パスワードを使いまわさない
上記の利用者側の観点でも述べましたが、パスワードを使いまわすことで
パスワードリスト攻撃のリスクが増大します、使いまわしは避けましょう。
とはいえ、サービス側でそれを強制することはできないので利用者のモラルに依ります
サービス側で出来ることは、使いまわしを避けるようお願いすることです。
・レインボー攻撃
これも外部から漏えいしたパスワードのリストを利用します。
攻撃者は レインボーテーブル と言う平文とハッシュ値の組み合わせリストを
漏えいしたパスワード(パスワードハッシュ)と突合し、パスワードを推測します。
めちゃ雑ですが、こんなイメージです
漏えいしたパスワード中に「aaa」があれば、これは password を MD5 でハッシュ化したんだな
ということが分かります。
対策としてはソルトやストレッチング、ペッパーを利用することです。
上記のパスワードの保存方法の箇所をご覧ください。
パスワードの攻撃は他にもありますが一旦ここまでにします。
ここまで書いておいてアレですが、上記攻撃の共通の対策として
多要素認証 がどれも有効ですので、可能なサービスであれば多要素認証をONにしましょう。
コメント