Upgrade to Pro — share decks privately, control downloads, hide ads and more …

『プロフェッショナルSSL/TLS』読書会 第8章 資料

Toru Sugino
December 08, 2017

『プロフェッショナルSSL/TLS』読書会 第8章 資料

Toru Sugino

December 08, 2017
Tweet

More Decks by Toru Sugino

Other Decks in Programming

Transcript

  1. 8.1.1 鍵アルゴリズム ▪ DSA – 安全性に難あり、選択肢にするべきではない ▪ RSA – 現実的にはこれ一択、鍵長は最低でも2048ビット

    ▪ ECDSA – パフォーマンスに優れ鍵長も短いが、対応プラットフォームが少ない(そもそも 証明書発行してくれるところがない) ▪ 別アルゴリズムの同時発行は鍵管理のコストが上がる
  2. 8.2.2 証明書のホスト名 ▪ 意外と、自分が所持しているドメインを網羅していないことによる証 明書エラーがよくある – 例: www.example.com に対して証明書を発行し、 example.com

    に対応して いない ▪ どのような名前でアクセスされるかは制御できない – セキュアなサイトに向いたDNSに登録されているドメイン全てに証明書を発行 (もしくはワイルドカードで発行)するしかない ▪ CAが全部面倒を見てくれるとは限らない
  3. 8.2.3 証明書の共有 8.2.4 署名アルゴリズム ▪ 証明書の共有 – 証明書の共有=秘密鍵の共有 – 共有すべきでないサーバ同士(異なるチームが管理している等)での証明書の

    共有およびセッション情報の共有は避けるべき ▪ 署名アルゴリズム – SHA1で署名した鍵はもう使えません – どうしてもSHA1しか使えない環境向けにサーバを建てる必要があるなら、両方 の鍵を使い分けるようにデプロイするしかない(面倒)
  4. 8.2.5 証明書チェーン ▪ チェーンが成立しておらずTLSが無効になっているサイトが意外と 多い ▪ 不完全なチェーンでもクライアントがよしなにしてくれる場合がある が、それに頼ってはいけない – チェーンがキャッシュされている場合

    – 欠けている情報を自動で問い合わせてくれる場合 – 順番が入れ違っている場合 ▪ 過不足なくチェーンを構築しないとパフォーマンスにも影響がでる – 例: チェーン構築に不要なルート証明書はチェーンに含めない (必要なルート証明書も存在するので厄介)
  5. 8.2.6 失効 8.2.7 CAの選択 ▪ 証明書の失効 – CRLおよびOSCPの情報を必ず証明書に含める ▪ 普通はついてくる

    – OSCPステープリングは失効情報照合の高速化のためほぼ導入必須 ▪ CAの選択 – サービスの質や技術の早期採用しているところを選ぶべき – 安いからという理由でやばいところから取らないようにしましょう ▪ 例: W◦Sign – ブラウザベンダが名指しで突如CAを信頼リストから外すこともあり得るので動 向は注視しておきましょう ▪ 例: Sym◦ntec
  6. 8.4.1 暗号スイートの提案 8.4.2 暗号の強度 ▪ サーバにおける暗号スイートの提案(ここ誤訳) – サーバからクライアントに暗号スイートを強制することが極めて重要 – サーバから提案する暗号スイートの中に弱いものを含めてはいけない

    ▪ 攻撃者が一番弱いものを選択できる ▪ 暗号の強度 – 128ビット安全性が得られる暗号 ▪ AESやCAMELLIA – AEADの仕様に対応したもの(GCM暗号利用モード)を選択する
  7. 8.4.3 PFS ▪ 鍵交換アルゴリズムにはDHEもしくはECDHEを選択 ▪ ECDHEでは、secp256r1の曲線を使う ▪ DHEでは、DHのパラメータを2048ビットに設定する – #

    openssl dhparam -out dhparams.pem 2048 ▪ Java6のように1024ビット以上のDHパラメータに対応していない場合 …… – 1024ビットのまま使い続ける – DHEを無効化してECDHEに一本化する
  8. 8.5.1 共有環境 ▪ セキュリティを考える上で共有ホストは論外 ▪ 標的サーバに対して高速にアクセスできる(つまり物理的に距離が近 い)ことで攻撃可能になる手段がある(例: Lucky13) ▪ 物理CPUを共有した仮想マシンも攻撃手段がある(例:

    キャッシュタ イミング攻撃) – 隣の仮想マシンが自分の管理下にないなどの状態も危険 ▪ 本気でセキュリティやるならまずは自分達だけが管理できるサーバを 用意するべき
  9. 8.5.4 複雑なアーキテクチャ ▪ 分散セッションキャッシュ – 例えばL3スイッチによるロードバランシングの場合、セッションキャッシュがある サーバに後続のリクエストが向くとは限らない – 解決策としては ▪

    Remote IP などを判断基準にし、同じクライアントからは同じバックエンドへ ▪ セッションキャッシュをバックエンド間で共有する(例えばredisにぶちこむ) – 後者の解決はセキュリティリスクになり得る
  10. 8.5.4 複雑なアーキテクチャ ▪ SSLオフロードとリバースプロキシ – リバースプロキシやSSLアクセラレータから実際の処理をするアプリケーションの 間の通信を信頼してはいけない – 現実としてこれを守っているWebエンジニアそうそういないと思います ▪

    アプリ層でその処理するの辛いし遅いし ▪ そもそもなんのための「アクセラレータ」ですかと – 内部に侵入した攻撃者による悪用が可能 ▪ 侵入された時点で既に色々アウトな気もする
  11. 8.5.4 複雑なアーキテクチャ ▪ インフラのアウトソージング – ELBとかを使う場合でも、自分の管理するEC2まできっちり暗号化してパケットを 届けましょう – これも案外やってない人の方が多い気がします ▪

    アプリ層で(ry ▪ というかせっかくELBのCPUで復号してくれるのにそのリソースを使わないんですか ▪ こんなこと気にするならAWS使わないことをまず考えるべきでは – RailsとかPHP系フレームワークとかGoでのHTTPS復号のノウハウがある人は こっそり教えてください
  12. 8.6.6 TIMEおよびBREACH ▪ TLSの圧縮は無効にしても、HTTP層での圧縮を無効にするのはパ フォーマンスに影響を及ぼす ▪ 抜かれて困る情報(CSRFトークンやセッションクッキーの値)にマス キングを行う – 既存コードの大幅改修が必要になる

    – というかこれをシュッとやってくれるフレームワークってありますか? ▪ リファラ情報が不正であったり、リファラが取れない場合は、圧縮を無 効化する – 正常利用の範囲なら圧縮が効くはずなのでパフォーマンスに影響を及ぼさない
  13. 8.6.7 トリプルハンドシェイク攻撃 8.6.8 Heartbleed ▪ トリプルハンドシェイク – クライアント証明書を用いる環境でのみ有効な攻撃なので、クライアント側のブ ラウザを最新にして対応するべき ▪

    Heartbleed – さすがに影響あった人ももう対応済みですよね? – OpenSSLのバージョン上げ – 秘密鍵、証明書を新規発行(だいたいのCAは無料サービスしてくれましたね) – セッションチケットを使っている場合はチケット鍵の更新 – サーバ上のユーザパスワードなどの変更
  14. 8.8.4 HSTS ▪ ブラウザに「このアドレスは絶対HTTPSでアクセスしろよ」ということを 要求する ▪ これにより – ブックマークがHTTPでもブラウザがよしなにHTTPSでアクセスしてくれる –

    secure属性のクッキーが抜かれない – HTTPSストリッピング攻撃を受けない – サイト側のミスでMixedコンテンツになっていてもある程度回避できる ▪ HSTSを使った場合、ブラウザは証明書や設定にミスがあった場合に 「無視して続行」ができなくなるので、安全に倒せる ▪ 詳しくは10章にて
  15. 8.8.5 CSP ▪ Content Security Policy ▪ 面倒な複雑な設定をすることで、XSSを回避したり、iFrameからペー ジを操作されることを防いだり、ページ内のリソースをhttpsに限定し たりなど、ページ内のコンテンツを限定できる

    ▪ なお現状は使いにくすぎる – 本当に安全に倒そうとすると、インラインjsやインラインcssが軒並全滅する – CSP Level2が実用範囲内になればnonceやhashが使えるようになるのでまだ なんとかなる?(それでも面倒) ▪ 詳しくは10章にて
  16. 8.8.6 プロトコルダウングレード攻撃に対する防御 ▪ ChromeやFirefoxは、中間者攻撃などでTLSのダウングレード時に 「Signaling Cipher Suite Value(SCSV)」によるダウングレード通知 を教えてくれるようになっている –

    ちなみにこれはRFC7505として標準化されている ▪ OpenSSL1.0.1jからは、SCSVをユーザが意識しないで扱えるように なっている ▪ このバージョン以前のOpenSSLを使っている場合は、ログやパケット を見てSCSVを検出してなんとかしましょう