Cung cấp cho người dùng quyền truy cập đọc / ghi vào một thư mục


18

Tôi đang chạy một máy chủ và tôi cần cấp quyền truy cập đọc / ghi vào một thư mục cụ thể cho một người dùng. Tôi đã thử như sau:

sudo adduser abcd
sudo groupadd abcdefg
chown -R .abcdefg /var/www/allowfolder
chmod -R g+rw /var/www/allowfolder
usermod -a -G comments abcd

Những điều trên dường như hoạt động, tuy nhiên nó cho phép người dùng truy cập chỉ đọc vào phần còn lại của máy chủ.

Làm cách nào tôi có thể thiết lập quyền để người dùng chỉ có thể đọc và ghi vào một thư mục cụ thể? Người dùng cũng có thể chạy các chương trình như thế nào mysql.


2
Câu trả lời ngắn gọn: sử dụng một chroot.
Chris Xuống

@Chris Muốn giải thích về điều đó trong một câu trả lời? Manish và tôi đã vật lộn với điều này và dường như không thể làm cho nó hoạt động được.
Hoàn tác

Sẽ nơi mysqlchương trình được đặt ở đâu? Người dùng phải có khả năng đọc nó, và tất cả các thư viện và tệp dữ liệu cần thiết.
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles Hmm. Đó là một cài đặt mysql tiêu chuẩn từ apt-get, theo như tôi có thể nói (không phải hệ thống của tôi, đó là Undo).
Manishearth

Câu trả lời:


18

ACL âm

Bạn có thể ngăn người dùng truy cập vào một số phần nhất định của hệ thống tệp bằng cách đặt danh sách kiểm soát truy cập . Ví dụ: để đảm bảo rằng người dùng abcdkhông thể truy cập bất kỳ tệp nào trong /home:

setfacl -m user:abcd:0 /home

Cách tiếp cận này đơn giản, nhưng bạn phải nhớ chặn quyền truy cập vào mọi thứ mà bạn không muốn abcdcó thể truy cập.

Chroot

Để có được quyền kiểm soát tích cực đối với những gì abcdcó thể nhìn thấy, hãy thiết lập một chroot , tức là giới hạn người dùng trong một cây con của hệ thống tập tin.

Bạn cần tạo tất cả các tệp mà người dùng cần (ví dụ mysqlvà tất cả các phụ thuộc của nó, nếu bạn muốn người dùng có thể chạy mysql) theo chroot. Nói đường dẫn đến chroot là /home/restricted/abcd; các mysqlchương trình cần phải được phát hành theo /home/restricted/abcd. Một liên kết tượng trưng chỉ ra bên ngoài chroot là không tốt vì tra cứu liên kết tượng trưng bị ảnh hưởng bởi nhà tù chroot. Trong Linux, bạn có thể sử dụng tốt các liên kết gắn kết:

mount --rbind /bin /home/restricted/abcd/bin
mount --rbind /dev /home/restricted/abcd/dev
mount --rbind /etc /home/restricted/abcd/dev
mount --rbind /lib /home/restricted/abcd/lib
mount --rbind /proc /home/restricted/abcd/proc
mount --rbind /sbin /home/restricted/abcd/sbin
mount --rbind /sys /home/restricted/abcd/sys
mount --rbind /usr /home/restricted/abcd/usr

Bạn cũng có thể sao chép các tệp (nhưng sau đó bạn sẽ cần lưu ý rằng chúng được cập nhật).

Để hạn chế người dùng vào chroot, hãy thêm một ChrootDirectorylệnh /etc/sshd_config.

Match User abcd
    ChrootDirectory /home/restricted/abcd

Bạn có thể kiểm tra nó với: chroot --userspec=abcd /home/restricted/abcd/ /bin/bash

Khung bảo mật

Bạn cũng có thể sử dụng các khung bảo mật như SELinux hoặc AppArmor. Trong cả hai trường hợp, bạn cần viết một cấu hình khá tinh tế, để đảm bảo bạn không để lại bất kỳ lỗ hổng nào.


Không thể dễ dàng hơn nhiều trong việc cấp quyền đọc và ghi cho một thư mục cụ thể thông qua việc tạo các nhóm? Ví dụ, anh ta có thể tạo một nhóm mới và sử dụng chown để biến chủ sở hữu nhóm thư mục thành nhóm được tạo và thêm người dùng vào nhóm. Cuối cùng cung cấp cho thư mục quyền đọc và ghi cho các nhóm.
Qasim

@Qasim Điều đó yêu cầu tất cả các tệp phải có quyền và quyền sở hữu được đặt theo mong muốn. Có rất nhiều điều có thể sai (các tệp được sao chép từ nơi khác hoặc được trích xuất từ ​​kho lưu trữ với quyền của họ được bảo tồn, các tệp cần thuộc về nhóm khác, các tệp không thể đọc được theo nhóm, người dùng mắc lỗi hoặc có thể ' không bị làm phiền để đảm bảo khả năng truy cập của nhóm vẫn như mong muốn) mà các nhóm không thực sự giải quyết vấn đề này.
Gilles 'SO- ngừng trở nên xấu xa'

Ý tôi là tôi không thấy các tập tin sẽ phải có quyền riêng như thế nào nếu quyền của nhóm trong thư mục được đặt theo cách mà không người dùng nào có thể "cd" vào thư mục hoặc "ls" thư mục.
Qasim

@Qasim Mọi tập tin dưới /var/www/allowfoldervà thư mục con của nó phải có thể truy cập được, không chỉ /var/www/allowfolderriêng nó. Và ngược lại, các tập tin khác không thể truy cập được. Trên thực tế, một giải pháp chỉ dựa trên quyền truy cập tệp và ACL không thể đáp ứng hoàn toàn các yêu cầu: ít nhất nó sẽ cho phép người dùng kiểm tra xem tên đã cho có tồn tại hay không /var/www, vì họ cần phải có quyền /var/wwwtruy cập x /var/www/allowfolder.
Gilles 'SO- ngừng trở nên xấu xa'

Ồ ok tôi hiểu nhưng nếu chúng tôi loại trừ thư mục / var khỏi điều này và giả sử chúng tôi đang nói về một thư mục bình thường trong thư mục / home / user?
Qasim

5

Bạn nên sử dụng chroot. Các chrootlệnh thay đổi thư mục gốc mà tất cả các tiến trình con xem. Tôi sẽ đưa ra một ví dụ để chứng minh cách nó hoạt động.

Điều này đã được viết tại chỗ; Tôi không thực sự đứng trước một máy UNIX ngay bây giờ. Trong ví dụ này, có một thư mục có tên dirvới ba tác phẩm: a, b, c, và ls. Ba đầu tiên là các tập tin thường xuyên. lslà một liên kết cứng đến lsnhị phân thực để chúng ta có thể liệt kê các tệp khi ở trong chroot.

Tôi sẽ đi chrootvào dir. (Lưu ý rằng tôi có thể quên một số thư mục trong thư mục gốc.)

Đây là thiết lập, ở dạng đầu ra shell:

$ pwd
/home/alex/test
$ l
dir
$ ls dir
a b c ls
$ ./ls dir # does the same thing
a b c ls
$ ls /
bin boot dev etc home mnt media proc sbin sys usr var

Bây giờ tôi sẽ chrootvào dir. Đối /bin/bashsố chọn quá trình nên được chạy với thư mục gốc mới. Nó mặc định là /bin/sh.

$ chroot /bin/bash dir
$ # this prompt is now from a subprocess running in the new root directory
$ PATH=/ ls
a b c ls
$ pwd
/

Bây giờ chúng tôi thoát khỏi chroot:

$ exit
$ # this prompt is now from the original bash process, from before the chroot
$ pwd
/home/alex/test

Tôi hy vọng điều này minh họa cách chroothoạt động của lệnh. Về cơ bản những gì bạn phải làm để giải quyết vấn đề của mình là chạy một chrootlệnh như người dùng đó mỗi khi họ đăng nhập. Có lẽ đặt nó trong một kịch bản khởi động?

Một liên kết cứng đến một tệp sẽ tiếp tục hoạt động bên trong một chroot, ngay cả khi tệp đó không thể được truy cập bằng các phương tiện khác (điều này hoạt động vì các liên kết cứng trỏ đến inodes, không phải đường dẫn). Vì vậy, để cho phép người dùng truy cập, ví dụ mysqllệnh, bạn sẽ thực thi:

ln /usr/bin/mysql /path/to/chroot/target

Nhưng điều này có yêu cầu tôi thiết lập toàn bộ môi trường chroot với tất cả các liên kết không? Sẽ không dễ dàng hơn để chạy một lệnh để người dùng mới không có quyền truy cập vào các thư mục khác, nhưng các chương trình như apache không mất quyền truy cập vào chúng?
Manishearth

Về cơ bản, có cách nào (thông qua chmod) khiến người dùng mất quyền truy cập đọc vào phần còn lại của fs mà không ảnh hưởng đến quyền truy cập của người dùng khác không?
Manishearth

@M Biếnearth không có cách nào đơn giản với chmod. khi bạn nói "sẽ không dễ dàng hơn để chạy lệnh ... đừng mất quyền truy cập vào chúng", lệnh đó là chroot. nếu bạn giải thích ý của bạn là "toàn bộ môi trường chroot", hoặc tại sao điều này sẽ là một vấn đề, có lẽ tôi sẽ hiểu rõ hơn. (lưu ý rằng bạn có thể cấp quyền truy cập vào tất cả các tệp thực thi với một oneliner ln /bin/* /path/to/chroot/target:)
strugee

@Mearearth nếu ví dụ của tôi không có ý nghĩa, tôi khuyến khích bạn chơi với chrootchính mình hoặc cho tôi biết điều gì không có ý nghĩa. thậm chí tốt hơn, làm cả hai. (và đọc các trang hướng dẫn.)
strugee 18/11/13

@M Biếnearth nếu câu trả lời này đã giúp bạn đủ để dẫn bạn đến câu trả lời, bạn nên xem xét chấp nhận nó.
strugee
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.