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

HTTP2ことはじめ

Secure Sky Technology
October 02, 2018
820

 HTTP2ことはじめ

HTTP2ことはじめ

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