Có một công cụ linux vfs cho phép liên kết một thư mục ở các vị trí khác nhau (như mount --bind) trong không gian người dùng không?


7

Đối với một quá trình người dùng, tôi muốn gắn một thư mục ở vị trí khác nhưng trong không gian người dùng mà không có quyền riêng tư gốc. Một cái gì đó như mount --bind / origin / Dest, nhưng với trình bao bọc vfs. Giống như một usermode tinh chỉnh chroot.

Chương trình sẽ bao bọc các tòa nhà cao tầng thành các tệp để "thay thế" các đường dẫn cần thiết. Nó có thể được gọi với một dòng lệnh như:

bindvfs / fake-home: / home ls / home

Tôi chắc chắn rằng sự linh thiêng này tồn tại! :)

Câu trả lời:


2

Bạn có thể sử dụng PRoot gần giống như trong ví dụ của bạn:

proot -b /fake-home:/home ls /home

Không giống như BindFS / FUSE, PRoot có thể liên kết với các tệp và thư mục bạn không sở hữu.


Hoàn hảo, đó chính xác là những gì tôi đã nghĩ
Keymon

Một số cách tiếp cận dựa trên ptrace khác - unix.stackexchange.com/a/72697/4319 .
imz - Ivan Zakharyaschev

2

Các con vẹt chương trình có thể làm những gì bạn yêu cầu: các cuộc gọi hệ thống đánh chặn và chuyển hướng con đường nhất định (ví dụ, tất cả các đường dẫn bắt đầu với /anonftpđược ánh xạ để truy cập một cách minh bạch các file từ xa qua FTP). Nó cũng chạy hoàn toàn trong không gian người dùng.

Tuy nhiên, mặc dù có một loạt các giao thức mạng phổ biến và không phổ biến, parrotnhưng không có bất kỳ mô-đun nào để thực hiện hệ thống tập tin đơn giản-> hệ thống tập tin viết lại như bạn yêu cầu. Điều đó khá đơn giản để thêm, nếu bạn biết một số lập trình ngôn ngữ C.

Ngoài ra, bindfs (chạy trên FUSE ), hoạt động như một mount --bindkhông gian người dùng. (Nhưng điều này đi theo hướng ngược lại so với việc chuyển hướng /homeđến /fake-homenhư bạn đề cập trong câu hỏi của bạn.)


Tôi không knwon chương trình đó, vẹt. Tôi sẽ gửi thư cho họ.
Keymon

1

VFS đã cho phép gắn hệ thống tập tin không root. Bạn có thể thêm userhoặc userstùy chọn vào mục fstab và đảm bảo vfs.usermount=1là trong /etc/sysctl.

Không ai trong số này sẽ cung cấp cho bạn các điều khiển giống như chroot. Các bindtùy chọn sẽ không thay đổi quyền hoặc cho phép một truy cập 'thay thế', đây là một mục mtab thứ hai cho hệ thống tập tin chính xác giống nhau và nội dung. Sửa đổi trong gắn kết ảnh hưởng đến bản gốc.

Tôi chắc chắn rằng bạn sẽ làm rõ mục tiêu cuối cùng của mình trước khi tiến xa hơn.


Hãy tưởng tượng tình huống này: Tôi có một chương trình được biên dịch trước, mà tôi không thể biên dịch lại. Chương trình này truy cập vào một đường dẫn cố định, như '~ / .program-data' và tôi cần khởi chạy một số phiên bản của chương trình với tư cách là người dùng, mà không cần thực hiện chroot. Tất nhiên tôi có thể tạo ra một môi trường chroot và sử dụng fakechroot, nhưng nó quá phức tạp.
Keymon

1
Vì vậy, trong trường hợp đó, bạn đang cố gắng cung cấp một vị trí được chia sẻ (như /var/program-data) cho người dùng cho tất cả quyền truy cập như ~/.program-datakhi chạy chương trình nói? Hay bạn đang cố gắng cung cấp các bản sao riêng biệt ~/.program-datacho từng phiên bản của một chương trình được chạy bởi cùng một người dùng?
nzwulfin

Cả hai tình huống đều ổn. Nếu có thể bằng quá trình ví dụ, tốt hơn.
Keymon

0

mount_namespaces sẽ cho phép bạn mount --bindkhông nhìn thấy các quy trình khác. Nhưng thông thường mount --bindchỉ giới hạn cho người dùng root (vì lý do bảo mật). Vì vậy, để mount_namespaces được sử dụng cho người dùng không phải root, trước tiên bạn nên sử dụng user_namespaces để trở thành "root cục bộ" trong không gian tên mới, khi đó thao tác này sẽ được phép.

Bạn có thể chơi với cái này trong shell của mình như thế này - ví dụ này cho thấy cụ thể việc sử dụng không gian người dùng & mount để chuẩn bị thư mục chroot (và chroothoạt động cũng thường được đặc quyền):

unshare --user --map-root-user --mount-proc --pid --fork
mkdir -p newroot/dev
mount --rbind /dev newroot/dev
....other chroot preparation....
chroot newroot
su - user1

Lưu ý rằng tôi đang sử dụng mount --rbind(thay vì mount --bind), vì chỉ điều này mới hoạt động trong không gian tên người dùng & mount mới, nếu thư mục bao gồm các điểm gắn kết khác (và /dev/trong trường hợp của tôi).

Có lẽ lời giải thích cho điều này là người dùng không nên tìm cách nhìn thấy thứ mà thông thường người dùng không có đặc quyền sẽ không nhìn thấy, tức là các thư mục con bị ẩn bởi "phần phụ". Không tước bỏ các phần phụ, chỉ --rbindđược phép.

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.