前回は、代表的なセキュリティ機能である認証処理の7要素についてまとめた。ここでは、アカウント管理、認可(Authorization)、ログ出力における注意点についてまとめる。
1 アカウント管理
ユーザ登録
ユーザ登録においては、ユーザID(ログインID)、パスワード、メールアドレスの登録が含まれる場合が多く、以下のようなセキュリティ上の注意点がある。
- メールアドレスの受信確認:1)メールにトークンつきURLを添付して、そのURLから処理を継続する。2)メールアドレスを入力した後、トークン(確認番号)入力画面に遷移する。トークンは指定したメールアドレスにメール送信される
- ユーザIDの重複防止:脆弱性例−パスワードが違えば同じIDで登録できる。ユーザIDに一意制約をつけられない
- ユーザの自動登録への対処:CAPTCHA−わざと文字をゆがめさせた画像を表示し、利用者に文字列を入力してもらう方法
- パスワードに関する注意
- SQLインジェクション脆弱性
- メールヘッダ・インジェクション脆弱性
パスワード変更
- 現在のパスワードを確認する
- パスワード変更時にはメールでその旨を通知する(SQLインジェクション脆弱性、CSRF脆弱性)
メールアドレスの変更
- 機能面の対策:メールの受信確認。再認証。メール通知(新旧両方のアドレスに実施)
- 混入しやすい脆弱性対策:セッションハイジャック、CSRF攻撃、SQLインジェクション攻撃
パスワードリマインダ
利用者がパスワードを忘れた場合に、何らかの方法でパスワードを知らせる仕組み
- 管理者向けパスワードリマインダ:リセット手順1)問い合わせを受け付け、利用者の本人確認を行う。2)管理者がパスワードをリセットし、利用者に仮パスワードを伝える。3)利用者は刈りパスワードでログインし、直ちにパスワードを変更する
- 利用者向けパスワードリマインダ:本人確認(秘密の質問と答え)。パスワード通知(仮パスワードを発行、パスワード変更画面に直接遷移)
アカウントの停止
- 利用者本人からの依頼
- 不正アクセスを受けている
アカウントの削除
パスワードの確認(再認証)を要求
2 認可
認可とは
認証された利用者に対してのみ権限を与えることである。権限の例は以下の通り。
- 機能(退会処理、送金、新規ユーザ作成など)
- 情報閲覧(非公開の利用者自身の個人情報、非公開の他利用者の個人情報など)
- 情報操作(利用者本人の設定変更、Webメールからのメール送信など)
認可不備の典型例
- 情報リソースのIDを変更すると権限外の情報が参照できる
- メニューの表示・非表示のみで制御している
- hiddenパラメータやクッキーに権限情報を保持している
認可制御の要件定義
権限マトリックスを作成し、ユーザと権限の対応を設計時に明確にしておくこと。
認可制御の正しい実装
以下の2項目を確認すること。
- このスクリプト(画面)を実行してよいユーザであるか
- リソースに対する操作(参照、変更、削除など)の権限はあるか
3 ログ出力
ログ出力の目的
- 攻撃や事故の予兆をログから把握し、早期に対策するため
- 攻撃や事故の事後調査のため
- アプリケーションの運用監査のため
ログの種類
- Webサーバー(Apache、IISなど)のログ
- アプリケーションログ:エラーログ(エラーの記録)。アクセスログ(利用記録)。デバッグログ(本番環境では取得すべきでない)
- データベースのログ
ログ出力の要件
- ログに記録すべきイベント:ログイン・ログアウト、アカウントロック、ユーザ登録・削除、パスワード変更、重要情報の参照、重要な操作
- ログの出力項目と形式:アクセス日時、リモートIPアドレス、ユーザID、アクセス対象、操作内容、操作対象、操作結果
- ログの保護:不正アクセスからの保護
- ログの出力先
- ログの保管期間
- サーバーの時刻合わせ:NTP(Network Time Protocol)の利用
ログ出力の実装
Java向けのログ出力ライブラリlog4j、PHP向けのlog4phpなど。メリットとして、ログの出力先が抽象化されていて設定だけで切替が可能、ログの目的によって複数の出力先を切り替えることが可能であることなどが挙げられる。
最後に
アカウント管理においては、ユーザが入力したメールアドレスには必ず受信確認をする、重要な処理に際しての再認証・メール通知が必要である。認可においては、 セッション変数に権限情報を格納すること、権限を必要とする処理の直前に権限を確認すること。ログ出力については、4W1Hの項目を取得してログの安全性を確保する、サーバーの時刻合わせを定期的に行い、ログの突き合わせに備えることが必要である。
次回は、文字コードとセキュリティについてまとめる。
![]() |