Cách cho phép người dùng chuyển tập tin sang người dùng khác trên linux


10

Chúng tôi có một môi trường gồm vài nghìn người dùng đang chạy các ứng dụng trên khoảng 40 cụm có kích thước từ 20 nút tính toán đến 98.000 nút tính toán. Người dùng trên các hệ thống này tạo các tệp lớn (đôi khi> 1PB) được kiểm soát bởi các quyền unix truyền thống (ACL thường không có sẵn hoặc thực tế do tính chất chuyên biệt của hệ thống tệp).

Chúng tôi hiện có một chương trình gọi là "cho", đây là chương trình gốc tự do cho phép người dùng "cung cấp" tệp cho người dùng khác khi quyền của nhóm không đủ. Vì vậy, một người dùng sẽ nhập một cái gì đó như sau để cung cấp một tệp cho người dùng khác:

> give username-to-give-to filename-to-give ...

Sau đó, người dùng nhận có thể sử dụng lệnh gọi là "lấy" (một phần của chương trình cho) để nhận tệp:

> take filename-to-receive

Các quyền của tệp sau đó được chuyển giao hiệu quả cho người dùng nhận.

Chương trình này đã xuất hiện trong nhiều năm và chúng tôi muốn xem xét lại mọi thứ từ quan điểm bảo mật và chức năng.

Kế hoạch hành động hiện tại của chúng tôi là loại bỏ mục tiêu bit trong triển khai "cho" hiện tại của chúng tôi và đóng gói nó dưới dạng một ứng dụng nguồn mở trước khi chúng tôi triển khai lại nó vào sản xuất.

Có ai có phương pháp khác mà họ sử dụng để chuyển các tệp cực lớn giữa những người dùng khi chỉ có quyền unix truyền thống không?


1
Có một số lý do tại sao bạn không thể tạo một thư mục chia sẻ nơi tất cả người dùng có quyền truy cập?
Zoredache

1
Nếu có một thư mục có quyền truy cập được chia sẻ, thì người dùng không được phép sẽ có quyền truy cập vào các tệp khi chúng được chia sẻ. Trong môi trường này, đôi khi tên tệp cũng nhạy cảm. Vì vậy, thật không may, một thư mục chia sẻ không phải là một lựa chọn. Với một thư mục được chia sẻ, cũng có khả năng người dùng thứ ba giả mạo tệp.
Jon Bringhurst

Sẽ không đủ một công việc định kỳ sẽ sao chép các tập tin? Ví dụ: người dùng foo muốn cung cấp thanh tập tin cho người dùng con chó con. Vì vậy, anh ta tạo thư mục chuyên biệt được quét bởi cron job với tệp 'control' có chứa tên người dùng. Các công việc cron sẽ đọc tệp 'control' này, nếu người dùng ổn, thư mục đích có không gian là OK, bản sao. Bạn vẫn có thể tạo một trình bao bọc cho 'cho' để chỉ tạo tệp 'điều khiển' để có khả năng tương thích lịch sử. Không cần suid-root, bạn có thể sao chép tệp đó dưới người dùng không phải root và sau đó sudo để thay đổi quyền sở hữu.
jirib

Nếu bạn chỉ muốn thay đổi quyền, chownnên làm điều đó .. Có vẻ như bạn cũng muốn sao chép tệp, một khi cả hai bên liên quan đã đồng ý.
zebediah49

@JiriXichtkniha Tôi thích ý tưởng về tệp điều khiển và công việc định kỳ. Tuy nhiên, các tệp quá lớn để được sao chép.
Jon Bringhurst

Câu trả lời:


1

Nếu trình phát thực sự sẵn sàng cung cấp tệp đi, bạn có thể sử dụng tệp nhị phân SUID để chuyển tệp sang thư mục có thể ghi được bởi tất cả và có bit dính (như /tmp), sau đó thay đổi quyền sở hữu cho chủ sở hữu mới. chown(3)đã quan tâm đến việc loại bỏ set-user-IDset-group-IDbit cho bạn. Bằng cách này, chủ sở hữu mới có thể làm những gì anh ta muốn với tệp, bao gồm cả việc di chuyển nó.

Tất cả thư mục này có thể ghi có thể thuộc về thư mục chính của người dùng, trong trường hợp bạn muốn sử dụng nhiều hệ thống tệp cho các thư mục chính và muốn đảm bảo rằng bạn không vượt qua ranh giới hệ thống tệp vì hiệu suất sẽ rất tệ. Trong trường hợp này, có lẽ bạn sẽ muốn đảm bảo người nhận biết khi nào tệp mới được cung cấp.

E-mail sẽ thực hiện các mẹo. Một giải pháp Unixy hơn sẽ là một /etc/profiledanh sách liệt kê các tệp mới được phân phối của bạn. Đã thêm phần thưởng nếu bạn cung cấp tính năng này với pam_echo( ví dụ với file=/tmp/deliveries/%u, xem pam_echo(8)). Như với bất kỳ điều gì liên quan đến PAM, trước tiên bạn muốn kiểm tra xem tất cả các triển khai của bạn có cung cấp một mô-đun như vậy không.


0

Bạn có thể sử dụng một hệ thống với một thư mục dùng chung, (có thể không thực thi perm.), Trong đó mọi thứ cho một người dùng nhất định được lưu trữ với cấu trúc tên tệp cụ thể ( to-$username_from-$username.tarví dụ). Đưa ra làm cho tập tin và chownsnó cho người dùng mục tiêu; trích xuất các tập tin và loại bỏ nó.

Nếu bạn muốn thực hiện như một động thái thực sự (IE, thay đổi vị trí và quyền của tệp; không sao chép vì kích thước tệp khổng lồ), bạn có thể thoát khỏi việc chuyển sang thư mục dùng chung với -x perms (vì vậy không ai có thể liệt kê các tập tin ở đó), và cùng một chownphương pháp. mv, chown/ mv.


0

Như xryl669 nói rằng bạn có thể sử dụng một thư mục để thực sự chia sẻ các tệp. Nó sẽ giống như thế này:

$ ls -ld shared
drwxrws--- 2 root usergroup 4096 somedate shared
$ ls -l shared
drwx-wx--- 2 user1 usergroup 4096 somedate user1
drwx-wx--- 2 user2 usergroup 4096 somedate user2
drwx-wx--- 2 user3 usergroup 4096 somedate user3
drwx-wx--- 2 user4 usergroup 4096 somedate user4

Lệnh give trở thành

#!/bin/sh
#Use a random suffix to prevent guessing
RANDOM=$(dd if=/dev/urandom count=4 2> /dev/null | sha512sum | cut -d' ' -f1)
NEWNAME=/path/to/shared/$2/$1$RANDOM
#Move the file
mv $1 $NEWNAME
#Make it readable
chmod 440 $NEWNAME

Lệnh Take trông giống như thế này:

$ cd /path/to/shared/user
$ ls
...
$ mv somefile ~

0

Tôi đề nghị viết lại ứng dụng để thực sự bắt chước một "cho" và "nhận", nhưng thay vì "đẩy" và "kéo" nó từ một thư mục được bảo vệ. Thư mục của bạn chỉ có thể được truy cập cho ứng dụng đẩy / kéo - xử lý việc di chuyển tệp. Ngoài ra, ứng dụng / tập lệnh của bạn có thể tạo một thư mục tạm thời, ngẫu nhiên với các quyền được đặt chỉ cho người gửi và người nhận.

Muốn có thêm an ninh? Bạn có thể PGP mã hóa / ký tên tệp (sử dụng khóa chung của người nhận).

Về mặt làm lại nó từ "quan điểm bảo mật và chức năng", tôi thực sự khuyên bạn không nên tạo các chương trình SUID. Nếu bạn không bỏ đặc quyền theo cách thích hợp, bạn hầu như có thể truy cập bất kỳ tệp nào trên hệ thống. Nếu chương trình của bạn bị lỗi (tràn bộ đệm, v.v ...) - người ta có thể khai thác điều này để có quyền truy cập root trên hệ thống của bạn.


0

Điều này có thể không hữu dụng với bạn nhưng đối với mục tiêu nguồn tham chiếu cp --reflink sẽ sao chép các tệp mỏng bằng cách sao chép trên ghi.

Điều này có nghĩa là bạn có thể sao chép tệp hoàn toàn và chỉ các khối thay đổi sẽ thực sự được sao chép. Không giống như một liên kết cứng, tệp mới có inode và siêu dữ liệu riêng, nghĩa là bạn có thể cung cấp bản sao của tệp cho người dùng mới bằng cách sử dụng công cụ chown tiêu chuẩn.

Theo như tôi biết thì đây là một tính năng chỉ có trên OCFS2 và btrfs hiện tại. Tôi đoán điều đó không giải quyết được vấn đề của bạn nhưng vì sự sẵn có của nó không phổ biến nên có lẽ nó sẽ không hữu ích.

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.