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

Linux コンテナの内部を知ろう / OSC 2018 Kyoto

Avatar for tenforward tenforward
August 04, 2018

Linux コンテナの内部を知ろう / OSC 2018 Kyoto

OSC 2018 Kyoto の講演資料です。
参考となる情報にはPDF中からリンクをしていますが、資料中のリンクは Speaker Deck 上ではクリックできないので PDF をダウンロードしてご覧ください。

Avatar for tenforward

tenforward

August 04, 2018
Tweet

More Decks by tenforward

Other Decks in Technology

Transcript

  1. ࣗݾ঺հ (ίϯςφؔ࿈) • LXC/LXD ͷ։ൃʹগ͠ࢀՃ • man page ͷ೔ຊޠ༁ •

    ެࣜϖʔδ (linuxcontainers.org) ຋༁ • όάϑΟοΫεͳͲগ͚ͩ͠ίʔυʹ΋ߩݙ • LXD ೔ຊޠϝοηʔδ • ίϯςφܕԾ૝Խͷ৘ใަ׵ձओ࠻ 4/54
  2. ίϯςφͱ͸ • ͭ·Γ୯ͳΔϓϩηε (or ୯ͳΔϓϩηεͷू߹) • ϓϩηεʹʮଐੑʯΛࢦఆ͢Δ • ྫ͑͹ʜ •

    ଞͷϓϩηε͔Βݟ͑ͳ͘͢Δ • ࣮ߦͰ͖Δૢ࡞ʹ੍ݶΛՃ͑Δ • ϓϩηεʹϦιʔε੍ݶΛద༻͢Δ • ͳͲͳͲʜ • ී௨ʹىಈͨ͠ͷͱ͸νϣοτҧ͏ϓϩηε 10/54
  3. ίϯςφͷϝϦοτɾσϝϦοτ ͭ·Γ • ίϯςφΛىಈ͢Δ ʹ ϓϩηεΛىಈ͢Δ • ىಈ͕ૣ͍ʢϓϩηεΛىಈ͢Δͷʹ͔͔Δ͚࣌ؒͩʣ • Χʔωϧ͸ϗετ্Ͱಈ͍͍ͯΔΧʔωϧͷΈ

    • Ծ૝Ϛγϯ (VM) ͷΑ͏ʹҟͳΔ OS ͷγεςϜ΍ϓϩάϥ Ϝ͸ಈ͔ͤͳ͍ (ΤϛϡϨʔλΛಈ͔ͤ͹Ͱ͖·͕͢) • ΧʔωϧʹؔΘΔૢ࡞Λίϯςφ͝ͱʹผʑʹ͸ߦ͑ͳ͍ 11/54
  4. Linux Ҏ֎ʹ͓͚Δίϯςφ • ίϯςφ͸ Linux ಠࣗͷٕज़Ͱ͸͋Γ·ͤΜ • Linux Ҏ֎Ͱ΋ίϯςφͷ࣮૷͸͋Γ·͢ͷͰ؆୯ʹ঺հ͠ ͓͖ͯ·͢

    • FreeBSD jail (ଞʹ VPS ͱ͍͏࣮૷΋͋Δ) • Solaris Zones • Windows (Windows Server ίϯςφɾHyper-V ίϯ ςφ) 12/54
  5. Linux ʹ͓͚Δίϯςφ Linux Χʔωϧʹ͸୯Ұͷʮίϯςφʯͱ͍͏ػೳ͕͋ΔΘ͚Ͱ͸ ͳ͍ • ৭ʑͳػೳΛ૊Έ߹ΘͤͯʮίϯςφʯΛ࡞Δ • ˠ ࣗ෼ʹཉ͍͠ػೳΛ૊Έ߹Θͤͯʮίϯςφʯ͕࡞ΕΔ

    • Docker ΍ LXC/LXD ͳͲͷίϯςφ࣮૷΋ࣗ਎͕ཉ͍͠ ༷ʑͳػೳΛ૊Έ߹Θͤͯίϯςφ؀ڥΛߏங͍ͯ͠Δ ͦΕͰ͸ɺίϯςφͰΑ͘࢖ΘΕΔػೳΛ঺հ͠ͳ͕Βίϯςφ͕ Ͱ͖Δ·ͰΛݟ͍͖ͯ·͠ΐ͏ 14/54
  6. chroot ͷσϞ • ΈͲ͜Ζ • ৽͍͠ / (root) ʹ͍ͨ͠σΟϨΫτϦʹҠಈͯ͠ chroot

    ίϚϯυΛ࣮ߦ͢Δ͚ͩͷ؆୯͞ • Ͱ΋ɺ৽ͨͳ / (root) ͔Βൈ͚ͩͤΔ 18/54
  7. pivot_root pivot_root ͸৽ͨʹ / (root) ͱ͍ͨ͠σΟϨΫτϦ (Ϛ΢ϯτ ϙΠϯτ) ͱίϚϯυ࣮ߦલ࣌఺ͷ /

    (root) ΛϚ΢ϯτ͢ΔσΟ ϨΫτϦ (৽ root ҎԼ) Λࢦఆ͢Δ   pivot_root [৽͍͠ root] [Ҏલͷ root] (ྫ) pivot_root . old   ͜ΕͰΧϨϯτσΟϨΫτϦ͕ / (root) ͱͳΓɺҎલͷ/͕./old ҎԼʹϚ΢ϯτ͞ΕΔ 20/54
  8. bind Ϛ΢ϯτ • ৽ͨͳ / (root) ʹมߋ͢ΔͨΊʹ pivot_root Λ࢖͏ࡍ •

    ͋ΔσΟϨΫτϦҎԼʹίϯςφΠϝʔδΛల։ͯ͠΋ʮϑΝ ΠϧγεςϜʯͰ͸ͳ͍ͷͰ pivot_root Ͱ͖ͳ͍ • ίϯςφͷ / (root) ͱ͍ͨ͠σΟϨΫτϦΛ bind Ϛ΢ϯτ ͢Δͱɺͦ͜͸Ϛ΢ϯτϙΠϯτʹͳΓɺ ʮϑΝΠϧγες ϜʯͬΆ͘ͳΓ • ͜ΕͰ pivot_root Ͱ͖·͢!! 22/54
  9. Namespace • ίϯςφͷ OS Ϧιʔε͕ʜ • ଞͷίϯςφ΍ϗετ͔Β • ݟ͑ͨΓ •

    ૢ࡞Ͱ͖ͨΓ • ڞ௨ͩͬͨΓ • ͨ͠ΒࠔΓ·͢ΑͶ!! ͦΜͳͷʮִ཭͞Εۭͨؒʯ͡Όͳ͍!! • ͦΜͳͱ͖࢖͏ͷ͕ “Namespace(໊લۭؒ)”!! • Namespace ͸୯ҰͷػೳͰ͸ͳ͘ɺϦιʔε͝ͱʹ Namespace ͕༻ҙ͞Ε·͢ • Linux ίϯςφͷཁͷػೳ 24/54
  10. Namespace ͷઆ໌ͷલʹ • ͭ·Γ Namespace ͕ͦ͜ Linux ίϯςφͱݴͬͯ΋ա ݴͰ͸ͳ͍ •

    ͦΜͳʮLinux ίϯςφʯΛ࠷΋؆୯ʹ࡞Δʹ͸!! • Docker Λ࢖͏ͷͰ͸ͳ͘ • LXC Λ࢖͏ͷͰ΋ͳ͘ • unshare ίϚϯυ!!(util_linux ύοέʔδʹؚ·Ε·͢) • ޙड़ͷ Network Namespace ͸ ip netns ίϚϯυ͕ ศར • Ͱ͸ Linux ʹ࣮૷͞Ε͍ͯΔ৭ʑͳ Namespace ػೳΛ Έ͍͖ͯ·͠ΐ͏ 25/54
  11. ৭ʑͳ Namespace Linux ʹ͸ҎԼͷΑ͏ͳ Namespace ͕࣮૷͞Ε͍ͯ·͢ • Mount Namespace •

    UTS Namespace • PID Namespace • IPC Namespace • Network Namespace • User Namespace • cgroup Namespace Ҏ্ͷ Namespace ͸͍ͣΕ΋ಠཱͯ͠࢖͑·͢ 26/54
  12. Mount Namespace • ίϯςφ಺ͷϚ΢ϯτɺϚ΢ϯτૢ࡞Λ෼཭ • Namespace ಺Ͱߦͬͨ mountɺumount ͕ଞͷ Namespace

    ʹӨڹΛ༩͑ͳ͍Α͏ʹ͢Δ • ִ཭͠ͳ͍Α͏ʹ΋Ͱ͖Δ • ࠷ۙ͸σϑΥϧτͰ͸ִ཭͞Ε͍ͯͳ͍ (systemd ͕ͦͷΑ ͏ʹઃఆ͢ΔͨΊ) ͷͰɺִ཭͢ΔΑ͏ʹઃఆ͠ͳ͚Ε͹ͳΒ ͳ͍ • ͭ·ΓଞͷίϯςφͰߦͬͨϚ΢ϯτૢ࡞͕ݟ͑ͳ͍ 27/54
  13. bind Ϛ΢ϯτɺpivot_rootɺmount namespace ͷσϞ • ݟͲ͜Ζ • bind Ϛ΢ϯτ͢Δ͜ͱͰ pivot_root

    ͕Ͱ͖ΔΑ͏ʹͳΔ • ίϯςφ༻ͷϑΝΠϧγεςϜ಺͚͕ͩݟ͑ΔΑ͏ʹͳΔ • Mount namespace ͷػೳʹΑΓίϯςφ಺ͷϚ΢ϯτͷ ू߹ͱϗετͷϚ΢ϯτͷू߹͸ಠཱ͍ͯ͠Δ 28/54
  14. ͜͜·ͰͰʜ • ίϯςφͷϑΝΠϧγεςϜִ͕཭͞Ε·ͨ͠ • ͔͠͠ɺଞͷ OS Ϧιʔε͸ϗετ΍ଞͷίϯςφͱڞ༗ͨ͠ ·· • ϓϩηε

    • ϗετ໊΍υϝΠϯ໊ (UTS) • ωοτϫʔΫ • Ϣʔβ • ʜ • ࣍ʹଞͷϦιʔεΛִ཭͢Δ Namespace Λ঺հ͍͖ͯ͠ ·͠ΐ͏ 29/54
  15. UTS Namespace • ίϯςφ͝ͱʹҧ͏ϗετ໊͚͍ͭͨͰ͢ΑͶ? • ͦΜͳͱ͖ʹ࢖͏ Namespace ͕ UTS Namespace

    • ίϯςφ͝ͱʹҟͳΔϗετ໊ɺυϝΠϯ໊Λ͚ͭΒΕ·͢ • uname(2) ͕ฦ͢஋Λ෼཭ 30/54
  16. PID Namespace • ίϯςφ಺ͰͲΜͳϓϩηεΛ࣮ߦ͍ͯ͠Δ͔ɺଞͷίϯςφ ͔Βݟ͑ͨΒΠϠͰ͢ΑͶ? • ίϯςφ͝ͱʹಠཱͯ͠ PID Λ͍࣋ͪͨ •

    ͦΜͳ࣌࢖͏ Namespace ͕ PID Namespace • ͨͩ͠ɺϗετ (਌ Namespace) ͔Βίϯςφ (ࢠͷ Namespace) ͷϓϩηε͸ݟ͑·͢ 31/54
  17. Network Namespace • ίϯςφ͝ͱʹಠཱͨ͠ΞυϨε΍ωοτϫʔΫΠϯλʔ ϑΣʔεΛ͍࣋ͪͨ!! • ͦΜͳͱ͖ʹ Network Namespace !!

    • σόΠε • ΞυϨε • ϙʔτ • ϧʔςΟϯά • ϑΟϧλϦϯά • ιέοτ • ʜ ͕ಠཱͯ࣋ͯ͠·͢ • ୯Ұϗετ্ʹෳ਺ͷωοτϫʔΫΛ࡞ͬͯςετͰ͖ͨΓ ͢Δ 33/54
  18. Network Namespace ͷσϞ • ݟͲ͜Ζ • Network Namespace ࡞੒௚ޙͷঢ়ଶ •

    veth ϖΞͷ࡞੒ • ยํͷΠϯλʔϑΣʔεΛ࡞੒ͨ͠ Namespace ʹଐͤ͞ ͨޙͷঢ়ଶ • ΠϯλʔϑΣʔεؒͰ௨৴͕Ͱ͖Δ 35/54
  19. User Namespace • ίϯςφ಺ͷ root Ϣʔβͱϗετͷ root Ϣʔβͱಉ͡͡Ό ةݥ!! •

    ͦΜͳͱ͖ʹ࢖͏ͷ͕ User Namespace!! • ଞͷ Namespace ͸ root ݖݶ͕ඞཁͰ͕͢ɺ͜Ε͚ͩ͸Ұ ൠϢʔβͰ࡞੒Մೳ • ίϯςφ಺ͷ UID,GID Λɺϗετ্ͷ UID,GID ͱϚοϐ ϯά͠·͢ 36/54
  20. User Namespace ͷσϞ • ݟͲ͜Ζ • ίϯςφ಺Ͱ͸ root ͕࣮ߦ͍ͯ͠Δϓϩηε͕ɺϗετ্Ͱ ͸ҰൠϢʔβݖݶͰಈ͍͍ͯΔ

    • ίϯςφ಺Ͱ root ݖݶͰ࡞੒ͨ͠ϑΝΠϧͷΦʔφʔ͕ϗε τ্Ͱ͸ҰൠϢʔβʹͳ͍ͬͯΔ • User Namespace ͸ҰൠϢʔβݖݶͰ࡞ΕΔɻଞͷ Namespace ͸࡞Εͳ͍ • User Namespace ಺Ͱ͸ଞͷ Namespace ͕࡞ΕΔ 37/54
  21. cgroup • ίϯςφ͝ͱʹ෺ཧϦιʔε (ϝϞϦɺCPUɺωοτϫʔΫଳ ҬͳͲ) Λ੍ݶ͍ͨ͠৔߹ʹ࢖͏ • ੍ݶ͢ΔϦιʔε͝ͱʹػೳ͕ఏڙ͞ΕΔͷͰɺ੍ݶ͍ͨ͠΋ ͷ͚ͩ࢖͑͹ྑ͍ •

    ίϯςφͰͳ͘ී௨ͷϓϩηεʹ΋ద༻Մೳɻ • ෳ਺ͷϓϩηεΛάϧʔϓԽͯ͠ద༻Ͱ͖Δ (ʹίϯςφ) • ৄ͘͠͸ࢀߟࢿྉΛࢀর!! 39/54
  22. Capability • root ͕࣋ͭಛݖΛࡉ͔͘෼ׂͯ͠༗ޮɾແޮ͕ઃఆͰ͖Δ • ྫ͑͹ʜ • ίϯςφ͔Βউखʹ࣌ؒΛม͑ΒΕͨΒࠔΔ (ίϯςφ಺ͷ࣌ ܭ͸ϗετͱڞ௨Ͱ͢Ͷ)

    • ࣌ؒΛઃఆͰ͖Δݖݶ (CAP_SYS_TIME) Λແޮʹ • chroot Λൈ͚ΒΕͨΒࠔΔ • chroot Ͱ͖Δݖݶ (CAP_SYS_CHROOT) Λແޮʹ • ίϯςφϥϯλΠϜͰσϑΥϧτͰແޮʹ͢Δ Capability ͕ఆٛ͞Ε͍ͯͨΓ͢Δ • ৄ͘͠͸ man 7 capabilities Λࢀর 42/54
  23. MAC Mandatory Access Control(ڧ੍ΞΫηε੍ޚ) • Ϧιʔεॴ༗ऀͷઃఆ͢Δݖݶ (DAC) ʹؔΘΒͣɺγεςϜ ؅ཧऀ͕ૢ࡞ର৅Ͱ͋ΔϦιʔεʹΞΫηε੍ޚΛઃఆͰ͖Δ •

    AppArmor ΍ SELinux ͳͲ • ίϯςφઐ༻ʹԾ૝Խ͞Εͳ͍ɺίϯςφ಺͔Βૢ࡞͞Εͯ͸ ࠔΔϦιʔε΁ͷ੍ݶΛઃఆ͢Δ • ͨͱ͑͹/proc ΍/sys ҎԼͷϑΝΠϧͳͲ 44/54
  24. ࠓ೔આ໌ͨ͜͠ͱͷ·ͱΊ • ίϯςφͱ͸୯ͳΔϓϩηεɻ௨ৗͷىಈͱ͸গ͠ҧ͏ଐੑΛ Ճ͑ͨϓϩηε • Linux Ͱ͸ɺίϯςφ͸Χʔωϧʹ࣮૷͞Ε͍ͯΔ৭ʑͳػ ೳΛ૊Έ߹Θ࣮ͤͯݱ͍ͯ͠Δ • ίϯςφઐ༻ͷϑΝΠϧγεςϜΛݟͤΔͨΊʹ

    chroot ΍ pivot_root Λ࢖͏ • ίϯςφΛ࣮ݱ͢ΔΩϞͱͳΔػೳ͕ “Namespace(໊લ ۭؒ)” • ίϯςφΛηΩϡΞʹ࣮ߦ͢ΔͨΊʹ༷ʑͳηΩϡϦςΟػೳ ͕࢖ΘΕΔɻ“Capability”ɺ“seccomp”ɺ“MAC” 48/54
  25. ࢀߟࢿྉ • ίϯςφશൠͷػೳΛཧղ͢ΔͨΊʹ • LXC ͰֶͿίϯςφೖ໳ ʵܰྔԾ૝Խ؀ڥΛ࣮ݱ͢Δٕज़ http://gihyo.jp/admin/serial/01/linux_containers • ࢲͷ͜Ε·Ͱͷߨԋࢿྉ

    https://speakerdeck.com/tenforward • ίϯςφΛʮकΔʯ࢓૊Έ͔Βத਎Λཧղ͠Α͏!!1 (by @udzura ͞Μ) https://speakerdeck.com/udzura/how-to-be-a- container 52/54
  26. ࢀߟࢿྉ • ίϯςφ͕Ͱ͖Δ·ͰͷॲཧΛ௥͏ͨΊʹ • MINCS (γΣϧͰॻ͔Εͨίϯςφ) (by @mhiramat ͞ Μ)

    https://github.com/mhiramat/mincs • MINCS Ͱ Linux ίϯςφΛ࡞Ζ͏ (MINCS ʹؔ͢Δൃද ࢿྉ) • ֶͭͬͯ͘Ϳ Linux ίϯςφͷཪଆ (by @hayajo ͞Μ) • Go Ͱ࡞Δ Linux ίϯςφ (by @hayajo ͞Μ) • ඞཁͳػೳ͚ͩΛ࢖ͬͯίϯςφΛಈ͔ͨ͢Ίʹ • Haconiwa (mruby Ͱॻ͔Εͨίϯςφ࡞੒ͷͨΊͷ DSL) http://haconiwa.mruby.org/ 53/54
  27. ࢀߟࢿྉ • ίϯςφؔ࿈ػೳͷ࣮૷ͳͲΛਂ͘஌Δʹ͸ • Linux Namespaces (Namespace ͷΧʔωϧ಺෦ͷ࣮ ૷ʹؔ͢Δࢿྉ)(by Masami

    Ichikawa ͞Μ) • cgroup ͋Ε͜Ε (cgroup ͷ಺෦ͷ͓࿩)(by @hiro_kamezawa ͞Μ) • seccomp Λ mruby Ͱࢼ͢ (ϩʔϑΝΠ೔ه) • AppArmor ͱ Docker ͱͦͷଞίϯςφతϓϩηεʹ͍ͭ ͯௐ΂ͨ (ϩʔϑΝΠ೔ه) • ͦͷଞ • ʮίϯςφܕԾ૝Խͷ৘ใަ׵ձʯ ͜Ε·Ͱͷൃදࢿྉ΍ಈը͕ެ։͞Ε͍ͯ·͢ 54/54