Làm thế nào để cho phép những người không phải siêu nhân gắn kết bất kỳ hệ thống tập tin nào?


47

Có thể cho phép một số người dùng cụ thể (ví dụ: thành viên của một nhóm) gắn kết bất kỳ hệ thống tệp nào mà không có đặc quyền siêu người dùng trên Linux không?

Một câu hỏi khác có thể là "theo cách nào người dùng có thể gây hại cho hệ thống bằng cách gắn hệ thống tập tin?"


Có lẽgvfs-mount-d /dev/sdX
KrisWebDev 20/03/2016

Câu trả lời:


44

Có một vài cách tiếp cận, một số trong đó chủ yếu là an toàn, một số khác thì không.

Cách không an toàn

Hãy để bất kỳ sử dụng chạy mount, ví dụ, thông qua sudo. Bạn cũng có thể cung cấp cho họ root; đó là một thứ tương tự. Người dùng có thể gắn kết một hệ thống tập tin với một bản sao gốc tuyệt vời của bashMạnhrucky ngay lập tức cung cấp root (có thể không có bất kỳ đăng nhập nào, ngoài thực tế mountđã được chạy).

Ngoài ra, người dùng có thể gắn hệ thống tệp của riêng mình lên trên /etc, chứa bản sao của chính họ /etc/shadowhoặc /etc/sudoerssau đó lấy root bằng suhoặc sudo. Hoặc có thể liên kết-mount ( mount --bind) trên một trong hai tệp đó. Hoặc một tập tin mới vào /etc/sudoers.d.

Các cuộc tấn công tương tự có thể được kéo ra /etc/pam.dvà nhiều nơi khác.

Hãy nhớ rằng các hệ thống tập tin thậm chí không cần phải có trên một thiết bị, -o loopsẽ gắn kết một tập tin được sở hữu (và do đó có thể sửa đổi) bởi người dùng.

Cách an toàn chủ yếu: udisks hoặc tương tự

Các môi trường máy tính để bàn khác nhau đã thực sự xây dựng các giải pháp cho vấn đề này, để cho phép người dùng gắn phương tiện di động. Chúng hoạt động bằng cách gắn vào một thư mục con /mediachỉ và bằng cách tắt hỗ trợ set-user / group-id thông qua các tùy chọn kernel. Tùy chọn ở đây bao gồm udisks, udisks2, pmount, usbmount,

Nếu bạn phải, bạn có thể viết kịch bản của riêng mình để làm một cái gì đó tương tự, và gọi nó thông qua sudo, nhưng bạn phải thực sự cẩn thận viết kịch bản này để không bị khai thác root. Nếu bạn không muốn người dùng của mình phải nhớ sudo, bạn có thể làm điều gì đó như thế này trong một tập lệnh:

#!/bin/bash
if [ $UID -ne 0 ]; then       # or `id -u`
    exec sudo -- "$0" "$@"
fi

# rest of script goes here 

Cách an toàn vào một ngày nào đó: không gian tên người dùng

Không gian tên Linux là một hình thức ảo hóa rất nhẹ (các thùng chứa, để cụ thể hơn). Đặc biệt, với không gian tên người dùng, bất kỳ người dùng nào trên hệ thống đều có thể tạo môi trường riêng mà họ đã root. Điều này sẽ cho phép họ gắn kết các hệ thống tệp, ngoại trừ đã bị chặn rõ ràng ngoại trừ một vài hệ thống tệp ảo. Cuối cùng, các hệ thống tập tin FUSE có thể sẽ được cho phép, nhưng các bản vá gần đây nhất tôi có thể tìm thấy không bao gồm các thiết bị khối, chỉ những thứ như sshfs.

Hơn nữa, nhiều hạt nhân distro đã (vì lý do bảo mật) mặc định không cho phép người dùng không có đặc quyền sử dụng không gian tên người dùng; ví dụ Debian có giá trị kernel.unprivileged_userns_clonemặc định là 0. Các phân phối khác có cài đặt tương tự, mặc dù thường có các tên hơi khác nhau.

Tài liệu tốt nhất mà tôi biết về không gian tên người dùng là một bài viết Không gian tên trong bài viết của LWN , phần 5: Không gian tên người dùng .

Bây giờ, tôi sẽ đi với udisks2.


Cảm ơn câu trả lời của bạn! BTW, bạn có nghĩ rằng nó an toàn để cho phép người dùng trong nhóm mountcó thể gắn kết các hệ thống tập tin như root không? Tôi sẽ đọc tài liệu không gian tên mà bạn đã liên kết và cố gắng thực hiện điều nhóm gắn kết này, ít nhất là như một bài tập.

@gkya Tôi hy vọng phần đầu tiên của tôi đã làm rõ rằng việc cho phép (a) gắn một hệ thống tập tin mà không buộc nosuid [và cả gật đầu]; hoặc (b) tại một vị trí tùy ý về cơ bản là cho root. Nếu bạn cho phép ai đó chạy các mountlệnh tùy ý , điều đó cũng giống như cho quyền root.
derobert

@gkya từ "nhiều ổ đĩa di động có nhiều phân vùng trên mỗi" nhận xét về một câu trả lời khác, tôi đoán bạn muốn phương pháp "udisks hoặc tương tự".
derobert

1
@derobert kể từ khi bạn nói về không gian tên người dùng, bạn có thể muốn xem Kế hoạch 9 từ Bell Labs (đó là sự kế thừa của UNIX, được thực hiện bởi cùng một người). nó mô hình cây tập tin như một không gian tên theo quy trình (và không có thứ gọi là root). công cụ hấp dẫn.
strugee

1
@malan OK, tôi đã cập nhật nó. Nếu bất cứ điều gì, tôi nghĩ rằng việc sử dụng không gian tên người dùng cho điều này dường như sẽ còn xa hơn trong tương lai.
derobert

16

Bạn có thể làm điều đó, nhưng bạn cần sửa đổi mục nhập /etc/fstabtương ứng với hệ thống tệp bạn muốn gắn kết, thêm cờ uservào mục này. Người dùng không có đặc quyền sau đó sẽ có thể gắn kết nó.

Xem man mountđể biết thêm chi tiết.


1
Đây là câu trả lời duy nhất tôi có thể tìm thấy với googling. Tôi đã phát hiện ra rằng trên FreeBSD, người ta có thể cho phép người dùng gắn kết các hệ thống tập tin với việc đặt một biến (cụ thể vfs.usermount). Tôi muốn sth. tương tự như vậy. Tôi sử dụng nhiều ổ đĩa di động với nhiều phân vùng trên mỗi ổ đĩa và sẽ rất cồng kềnh khi thêm một tá hoặc hai mục vào fstab cho mỗi ổ.

Cách giải quyết xấu xí có thể là để cho phép udevquản lý các mục khi các thiết bị mới xuất hiện và biến mất.
Jester

Tôi chưa tìm thấy cái này để hoạt động trên Mint hoặc Ubuntu. Có, tài khoản người dùng mặc định có thể gắn kết mà không cần root, nhưng người dùng 'tiêu chuẩn' / 'máy tính để bàn' không thể gắn kết.
johny tại sao

6

Dưới đây là wiki để cấu hình các quy tắc polkit cho udisks / udisks2 để gắn kết các phân vùng theo nhóm không root (ví dụ: người dùng).

Lưu mã dưới đây vào /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];
  }
});

Giả sử bạn thuộc nhóm "người dùng", sử dụng lệnh sau để gắn phân vùng (không cần sudo).

# udisks2
udisksctl mount --block-device /dev/sda1

# udisks
udisks --mount /dev/sda1

2
Có vẻ như con đường để đi nhưng không làm việc cho tôi.
Stéphane Gourichon 18/03/2016

5

1 Nhìn vào nơi nó hoạt động

Trên Xubfox, nó hoạt động ngoài hộp để gắn và đẩy bộ lưu trữ lớn USB, phân vùng đĩa cứng, CD / DVD và có thể hơn thế nữa.

Giả sử rằng giải pháp mà Ubuntu đã chọn, sử dụng chính sáchKit, là đủ an toàn.

2 Chọn phần có liên quan

Trên XFCE trên Debian 8.3, tôi cần cho phép người dùng gắn kết và đẩy các hệ thống tệp từ thunar mà không cần mật khẩu. Điều làm việc cho tôi là chọn một tập tin cấp phép từ Ubuntu.

Thêm các dòng dưới đây là root vào một tệp có tên /var/lib/polkit-1/localauthority/10-vendor.d/com.ubuntu.desktop.pklanên thực hiện thủ thuật:

[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 lợi nhuận!

(Những gì tôi đã làm thực sự là lựa chọn nhiều hơn một chút từ tập tin cùng tên trên Ubuntu 16.04 và nó làm việc cho tôi. Nếu bạn cần nó, nó chủ yếu là trông giống như nội dung của https://gist.github.com/kafene/5b4aa4ebbd9229fa2e73 )


Chỉ điều này hoạt động trong debian như các hệ thống, không biết tại sao đưa quy tắc vào / etc / không hoạt động.
Anwar

Không hoạt động trên kéo dài debian.
Philipp Ludwig

1
Hoạt động trên Debian Buster trên XFCE! Cảm ơn!
Maxwel Leite

3

Bạn có thể cấu hình sudođể cho phép một nhóm người dùng chạy mountlệnh.

Cập nhật : làm thế nào bạn có thể làm hỏng hệ thống bằng cách gắn? Ví dụ: bạn có thể tạo một shell root setuid trên một hệ thống tập tin mà sau đó bạn có thể gắn kết và thực thi để có được quyền root.


Tôi đã nghĩ về điều này, nhưng điều này sẽ không yêu cầu người dùng chạy lệnh với sudo? Ngoài ra, không phải người dùng root đang gắn hệ thống tệp, chỉ ở phía sau hậu trường, với phương thức này sao?

Vâng, họ sẽ cần sudo và có nó sẽ chạy trong tên của root. Để giải quyết vấn đề đầu tiên, bạn có thể bí danh mountđể sudo mounthoặc sử dụng một kịch bản wrapper.
Jester

Những gì tôi muốn có là gắn kết hệ thống tập tin mà không có cơ quan của người dùng root. Che dấu cơ quan này với bất cứ điều gì không phải là những gì tôi sau tất cả.

Lưu ý rằng thậm chí thêm uservào fstab chỉ hoạt động vì mountgốc setuid. Nhân đang kiểm tra root hoặc CAP_SYS_ADMINkhả năng để bạn thực sự không thể tìm hiểu về root.
Jester

Bạn có thể cấu hình, làm thế nào? Điều này không có ích.
Nuzzolilo

0

Để trả lời câu hỏi của bạn trong ngoặc đơn, vì hệ thống tệp là trình giữ chỗ cho các tệp, sau đó người dùng có thể thực hiện các hoạt động có hại trên hệ thống tệp đó, chẳng hạn như xóa tệp.

Tóm tắt 2 câu hỏi khác tôi sẽ nói điều này:

  • fstablà tuyệt vời để gắn vào thời gian khởi động lưu trữ vĩnh viễn . Thật không tuyệt vời khi bạn muốn cắm vào ổ đĩa USB hoặc thỉnh thoảng gắn kết một số chia sẻ mạng.

  • sudo mountcũng ổn nếu bạn đang sử dụng hệ thống ubfox *. Bạn vẫn sẽ cần phải nhập mật khẩu.

  • udev sẽ đảm nhiệm việc gắn những thứ như thẻ nhớ usb, máy ảnh và thẻ flash trong các hệ thống ubfox * (nhưng không phải trong các bản phát hành ít thân thiện với người dùng như debian, slackware, v.v.)

Về mặt lịch sử, tôi sẽ thêm rằng cách unix để trao quyền cho một số người dùng (hoặc nhóm) thực hiện công cụ là thông qua sudoerstệp.

Có NHIỀU hướng dẫn để sử dụng nó ngoài đó vì vậy tôi sẽ không đề xuất bất kỳ cụ thể. Tôi sẽ nói rằng tôi đã sử dụng trang web dự án tài liệu Linux để tìm hiểu về nó.

Điều tuyệt vời hơn sudoerslà bạn có thể gắn kết các thiết bị và chia sẻ một cách trong suốt - ngay cả khi không cung cấp mật khẩu nếu bạn chọn làm như vậy (hãy cẩn thận hơn về điều đó).

Những gì tôi thường làm trong môi trường kiểm soát là tôi sử dụng sudoerstệp để cho phép người dùng của một số nhóm nhất định gắn kết chia sẻ mạng một cách trong suốt. Vì vậy, tôi thêm các lệnh mount.nfsmount.cifstrong tệp sudoers cho phép các hoạt động như "gắn thư mục nhà của người dùng từ máy chủ tệp mạng, khi người dùng đăng nhập vào thiết bị đầu cuối của khách hàng" và thực hiện như vậy.


1
Nếu bạn đang sử dụng sudo để cho phép người dùng gắn các thư mục nhà của họ khi đăng nhập, bạn nên xem phần tự động.
derobert

Tôi sử dụng chúng cùng nhau; Tôi không thể tự mình tìm ra cách sử dụng autofsđể gắn kết /home/$USERtừ máy chủ tệp, đến vị trí /home/$USER/fromFS/trên máy khách.
NASS

0

guestmount lừa đảo 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

Dựa vao:

  • việc sử dụng các hệ thống tập tin
  • CẦU CHÌ

Tài liệu: http://libguestfs.org/guestmount.1.html

Đã thử nghiệm trên Ubuntu 18.04, libguestfs-tools 1: 1.36.13-1ubfox3.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.