systemd: Cấp quyền cho người dùng không có quyền để thay đổi một dịch vụ cụ thể


20

Tôi đang chạy một máy chủ trò chơi riêng trên một hộp linux không đầu. Bởi vì tôi không phải là một thằng ngốc, cho biết máy chủ đang chạy như một người dùng không có đặc quyền của riêng mình với quyền truy cập tối thiểu mà nó cần để tải xuống các bản cập nhật và sửa đổi cơ sở dữ liệu thế giới.

Tôi cũng đã tạo một tệp đơn vị systemd để khởi động, dừng và khởi động lại máy chủ đúng cách khi cần (ví dụ như các bản cập nhật đã nói).

Tuy nhiên, để thực sự gọi systemctlhoặc service <game> start/stop/restarttôi vẫn cần phải đăng nhập với tư cách là người dùng root hoặc sudongười dùng có khả năng.

Có cách nào để nói với systemd rằng đối với <game>dịch vụ, người dùng không có đặc quyền gamesrvđược phép chạy các lệnh start / stop / restart?


Phiên bản nào của PolicyKit / phân phối? Debian (và các dẫn xuất) trên phiên bản cũ hơn yêu cầu định dạng tệp cấu hình khác .
Gert van den Berg

Câu trả lời:


37

Tôi có thể nghĩ ra hai cách để làm điều này:


Một là bằng cách biến dịch vụ thành dịch vụ người dùng chứ không phải dịch vụ hệ thống.

Thay vì tạo một đơn vị hệ thống, đơn vị systemd sẽ được đặt trong thư mục chính của người dùng dịch vụ, tại $HOME/.config/systemd/user/daemon-name.service. Cùng một người dùng có thể quản lý dịch vụ với systemctl --user <action> daemon-name.service.

Để cho phép đơn vị người dùng bắt đầu khi khởi động , root phải bật linger cho tài khoản, tức là sudo loginctl enable-linger username. Các đơn vị cũng phải được WantedBy=default.target.


Một cách khác là bằng cách cho phép người dùng truy cập để quản lý đơn vị hệ thống thông qua PolicyKit. Điều này yêu cầu systemd 226 trở lên (và PolicyKit> = 0.106 cho các tệp quy tắc JavaScript - kiểm tra pkaction --version).

Bạn sẽ tạo một tệp cấu hình Chính sách mới, ví dụ: /etc/polkit-1/rules.d/57-manage-daemon-name.ruleskiểm tra các thuộc tính bạn muốn cho phép. Ví dụ :

// Allow alice to manage example.service;
// fall back to implicit authorization otherwise.
polkit.addRule(function(action, subject) {
    if (action.id == "org.freedesktop.systemd1.manage-units" &&
        action.lookup("unit") == "example.service" &&
        subject.user == "alice") {
        return polkit.Result.YES;
    }
});

Người dùng được đặt tên sau đó có thể quản lý dịch vụ được đặt tên có systemctlvà không sử dụng sudo.


Chế độ người dùng và loginctllàm việc.
Shadur

1
Cái này có hoạt động trên Ubuntu 16.04 không? Có phải bình thường thư mục Rules.d không tồn tại? Tôi không thể có được nó để làm việc. Quy tắc của tôi bị bỏ qua.
ygoe

3
Tôi có phải khởi động lại thứ gì đó để kích hoạt Chính sách không?
Josir

@MichaelHampton Với systemd --user tôi có thể có tất cả những gì tôi muốn làm việc, ngoại trừ dịch vụ khởi động khi khởi động. Tôi nghĩ điều này là bình thường khi tôi đọc nó ở một vài nơi (ví dụ wiki archlinux), nhưng bạn nói nó nên hoạt động, bạn có chắc về nó không?
daks

@daks Có nó hoạt động. Nếu bạn vẫn có vấn đề với nó, thì hãy hỏi một câu hỏi mới.
Michael Hampton

12

sudođược làm cho điều đó. Chỉnh sửa của bạn/etc/sudoers tệpvisudo để thêm một Cmd_aliaslệnh bạn muốn người dùng không có đặc quyền có thể sử dụng:

# game server commands
Cmnd_Alias GAME_CMDS = /usr/bin/systemctl start <game service>, /usr/bin/systemctl stop <game service>

và thêm một dòng để cho phép người dùng không có đặc quyền sử dụng các lệnh được xác định bằng bí danh như thế này:

unprivileged_user ALL=(ALL) NOPASSWD: GAME_CMDS

Đọc thêm tài liệu về chủ đề cho các tham số khác nhau của lệnh sudo.

Bạn có thể cần phải cài đặt sudogói để có sudosẵn trên hệ thống của bạn.


Tôi biết cách sử dụng sudo, vâng. Tôi đã tự hỏi nếu có một tùy chọn cho phép tôi bỏ qua ngay cả trong trường hợp này, điều đầu tiên mà systemdtập tin đơn vị thực hiện là xác định rằng nó cần phải được chạy như gamesrv.
Shadur

1

Bạn có thể liên kết sudovới việc cung cấp quyền truy cập tương đương root, nhưng nó cũng có thể được sử dụng để cho phép truy cập gốc người dùng cụ thể cho một nhóm lệnh giới hạn, cụ thể.

Làm thế nào điều đó đã được trả lời trên Server Fault, tại [ Cung cấp quyền truy cập của một nhóm lệnh cho người dùng không root mà không truy cập sudo của một nhóm lệnh cho người dùng không root mà không cần sudo).

Sử dụng PolicyKit vẫn chưa phổ biến. Sử dụng "đơn vị người dùng" hệ thống sẽ hoạt động tốt, nhưng trong lịch sử, mục tiêu của bạn đã được đáp ứng nhiều lần bằng cách sử dụng khả năng sudocho phép người dùng chạy các lệnh cụ thể dưới dạng 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.