เป็นไปได้ไหมที่จะอนุญาตให้ผู้ใช้บางคน (เช่นสมาชิกของกลุ่ม) ติดตั้งระบบไฟล์ใด ๆโดยไม่ต้องใช้สิทธิ์ superuser บน Linux?
อาจมีคำถามอื่น "ในวิธีที่ผู้ใช้สามารถเป็นอันตรายต่อระบบโดยการติดตั้งระบบไฟล์?"
เป็นไปได้ไหมที่จะอนุญาตให้ผู้ใช้บางคน (เช่นสมาชิกของกลุ่ม) ติดตั้งระบบไฟล์ใด ๆโดยไม่ต้องใช้สิทธิ์ superuser บน Linux?
อาจมีคำถามอื่น "ในวิธีที่ผู้ใช้สามารถเป็นอันตรายต่อระบบโดยการติดตั้งระบบไฟล์?"
คำตอบ:
มีวิธีการอยู่สองสามวิธีบางวิธีส่วนใหญ่ปลอดภัยอื่น ๆ ไม่ได้เลย
ปล่อยให้การใช้งานใด ๆ ทำงานmount
เช่นผ่าน sudo คุณอาจให้รากแก่พวกเขาเช่นกัน มันเป็นสิ่งเดียวกัน ผู้ใช้สามารถติดตั้งระบบแฟ้มพร้อมสำเนาราก SUID ของbash
-running นั้นทันทีช่วยให้ราก (น่าจะได้โดยไม่ต้องเข้าสู่ระบบใด ๆ เกินกว่าความเป็นจริงที่mount
กำลังวิ่ง)
อีกวิธีหนึ่งคือผู้ใช้สามารถติดตั้งระบบแฟ้มของเขาเองที่ด้านบนของ/etc
บรรจุ / สำเนาของตัวเองของเธอ/etc/shadow
หรือ/etc/sudoers
แล้วขอรับรากด้วยหรือsu
sudo
หรืออาจจะเชื่อมโยง ( mount --bind
) ทับหนึ่งในสองไฟล์เหล่านั้น /etc/sudoers.d
หรือไฟล์ใหม่เข้าไป
การโจมตีที่คล้ายกันอาจถูกดึงออกไป/etc/pam.d
และที่อื่น ๆ อีกมากมาย
โปรดจำไว้ว่าระบบไฟล์ไม่จำเป็นต้องอยู่บนอุปกรณ์-o loop
จะทำการเมานต์ไฟล์ที่ผู้ใช้เป็นเจ้าของ (และแก้ไขได้)
สภาพแวดล้อมเดสก์ท็อปที่หลากหลายได้สร้างโซลูชันนี้ขึ้นจริงเพื่อให้ผู้ใช้เมานต์สื่อที่ถอดได้ สามารถทำงานได้โดยติดตั้งในไดเรกทอรีย่อย/media
เพียงและปิดการสนับสนุน set-user / group-id ผ่านตัวเลือกเคอร์เนล ตัวเลือกที่นี่รวมudisks
, udisks2
, pmount
, usbmount
,
หากคุณต้องการคุณสามารถเขียนสคริปต์ของคุณเองเพื่อทำสิ่งที่คล้ายกันและเรียกใช้ผ่าน sudo - แต่คุณต้องระวังอย่างยิ่งที่จะเขียนสคริปต์นี้เพื่อไม่ปล่อยให้ช่องโหว่ของ root หากคุณไม่ต้องการให้ผู้ใช้จำ sudo คุณสามารถทำสิ่งนี้ในสคริปต์:
#!/bin/bash
if [ $UID -ne 0 ]; then # or `id -u`
exec sudo -- "$0" "$@"
fi
# rest of script goes here
Linux เนมสเปซเป็นรูปแบบการจำลองเสมือนที่มีน้ำหนักเบามาก (บรรจุภัณฑ์เพื่อให้เฉพาะเจาะจงมากขึ้น) โดยเฉพาะอย่างยิ่งกับเนมสเปซผู้ใช้ผู้ใช้ใด ๆบนระบบสามารถสร้างสภาพแวดล้อมของตัวเองซึ่งเป็นรูท สิ่งนี้จะอนุญาตให้พวกเขาเมานต์ระบบไฟล์ยกเว้นว่าถูกบล็อกอย่างชัดเจนยกเว้นระบบไฟล์เสมือนสองสามตัว ในที่สุดระบบไฟล์ FUSE อาจได้รับอนุญาต แต่แพทช์ล่าสุดที่ฉันหาไม่ครอบคลุมอุปกรณ์บล็อกเท่านั้นที่จะมี sshfs เท่านั้น
นอกจากนี้เมล็ด Distro จำนวนมากยังมีค่าเริ่มต้น (เพื่อเหตุผลด้านความปลอดภัย) ที่ไม่อนุญาตให้ผู้ใช้ที่ไม่มีสิทธิพิเศษใช้ชื่อผู้ใช้ ตัวอย่างเช่นDebianมีkernel.unprivileged_userns_clone
ค่าเริ่มต้นที่ 0 distros อื่น ๆ ที่มีการตั้งค่าที่คล้ายกัน แต่มักจะมีชื่อแตกต่างกันเล็กน้อย
เอกสารที่ดีที่สุดที่ฉันรู้เกี่ยวกับ namespaces ใช้เป็นบทความ LWN Namespaces ในการดำเนินงานส่วนที่ 5: namespaces
สำหรับตอนนี้ฉันจะไปกับ udisks2
mount
สามารถเมานต์ระบบไฟล์ได้เช่นเดียวกับรูท ฉันจะอ่านเอกสารเนมสเปซที่คุณเชื่อมโยงและลองใช้สิ่งเมาท์กลุ่มนี้อย่างน้อยก็เป็นแบบฝึกหัด
mount
คำสั่งโดยพลการมันก็เหมือนกับการให้รูท
คุณสามารถทำได้ แต่คุณต้องแก้ไขรายการที่/etc/fstab
สอดคล้องกับระบบไฟล์ที่คุณต้องการติดตั้งเพิ่มธงuser
ในรายการนี้ ผู้ใช้ที่ไม่มีสิทธิ์จะสามารถเมาต์ได้
ดูman mount
รายละเอียดเพิ่มเติมได้ที่
vfs.usermount
) ฉันต้องการฏ คล้ายกับที่ ฉันใช้ไดรฟ์แบบถอดได้จำนวนมากที่มีหลายพาร์ติชั่นในแต่ละอันและมันจะยุ่งยากในการเพิ่มรายการหนึ่งหรือสองรายการเพื่อ fstab สำหรับแต่ละรายการ
udev
การจัดการรายการเป็นอุปกรณ์ใหม่ปรากฏขึ้นและหายไป
นี่คือวิกิสำหรับการกำหนดค่ากฎpolkitสำหรับudisks / udisks2เพื่อติดตั้งพาร์ติชันโดยกลุ่มที่ไม่ใช่รูท (เช่นผู้ใช้)
บันทึกรหัสด้านล่างเพื่อ/etc/polkit-1/rules.d/50-udisks.rules
polkit.addRule(function(action, subject) {
var YES = polkit.Result.YES;
var permission = {
// only required for udisks1:
"org.freedesktop.udisks.filesystem-mount": YES,
"org.freedesktop.udisks.filesystem-mount-system-internal": YES,
"org.freedesktop.udisks.luks-unlock": YES,
"org.freedesktop.udisks.drive-eject": YES,
"org.freedesktop.udisks.drive-detach": YES,
// only required for udisks2:
"org.freedesktop.udisks2.filesystem-mount": YES,
"org.freedesktop.udisks2.filesystem-mount-system": YES,
"org.freedesktop.udisks2.encrypted-unlock": YES,
"org.freedesktop.udisks2.eject-media": YES,
"org.freedesktop.udisks2.power-off-drive": YES,
// required for udisks2 if using udiskie from another seat (e.g. systemd):
"org.freedesktop.udisks2.filesystem-mount-other-seat": YES,
"org.freedesktop.udisks2.encrypted-unlock-other-seat": YES,
"org.freedesktop.udisks2.eject-media-other-seat": YES,
"org.freedesktop.udisks2.power-off-drive-other-seat": YES
};
if (subject.isInGroup("users")) {
return permission[action.id];
}
});
สมมติว่าคุณอยู่ในกลุ่ม "ผู้ใช้" โดยใช้คำสั่งต่อไปนี้เพื่อติดตั้งพาร์ติชัน (ไม่จำเป็นต้องใช้ sudo)
# udisks2
udisksctl mount --block-device /dev/sda1
# udisks
udisks --mount /dev/sda1
บน Xubuntu มันทำงานนอกกรอบเพื่อติดตั้งและดึงที่เก็บข้อมูล USB, พาร์ติชั่นฮาร์ดดิสก์, CD / DVD และอื่น ๆ อีกมากมาย
สมมติว่าโซลูชันของ Ubuntu เลือกใช้ policyKit นั้นมีความปลอดภัยเพียงพอ
บน XFCE บน Debian 8.3 ฉันต้องอนุญาตให้ผู้ใช้เมานต์และนำระบบไฟล์ออกจาก thunar โดยไม่ต้องใช้รหัสผ่าน สิ่งที่ใช้ได้ผลสำหรับฉันคือการเลือกไฟล์สิทธิ์จาก Ubuntu
การเพิ่มบรรทัดด้านล่างเป็นรูทไปยังไฟล์ที่มีชื่อ/var/lib/polkit-1/localauthority/10-vendor.d/com.ubuntu.desktop.pkla
ควรจะใช้เคล็ดลับ:
[Mounting, checking, etc. of internal drives]
Identity=unix-group:admin;unix-group:sudo
Action=org.freedesktop.udisks.filesystem-*;org.freedesktop.udisks.drive-ata-smart*;org.freedesktop.udisks2.filesystem-mount-system;org.freedesktop.udisks2.encrypted-unlock-system;org.freedesktop.udisks2.filesystem-fstab;
ResultActive=yes
(สิ่งที่ฉันทำจริง ๆ คือเลือกไฟล์จากชื่อเดียวกันบน Ubuntu 16.04 และมันใช้งานได้สำหรับฉันถ้าคุณต้องการมันส่วนใหญ่จะดูเหมือนเนื้อหาของhttps://gist.github.com/kafene/5b4aa4ebbd9229fa2e73 )
คุณสามารถกำหนดค่าsudo
เพื่ออนุญาตให้กลุ่มผู้ใช้เรียกใช้mount
คำสั่ง
อัปเดต : คุณจะสร้างความเสียหายให้กับระบบได้อย่างไรโดยการติดตั้ง? ตัวอย่างเช่นคุณสามารถสร้างรูทเชลล์ของ setuid บนระบบไฟล์ซึ่งคุณสามารถเมานต์และดำเนินการเพื่อรับสิทธิพิเศษรูท
sudo
ใช่ไหม นอกจากนี้ผู้ใช้รูทจะติดตั้งระบบไฟล์หลังฉากด้วยวิธีนี้หรือไม่
mount
ไปsudo mount
หรือใช้สคริปต์เสื้อคลุม
user
ไปยัง fstab ใช้งานได้เพียงเพราะmount
เป็น setuid root เคอร์เนลกำลังตรวจสอบหารูทหรือCAP_SYS_ADMIN
ความสามารถดังนั้นคุณจึงไม่สามารถเข้าไปเกี่ยวข้องกับรูตได้
เพื่อตอบคำถามของคุณในวงเล็บเนื่องจากระบบไฟล์เป็นตัวยึดสำหรับไฟล์ดังนั้นผู้ใช้สามารถดำเนินการที่เป็นอันตรายต่อระบบไฟล์นั้นเช่นลบไฟล์
สรุปคำถามอีก 2 ข้อฉันจะพูดแบบนี้:
fstab
เหมาะอย่างยิ่งสำหรับการติดตั้งที่เก็บข้อมูลถาวรในเวลาบูต มันไม่ค่อยดีนักเมื่อคุณต้องการเสียบไดรฟ์ usb หรือติดตั้งเครือข่ายบางครั้งแบ่งปัน
sudo mount
ก็ไม่เป็นไรถ้าคุณใช้ระบบ ubuntu * คุณจะต้องพิมพ์รหัสผ่านด้วยซ้ำ
udev
จะดูแลการติดตั้งสิ่งต่าง ๆ เช่น usb sticks, กล้องและแฟลชการ์ดในระบบ ubuntu * (แต่ไม่ได้อยู่ใน distros ที่เป็นมิตรกับผู้ใช้น้อยเช่น debian, slackware, ฯลฯ )
ฉันจะเพิ่มที่ในอดีตวิธี unix เพื่อให้สิทธิ์แก่ผู้ใช้บางคน (หรือกลุ่ม) ในการทำสิ่งต่าง ๆ คือผ่านsudoers
ไฟล์
มีคำแนะนำมากมายที่จะใช้งานได้ที่นั่นดังนั้นฉันจะไม่แนะนำเฉพาะใด ๆ ฉันจะบอกว่าฉันใช้เว็บไซต์โครงการเอกสารลินุกซ์เพื่อเรียนรู้เกี่ยวกับมัน
ยิ่งไปกว่าsudoers
นั้นคือคุณสามารถเชื่อมต่ออุปกรณ์และแบ่งปันได้อย่างโปร่งใสแม้จะไม่ได้ระบุรหัสผ่านหากคุณเลือกที่จะทำเช่นนั้น (ระมัดระวังเป็นพิเศษเกี่ยวกับเรื่องนั้น)
สิ่งที่ฉันมักจะทำในสภาพแวดล้อมการควบคุมคือฉันใช้sudoers
ไฟล์เพื่ออนุญาตให้ผู้ใช้บางกลุ่มเชื่อมต่อเครือข่ายอย่างโปร่งใส ดังนั้นฉันจึงเพิ่มคำสั่งmount.nfs
และmount.cifs
ในไฟล์ sudoers ที่อนุญาตการดำเนินการเช่น "เมานต์โฮมโฟลเดอร์ของผู้ใช้จากเซิร์ฟเวอร์ไฟล์เครือข่ายเมื่อผู้ใช้ล็อกออนเข้าสู่เทอร์มินัลไคลเอนต์" และ studd เช่นนั้น
autofs
ด้วยตนเองเพื่อเมานต์/home/$USER
จากไฟล์เซิร์ฟเวอร์ไปยังตำแหน่ง/home/$USER/fromFS/
บนไคลเอนต์พีซี
guestmount
กลอุบาย libguestfs
sudo apt-get install libguestfs-tools
# Workarounds for Ubuntu 18.04 bugs.
# https://serverfault.com/questions/246835/convert-directory-to-qemu-kvm-virtual-disk-image/916697#916697
sudo rm -rf /var/cache/.guestfs-*
echo dash | sudo tee /usr/lib/x86_64-linux-gnu/guestfs/supermin.d/zz-dash-packages
sudo chmod +r /boot/vmlinuz-*
# Create a test image.
mkdir sysroot
dd if=/dev/urandom of=sysroot/myfile bs=1024 count=1024
virt-make-fs --format=raw --type=ext2 sysroot sysroot.ext2
# Mount it, have fun, unmount!
mkdir -p mnt
# /dev/sda becuase we have a raw filesystem.
guestmount -a sysroot.ext2.qcow2 -m /dev/sda mnt
cmp sysroot/myfile mnt/myfile
guestunmount mnt
พึ่งพา:
เอกสาร: http://libguestfs.org/guestmount.1.html
ทดสอบกับ Ubuntu 18.04, libguestfs-tools 1: 1.36.13-1ubuntu3
gvfs-mount
-d /dev/sdX