Làm cho tất cả các tệp trong một thư mục chỉ đọc mà không thay đổi quyền?


7

Đầu tiên, một số nền tảng:

  • / dev / md1 là mảng RAID-0 đóng vai trò lưu trữ tệp chính. Nó được gắn vào / var / smb.
  • / dev / md2 là một snapshot sao lưu lưu trữ mảng RAID-0 được lấy từ / dev / md1. Nó được gắn vào / var / smb / snapshots.
  • Ba thư mục được cung cấp qua Samba: / var / smb / files (tệp chia sẻ công khai), / var / smb / private (tệp riêng) và / var / smb / snapshots (cung cấp quyền truy cập chỉ đọc vào ảnh chụp nhanh sao lưu).

Chỉ người dùng trong nhóm smbusers mới được phép truy cập vào các tệp và chia sẻ ảnh chụp nhanh; tương tự, chỉ những người dùng trong nhóm smbprivate mới được phép truy cập các tệp ở chế độ riêng tư. Ngoài ra, các quyền của Linux cấm người dùng không thuộc các nhóm tương ứng truy cập vào các tệp và thư mục riêng, cả trên hệ thống cục bộ và trong các ảnh chụp nhanh mà Samba chia sẻ.

Điều này thật tuyệt, vì điều đó có nghĩa là chúng tôi có một máy chủ tệp đầy đủ chức năng với tùy chọn "khôi phục từ bản sao lưu" tự trợ giúp (người dùng chỉ cần truy cập vào chia sẻ ảnh chụp nhanh và truy xuất (các) tệp mà họ muốn tự khôi phục), nhưng vì vậy Tôi thiếu một thành phần chính: Truy cập không root trên hệ thống cục bộ vào thư mục / var / smb / snapshots.

Các ảnh chụp nhanh phải được đọc hoàn toàn chỉ cho tất cả người dùng thông thường, tuy nhiên tất nhiên hệ thống tệp phải được gắn đọc-ghi để cho phép hoạt động sao lưu diễn ra. Các quyền trên các thư mục này hiện đang:

root@odin:/var/smb# ll
total 40
drwxrwxr-x  7 root   root        4096 2011-04-11 15:18 ./
drwxr-xr-x 14 root   root        4096 2011-04-10 19:07 ../
drwxrwx--- 15 kromey smbusers    4096 2010-12-07 13:09 files/
drwxrwx---  7 kromey smbprivate  4096 2010-04-07 07:08 private/
drwxrwx---  3 root   root        4096 2011-04-11 15:16 snapshots/

Bây giờ, những gì tôi muốn là cung cấp quyền truy cập vào thư mục snapshots cho người dùng không phải root, nhưng theo cách chỉ đọc nghiêm ngặt. Tuy nhiên, tôi không thể mount / dev / md2 chỉ đọc, vì tôi phải đọc nó để chạy sao lưu; Tôi không thể đơn giản gắn lại nó đọc-ghi cho một bản sao lưu và sau đó gắn lại nó thành chỉ đọc, bởi vì nó cung cấp một cửa sổ thời gian khi các bản sao lưu có thể được ghi bởi người dùng khác.

Trước đây tôi đã làm điều này bằng cách làm cho thư mục ảnh chụp nhanh của mình trở thành xuất NFS chỉ đọc (chỉ sang localhost) và gắn cục bộ đó (bản gốc được bảo mật dưới một thư mục thiếu quyền truy cập cho người dùng không phải root), nhưng dường như đây là một vụ hack và dường như có giống như có một cách tốt hơn để thực hiện điều này. Tôi đã thử mount --bindtùy chọn này, nhưng dường như thiếu khả năng có các cấp truy cập khác nhau (tức là chỉ đọc so với đọc-ghi) trên hai thư mục (trừ khi tôi thiếu một cái gì đó mount -r --bind dir1 dir2:).

Bất kỳ ý tưởng nào làm thế nào tôi có thể thực hiện điều này mà không cần NFS, hoặc đó là lựa chọn tốt nhất của tôi?

TL; DR: Làm cách nào tôi có thể cung cấp nội dung của hệ thống tệp có thể đọc ghi cho người dùng đã chọn, nhưng chỉ đọc nghiêm ngặt cho mọi người khác, trong khi vẫn duy trì quyền và quyền sở hữu ban đầu trên các tệp được sao lưu vào hệ thống tệp này?


Có thể làm điều này bằng cách sử dụng acl, có lẽ? Ngoài đỉnh đầu của tôi, đó có vẻ là một cách tự nhiên, vì acl là một phần mở rộng của quyền unix tập tin. Ngoài ra, acl tồn tại bên cạnh các quyền unix tiêu chuẩn.
Faheem Mitha

@Faheem Phải thừa nhận rằng tôi không biết có thể thực hiện được hay không bằng acl, nhưng tôi nghi ngờ là không, vì một trong những yêu cầu của tôi ở đây là bảo vệ các quyền hiện có (để người dùng dễ dàng khôi phục tệp từ bản sao lưu mà không cần phải có để thay đổi quyền một lần nữa khi họ làm như vậy) trong khi cũng làm cho toàn bộ chỉ đọc. Tôi biết, điều đó nghe có vẻ mâu thuẫn, nhưng nhờ có sự giúp đỡ của Gilles bên dưới, tôi đã có câu trả lời cho nó.
Kromey

acl có thể ghi đè các quyền unix mà không thay đổi chúng. Ý tưởng là khi người dùng sao chép lại nội dung, họ có các cờ cấp phép giống như bản sao lưu gốc của họ, phải không? Vì vậy, bạn có thể đặt acl thành bất kỳ quyền nào bạn muốn cho bất kỳ người dùng nào. Nếu một mục nhập acl được đặt, nó sẽ bỏ qua quyền unix tương ứng mà không thay đổi nó. Xem man aclđể biết chi tiết.
Faheem Mitha

@Faheem Các quyền acl bổ sung có hiệu quả "biến mất" khi tệp được sao chép ra khỏi bản sao lưu không? Nếu các quyền acl "dính" vào tệp khi nó được di chuyển, thì thực sự không có vấn đề gì (bỏ qua) các bit quyền Unix bên dưới là không thay đổi. Tuy nhiên, tôi sẽ xem xét nó như một giải pháp đơn giản hơn có thể ...
Kromey

Các quyền acl được đặt trên đường dẫn thư mục, vì vậy, chúng sẽ "biến mất" nếu tệp được di chuyển ra ngoài. :-) Và tôi không nghĩ rằng bất kỳ công cụ unix tiêu chuẩn nào cố gắng duy trì chúng không giống như cp -abảo vệ các quyền unix, ví dụ, vì nói chung nó sẽ không có ý nghĩa. aclkhông được hỗ trợ nói chung. Nhân phải hỗ trợ nó & bạn phải kích hoạt nó trên hệ thống tập tin khi bạn gắn kết nó, dưới dạng tùy chọn gắn kết.
Faheem Mitha

Câu trả lời:


6

Câu trả lời này hoạt động trên Debian (được thử nghiệm trên lenny và bóp). Sau khi điều tra, nó dường như chỉ hoạt động nhờ một bản vá Debian; người dùng các bản phân phối khác như Ubuntu có thể không gặp may.

Bạn có thể sử dụng mount --bind. Gắn kết hệ thống tập tin thực tế trên một thư mục không thể truy cập công khai. Tạo một gắn kết liên kết chỉ đọc mà có thể truy cập rộng rãi hơn. Tạo giá trị gắn kết đọc-ghi cho phần bạn muốn hiển thị với quyền truy cập đọc-ghi.

mkdir /media/hidden /media/hidden/sdz99
chmod 700 /media/hidden
mount /dev/sdz99 /media/hidden/sdz99
mount -o bind,ro /media/hidden/sdz99/world-readable /media/world-readable
mount -o bind /media/hidden/sdz99/world-writable /media/world-writable

Trong trường hợp sử dụng của bạn, tôi nghĩ bạn có thể làm:

mkdir /var/smb/hidden
mv /var/smb/snapshot /var/smb/hidden
mkdir /var/smb/snapshot
chmod 700 /var/smb/hidden
chmod 755 /var/smb/hidden/snapshot
mount -o bind,ro /var/smb/hidden/snapshot /var/smb/hidden/snapshot

Tức là đặt snapshotthư mục thực dưới một thư mục bị hạn chế, nhưng cấp snapshotquyền đọc cho mọi người. Nó sẽ không thể truy cập trực tiếp vì cha mẹ của nó đã bị hạn chế truy cập. Gắn kết nó chỉ đọc ở một vị trí có thể truy cập, để mọi người có thể đọc nó qua đường dẫn đó.

(Các gắn kết liên kết chỉ đọc chỉ có thể trở nên khả thi trong vài năm sau khi các liên kết gắn kết được giới thiệu, vì vậy bạn có thể nhớ một thời gian chúng không hoạt động. Tôi không biết từ khi chúng hoạt động, nhưng chúng đã hoạt động trong Debian lenny (nghĩa là bây giờ đã ổn định).)


Có thể Ubuntu đang đóng gói một mount rất lỗi thời (2.17.2 theo mount -V), nhưng lệnh đó không hoạt động (và theo trang man, bạn không thể thay đổi các tùy chọn gắn kết như một phần của lệnh liên kết). Tuy nhiên, tôi đã có thành công (sau khi đi qua trang người đàn ông cho lần thứ năm mươi) làm mount --bind /var/smb/snapshots /var/smb/testtheo sau mount -o remount,ro /var/smb/test. (Rõ ràng đây là một bài kiểm tra, nếu bạn không thể nói bằng tên thư mục đáng yêu của tôi!)
Kromey

Điều đó thật kỳ lạ: mount 2.13.1 vui vẻ tạo ra một mount liên kết chỉ đọc trên kernel 2.6.32 (nén Debian) và tôi nhớ nó cũng có thể trên 2.6.26 (lenny). Trang người đàn ông đã chính xác một lần nhưng cần cập nhật.
Gilles 'SO- ngừng trở nên xấu xa'

Tôi đã thử mọi hoán vị của các tùy chọn liên kết và ro mà tôi có thể nghĩ đến (tình cờ, "liên kết" không phải là một tùy chọn hợp lệ cho -o, nhưng là một công tắc hợp lệ như --bind hoặc -B), nhưng không đi đến đâu . Hạt nhân 2.6,35 (Ubuntu Maverick Meercat). Có lẽ Debian có một lệnh mount hoàn toàn khác? Nhưng Ubuntu dựa trên Debian, do đó dường như không có khả năng. Đó là một nơi thực sự kỳ lạ để tìm sự khác biệt trong hai bản phát hành này ...
Kromey

@Kromey: Tôi vừa mới thử nghiệm trên Ubuntu 10.04 và mount -o bind,rocũng không hoạt động ở đó. Vì vậy, tôi đoán đây là một bản vá Debian!
Gilles 'SO- ngừng trở nên xấu xa'

1
Tôi chấp nhận câu trả lời của bạn cho câu hỏi này vì a) (rõ ràng, tôi không thể tự xác minh nó) hợp lệ cho Debian (và có thể cả những người khác nữa), và b) nó trực tiếp dẫn tôi đi tìm giải pháp trên Ubuntu. Tuy nhiên, đối với những người tương lai đọc bài này, câu trả lời của Gilles sẽ không hoạt động trên Ubuntu và thay vào đó bạn sẽ cần câu trả lời của tôi.
Kromey

7

@Gilles thực sự rất gần gũi, chỉ hơi khác một chút so với Ubuntu 10.10 (Tôi không có bất kỳ lý do nào để nghi ngờ rằng anh ấy phù hợp với Debian Squeeze, và có thể cả những người khác). Bằng cách gắn thư mục snapshot đọc-ghi của tôi trong thư mục mà người dùng khác không thể truy cập (ví dụ / var / smb / hidden / snapshots, trong đó / var / smb / hidden có quyền 770 và được sở hữu bởi root: root), tôi có thể bảo vệ gắn kết đọc-ghi từ người dùng khác. Sau đó tôi có thể sử dụng mount --bindtheo sau mount -o remount,rođể liên kết gắn kết với một vị trí có thể truy cập, sau đó làm cho nó chỉ đọc.

(Nghịch đảo (gắn hệ thống tệp gốc chỉ đọc, sau đó liên kết nó đọc-ghi) không hoạt động; tương tự, gắn kết chỉ đọc ban đầu, sau đó ràng buộc nó chỉ đọc, sau đó gắn lại việc đọc-ghi ban đầu thư mục ràng buộc cũng đọc-ghi.)

Vì vậy, để tóm tắt lại, đây là giải pháp:

mkdir /var/smb/hidden
chown root:root /var/smb/hidden
chmod 770 /var/smb/hidden
mkdir /var/smb/hidden/snapshots
mksdir /var/smb/snapshots
mount /dev/md2 /var/smb/hidden/snapshots
mount --bind /var/smb/hidden/snapshots /var/smb/snapshots
mount -o remount,ro /var/smb/snapshots

Vì vậy, có một cửa sổ ngắn về thời gian mà các bản sao lưu được đọc và ghi thường có thể truy cập được, nhưng nó đủ nhỏ để có thể sử dụng cho nhu cầu của tôi. Một số mánh khóe với các quyền trên / var / smb có thể bảo vệ nó trong cửa sổ ngắn này (nghĩa là làm cho nó không thể đi qua được, sau đó liên kết gắn kết, sau đó làm cho nó đi qua được một lần nữa), nếu những mili giây ngắn ngủi đó quá lớn.

Bây giờ tôi chỉ cần kết hợp tất cả lại với nhau trong một kịch bản. Đưa nó vào quá trình khởi động ngay sau khi mọi thứ được gắn kết, điều này sẽ tránh mọi xung đột có thể do Samba cố gắng chia sẻ thư mục mà tôi ràng buộc.

Lưu ý: Nếu bản phân phối của bạn hỗ trợ mount -o bind,rophiên bản như Gilles đã đăng, tôi khuyên bạn nên dùng giải pháp đó cho bạn; Giải pháp của tôi là ở đây chỉ nên được sử dụng bởi mọi người trên Ubuntu hoặc các bản phát hành khác không cho phép bạn thay đổi tùy chọn gắn kết khi liên kết với thư mục khác.


2
Tôi quan sát hành vi tương tự (khá khó hiểu!) Như bạn trên Ubuntu 10.04.
Gilles 'SO- đừng trở nên xấu xa'

Người đàn ông, +1! Điều này giúp tôi thực hiện một công việc bận rộn mount như dự định. Nhưng tôi vẫn bối rối.
Camilo Martin
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.