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

sshr: ユーザに変更を要求せずにシステム変化に追従可能なSSHプロキシサーバ

tsurubee
December 06, 2019

sshr: ユーザに変更を要求せずにシステム変化に追従可能なSSHプロキシサーバ

tsurubee

December 06, 2019
Tweet

More Decks by tsurubee

Other Decks in Research

Transcript

  1. ͘͞ΒΠϯλʔωοτגࣜձࣾ (C) Copyright 1996-2019 SAKURA Internet Inc ͘͞ΒΠϯλʔωοτݚڀॴ sshr: ϢʔβʹมߋΛཁٻͤͣʹ

    γεςϜมԽʹ௥ैՄೳͳSSHϓϩΩγαʔό 2019/12/06 ୈ12ճ Πϯλʔωοτͱӡ༻ٕज़γϯϙδ΢ϜʢIOTS 2019ʣ ɹ௽ా തจɼদຊ ྄հ ͘͞ΒΠϯλʔωοτגࣜձࣾ ͘͞ΒΠϯλʔωοτݚڀॴ
  2. 5 ssh username@<hostname or IP> SSH Client • αʔϏε΁ͷଟ༷ͳཁٻʹԠͯ͡γεςϜߏ੒Λਝ଎ʹมߋ͍ͯ͘͜͠ͱ͕ٻΊΒ ΕΔঢ়گʹ͓͍ͯ͸ɼγεςϜͷӡ༻؅ཧ΋มߋʹ௥ैͰ͖Δඞཁ͕͋Δɽ

    • Ұํɼ҆શͳϦϞʔτ઀ଓαʔϏεͱͯ͠αʔό؅ཧʹ޿͘ར༻͞Ε͍ͯΔSSH ͸ɼϢʔβ͕ར༻͢ΔαʔόͷIPΞυϨε·ͨ͸ϗετ໊Λࢦఆͯ͠઀ଓཁٻΛૹΔ ࢓૊ΈͰ͋Δɽ มԽʹ௥ैͰ͖Δӡ༻؅ཧ ͜͜ͰͷϢʔβͱ͸ɼγεςϜ಺ͷಛఆͷαʔό౳ͷϦιʔεΛ࢖༻͢Δऀ ɾγεςϜͷ؅ཧऀɾ։ൃऀ ɾϗεςΟϯάαʔϏεͷར༻ऀɼetc. Ϣʔβ มߋ Server Server αʔόͷIPΞυϨεɾ ϗετ໊ͷมߋͳͲ Ϣʔβ͕มߋޙͷ৘ใ Λ஌Δඞཁ͕͋Δ
  3. 8 طଘख๏ͷ෼ྨ γεςϜͷߏ੒มߋʹ௥ै͢Δ໾ׂΛͲ͕͜୲͏͔ʹΑΓҎԼͷ2ͭʹ෼ྨͰ͖Δɽ 1. ΫϥΠΞϯτπʔϧ 2. ϓϩΩγαʔό SSH αʔό ϓϩΩγ

    αʔό ؅ཧσʔλ SSH ΫϥΠΞϯτ SSH αʔό ؅ཧσʔλ ᶃ ᶄ ᶃ ᶄ ᶅ ྫ: gcloudίϚϯυ , consult ྫ: SSHPiper , sshdͷ֦ு SSHϦΫΤετ͝ͱʹৗʹ࠷৽ʹอͨΕͨγεςϜͷߏ੒৘ใ౳Λอ࣋͢Δ؅ཧσʔλ Λࢀর͢Δ͜ͱͰมߋʹ௥ै͢Δɽ SSH ΫϥΠΞϯτ SSHΫϥΠΞϯτ͕͍࣋ͬͯΔ ԿΒ͔ͷΩʔ৘ใΛݩʹ؅ཧ σʔλΛݕࡧ͠ɼ઀ଓ͢΂͖ SSHαʔόͷ৘ใΛऔಘ͢Δɽ
  4. 9 1. ΫϥΠΞϯτπʔϧ gcloudίϚϯυ • gcloud͸GCP্ͷϦιʔεΛૢ࡞͢Δओཁͳ ίϚϯυϥΠϯπʔϧ • ʮgcloud compute

    sshʯίϚϯυʹΠϯελϯε໊Λࢦఆ͢Δ͜ͱͰɼର৅ͷΠϯελϯεʹ SSH઀ଓ͕Մೳ • ssh(1)ίϚϯυͷϥούʔͰ͋ΓɼSSHͷϦΫΤετΛૹΔલʹΠϯελϯε໊ΛΩʔʹGCP ͕؅ཧ͍ͯ͠Δߏ੒৘ใ͔ΒIPΞυϨεΛऔಘ͢ΔػೳΛ༗͍ͯ͠Δɽ • Ϣʔβ͸ࣗ਎Ͱఆٛͨ͠αʔό͝ͱʹҰҙͷΠϯελϯε໊Λ஌͍ͬͯΕ͹ɼର৅αʔόͷIP ΞυϨεͷ৘ใ΍ͦͷมߋΛҙࣝ͢Δ͜ͱͳ͘ಁաతʹSSH઀ଓ͕ՄೳͰ͋Δɽ SSH ΫϥΠΞϯτ SSH αʔό ؅ཧσʔλ ᶃ ᶄ ՝୊ Ϣʔβʹ༻͍ΔΫϥΠΞϯτπʔϧΛڧ੍͢Δɼ͔ͭπʔϧͷ࢓༷มߋʹ൐͍ όʔδϣϯΞοϓ౳ͷมߋΛཁٻ͢Δɽ
  5. 10 2. ϓϩΩγαʔό • GitHub্ͰΦʔϓϯιʔειϑτ΢ΣΞͱͯ͠ ։ൃ͞Ε͍ͯΔSSHͷϓϩΩγαʔό • SSHͷϦΫΤετΛड͚ͨࡍʹɼSSHͷϢʔβ໊͔Βར༻͢Δ઀ଓઌαʔόΛܾఆͰ͖ΔػೳΛ ༗͢Δɽ •

    Ϣʔβ͕༻͍ΔΫϥΠΞϯτπʔϧͷ੍ݶ΍มߋΛ՝͞ͳ͍ɽ • Ϣʔβ͸ɼϓϩΩγαʔόͷIPΞυϨεɾϗετ໊͑͞஌͍ͬͯΕ͹ɼ઀ଓ͢ΔαʔόͷIPΞυ Ϩεɾϗετ໊΍ͦͷมߋΛҙࣝͤͣɼϢʔβ໊ʹඥ͍ͮͨαʔόʹಁաతʹSSH઀ଓͰ͖Δɽ ؅ཧσʔλ ᶃ ᶅ ϓϩΩγ αʔό SSHPiper ઀ଓઌαʔόΛܾఆ͢ΔϩδοΫΛγεςϜ؅ཧऀ͕ࣗ༝ʹ૊ΈࠐΉ͜ͱ΍มߋ͢Δ͜ͱ͕Ͱ͖ ͣɼϩδοΫΛมߋ͢ΔͨΊʹ͸ιʔείʔυʹ௚઀มߋΛՃ͑ͳ͚Ε͹ͳΒͳ͍ͨΊɼγες Ϝͷ࢓༷มߋʹର͢Δ֦ுੑ͕௿͍ɽ ᶄ SSH αʔό SSH ΫϥΠΞϯτ ՝୊
  6. 13 ૊ΈࠐΈՄೳͳϑοΫؔ਺ • ϑοΫؔ਺͸SSHϦΫΤετ͝ͱʹຖճ࣮ߦ͞ΕΔ • SSHͷϢʔβ໊Λ΋ͱʹ઀ଓઌαʔόͷIPΞυϨεɾϗετ໊Λऔಘ͢Δؔ਺ • ܾఆͨ͠઀ଓઌαʔόͱΫϥΠΞϯτؒͷެ։伴ೝূΛ֦ு͢ΔͨΊͷؔ਺ • ͜ΕΒΛ༻͍ΔͱɼSSHϓϩΩγαʔόʹ͓͚Δ઀ଓઌͷܾఆ͓Αͼެ։伴ೝূΛ

    ϓϩάϥϚϒϧʹ֦ுͰ͖Δɽ • ϑοΫؔ਺ʹΑΔ֦ுੑʹΑΓɼҎԼͷબ୒ੑ͕ੜ·ΕΔ • Ϣʔβͱαʔόͷඥ෇͚৘ใ΍ɼೝূʹ༻͍Δ伴ͳͲͷ؅ཧσʔλΛσʔλϕʔ εɾಠࣗͷઃఆϑΝΠϧ౳ͷࣗ༝ͳσʔλܗࣜͰ؅ཧͰ͖Δɽ • ؅ཧσʔλΛऔಘ͢Δํ๏ΛWeb APIܦ༝ʹ͢ΔͳͲɼσʔλͷऔಘํ๏Λࣗ༝ ʹબ୒Ͱ͖Δɽ
  7. 14 Ϣʔβೝূͷ࢓૊Έ SSH ΫϥΠΞϯτ SSH αʔό SSHϓϩΩγ ύεϫʔυೝূํࣜ ެ։伴ೝূํࣜ SSH

    αʔό ೝূϦΫΤετ ೝূϨεϙϯε SSHϓϩΩγ͸SSHαʔόʹύέοτ Λసૹ͢ΔͷΈͰ͋ΓɼSSHαʔό͕ ೝূΛߦ͏ SSHϓϩΩγ Session ID: xxx Session ID: yyy ηογϣϯ͝ͱʹҰҙͷࣝผࢠΛؚΊ ͨσʔλΛൿີ伴Ͱॺ໊͠ɼೝূϦΫ ΤετΛૹΔͨΊɼSSHϓϩΩγ͸ೝূ ΛSSHαʔόʹ೚ͤΔ͜ͱ͕Ͱ͖ͳ͍ɽ ผͷൿີ伴Λ༻͍ͨ2ஈ֊ͷೝূ SSHϓϩΩγ͕ެ։伴 ݕࡧͷϑοΫؔ਺Λ༻ ͍ͯΫϥΠΞϯτͷೝ ূΛߦ͏ɽ 1ஈ֊໨ SSHαʔόʹSSHϓϩΩγ ͕อ࣋͢Δಛఆͷൿີ伴 Λશͯड͚ೖΕΔΑ͏ʹ ઃఆ͓ͯ͘͠ 2ஈ֊໨ SSH ΫϥΠΞϯτ
  8. 15 SSHϓϩΩγαʔόɿsshr • ఏҊ͢ΔΞʔΩςΫνϟΛ࣮ݱ͢ΔͨΊʹɼGoݴޠΛ༻͍ͯsshrͱ͍͏SSHϓϩΩγ αʔόΛOSSͱͯ͠։ൃ※1 • γεςϜ؅ཧऀ͕GoݴޠͰ࣮૷ͨؔ͠਺Λ૊ΈࠐΜͰϏϧυ͢Δ͜ͱͰɼϓϩΩγ αʔόͷػೳΛ֦ுͰ͖Δ࢓૊ΈΛͱ͍ͬͯΔɽ ૊ΈࠐΈՄೳͳϑοΫؔ਺ ؔ਺໊

    ໾ׂ/૝ఆ͞ΕΔॲཧ FindUpstreamHook Ϣʔβ໊ΛΩʔʹ઀ଓઌαʔόͷIPΞυϨε·ͨ ͸ϗετ໊Λσʔλϕʔε΍Web APIܦ༝Ͱऔಘ FetchAuthorizedKeysHook Ϣʔβͷެ։伴Λσʔλϕʔε΍Web APIܦ༝Ͱ औಘ FetchPrivateKeyHook sshrαʔόͷϩʔΧϧετϨʔδʹอ؅͞Ε͍ͯ Δൿີ伴Λऔಘ ϦΫΤετͷॲཧͷաఔ Ͱ͜ΕΒͷϑοΫؔ਺͕ ॱ࣍ݺͼग़͞ΕΔ ※1 https://github.com/tsurubee/sshr
  9. 17 ηΩϡϦςΟରࡦ sshrαʔόଆ SSHαʔόଆ ɹରࡦ ޮՌ αʔόʹϩάΠϯՄೳͳϢʔβͷ਺΍ ݖݶɼΞΫηεՄೳͳIPΛ࠷খݶʹߜΔ ൿີ伴ͷྲྀग़Λ๷͙ sshrσʔϞϯ͸rootݖݶΛ࣋ͨͳ͍Ϣʔβ

    Ͱ࣮ߦ͢Δ ೚ҙͷίϚϯυ͕࣮ߦ͞Εͨ৔߹ʹsshrαʔόʹ ର͢Δૢ࡞Λ੍ݶ͢Δ ɹରࡦ ޮՌ rootͰϦϞʔτϩάΠϯΛڐՄ͠ͳ͍ઃఆ ྫʣsshd_configͷPermitRootLogin SSHαʔόʹର͢Δૢ࡞ͷݖݶΛ੍ݶ͢Δ sshrͷൿີ伴ʹର͢Δ઀ଓݩIP੍ݶ ྫʣauthorized_keysͷIP੍ݶػೳ ൿີ伴͕֎෦ʹྲྀग़ͨ͠ࡍͷඃ֐Λ๷͙
  10. 20 ࣮ݧ಺༰ͱ৚݅ sshrΛհ͞ͳ͍ΫϥΠΞϯτͱαʔόؒͷ઀ଓʢӈਤ1ʣͱɼ ఏҊख๏Ͱ͋ΔsshrΛհͨ͠઀ଓʢӈਤ2ʣͰൺֱΛߦ͏ɽ ҎԼͷ2ύλʔϯͷ࣮ߦ࣌ؒͷଌఆΛߦ͏ ɹ1. unameίϚϯυΛ࣮ߦͨ͠৔߹ ɹ2. scpʢsecure copyʣʹΑΓϑΝΠϧΛసૹͨ͠৔߹

    ࣮ݧ಺༰ • ༻͍Δ࣮ݧ؀ڥ͸ӈදࢀর • ΫϥΠΞϯτɾαʔόؒͷೝূʹ͸ެ։伴ೝূΛ༻͍Δ • sshr͕࣮ߦ͢ΔϑοΫؔ਺͸ɼ઀ଓઌͷܾఆॲཧ͓Αͼ Ϣʔβͷެ։伴ݕࡧͷॲཧͷ͍ͣΕʹ͓͍ͯ΋ɼผαʔό ্ͷσʔλϕʔε͔Βࢀর͢Δ΋ͷͱ͢Δ • σʔλϕʔε͸໨తͷϨίʔυҎ֎Λؚ·ͳ͍΋ͷͱ͢Δ ؀ڥɾ৚݅
  11. 21 unameίϚϯυͷ࣮ߦ unameίϚϯυ࣮ߦ࣌ؒͷଌఆ݁Ռ ※ ࣮ߦ࣌ؒ͸શͯ100ճଌఆͷฏۉ஋ ※ +22msec • ΫϥΠΞϯτɾαʔόؒͷSSH઀ଓʹରͯ͠sshrΛհͨ͠৔߹ɼunameίϚϯυ࣮ߦͷ Φʔόʔϔου͸22msecͰ͋Δ͜ͱ͕෼͔ͬͨɽ

    • ͜Ε͸ηογϣϯཱ֬࣌ʹ࣮ߦ͞ΕΔϑοΫؔ਺ʢࠓճͷ৔߹2ճͷσʔλϕʔεݕࡧʣ ͕Өڹ͍ͯ͠Δͱߟ͑ΒΕΔɽ • sshrΛհ͢Δ͜ͱͰൃੜ͢ΔΦʔόʔϔου͸ɼSSHηογϣϯཱ֬࣌ʹϢʔβ͕஗Ԇ Λײ͡ͳ͍΄Ͳ୹͍࣌ؒͰ͋Δɽ
  12. 22 scpʹΑΔϑΝΠϧసૹ scpʹΑΓసૹ͢ΔϑΝΠϧͷαΠζͱ సૹ࣌ؒͷؔ܎ • 20MBͷϑΝΠϧΛసૹ͢Δ৔߹ɼsshrΛհ͢Δ͜ͱͰൃੜ͢Δ Φʔόʔϔου͸48ϛϦඵͰ͋ΓunameίϚϯυ࣮ߦͷ݁Ռ ΑΓେ͖͍ɽ • సૹ͢ΔϑΝΠϧαΠζ͕େ͖͘ͳΔʹͭΕͯɼൃੜ͢Δ

    Φʔόʔϔου͕େ͖͘ͳΔ͜ͱ͔ΒɼsshrΛհ͢Δ৔߹ɼ sshrαʔό͕ύέοτΛϑΥϫʔυΛ͢Δ͜ͱʹΑΔΦʔόʔ ϔου͕Өڹ͍ͯ͠Δͱߟ͑ΒΕΔɽ • ͔͠͠ͳ͕Βɼྫ͑͹100MBͷϑΝΠϧసૹͷ৔߹ʹண໨͢Δ ͱɼసૹ࣌ؒͷ૿Ճ཰͸Θ͔ͣ0.9%ఔ౓Ͱ͋Γɼશମͷసૹ࣌ ؒʹରͯ͠sshrΛհ͢Δ͜ͱͰൃੜ͢ΔΦʔόʔϔου͕઎ΊΔ ׂ߹͸ۃΊͯখ͍͞ɽ