ୈ9ষ: ύϑΥʔϚϯε࠷దԽ@ʰϓϩϑΣογϣφϧSSL/TLSʱಡॻձRyo Kajiwara (@s01), 6/22/2018
View Slide
TLS͍ͱ͓ʔ͡ΌΜʁ
9.1 ԆͱଓͷཧTCPϨΠϠʔͷɻ• ଳҬ: ͓ۚͰղܾͩʂ• Ԇ: ޫͷ͞Λॻ͖͑Δʹ͍͘ΒੵΊ͍͍Ͱ͔͢
9.1 Ԇͱଓͷཧ[ఆٛ] RTT(round trip time): ϦΫΤετ͕తʹ౸ୡ͠Ϩεϙϯε͕ฦͬͯ͘Δ·Ͱʹ͔͔Δ࣌ؒɻ͜͜Ͱαʔόͷॲཧ࣌ؒແࢹ͞Ε͍ͯΔͱࢥͬͯΑ͍ɻཁ͢Δʹʢޫͷ͞ҰఆͱԾఆ͠ʣέʔϒϧͷԟ෮Ͱͷ͞ͱ͕ؔ͋Δɻ3way handshake1.5RTTɻͨͩ͠ΫϥΠΞϯτ͔Β௨৴Λ։࢝͢ΔHTTPͳͲACKͱಉ࣌ʹΞϓϦέʔγϣϯσʔλΛૹ৴͢ΔͷͰ1RTTɻ
9.1.1 TCPͷ࠷దԽTCP slow start: TCPͷ੍ޚํࣜɻ૬ख͕ͲΕ͘Β͍ͷΛग़ͤΔ͔Θ͔Βͳ͍ͷͰɺ࠷ॳখ͞ͳΟϯυ(congestion window)Λ͍ɺঃʑʹͦͷαΠζΛ্͍͛ͯ͘ɻ(7ষͷղઆͰHEIST߈ܸΛղઆͨ͠ࡍʹઆ໌ͨ͠Α͏ͳؾ͕͢Δ)HTTPଓ໋ͳͷͰcwnd͕খ͍͞ঢ়ଶͰӡ༻͞Ε͕ͪɻTLSϋϯυγΣΠΫଓͷ࠷ॳʹى͜ΔͷͰখ͍͞cwndͷӨڹΛड͚͕ͪɻ
9.1.1 TCPͷ࠷దԽ• Οϯυॳظͷνϡʔχϯά• ࠷ۙ10 segment㲈15KBΛॳظͱ͢Δͷ͕ਪ• idleޙͷslow startࢭ• /etc/sysctl.conf ʹͯnet.ipv4.tcp_slow_start_after_idle=0
9.1.2 ଓͷ࣋ଓੑTCPϋϯυγΣΠΫ/TLSϋϯυγΣΠΫ͕ԆͷӨڹΛड͚͕ͪ(RTTΛ૿͕ͪ͠)ͳͷͰଓΛ։͖ͬͺʹ͍ͨ͠ɻˠkeep-aliveͨͩ͠ରԠෆेͳWebαʔό͕ͨ·ʹ͍ΔɻҎԼͷέʔεͰ༗ར/ෆར:(+) ΫϥΠΞϯτ͕ಉ͡αʔόʔʹͨ͘͞ΜͷϦΫΤετΛ͢Δ(-) ΫϥΠΞϯτ͕αʔόʔʹ1ճ͔͠ϦΫΤετΛ͠ͳ͍
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.1.4 CDNཧతʹࢄͨ͠େྔͷαʔόΛӡ༻ɻ• Τοδʹ͓͚ΔΩϟογϯά• ଓͷཧ• ෦ωοτϫʔΫͰଓΛظʹΘͨͬͯҡ࣋͢ΔͱଓΛຖճൃੜͤ͞ͳͯ͘Α͍• ෦ωοτϫʔΫͰ࠷దͳroutingΛ͢Δ• ߋͳΔ࠷దԽͷͨΊͷಠࣗϓϩτίϧ͕͑Δ
9.2 TLSͷ࠷దԽ
9.2.1 伴ަ• 伴: ͍ͱsecure͚ͩͲͦΕ͚ͩॏ͍ɻ• ൿີ伴ΞϧΰϦζϜ• RSA࠷Ͱ2048bitҎ্ʹͳ͖ͬͯͯΔɻܭࢉྔ͕ͭΒ͍ɻECDSAͳΒͬͱ͍ɻ
9.2.1 伴ަ• 伴ަΞϧΰϦζϜ• RSAForward Secrecy͕ͳ͍• DHE͍• ΑΖ͍͠ɺͳΒECDHEͩ• secp256v1ͳΒ128bit҆શ• secp384v1ʹͯ҆͠શੑͦ͜·ͰΑ͘ͳΒͳ͍͚Ͳܭࢉྔ͕૿͑Δ
9.2.1 伴ަςετ݁Ռͷάϥϑ(p268):• RSA -> ECDHE_ECDSA ʹ͢ΔͱPFSΛಘ্ͨͰϋϯυγΣΠΫͷύϑΥʔϚϯε͕2ഒʹ্ʂ• DHE1024bitͰ͢Β͍ɻ• : ΫϥΠΞϯτ࡞ۀ͕૿͑ͯͰͳ͍ɻαʔόʔͨ͘͞ΜͷଓΛ͘͞ͷͰ࡞ۀ͕૿͑Δͱͦͷ͚ͩͭΒ͍ɻ
False Startʹ͍ͭͯϋϯυγΣΠΫ͕ޭ͢ΔલఏͰΞϓϦέʔγϣϯσʔλΛૹΕΔΑ͏ʹ͢Δ༷ɻ߈ܸ͞Εͨ߹҉߸Խ͞ΕͨΞϓϦέʔγϣϯσʔλͷҰ෦͕ૹ৴͞Εͯ͠·͏ɻ·ͨɺϋϯυγΣΠΫͷશੑݕূϋϯυγΣΠΫ͕ऴΘΒͳ͍ͱͰ͖ͳ͍ͷͰ҉߸ԽύϥϝʔλΛ߈ܸ͞ΕΔ͜ͱ͕͋Γ͏Δɻ→Googleʮڧ͍҉߸ͬͯΕ͍͍Μ͡Όͳ͍ͷʁʯ→Logjam߈ܸʮͦΜͳ͜ͱͳ͍ʯʢڧ͍伴ަඞཁʣ
9.2.2 ূ໌ॻ• ূ໌ॻνΣʔϯඞཁ࠷ݶͷαΠζʹ͠ɺશͳνΣʔϯΛఏࣔ͢Δ͜ͱ• αʔόͷূ໌ॻ + ൃߦݩCAͷূ໌ॻ• ϧʔτূ໌ॻUAͷखݩʹ͋ΔͷͰ͚ͭͳͯ͘Α͍• શͳͷͰͳ͍ͱ୳͠ʹߦ͘ख͕ؒൃੜ• αΠζ͕খ͘͞ͳΔͷͰECDSAূ໌ॻΛ͏
9.2.2 ূ໌ॻ• 1ͭͷূ໌ॻΛෳαΠτͰڞ༗͢Δͱɺϗετ໊Λূ໌ॻʹՃ͠ͳ͍͚ͯ͘ͳ͘ͳͬͯূ໌ॻͷαΠζ͕͘ͳΔ• ओʹSNIඇରԠΫϥΠΞϯτରࡦͱ͍͏͚ΕͲɺͦͦ͜Μͳ͜ͱ͠ͳ͍ͷ͕ਖ਼͍͠ͷͰ…ʁ• ͱ͍͑ɺCloudFlareܦ༝ͷGitHub PagesͷSSLԽͩͱSubjectAltName͕ࢁ΄Ͳ͍ͭͯ͘Δͷͩͬͨ• ࠷ۙͦͷඞཁͳ͘ͳͬͨ
9.2.3 ࣦޮͷ֬ೝ• CRLͰͳ͘OCSPΛ͏ɻCRL͘ͳΓ͕ͪɻ• ߴͳOCSPϨεϙϯμΛඋ͑ͨCAΛ͏• OCSP staplingΛ͏EVৗʹࣦޮ֬ೝΛ͢Δ͕DVඞͣͦ͠ͷݶΓͰͳ͍ͷͰEVΑΓDVͷ΄͏͕͍ʂEVΦϫίϯʂʁˠOCSP stapling͢ΕύϑΥʔϚϯεมΘΒͳ͍ͷͰͦΜͳ͜ͱͳ͍ɻ
9.2.4 ηογϣϯϦβϯϓγϣϯϑϧϋϯυγΣΠΫͷ͕ݮΕݮΔ΄ͲΑ͍ɻsession cacheΛదʹઃఆ͠Α͏ɻ
9.2.5 సૹͷΦʔόʔϔουTLSͷసૹ୯ҐTLSϨίʔυ(௨ৗ16384byte)ɻ͜͜ʹσʔλ͕ଟ͘ೖΕೖΔ΄Ͳޮ͕Α͍ɻσʔλҎ֎ͷ෦ͱϔομɺMACɺύσΟϯάɺIVͳͲɻAEADͩͱΦʔόʔϔου͕খ͍͞ɻMAC-then-Encryptͷ᠘ͷӨڹड͚ͳ͍͠ɺTLS 1.2Ҏ߱ͷAEADར༻ηΩϡϦςΟͰύϑΥʔϚϯεͰ༏ΕͯΔͱΘ͔Δɻ
9.2.6 ڞ௨伴҉߸ԽํࣜAES-NIରԠϚγϯΛ͑ɻ/proc/cpuinfoͷflagsʹaesͬͯೖͬͯΕokɻ• AES͍ɻRC4͍͚Ͳ੬ऑͳͷͰ͏ཧ༝͕ͳ͍ɻ• CAMELLIAͱAESΞΫηϥϨʔγϣϯ͕͋ΔͱAESͷ΄͏͕2.77ഒ͍ɻ• SHA256SHA-1ΑΓ͍ɻํͳ͍Ͷɻ• AEAD(GCMϞʔυ)CBCϞʔυͱൺ͍ͯɻᘳͰʁ
9.2.7 TLSϨίʔυͷόοϑΝ…TLSϨίʔυ͕ෳύέοτʹׂ͞ΕΔ͜ͱ͕͋Δɻͦͷ߹ͰTLSϨίʔυ͕શʹἧ͏·Ͱ෮߸Խ/શੑݕূ͕Ͱ͖ͳ͍ɻTLSϨίʔυαΠζͷௐ͕Ͱ͖ΔWebαʔόͳΒϨίʔυαΠζΛԼ͛Δํ๏͋ΔɻMTU - IPv6 header - TCP header - TCP record = data sizeMTU͕มԽ͠͏Δ͜ͱʹҙɻ
9.2.8 ૬ޓӡ༻ੑ৽͍͠ϓϩτίϧΛαʔόʔ͕ड͚͚ͳ͍ͱࣗಈతʹ࠶ωΰγΤʔγϣϯ͕ൃੜͯ͠͠·͍RTT͕૿͑Δɻ͓ͱͳ͘͠࠷৽όʔδϣϯ/࠷৽֦ுʹରԠͤ͞Δͷ͕Α͍ɻ
9.2.9 ϋʔυΣΞΞΫηϥϨʔγϣϯݱతʹαʔό͕҉߸νοϓΛผʹ࣋ͭཧ༝ύϑΥʔϚϯε໘Ͱ΄ͱΜͲଘࡏ͠ͳ͍ɻͲͪΒ͔ͱ͍͏ͱHSM(hardwaresecurity module)ͱͯ͠ͷ༻్ɻ
9.3 DoS߈ܸTLSʹؔͳ͍ରࡦͱͯ͠• গͷIPΞυϨε͔ΒདྷΔ߹throttling• αʔόΛ૿͢ʢࡳଋͰԥΔʣ• ͦΕͰແཧͳΒDDoSରࡦઐۀऀΛཔΔʢΓࡳଋͰԥΔʣ
9.3.1 伴ަͱ҉߸Խʹର͢ΔCPUͷίετRSAͰެ։伴ͷॲཧʢʹΫϥΠΞϯτ͕ΔʣΑΓൿີ伴ͷॲཧʢʹαʔό͕Δʣͷ΄͏͕ॏ͍ɻ→ECDSAΛ͑ɻ
9.3.2 ΫϥΠΞϯτىݯͷ࠶ωΰγΤʔγϣϯ͜Ε͕ՄೳͳΒɺಉҰଓͰେྔͷϋϯυγΣΠΫΛൃੜͤ͞ΒΕΔͷͰɺthrottlingͷҙຯ͕ͳ͍ɻIIS 6ɺApache 2.2.15Ҏ߱ͰΫϥΠΞϯτىݯͷ࠶ωΰγΤʔγϣϯରԠ͍ͯ͠ͳ͍ʢNginxͦͦ࠷ॳ͔Βͳ͍ʣͷͰݱతʹ΄΅ͳ͍ɻηΩϡϦςΟ্ͷ੬ऑੑ͋Γ͏ΔͷͰΘͳ͍΄͏͕͍͍ػೳͰ͢Ͷʢˠ7.1ষʣɻ
9.3.3 TLSʹର͢ΔDoS߈ܸͷ࠷దԽ: DoS߈ܸͷ࠷దԽͰ͢ɻ• ҉߸ॲཧΛ͠ͳ͍ϋϯυγΣΠΫϝοηʔδΛϋʔυίʔυ• αʔό͔Βड͚औͬͨϝοηʔδͷparse/ݕূΛলུ͢Δͱαʔόʹ࠷ޙ·Ͱ༗ޮͳϋϯυγΣΠΫʹݟ͑ΔͷͰɺαʔόͰܭࢉ͕ͬͯ͠·͏ɻαʔόʹରͯ͠ʮޮΑ͘ʯʮܭࢉΛͤ͞Δʯ͜ͱ͕Ͱ͖ͯ͠·͏ɻ͜ΕΛΔͷ͕sslsqueezeɻ