วิธีที่เชื่อถือได้สำหรับกระบวนการเด็กในคุกโดยใช้ 'nsenter:'


15

ฉันรู้ว่า namespaces ลินุกซ์ในหมู่สิ่งอื่น ๆ อีกมากมายสามารถ leveraged ที่จะจัดการกับการ จำกัด และงูกระบวนการที่เด็กได้อย่างปลอดภัยโดยไม่ต้องมีโอกาสของพวกเขาใด ๆ ถูก zombied initและทิ้งบน แต่ฉันไม่ชัดเจนในรายละเอียดการใช้งาน ฉันจะใช้เครื่องมือที่จัดเตรียมโดยutil-linuxเช่นmountและnsenterเพื่อดูตรวจสอบและตรวจสอบให้แน่ใจว่ากระบวนการทั้งหมดที่เปิดใช้เป็นลูกหลานของเนมสเปซโดยตรงของกระบวนการอื่นได้อย่างไร

คำตอบ:


19

สร้างเนมสเปซ PID

unshareคำสั่งที่ถูกต้องในการใช้ที่นี่เป็น util-linux 2.23โปรดทราบว่าตัวเลือกที่จำเป็นในการทำเช่นนี้จะสามารถใช้ได้ตั้งแต่ แนวคิดคือการสร้างเนมสเปซ PIDใหม่สำหรับโปรแกรมที่คุณกำลังใช้งานซึ่งลูก ๆ ของมันทั้งหมดจะถูกสร้างในเนมสเปซนี้ด้วย คุณสามารถเรียกใช้คำสั่งในเนมสเปซ PID ใหม่ได้ง่ายๆโดยทำดังนี้

sudo unshare -fp some_command

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

การทำเช่นนี้อาจเพียงพอสำหรับกรณีการตรวจสอบส่วนใหญ่ ดังที่กล่าวไปแล้วกระบวนการภายในเนมสเปซทั้งหมดมี PID ภายในเนมสเปซหลักเพื่อให้สามารถใช้คำสั่งปกติเพื่อตรวจสอบกิจกรรมของตน นอกจากนี้เรายังมั่นใจได้ว่าหากกระบวนการใดในเนมสเปซกลายเป็นเด็กกำพร้าก็จะไม่หลุดออกมาจากกิ่งต้นไม้กระบวนการภายใต้ PID ของโปรแกรมระดับบนสุดซึ่งหมายความว่ามันยังสามารถติดตามได้อย่างง่ายดาย

รวมกับเมานต์เนมสเปซ

อย่างไรก็ตามสิ่งที่เราไม่สามารถทำได้คือตรวจสอบกระบวนการเกี่ยวกับ PID ที่คิดว่ามี เมื่อต้องการทำสิ่งนี้และโดยเฉพาะอย่างยิ่งเพื่อให้สามารถใช้psคำสั่งภายในเนมสเปซใหม่คุณจะต้องเมาท์procfsระบบไฟล์แยกต่างหากสำหรับเนมสเปซ นี้ในการเปิดนำไปสู่ปัญหาอื่นตั้งแต่สถานที่เดียวที่psยอมรับสำหรับการมีprocfs /procทางออกหนึ่งคือการสร้างchrootคุกและติดตั้งใหม่ที่procfsนั่น แต่นี่เป็นวิธีที่ยุ่งยากเพราะอย่างน้อยเราจะต้องคัดลอก (หรือฮาร์ดลิงก์อย่างน้อย) ไบนารีใด ๆ ที่เราตั้งใจจะใช้พร้อมกับไลบรารีใด ๆ ที่พวกเขาต้องพึ่งพารูทใหม่

การแก้ปัญหาคือยังใช้ใหม่ติด namespace ภายในนี้เราสามารถติดตั้งใหม่procfsในวิธีที่ใช้/procไดเรกทอรีรูทจริงสามารถใช้งานได้ในเนมสเปซ PID และไม่รบกวนสิ่งอื่นใด เพื่อทำให้กระบวนการนี้ง่ายมากunshareคำสั่งให้--mount-procตัวเลือก:

sudo unshare -fp --mount-proc some_command

ตอนนี้ทำงานpsภายใน namespaces รวมจะแสดงเฉพาะกระบวนการที่มี namspace PID และมันจะแสดงขั้นตอนการระดับบนสุดตามที่มี PID 1ของ

เกี่ยวกับnsenterอะไร

ตามชื่อที่แนะนำnsenterสามารถใช้เพื่อป้อนเนมสเปซที่สร้างขึ้นunshareแล้วได้ สิ่งนี้มีประโยชน์ถ้าเราต้องการรับข้อมูลจากใน namespace จากสคริปต์ที่ไม่เกี่ยวข้องเท่านั้น วิธีที่ง่ายที่สุดคือการเข้าถึงให้ PID ของโปรแกรมใด ๆ ที่ทำงานอยู่ใน namespace หากต้องการล้างข้อมูลนี้ต้องเป็น PID ของโปรแกรมเป้าหมายภายในเนมสเปซที่nsenterกำลังทำงานอยู่ (เนื่องจากเนมสเปซสามารถซ้อนกันได้จึงเป็นไปได้ที่กระบวนการเดียวจะมี PID จำนวนมาก) หากต้องการเรียกใช้เชลล์ในเนมสเปซ PID / mount เป้าหมายให้ทำดังนี้

sudo nsenter -t $PID -m -p

หากเนมสเปซนี้ตั้งค่าไว้ด้านบนpsตอนนี้จะแสดงรายการกระบวนการภายในเนมสเปซนั้นเท่านั้น


ขอบคุณแกรม สิ่งนี้ได้ตอบคำถามแล้วและอีกมากมาย สิ่งที่ทำให้ฉันถามคือการอ่านบันทึกย่อจากหน้า man procfs ในไฟล์ต่างๆใน / proc / pid / ns / * ซึ่งกล่าวว่า: "ผูกติดไฟล์นี้ (ดู mount (2)) ไปยังที่อื่นในระบบไฟล์ ... namespace ของกระบวนการที่ระบุโดย pid alive แม้ว่ากระบวนการทั้งหมดใน namespace จะสิ้นสุดลง " คำถามเดียวกันฉันรู้ แต่นี่เป็นเรื่องที่ดีมากฉันคิดว่าถ้าคุณรู้สึกว่ามันเกี่ยวข้องคุณอาจต้องการเพิ่มเข้าไปlinux.die.net/man/5/proc
mikeserv

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

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