Hatena Engineer Seminar #10 (https://hatena.connpass.com/event/87909/) で発表した資料です。
AWSͰͯͳϒϩάͷ ৗ࣌HTTPS৴Λ όʔϯͱΔHatena Engineer Seminar #10 @ Tokyoגࣜձࣾͯͳ id:aereal
View Slide
ࣗݾհ• id:aereal• GitHub: aereal• Twitter: aereal• ϒϩάϢʔβʔνʔϜ ΞϓϦέʔγϣϯΤϯδχΞ ςοΫϦʔυ
͢͜ͱ• ͯͳϒϩάͷৗ࣌HTTPS৴ͷٕज़తͳৄࡉ• ূ໌ॻͷಈతಡΈࠐΈ• ূ໌ॻͷࣗಈߋ৽• ͓ΑͼϓϩδΣΫτͷਐΊํ
എܠ• ͯͳϒϩάͰɺͯͳఏڙυϝΠϯͷ ͍ͣΕ͔͔Βબ·͢• *.hatenablog.com, *.hatenadiary.jp, etc.• ͞ΒʹɺͯͳϒϩάPro (༗ྉΦϓγϣϯ) ʹਃ͠ࠐΉͱ ಠࣗυϝΠϯ͕͑·͢• ಠࣗυϝΠϯͰৗ࣌HTTPS৴Λ࣮ݱ͍ͨ͠
Let's Encrypt• https://letsencrypt.org/• ISRG = Internet Security Research Group͕ఏڙ͢Δ ϓϩάϥϚϒϧʹΞΫηεՄೳͳೝূہ (CA)• ෆಛఆଟͷυϝΠϯʹର͢Δ ূ໌ॻൃߦͷࣗಈԽ͕Մೳʹͳͬͨ
Let's Encrypt• ಠࣗυϝΠϯͷৗ࣌HTTPS৴ʹ͔ܽͤͳ͍ଘࡏɺવར༻͠·͢• Let's EncryptΛར༻͢Δاۀͱͯ͠ɺ ·ͨܝ͛Δࢥʹڞײ͢ΔWebαʔϏεࣄۀऀͱͯ͠ɺ ͯͳLet's EncryptʹدΛ͠·͢
ಠࣗυϝΠϯͱূ໌ॻ• DONE: ͯͳఏڙυϝΠϯ (*.hatenablog.com, etc.)• ͕Ε͍ͯΔͷͰূ໌ॻ1ͭͷஔͰࡁΉ• SAN (= Subject Alternative Names) Λ͏• ϫΠϧυΧʔυূ໌ॻΛ͏
ಠࣗυϝΠϯͱূ໌ॻ• ಠࣗυϝΠϯ• ͕ଟ͍ͷͰূ໌ॻͷൃߦಡΈࠐΈେม• LE = Let's Encryptূ໌ॻ͋ͨΓ 100υϝΠϯͷ੍͕͋Δ• ҰʹಡΈࠐΉͱproxyͷϝϞϦ༻ྔ͕ਹΉ
ΰʔϧ(1): ূ໌ॻͷಡΈࠐΈ• ؆୯ͷͨΊূ໌ॻ1υϝΠϯ1ͭɺSANΘͳ͍• ΦϯσϚϯυͰಡΈࠐΜͰϝϞϦઅ• ϘτϧωοΫʹͳΓ͏ΔͷͰ ϥϯυτϦοϓɺϨΠςϯγΛ͍͑ͨ
ΰʔϧ (2): ఆظߋ৽• ϦΞϧλΠϜੑ͍• ظݶΛܴ͑Δ·ͰͷҙͷλΠϛϯάͰ ࣮ߦ͢ΕΑ͍• ҰํɺσʔλҰ؏ੑʹର͢Δཁٻ͕ߴ͍• ࣦഊ͢ΔͳͲߋ৽࿙Ε͕͋Δͱ·͍ͣ• ֎෦API (LE) Λར༻͢ΔͨΊࣦഊՄೳੑ͕ߴ͍ →దͳϦτϥΠॲཧ͕ඞཁ
γεςϜͷߏ
cert-dispatchercert-cache-gwcert-updater-statecert-updater-functioncert-update-notifiercert-update-triggerLet's Encryptcert-storecert-cache cert-lifecycle-storeUserBlogHTTPssl_handshake_handlerHTTPGet/SetGetHTTPHTTP࣮ߦ࣮ߦ ࣮ߦUpdateItemUpdateItemTTL trigger࣮ߦূ໌ॻൃߦ
ূ໌ॻͷಡΈࠐΈ
cert-dispatchercert-cache-gwcert-updater-statecert-updater-functioncert-update-notifiercert-update-triggerLet's Encryptcert-storecert-cache cert-lifecycle-storeUserBlogHTTPSssl_handshake_handlerHTTPGet/SetGetHTTPHTTP࣮ߦ࣮ߦ ࣮ߦUpdateItemUpdateItemTTL trigger࣮ߦূ໌ॻൃߦ
ূ໌ॻͷಈతಡΈࠐΈ• cert-dispatcher: ngx_mruby• TLS handshake࣌ʹϋϯυϥ͕ݺΕΔ• cert-cache-gwʹHTTP GETͯ͠ূ໌ॻΛऔಘ͢Δ• cert-cache-gw: GoͰॻ͍ͨHTTP API• υϝΠϯʹରԠ͢Δূ໌ॻΛcert-store (DynamoDB) ͔Βऔಘͯ͠ฦ͢• cert-cache (memcached) ʹอଘ͢Δ
ূ໌ॻͷऔಘ
ূ໌ॻͷൃߦ• cert-updater-state: AWS Step Functions• JSONͰεςʔτϚγϯΛ࣮ߦͯ͘͠ΕΔαʔϏε• ॊೈͳϦτϥΠॲཧঢ়ଶભҠΛཧͰ͖Δ• cert-updater-function: AWS Lambda• LEͱ௨৴͠ূ໌ॻΛऔಘ͢Δ• ൃߦͨ͠ূ໌ॻDynamoDBʹॻ͖ࠐΉ• cert-update-notifier: AWS Lambda• ূ໌ॻͷൃߦঢ়گΛͯͳϒϩάຊମʹ͑Δ
ূ໌ॻͷఆظߋ৽
ূ໌ॻͷఆظߋ৽• cert-lifecycle-store: DynamoDB• ূ໌ॻͷऔಘ࣌ʹ͜ͷςʔϒϧʹॻ͖ࠐΉ• TTL triggerΛൃߦ͠ɺcert-update-triggerΛىಈ͢Δ• cert-update-trigger: AWS Lambda• TTL͕Εͯআ͞ΕͨΞΠςϜΛड͚औΔ• cert-updater-stateΛ࣮ߦ͠ɺূ໌ॻऔಘϑϩʔΛ։࢝
DynamoDB TTL
cert-lifecycle-store (DynamoDB)Domain: ex1.example.comExpiresAt: 2018-05-23T02:00:00Domain: ex2.example.comExpiresAt: 2018-05-23T03:00:00Domain: ex2.example.comExpiresAt: 2018-05-23T04:00:00Domain: ex2.example.comExpiresAt: 2018-05-23T05:00:00
cert-lifecycle-store (DynamoDB)Domain: ex2.example.comExpiresAt: 2018-05-23T03:00:00Domain: ex2.example.comExpiresAt: 2018-05-23T04:00:00Domain: ex2.example.comExpiresAt: 2018-05-23T05:00:00
cert-lifecycle-store (DynamoDB) Domain: ex2.example.comExpiresAt: 2018-05-23T04:00:00Domain: ex2.example.comExpiresAt: 2018-05-23T05:00:00
cert-lifecycle-store (DynamoDB)Domain: ex2.example.comExpiresAt: 2018-05-23T05:00:00
ͳͥAWS͔• ෳࡶ͔ͭߴͳόονΛߏஙʹඞཁͳαʔϏε͕ ἧ͍ͬͯΔ͔Β• ෳࡶ: ূ໌ॻͷऔಘɾ݁Ռͷ௨ͳͲෳεςοϓ͔ΒͳΔ• ߴ: ࢄΞϓϦέʔγϣϯʹؔΘΒͣ σʔλͷҰ؏ੑ͕ߴ͍ϨϕϧͰٻΊΒΕΔ• = Lambda, Step Functions, etc.
Step Functions࠷ߴ• ग़ྗ༰ʹԠͯ͡ঢ়ଶભҠΛذͰ͖Δ• άϥϑΟΧϧʹग़ྗͯ͘͠ΕΔ (͍͢͝!)• Τϥʔग़ྗ༰ʹԠ্ͨ͡ݶ͖ϦτϥΠॲཧ• ΊͪΌͪ͘Ό͔ͬ͜Α͘ͳ͍Ͱ͔͢?
Go• Lambda functionͯ͢Go, cert-cache-gwGo• ίϯύΠϥʹΑΔܕݕࠪͰ҆৺• ೖग़ྗͷܕΛLambda functionؒͰڞ༗Ͱ͖ɺ ᴥᴪ͕ੜͨ͡ΒίϯύΠϧΤϥʔʹͳΔ• ΤίγεςϜ͕ख़͍ͯ͠Δ• ΫϩείϯύΠϧ• ςετϥϯφʔɺςετϑϨʔϜϫʔΫ
ϓϩδΣΫτͷਐΊํ• ΞʔΩςΫνϟΛݕ౼• AWSΛۦͨ࣍͠ੈTSDBͷઃܭʹؔΘͬͨ id:y_uukiʹڠྗͯ͠Βͬͨ• http://blog.yuuk.io/entry/the-rebuild-of-tsdb-on-cloud• ϓϩτλΠϐϯά (1िؒ)• ࣮ࡍʹखΛಈ͔͢͜ͱͰෆ໌ྎͩͬͨͷݟੵΓ͕ਖ਼֬ʹͳͬͨ• (LambdaͷσϓϩΠͳͲ)• GoॳֶऀͩͬͨϝϯόʔצΛ௫Ίͯɺຊ࣮ͰఆҎ্ʹ ϕϩγςΟ͕҆ఆͨ͠
ϓϩδΣΫτͷਐΊํ• ·ͣূ໌ॻಡΈࠐΈ෦ (cert-loader) Λ։ൃ• ͜ͷ࣌Ͱ·ͩূ໌ॻΛऔಘ͠ͳ͍ͷͰɺӨڹͳ͍• ࣍ʹূ໌ॻऔಘ෦ (cert-updater) Λ։ൃ• ͜ͷ෦ΛϦϦʔε͢Δ͜ͱͰ͡Ίͯ ಠࣗυϝΠϯͰHTTPS৴͕ར༻ՄೳʹͳΔ
ϓϩδΣΫτͷਐΊํ• ϦϦʔε୯ҐͷCQS = ίϚϯυΫΤϦׂ͕ͳ͞Εͨ• command: cert-updater• query: cert-loader• CQS = Command-query Separation:• มߋܥ (command) ͱಡऔܥ (query) Λ ׂ͢ΔΞʔΩςΫνϟ• େ͖ͳϦϦʔεͰ͋Δ͕ɺগͣͭ͠ग़͍ͯ͘͠ͱ͍͏ ීஈͷελΠϧΛऔΓೖΕΒΕ͍ͯΔ
·ͱΊ• ͯͳϒϩάͷৗ࣌HTTPS৴ͷཪଆΛ͝հ͠·ͨ͠• ։ൃॱௐͰɺࠂ௨ΓͷεέδϡʔϧͰ ఏڙ։࢝Ͱ͖ΔݟࠐΈͰ͢• ࣮Perl͚ͩ͡Όͳ͍͠ɺAWS׆༻͍ͯ͠·͢!
એ: αϚʔΠϯλʔϯ2018• http://developer.hatenastaff.com/entry/intern-preentry-2018• ࠓΓ·͢• લߨٛͷݴޠGoͰ͢