Chrome ใต้ Docker: CAP_SYS_ADMIN กับสิทธิ์พิเศษหรือไม่ [ปิด]


11

ฉันกำลังเรียกใช้ chromedriver + chrome ภายใน Docker ในสภาพแวดล้อมการทดสอบของฉัน

ทุกอย่างทำงานได้ดีจนกระทั่ง CoreOS อัพเกรดล่าสุด

เหล่านี้เป็นรุ่นที่ดูเหมือนจะใช้งานได้:

VERSION=1185.5.0
VERSION_ID=1185.5.0
BUILD_ID=2016-12-07-0937

และนี่เป็นเวอร์ชั่นใหม่ที่ทำให้โครเมี่ยมเป็น Coredump:

VERSION=1235.4.0
VERSION_ID=1235.4.0
BUILD_ID=2017-01-04-0450

เมื่อดูการเปลี่ยนแปลงดูเหมือนว่านักเทียบท่าได้รับการอัปเกรดจาก 1.11.x เป็น 1.12.x ซึ่งทำให้การsetns()โทรภายในคอนเทนเนอร์เสียหาย setns()Chrome ใช้เพื่อสร้างเนมสเปซ

นี่คือตัวอย่างผลลัพธ์:

jsosic-coreos-test-20161207 ~ # docker --version
Docker version 1.11.2, build bac3bae

จากภายในคอนเทนเนอร์หนึ่งกล่องบนกล่องนี้:

[root@2939f21ecfaa /]# /opt/google/chrome/google-chrome
[57:57:0107/015130:ERROR:browser_main_loop.cc(261)] Gtk: cannot open display:

นี่คือวิธีที่รุ่นใหม่ทำลายมัน:

jsosic-coreos-test-2017-01-04 ~ # docker --version
Docker version 1.12.3, build 34a2ead

[root@13ab34c36c82 /]# /opt/google/chrome/chrome
Failed to move to new namespace: PID namespaces supported,
  Network namespace supported,
  but failed: errno = Operation not permitted
Aborted (core dumped)

สิ่งที่ฉันได้พบคือถ้าฉันเริ่มต้นคอนเทนเนอร์ด้วย--cap-add=SYS_ADMINหรือ--privileged- Chrome ทำงานตามที่คาดไว้

ความแตกต่างระหว่างสวิตช์ทั้งสองนั้นคืออะไร? ความสามารถในสิ่งที่มีการใช้งานโดย--privileged?

และฉันสามารถอนุญาตsetns()ภายในคอนเทนเนอร์โดยไม่ลดทอนความปลอดภัย


ขอบคุณสำหรับสิ่งนี้. ฉันทำปัญหาโดยใช้สิ่งต่าง ๆ มากมายของคุณ: github.com/docker/for-linux/issues/496ฉันคิดว่ามันควรจะแก้ไข
Merc

ฉันเกือบจะสายเกินไปแล้ว แต่ก็มีวิธีแก้ปัญหาที่ดีกว่าและปลอดภัยกว่าในตั๋วด้านบนหากคุณยังสนใจ
Merc

หากผู้โพสต์ดั้งเดิมไม่ได้อัปเดตคำตอบ (ดูเหมือนว่าเขาจะไม่ได้ทำงานใน SO เลย) โปรดแจ้งให้เราทราบหากคุณพร้อมที่จะรับคนอื่น ฉันเสียเวลาไปกับสิ่งนี้ฉันสามารถจินตนาการได้ว่าเราจะช่วยคนอื่นกี่ชั่วโมง
Merc

คำตอบ:


7

AFAICS เอกสารแนะนำการให้สิทธิ์ที่จำเป็นสำหรับคอนเทนเนอร์แทนที่จะใช้--privilegedสวิตช์ การทำงานในโหมดสิทธิพิเศษดูเหมือนว่าจะให้สิทธิ์ กับความสามารถทั้งหมดของคอนเทนเนอร์ (ซึ่งเป็นรายการที่อยู่ใน URL แรกโดยมีเงื่อนไขว่าเอกสารเป็นข้อมูลล่าสุด)

ในระยะสั้นฉันจะบอกว่า--cap-add=SYS_ADMINให้ความสามารถย่อยลงไปใน container เมื่อเทียบกับ--privilegedสวิตช์ เหตุการณ์ตัวอย่างในเอกสารนักเทียบท่า (URL แรก) ดูเหมือนจะต้องการเพียงแค่เพิ่มSYS_ADMINหรือNET_ADMINความสามารถตามที่ต้องการ


ขอบคุณexec_linux.goช่วย ฉันพยายามโคลนนักเทียบท่า repo เพื่อ grep ผ่าน แต่เนื่องจากฉันใช้เวลาสองสามชั่วโมงฉันเพิ่งลืมเรื่องนี้ :)
Jakov Sosic

เพียงเพื่อเรียกใช้ Chrome มีวิธีแก้ปัญหาที่ดีกว่าอยู่ที่นี่: github.com/docker/for-linux/issues/496#issuecomment-441149510ฉันคิดว่ามันจะมีประโยชน์มากในการอัปเดตคำตอบเพื่อให้ผู้คนทำสิ่งที่ฉันอธิบายใน ที่แสดงความคิดเห็นอย่างมาก โปรดแจ้งให้เราทราบหากคุณเห็นด้วย
Merc

1

สิ่งหนึ่งที่แตกต่างคือ - เมานต์แบบพิเศษ / dev และ / sys เป็น RW โดยที่ SYS_ADMIN จะเมานท์เป็น RO ซึ่งหมายความว่าคอนเทนเนอร์ที่มีสิทธิพิเศษสามารถเข้าถึงอุปกรณ์ในระบบได้อย่างสมบูรณ์ SYS_ADMIN ไม่ได้ให้คุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.