Cấp quyền truy cập một nhóm lệnh cho người dùng không root mà không cần sudo


13

Tôi muốn cấp quyền truy cập không sudo cho người dùng không phải root trên máy của tôi, có người dùng dns-manager, vai trò duy nhất của anh ta là chạy tất cả các lệnh BIND (rndc, dnssec-keygen), v.v.

Bây giờ mỗi khi anh ta phải chạy một lệnh, anh ta gõ,

sudo rndc reload

Có cách nào để tôi có thể thoát khỏi sudo này, nhưng chỉ trên một nhóm lệnh cụ thể (và chỉ dành cho người quản lý dns) không?


5
Kiểm soát truy cập tùy ý như thế này là khá nhiều những gì sudolà cho. Sự phản đối kinh doanh của bạn đối với anh ấy sử dụng sudocho việc này là gì?
MadHatter

1
@peterh Tôi nhắc lại câu hỏi của tôi: kiểm soát truy cập tùy ý (nghĩa là ủy quyền hệ thống một phần) là vai trò của sudo. Những phản đối là gì?
MadHatter

3
Thế còn mật khẩu sudothì sao? Hoặc mật khẩu sudo để chạy công cụ quản lý DNS , sau đó có thể hoạt động với namedđặc quyền nhóm hoặc người dùng hoặc đặc quyền gốc, khi cần.
MadHatter

4
@peterh "một lý do tốt để làm theo cách này" sẽ là một phần còn thiếu. Thông thường những câu hỏi như thế này hóa ra là những vấn đề XY được ngụy trang và tôi thấy rằng việc hiểu vấn đề tiềm ẩn là chìa khóa để trả lời chúng một cách đầy đủ và chuyên nghiệp.
MadHatter

2
@peterh Tôi nghĩ chúng tôi đồng ý với nhau. Tôi cũng muốn thấy OP cải thiện câu hỏi của mình; đi sâu vào nó hoạt động tốt đối với tôi như là một cách giúp tác giả suy nghĩ bên ngoài chiếc hộp mà anh ta tự chế tạo. Anh ta cũng có thể có một lý do tốt để muốn tránh sudo. Khi cố gắng bày tỏ điều đó với chúng tôi, anh ta có thể làm sáng tỏ sự nhầm lẫn của chúng tôi, hoặc của chính anh ta - hoặc cả hai!
MadHatter

Câu trả lời:


31

Nếu tôi hiểu chính xác ý kiến ​​của bạn, vấn đề ở đây là lệnh sẽ được ban hành thông qua kết nối không có khả năng nhập mật khẩu mà sudo mặc định yêu cầu. Ngoài ra, trong nhiều bản phân phối HĐH, sudo sẽ mặc định yêu cầu TTY - điều mà chương trình này có thể không có.

Tuy nhiên, sudo có thể có cấu trúc quyền rất chi tiết, cho phép có thể cho phép một hoặc nhiều người dùng phát hành một lệnh cụ thể mà không cần mật khẩu và TTY. Dưới đây, tôi sẽ chỉ ra ba cách để cấu hình điều này cho nhu cầu của bạn. Cho dù bạn chọn loại nào, người dùng sẽ có thể ra lệnh sudo rndc reloadmà không cần phải nhập mật khẩu.

(Ngoài ra, điều này có thể không cần thiết, nhưng ... vui lòng nhớ tạo một bản sao lưu của tệp sudoers của bạn trước khi chỉnh sửa nó, để giữ một vỏ trong đó bạn đã mở root trong trường hợp bạn cần quay lại bản sao lưu và chỉnh sửa sử dụng visudothay vì sudo vi /etc/sudoers. Hy vọng rằng các biện pháp phòng ngừa này sẽ không cần thiết, nhưng ... tốt hơn là có chúng và không cần chúng hơn là ngược lại!)

1. Nếu bạn không muốn yêu cầu TTY cho bất kỳ yêu cầu nào

Cách đơn giản nhất để thoát khỏi các yêu cầu TTY (nếu có) là để đảm bảo rằng các dòng bắt đầu bằng Defaultstrong /etc/sudoerskhông chứa từ requiretty- thay vào đó, nó nên chứa !requiretty. Tuy nhiên, nếu bạn làm điều này, điều đó có nghĩa là không có lệnh sudo nào sẽ yêu cầu một tty!

Bạn cũng sẽ cần thêm dòng

rndcuser ALL = (root) NOPASSWD: /path/to/rndc reload, /path/to/dnssec-keygen, /path/to/other/program

2. Nếu bạn muốn yêu cầu TTY cho tất cả người dùng ngoại trừ người dùng này

Điều này có thể được thực hiện bằng cách đặt mặc định cho một người dùng này, như thế này:

Defaults:rndcuser        !requiretty
rndcuser ALL = (root) NOPASSWD: /path/to/rndc reload, /path/to/dnssec-keygen, /path/to/other/program

3. Nếu bạn muốn yêu cầu TTY cho tất cả các lệnh ngoại trừ một lệnh này bởi một người dùng này

Điều này phức tạp hơn một chút, do cú pháp của tệp sudoers. Bạn cần tạo bí danh lệnh cho lệnh và sau đó đặt mặc định cho bí danh lệnh đó, như sau:

Cmnd_Alias RNDC_CMD = /path/to/rndc reload, /path/to/dnssec-keygen, /path/to/other/program
Defaults!RNDC_CMD !requiretty
rndcuser ALL = (root) NOPASSWD: RNDC_CMD

Tất nhiên, điều này có thể được kết hợp với một tập lệnh bao bọc gọi lệnh bằng sudo, nếu vì lý do nào đó bạn không thể sử dụng sudo trực tiếp ngay cả khi không có mật khẩu.
Jenny D

4

Đúng. sudo có thể được cấu hình rất linh hoạt. Mặc dù vậy, tôi phải đề cập: các loại giải pháp này không nên được coi là rất an toàn và chúng chỉ nên được sử dụng trong môi trường hợp tác nơi có các biện pháp kiểm soát khác (do đó, bạn có thể cung cấp các đặc quyền nâng cao này cho cấp dưới trung thành của mình, nhưng không nên làm như vậy cho một khách hàng mà bạn chỉ biết từ mạng).

Cấu hình sudo có /etc/sudoerstrong hầu hết các hệ thống. Bạn có thể tìm ra cú pháp của nó bằng cách Google hoặc bởi mộtman sudo lệnh.

Bạn không nên chỉnh sửa tệp này trực tiếp; làm như vậy có thể dẫn đến điều kiện cuộc đua an ninh. Thay vào đó, hãy sử dụng visudolệnh (là một trình bao bọc xung quanh $EDITORbiến môi trường của bạn ).


Sau khi bạn định cấu hình sudo, bạn có thể dễ dàng bọc nó xung quanh các lệnh hiển thị. Nó rất đơn giản:

  1. Tạo một thư mục cho một danh sách các tập lệnh bao bọc sudo của bạn (fe /usr/local/dnsadmin/bin)
  2. Tạo một tập lệnh bao bọc cho các lệnh bạn muốn chúng có thể sử dụng mà không cần sudo. Nó sẽ là một lệnh rất đơn giản, ví dụ, /usr/local/dnsadmin/bin/rndcsẽ là:

    #!/bin/bash exec /usr/bin/sudo /usr/sbin/rndc "$@"

  3. Đưa thư mục này vào PATHbiến môi trường của chúng (ví dụ: toàn hệ thống hoặc cục bộ của chúng .profile).


Vì tò mò - tại sao bạn sẽ sử dụng exectrong shell script thay vì chỉ gọi lệnh trực tiếp? (Tôi không nói rằng điều đó sai. Tôi chỉ muốn biết lý do tại sao bạn làm điều đó để tôi có thể học được điều gì đó)
Jenny D

2
Tôi đã thực hiện với bit sudo không mật khẩu, ý tưởng kịch bản trình bao bọc là tuyệt vời.
Anss

2
@JennyD :-) Vì tính ổn định và hiệu suất. Trong trường hợp exec, lệnh được gọi sẽ được thay thế ở vị trí của shell. Vỏ sẽ biến mất. Nếu không có exec, shell sẽ bắt đầu lệnh đó, và sau đó chờ kết thúc, và sau đó thoát. Thứ hai này, exec-less có nghĩa là nhiều quá trình hợp tác, không cần thiết. Nhưng không có sự khác biệt lớn, nếu không có exec thì công việc này sẽ rất tốt với điều đó.
peterh - Phục hồi Monica

@JennyD Lời cầu xin của tôi :-)
peterh - Phục hồi Monica

@Snowbody Cảm ơn bạn rất nhiều về việc tuyển chọn! Đó là một vinh dự rất lớn.
peterh - Tái lập Monica

2

Mặc dù đây không phải là một giải pháp chung trong trường hợp cụ thể rndcmà bạn không cần sudo.

rndccó thể giao tiếp với bất kỳ namedquá trình nào thông qua ổ cắm cục bộ hoặc cổng từ xa, sử dụng khóa bí mật để xác thực chính nó. Theo mặc định (hoặc ít nhất, đối với debian, là bản phân phối tôi sử dụng) tệp này có thể được tìm thấy /etc/bind/rndc.keyvà thường chỉ có thể đọc được cho người dùng bindvà nhóm bind.

Bất cứ ai đã đọc quyền truy cập vào tệp chính đó (hoặc một bản sao giống hệt của tệp đó) đều có thể sử dụng rndcđể kiểm soát máy chủ BIND, vì vậy giải pháp đơn giản nhất trong trường hợp cụ thể này là thêm người dùng vàobind nhóm.

Một số lượng đáng kinh ngạc của các trình tiện ích thông thường có một cái gì đó tương tự được thiết lập (cá nhân tôi vẫn đang tìm ra các khả năng của các quyền lực trong vấn đề đó, nhưng nó có vẻ đầy hứa hẹn cho đến nay). Nếu bạn không muốn làm, sudobạn sẽ phải kiểm tra xem những gì bạn muốn thực hiện có khả thi trong từng trường hợp hay không.


-1

Bạn không muốn sử dụng sudo để cấp root cho một số lệnh. Thay vào đó, bạn có thể chọn 4750 một chương trình cụ thể [có thể gói lệnh], để nâng cao quyền của người dùng bình thường để thực thi quyền đó với quyền root.

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.