ให้สิทธิ์ผู้ใช้เฉพาะกับอุปกรณ์โดยไม่ให้สิทธิ์การเข้าถึงแก่ผู้ใช้รายอื่น


18

/dev/sdbฉันได้อ่านบัตรติดอยู่บน

สิ่งที่ฉันทำคือให้สิทธิ์ทั้งหมดแก่เจ้าของกลุ่มและส่วนที่เหลือของโลกโดยใช้:

sudo chmod 777 /dev/sdb

ฉันสามารถใช้ชุดค่าผสมอื่นช่วยให้เจ้าของ (ฉัน) ใช้เครื่องอ่านการ์ดได้หรือไม่

มีบัญชีผู้ใช้เดียวเท่านั้น


ls -l /dev/sdbคุณสามารถโปรดเรียกใช้ ฉันเดาว่านี่เป็นของรูท แต่จะดีแน่
Warwick

มันบอกว่า: "brw-rw ---- 1 root"
Mohamed Ahmed

คำตอบ:


28

มีหลายวิธีในการบรรลุเป้าหมายนี้

1. เพิ่มผู้ใช้ของคุณไปยังกลุ่มที่เป็นเจ้าของอุปกรณ์

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

ตัวอย่างเช่นในระบบของฉัน:

# ls -l /dev/sdb
brw-rw---- 1 root disk 8, 16 2014/07/07-21:32:25 /dev/sdb

ดังนั้นฉันต้องเพิ่มผู้ใช้ของฉันในdiskกลุ่ม

# usermod -a -G disk patrick

 

2. เปลี่ยนการอนุญาตของอุปกรณ์

แนวคิดคือการสร้างกฎ udev เพื่อเรียกใช้คำสั่งเมื่อตรวจพบอุปกรณ์

ก่อนอื่นคุณต้องหาวิธีในการระบุอุปกรณ์ คุณใช้udevadmสำหรับสิ่งนี้ ตัวอย่างเช่น:

# udevadm info -a -n /dev/sdb

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/devices/pci0000:00/0000:00:1d.0/usb1/1-1/1-1.3/1-1.3:1.0/host6/target6:0:0/6:0:0:0/block/sdb':
    KERNEL=="sdb"
    SUBSYSTEM=="block"
    DRIVER==""
    ATTR{ro}=="0"
    ATTR{size}=="31116288"
    ATTR{stat}=="     279      219     3984     1182        0        0        0        0        0      391     1182"
    ATTR{range}=="16"
    ATTR{discard_alignment}=="0"
    ATTR{events}=="media_change"
    ATTR{ext_range}=="256"
    ATTR{events_poll_msecs}=="-1"
    ATTR{alignment_offset}=="0"
    ATTR{inflight}=="       0        0"
    ATTR{removable}=="1"
    ATTR{capability}=="51"
    ATTR{events_async}==""

  looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb1/1-1/1-1.3/1-1.3:1.0/host6/target6:0:0/6:0:0:0':
    KERNELS=="6:0:0:0"
    SUBSYSTEMS=="scsi"
    DRIVERS=="sd"
    ATTRS{rev}=="0207"
    ATTRS{type}=="0"
    ATTRS{scsi_level}=="0"
    ATTRS{model}=="STORAGE DEVICE  "
    ATTRS{state}=="running"
    ATTRS{queue_type}=="none"
    ATTRS{iodone_cnt}=="0x184"
    ATTRS{iorequest_cnt}=="0x184"
    ATTRS{device_busy}=="0"
    ATTRS{evt_capacity_change_reported}=="0"
    ATTRS{timeout}=="30"
    ATTRS{evt_media_change}=="0"
    ATTRS{max_sectors}=="240"
    ATTRS{ioerr_cnt}=="0x2"
    ATTRS{queue_depth}=="1"
    ATTRS{vendor}=="Generic "
    ATTRS{evt_soft_threshold_reached}=="0"
    ATTRS{device_blocked}=="0"
    ATTRS{evt_mode_parameter_change_reported}=="0"
    ATTRS{evt_lun_change_reported}=="0"
    ATTRS{evt_inquiry_change_reported}=="0"
    ATTRS{iocounterbits}=="32"
    ATTRS{eh_timeout}=="10"

  looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb1/1-1/1-1.3/1-1.3:1.0/host6/target6:0:0':
    KERNELS=="target6:0:0"
    SUBSYSTEMS=="scsi"
    DRIVERS==""

  looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb1/1-1/1-1.3/1-1.3:1.0/host6':
    KERNELS=="host6"
    SUBSYSTEMS=="scsi"
    DRIVERS==""

  looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb1/1-1/1-1.3/1-1.3:1.0':
    KERNELS=="1-1.3:1.0"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb-storage"
    ATTRS{bInterfaceClass}=="08"
    ATTRS{bInterfaceSubClass}=="06"
    ATTRS{bInterfaceProtocol}=="50"
    ATTRS{bNumEndpoints}=="02"
    ATTRS{supports_autosuspend}=="1"
    ATTRS{bAlternateSetting}==" 0"
    ATTRS{bInterfaceNumber}=="00"

  looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb1/1-1/1-1.3':
    KERNELS=="1-1.3"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{devpath}=="1.3"
    ATTRS{idVendor}=="05e3"
    ATTRS{speed}=="480"
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{busnum}=="1"
    ATTRS{devnum}=="5"
    ATTRS{configuration}==""
    ATTRS{bMaxPower}=="500mA"
    ATTRS{authorized}=="1"
    ATTRS{bmAttributes}=="80"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{maxchild}=="0"
    ATTRS{bcdDevice}=="0207"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{quirks}=="0x0"
    ATTRS{serial}=="000000000207"
    ATTRS{version}==" 2.00"
    ATTRS{urbnum}=="1115"
    ATTRS{ltm_capable}=="no"
    ATTRS{manufacturer}=="Generic"
    ATTRS{removable}=="unknown"
    ATTRS{idProduct}=="0727"
    ATTRS{bDeviceClass}=="00"
    ATTRS{product}=="USB Storage"

  looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb1/1-1':
    KERNELS=="1-1"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceProtocol}=="01"
    ATTRS{devpath}=="1"
    ATTRS{idVendor}=="8087"
    ATTRS{speed}=="480"
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{busnum}=="1"
    ATTRS{devnum}=="2"
    ATTRS{configuration}==""
    ATTRS{bMaxPower}=="0mA"
    ATTRS{authorized}=="1"
    ATTRS{bmAttributes}=="e0"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{maxchild}=="6"
    ATTRS{bcdDevice}=="0000"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{quirks}=="0x0"
    ATTRS{version}==" 2.00"
    ATTRS{urbnum}=="61"
    ATTRS{ltm_capable}=="no"
    ATTRS{removable}=="unknown"
    ATTRS{idProduct}=="0024"
    ATTRS{bDeviceClass}=="09"

  looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb1':
    KERNELS=="usb1"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{devpath}=="0"
    ATTRS{idVendor}=="1d6b"
    ATTRS{speed}=="480"
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{authorized_default}=="1"
    ATTRS{busnum}=="1"
    ATTRS{devnum}=="1"
    ATTRS{configuration}==""
    ATTRS{bMaxPower}=="0mA"
    ATTRS{authorized}=="1"
    ATTRS{bmAttributes}=="e0"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{maxchild}=="3"
    ATTRS{bcdDevice}=="0313"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{quirks}=="0x0"
    ATTRS{serial}=="0000:00:1d.0"
    ATTRS{version}==" 2.00"
    ATTRS{urbnum}=="26"
    ATTRS{ltm_capable}=="no"
    ATTRS{manufacturer}=="Linux 3.13.6-gentoo ehci_hcd"
    ATTRS{removable}=="unknown"
    ATTRS{idProduct}=="0002"
    ATTRS{bDeviceClass}=="09"
    ATTRS{product}=="EHCI Host Controller"

  looking at parent device '/devices/pci0000:00/0000:00:1d.0':
    KERNELS=="0000:00:1d.0"
    SUBSYSTEMS=="pci"
    DRIVERS=="ehci-pci"
    ATTRS{irq}=="23"
    ATTRS{subsystem_vendor}=="0x144d"
    ATTRS{broken_parity_status}=="0"
    ATTRS{class}=="0x0c0320"
    ATTRS{companion}==""
    ATTRS{enabled}=="1"
    ATTRS{consistent_dma_mask_bits}=="32"
    ATTRS{dma_mask_bits}=="32"
    ATTRS{local_cpus}=="0f"
    ATTRS{device}=="0x1e26"
    ATTRS{uframe_periodic_max}=="100"
    ATTRS{msi_bus}==""
    ATTRS{local_cpulist}=="0-3"
    ATTRS{vendor}=="0x8086"
    ATTRS{subsystem_device}=="0xc0d3"
    ATTRS{numa_node}=="-1"
    ATTRS{d3cold_allowed}=="1"

  looking at parent device '/devices/pci0000:00':
    KERNELS=="pci0000:00"
    SUBSYSTEMS==""
    DRIVERS==""

จากนั้นสร้างไฟล์ใหม่ใน/etc/udev/rules.dเช่น99-cardreader.rules:

SUBSYSTEM=="block", ATTRS{idProduct}=="0727", ATTRS{serial}=="000000000207", ACTION=="add", RUN+="/bin/chmod 777 /dev/$name"

ที่นี่ฉันใช้ผลลัพธ์จากudevadm infoคำสั่งเพื่อค้นหาข้อมูลการระบุบางอย่างสำหรับอุปกรณ์ ฉันใช้SUBSYSTEM="block"รายการสำหรับรายการแรกแล้วATTRSค่าจากรายการที่ 6 โดยทั่วไปจะพบอุปกรณ์ USB ที่มีหมายเลขผลิตภัณฑ์และซีเรียลนั้นจากนั้นค้นหาอุปกรณ์บล็อกที่เป็นผลมาจากอุปกรณ์ USB นั้น

คำสั่งจะมีการเปลี่ยนแปลงสิทธิ์บนอุปกรณ์ที่จะRUN 777อย่างไรก็ตามฉันไม่คิดว่านี่เป็นทางออกที่ดีมากเพราะนี่เป็นการเปิดอุปกรณ์ไปทั่วโลก ทางออกที่ดีกว่าอาจเป็น:

SUBSYSTEM=="block", ATTRS{idProduct}=="0727", ATTRS{serial}=="000000000207", ACTION=="add", RUN+="/bin/setfacl -m u:patrick:rw- /dev/$name"

การดำเนินการนี้จะให้สิทธิ์การpatrickเข้าถึงแบบอ่าน / เขียนแก่ผู้ใช้

หมายเหตุ:สิ่งสำคัญคือต้องจำไว้ว่าเมื่อเขียนกฎ udev คุณสามารถใช้พารามิเตอร์จากอุปกรณ์ด้านบนและอุปกรณ์อื่น ๆ ในห่วงโซ่เท่านั้น ดังนั้นฉันสามารถใช้SUBSYSTEM="block"พารามิเตอร์และATTRSพารามิเตอร์ แต่ฉันไม่สามารถใช้พารามิเตอร์ใด ๆ จากอุปกรณ์อื่น ๆ ในห่วงโซ่ได้หรือกฎจะไม่ตรงกัน

หมายเหตุเพิ่มเติม: (เนื่องจากระบบต้องการมากกว่า 6 ตัวอักษรสำหรับการแก้ไขและฉันไม่มีชื่อเสียงในการเพิ่มความคิดเห็น) การจับคู่ evev ต้องใช้ตัวดำเนินการเท่าเทียมกัน ( ==) ไม่ใช่การมอบหมาย ( =)! คำตอบนี้ก่อนหน้านี้มีSUBSYSTEM="block"ที่ไม่ทำงาน ( invalid SUBSYSTEM operation)


ใน systemd 219 อย่างน้อย udev ให้คุณใช้ MODE = "777" แทน RUN + = "/ bin / chmod 777 / dev / $ name" ฉันไม่เชื่อว่ามันมีทางเลือกอื่นในการรัน setfacl อย่างชัดเจน
doshea

1
มี$nameกฎอะไรเป็นลายลักษณ์อักษร? ฉันควรแทนที่ด้วยsdbหรือไม่
Marecky

2
@Marecky freedesktop.org/software/systemd/man/udev.html#%24name "ชื่อปัจจุบันของอุปกรณ์หากไม่ได้เปลี่ยนโดยกฎจะเป็นชื่อของอุปกรณ์เคอร์เนล" คุณไม่ได้แทนที่ด้วยสิ่งใดคุณปล่อยให้เป็นไป
Patrick

ขอบคุณฉันเพิ่งใช้คำตอบของคุณกับปัญหาเฉพาะของฉันซึ่งเป็นสิทธิ์ไม่เพียงพอสำหรับผู้ใช้ปกติในการเข้าถึงฮาร์ดดิสก์ดิบที่กำหนดค่าเป็น boot-disk สำหรับแขก Windows 7 ที่ทำงานใน VirtalBox
Marecky
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.