สิทธิ์ลินุกซ์ทำงานอย่างไรเมื่อกระบวนการทำงานเป็นกลุ่มเฉพาะ


12

นี่คือสิ่งที่ฉันไม่สามารถหาข้อมูลได้มากนักเพื่อช่วยในการชื่นชม

ความเข้าใจของฉันจึง ใช้ไฟล์ต่อไปนี้:

-rw-r-----  1 root        adm   69524 May 21 17:31 debug.1

ผู้ใช้philไม่สามารถเข้าถึงไฟล์นี้:

phil@server:/var/log$ head -n 1 debug.1
cat: debug.1: Permission denied

หากphilถูกเพิ่มลงในadmกลุ่มสามารถ:

root@server:~# adduser phil adm
Adding user `phil' to group `adm' ...
Adding user phil to group adm
Done.
phil@server:/var/log$ head -n 1 debug.1
May 21 11:23:15 server kernel: [    0.000000] DMI: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.7.5.1-0-g8936dbb-20141113_115728-nilsson.home.kraxel.org 04/01/2014

อย่างไรก็ตามหากกระบวนการเริ่มต้นในขณะที่ตั้งค่าไว้อย่างชัดเจนuser:groupจะphil:philไม่สามารถอ่านไฟล์ได้ กระบวนการเริ่มต้นเช่นนี้:

nice -n 19 chroot --userspec phil:phil / sh -c "process"

หากกระบวนการนั้นเริ่มต้นขึ้นphil:admก็สามารถอ่านไฟล์ได้:

nice -n 19 chroot --userspec phil:adm / sh -c "process"

ดังนั้นคำถามคือ:

มีอะไรพิเศษเกี่ยวกับการเรียกใช้กระบวนการด้วยคำสั่งผสมของผู้ใช้ / กลุ่มที่ป้องกันไม่ให้กระบวนการสามารถเข้าถึงไฟล์ที่กลุ่มเสริมของผู้ใช้นั้นเป็นเจ้าของและมีวิธีแก้ไขปัญหานี้หรือไม่?


สังเกตว่าเชลล์ไม่มีส่วนเกี่ยวข้องกับมัน: สิทธิ์จะไม่ถูกประมวลผลโดยเชลล์ หากพวกเขาที่คุณสามารถได้รับรูตโดยการเขียนเปลือกใหม่
ctrl-alt-delor

คำตอบ:


9

กระบวนการทำงานด้วย uid ang a gid ทั้งสองมีสิทธิ์ที่ได้รับมอบหมาย คุณสามารถโทร chroot ด้วย userspec ของผู้ใช้และกลุ่มโดยที่ผู้ใช้ไม่ได้อยู่ในกลุ่มนั้น กระบวนการจะดำเนินการกับผู้ใช้ uid และกลุ่มที่กำหนด gid

ดูตัวอย่าง ฉันมีผู้ใช้ชื่อuserและเขาอยู่ในกลุ่มstudent:

root@host:~$ id user
uid=10298(user) gid=20002(student) groups=20002(student)

ฉันมีไฟล์ดังนี้:

root@host:~$ ls -l file
-rw-r----- 1 root root 9 Mai 29 13:39 file

เขาอ่านมันไม่ได้:

user@host:~$ cat file
cat: file: Permission denied 

ตอนนี้ผมสามารถ execte catกระบวนการในบริบทของผู้ใช้และกลุ่มuser rootตอนนี้กระบวนการ cat มีสิทธิ์ที่จำเป็น:

root@host:~$ chroot --userspec user:root / sh -c "cat file"
file contents

มันน่าสนใจที่จะเห็นสิ่งที่idพูดว่า:

root@host:~$ chroot --userspec user:root / sh -c "id"
uid=10298(user) gid=0(root) groups=20002(student),0(root)

อืม แต่ผู้ใช้userไม่ได้อยู่ในกลุ่มนั้น ( root) ในกรณีที่ไม่idได้รับข้อมูลจาก? ถ้าเรียกโดยไม่มีอาร์กิวเมนต์idใช้ระบบโทรศัพท์getuid(), และgetgid() getgroups()ดังนั้นบริบทกระบวนการของidตัวเองจะถูกพิมพ์ --userspecบริบทที่เรามีการเปลี่ยนแปลงด้วย

เมื่อเรียกด้วยอาร์กิวเมนต์idเพียงกำหนดกลุ่มที่ได้รับมอบหมายของผู้ใช้:

root@host:~$ chroot --userspec user:root / sh -c "id user"
uid=10298(user) gid=20002(student) groups=20002(student)

สำหรับคำถามของคุณ:

มีอะไรพิเศษเกี่ยวกับการเรียกใช้กระบวนการด้วยคำสั่งผสมของผู้ใช้ / กลุ่มที่ป้องกันไม่ให้กระบวนการสามารถเข้าถึงไฟล์ที่กลุ่มเสริมของผู้ใช้นั้นเป็นเจ้าของและมีวิธีแก้ไขปัญหานี้หรือไม่?

คุณสามารถตั้งค่าบริบทกระบวนการรักษาความปลอดภัยที่จำเป็นในการแก้ไขงานใด ๆ ที่กระบวนการต้องทำ ทุกขั้นตอนจะมีชุด uid และ gid ซึ่งเขาใช้งานอยู่ โดยปกติกระบวนการ "ใช้" ผู้ใช้ที่เรียก uid และ gid เป็นบริบทของเขา ด้วย "ใช้" ฉันหมายถึงเคอร์เนลทำมิฉะนั้นมันจะเป็นปัญหาด้านความปลอดภัย

ดังนั้นจริงๆแล้วมันไม่ใช่ผู้ใช้ที่ไม่มีสิทธิ์ในการอ่านไฟล์ แต่เป็นสิทธิ์ของกระบวนการ ( cat) แต่กระบวนการทำงานด้วย uid / gid ของผู้ใช้ที่เรียก

ดังนั้นคุณไม่จำเป็นต้องอยู่ในกลุ่มใดกลุ่มหนึ่งเพื่อให้กระบวนการทำงานด้วย uid และ gid ของกลุ่มนั้น


2
โดยปกติกระบวนการมีเพียงข้อมูลรับรองของกลุ่มหลักเท่านั้น มันสามารถได้รับ acess การข้อมูลประจำตัวของกลุ่มรองเป็นส่วนหนึ่งของโดยการโทรEUID initgroups(3)อย่างไรก็ตามinitgroups(3)เป็นการดำเนินการที่ค่อนข้างแพงเนื่องจากจำเป็นต้องระบุทุกกลุ่ม ด้วยเหตุผลนี้การประมวลผลจะเรียกinitgroups(3)ก็ต่อเมื่อพวกเขามีเหตุผลเฉพาะที่จะทำ
lcd047

6

โดยใช้--userspecตัวเลือกในการระบุผู้ใช้และกลุ่มเดียวที่จะใช้เมื่อเรียกใช้chroot chrootในการกำหนดกลุ่มเสริมคุณต้องใช้--groupsตัวเลือกเช่นกัน

โดยค่าเริ่มต้นกระบวนการสืบทอดกลุ่มหลักและกลุ่มเสริมของผู้ใช้ที่เรียกใช้พวกเขา แต่โดยใช้--userspecคุณกำลังบอกchmodให้แทนที่โดยใช้กลุ่มเดียวที่ระบุ

เอกสารรายละเอียดของการอนุญาตใน Linux มีอยู่ในcredentials(7)manpage


2

เมื่อคุณเข้าสู่ระบบ Linux, process¹เข้าสู่ระบบหลังการตรวจสอบคุณสามารถเข้าสู่ระบบเป็นฟิล - ได้รับการโพสต์ของฟิลและกลุ่มที่อยู่ในการตั้งค่าเหล่านั้นเป็นกระบวนการที่จะเริ่มต้นแล้วเป็นเปลือกของคุณ กลุ่ม uid, gid และกลุ่มเสริมเป็นคุณสมบัติของกระบวนการ

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

* ยกเว้นเป็นโปรแกรมที่มี setuid หรือ setgid บิตจะถูกตั้งค่าซึ่งจะมีความแตกต่างกันรหัสผู้ใช้ที่มีประสิทธิภาพ นี้จะใช้เช่นในsu (1)เพื่อที่จะสามารถทำงานกับสิทธิพิเศษแม้ในขณะที่ดำเนินการโดยrootphil

หลังจากที่คุณเพิ่มphilในadmกลุ่มเขาสามารถเรียกใช้su philและsuจะทำงานเป็นรูท - ยืนยันว่าเขาให้รหัสผ่านของฟิลและจากนั้นให้เขาเข้าไปในเชลล์ด้วยกลุ่มโพสต์, gid, gid และภาคเสริม และเช่นนี้จะทำหลังจากเพิ่มผู้ใช้ไปยังกลุ่มเชลล์นั้นจะอยู่ในadmกลุ่มแล้ว

ฉันไม่คิดว่า chroot (1) โปรแกรมที่เหมาะสมที่สุดสำหรับการทำงานในฐานะผู้ใช้ที่แตกต่างกันแต่มันก็ทำให้งานสำเร็จได้ พารามิเตอร์ที่--userspec phil:philทำให้มันทำงานด้วย UID ของphilและ GID philของ ไม่มีการตั้งค่ากลุ่มเพิ่มเติม (สำหรับสิ่งที่คุณต้องการให้--groups) ดังนั้นกระบวนการลูกไม่ได้อยู่ในadmกลุ่ม

su phil -c "process"วิธีปกติมากขึ้นสำหรับการใช้กระบวนการของคุณเป็นฟิลจะเป็น ในขณะที่suโหลด uid, gid และกลุ่มเพิ่มเติมจากข้อมูลฐานข้อมูลผู้ใช้processจะมีข้อมูลรับรองเดียวกันกับที่ผู้ใช้ปัจจุบันมีอยู่

¹นี่อาจเป็นข้อมูลเข้าสู่ระบบ (1) , sshd, su, gdb หรือโปรแกรมอื่น ๆ นอกจากนี้ยังมีการจัดการผ่านโมดูล pam

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