ฉันจะเปลี่ยน lsof ภายใน Docker ได้อย่างไร (เป็นภาษาท้องถิ่นไม่ใช่ LXC)


16

ฉันค่อนข้างงุนงงว่าภายในคอนเทนเนอร์ Docker lsof -iไม่ได้ให้ผลลัพธ์ใด ๆ

ตัวอย่าง (คำสั่ง / เอาต์พุตทั้งหมดจากภายในคอนเทนเนอร์):

[1] root@ec016481cf5f:/# lsof -i
[1] root@ec016481cf5f:/# netstat -tulpn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -
tcp6       0      0 :::22                   :::*                    LISTEN      -

โปรดทราบว่าไม่มี PID netstatหรือโปรแกรมชื่อแสดงโดยfuserยังให้ผลลัพธ์ที่ค่อนข้างสับสนและไม่สามารถระบุ PID ได้เช่นกัน

ใครสามารถทำให้กระจ่างเกี่ยวกับเรื่องนี้?

  • ฉันจะแทนที่lsof -i(เพื่อดูชื่อกระบวนการได้เช่นกัน!)
  • ทำไมผลผลิตของnetstatคนพิการถึงตายเช่นกัน?

NB:คอนเทนเนอร์ทำงานด้วย"ExecDriver": "native-0.1"นั่นคือเลเยอร์การดำเนินการของ Docker ไม่ใช่ LXC


[1] root@ec016481cf5f:/# fuser -a4n tcp 22
Cannot stat file /proc/1/fd/0: Permission denied
Cannot stat file /proc/1/fd/1: Permission denied
Cannot stat file /proc/1/fd/2: Permission denied
Cannot stat file /proc/1/fd/3: Permission denied
Cannot stat file /proc/1/fd/255: Permission denied
Cannot stat file /proc/6377/fd/0: Permission denied
Cannot stat file /proc/6377/fd/1: Permission denied
Cannot stat file /proc/6377/fd/2: Permission denied
Cannot stat file /proc/6377/fd/3: Permission denied
Cannot stat file /proc/6377/fd/4: Permission denied
22/tcp:

(ฉันไม่ได้ถูกครอบงำด้วยPermission deniedเพราะตัวเลขนั้นสิ่งที่ทำให้ฉันสับสนคือรายการว่างเปล่าของ PID หลังจาก22/tcpนั้น)


# lsof|awk '$1 ~ /^sshd/ && $3 ~ /root/ {print}'
sshd    6377      root  cwd   unknown                        /proc/6377/cwd (readlink: Permission denied)
sshd    6377      root  rtd   unknown                        /proc/6377/root (readlink: Permission denied)
sshd    6377      root  txt   unknown                        /proc/6377/exe (readlink: Permission denied)
sshd    6377      root    0   unknown                        /proc/6377/fd/0 (readlink: Permission denied)
sshd    6377      root    1   unknown                        /proc/6377/fd/1 (readlink: Permission denied)
sshd    6377      root    2   unknown                        /proc/6377/fd/2 (readlink: Permission denied)
sshd    6377      root    3   unknown                        /proc/6377/fd/3 (readlink: Permission denied)
sshd    6377      root    4   unknown                        /proc/6377/fd/4 (readlink: Permission denied)
sshd    6442      root  cwd   unknown                        /proc/6442/cwd (readlink: Permission denied)
sshd    6442      root  rtd   unknown                        /proc/6442/root (readlink: Permission denied)
sshd    6442      root  txt   unknown                        /proc/6442/exe (readlink: Permission denied)
sshd    6442      root    0   unknown                        /proc/6442/fd/0 (readlink: Permission denied)
sshd    6442      root    1   unknown                        /proc/6442/fd/1 (readlink: Permission denied)
sshd    6442      root    2   unknown                        /proc/6442/fd/2 (readlink: Permission denied)
sshd    6442      root    3   unknown                        /proc/6442/fd/3 (readlink: Permission denied)
sshd    6442      root    4   unknown                        /proc/6442/fd/4 (readlink: Permission denied)
sshd    6442      root    5   unknown                        /proc/6442/fd/5 (readlink: Permission denied)

มีเอาต์พุตเพิ่มเติมสำหรับผู้ใช้ที่เชื่อมต่อซึ่งระบุได้อย่างถูกต้องเช่นกัน เห็นได้ชัดว่าเป็นไปไม่ได้ที่จะแยกแยะประเภท ( lsof -iจำกัด ซ็อกเก็ตอินเทอร์เน็ต) ว่า "วัตถุ" บางอย่าง


อะไรไม่ได้lsofรายงาน? เหมือน?
slm

@slm: สอบถามรายละเอียดเพิ่มเติมที่ยอดเยี่ยม! มันไม่ได้ทำให้มันว่างเปล่า แต่จะแสดงโฮสต์ทั้งหมดของsshdบรรทัด( ที่เกี่ยวข้องด้วย) บางอันอาจเป็นซ็อกเก็ต TCP TYPE unknownแทน แปลก ต่อท้ายผลลัพธ์กับคำถามของฉัน
0xC0000022L

หากคุณเรียกใช้strace -s 2000 -o lsof.log lsof -iอาจมีข้อมูลเชิงลึกเพิ่มเติมเกี่ยวกับสิ่งที่ถูกบล็อก
slm

1
@slm: จุดดี ขอบคุณที่เตือนฉัน. ฉันจะทำสิ่งนี้ในวันพรุ่งนี้ นอกจากนี้ยังเป็นไปได้ว่าstraceตัวเองถูก จำกัด ในภาชนะ สิ่งใหม่ที่น่าตื่นเต้นที่จะเรียนรู้ ขอบคุณสำหรับความคิดที่ตีกลับ ต้องตีเตียงแม้ว่า
0xC0000022L

FYI: สิ่งนี้จะทำลาย netstat -lp มันมีสาเหตุมาจาก apparmor
Alan Robertson

คำตอบ:


7

(หมายเหตุ: มันยังไม่ชัดเจนในคำถามที่ถามว่ากำลังเข้าสู่ภาชนะนักเทียบท่าฉัน. สมมติว่า docker exec -it CONTAINER bashถูกนำมาใช้.)

ฉันมีปัญหานี้เมื่อใช้อิมเมจของนักเทียบท่าตามcentos:7เวอร์ชันของนักเทียบท่า1.9.0และเพื่อเอาชนะสิ่งนี้ฉันเพิ่งวิ่ง:

docker exec --privileged -it CONTAINER bash

--privilegedหมายเหตุรวมของ

ความเข้าใจที่ไร้เดียงสาของฉันด้วยเหตุนี้จะต้อง: ดูเหมือนว่านักเทียบท่าที่ทำให้ความพยายามที่จะมีภาชนะที่มีมากขึ้น "เชื่อถือได้" ขณะที่เอกสารที่นี่


4

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

Jun 12 01:29:46 hostmachine kernel: [140235.718807] audit_printk_skb: 183 callbacks suppressed
Jun 12 01:29:46 hostmachine kernel: [140235.718810] type=1400 audit(1402536586.521:477): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="trace" denied_mask="trace" peer="docker-default"
Jun 12 01:29:46 hostmachine kernel: [140235.718860] type=1400 audit(1402536586.521:478): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="read" denied_mask="read" peer="docker-default"
Jun 12 01:29:46 hostmachine kernel: [140235.718886] type=1400 audit(1402536586.521:479): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="read" denied_mask="read" peer="docker-default"
Jun 12 01:29:46 hostmachine kernel: [140235.718899] type=1400 audit(1402536586.521:480): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="read" denied_mask="read" peer="docker-default"
Jun 12 01:29:46 hostmachine kernel: [140235.718921] type=1400 audit(1402536586.521:481): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="read" denied_mask="read" peer="docker-default"
Jun 12 01:29:46 hostmachine kernel: [140235.718954] type=1400 audit(1402536586.521:482): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="read" denied_mask="read" peer="docker-default"
Jun 12 01:29:46 hostmachine kernel: [140235.719001] type=1400 audit(1402536586.521:483): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="read" denied_mask="read" peer="docker-default"
Jun 12 01:29:46 hostmachine kernel: [140235.719043] type=1400 audit(1402536586.521:484): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="read" denied_mask="read" peer="docker-default"
Jun 12 01:29:46 hostmachine kernel: [140235.719086] type=1400 audit(1402536586.521:485): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="read" denied_mask="read" peer="docker-default"
Jun 12 01:29:46 hostmachine kernel: [140235.719126] type=1400 audit(1402536586.521:486): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="read" denied_mask="read" peer="docker-default"

ดังนั้นผู้อุปมาจึงดูเหมือนจะเป็นผู้ร้ายแม้ว่าฉันจะต้องหาวิธีที่จะโน้มน้าวให้ยอมทำเช่นนี้โดยไม่ส่งผลต่อความปลอดภัยของโฮสต์ / คอนเทนเนอร์หรือเพื่อดูว่าเป็นไปได้หรือไม่



3

ความเป็นไปได้อีกอย่างในเวลานี้ด้วยการตั้งค่าความปลอดภัยที่ละเอียดยิ่งขึ้น: มอบสิทธิ์ SYS_PTRACE ให้กับคอนเทนเนอร์นักเทียบท่า:

docker run --cap-add=SYS_PTRACE ...

1
ในกรณีที่ทุกคนสงสัยว่าทำไมlsofความต้องการCAP_SYS_PTRACE: /proc/*/statมันต้องอ่าน ดูptrace (2)
David Röthlisberger

2

ฉันก็พบปัญหานี้เช่นกัน ปัญหาที่เกิดขึ้นได้หายไปหลังจากที่ฉันปิดการใช้งานapparmorได้ที่docker:

$ sudo aa-complain <docker apparmor profile name, "docker-default" on ubuntu>

URL อ้างอิง: https://help.ubuntu.com/community/AppArmor


3
คุณอาจต้องการพิจารณาเพิ่มคำอธิบายเพิ่มเติมสำหรับคำตอบนี้ (เช่นอะไรaa-complainหรือเอกสารบางอย่างที่รองรับการแก้ปัญหานี้)
HalosGhost

@ HalosGhost ขออภัยฉันไม่คุ้นเคยกับapparmorฉันเพิ่ง googled และพบวิธีปิดการใช้งาน พูดอีกอย่างคือฉันไม่รู้ว่าทำไมมันถึงได้ผลหรือทำไมมันถึงไม่ทำงาน OS โฮสต์ของฉันคือ Ubuntu 14.04 ดังนั้นฉันค้นหา "อูบุนตู AppArmor" และพบhelp.ubuntu.com/community/AppArmor ฉันหวังว่านี่จะเป็นประโยชน์สำหรับคุณ
menghan

2
ฉันไม่มีปัญหานี้ ความกังวลของฉันคือคุณภาพของคำตอบของคุณและประโยชน์ (และข้อมูล) ที่เป็นประโยชน์สำหรับ OP
HalosGhost

@ HalosGhost ขอบคุณสำหรับความช่วยเหลือของคุณฉัน reedit คำตอบของฉัน
menghan

บน Ubuntu 14.04 sudo aa-complain /etc/apparmor.d/dockerเป็นคำสั่ง โดยทั่วไปจะปิดการใช้งานเกราะของแอพสำหรับกระบวนการนักเทียบท่าซึ่งหมายความว่านักเทียบท่าสามารถอ่านไฟล์ใด ๆ ในระบบ ก่อนหน้านี้สามารถทำงานกับไฟล์ที่ได้รับอนุญาตในโปรไฟล์เท่านั้น ทางออกที่ดีกว่าอาจเปลี่ยนกฎชุดเกราะของแอปที่อนุญาตให้เข้าถึงไฟล์ / proc / pid / fd
Martins Balodis
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.