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

seccomp notify による安全なコンテナ実行環境 / 14th CTStudy

2591343b244565d6199f61c4acd148f9?s=47 tenforward
April 17, 2021

seccomp notify による安全なコンテナ実行環境 / 14th CTStudy

「第14回コンテナ技術の情報交換会@オンライン」の発表資料です。
参考となる情報にはPDF中からリンクをしていますが、資料中のリンクは Speaker Deck 上ではクリックできないので PDF をダウンロードしてご覧ください。

2591343b244565d6199f61c4acd148f9?s=128

tenforward

April 17, 2021
Tweet

Transcript

  1. Seccomp Notify 〠〽぀҆શ〟ぢアふべ࣮ߦ؀ڥ ୈ 14 ճぢアふべٕज़〣৘ใަ׵ձ Ճ౻ହจ 2021-04-17 1/25

  2. ࣗݾ঺հ

  3. ࣗݾ঺հ ɹ Ճ౻ହจʢ͔ͱ͏΍͢;Έʣ • @ten_forward • https://github.com/tenforward/ • גࣜձࣾ IDC

    や゜アふくぎ • LXC 〜ֶ〫ぢアふべೖ໳ ʵܰྔԾ૝Խ؀ڥぇ ࣮ݱ『぀ٕज़ (gihyo.jp, 2014 ೥ʙ) • Plamo Linux ゐアふべそ゚がゆ • lxc-jp ゆ゜でこぜぷ • ॳ〶〛৮ぁ〔ぢアふべ〤 Virtuozzo • ޷ 〟てとふわぢが゚〤 setns() 2/25
  4. ぢ゜べՒ〣ࢲʢ1ʣʙ ࢓ࣄ ろぼがでへ kubernetes つがもと〣։ൃʢばがわ〣ย۱〠ʣ ɻ〽⿸〹。 k8s 〠ೖ໳〜 〳「〔 https://special.nikkeibp.co.jp/atclh/NXT/21/idcf0330/ https://www.itmedia.co.jp/news/articles/2103/25/news001.html

    3/25
  5. ぢ゜べՒ〣ࢲʢ2ʣʙ ษڧձ • ࡢ೥ 3 ೥〫〿〠〈〣ษڧձぇ࠶։ʂ • ୈ 12 ճɺ13

    ճ〜 cgroup ಛू • 〒〣ྲྀぁ〜ຊ೔〣ษڧձ։࠵ 4/25
  6. ぢ゜べՒ〣ࢲʢ3ʣʙ ݈߁ ࡏ୐ۈ຿〜Ұ೔〣า਺⿿ 200 า〝⿾ʜ (>_<)ʢˡ⿴぀⿴぀〜『〟ʣ • ˠɹۙॴぇげさがずアそʢࠓ〤ຖ೔でわ or ゘アぺアそʣ

    • ˠɹۙॴ⿿ݹ෿〕〾々〟〈〝〠ؾ〚。 • ˠɹݹ෿〠まろ぀ ਪ「ݹ෿ʢݹ෿࣌୅ޙظʣ 5/25
  7. ぢ゜べՒ〣ࢲʢ4ʣʙ ざア゘ぐアゎがふくアそ 〴〟《えざア゘ぐアゎがふくアそ⿿೔ৗ〜『〽〢ʁ ࢲ〷〜『ɻ • ౰વ〟⿿〾゙ぎ゚ぐよアぷ〤〟「 • K-POP ぐよアぷ〤ざア゘ぐア〠Ҡߦ •

    ఆظత〠ूۚ〠དྷ぀ぎぐぺ〝ざア゘ぐアゎがふくアそʢZoomɺLineɺʜʣ ゎがふくアそࢿྉ〚。〿⿿େม 6/25
  8. ຊ೔〣಺༰

  9. ຊ೔〣಺༰ Linux 5.0 〜࣮૷《ぁ〔 Seccomp Notify ػೳ〣֓ཁ〠〙⿶〛આ໌「〳『ɻ ࿈ࡌ ୈ 47

    ճɹඇಛݖぢアふべ〣Մೳੑぇ޿〆぀ seccomp notify ػೳ〣಺༰〣෮श 〜『ɻ • ඇಛݖぢアふべʢUser Namespaceʣ • てとふわぢが゚ • Seccomp • Seccomp Notify 7/25
  10. ⿼《〾⿶

  11. User Namespace • Namespaceʢぢアふべʣ಺֎〜 UID/GID ぇろひゃアそ『぀ػೳ • ぢアふべ಺〜〤 rootɺぢアふべ֎〜〤 Ұൠゕがづが〝⿶⿸〽⿸〟ろひゃアそ

    ⿿〜 ぀ • ぢアふべ಺〜〤 root 〝「〛〪぀〳⿺ ぀⿿ɺぢアふべ֎〣てとふわ〠Өڹぇ ٴ〱『〽⿸〟ૢ࡞〤〜 〟⿶〈〝⿿ ⿴぀ 8/25
  12. てとふわぢが゚ ぎゆ゙たがてゖア⿾〾 OSʢLinux じがぼ゚ʣ〣ػೳぇݺ〨ग़『〔〶〣࢓૊〴 • ゕがづۭؒ〜࣮ߦ《ぁ぀ぎゆ゙たがてゖア〤௚ ઀じがぼ゚〣ػೳぇૢ࡞〜 〟⿶ • 〒〣〔〶〣ぐアのがやこがと〝「〛γεςϜ ίʔϧ⿿४උ《ぁ〛⿶぀

    • ౰વݺ〨ग़『ࡍ〠〤ݖݶばこひぜ⿿ߦいぁ぀ • ぎゆ゙たがてゖア〤てとふわぢが゚ぇݺ〨ग़ 「ɺ݁Ռぇड々औ぀ 9/25
  13. User Namespace 〝てとふわ ぢが゚

  14. User Namespace 〝てとふわぢが゚ • User Namespace ಺〣 root 〤 root

    〟〣〜ඞཁ〟ݖݶぇ࣋〘〛⿶぀〤』 • 〝〈あ⿿ಛݖ⿿ඞཁ〝《ぁ぀ૢ࡞ぇߦ⿸〝ɺಛݖぇ࣋〘〛⿶぀ root 〣〤』〟〣〠 ࣦഊ『぀〈〝⿿⿴぀ • User Namespace 〤 Namespace ֎〜〤Ұൠゕがづが ˠりとぷ〹ଞ〣 Namespace ぇةݥ〠《〾『Մೳੑ⿿⿴぀ૢ࡞〤ېࢭ《ぁ〛⿶぀ 10/25
  15. User Namespace ಺〜࣮ߦ〜 〟⿾〘〔てとふわぢが゚ ぢアふべք〣ʢ?ʣ௕೥〣ݒҊ • やきぐ゚てとふわ〣ろげアぷʢmount てとふわぢが゚ʣ • ぶみぐとやきぐ゚〣࡞੒ʢmknod, mknodat

    てとふわぢが゚ʣ 〟〞ʜ 11/25
  16. 〈ぁ〳〜〤ʜ ࠔ〘〛〟⿾〘〔〝ݴ⿺〥ࠔ〘〛〟⿾〘〔 • ぢアふべ಺〜ଘࡏ「〛〷҆શ〟ぶみぐとやきぐ゚〤ɺࣄલ〠りとぷ্〣ಛݖぇ࢖〘 〛ඞཁ〟ॲཧぇߦ⿶ɺbind ろげアぷ〜ぢアふべ಺〠ग़ݱ《【぀〟〞 • ぢアふべ಺〜ろげアぷ「〛〷҆શ〟やきぐ゚てとふわʢproc, tmpfs, cgroup

    〟 〞ʣ〤ろげアぷ⿿ڐՄ《ぁ〛⿶〔 • ةݥ〟Մೳੑ⿿⿴぀ॲཧ〤ॳظ〣 User Namespace 〜ݖݶぇ࣋〘〛⿶぀⿾⿿֬ ೝ《ぁ぀ 12/25
  17. ໰୊఺ ैདྷ⿴〘〔ぢアふべろぼがでをがࢹ఺〣໰୊఺ɿ • ぢアふべ಺〣ゆ゜そ゘わ⿿Կぇ『぀⿾ʢ=〞〣〽⿸〟てとふわぢが゚ぇൃߦ『぀ ⿾ʣい⿾〾〟⿶ • ぢアふべろぼがでをが〹ぢアふべりとぷ〣؅ཧਓ〤ʢҰൠత〠ةݥ〝《ぁ぀ॲཧ〜 ⿴〘〛〷ʣ҆શੑ⿿い⿾〘〛⿶぀৔߹⿿⿴぀ • じがぼ゚〜ॲཧぇ੍ݶ『぀৔߹ɺةݥ〟Մೳੑ⿿⿴ぁ〥ېࢭ『぀「⿾〟⿶

    • ぢアふべろぼがでをが〝「〛ڐՄ〜 ぀ॲཧ⿿⿴぀Մೳੑ • Ұൠత〠〤ةݥ〟ॲཧ〜⿴〘〛〷ಛఆ〣ぢアふべ〠〤ڐՄ〜 ぀ॲཧ〜⿴぀Մೳੑ • ぢアふべろぼがでをが〤ぢアふべ಺〜೚ҙ〣ॲཧʢてとふわぢが゚〣ൃߦʣ⿿ߦい ぁ〔〈〝ぇ஌぀〈〝⿿〜 〟⿶ • Ծ〠஌぀〈〝⿿〜 〛〷ݕࠪぇߦ⿸ํ๏⿿〟⿶ 13/25
  18. seccomp લ〣と゘ぐへ〜 • ʮॲཧ⿿࣮ߦ《ぁ〔⿾〞⿸⿾ぇ஌぀〈〝〤〜 〟⿶ʯ • ʮ࣮ߦ《ぁ〔〈〝⿿い⿾〘〛〷ݕࠪ〜 〟⿶ʯ 〝ॻ⿶〔⿿ɺ〈ぁ⿿࣮ݱ〜 ぀ʢՄೳੑ⿿⿴぀ʣػೳ⿿࣮〤 Linux じがぼ゚〠〤ଘࡏ 『぀

    ˣ seccomp 14/25
  19. seccomp

  20. seccomp 〣ྺ࢙ 2005 ೥ 2.6.12 〜 seccomp ಋೖ Ұ෦〣てとふわぢが゚〣࣮ߦぇڐՄ『぀〕々〣てアゆ゚〟ػೳ read,write,exit,sigreturn

    Ҏ֎࣮ߦ〜 〟⿶ 2012 ೥ 3.5 〜 seccomp mode 2 ಋೖ てとふわぢが゚〉〝〠੍ݶ てとふわぢが゚Ҿ਺〣ばこひぜ 2019 ೥ 5.0 〜 seccomp notify ಋೖ ଞ〠"Seccomp trap to userspace"ɼ"seccomp user notifications"〝ݺ〥ぁ〛⿶〔〿 15/25
  21. seccomp 〠〽぀てとふわぢが゚〣やく゚の゙アそ • ⿴〾⿾」〶てとふわぢが゚〠ؔ『぀ڐ Մɾېࢭ〣れ゙てがぇఆٛ「〛⿼。 • てとふわぢが゚⿿࣮ߦ《ぁ぀〝れ゙ てが〠ै〘〛࣮ߦ『぀⿾〞⿸⿾ぇ൑அ • ېࢭ〣৔߹ɺ〞〣〽⿸〠ಈ࡞『぀⿾ぇ

    ఆٛ「〛⿼。ɻゆ゜そ゘わऴྃɺࢦఆ 「〔ご゘がぇฦ『 seccomp mode2 〜ॊೈ〠てとふわぢが゚〣࣮ߦՄ൱ぇઃఆ〜 ぀ ˠなずゔ゙ふく֬อ〣〔〶〠ぢアふべろぼがでをが〠〤ී௨〠࣮૷《ぁ〛⿶぀ػೳ 16/25
  22. seccomp notify

  23. 〈ぁ〳〜〣 seccomp 〈ぁ〳〜〤〽〿なずゔぎ〠『぀〔〶〠〜 ぀〈〝ʢてとふわぢが゚ʣぇߜ぀〕々〕〘〔 • ぢアふべ಺〣ゆ゜なと〜てとふわぢが゚⿿ݺ〥ぁ〔〈〝ぇぢアふべろぼがでをが〤 ஌぀〈〝⿿〜 〟⿶ • てとふわぢが゚〣࣮ߦぇڐՄ『぀⿾ɺڋ൱『぀⿾「⿾ઃఆ〜 〟⿶ • ੒ޭ「〔〽⿸〠ݟ【぀〈〝〤〜 ぀⿿ɺ࣮ࡍ〠ڋ൱「〔てとふわぢが゚⿿࣮ߦ《ぁ぀

    〈〝〤〟⿶ ˠ「⿾「ɺてとふわぢが゚〣࣮ߦぇݕ஌「ɺ࣮ߦ〣Մ൱ぇ൑அ『぀〣〜ɺલड़〣໰୊ぇ ղܾ『぀〣〠Ұ൪ۙ⿶ػೳ〜⿴぀〈〝〠〤ҧ⿶⿿〟⿶ 17/25
  24. seccomp notify • seccomp 〜ݕ஌《ぁ〔てとふわぢが゚〣࣮ߦぇ • ゕがづがとらがと〣ゆ゜そ゘わʢex. ぢアふべろぼがでをがʣ〠௨஌「ɺ࣮ߦ〣Մ ൱ぇ൑அ「〛〷〾⿸ •

    ௨஌ぇड々〔ゆ゜そ゘わ〤ɺ࣮ߦ〣Մ൱ぇ൑அ「ɺじがぼ゚〠࣮ߦ〣Մ൱ぇฦ『 • じがぼ゚ʢseccompʣ〤〒〣൑அ〠ै〘〛ॲཧぇߦ⿸ʢてとふわぢが゚ぇ࣮ߦ『 ぀ or ڋ൱『぀ʣ seccomp notify ػೳ〜ɺなずゔ゙ふくぇ֬อ「〙〙ɺぶやさ゚ぷ〜〤࣮ߦ〜 〟⿶て とふわぢが゚ぇ࣮ߦ〜 ぀〽⿸〠〟〘〔 18/25
  25. seccomp notify ぇ࢖⿸〠〤 • ぢアふべろぼがでをが⿿ぢアふべ಺〜 ࣮ߦ『぀ゆ゜なと〠れ゙てが〝Ұॹ〠 〈〣ػೳぇ࢖⿸や゘そぇઃఆ『぀ • やく゚のが⿿゜がへ《ぁ぀〝やきぐ゚ ぶくとぜ゙ゆのʢfdʣ⿿ฦ《ぁ぀

    • 〈〣 fd ぇぢアふべろぼがでをが〜؂ ࢹ『぀ 19/25
  26. seccomp notify ぇ࢖〘〔てとふわぢが゚〣࣮ߦ 1. てとふわぢが゚ݺ〨ग़「 2. ݺ〨ग़「〤ゅ゜ひぜ《ぁɺݺ〨ग़ 《ぁ〔てとふわぢが゚〣৘ใɺゆ ゜なと〣৘ใ〟〞⿿ fd

    〠ૹ〾ぁ぀ 3. ぢアふべろぼがでをが〜ඞཁ〟ݕ ࠪぇߦ⿶ɺ࣮ߦڐՄɺڋ൱ぇฦ『 4. ぢアふべろぼがでをが⿾〾ฦ《ぁ 〔݁Ռ〠Ԡ」〛じがぼ゚ ʢseccompʣ⿿࣮ߦぇڐՄɺڋ൱ 『぀ ʢ〈〣〽⿸〟ॲཧ⿿〜 ぀〽⿸〠〟〘〔〣〤 5.5 じがぼ゚⿾〾ʣ 20/25
  27. LXC/LXD 〜〣࣮૷

  28. seccomp notify ぇ࢖⿸〠〤 • libseccomp 2.5.0ʙ • LXC 3.2.1ʙ •

    LXDʢݱࡏ 4.13ʣ: • 3.13: ॳظ࣮૷ʢmknod つれがぷʣˠぶみぐとやきぐ゚࡞੒ • 3.14: mknodat つれがぷˠぶみぐとやきぐ゚࡞੒ • 3.16: setxattr つれがぷ • 3.19: mount つれがぷ • 4.5: bpf つれがぷˠ device cgroupʢcgroup2ʣ 21/25
  29. ʢぶゑʣぶみぐとやきぐ゚〣࡞੒ʢmknodʣ 1. ぢアふべʢUbuntu 20.04ʣ࡞੒ 2. Ұൠゕがづがݖݶ〜ಈ࡞「〛⿶぀〈〝ぇ֬ೝ 3. ぢアふべ಺〜 mknod ぇ࣮ߦʢࣦഊʣ

    4. ぢアふべ〠ର「〛ぶみぐとやきぐ゚〣࡞੒ぇڐՄ『぀ઃఆぇߦ⿸ 5. ぢアふべ࠶ىಈޙ mknod ࣮ߦʢ੒ޭ『぀〤』ʂʣ https://asciinema.org/a/407687 22/25
  30. ʢぶゑʣろげアぷ 1. /dev/sdb1 ぇぢアふべ಺〠 bind mount 2. ぢアふべ಺〣/dev/sdb1 ぇ֬ೝ 3.

    ぢアふべ಺〜 mount ぇ࣮ߦʢࣦഊʣ 4. ぢアふべ಺〜 ext4 ⿿ろげアぷ〜 ぀ઃఆぇ௥Ճʢ/dev/sdb1 〤 ext4 〜やきぐ゚ てとふわ࡞੒ࡁʣ 5. ぢアふべ಺〜 mount ぇ࣮ߦʢ੒ޭ『぀〤』ʂʣ https://asciinema.org/a/407702 23/25
  31. 〳〝〶

  32. 〳〝〶 • User Namespace ಺〣 root ゕがづが⿿ݺ〨ग़「〛〷ࣦഊ『぀てとふわぢが゚⿿ ⿴〘〔 • ぢアふべろぼがでをが〹؅ཧऀ〤ぢアふべ〣࢖いぁํぇྑ。஌〘〛⿶぀ʢՄೳੑ⿿

    ⿴぀ʣ • 〈ぁ〳〜〤なずゔ゙ふく޲্〣〔〶〠ػೳぇߜΔํ޲〠࢖いぁ〛 〔 seccomp ぇ࢖⿶ɺ࣮ߦՄ൱〣൑அぇゕがづがとらがと〠ҕ〢ɺېࢭ《ぁ〛⿶〔ॲཧぇ User Namespace ಺〜࣮ߦ〜 ぀〽⿸〠「〔〣⿿ Seccomp notify ػೳ ඇಛݖぢアふべ〜࣮ߦ〜 ぀ॲཧ⿿޿⿿〿ɺ҆શ〠ぢアふべぇ࣮ߦ〜 ぀Մೳੑ⿿޿ ⿿〘〔ɻ 24/25
  33. Ҏ্ ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ 25/25