Đọc các tập tin thuộc sở hữu của người dùng khác là không root


9

Tôi đang sao lưu máy chủ trên một máy chủ dự phòng. Mỗi máy chủ được sao lưu có tài khoản riêng trên máy chủ dự phòng và các tệp được rsynced. Điều quan trọng là các quyền vẫn còn nguyên (sử dụng rsync -p) để đơn giản hóa khôi phục.

Tôi đang cố gắng tạo một tập lệnh có thể đọc các tập tin và tạo một số thống kê. Tôi không thích tập lệnh đó chạy dưới người dùng root và cũng không thể chạy tập lệnh đó cho mọi người dùng sao lưu, vì tập lệnh có thể đọc tất cả các tập tin từ tất cả người dùng. Tuy nhiên, điều này tạo ra một vấn đề khi một tập tin được ví dụ 600. Tôi không muốn chạm vào quyền, nhưng một người dùng khác ngoại trừ root và chủ sở hữu không thể đọc nó.

Một người dùng cụ thể - không root - sẽ có thể đọc tất cả các tệp trong một thư mục hoặc phân vùng, bất kể mức độ cho phép (và chủ sở hữu của các tệp sẽ không có cách nào để ngăn chặn nó). Có cách nào để đạt được điều này? Tôi đang chạy FreeBSD với âm lượng ZFS.


Đây là câu hỏi đầu tiên của tôi trong trang web này :) Có lẽ bạn cũng có thể xem qua điều này. unix.stackexchange.com/questions/91488/ Ấn
Ramesh

Câu trả lời:


4

Sử dụng sudo.

Nếu sudoerstệp của bạn liệt kê một lệnh chính xác và cụ thể thì lệnh phải được gọi chính xác như được liệt kê trong sudoershoặc nó sẽ bị từ chối.

Ví dụ:

backupuser  ALL=(root) /usr/bin/rsync -aH /files/to/backup/ /copy/of/backup/

Trong ví dụ này, người dùng backupcó thể thực thi lệnh chính xác như được hiển thị:

sudo /usr/bin/rsync -aH /files/to/backup/ /copy/of/backup/

Nếu họ gọi sudo rsync...thay vì sudo /usr/bin/rsynclệnh thất bại, hoặc nếu cờ hoặc đường dẫn khác nhau thì lệnh thất bại.

Nếu bạn đang thực hiện điều này trong một tập lệnh thì bạn muốn cho phép sử dụng các lệnh đó không cần mật khẩu:

backupuser  ALL=(root) NOPASSWD: /usr/bin/rsync -aH /files/to/backup/ /copy/of/backup/

Để biết thêm xem sudoers(5)trang người đàn ông dưới Cmnd_list.


Ý tưởng tuyệt vời. Tôi đã thêm các lệnh ls, cat, head, tail, v.v. vào tệp sudoers và bây giờ có thể thực thi chúng với quyền root và đọc tất cả các tệp. Có thể không phải là giải pháp tốt nhất cho mọi người, vì người dùng có thể đọc tất cả các tệp trên hệ thống, nhưng đó không phải là vấn đề trong thiết lập của tôi.
Evianon

Chà, nếu bạn đang sử dụng Solaris, tôi sẽ gợi ý RBAC và pfexec. Nhưng vì bạn đang ở trên BSD, sudosẽ phải làm.
bahamat

4

Bạn có thể viết một suidphiên bản catchỉ có thể thực hiện được bởi người dùng sao lưu của bạn (tạo một nhóm dành riêng cho người dùng sao lưu và làm cho chỉ có thể đọc được bởi nhóm đó). Điều này catsẽ chỉ cho phép bạn đọc các tệp trong thư mục mà bạn quan tâm. (Bạn có thể muốn không cho phép các liên kết tượng trưng và xem ra các thủ thuật như /dir/../otherdir/.)

Sau đó, tập lệnh của bạn có thể sử dụng tệp thực thi này để đọc tệp mà không cần quyền root.


4

CẢNH BÁO: Như Stephane đã chỉ ra trong các bình luận bên dưới, chủ sở hữu của các tệp sẽ vẫn có thể thu hồi ACL.

Nếu bạn có quyền truy cập root vào máy, bạn có thể thực hiện việc này với ACL :

setfacl -R -m u:USERNAME:r /path/to/direcory

Điều này sẽ cho phép sử dụng USERNAMEtruy cập đọc vào tất cả các tập tin và thư mục dưới /path/to/directory.


Chủ sở hữu của các tệp vẫn có thể xóa các ACL đó.
Stéphane Chazelas

@StephaneChazelas oh. Ngay cả khi điều này đã được thực hiện bởi root? Tôi đã không nhận ra điều đó. Bạn có biết cách nào xung quanh nó?
terdon

Không, trên Linux tôi đã xem xét sự kết hợp giữa các khả năng của Linux và LSM. Trên FreeBSD tôi không có ý tưởng.
Stéphane Chazelas

1

Bindfs là một hệ thống tập tin FUSE cung cấp các khung nhìn của cây thư mục với các quyền và quyền sở hữu khác nhau. Không có cổng cho FreeBSD, nhưng bạn có thể biên dịch từ nguồn.

Để cung cấp cho người dùng backupper(và chỉ người dùng đó) chế độ xem /some/filestất cả các tệp có thể đọc được, hãy gắn chế độ xem dễ đọc trên thế giới /some/filestrong một thư mục riêng của backupper.

mkdir -p ~backupper/spyglass/files
chown backupper ~backupper/spyglass
chmod 700 ~backupper/spyglass
bindfs -p a+rX-w /some/files ~backupper/spyglass/files

0

ZFS có một số cơ chế cho việc này.

Một trong những cơ chế vẫn đang hoạt động và chưa được triển khai, nhưng cho phép tập dữ liệu được gắn với ghi đè 'chủ sở hữu'. Trong trường hợp này, bạn có thể sao chép một ảnh chụp nhanh, gắn kết nó với chủ sở hữu được ghi đè lên người dùng sao lưu, sao lưu nó, sau đó phá hủy bản sao. Nhược điểm là bạn không sao lưu quyền sở hữu thực sự của các tệp.

Giải pháp tốt nhất có lẽ là các ACL kiểu ZFS nfsv4


0

Tôi có hai ý tưởng về cách giải quyết vấn đề này bằng các công nghệ dành riêng cho FreeBSD, mặc dù tôi cũng chưa thử:

  • Sử dụng Capsicum. Đây là phương pháp ưa thích của tôi. Ngoài ra, vì gần đây nó đã được chuyển sang Linux, nên nó cũng hoạt động ở đó. Nó sẽ diễn ra như thế này:

    1. Tạo lệnh drop-cap-write làm giảm CAP_WRITE sau đó thực thi lệnh được cung cấp trên dòng lệnh
    2. Sử dụng sudo để cho phép người dùng sao lưu thực thi lệnh đó mà không cần mật khẩu
    3. Tùy chọn, sử dụng chỉ thị ForceCommand của sshd_config để tự động thực thi lệnh đó bất cứ khi nào người dùng sao lưu đăng nhập. Bằng cách đó, người dùng từ xa sẽ không cần chỉ định drop-cap-write trong tập lệnh sao lưu của mình.
  • Sử dụng kiểm soát truy cập bắt buộc. Điều này không hoạt động trên Linux AFAIK và việc cài đặt sẽ khó khăn hơn. Nó sẽ diễn ra như thế này:

    1. Tạo một bản sao lưu dự phòng có rootdir là /. Mã cứng các jailid.
    2. chạy sshd trong nhà tù dự phòng. Cho phép root đăng nhập tại đây, ngay cả khi bạn không cho phép đăng nhập root trong sshd thông thường
    3. Đặt ugidfw_enable = "CÓ" trong /etc/rc.conf
    4. Sử dụng quy tắc ugidfw trông giống như thế này:

    ugidfw thêm chủ đề uid rootidid BACKUP_JAIL_ID chế độ rsx

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.