認証と認可の違い
AAA制御とは、アクセス制御の基本となる3つの要素です。
- 認証:本人確認・改ざんチェック
- 認可:アクセス権を与える
- アカウンティング:ログで記録する
認証には2種類あります。
- エンティティ認証:相手が本物・本人か。
- メッセージ認証:メッセージが本物か。改ざんがないのか。
エンティティ認証
利用者(ユーザ)認証
本人しか持ち得ないものを確認することで、本人であると特定する認証です。
- パスワード認証:本人以外が知り得ない知識を問う。
- バイオメトリクス認証:生体情報を確認する。
- ICカード:所有物による認証
バイオメトリクス認証
指紋や静脈パターン、虹彩パターン、顔などで認証する。
誤って、他人を受け入れてしまう割合を他人受入率(FAR)といいます。
また、本人を拒否してしまう割合を本人拒否率(FRR)といいます。
例として、FIDO認証があります。
FIDO認証(ファイド)では、署名技術を利用し、生体認証が使えます。
所有物
ICカードの中の秘密の情報を確認する認証です。
秘密の情報とは、共通鍵や秘密鍵も含みます。
共通鍵を認証主体に登録しておいたり、秘密鍵で署名をつけるなどがあります。
ICカードを他人が利用できないように、ICカードにロックをかけておくことが一般的です。
ロックはPINで実現します。
このように、耐タンパ性(内部の機密情報データや動作などを、外部から解析や改変されることを防ぐ能力のこと。)を高める工夫が必要です。
二要素認証・ディアルファクタ認証
知識・生体・物の3つの内、2つの要素で認証することを二要素認証といいます。
2要素使う認証なので、二段階認証に含まれます。
パスワード×パスワードの場合は二段階認証だよ。
それ以外で2つの要素を使っている場合、二要素・二段階どちらで記述しても、問題ありません。
パスワード認証
本人以外が知り得ない知識を問う認証方法です。
パスワードの他に、パスフレーズを使う場合もあります。
パスワード:文字なので、空白が許されない。pass1234
パスフレーズ:文章なので、空白が許される。This is a pen.
パスワード認証の実現方法は下記の3つです。
- BASIC認証
- PLAIN認証
- USER・PASSWORD認証
BASIC認証
認証機器(サーバー)にユーザーIDとパスワード(秘密の情報)を平文で送信する
①通信経路で盗聴された場合、また、②サーバーがなりすまししていた場合は、ユーザーIDとパスワードが漏洩する恐れがあります。
①盗聴:暗号通信にする
②なりすまし:サーバ認証を入れる
安全にBASIC認証するために、HTTPS通信を使うことが一般的です。
チャレンジ・レスポンス認証
「0知識証明」とも呼ばれています。
本人しかできない加工ができるのかどうかを確認する方式です。
- ユーザーは、サーバに接続情報とIDを送る
- サーバーは毎回変化する値「チャレンジ」をユーザーに送る(リプレイ攻撃対策)
- ユーザーはチャレンジを加工して、レスポンスを生成する。
- サーバーはレスポンスを検証する
パスワードは毎回同じだよね。
チャレンジも毎回同じ値の場合、レスポンスは毎回同じになってしまうよ。
こうしてレスポンスを入手・再利用されてしまうと、攻撃者はユーザーになりすまして、簡単に認証を突破できてしまうんだ。
(リプレイ攻撃といいます。)
このように、レスポンスを再利用されることを防ぐために、チャレンジには桁数の多い乱数を利用します。
ユーザー側の加工・サーバー側の認証の方法は、3種類あります。
- サーバーに登録したパスワード(=ユーザーのパスワード)を共通鍵として、チャレンジを暗号化する
- ユーザーの秘密鍵を使って署名し、サーバーが公開鍵を使って復号する
- チャレンジ+ユーザーのパスワードからハッシュ値を作り、サーバーがレスポンスと自身で計算したハッシュ値を比較する
2のやり方は、公開鍵(証明書)による認証です。
3のやり方を、ダイジェスト認証といいます。
ダイジェスト認証は、暗号化する必要がなく、すべてのやり取りが平文で可能です。
リスクベース認証
普段と異なる環境からのアクセス時に、追加の認証を行うことを、リスクベース認証といいます。
追加の認証とは、例えば次のような認証があります。
- SMSで認証コードを送る
- 登録したメールアドレスへ追加の認証コードを送る
ワンタイムパスワード(OneTimePassword:OTP)
ワンタイムパスワードとは、使い捨てのパスワードです。
ハッシュを利用して生成されています。
方式は3種類あります。
S/Key
ハッシュ値の一方向性を利用してワンタイムパスワードを生成します。
マスタパスワード(M)を決めて、ハッシュ化(H1)します。
次に、H1をハッシュ化して、H2を生成します。
このように続け、100回ハッシュ化をします。
=H1~H100まで生成。
ワンタイムパスワードとしてハッシュ値を使う場合は、H100、99、98…というようにパスワードとして利用します。
ハッシュ化した回数分だけパスワードが生成されます。
H100から使う理由は、ハッシュ化の一方向性を利用するためです。
例えば、H1→H2と使うとハッシュ関数がわかってしまったら、すぐにハッシュ値が推測できてしまいます。
しかし、H100→H99と逆向きに使う場合はハッシュ化の一方向性より、パスワードが推測できません。
HOTP
HOTPとは、HMACを使ってワンタイムパスワードを生成する方法です。
HMACとは、鍵付きハッシュ関数を用いて生成したハッシュ値のことです。
鍵付きハッシュ関数とは、メッセージと共通鍵を組み合わせてハッシュ関数で計算することです。
その結果、算出されたハッシュ値がHMACです。
HMAC値は、共通鍵を使うため、共通鍵を知っている当事者のみが生成できます。
TOTP
TOTPとは、時刻(分単位)からハッシュ値を作る方式です。
タイムシンクロナス方式とも呼ばれます。
ユーザー側・サーバー側ともに、秘密の文字列(共通鍵)と現在時刻を使ってハッシュ値を生成し、両者が同一であれば認証できるという仕組みです。
ユーザー側とサーバー側の現在時刻が同一であることが重要なので、NTPを利用します。
NTPサーバーとは、正しい時刻情報を取得・配信しているサーバーのことです。
時刻情報をサーバーとクライアントとの間でやりとりする際に、TCP/IPネットワークを通じてNTP(Network Time Protocol)という通信プロトコルを使用して問い合わせることにより、コンピュータの内部時計を正しく設定することができます。
用語集|NTPサーバー|IDCFrontier
サーバ(認証側機器)でのパスワード情報の管理
パスワードの管理方法は2種類あります。
- ユーザーから送られてきたパスワードを平文で記録し、サーバにあるパスワードファイルと比較する方法
①の場合、パスワードファイルを盗まれ、中身を見られた場合は、パスワードを盗まれる危険があります。
管理者権限を持つユーザが覗き見ることもできる点も、リスクがあります。
上記のリスクへの対応としては、「パスワードファイルに記録するパスワードを、ハッシュ値にしておく」が考えられます。
一方向性の観点から、ハッシュ値がわかっても、もとのパスワードはわからないね!
Unix系OS(Linuxなど)では、/etc/passwordというファイルで管理されています。
ダイジェスト認証でも、ハッシュ値を記録するだけで良いのかな??
ダイジェスト認証の場合は、チャレンジとユーザーのパスワード(平文)を使って、サーバー側で認証する必要があります。
パスワードファイルにパスワードのハッシュ値が登録されている場合、平文のパスワードが取り出せないため、パスワードファイルには平文のパスワードが登録されている必要がありますね。
公開鍵(証明書)による認証の場合は、どうかな?
サーバー側がレスポンスを検証する場合は、ユーザーの公開鍵を使います。
公開鍵なので、パスワードファイルは利用しません。
また、公開鍵から秘密鍵を推測することは出来ないため、盗聴されても問題ありません。
ただし、サーバーに侵入されて、ユーザーの公開鍵を偽物の公開鍵に置き換えられた場合は、不正侵入を許してしまいます。
対処法としては、公開鍵証明書をサーバー上に記憶しておくことがあげられます。
「この公開鍵は、Aさんのものです!」と証明できれば、公開鍵が置き換えられることはありません。
認証フレームワーク
認証フレームワークとして代表的な、IEEE802.1X(アイ・トリプルイー)を説明します。
認証フレームワークとは、認証の枠組みのことです。
データリンク層でよく使われます。
データリンク層は、ネットワークに参加する層です。
データリンク層にあるL2スイッチ(以下、SW)で、「どのPCでも接続していいですよ」としてしまうと、悪意を持ったユーザーも勝手に社内ネットワークに接続できてしまい、危険です。
そのため、L2SWで認証する必要があります。
この認証でよく使われるのが、IEEE802.1Xです。
まず、RADIUSサーバ(認証サーバ)の設置をします。
RADIUSサーバの認証プロトコルはEAPです。
EAPは、PPPの認証する部分を抜き取ったプロトコルです。
EAPには、次の2種類の運用モードがあります。
- PEAP:利用者はID・パスワードによる認証。接続先は公開鍵証明書を使います。
- EAP-TLS:利用者・接続先機器ともに公開鍵証明書を使います。
SSO
メッセージ認証
メッセージ認証は、メッセージの改ざん有無を確認する認証です。
メッセージ認証符号
メッセージ認証符号はMACと呼ばれます。
当事者以外の第三者が、メッセージを改ざんしていないかどうかを検証できます。
ただし、デメリットもあります。
- メッセージ受信者が改ざんしていた場合は検出できない点
- メッセージ作成者がメッセージを作ったことを保証できない点
MACでは共通鍵を利用します。
そのため、共通鍵を持っている受信者が、悪意をもってデータを改ざんした場合、
改ざん後のデータを再度共通鍵を使ってハッシュ化し、同一のHMACを作れば簡単に偽装できてしまいます。
MACは信頼関係がある当事者間でしか利用できないんだね。
また、「このメッセージは共通鍵を持っている当事者のどちらかが作成した」ということまでしか特定できません。
つまり、否認できてしまうんだね。
代表的なMACの一つがCBC-MAC(CMAC)です。
CBC-MACでは、共通鍵暗号方式のブロック暗号CBCモードを利用してMAC値を作ります。
CBCモードは、ある乱数とブロックをXORをして暗号化し、以降は暗号化したデータとブロックをXORすることで、次々に暗号化します。
CBC-MACは、最後のブロックを暗号化した結果をMAC値として利用する方式です。
他にも、HMACがあります。