Làm cách nào tôi có thể cho phép người dùng chỉnh sửa một tệp hệ thống cụ thể thường bị hạn chế ở quyền root?


8

Tôi đang cố gắng viết thư cho /etc/network/interfacesngười dùng không có quyền root.

Lý do muốn viết thư này là để cho phép người dùng đặt IP tĩnh vì tôi đang chạy một máy chủ chỉ dòng lệnh. Tôi cần sự cho phép nào để cung cấp cho người dùng etc/sudoers?

Tôi không muốn người dùng có quyền root đầy đủ. Chỉ cần khả năng chỉnh sửa tập tin này.

Câu trả lời:


25

Thay vì sử dụng sudo, chỉ cần đặt ACL trên tệp:

$ ls -l /var/tmp/foo
-rw-rw---- 1 root root 4 Jul 31 15:26 /var/tmp/foo
$ sudo setfacl -m u:white:rw /var/tmp/foo
$ whoami
white
$ cat /var/tmp/foo
bar

Bây giờ tệp được sở hữu bởi 'root' nhưng người dùng 'trắng' có thể đọc và ghi vào nó. Người dùng 'trắng' hiện có thể sử dụng trình chỉnh sửa yêu thích của mình để chỉnh sửa tệp.


Một chút nhầm lẫn. Là /var/tmp/foo= /etc/network/interfaces? Chưa bao giờ thực sự thấy những gì bạn đang cố gắng nói ở đó, tôi khá mới với Linux.
Keith

Nó chỉ là một tập tin. Bạn có thể sử dụng bất cứ tập tin nào bạn muốn.
Jeff White

1
Đẹp. Tôi nghĩ rằng ACL chỉ có thể được sử dụng để hạn chế quyền và không cấp quyền - thật tuyệt khi biết điều đó không đúng!
Rmano

Dường như không được hỗ trợ theo WSL:setfacl: /etc/logrotate.conf: Operation not supported
mở

8

Chuẩn bị một tập lệnh thực hiện chỉnh sửa mà bạn muốn, ví dụ tập lệnh viết tập tin chính xác bằng IP tĩnh (những gì cần đặt trong tập lệnh này nằm ngoài phạm vi của Hỏi & Đáp này). Hãy gọi kịch bản này /root/set_static_ip. (1)

Chỉnh sửa /etc/sudoers(2) ( visudotốt hơn, nó kiểm tra sự tỉnh táo, rất khó để khôi phục hệ thống với tệp sudoers không hợp lệ, thậm chí không thể từ xa (3)) và thêm

user_name_to_authorize ALL=NOPASSWD: /root/set_static_ip 

Bây giờ người dùng có thể sử dụng sudo /root/set_static_ip mà không cần bất kỳ mật khẩu nào được yêu cầu và tập lệnh sẽ chạy với tất cả các đặc quyền; không có lệnh khác sẽ được cho phép.

Nếu bạn muốn người dùng chỉ cần thay thế một tệp bằng bất cứ thứ gì họ muốn, tập lệnh có thể chỉ đơn giản là (gọi nó /root/unsafe-overwrite-interface)

#! /bin/bash -e
#
cp /tmp/temp-iface.txt /etc/network/interfaces 
exit 0

... Và bạn bảo người dùng chỉnh sửa /tmp/temp-iface.txtvà sau đó chạy sudo /root/unsafe-overwrite-interface--- kích hoạt nó trong sudoers như được chỉ định ở trên. Hoặc bạn có thể thêm người dùng vào danh sách ACL và cấp cho họ quyền ghi trên tệp cụ thể .

Nhưng lưu ý rằng nếu bạn không kiểm tra nội dung tệp cho an toàn, sự tàn phá sẽ xảy ra, dù là cố ý hay vô ý.


Chú thích :

(1) kịch bản này phải an toàn nhất có thể. Kiểm tra đầu vào và như vậy. Nó sẽ được thực hiện với sự cho phép đầy đủ.

(2) trong cài đặt sudo hiện đại, bạn có thể thêm một tệp vào /etc/sudoers.d/thư mục tốt hơn --- sẽ tồn tại các bản cập nhật.

(3) Tôi thường giữ một thiết bị đầu cuối với phiên gốc mở ( sudo -i) khi tôi sửa đổi cơ chế sudoers và một bản sao lưu tiện dụng.


Vấn đề duy nhất với điều này là cài đặt IP tĩnh cần được thay đổi theo yêu cầu. Sự hiểu biết của tôi về kịch bản mà bạn giới thiệu về cơ bản sẽ viết lại /etc/network/interfacestệp thành bất cứ thứ gì /root/set_static_ip. Trừ khi bạn có thể tạo một tập lệnh yêu cầu người dùng nhập địa chỉ IP, cổng, v.v ... Điều này tôi không đủ tốt để thực hiện.
Keith

Bạn có thể viết một tập lệnh chấp nhận tham số ... nhưng vâng, đây là cách an toàn nhất. Nếu bạn để người dùng chỉnh sửa tập tin một cách mù quáng, điều gì xảy ra nếu họ mắc lỗi? Bạn có thể để máy chủ của mình ngoài tầm với ... vì vậy tập lệnh không chỉ cần hỏi theo một cách nào đó các tham số, mà còn kiểm tra xem chúng có an toàn không.
Rmano

3
Về /etc/sudoers, nó visudo, không phải sudoedit.
saiarcot895

Nếu ai đó đang hỏi loại câu hỏi này, có lẽ vượt quá khả năng của họ để viết một kịch bản bash an toàn. Có một lý do bạn không thể setuid root một tập lệnh bash.
rox0r
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.