認証と認可
OWASP の Authentication / Authorization Cheat Sheet を取得して読み、 理解した内容を自分の言葉で書いたもの。
OWASP Top 10 の A07 Authentication Failures と A01 Broken Access Control に対応する。A01 は Top 10 の1位。
認証は「誰か」、認可は「何をしてよいか」。 混同すると両方が漏れる。
認証
パスワードの長さ
複雑さのルールより長さ。
| 条件 | 最小 |
|---|---|
| MFA あり | 8文字 |
| MFA なし | 15文字 |
| 最大 | 64文字以上を許可する(パスフレーズを使えるように) |
すべての文字を許可する。Unicode も空白も含めて
大文字・数字・記号の必須ルールは課さない
黙って切り詰めない
漏洩パスワードのデータベース(Pwned Passwords API 等)と照合する
複雑さの強制をやめるのが現行の推奨。 覚えられないパスワードを作らせて使い回しを誘発するより、長さと漏洩照合で守る。
保管と比較
暗号学的な手法で保存する(Password Storage Cheat Sheet を参照)
比較には定数時間で返る関数を使う
パスワード変更時は、現在のパスワードの確認を要求する
定数時間比較が要る理由は、応答時間の差から情報が漏れるため。
通信
ログインページと、認証後のセッションすべてを TLS のみで通す。
再認証
パスワード変更、メールアドレス変更、重要な取引の前に、資格情報を再確認する。 CSRF とセッション乗っ取りの被害範囲を抑えるため。
エラーメッセージ
失敗の原因が何であれ、同じ文言を返す。
Login failed; Invalid user ID or password
「そのユーザーは存在しません」と返すと、アカウントの存在を総当たりで確認できてしまう (アカウント列挙)。
自動化された攻撃への対処
失敗回数でアカウントをロックする
カウンタは IP ではなくアカウントを基準にする
ロック時間を指数的に伸ばすことを検討する
IP 基準にしない理由は、分散した攻撃元だとカウンタが機能しないため。
MFA
分析では、MFA があればアカウント侵害の 99.9% を防げるとされている。 単一の対策としては効果が突出している。
パスワードマネージャを妨げない
標準的な HTML フォームと、適切な type 属性を使う
パスワード欄への貼り付けを許可する
64文字以上を受け付ける
印字可能な文字をすべて許可する
貼り付けを禁止する実装は、利用者をより弱いパスワードへ追い込む。
認可
最小権限
必要最小限だけを与える。
設計段階で、利用者の種別・資源・許可する操作を列挙する。 運用後は定期的にテストし、**権限の漸増(privilege creep)**を見直す。
既定は拒否
すべての許可に、明示的な理由があるようにする。
フレームワークの既定値に頼らない。 サードパーティのコードのロジックと既定値は、時間とともに変わりうる。
すべてのリクエストで検証する
攻撃者は1つ通る道を見つければよい。
だからメソッドごとに個別に書くのではなく、 サーブレットフィルタやミドルウェアのような、アプリ全体で一貫した仕組みで掛ける。
ID を推測されても通らないようにする
**IDOR(安全でない直接オブジェクト参照)**への対処。
可能なら ID そのものを露出しない
間接参照を使う
個々のオブジェクトへの要求ごとに、アクセス可否を確認する
「推測しにくい ID にする」は対策ではない。 推測されても通らないことが対策。
静的リソースも対象にする
アクセス制御のポリシーに静的アセットを含める。 S3 などのクラウドストレージの設定も同様。
サーバー側で判定する
クライアント側のチェックに依存しない。 サーバー、ゲートウェイ、あるいはサーバーレス関数の側で判定する。
失敗したときに安全に倒す
失敗時の例外処理を集約する。 アプリが予測不能な状態に落ちるのを防ぐため。
これは OWASP Top 10 の A10 Mishandling of Exceptional Conditions に直結する。
ログを残す
一貫した形式で
タイムスタンプを同期して
集約されたログ管理で
テストする
認可ロジックにユニットテストと統合テストを書く。 基本的な欠陥は本番前に捕まえられる。
テストの 「壊れてほしくないもの全部をテストする」対象に、認可が入る。
モデルの選び方
RBAC より ABAC / ReBAC を検討する。
RBAC(役割ベース)は単純だが、細粒度の複雑な条件やマルチテナンシーには向かない。 属性ベース(ABAC)や関係ベース(ReBAC)の方が、これらを素直に表現できる。
攻撃側との対応
| 攻撃側の記述 | ここでの対策 |
|---|---|
| 侵入 — パスワードを利用 | 長さ・漏洩照合・ロックアウト・MFA |
| 他のシステムへの移動 | 最小権限、既定は拒否、リクエストごとの検証 |
| 足跡・痕跡 | 認可判定のログ |