Làm cách nào để cho phép người dùng không root kiểm soát dịch vụ systemd với các phiên bản?


12

Tôi cần phải cho phép người dùng trong dbanhóm để kiểm soát các database@dịch vụ. Câu trả lời cho câu hỏi liên quan này là chỉ liệt kê tất cả các systemctl"động từ" mà tôi muốn cho phép trong sudoerstệp, tuy nhiên, điều đó không áp dụng cho trường hợp của tôi vì tôi không biết trước cơ sở dữ liệu nào có thể tồn tại trong hệ thống. Ví dụ, nếu tôi liệt kê

%dba = /usr/bin/systemctl start database@awsesomeapp
%dba = /usr/bin/systemctl start database@anotherawsesomeapp
%dba = /usr/bin/systemctl start database@yetanotherawsesomeapp
%dba = /usr/bin/systemctl start database@wowyetanotherawsesomeapp
# ... other "verbs" omitted for brevity

điều đó không bao gồm các trường hợp có thể tồn tại trong tương lai và một dba sẽ không thể

$ sudo systemctl start database@omgwowyetanotherawsesomeapp

Dù sao, tôi đang nghĩ nhiều hơn về bao bì hơn là hợp nhất với một hệ thống cụ thể.

Lưu ý rằng, như thể hiện trong câu trả lời tuyệt vời này cho một câu hỏi liên quan khác , sử dụng sudo globs cho điều này cuối cùng là không an toàn:

%dba ALL = /usr/bin/systemctl start database@[a-z]* # UNSAFE!

không cho phép

$ sudo systemctl start database@awsesomeapp unrelatedservice

Tôi nghi ngờ sử dụng sudosẽ không giải quyết vấn đề của tôi (mặc dù tôi chắc chắn hy vọng tôi sai). Có cách nào khác để cho phép người dùng không root kiểm soát systemddịch vụ không?

Để biết giá trị của nó, tôi cần thực hiện điều này trong hệ thống CentOS 7 và hệ thống RHEL7 trong tương lai. Tôi cũng sẽ quan tâm đến các giải pháp hoạt động trên Arch Linux.

Câu trả lời:


1

Tập tin Sudoers sẽ không hoạt động như vậy, hoặc có vẻ như vậy đối với tôi. Tệp Sudoers nhằm cung cấp một quyền truy cập lệnh cụ thể, không phải để chỉ định các đối số có thể đi với lệnh đó.

Tạo một tập lệnh chạy bằng root và thực thi điều này:

/usr/bin/systemctl start database@

Làm cho kịch bản có một đối số như otherawesom Ứng dụng để nó thực thi điều này:

Script thực thi: / usr / bin / systemctl start cơ sở dữ liệu @ otherawsesom Ứng dụng

Cấp cho người dùng của bạn quyền chạy tệp script.sh với / etc / sudoers.

scriptuser ALL=(ALL) NOPASSWD: /path/to/script.sh

Người dùng có thể chạy nó như thế này:

sh script.sh anotherawsesomeapp

Thí dụ:

AppName=$1

/usr/bin/systemctl start database@$AppName;
if [ $? != "0" ] 
then; 
    echo "$AppName could not be started. Are you using the right application name?";
fi

1
Như vậy, điều này có cùng một vấn đề với người sudoers. Bạn cần trích dẫn biến hoặc nó sẽ được phân chia trên dấu cách.
kyrias

Đây không phải là đi làm; setuid không được vinh danh cho các kịch bản shell (trên Linux).
Martijn

Tất cả những gì nó đang làm là sử dụng sudo để thực thi một tập lệnh. Nó không khác gì giống với kịch bản 'xin chào thế giới'. Nếu root có thể chạy script, nó sẽ hoạt động.
Baazigar

0

Một giải pháp được đề xuất dựa trênSUID

Bạn có thể tạo tập lệnh đã nói gọi systemctl bằng sudo. Làm cho kịch bản sở hữu bởi root. Cung cấp SUIDquyền để root và đọc và thực thi quyền cho nhóm quản trị viên cơ sở dữ liệu (dba).
Chỉ cần cẩn thận không cung cấp quyền viết cho nhóm hoặc cho người khác bởi vì cách đó họ có thể thay đổi tập lệnh và làm cho nó thực thi bất cứ điều gì có trước sudo! Cũng đảm bảo rằng tập lệnh là đầu vào chống đạn.

$ cat >> start_database.sh
sudo / usr / bin / systemctl cơ sở dữ liệu bắt đầu @ $ 1
(Ctrl + D)

Tập lệnh này có thể được cải thiện bằng cách kiểm tra xem đối số có thực sự được cung cấp hay không và in thông báo Cách sử dụng: nếu không ..., vì đó là tập lệnh với SUIDnó sẽ phù hợp để kiểm tra; để tránh việc tiêm các lệnh khác theo sau đối số. Hoặc thậm chí tốt hơn đảm bảo cho phép chỉ nhập vào một trong các chuỗi liên quan đến ứng dụng mà bạn đã đề cập!
Sau đó, bạn phải đảm bảo các quyền cho tập lệnh hoàn toàn như sau:

$ sudo chown root: dba start_database.sh
$ sudo chmod ux, gw, o-rwx start_database.sh
$ sudo chmod u + s, g + rx start_database.sh

Sau đó, để xác minh quyền chính xác:

$ ls -la
.
.
.
-rwSr-x --- 1 root dba 35 ngày 2 tháng 8 19:11 start_database.sh
.
.
.

Vì vậy, để tóm tắt lại:

1. the owner of the script is root
2. the file can be read and executed by the dba group members
3. no-one else will be able to even readit.
4. SUIDsẽ cho phép người dùng thực thi tập lệnh trở thành root miễn là tập lệnh được thực thi.
5. Vì vậy, sudo sẽ không dừng lại để lấy mật khẩu.

Trong mọi trường hợp, trong một hệ thống với nhiều người dùng, hãy cẩn thận với SUIDvì nó có thể rời khỏi phòng tình trạng lạm dụng được phép.


Bạn đang thiếu một shebang trong tập lệnh của mình và thậm chí sau đó, SUIDsẽ không hoạt động cho các tập lệnh theo mặc định.
Jan Tojnar
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.