Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up
for free
sshr: ユーザに変更を要求せずにシステム変化に追従可能なSSHプロキシサーバ
tsurubee
December 06, 2019
Research
3
1.5k
sshr: ユーザに変更を要求せずにシステム変化に追従可能なSSHプロキシサーバ
tsurubee
December 06, 2019
Tweet
Share
More Decks by tsurubee
See All by tsurubee
tsurubee
0
670
tsurubee
1
1.7k
tsurubee
0
38
tsurubee
2
1.6k
tsurubee
1
1.5k
tsurubee
7
1.5k
tsurubee
1
200
tsurubee
2
1k
tsurubee
2
2.7k
Other Decks in Research
See All in Research
future_tamaki
0
960
kayceesrk
2
4.1k
yuukit
4
1.7k
kikuzo
0
300
kyoun
10
1.6k
noguhiro2002
1
720
umepon
0
160
mkimura
3
250
umepon
0
160
forgetmenotjun
0
300
tarugoconf
0
1.9k
beeeee
0
190
Featured
See All Featured
zakiwarfel
88
3.4k
myddelton
109
11k
schacon
147
6.7k
jacobian
257
20k
yeseniaperezcruz
302
31k
chrislema
231
16k
jonyablonski
21
1.3k
revolveconf
200
9.7k
malarkey
193
8.7k
dougneiner
119
8k
jasonvnalue
81
8.1k
cassininazir
347
20k
Transcript
͘͞ΒΠϯλʔωοτגࣜձࣾ (C) Copyright 1996-2019 SAKURA Internet Inc ͘͞ΒΠϯλʔωοτݚڀॴ sshr: ϢʔβʹมߋΛཁٻͤͣʹ
γεςϜมԽʹैՄೳͳSSHϓϩΩγαʔό 2019/12/06 ୈ12ճ Πϯλʔωοτͱӡ༻ٕज़γϯϙδϜʢIOTS 2019ʣ ɹా തจɼদຊ ྄հ ͘͞ΒΠϯλʔωοτגࣜձࣾ ͘͞ΒΠϯλʔωοτݚڀॴ
2 1. എܠͱత 2. طଘख๏ͱͦͷ՝ 3. ఏҊख๏ 4. ੑೳධՁͱߟ 5.
·ͱΊ ࣍
1. എܠͱత
4 มԽ͕ٻΊΒΕΔITΠϯϑϥ • WebαʔϏεͷΑ͏ͳΠϯλʔωοτΛհͯ͠ར༻͢ΔαʔϏε͕ੈͷதʹීٴ ͠ɼͦͷར༻ऀ͕૿େ͍ͯ͠Δɽ • WebαʔϏεΛࢧ͑ΔΠϯϑϥɼར༻ऀ͔Βͷଟ༷ͳཁٻڥͷมԽʹ Ԡͯ͡ɼਝ͔ͭॊೈʹγεςϜߏΛมߋ͢Δ͜ͱ͕ٻΊΒΕΔɽ ཁٻɾڥͷมԽ γεςϜଆͷରԠྫ
ΞΫηεͷ૿ݮ αʔόͷεέʔϧΞτɾεέʔϧΠϯ ސ٬χʔζͷมԽ αʔϏεͷػೳ֦ுͷͨΊͷ৽نαʔόಋೖ ϋʔυΣΞো αʔόͷϚΠάϨʔγϣϯ
5 ssh username@<hostname or IP> SSH Client • αʔϏεͷଟ༷ͳཁٻʹԠͯ͡γεςϜߏΛਝʹมߋ͍ͯ͘͜͠ͱ͕ٻΊΒ ΕΔঢ়گʹ͓͍ͯɼγεςϜͷӡ༻ཧมߋʹैͰ͖Δඞཁ͕͋Δɽ
• Ұํɼ҆શͳϦϞʔτଓαʔϏεͱͯ͠αʔόཧʹ͘ར༻͞Ε͍ͯΔSSH ɼϢʔβ͕ར༻͢ΔαʔόͷIPΞυϨε·ͨϗετ໊Λࢦఆͯ͠ଓཁٻΛૹΔ ΈͰ͋Δɽ มԽʹैͰ͖Δӡ༻ཧ ͜͜ͰͷϢʔβͱɼγεςϜͷಛఆͷαʔόͷϦιʔεΛ༻͢Δऀ ɾγεςϜͷཧऀɾ։ൃऀ ɾϗεςΟϯάαʔϏεͷར༻ऀɼetc. Ϣʔβ มߋ Server Server αʔόͷIPΞυϨεɾ ϗετ໊ͷมߋͳͲ Ϣʔβ͕มߋޙͷใ ΛΔඞཁ͕͋Δ
6 SSHʹ͓͚Δ՝ͱຊݚڀͷత • SSHͰଓ͢ΔαʔόͷIPΞυϨεϗετ໊ʹมߋ͕͋ͬͨ߹ɼཧऀ֤ ϢʔβมߋޙͷใΛΒͤΔඞཁ͕͋ΓɼϢʔβͦͷมߋʹै͠ͳ͚ ΕͳΒͳ͍ɽ • ্هͷ՝Λղܾ͠ɼSSHͷϢʔβ͕γεςϜͷߏͦͷมߋΛҙࣝ͢Δ͜ͱ ͳ͘ɼಁաతʹతͷαʔόʹଓ͕ՄೳͳΈΛ࣮ݱ͢Δ͜ͱ͕ຊݚڀͷ తͰ͋Δɽ
2. طଘख๏ͱͦͷ՝
8 طଘख๏ͷྨ γεςϜͷߏมߋʹै͢ΔׂΛͲ͕͜୲͏͔ʹΑΓҎԼͷ2ͭʹྨͰ͖Δɽ 1. ΫϥΠΞϯτπʔϧ 2. ϓϩΩγαʔό SSH αʔό ϓϩΩγ
αʔό ཧσʔλ SSH ΫϥΠΞϯτ SSH αʔό ཧσʔλ ᶃ ᶄ ᶃ ᶄ ᶅ ྫ: gcloudίϚϯυ , consult ྫ: SSHPiper , sshdͷ֦ு SSHϦΫΤετ͝ͱʹৗʹ࠷৽ʹอͨΕͨγεςϜͷߏใΛอ࣋͢Δཧσʔλ Λࢀর͢Δ͜ͱͰมߋʹै͢Δɽ SSH ΫϥΠΞϯτ SSHΫϥΠΞϯτ͕͍࣋ͬͯΔ ԿΒ͔ͷΩʔใΛݩʹཧ σʔλΛݕࡧ͠ɼଓ͖͢ SSHαʔόͷใΛऔಘ͢Δɽ
9 1. ΫϥΠΞϯτπʔϧ gcloudίϚϯυ • gcloudGCP্ͷϦιʔεΛૢ࡞͢Δओཁͳ ίϚϯυϥΠϯπʔϧ • ʮgcloud compute
sshʯίϚϯυʹΠϯελϯε໊Λࢦఆ͢Δ͜ͱͰɼରͷΠϯελϯεʹ SSHଓ͕Մೳ • ssh(1)ίϚϯυͷϥούʔͰ͋ΓɼSSHͷϦΫΤετΛૹΔલʹΠϯελϯε໊ΛΩʔʹGCP ͕ཧ͍ͯ͠Δߏใ͔ΒIPΞυϨεΛऔಘ͢ΔػೳΛ༗͍ͯ͠Δɽ • ϢʔβࣗͰఆٛͨ͠αʔό͝ͱʹҰҙͷΠϯελϯε໊Λ͍ͬͯΕɼରαʔόͷIP ΞυϨεͷใͦͷมߋΛҙࣝ͢Δ͜ͱͳ͘ಁաతʹSSHଓ͕ՄೳͰ͋Δɽ SSH ΫϥΠΞϯτ SSH αʔό ཧσʔλ ᶃ ᶄ ՝ Ϣʔβʹ༻͍ΔΫϥΠΞϯτπʔϧΛڧ੍͢Δɼ͔ͭπʔϧͷ༷มߋʹ͍ όʔδϣϯΞοϓͷมߋΛཁٻ͢Δɽ
10 2. ϓϩΩγαʔό • GitHub্ͰΦʔϓϯιʔειϑτΣΞͱͯ͠ ։ൃ͞Ε͍ͯΔSSHͷϓϩΩγαʔό • SSHͷϦΫΤετΛड͚ͨࡍʹɼSSHͷϢʔβ໊͔Βར༻͢ΔଓઌαʔόΛܾఆͰ͖ΔػೳΛ ༗͢Δɽ •
Ϣʔβ͕༻͍ΔΫϥΠΞϯτπʔϧͷ੍ݶมߋΛ՝͞ͳ͍ɽ • ϢʔβɼϓϩΩγαʔόͷIPΞυϨεɾϗετ໊͍͑ͬͯ͞Εɼଓ͢ΔαʔόͷIPΞυ Ϩεɾϗετ໊ͦͷมߋΛҙࣝͤͣɼϢʔβ໊ʹඥ͍ͮͨαʔόʹಁաతʹSSHଓͰ͖Δɽ ཧσʔλ ᶃ ᶅ ϓϩΩγ αʔό SSHPiper ଓઌαʔόΛܾఆ͢ΔϩδοΫΛγεςϜཧऀ͕ࣗ༝ʹΈࠐΉ͜ͱมߋ͢Δ͜ͱ͕Ͱ͖ ͣɼϩδοΫΛมߋ͢ΔͨΊʹιʔείʔυʹมߋΛՃ͑ͳ͚ΕͳΒͳ͍ͨΊɼγες Ϝͷ༷มߋʹର͢Δ֦ுੑ͕͍ɽ ᶄ SSH αʔό SSH ΫϥΠΞϯτ ՝
3. ఏҊख๏
12 ΞʔΩςΫνϟͷ֓ཁ γεςϜཧऀ͕ࣗ༝ʹΈࠐΈՄೳͳϑοΫؔΛ༻͍ͯγεςϜมԽʹैͰ͖Δ SSHϓϩΩγαʔόΛఏҊ͢Δ • Ϣʔβʹ༻͍ΔΫϥΠΞϯτπʔϧͷ੍ݶมߋΛ՝͞ͳ͍ • ΈࠐΉϑοΫؔͷΈͷमਖ਼ͰϓϩΩγαʔόͷಈ࡞Λࣗ༝ʹม͑ΒΕΔͨΊɼ γεςϜͷ༷มߋʹରͯ͠ߴ͍֦ுੑΛ༗͢Δ طଘSSHϓϩΩγαʔό
ͱಉ͡ར SSHΫϥΠΞϯτ ssh username@hostname Ϣʔβ໊ ଓઌϗετ ཧσʔλ ϑοΫؔ SSH ϓϩΩγαʔό αʔό܈
13 ΈࠐΈՄೳͳϑοΫؔ • ϑοΫؔSSHϦΫΤετ͝ͱʹຖճ࣮ߦ͞ΕΔ • SSHͷϢʔβ໊ΛͱʹଓઌαʔόͷIPΞυϨεɾϗετ໊Λऔಘ͢Δؔ • ܾఆͨ͠ଓઌαʔόͱΫϥΠΞϯτؒͷެ։伴ೝূΛ֦ு͢ΔͨΊͷؔ • ͜ΕΒΛ༻͍ΔͱɼSSHϓϩΩγαʔόʹ͓͚Δଓઌͷܾఆ͓Αͼެ։伴ೝূΛ
ϓϩάϥϚϒϧʹ֦ுͰ͖Δɽ • ϑοΫؔʹΑΔ֦ுੑʹΑΓɼҎԼͷબੑ͕ੜ·ΕΔ • Ϣʔβͱαʔόͷඥ͚ใɼೝূʹ༻͍Δ伴ͳͲͷཧσʔλΛσʔλϕʔ εɾಠࣗͷઃఆϑΝΠϧͷࣗ༝ͳσʔλܗࣜͰཧͰ͖Δɽ • ཧσʔλΛऔಘ͢Δํ๏ΛWeb APIܦ༝ʹ͢ΔͳͲɼσʔλͷऔಘํ๏Λࣗ༝ ʹબͰ͖Δɽ
14 ϢʔβೝূͷΈ SSH ΫϥΠΞϯτ SSH αʔό SSHϓϩΩγ ύεϫʔυೝূํࣜ ެ։伴ೝূํࣜ SSH
αʔό ೝূϦΫΤετ ೝূϨεϙϯε SSHϓϩΩγSSHαʔόʹύέοτ Λసૹ͢ΔͷΈͰ͋ΓɼSSHαʔό͕ ೝূΛߦ͏ SSHϓϩΩγ Session ID: xxx Session ID: yyy ηογϣϯ͝ͱʹҰҙͷࣝผࢠΛؚΊ ͨσʔλΛൿີ伴Ͱॺ໊͠ɼೝূϦΫ ΤετΛૹΔͨΊɼSSHϓϩΩγೝূ ΛSSHαʔόʹͤΔ͜ͱ͕Ͱ͖ͳ͍ɽ ผͷൿີ伴Λ༻͍ͨ2ஈ֊ͷೝূ SSHϓϩΩγ͕ެ։伴 ݕࡧͷϑοΫؔΛ༻ ͍ͯΫϥΠΞϯτͷೝ ূΛߦ͏ɽ 1ஈ֊ SSHαʔόʹSSHϓϩΩγ ͕อ࣋͢Δಛఆͷൿີ伴 Λશͯड͚ೖΕΔΑ͏ʹ ઃఆ͓ͯ͘͠ 2ஈ֊ SSH ΫϥΠΞϯτ
15 SSHϓϩΩγαʔόɿsshr • ఏҊ͢ΔΞʔΩςΫνϟΛ࣮ݱ͢ΔͨΊʹɼGoݴޠΛ༻͍ͯsshrͱ͍͏SSHϓϩΩγ αʔόΛOSSͱͯ͠։ൃ※1 • γεςϜཧऀ͕GoݴޠͰ࣮ͨؔ͠ΛΈࠐΜͰϏϧυ͢Δ͜ͱͰɼϓϩΩγ αʔόͷػೳΛ֦ுͰ͖ΔΈΛͱ͍ͬͯΔɽ ΈࠐΈՄೳͳϑοΫؔ ໊ؔ
ׂ/ఆ͞ΕΔॲཧ FindUpstreamHook Ϣʔβ໊ΛΩʔʹଓઌαʔόͷIPΞυϨε·ͨ ϗετ໊ΛσʔλϕʔεWeb APIܦ༝Ͱऔಘ FetchAuthorizedKeysHook Ϣʔβͷެ։伴ΛσʔλϕʔεWeb APIܦ༝Ͱ औಘ FetchPrivateKeyHook sshrαʔόͷϩʔΧϧετϨʔδʹอ͞Ε͍ͯ Δൿີ伴Λऔಘ ϦΫΤετͷॲཧͷաఔ Ͱ͜ΕΒͷϑοΫ͕ؔ ॱ࣍ݺͼग़͞ΕΔ ※1 https://github.com/tsurubee/sshr
16 ηΩϡϦςΟϦεΫ • ύεϫʔυೝূํࣜͷ߹ • sshrαʔόSSHαʔόʹύέοτΛసૹ͢ΔͷΈͰ͋ΓɼϢʔβͷύεϫʔ υΛ͍ͬͯͯɼೝূΛߦ͏͜ͱ͕Ͱ͖ΔͷSSHαʔόͷΈͰ͋ΔͨΊɼ sshrαʔόΛ༻͍ͨ߹ͰೝূΛಥഁ͞ΕΔϦεΫมΘΒͳ͍ɽ • ެ։伴ೝূํࣜͷ߹
• sshrαʔόͷηΩϡϦςΟͷsshrσʔϞϯͷ੬ऑੑͳͲ͕ݪҼͰ • sshrαʔό͕༗͍ͯ͠Δൿີ伴͕ྲྀग़͢Δɽ • sshrαʔό͔Βൿີ伴Λར༻ͨ͠ҙͷίϚϯυ͕࣮ߦ͞ΕΔɽ
17 ηΩϡϦςΟରࡦ sshrαʔόଆ SSHαʔόଆ ɹରࡦ ޮՌ αʔόʹϩάΠϯՄೳͳϢʔβͷ ݖݶɼΞΫηεՄೳͳIPΛ࠷খݶʹߜΔ ൿີ伴ͷྲྀग़Λ͙ sshrσʔϞϯrootݖݶΛ࣋ͨͳ͍Ϣʔβ
Ͱ࣮ߦ͢Δ ҙͷίϚϯυ͕࣮ߦ͞Εͨ߹ʹsshrαʔόʹ ର͢Δૢ࡞Λ੍ݶ͢Δ ɹରࡦ ޮՌ rootͰϦϞʔτϩάΠϯΛڐՄ͠ͳ͍ઃఆ ྫʣsshd_configͷPermitRootLogin SSHαʔόʹର͢Δૢ࡞ͷݖݶΛ੍ݶ͢Δ sshrͷൿີ伴ʹର͢ΔଓݩIP੍ݶ ྫʣauthorized_keysͷIP੍ݶػೳ ൿີ伴͕֎෦ʹྲྀग़ͨ͠ࡍͷඃΛ͙
4. ੑೳධՁͱߟ
19 sshrͷΦʔόʔϔου • sshrͰɼSSHϦΫΤετ͝ͱʹ࣮ߦ͞ΕΔෳͷϑοΫؔʹΑΓɼ௨৴ͷ Φʔόʔϔου͕ൃੜ͢Δɽ • ͜ͷΦʔόʔϔουΛଌఆ͢Δ͜ͱͰɼఏҊ͢Δsshrͷಋೖ͕SSHଓͷॲཧ࣌ؒ ʹ༩͑ΔӨڹΛධՁ͠ɼsshr͕࣮༻తͳڥʹ͑͏Δ͔ݕ౼͢Δɽ
20 ࣮ݧ༰ͱ݅ sshrΛհ͞ͳ͍ΫϥΠΞϯτͱαʔόؒͷଓʢӈਤ1ʣͱɼ ఏҊख๏Ͱ͋ΔsshrΛհͨ͠ଓʢӈਤ2ʣͰൺֱΛߦ͏ɽ ҎԼͷ2ύλʔϯͷ࣮ߦ࣌ؒͷଌఆΛߦ͏ ɹ1. unameίϚϯυΛ࣮ߦͨ͠߹ ɹ2. scpʢsecure copyʣʹΑΓϑΝΠϧΛసૹͨ͠߹
࣮ݧ༰ • ༻͍Δ࣮ݧڥӈදࢀর • ΫϥΠΞϯτɾαʔόؒͷೝূʹެ։伴ೝূΛ༻͍Δ • sshr͕࣮ߦ͢ΔϑοΫؔɼଓઌͷܾఆॲཧ͓Αͼ Ϣʔβͷެ։伴ݕࡧͷॲཧͷ͍ͣΕʹ͓͍ͯɼผαʔό ্ͷσʔλϕʔε͔Βࢀর͢Δͷͱ͢Δ • σʔλϕʔεతͷϨίʔυҎ֎Λؚ·ͳ͍ͷͱ͢Δ ڥɾ݅
21 unameίϚϯυͷ࣮ߦ unameίϚϯυ࣮ߦ࣌ؒͷଌఆ݁Ռ ※ ࣮ߦ࣌ؒશͯ100ճଌఆͷฏۉ ※ +22msec • ΫϥΠΞϯτɾαʔόؒͷSSHଓʹରͯ͠sshrΛհͨ͠߹ɼunameίϚϯυ࣮ߦͷ Φʔόʔϔου22msecͰ͋Δ͜ͱ͕͔ͬͨɽ
• ͜Εηογϣϯཱ֬࣌ʹ࣮ߦ͞ΕΔϑοΫؔʢࠓճͷ߹2ճͷσʔλϕʔεݕࡧʣ ͕Өڹ͍ͯ͠Δͱߟ͑ΒΕΔɽ • sshrΛհ͢Δ͜ͱͰൃੜ͢ΔΦʔόʔϔουɼSSHηογϣϯཱ֬࣌ʹϢʔβ͕Ԇ Λײ͡ͳ͍΄Ͳ͍࣌ؒͰ͋Δɽ
22 scpʹΑΔϑΝΠϧసૹ scpʹΑΓసૹ͢ΔϑΝΠϧͷαΠζͱ సૹ࣌ؒͷؔ • 20MBͷϑΝΠϧΛసૹ͢Δ߹ɼsshrΛհ͢Δ͜ͱͰൃੜ͢Δ Φʔόʔϔου48ϛϦඵͰ͋ΓunameίϚϯυ࣮ߦͷ݁Ռ ΑΓେ͖͍ɽ • సૹ͢ΔϑΝΠϧαΠζ͕େ͖͘ͳΔʹͭΕͯɼൃੜ͢Δ
Φʔόʔϔου͕େ͖͘ͳΔ͜ͱ͔ΒɼsshrΛհ͢Δ߹ɼ sshrαʔό͕ύέοτΛϑΥϫʔυΛ͢Δ͜ͱʹΑΔΦʔόʔ ϔου͕Өڹ͍ͯ͠Δͱߟ͑ΒΕΔɽ • ͔͠͠ͳ͕Βɼྫ͑100MBͷϑΝΠϧసૹͷ߹ʹண͢Δ ͱɼసૹ࣌ؒͷ૿ՃΘ͔ͣ0.9%ఔͰ͋Γɼશମͷసૹ࣌ ؒʹରͯ͠sshrΛհ͢Δ͜ͱͰൃੜ͢ΔΦʔόʔϔου͕ΊΔ ׂ߹ۃΊͯখ͍͞ɽ
23 ࣮ڥͷద༻ • Ϣʔβ͕ෳͷαʔό܈ͷத͔Βಛఆͷαʔόʹରͯ͠SSHϩάΠϯ͠ɼαʔόͷૢ࡞Λ ߦ͏͜ͱɼϑΝΠϧΛసૹ͢ΔΑ͏ͳαʔόཧΛఆͨ͠߹ɼsshrͷΦʔόϔου ࣮༻ʹेʹ͑͏Δ΄Ͳখ͍͞ɽ • ҰํɼsshrͰॲཧͷաఔͰɼσʔλϕʔεͷཧσʔλ͔Βଓઌαʔόެ։伴Λ ݕࡧ͢ΔͨΊɼσʔλϕʔεWeb APIͷԠ͕࣌ؒେ͖͍߹ɼͦΕʹ͍sshrΛ
հͨ͠SSHηογϣϯཱ֬ʹ͔͔Δ࣌ؒ͘ͳΔɽͦͷ߹ɼԠ࣌ؒΛ͘͢Δର ࡦΛߦ͏ඞཁ͕͋Δɽ
5. ·ͱΊ
25 ·ͱΊ • ຊݚڀͰɼϢʔβʹ༻͍ΔΫϥΠΞϯτπʔϧͷ੍ݶมߋΛཁٻͤͣɼγε ςϜཧऀ͕ࣗ༝ʹΈࠐΈՄೳͳϑοΫؔΛ༻͍ͯγεςϜมԽʹैͰ͖ Δsshrͱ͍͏SSHϓϩΩγαʔόΛఏҊͨ͠ɽ • ఏҊख๏ɼΈࠐΉϑοΫؔͷΈͷमਖ਼ͰϓϩΩγαʔόͷಈ࡞Λࣗ༝ʹม ͑ΒΕΔͨΊɼγεςϜͷ༷มߋʹରͯ͠ߴ͍֦ுੑΛ༗͍ͯ͠Δɽ •
͞Βʹ࣮ݧ͔ΒɼΫϥΠΞϯτɾαʔόؒʹsshrΛಋೖͨ͠߹ͷSSHηογϣ ϯཱ֬ͷΦʔόʔϔου20ϛϦඵఔͰ͋ΓɼϢʔβ͕ಛఆͷαʔόʹSSHϩ άΠϯ͢ΔࡍʹԆΛײ͡ͳ͍΄Ͳ͍࣌ؒͰ͋Δ͜ͱΛࣔͨ͠ɽ