จะอนุญาตให้ผู้ที่ไม่ใช่ผู้ใช้ขั้นสูงติดตั้งระบบไฟล์ได้อย่างไร


47

เป็นไปได้ไหมที่จะอนุญาตให้ผู้ใช้บางคน (เช่นสมาชิกของกลุ่ม) ติดตั้งระบบไฟล์ใด ๆโดยไม่ต้องใช้สิทธิ์ superuser บน Linux?

อาจมีคำถามอื่น "ในวิธีที่ผู้ใช้สามารถเป็นอันตรายต่อระบบโดยการติดตั้งระบบไฟล์?"


อาจจะgvfs-mount-d /dev/sdX
KrisWebDev

คำตอบ:


44

มีวิธีการอยู่สองสามวิธีบางวิธีส่วนใหญ่ปลอดภัยอื่น ๆ ไม่ได้เลย

วิธีที่ไม่ปลอดภัย

ปล่อยให้การใช้งานใด ๆ ทำงานmountเช่นผ่าน sudo คุณอาจให้รากแก่พวกเขาเช่นกัน มันเป็นสิ่งเดียวกัน ผู้ใช้สามารถติดตั้งระบบแฟ้มพร้อมสำเนาราก SUID ของbash-running นั้นทันทีช่วยให้ราก (น่าจะได้โดยไม่ต้องเข้าสู่ระบบใด ๆ เกินกว่าความเป็นจริงที่mountกำลังวิ่ง)

อีกวิธีหนึ่งคือผู้ใช้สามารถติดตั้งระบบแฟ้มของเขาเองที่ด้านบนของ/etcบรรจุ / สำเนาของตัวเองของเธอ/etc/shadowหรือ/etc/sudoersแล้วขอรับรากด้วยหรือsu sudoหรืออาจจะเชื่อมโยง ( mount --bind) ทับหนึ่งในสองไฟล์เหล่านั้น /etc/sudoers.dหรือไฟล์ใหม่เข้าไป

การโจมตีที่คล้ายกันอาจถูกดึงออกไป/etc/pam.dและที่อื่น ๆ อีกมากมาย

โปรดจำไว้ว่าระบบไฟล์ไม่จำเป็นต้องอยู่บนอุปกรณ์-o loopจะทำการเมานต์ไฟล์ที่ผู้ใช้เป็นเจ้าของ (และแก้ไขได้)

วิธีที่ปลอดภัยที่สุด: udisks หรือคล้ายกัน

สภาพแวดล้อมเดสก์ท็อปที่หลากหลายได้สร้างโซลูชันนี้ขึ้นจริงเพื่อให้ผู้ใช้เมานต์สื่อที่ถอดได้ สามารถทำงานได้โดยติดตั้งในไดเรกทอรีย่อย/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


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

@ gkya ฉันหวังว่าส่วนแรกของฉันทำให้ชัดเจนว่าการอนุญาตให้ (a) การติดตั้งระบบไฟล์โดยไม่บังคับ nosuid [และยัง nodev]; หรือ (b) ที่ตำแหน่งโดยพลการนั้นทำให้เกิดรูต หากคุณให้สิทธิ์แก่ใครบางคนในการรันmountคำสั่งโดยพลการมันก็เหมือนกับการให้รูท
Derobert

@gkya จาก "ไดรฟ์แบบถอดได้จำนวนมากที่มีหลายพาร์ติชันในแต่ละความคิดเห็น" ในคำตอบอื่นฉันเดาว่าคุณต้องการวิธี "udisks หรือคล้ายกัน"
Derobert

1
@derobert เนื่องจากคุณกำลังพูดถึงเนมสเปซของผู้ใช้คุณอาจต้องการตรวจสอบแผน 9 จาก Bell Labs (เป็นตัวตายตัวแทนของ UNIX ที่ทำโดยคนเดียวกัน) มันจำลองทรีไฟล์เป็นเนมสเปซต่อกระบวนการ (และไม่มีสิ่งใดที่เป็นรูท) สิ่งที่น่าสนใจ
strugee

1
@malan ตกลงฉันได้ทำการปรับปรุงแล้ว หากมีสิ่งใดฉันคิดว่าการใช้เนมสเปซของผู้ใช้สำหรับสิ่งนี้ดูเหมือนจะยิ่งเพิ่มขึ้นในอนาคต
Derobert

16

คุณสามารถทำได้ แต่คุณต้องแก้ไขรายการที่/etc/fstabสอดคล้องกับระบบไฟล์ที่คุณต้องการติดตั้งเพิ่มธงuserในรายการนี้ ผู้ใช้ที่ไม่มีสิทธิ์จะสามารถเมาต์ได้

ดูman mountรายละเอียดเพิ่มเติมได้ที่


1
นี่เป็นคำตอบเดียวที่ฉันสามารถหาได้จาก googling ฉันพบว่าใน FreeBSD เราสามารถอนุญาตให้ผู้ใช้เมานต์ระบบไฟล์ด้วยการตั้งค่าตัวแปร (เช่นvfs.usermount) ฉันต้องการฏ คล้ายกับที่ ฉันใช้ไดรฟ์แบบถอดได้จำนวนมากที่มีหลายพาร์ติชั่นในแต่ละอันและมันจะยุ่งยากในการเพิ่มรายการหนึ่งหรือสองรายการเพื่อ fstab สำหรับแต่ละรายการ

วิธีแก้ปัญหาที่น่าเกลียดอาจทำให้udevการจัดการรายการเป็นอุปกรณ์ใหม่ปรากฏขึ้นและหายไป
ตลก

ฉันไม่พบสิ่งนี้เพื่อทำงานใน Mint หรือ Ubuntu ใช่บัญชีผู้ใช้เริ่มต้นสามารถเมาต์ได้โดยไม่ต้องรูท แต่ผู้ใช้ 'มาตรฐาน' / 'เดสก์ท็อป' ไม่สามารถเมาต์ได้
johny ทำไม

6

นี่คือวิกิสำหรับการกำหนดค่ากฎ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

2
ดูเหมือนว่าจะไป แต่ก็ไม่ได้ผลสำหรับฉัน
Stéphane Gourichon

5

1 ดูว่ามันทำงานที่ไหน

บน Xubuntu มันทำงานนอกกรอบเพื่อติดตั้งและดึงที่เก็บข้อมูล USB, พาร์ติชั่นฮาร์ดดิสก์, CD / DVD และอื่น ๆ อีกมากมาย

สมมติว่าโซลูชันของ Ubuntu เลือกใช้ policyKit นั้นมีความปลอดภัยเพียงพอ

2 เลือกส่วนที่เกี่ยวข้อง

บน 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

3 กำไร!

(สิ่งที่ฉันทำจริง ๆ คือเลือกไฟล์จากชื่อเดียวกันบน Ubuntu 16.04 และมันใช้งานได้สำหรับฉันถ้าคุณต้องการมันส่วนใหญ่จะดูเหมือนเนื้อหาของhttps://gist.github.com/kafene/5b4aa4ebbd9229fa2e73 )


ใช้งานได้กับเดเบียนเช่นระบบเท่านั้นไม่รู้ว่าทำไมการวางกฎไว้ใน / etc / ไม่ทำงาน
อันวาร์

ใช้งานไม่ได้กับเดเบียนยืด
ฟิลิปป์ลุดวิก

1
ใช้งานได้กับ Debian Buster บน XFCE! ขอบคุณ!
Maxwel Leite

3

คุณสามารถกำหนดค่าsudoเพื่ออนุญาตให้กลุ่มผู้ใช้เรียกใช้mountคำสั่ง

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


ฉันคิดถึงสิ่งนี้ แต่สิ่งนี้ไม่ต้องการให้ผู้ใช้เรียกใช้คำสั่งด้วยsudoใช่ไหม นอกจากนี้ผู้ใช้รูทจะติดตั้งระบบไฟล์หลังฉากด้วยวิธีนี้หรือไม่

ใช่พวกเขาต้องการ sudo และใช่มันจะทำงานในนามของรูท เพื่อแก้ปัญหาแรกคุณอาจนามแฝงmountไปsudo mountหรือใช้สคริปต์เสื้อคลุม
ตลก

สิ่งที่ฉันต้องการคือการเมานต์ระบบไฟล์โดยไม่มีเอเจนต์ของผู้ใช้รูท กำบังเอเจนซี่นี้ด้วยอะไรไม่ใช่สิ่งที่ฉันตามมาเลย

โปรดทราบว่าการเพิ่มuserไปยัง fstab ใช้งานได้เพียงเพราะmountเป็น setuid root เคอร์เนลกำลังตรวจสอบหารูทหรือCAP_SYS_ADMINความสามารถดังนั้นคุณจึงไม่สามารถเข้าไปเกี่ยวข้องกับรูตได้
ตลก

คุณสามารถกำหนดค่าได้อย่างไร มันไม่ได้ช่วยอะไร
Nuzzolilo

0

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

สรุปคำถามอีก 2 ข้อฉันจะพูดแบบนี้:

  • fstabเหมาะอย่างยิ่งสำหรับการติดตั้งที่เก็บข้อมูลถาวรในเวลาบูต มันไม่ค่อยดีนักเมื่อคุณต้องการเสียบไดรฟ์ usb หรือติดตั้งเครือข่ายบางครั้งแบ่งปัน

  • sudo mountก็ไม่เป็นไรถ้าคุณใช้ระบบ ubuntu * คุณจะต้องพิมพ์รหัสผ่านด้วยซ้ำ

  • udev จะดูแลการติดตั้งสิ่งต่าง ๆ เช่น usb sticks, กล้องและแฟลชการ์ดในระบบ ubuntu * (แต่ไม่ได้อยู่ใน distros ที่เป็นมิตรกับผู้ใช้น้อยเช่น debian, slackware, ฯลฯ )

ฉันจะเพิ่มที่ในอดีตวิธี unix เพื่อให้สิทธิ์แก่ผู้ใช้บางคน (หรือกลุ่ม) ในการทำสิ่งต่าง ๆ คือผ่านsudoersไฟล์

มีคำแนะนำมากมายที่จะใช้งานได้ที่นั่นดังนั้นฉันจะไม่แนะนำเฉพาะใด ๆ ฉันจะบอกว่าฉันใช้เว็บไซต์โครงการเอกสารลินุกซ์เพื่อเรียนรู้เกี่ยวกับมัน

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

สิ่งที่ฉันมักจะทำในสภาพแวดล้อมการควบคุมคือฉันใช้sudoersไฟล์เพื่ออนุญาตให้ผู้ใช้บางกลุ่มเชื่อมต่อเครือข่ายอย่างโปร่งใส ดังนั้นฉันจึงเพิ่มคำสั่งmount.nfsและmount.cifsในไฟล์ sudoers ที่อนุญาตการดำเนินการเช่น "เมานต์โฮมโฟลเดอร์ของผู้ใช้จากเซิร์ฟเวอร์ไฟล์เครือข่ายเมื่อผู้ใช้ล็อกออนเข้าสู่เทอร์มินัลไคลเอนต์" และ studd เช่นนั้น


1
หากคุณใช้ sudo เพื่อให้ผู้ใช้เมานต์โฮมโฟลเดอร์ของพวกเขาเมื่อเข้าสู่ระบบคุณควรดู autofs
Derobert

ฉันใช้สิ่งเหล่านี้ร่วมกัน; ฉันไม่สามารถหาวิธีใช้autofsด้วยตนเองเพื่อเมานต์/home/$USERจากไฟล์เซิร์ฟเวอร์ไปยังตำแหน่ง/home/$USER/fromFS/บนไคลเอนต์พีซี
nass

0

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

พึ่งพา:

  • การใช้งานระบบไฟล์ของ userland
  • ฟิวส์

เอกสาร: http://libguestfs.org/guestmount.1.html

ทดสอบกับ Ubuntu 18.04, libguestfs-tools 1: 1.36.13-1ubuntu3

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