勉強日記

チラ裏

SQL Antipatterns ch20 Readable Passwords

pragprog.com


Readable Password

If you can read passwords, so can a hacker.

  • 成りすましにパスワードを聞き出されてしまう運用者

Objective: Recover or Reset Password

  • パスワードのあるアプリケーションにおいて、ユーザがパスワードを忘れるのは確実
  • 本書執筆当時の大抵のアプリケーションは、パスワード復元、もしくはリセット機能で対処する
    • 【補】今もそうね
    • Eメール使う

Antipattern: Store Pasword in Plain Text

  • Eメールに平文のパスワードを記載して返してしまう
  • DB設計に起因する重大なセキュリティ欠陥
    • なりすましを許してしまう

Storing Paswords

  • 攻撃者がパスワードを盗む機会
    • アプリケーションサーバからDBサーバに送信されるパケットを傍受してSQL文を盗み見る
    • SQLクエリログ漁る
      • DBサーバへの侵入を許したらやられる
    • DBバックアップ
      • サーバ上
      • メディア
        • 物理的に破壊してから処分していますか?

Authenticating Passwords

  • 平文のパスワードの比較

Don't Lump Together Two Different Conditions

SELECT *
  FROM Accounts
 WHERE account_name = 'bill'
   AND password = 'opensesame';
  • 上記SQL文では、下記2種類のログイン失敗を区別できない
    • アカウントが存在しない
    • パスワードが誤っている
  • 後者が繰り返されている場合、攻撃の可能性がある

Sending Passwords in Email

  • DBに平文でパスワードが保存されているため、簡単に取得・返却できてしまう
  • Eメールで送付するのは深刻なセキュリティリスク
    • 傍受
    • ログ
    • etc.
  • 安全なプロトコルを使用したり、メールサーバを厳格に運用したりするのでは不十分
    • Eメールはインターネット上を通る
      • 傍受されうる
      • 制御下におけない

How to Recognize the Antipattern

  • パスワードを復元して返却できるということは、平文でパスワードを補完しているということ
  • アプリケーションが読めるものはハッカーも読める

Legitimate Uses of the Antipattern

  • サードパーティサービスとの連携
    • 言い換えると、アプリケーションがクライアントである場合
    • せめて可逆エンコードして格納
  • identificationとauthenticationを明確に区別せよ
    • authentication: 「私はXXです」と言っているその人がXXであることの証明

コラム: Ethics of Software Development

  • パスワード復元機能を設計するように言われたら丁重に突っぱねろ

Solution: Store a Salted Hash of the Password

  • そもそも読める形でパスワードを保存しているのが駄目

Understanding Hash Functions

  • 知ってるので略

Using a Hash in SQL

  • SHA2関数とかがある
    • 使うな(後述)

Adding Salt to Your Hash

  • 行ごとにランダムなバイナリ
    • 辞書攻撃対策
    • レインボーテーブル対策
  • 印字不可能なbyteも含めると良い

Hiding the Password from SQL

  • SQL文の中に平文のパスワードがあると駄目
    • 傍受可能
    • SQLログに残る
  • アプリケーションコード側でハッシュ化してからSQL文を構築せよ
    1. salt取得
    2. 平文のパスワードとsalt結合
    3. ハッシュ関数適用
  • クライアントからアプリケーションサーバまでの経路の傍受はどうするの
    • クライアント側でハッシュ化するのは不便
      • salt取得しないといけない
    • HTTPS等で通信経路を暗号化して妥協する

Resetting the Password Instead of Recovering the Password

  • 平文のパスワードを保存しなくなったので、パスワード復元はできない
  • パスワードを忘れたユーザに対してどうする
    • 期限付きの仮パスワード発行
    • 期限付きのパスワード変更リンクを発行

英語

  • clean text
    • 平文
    • plaintextに同じ
  • dire
    • very bad
    • 恐ろしい、ものすごい
  • interpolate
    • 改ざんする
  • push back
    • 押し返す、先送りする