Cho phép chủ sở hữu tạo và đọc tệp, nhưng không sửa đổi hoặc xóa


17

Tôi muốn cung cấp cho người dùng quyền để tạo và đọc các tệp trong một thư mục cụ thể, nhưng không sửa đổi hoặc xóa các tệp. Nếu người dùng có thể chắp thêm vào các tập tin thì không, nhưng tôi thì không. Đây là trên Ubuntu Linux.

Tôi nghĩ điều này là không thể với các quyền của tệp Unix tiêu chuẩn, nhưng có lẽ điều này là có thể khi sử dụng ACL? Người dùng sẽ luôn kết nối bằng SFTP, vì vậy nếu có cách nào đó để kiểm soát điều này trong SFTP (trái với quyền của HĐH) thì sẽ ổn.

Để hoàn toàn rõ ràng, tôi muốn như sau:

  • echo hello> test # thành công, vì thử nghiệm không tồn tại và cho phép tạo
  • echo hello >> test # có thể thành công hay thất bại, tùy thuộc vào việc cho phép nối thêm
  • echo hello2> test # fail, vì test đã tồn tại và không được phép sửa đổi
  • thử nghiệm mèo # thành công, vì đọc được cho phép
  • kiểm tra rm # không thành công, vì xóa không được phép

Nếu bạn đang tự hỏi tại sao tôi muốn làm điều này, thì đó là để tạo một hệ thống sao lưu dự phòng trùng lặp với Ransomware.


1
Các tập tin luôn được tạo trống. Khi bạn làm echo > test, shell sẽ open("test", O_WRONLY|O_CREAT|O_TRUNC)tạo một tệp và sau đó gọi echonội dung đó để sửa đổi nó. Bây giờ bạn chỉ có thể cho phép mở (WR) đầu tiên thành công.
Stéphane Chazelas

@ StéphaneChazelas - được chỉnh sửa để làm rõ rằng việc nối thêm được cho phép
pyj28

Câu trả lời:


16

Bạn có thể sử dụng bindfsnhư:

$ ls -ld dir
drwxr-xr-t 2 stephane stephane 4096 Aug 12 12:28 dir/

Thư mục đó thuộc sở hữu của stephane, với stephane nhóm (stephane là thành viên duy nhất của nó). Cũng lưu ý trằng ngăn người dùng đổi tên hoặc xóa các mục mà họ không sở hữu.

$ sudo bindfs -u root -p u=rwD,g=r,dg=rwx,o=rD dir dir

Chúng tôi bindfs dirvượt qua chính nó với quyền sở hữu cố định và quyền cho các tập tin và thư mục. Tất cả các tệp xuất hiện thuộc sở hữu của root(mặc dù bên dưới trong thư mục thực chúng vẫn thuộc sở hữu của stephane).

Thư mục nhận được drwxrwxr-x root stephanequyền trong khi các loại tệp khác có được -rw-r--r-- root stephane.

$ ls -ld dir
drwxrwxr-t   2 root     stephane   4096 Aug 12 12:28 dir

Bây giờ tạo một tệp hoạt động vì thư mục có thể ghi:

$ echo test > dir/file
$ ls -ld dir/file
-rw-r--r-- 1 root stephane 5 Aug 12 12:29 dir/file

Tuy nhiên, không thể viết lần thứ hai open()vào tệp đó vì chúng tôi không có quyền trên đó:

$ echo test > dir/file
zsh: permission denied: dir/file

(lưu ý rằng việc nối thêm không được phép ở đó (vì không phải là một phần của yêu cầu ban đầu của bạn)).

Một hạn chế: trong khi bạn không thể xóa hoặc đổi tên các mục nhập dirtbit, các thư mục mới mà bạn tạo trong đó sẽ không có tbit đó , vì vậy bạn sẽ có thể đổi tên hoặc xóa các mục ở đó.


Thật là tuyệt vời! Cảm ơn bạn đã dành thời gian để đưa ra một giải pháp thanh lịch như vậy. Tôi đã nghe nói về bindfs trước đây, nhưng đây là lần đầu tiên tôi thực sự sử dụng nó.
pyjama

4

Các chattr +atùy chọn sẽ cho phép chỉ phụ thêm. Các tệp có thể được thay đổi theo cách đó, nhưng chỉ bằng cách thêm (tức là nối thêm các dòng) vào chúng. Bạn không thể xóa các tệp hiện có, nhưng tạo các tệp mới. Điều này có thể phù hợp với nhu cầu của bạn:

sudo chattr -R +a /dir/to/apply/to

từ man chattr

Một tập tin với tập thuộc tính `a 'chỉ có thể được mở trong chế độ chắp thêm để ghi. Chỉ có siêu người dùng hoặc một quá trình sở hữu khả năng CAP_LINUX_IMMUTABLE mới có thể đặt hoặc xóa thuộc tính này.

(lưu ý rằng nó cũng áp dụng cho các thư mục)

Vì vậy, danh sách của bạn sẽ trông như sau:

echo hello > test # succeeds, because test doesn't exist, and creation is allowed
echo hello2 > test # fails, because test already exists, and overwriting is not allowed
echo hello3 >> test # succeeds, because appending is allowed
cat test # succeeds, because reads are allowed
rm test # fails, because delete is not allowed

Ok, điều này nghe có vẻ hứa hẹn. Nó ngăn chặn chính xác việc xóa và nếu một tệp có thuộc tính, nó sẽ ngăn ghi đè. Tuy nhiên, khi các tệp mới được tạo, chúng không tự động lấy thuộc tính. Có một số cách để có điều này xảy ra tự động?
pyj28

Nếu thư mục có thuộc tính, các tệp sẽ hoạt động tương ứng mặc dù không có thuộc tính được đặt rõ ràng. Vấn đề là các tập tin trong thư mục con mới. Ví dụ: dir1 là chattr +asau đó tôi có thể tạo một tệp, không được phép xóa nó, có thể chắp thêm. Nếu tôi tạo dir1 / dir2 thì tôi có thể làm như tôi muốn VÀO dir2
Fiximan

1
Thật không may là không: dpaste.com/042XQ7X
pyj28

Aahh, xin lỗi - tôi đã làm một bài kiểm tra sai trước đó
Fiximan

@ Paj28 liên kết của bạn bị hỏng :-(
mjaggard
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.