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

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

404139d782ec666acea93dffc86e089f?s=128

sylph01

June 22, 2018
Tweet

Transcript

  1. ୈ9ষ: ύϑΥʔϚϯε ࠷దԽ @ʰϓϩϑΣογϣφϧSSL/TLSʱಡ ॻձ Ryo Kajiwara (@s01), 6/22/2018

  2. TLS͸஗͍ ͱ͓΋ʔ͡ΌΜʁ

  3. 9.1 ஗Ԇͱ઀ଓͷ؅ཧ TCPϨΠϠʔͷ࿩ɻ • ଳҬ: ͓ۚͰղܾͩʂ • ஗Ԇ: ޫͷ଎͞Λॻ͖׵͑Δʹ͸͍͘ΒੵΊ͹͍͍Ͱ͔͢

  4. 9.1 ஗Ԇͱ઀ଓͷ؅ཧ [ఆٛ] RTT(round trip time): ϦΫΤετ͕໨త஍ʹ౸ୡ͠Ϩεϙϯ ε͕ฦͬͯ͘Δ·Ͱʹ͔͔Δ࣌ؒɻ ͜͜Ͱ͸αʔόͷॲཧ࣌ؒ͸ແࢹ͞Ε͍ͯΔͱࢥͬͯΑ͍ɻཁ͢ Δʹʢޫͷ଎͞͸ҰఆͱԾఆ͠ʣέʔϒϧͷԟ෮Ͱͷ௕͞ͱؔ܎

    ͕͋Δɻ 3way handshake͸1.5RTTɻͨͩ͠ΫϥΠΞϯτ͔Β௨৴Λ։࢝͢ ΔHTTPͳͲ͸ACKͱಉ࣌ʹΞϓϦέʔγϣϯσʔλΛૹ৴͢Δͷ Ͱ1RTTɻ
  5. 9.1.1 TCPͷ࠷దԽ TCP slow start: TCPͷ᫔᫓੍ޚํࣜɻ ૬ख͕ͲΕ͘Β͍ͷ଎౓Λग़ͤΔ͔Θ͔Βͳ͍ͷͰɺ࠷ॳ͸খ͞ ͳ᫔᫓΢Οϯυ΢(congestion window)Λ࢖͍ɺঃʑʹͦͷαΠζΛ ্͍͛ͯ͘ɻ

    (7ষͷղઆͰHEIST߈ܸΛղઆͨ͠ࡍʹઆ໌ͨ͠Α͏ͳؾ͕͢Δ) HTTP઀ଓ͸୹໋ͳͷͰcwnd͕খ͍͞ঢ়ଶͰӡ༻͞Ε͕ͪɻTLSϋ ϯυγΣΠΫ͸઀ଓͷ࠷ॳʹى͜ΔͷͰখ͍͞cwndͷӨڹΛड͚ ͕ͪɻ
  6. 9.1.1 TCPͷ࠷దԽ • ᫔᫓΢Οϯυ΢ॳظ஋ͷνϡʔχϯά • ࠷ۙ͸10 segment෼㲈15KBΛॳظ஋ͱ͢Δͷ͕ਪ঑ • idleޙͷslow start཈ࢭ

    • /etc/sysctl.conf ʹͯ net.ipv4.tcp_slow_start_after_idle=0
  7. 9.1.2 ઀ଓͷ࣋ଓੑ TCPϋϯυγΣΠΫ/TLSϋϯυγΣΠΫ͕஗ԆͷӨڹΛड͚͕ͪ (RTTΛ૿΍͕ͪ͠)ͳͷͰ઀ଓΛ։͖ͬͺʹ͍ͨ͠ɻˠkeep-alive ͨͩ͠ରԠෆे෼ͳWebαʔό͕ͨ·ʹ͍Δɻ ҎԼͷέʔεͰ༗ར/ෆར: (+) ΫϥΠΞϯτ͕ಉ͡αʔόʔʹͨ͘͞ΜͷϦΫΤετΛ͢Δ (-) ΫϥΠΞϯτ͕αʔόʔʹ1ճ͔͠ϦΫΤετΛ͠ͳ͍

  8. 9.1.3 SPDY, HTTP/2 ΈΜͳେ޷͖H2ͷ࿩ɻ SPDY: TCPͱHTTPͷؒʹ৽ͨͳϨΠϠΛಋೖɻෳ਺ͷHTTP req/res ΛଟॏԽ͢ΔͷͰ1αʔό͋ͨΓ1ϦΫΤετɻHTTP/2ͷ΋ͱʹ ͳͬͨɻ •

    TCP Fast Open: TCPϋϯυγΣΠΫ͔Β1RTTݮΒ͢ • QUIC: UDPͷ্ͰTCPͱಉ͡Α͏ͳ͜ͱͰ͖ͨΒ࠷ڧͩΑͶ
  9. 9.1.4 CDN ஍ཧతʹ෼ࢄͨ͠େྔͷαʔόΛӡ༻ɻ • Τοδʹ͓͚ΔΩϟογϯά • ઀ଓͷ؅ཧ • ಺෦ωοτϫʔΫͰ઀ଓΛ௕ظʹΘͨͬͯҡ࣋͢Δͱ઀ଓΛ ຖճൃੜͤ͞ͳͯ͘Α͍

    • ಺෦ωοτϫʔΫ಺Ͱ࠷దͳroutingΛ͢Δ • ߋͳΔ࠷దԽͷͨΊͷಠࣗϓϩτίϧ͕࢖͑Δ
  10. 9.2 TLSͷ࠷దԽ

  11. 9.2.1 伴ަ׵ • 伴௕: ௕͍ͱsecure͚ͩͲͦΕ͚ͩॏ͍ɻ • ൿີ伴ΞϧΰϦζϜ • RSA͸࠷௿Ͱ΋2048bitҎ্ʹͳ͖ͬͯͯΔɻܭࢉྔ͕ͭΒ ͍ɻECDSAͳΒ΋ͬͱ଎͍ɻ

  12. 9.2.1 伴ަ׵ • 伴ަ׵ΞϧΰϦζϜ • RSA͸Forward Secrecy͕ͳ͍ • DHE͸஗͍ •

    ΑΖ͍͠ɺͳΒ͹ECDHEͩ • secp256v1ͳΒ128bit҆શ • secp384v1ʹͯ͠΋҆શੑ͸ͦ͜·ͰΑ͘ͳΒͳ͍͚Ͳܭ ࢉྔ͕૿͑Δ
  13. 9.2.1 伴ަ׵ ςετ݁Ռͷάϥϑ(p268): • RSA -> ECDHE_ECDSA ʹ͢ΔͱPFSΛಘ্ͨͰϋϯυγΣΠΫͷ ύϑΥʔϚϯε͕2ഒʹ޲্ʂ •

    DHE͸1024bitͰ͢Β஗͍ɻ • ஫: ΫϥΠΞϯτ͸࡞ۀ͕૿͑ͯ΋໰୊Ͱ͸ͳ͍ɻαʔόʔ͸ͨ ͘͞Μͷ઀ଓΛ͞͹͘ͷͰ࡞ۀ͕૿͑Δͱͦͷ෼͚ͩͭΒ͍ɻ
  14. False Startʹ͍ͭͯ ϋϯυγΣΠΫ͕੒ޭ͢ΔલఏͰΞϓϦέʔγϣϯσʔλΛૹΕ ΔΑ͏ʹ͢Δ࢓༷ɻ ߈ܸ͞Εͨ৔߹҉߸Խ͞ΕͨΞϓϦέʔγϣϯσʔλͷҰ෦͕ૹ ৴͞Εͯ͠·͏ɻ·ͨɺϋϯυγΣΠΫͷ׬શੑݕূ͸ϋϯυ γΣΠΫ͕ऴΘΒͳ͍ͱͰ͖ͳ͍ͷͰ҉߸ԽύϥϝʔλΛ߈ܸ͞ ΕΔ͜ͱ͕͋Γ͏Δɻ →Googleʮڧ͍҉߸࢖ͬͯΕ͹͍͍Μ͡Όͳ͍ͷʁʯ →Logjam߈ܸʮͦΜͳ͜ͱ͸ͳ͍ʯʢڧ͍伴ަ׵΋ඞཁʣ

  15. 9.2.2 ূ໌ॻ • ূ໌ॻνΣʔϯ͸ඞཁ࠷௿ݶͷαΠζʹ͠ɺ׬શͳνΣʔϯΛ ఏࣔ͢Δ͜ͱ • αʔόͷূ໌ॻ + ൃߦݩCAͷূ໌ॻ •

    ϧʔτূ໌ॻ͸UAͷखݩʹ͋ΔͷͰ͚ͭͳͯ͘Α͍ • ׬શͳ΋ͷͰͳ͍ͱ୳͠ʹߦ͘ख͕ؒൃੜ • αΠζ͕খ͘͞ͳΔͷͰECDSAূ໌ॻΛ࢖͏
  16. 9.2.2 ূ໌ॻ • 1ͭͷূ໌ॻΛෳ਺αΠτͰڞ༗͢Δͱɺϗετ໊Λূ໌ॻʹ௥ Ճ͠ͳͯ͘͸͍͚ͳ͘ͳͬͯূ໌ॻͷαΠζ͕௕͘ͳΔ • ओʹSNIඇରԠΫϥΠΞϯτରࡦͱ͍͏͚ΕͲɺͦ΋ͦ΋͜ Μͳ͜ͱ͠ͳ͍ͷ͕ਖ਼͍͠ͷͰ͸…ʁ • ͱ͸͍͑ɺCloudFlareܦ༝ͷGitHub

    PagesͷSSLԽͩͱ SubjectAltName͕ࢁ΄Ͳ͍ͭͯ͘Δͷͩͬͨ • ࠷ۙ͸ͦͷඞཁͳ͘ͳͬͨ
  17. 9.2.3 ࣦޮͷ֬ೝ • CRLͰ͸ͳ͘OCSPΛ࢖͏ɻCRL͸௕͘ͳΓ͕ͪɻ • ߴ଎ͳOCSPϨεϙϯμΛඋ͑ͨCAΛ࢖͏ • OCSP staplingΛ࢖͏ EV͸ৗʹࣦޮ֬ೝΛ͢Δ͕DV͸ඞͣ͠΋ͦͷݶΓͰ͸ͳ͍ͷͰEV

    ΑΓDVͷ΄͏͕଎͍ʂEV͸ΦϫίϯʂʁˠOCSP stapling͢Ε͹ύ ϑΥʔϚϯε͸มΘΒͳ͍ͷͰͦΜͳ͜ͱ͸ͳ͍ɻ
  18. 9.2.4 ηογϣϯϦβϯϓγϣϯ ϑϧϋϯυγΣΠΫͷ਺͕ݮΕ͹ݮΔ΄ͲΑ͍ɻsession cacheΛద ੾ʹઃఆ͠Α͏ɻ

  19. 9.2.5 సૹͷΦʔόʔϔου TLSͷసૹ୯Ґ͸TLSϨίʔυ(௨ৗ16384byte)ɻ͜͜ʹσʔλ͕ଟ ͘ೖΕ͹ೖΔ΄Ͳޮ཰͕Α͍ɻ σʔλҎ֎ͷ෦෼ͱ͸ϔομɺMACɺύσΟϯάɺIVͳͲɻ AEADͩͱΦʔόʔϔου͕খ͍͞ɻMAC-then-Encryptͷ᠘ͷӨڹ ΋ड͚ͳ͍͠ɺTLS 1.2Ҏ߱ͷAEADར༻͸ηΩϡϦςΟͰ΋ύ ϑΥʔϚϯεͰ΋༏ΕͯΔͱΘ͔Δɻ

  20. 9.2.6 ڞ௨伴҉߸Խํࣜ AES-NIରԠϚγϯΛ࢖͑ɻ/proc/cpuinfoͷflagsʹaesͬͯೖͬͯ Ε͹okɻ • AES͸଎͍ɻRC4͸଎͍͚Ͳ੬ऑͳͷͰ࢖͏ཧ༝͕ͳ͍ɻ • CAMELLIAͱAES͸ΞΫηϥϨʔγϣϯ͕͋ΔͱAESͷ΄͏͕2.77 ഒ଎͍ɻ •

    SHA256͸SHA-1ΑΓ஗͍ɻ࢓ํͳ͍Ͷɻ • AEAD(GCMϞʔυ)͸CBCϞʔυͱൺ΂ͯ଎͍ɻ׬ᘳͰ͸ʁ
  21. 9.2.7 TLSϨίʔυͷόοϑΝ… TLSϨίʔυ͕ෳ਺ύέοτʹ෼ׂ͞ΕΔ͜ͱ͕͋Δɻͦͷ৔߹Ͱ ΋TLSϨίʔυ͕׬શʹἧ͏·Ͱ͸෮߸Խ/׬શੑݕূ͕Ͱ͖ͳ ͍ɻ TLSϨίʔυαΠζͷௐ੔͕Ͱ͖ΔWebαʔόͳΒϨίʔυαΠζ ΛԼ͛Δํ๏΋͋Δɻ MTU - IPv6

    header - TCP header - TCP record = data size MTU͕มԽ͠͏Δ͜ͱʹ஫ҙɻ
  22. 9.2.8 ૬ޓӡ༻ੑ ৽͍͠ϓϩτίϧΛαʔόʔ͕ड͚෇͚ͳ͍ͱࣗಈతʹ࠶ωΰγ Τʔγϣϯ͕ൃੜͯ͠͠·͍RTT͕૿͑Δɻ͓ͱͳ͘͠࠷৽όʔ δϣϯ/࠷৽֦ுʹରԠͤ͞Δͷ͕Α͍ɻ

  23. 9.2.9 ϋʔυ΢ΣΞΞΫηϥϨʔγϣ ϯ ݱ୅తʹ͸αʔό͕҉߸νοϓΛผʹ࣋ͭཧ༝͸ύϑΥʔϚϯε ໘Ͱ͸΄ͱΜͲଘࡏ͠ͳ͍ɻͲͪΒ͔ͱ͍͏ͱHSM(hardware security module)ͱͯ͠ͷ༻్ɻ

  24. 9.3 DoS߈ܸ TLSʹؔ܎ͳ͍ରࡦͱͯ͠͸ • গ਺ͷIPΞυϨε͔ΒདྷΔ৔߹͸throttling • αʔό਺Λ૿΍͢ʢࡳଋͰԥΔʣ • ͦΕͰ΋ແཧͳΒDDoSରࡦઐ໳ۀऀΛཔΔʢ΍͸ΓࡳଋͰԥ Δʣ

  25. 9.3.1 伴ަ׵ͱ҉߸Խʹର͢ΔCPUͷ ίετ RSAͰ͸ެ։伴ͷॲཧʢʹΫϥΠΞϯτ͕΍ΔʣΑΓ΋ൿີ伴ͷ ॲཧʢʹαʔό͕΍Δʣͷ΄͏͕ॏ͍ɻ →ECDSAΛ࢖͑ɻ

  26. 9.3.2 ΫϥΠΞϯτىݯͷ࠶ωΰγ Τʔγϣϯ ͜Ε͕ՄೳͳΒɺಉҰ઀ଓͰେྔͷϋϯυγΣΠΫΛൃੜͤ͞Β ΕΔͷͰɺthrottlingͷҙຯ͕ͳ͍ɻ IIS 6ɺApache 2.2.15Ҏ߱Ͱ͸ΫϥΠΞϯτىݯͷ࠶ωΰγΤʔ γϣϯ͸ରԠ͍ͯ͠ͳ͍ʢNginx͸ͦ΋ͦ΋࠷ॳ͔Βͳ͍ʣͷͰݱ ୅తʹ͸΄΅໰୊ͳ͍ɻηΩϡϦςΟ্ͷ੬ऑੑ΋͋Γ͏ΔͷͰ

    ࢖Θͳ͍΄͏͕͍͍ػೳͰ͢Ͷʢˠ7.1ষʣɻ
  27. 9.3.3 TLSʹର͢ΔDoS߈ܸͷ࠷దԽ ஫: DoS߈ܸͷ࠷దԽͰ͢ɻ • ҉߸ॲཧΛ͠ͳ͍ϋϯυγΣΠΫϝοηʔδΛϋʔυίʔυ • αʔό͔Βड͚औͬͨϝοηʔδͷparse/ݕূΛলུ ͢Δͱαʔόʹ͸࠷ޙ·Ͱ༗ޮͳϋϯυγΣΠΫʹݟ͑ΔͷͰɺ αʔόͰ͸ܭࢉ͕૸ͬͯ͠·͏ɻαʔόʹରͯ͠ʮޮ཰Α͘ʯ

    ʮܭࢉΛͤ͞Δʯ͜ͱ͕Ͱ͖ͯ͠·͏ɻ͜ΕΛ΍Δͷ͕ sslsqueezeɻ