Linux コンテナの内部を知って ワンランク上のコンテナ遣いを目指そう / JTF2017

2591343b244565d6199f61c4acd148f9?s=47 tenforward
August 27, 2017

Linux コンテナの内部を知って ワンランク上のコンテナ遣いを目指そう / JTF2017

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

2591343b244565d6199f61c4acd148f9?s=128

tenforward

August 27, 2017
Tweet

Transcript

  1. Linux ίϯςφͷ಺෦Λ஌ͬͯ ϫϯϥϯΫ্ͷίϯςφݣ͍Λ໨ࢦͦ͏ July Tech Festa 2017 Ճ౻ହจ (@ten_forward) 2017-08-27

  2. ࣗݾ঺հ ࠓ೔ͷ໨ඪ ίϯςφͷ֓ཁ Linux ʹ͓͚Δίϯςφ ίϯςφͷϑΝΠϧγεςϜ Namespace(໊લۭؒ) cgroup ηΩϡϦςΟػೳ ͦͷଞͷػೳ

    ·ͱΊ 1/53
  3. ࣗݾ঺հ Ճ౻ହจ • http://www.ten-forward.ws/ • @ten_forward • http://gplus.to/tenforward • https://github.com/tenforward

    • http://tenforward.hatenablog.com/ (ٕज़ϒϩά) 2/53
  4. ࣗݾ঺հ (࢓ࣄ) ϑΝʔεταʔόɹ։ൃ෦ɹॴଐ 3/53

  5. ࣗݾ঺հ (OSSɾίϯςφؔ࿈) • Plamo Linux ϝϯςφ • LXC ͰֶͿίϯςφೖ໳ɹʔܰྔԾ૝Խ؀ڥΛ࣮ݱ͢Δٕज़ gihyo.jp

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

    ެࣜϖʔδ (linuxcontainers.org) ຋༁ • όάϑΟοΫεͳͲগ͚ͩ͠ίʔυʹ΋ߩݙ • LXD ೔ຊޠϝοηʔδ • ίϯςφܕԾ૝Խͷ৘ใަ׵ձओ࠻ 5/53
  7. ࣗݾ঺հ ࠓ೔ͷ໨ඪ ίϯςφͷ֓ཁ Linux ʹ͓͚Δίϯςφ ίϯςφͷϑΝΠϧγεςϜ Namespace(໊લۭؒ) cgroup ηΩϡϦςΟػೳ ͦͷଞͷػೳ

    ·ͱΊ 6/53
  8. ࠓ೔ͷ໨ඪ • ίϯςφͷ֓ཁΛཧղ͢Δ • Linux ίϯςφ؀ڥΛߏங͢ΔࡍʹΑ͘࢖ΘΕΔٕज़Λཧղ ͢Δ 7/53

  9. ࠓ೔ͷൃද ࠓ೔͸ίϯςφͰΑ͘࢖ΘΕΔػೳͷ͍͔ͭ͘ΛऔΓ্͛ɺ࣮ྫ΍ σϞΛަ͑ͳ͕Βઆ໌͠·͢ɻίϯςφؔ࿈ػೳΛ໢ཏతʹ஌Γͨ ͍৔߹͸ • LXC ͰֶͿίϯςφೖ໳ ʵܰྔԾ૝Խ؀ڥΛ࣮ݱ͢Δٕज़ (gihyo.jp) •

    speakerdeck ʹ͋Δࢲͷ OSC ͳͲͷൃදࢿྉ • ͦͷଞࢀߟࢿྉ (࠷ޙʹ͍͔ͭ͘঺հ͠·͢) ͳͲΛ͝ཡ͍ͩ͘͞ɻ 8/53
  10. ࣗݾ঺հ ࠓ೔ͷ໨ඪ ίϯςφͷ֓ཁ Linux ʹ͓͚Δίϯςφ ίϯςφͷϑΝΠϧγεςϜ Namespace(໊લۭؒ) cgroup ηΩϡϦςΟػೳ ͦͷଞͷػೳ

    ·ͱΊ 9/53
  11. ίϯςφͱ͸ ΧʔωϧͷػೳͰ • ִ཭͞ΕۭͨؒͰϓϩηεΛ࣮ߦ͢Δ • ʮԾ૝؀ڥʯͱ͍͏ΑΓ͸ʮִ཭͞Εͨ؀ڥʯͱߟ͑ͨํ͕ޡ ղ͕ͳ͍ • ִ཭͞Εͨಉۭؒ͡಺ͰϓϩηεΛͻͱ͚࣮ͭͩߦ͢Δ͜ͱ΋ɺ ෳ਺࣮ߦ͢Δ͜ͱ΋Ͱ͖Δ

    • ϓϩηεʹରͯ͠Ϧιʔε੍ݶΛઃఆ͢Δ (ˡࠓ೔͸ܰ͘৮Ε ·͢) 10/53
  12. ίϯςφͱ͸ • ͭ·Γ୯ͳΔϓϩηε (or ୯ͳΔϓϩηεͷू߹) • ϓϩηεʹʮଐੑʯΛࢦఆ͢Δ • ྫ͑͹ʜ •

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

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

    • FreeBSD jail (ଞʹ VPS ͱ͍͏࣮૷΋͋Δ) • Solaris Zones • Windows (Windows Server ίϯςφɾHyper-V ίϯ ςφ) 13/53
  15. ࣗݾ঺հ ࠓ೔ͷ໨ඪ ίϯςφͷ֓ཁ Linux ʹ͓͚Δίϯςφ ίϯςφͷϑΝΠϧγεςϜ Namespace(໊લۭؒ) cgroup ηΩϡϦςΟػೳ ͦͷଞͷػೳ

    ·ͱΊ 14/53
  16. Linux ʹ͓͚Δίϯςφ Linux Χʔωϧʹ͸୯Ұͷʮίϯςφʯͱ͍͏ػೳ͕͋ΔΘ͚Ͱ͸ ͳ͍ • ৭ʑͳػೳΛ૊Έ߹ΘͤͯʮίϯςφʯΛ࡞Δ • ˠ ࣗ෼ʹཉ͍͠ػೳΛ૊Έ߹Θͤͯʮίϯςφʯ͕࡞ΕΔ

    • Docker ΍ LXC/LXD ͳͲͷίϯςφ࣮૷΋ࣗ਎͕ཉ͍͠ ༷ʑͳػೳΛ૊Έ߹Θͤͯίϯςφ؀ڥΛߏங͍ͯ͠Δ ͦΕͰ͸ɺίϯςφͰΑ͘࢖ΘΕΔػೳΛ঺հ͠ͳ͕Βίϯςφ͕ Ͱ͖Δ·ͰΛݟ͍͖ͯ·͠ΐ͏ 15/53
  17. ࣗݾ঺հ ࠓ೔ͷ໨ඪ ίϯςφͷ֓ཁ Linux ʹ͓͚Δίϯςφ ίϯςφͷϑΝΠϧγεςϜ Namespace(໊લۭؒ) cgroup ηΩϡϦςΟػೳ ͦͷଞͷػೳ

    ·ͱΊ 16/53
  18. ίϯςφಠࣗͷϑΝΠϧγεςϜ ྫ͑͹ʜ • ΠϝʔδΛऔಘͯ͠ϗετ OS ͷϑΝΠϧγεςϜ্ʹల։ ͢Δ • Ͱ΋ίϯςφىಈޙ͸औಘͨ͠ΠϝʔδͷσΟϨΫτϦπϦʔ ͚͕ͩݟ͍͑ͯΔ

    ͜ΕΛͲͷΑ͏ʹ࣮ݱ͢Δͷ͔Λ͔࣍ΒΈ͍͖ͯ·͠ΐ͏ 17/53
  19. chroot • ΋ͬͱ΋γϯϓϧʹίϯςφઐ༻ͷϑΝΠϧγεςϜ (σΟϨ ΫτϦπϦʔ) ΛݟͤΒΕΔ • ݟ্͔͚ͷϧʔτσΟϨΫτϦΛมߋ͢Δ • ͨͩ͠ɺchroot

    ͨ͠؀ڥ͔Βൈ͚ग़ͤΔ • chroot Ͱ͖ͳ͍Α͏ʹݖݶΛണୣ͢Δඞཁ͕͋Δ 18/53
  20. chroot ͷσϞ • ΈͲ͜Ζ • ৽͘͠ /(root) ʹ͍ͨ͠σΟϨΫτϦʹҠಈͯ͠ chroot ί

    ϚϯυΛ࣮ߦ͢Δ͚ͩͷ؆୯͞ • Ͱ΋৽ͨͳ /(root) ͔Βൈ͚ग़ͤΔ 19/53
  21. pivot_root • root ϑΝΠϧγεςϜΛऔΓସ͑Δ • ϑΝΠϧγεςϜࣗମΛऔΓସ͑ΔͷͰൈ͚ΒΕͳ͍ (ൈ͚Δ ͱ͍͏֓೦͕ͳ͍) • chroot

    ʹൺ΂Δͱ੍ݶ͕ଟ͍ • Docker ΍ LXC ͸ pivot_root Λ࢖༻ 20/53
  22. pivot_root pivot_root ͸৽ͨʹ / (root) ͱ͍ͨ͠σΟϨΫτϦ (Ϛ΢ϯτ ϙΠϯτ) ͱίϚϯυ࣮ߦલ࣌఺ͷ /

    (root) ΛϚ΢ϯτ͢ΔσΟ ϨΫτϦ (৽ root ҎԼ) Λࢦఆ͢Δ   pivot_root [৽͍͠ root] [Ҏલͷ root] (ྫ) pivot_root . old   ͜ΕͰΧϨϯτσΟϨΫτϦ͕ / (root) ͱͳΓɺҎલͷ/͕./old ҎԼʹϚ΢ϯτ͞ΕΔ 21/53
  23. bind Ϛ΢ϯτ • Ϛ΢ϯτ͍ͯ͠ΔπϦʔͷҰ෦Λผͷ৔ॴʹϚ΢ϯτ͢Δػೳ • ϗετͱίϯςφͰσΟϨΫτϦ΍ϑΝΠϧΛڞ༗͢Δࡍʹ΋ ࢖͍·͢ 22/53

  24. bind Ϛ΢ϯτ • ৽ͨͳ / (root) ʹมߋ͢ΔͨΊʹ pivot_root Λ࢖͏ࡍ •

    ͋ΔσΟϨΫτϦҎԼʹίϯςφΠϝʔδΛల։ͯ͠΋ʮϑΝ ΠϧγεςϜʯͰ͸ͳ͍ͷͰ pivot_root Ͱ͖ͳ͍ • ίϯςφͷ / (root) ͱ͍ͨ͠σΟϨΫτϦΛ bind Ϛ΢ϯτ ͢Δͱɺͦ͜͸Ϛ΢ϯτϙΠϯτʹͳΓɺϑΝΠϧγεςϜͬ Ά͘ͳΓ • ʮϑΝΠϧγεςϜʯͱ͸ɺϚ΢ϯτϙΠϯτʹϚ΢ϯτ͞Ε ΔϚ΢ϯτͷ৘ใͱؚ·ΕΔπϦʔ (=mount ߏ଄ମ) ˠͭ· Γ bind Ϛ΢ϯτͰ͜ΕΛຬͨͤΔ • ͜ΕͰ pivot_root Ͱ͖·͢!! 23/53
  25. ࣗݾ঺հ ࠓ೔ͷ໨ඪ ίϯςφͷ֓ཁ Linux ʹ͓͚Δίϯςφ ίϯςφͷϑΝΠϧγεςϜ Namespace(໊લۭؒ) cgroup ηΩϡϦςΟػೳ ͦͷଞͷػೳ

    ·ͱΊ 24/53
  26. Namespace • ίϯςφͷ OS Ϧιʔε͕ʜ • ଞͷίϯςφ΍ϗετ͔Β • ݟ͑ͨΓ •

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

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

    UTS Namespace • PID Namespace • IPC Namespace(ࠓ೔͸৮Ε·ͤΜ) • Network Namespace • User Namespace • cgroup Namespace(ࠓ೔͸৮Ε·ͤΜ) Ҏ্ͷ Namespace ͸͍ͣΕ΋ಠཱͯ͠࢖͑·͢ 27/53
  29. Mount Namespace • ίϯςφ಺ͷϚ΢ϯτɺϚ΢ϯτૢ࡞Λ෼཭ • Namespace ಺Ͱߦͬͨ mountɺumount ͕ଞͷ Namespace

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

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

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

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

    ͦΜͳ࣌࢖͏ Namespace ͕ PID Namespace • ͨͩ͠ɺϗετ (਌ Namespace) ͔Βίϯςφ (ࢠͷ Namespace) ͷϓϩηε͸ݟ͑·͢ 32/53
  34. UTS, PID Namespace ͷσϞ • ݟͲ͜Ζ • ίϯςφ಺Ͱ͸ίϯςφ಺ͷϓϩηε͚͕ͩݟ͍͑ͯΔ • ίϯςφ಺Ͱϗετ໊Λม͑ͯ΋ϗετͷϗετ໊͸มΘͬͯ

    ͍ͳ͍ 33/53
  35. Network Namespace ωοτϫʔΫΠϯλʔϑΣʔεɺΞυϨεɺϧʔςΟϯάɺϑΟϧ λϦϯά͕ίϯςφ͝ͱʹಠཱͯ࣋ͯ͠·͢ɻ આ໌͠Α͏ͱࢥ͍·͕ͨ͠ʜ ͳΜͱ!! ͪ͜ΒΛͲ͏ͧ!!(ؙ౤͛) 34/53

  36. User Namespace • ίϯςφ಺ͷ root Ϣʔβͱϗετͷ root Ϣʔβͱಉ͡͡Ό ةݥ!! •

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

    • ίϯςφ಺Ͱ root ݖݶͰ࡞੒ͨ͠ϑΝΠϧͷΦʔφʔ͕ϗε τ্Ͱ͸ҰൠϢʔβʹͳ͍ͬͯΔ • User Namespace ͸ҰൠϢʔβݖݶͰ࡞ΕΔɻଞͷ Namespace ͸࡞Εͳ͍ • User Namespace ಺Ͱ͸ଞͷ Namespace ͕࡞ΕΔ 36/53
  38. ࣗݾ঺հ ࠓ೔ͷ໨ඪ ίϯςφͷ֓ཁ Linux ʹ͓͚Δίϯςφ ίϯςφͷϑΝΠϧγεςϜ Namespace(໊લۭؒ) cgroup ηΩϡϦςΟػೳ ͦͷଞͷػೳ

    ·ͱΊ 37/53
  39. cgroup • ίϯςφ͝ͱʹ෺ཧϦιʔε (ϝϞϦɺCPUɺωοτϫʔΫଳ ҬͳͲ) Λ੍ݶ͍ͨ͠৔߹ʹ࢖͏ • ੍ݶ͢ΔϦιʔε͝ͱʹػೳ͕ఏڙ͞ΕΔͷͰɺ੍ݶ͍ͨ͠΋ ͷ͚ͩ࢖͑͹ྑ͍ •

    ίϯςφͰͳ͘ී௨ͷϓϩηεʹ΋ద༻Մೳɻ • ෳ਺ͷϓϩηεΛάϧʔϓԽͯ͠ద༻Ͱ͖Δ (ʹίϯςφ) • ৄ͘͠͸ࢀߟࢿྉΛࢀর!! 38/53
  40. ࣗݾ঺հ ࠓ೔ͷ໨ඪ ίϯςφͷ֓ཁ Linux ʹ͓͚Δίϯςφ ίϯςφͷϑΝΠϧγεςϜ Namespace(໊લۭؒ) cgroup ηΩϡϦςΟػೳ ͦͷଞͷػೳ

    ·ͱΊ 39/53
  41. ηΩϡϦςΟػೳ • ίϯςφͱ͸ϗετ্Ͱಈ͘୯ͳΔϓϩηε • ίϯςφ্Ͱ࣮ߦ໋ͨ͠ྩ͕ϗετ΍ଞͷίϯςφʹӨڹΛ༩ ͑ΔՄೳੑ͕͋Δ ͦ͜Ͱ • ༷ʑͳಛݖɾ໋ྩͷҰ෦Λ੍ݶͨ͠Γ •

    ༷ʑͳಛݖɾ໋ྩͷҰ෦ͷΈΛίϯςφʹ༩͑ͨΓͯ͠ ϗετ΍ଞͷίϯςφʹӨڹ͕ٴ͹ͳ͍Α͏ʹ͢Δ 40/53
  42. Capability • root ͕࣋ͭಛݖΛࡉ͔͘෼ׂͯ͠༗ޮɾແޮ͕ઃఆͰ͖Δ • ྫ͑͹ʜ • ίϯςφ͔Βউखʹ࣌ؒΛม͑ΒΕͨΒࠔΔ (ίϯςφ಺ͷ࣌ ܭ͸ϗετͱڞ௨Ͱ͢Ͷ)

    • ࣌ؒΛઃఆͰ͖Δݖݶ (CAP_SYS_TIME) Λແޮʹ • chroot Λൈ͚ΒΕͨΒࠔΔ • chroot Ͱ͖Δݖݶ (CAP_SYS_CHROOT) Λແޮʹ • ίϯςφϥϯλΠϜͰσϑΥϧτͰແޮʹ͢Δ Capability ͕ఆٛ͞Ε͍ͯͨΓ͢Δ • ৄ͘͠͸ man 7 capabilities Λࢀর 41/53
  43. seccomp OS ͷػೳΛݺͼग़ͨ͢Ίʹ࢖͏γεςϜίʔϧʹର͢ΔϑΟϧλ Ϧϯά • ಛఆͷγεςϜίʔϧΛڐՄͨ͠Γ • ಛఆͷγεςϜίʔϧΛېࢭͨ͠Γ • ίϯςφϥϯλΠϜͰσϑΥϧτͰڐՄ͢ΔγεςϜίʔϧ͕

    ఆٛ͞Ε͍ͯͨΓ͢Δ • ৄ͘͠͸ man 2 seccomp Λࢀর 42/53
  44. MAC Mandatory Access Control(ڧ੍ΞΫηε੍ޚ) • Ϧιʔεॴ༗ऀͷઃఆ͢Δݖݶ (DAC) ʹؔΘΒͣɺγεςϜ ؅ཧऀ͕ૢ࡞ର৅Ͱ͋ΔϦιʔεʹΞΫηε੍ޚΛઃఆͰ͖Δ •

    AppArmor ΍ SELinux ͳͲ • ίϯςφઐ༻ʹԾ૝Խ͞Εͳ͍ɺίϯςφ಺͔Βૢ࡞͞Εͯ͸ ࠔΔϦιʔε΁ͷ੍ݶΛઃఆ͢Δ • ͨͱ͑͹/proc ΍/sys ҎԼͷϑΝΠϧͳͲ 43/53
  45. ࣗݾ঺հ ࠓ೔ͷ໨ඪ ίϯςφͷ֓ཁ Linux ʹ͓͚Δίϯςφ ίϯςφͷϑΝΠϧγεςϜ Namespace(໊લۭؒ) cgroup ηΩϡϦςΟػೳ ͦͷଞͷػೳ

    ·ͱΊ 44/53
  46. ͦͷଞͷػೳ ͜Ε·Ͱʹ঺հͨ͠Ҏ֎ʹ΋ Linux Χʔωϧʹ࣮૷͞Ε͍ͯΔ ༷ʑͳػೳ͕ඞཁʹԠͯ͡ར༻͞Ε͍ͯΔ • ωοτϫʔΫ (Ծ૝ΠϯλʔϑΣʔεͳͲ) • ϑΝΠϧγεςϜ

    (overlayfs ͳͲ) • ϓϩηεͷνΣοΫϙΠϯτɾϦετΞ • ͳͲͳͲʜ 45/53
  47. ࣗݾ঺հ ࠓ೔ͷ໨ඪ ίϯςφͷ֓ཁ Linux ʹ͓͚Δίϯςφ ίϯςφͷϑΝΠϧγεςϜ Namespace(໊લۭؒ) cgroup ηΩϡϦςΟػೳ ͦͷଞͷػೳ

    ·ͱΊ 46/53
  48. ࠓ೔આ໌ͨ͜͠ͱͷ·ͱΊ • ίϯςφͱ͸୯ͳΔϓϩηεɻ௨ৗͷىಈͱ͸গ͠ҧ͏ଐੑΛ Ճ͑ͨϓϩηε • Linux Ͱ͸ɺίϯςφ͸Χʔωϧʹ࣮૷͞Ε͍ͯΔ৭ʑͳػ ೳΛ૊Έ߹Θ࣮ͤͯݱ͍ͯ͠Δ • ίϯςφઐ༻ͷϑΝΠϧγεςϜΛݟͤΔͨΊʹ

    chroot ΍ pivot_root Λ࢖͏ • ίϯςφΛ࣮ݱ͢ΔΩϞͱͳΔػೳ͕ “Namespace(໊લ ۭؒ)” • ίϯςφΛηΩϡΞʹ࣮ߦ͢ΔͨΊʹ༷ʑͳηΩϡϦςΟػೳ ͕࢖ΘΕΔɻ“Capability”ɺ“seccomp”ɺ“MAC” 47/53
  49. ·ͱΊ • ੈͷதʹଘࡏ͢ΔίϯςφϥϯλΠϜͰ͸ίϯςφΛಈ࡞ͤ͞ ΔͨΊʹ৭ʑͳػೳΛ࢖͍ɺσϑΥϧτͰྑ͍ײ͡Ͱίϯςφ ͕ಈ͘Α͏ʹௐ੔͞Ε͍ͯ·͢ • ࣗ෼͕࢖͍ͬͯΔίϯςφϥϯλΠϜͰ͸ͲͷΑ͏ͳػೳ͕࢖ ΘΕ͍ͯΔͷ͔ɺͲͷΑ͏ͳػೳΛ࢖͏͜ͱ͕Ͱ͖Δͷ͔Λཧ ղ͢Ε͹ɺΑΓద੾ʹίϯςφΛ࢖͏͜ͱ͕Ͱ͖ΔͰ͠ΐ͏ •

    ࠷ۙͰ͸ɺཁ݅ʹ͋ͬͨඞཁͳػೳ͚ͩΛ࢖ͬͯίϯςφΛ࡞ ΕΔϓϩμΫτ΋͋Γ·͢ (ࢀߟࢿྉࢀর) 48/53
  50. த਎Λཧղͯ͠ޮՌతʹɺָ͘͠ɺ҆શʹίϯςφ Λ࢖͍·͠ΐ͏ 49/53

  51. ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ 50/53

  52. ࢀߟࢿྉ • ίϯςφશൠͷػೳΛཧղ͢ΔͨΊʹ • 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 51/53
  53. ࢀߟࢿྉ • ίϯςφ͕Ͱ͖Δ·ͰͷॲཧΛ௥͏ͨΊʹ • 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/ 52/53
  54. ࢀߟࢿྉ • ίϯςφؔ࿈ػೳͷ࣮૷ͳͲΛਂ͘஌Δʹ͸ • Linux Namespaces (Namespace ͷΧʔωϧ಺෦ͷ࣮ ૷ʹؔ͢Δࢿྉ)(by Masami

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