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

HTTP2ことはじめ

Avatar for Secure Sky Technology Secure Sky Technology
October 02, 2018
990

 HTTP2ことはじめ

HTTP2ことはじめ

Avatar for Secure Sky Technology

Secure Sky Technology

October 02, 2018
Tweet

Transcript

  1. もくじ 1. はじめに・目的 2. HTTP/2が生まれた背景 3. 本セッションの提案 4. HTTP/2 詳細(ことはじめ)

    5. HTTP/2 パフォーマンス考察 6. デバッグ 7. (診断員目線の)HTTP/2 セキュリティ考察 8. まとめ 9. おわりに 4
  2. いまからはここ 1. はじめに・目的 2. HTTP/2が生まれた背景 3. 本セッションの提案 4. HTTP/2 詳細(ことはじめ)

    5. HTTP/2 パフォーマンス考察 6. デバッグ 7. (診断員目線の)HTTP/2 セキュリティ考察 8. まとめ 9. おわりに 5
  3. 1. はじめに -自己紹介- 岩間 湧 越智 郁 ・診断員として1月に入社 ・たまにCTF ・最近アニメ貪ってます

    ・9月に入ってから  緩やかに体重増加中 ・新卒入社2年目の診断員 ・北九州高専出身(制情) ・9月に入ってから  楽器をはじめたけど  さっそく休会中 6
  4. 1. はじめに - 本セッションの目的 - 本講演でみなさんと目指すGOAL • HTTP/2のことを知る • HTTP/2の性能を知る

    • 検証方法の紹介 わたしたちのGOAL • 診断員目線でセキュリティ面を考察する(私見) 11
  5. いまからはここ 1. はじめに・目的 2. HTTP/2が生まれた背景 3. 本セッションの提案 4. HTTP/2 詳細(ことはじめ)

    5. HTTP/2 パフォーマンス考察 6. デバッグ 7. (診断員目線の)HTTP/2 セキュリティ考察 8. まとめ 9. おわりに 12
  6. いまからはここ 1. はじめに・目的 2. HTTP/2が生まれた背景 3. 本セッションの提案 4. HTTP/2 詳細(ことはじめ)

    5. HTTP/2 パフォーマンス考察 6. デバッグ 7. (診断員目線の)HTTP/2 セキュリティ考察 8. まとめ 9. おわりに 16
  7. 3. 本セッションの提案 -再確認- • HTTP/2のことを知る →4章「ことはじめ」 • HTTP/2の性能を知る →5章パフォーマンス • 検証方法の紹介

    →随時!(全体構成だけ今から先に) • 診断員目線でセキュリティ面考察 →7章  セッション中に  HTTP/2 を「h2」  HTTP/1.1を「h1」  と呼ぶことがあります 17
  8. 3. 本セッションの提案 -環境構成- HostOS (WIndows) GuestOS(Ubuntu16.04) enp0s8 docker0 (bridge) VirtualBox

    Host-Only Network network adapter PHP eth0 Apache2 eth0 H2O eth0 Nginx eth0 vethxxx vethxxx vethxxx vethxxx :443 :443 :443 :9000 :8443 :9443 Port Forward Protocol :443 ➡ Nginx :443 h2 :1443 ➡ H2O :443 h2 :2443 ➡ Apache2 :443 h2 :8443 ➡ Nginx :8443 h1 :9443 ➡ Nginx :9443 h2(tlsv1.1) 172.16.1.0/24 .10 .1 Docker Networks Container #1 Container #2 Container #3 Container #4 h2load nghttp 18
  9. いまからはここ 1. はじめに・目的 2. HTTP/2が生まれた背景 3. 本セッションの提案 4. HTTP/2 詳細(ことはじめ)

    5. HTTP/2 パフォーマンス考察 6. デバッグ 7. (診断員目線の)HTTP/2 セキュリティ考察 8. まとめ 9. おわりに 19
  10. 4. HTTP/2のキーワード Client Server HTTP/2 TLS TCP/IP Connection Stream H

    H D Server Push HPACK ALPN e.t.c. negotiation Framing (Binary) 20 いろいろ あるっちゃん
  11. 4. セマンティクスの維持 セマンティクス: その機能に求められる「意図」 Client (Browser) Server 変更 なし Web

    app h1相当の メッセージ ・メソッド ・ヘッダ ・ボディ ・ステータスコード ・ボディ h2形式の リクエスト h2形式の レスポンス 22
  12. 4. HTTP/2のキーワード Client Server HTTP/2 TLS TCP/IP Connection Stream H

    H D Server Push HPACK ALPN e.t.c. negotiation Framing (Binary) 25
  13. 26 HPACK 同じヘッダ、また送るの? このデータ重 …続きはまだ? Stream 構成 決まってる 解釈楽 ~!

    終わりは どこ? バイナリ フレーム 4. HTTP/2のキーワード index.html ramen.jpg どうせ使うよね 一緒にどうぞ Server Push
  14. 27 HPACK 同じヘッダ、また送るの? このデータ重 …続きはまだ? Stream 構成 決まってる 解釈楽 ~!

    終わりは どこ? バイナリ フレーム 4. HTTP/2のキーワード index.html ramen.jpg どうせ使うよね 一緒にどうぞ Server Push
  15. 4. バイナリフレーム Client Server HTTP/2 TLS TCP/IP Connection Stream H

    H D Server Push HPACK ALPN negotiation Framing (Binary) 28
  16. 4. バイナリフレーム POST /upload HTTP1.1 Host:www.example.org Content-Type: application/json Content-Length:15 {“msg”:”hello”}

    HEADERSフレーム DATAフレーム H H D HTTP/2における通信の最小単位が「フレーム」 HTTP/1.1 HTTP/2 29
  17. 33 HPACK 同じヘッダ、また送るの? このデータ重 …続きはまだ? Stream 構成 決まってる 解釈楽 ~!

    終わりは どこ? バイナリ フレーム 4. HTTP/2のキーワード index.html ramen.jpg どうせ使うよね 一緒にどうぞ Server Push
  18. 4. HPACK 2つの辞書 • 静的テーブル • 動的テーブル 35 INDEX 1

    ・ ・ ・ 61 静的テーブル 62 ・ ・ ・ 動的テーブル
  19. 4. HPACK 82 1 0 0 0 0 0 1

    0 RFC7541 「インデックスヘッダフィールド表現」 静的テーブルまたは動的テーブルのエントリを識別 インデックス(=2) 37 RFC 7541 付録A
  20. 38 HPACK 同じヘッダ、また送るの? このデータ重 …続きはまだ? Stream 構成 決まってる 解釈楽 ~!

    終わりは どこ? バイナリ フレーム 4. HTTP/2のキーワード index.html ramen.jpg どうせ使うよね 一緒にどうぞ Server Push
  21. 4. Stream Stream H H D Connection HTTP/2における通信を管理する単位で、多重化能力のコア技術 [1] [2]

    [0] リクエスト レスポンス 1ストリーム Client→Serverの場合 Stream ID は奇数 フレームの フラグで開閉 stream ID 40 Server→Clientの場合 Stream ID は偶数 (Server Push)
  22. 53 HPACK 同じヘッダ、また送るの? このデータ重 …続きはまだ? Stream 構成 決まってる 解釈楽 ~!

    終わりは どこ? バイナリ フレーム 4. HTTP/2のキーワード index.html ramen.jpg どうせ使うよね 一緒にどうぞ Server Push
  23. 4. Server Push Client Server HTTP/2 TLS TCP/IP Connection Stream

    H H D Server Push HPACK ALPN negotiation 54
  24. 4. Server Push Connection Stream H H D ALPN 1:

    予想 (次はramen.jpg) 2: index.htmlをリクエスト index.html ramen.jpg 3: index.htmlをレスポンス 3: ramen.jpgをプッシュ 4: キャッシュとして  ramen.jpgを保存 5: 通常のHTTPの  仕組み同様  キャッシュを利用する 55
  25. 4. Server Push Promised-Stream-ID プッシュするデータを 送信するために予約するストリーム サーバからの通信のためIDは偶数の2 Header Block Fragment

    予想するHTTPリクエストのヘッダ。 サーバはこのリクエストを受け取ったと想定して HTTPレスポンスを返す 56
  26. 4. negotiation Client Server HTTP/2 TLS TCP/IP Connection Stream H

    H D Server Push HPACK ALPN negotiation 57
  27. 4. negotiation http:// は 80ポート https:// は 443ポート https://www.example.com/index.html 通信開始前に相手がh2とh1のどちらに対応しているか確認する

    h2? h1? ・ALPN (Application Layer Protocol Negotiation) ・HTTP/1.1で接続してからアップグレード ・HTTP/2に対応していることが事前にわかっている 3つの方法 58
  28. いまからはここ 1. はじめに・目的 2. HTTP/2が生まれた背景 3. 本セッションの提案 4. HTTP/2 詳細(ことはじめ)

    5. HTTP/2 パフォーマンス考察 6. デバッグ 7. (診断員目線の)HTTP/2 セキュリティ考察 8. まとめ 9. おわりに 62
  29. 5. パフォーマンス HPACKの圧縮比率 圧縮前ヘッダサイズ (KB) 圧縮後ヘッダサイズ (KB) 圧縮比率 h1 14.84

    14.84 0.00% Nginx h2 11.53 7.33 36.43% H2O h2 11.50 0.57 95.04% Apache2 h2 14.11 0.61 95.67% 71
  30. いまからはここ 1. はじめに・目的 2. HTTP/2が生まれた背景 3. 本セッションの提案 4. HTTP/2 詳細(ことはじめ)

    5. HTTP/2 パフォーマンス考察 6. デバッグ 7. (診断員目線の)HTTP/2 セキュリティ考察 8. まとめ 9. おわりに 74
  31. 6. デバッグ • Chrome Developer Tools & Net Internals •

    Nghttp2 tools(nghttp, nghttpx, h2load, inflatehd,deflatehd) • curl • h2i • Wireshark • ローカルプロキシ • その他実装状況 75
  32. 6. デバッグ • Chrome Developer Tools & Net Internals •

    Nghttp2 tools(nghttp, nghttpx, h2load, inflatehd,deflatehd) • curl • h2i • Wireshark • ローカルプロキシ • その他実装状況 76
  33. 6. デバッグ • Chrome Developer Tools & Net Internals •

    nghttp2 library(nghttp, nghttpx, h2load, inflatehd,deflatehd) • curl • h2i • Wireshark • ローカルプロキシ • その他実装状況 82
  34. 6. デバッグ ツール名 内容 nghttp CLIで動作するクライアントソフト nghttpd サーバ nghttpx プロキシサーバ

    h2load パフォーマンス測定ツール (★今回使用) inflatehd HPACKで圧縮されたヘッダ文字列を json形式で解凍(decompress) deflatehd json形式のヘッダをHPACK形式の文字列に圧縮 84
  35. 6. デバッグ • Chrome Developer Tools & Net Internals •

    Nghttp2 tools(nghttp, nghttpx, h2load, inflatehd,deflatehd) • curl • h2i • Wireshark • ローカルプロキシ • その他実装状況 85
  36. 6. デバッグ • Chrome Developer Tools & Net Internals •

    Nghttp2 tools(nghttp, nghttpx, h2load, inflatehd,deflatehd) • curl • h2i • Wireshark • ローカルプロキシ • その他実装状況 88
  37. 6. デバッグ インストール方法(golang含む) # apt-get install -y golang-1.10 # ln

    -s /usr/lib/go-1.10/bin/* /usr/bin/ # go get github.com/bradfitz/http2/h2i # ln -s $(go env GOPATH)/bin/h2i /usr/bin/h2i 90
  38. 6. デバッグ • Chrome Developer Tools & Net Internals •

    Nghttp2 tools(nghttp, nghttpx, h2load, inflatehd,deflatehd) • curl • h2i • Wireshark • ローカルプロキシ • その他実装状況 92
  39. 6. デバッグ • Chrome Developer Tools & Net Internals •

    Nghttp2 tools(nghttp, nghttpx, h2load, inflatehd,deflatehd) • curl • h2i • Wireshark • ローカルプロキシ • その他実装状況 94
  40. いまからはここ 1. はじめに・目的 2. HTTP/2が生まれた背景 3. 本セッションの提案 4. HTTP/2 詳細(ことはじめ)

    5. HTTP/2 パフォーマンス考察 6. デバッグ 7. (診断員目線の)HTTP/2 セキュリティ考察 8. まとめ 9. おわりに 100
  41. 7. その他 • HTTP/2ではTLSの利用にあたり条件がある ◦ TLS1.2以上にする ◦ SNI拡張に対応する ◦ TLSでの圧縮を無効にする

    ◦ HTTP/2通信が始まって以降の再ネゴシエーションを無効にする ◦ HTTP/2仕様中で禁止された暗号スイートの使用しない 109
  42. いまからはここ 1. はじめに・目的 2. HTTP/2が生まれた背景 3. 本セッションの提案 4. HTTP/2 詳細(ことはじめ)

    5. HTTP/2 パフォーマンス考察 6. デバッグ 7. (診断員目線の)HTTP/2 セキュリティ考察 8. まとめ 9. おわりに 116
  43. more detail…? 今日話せなかったこと • Flow Control • Priority • 他のフレーム

    • 他のネゴシエーション etc... 関連知識 • QUIC • TLSv1.3 • websocket over HTTP/2(RFC 8441) etc... 118
  44. 参考・引用資料 • Learning HTTP/2 A Practical Guide for Beginners ◦

    Stephen Ludin, Javier Garza • Real World HTTP -歴史とコードに学ぶインターネットとウェブ技術 ◦ 渋川よしき • ハイパフォーマンスブラウザネットワーキング ◦ Ilya Grigorik ほか • Software Design 2015 11月号 • Nghttp2: HTTP/2 C Library ◦ https://nghttp2.org/ • HTTP/2 wg github ◦ https://http2.github.io/ • H2O ◦ https://h2o.examp1e.net/ 124