Làm cách nào chúng tôi có thể cho phép người dùng không root kiểm soát dịch vụ system.d?


60

Với sysvinit, một sudoersmục như thế này sẽ đủ:

%webteam cms051=/sbin/service httpd *

Điều này sẽ cho phép các lệnh như:

  • sudo service httpd status
  • sudo service httpd restart

Bây giờ, với systemd, tên dịch vụ là đối số cuối cùng. Tức là, việc khởi động lại dịch vụ sẽ được thực hiện với:

systemctl restart httpd.service

Đương nhiên, tôi nghĩ việc xác định lệnh systemctl * httpd.servicesẽ hoạt động nhưng điều đó sẽ cho phép một cái gì systemctl restart puppet.service httpd.serviceđó không phải là hiệu ứng mong muốn.

Với điều đó đang được xem xét, điều gì sẽ là cách tốt nhất cho phép người dùng không root kiểm soát system.ddịch vụ sau đó? Điều này không cần phải có sudoers; có lẽ một sự thay đổi quyền tập tin có thể là đủ?


Tôi đã không chạm vào một sudocấu hình trong một thời gian, nhưng bạn không thể làm gì đó như thế cms051=systemctl * httpd.servicenào?
John WH Smith

1
Điều này sẽ cho phép bạn khởi động lại bất kỳ dịch vụ sau đó. Tôi nên bao gồm miếng ngon đó trong câu hỏi. Lấy làm tiếc.
Belmin Fernandez

Câu trả lời:


43

Chỉ cần thêm tất cả các lệnh cần thiết để sudoersriêng biệt:

%webteam cms051=/usr/bin/systemctl restart httpd.service
%webteam cms051=/usr/bin/systemctl stop httpd.service
%webteam cms051=/usr/bin/systemctl start httpd.service 
%webteam cms051=/usr/bin/systemctl status httpd.service

Tôi đã hy vọng nắm bắt được tất cả các lệnh đơn vị nhưng nếu tôi phải ghi thành từng mục, thì tôi đoán đó là điều tôi sẽ phải làm.
Belmin Fernandez

9
trạng thái không hữu ích, vì bất kỳ người dùng nào cũng có thể làm điều đó
Dereckson

5
cms051
kevin

1
Vậy điều gì sẽ xảy ra nếu tôi gọi systemctl khởi động lại http.service mariadb.service ;-)? Có lẽ mariadb cũng sẽ được khởi động lại
Marek Wajdzik

1
@MarekWajdzik sudo không cho phép thêm đối số nếu một đối số không được phép rõ ràng với *hoặc các mẫu tương tự.
jofel

31

Câu trả lời của @ jofel chính xác là những gì tôi cần để có được một thiết lập hoạt động. POsting này cho bất cứ ai khác vấp phải câu hỏi này. Tôi cần một cách để capistranokhởi động lại ứng dụng Ruby của mình sau khi triển khai từ máy cục bộ. Điều đó có nghĩa là tôi cần truy cập không mật khẩu để khởi động lại systemddịch vụ. Đây là những gì tôi có và nó hoạt động tuyệt vời!

Lưu ý : người dùng và nhóm của tôi được gọi là deployer
Đặt mã trong tệp tùy chỉnh tại đây: /etc/sudoers.d/deployer
Mã:

%deployer ALL= NOPASSWD: /bin/systemctl start my_app
%deployer ALL= NOPASSWD: /bin/systemctl stop my_app
%deployer ALL= NOPASSWD: /bin/systemctl restart my_app

Tôi cần thêm rằng sau khi đăng nhập với tư cách là người dùng deployertrong trường hợp, bạn nên chạy systemctllệnh với sudo.
Muyiwa Olu

8

Tạo một bí danh lệnh với các lệnh bạn muốn chúng có quyền truy cập. Sau đó gán nhóm cho bí danh lệnh đó:

Cmnd_Alias APACHE-SVC = /usr/bin/systemctl stop httpd, /usr/bin/systemctl start httpd, /usr/bin/systemctl restart httpd

%webteam ALL=APACHE-SVC

Nó cũng là một thực hành tốt để đặt bất kỳ chỉnh sửa nào trong /etc/sudoers.d/filename của bạn thay vì trực tiếp chỉnh sửa tệp sudoers. Hãy chắc chắn để trỏ đến tên tệp .d / của bạn trong sudoers, điều mà hầu hết các bản phân phối mới vẫn làm. Đặt 2 dòng này trong sudoers của bạn sẽ thực hiện thủ thuật:

## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)
#includedir /etc/sudoers.d

Lưu ý: # trước mặt bao gồm không phải là một nhận xét. Nó phải còn lại.


Làm thế nào thêm cơ hội để thực hiện dừng / bắt đầu / khởi động lại mà không nhập mật khẩu?
Nikolay Baranenko

Câu trả lời hay nhất IMO. Mọi người nên thêm một bí danh lệnh và làm việc với điều này.
DASKAjA

6

An toàn nhất là chia thành từng nhóm như jofel gợi ý.

Nếu tôi muốn cho phép ai đó sử dụng một tập hợp con giới hạn các khả năng của lệnh, tôi sẽ không tin các ký tự đại diện trong dòng sudoers để làm điều đó. Ngay cả khi ngôn ngữ có nhiều ý nghĩa hơn so với các vỏ sò, thì cũng có quá nhiều trường hợp góc để theo dõi.

Dòng " service httpd *" tương đối an toàn vì (xác minh điều này :) servicechỉ có một cờ hữu ích ( --status-all) không làm gì đặc biệt nhạy cảm và (cũng xác minh điều này :) /etc/init.d/httpdsẽ chỉ chấp nhận các dòng lệnh bạn muốn cho phép.

Nếu có quá nhiều kết hợp khiến việc liệt kê chúng trở nên khó xử, có lẽ bạn nên đặt câu hỏi về những gì bạn đang làm. Nhưng bạn có thể cấp cho họ quyền truy cập vào tập lệnh trợ giúp được viết cẩn thận chạy lệnh cho họ (giống như /etc/init.d/http). Ngay cả trong trường hợp này, bạn nên chính xác và rõ ràng nhất có thể để liệt kê chính xác những lệnh và tùy chọn nào được phép và không chuyển bất kỳ đầu vào nào của người dùng trực tiếp vào lệnh đí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.