systemd: Berikan izin pengguna yang tidak terjangkau untuk mengubah satu layanan tertentu

20

Saya menjalankan server permainan pribadi di kotak linux tanpa kepala. Karena saya bukan orang idiot, kata server berjalan sebagai pengguna yang tidak memiliki hak pribadi dengan hak akses minimum yang diperlukan untuk mengunduh pembaruan dan memodifikasi database dunia.

Saya juga membuat file unit systemd untuk memulai, menghentikan, dan me-restart server dengan benar (untuk pembaruan tersebut, misalnya).

Namun, untuk benar-benar menelepon systemctlatau service <game> start/stop/restartsaya masih harus masuk sebagai root atau sudopengguna yang mampu.

Apakah ada cara untuk memberi tahu systemd bahwa untuk <game>layanan ini, pengguna yang tidak gamesrvmemiliki hak diizinkan untuk menjalankan perintah start / stop / restart?

Shadur
sumber
Versi PolicyKit / distribusi yang mana? Debian (dan turunannya) ada di versi yang lebih lama yang memerlukan format file konfigurasi yang berbeda .
Gert van den Berg

Jawaban:

37

Saya dapat memikirkan dua cara untuk melakukan ini:


Salah satunya adalah dengan membuat layanan layanan pengguna daripada layanan sistem.

Alih-alih membuat unit sistem, unit systemd akan ditempatkan di bawah direktori home pengguna layanan, di $HOME/.config/systemd/user/daemon-name.service. Pengguna yang sama kemudian dapat mengelola layanan dengan systemctl --user <action> daemon-name.service.

Untuk memungkinkan unit pengguna untuk memulai saat boot , root harus mengaktifkan berlama-lama untuk akun, yaitu sudo loginctl enable-linger username. Unit juga harus WantedBy=default.target.


Cara lainnya adalah dengan memungkinkan pengguna mengakses untuk mengelola unit sistem melalui PolicyKit. Ini membutuhkan systemd 226 atau lebih tinggi (dan PolicyKit> = 0,106 untuk file JavaScript rules.d - periksa dengan pkaction --version).

Anda akan membuat file konfigurasi PolicyKit baru, misalnya /etc/polkit-1/rules.d/57-manage-daemon-name.rulesyang memeriksa atribut yang ingin Anda izinkan. Sebagai contoh :

// 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;
    }
});

Pengguna yang disebutkan kemudian dapat mengelola layanan yang dinamai dengan systemctldan tanpa menggunakan sudo.

Michael Hampton
sumber
Mode pengguna dan loginctlbekerja.
Shadur
1
Apakah ini berfungsi di Ubuntu 16.04? Apakah normal bahwa direktori rules.d tidak ada? Saya tidak bisa membuatnya bekerja. Aturan saya diabaikan.
siapaoe
3
Apakah saya harus memulai kembali sesuatu untuk mengaktifkan PolicyKit?
Josir
@MichaelHampton Dengan systemd --user saya bisa mendapatkan semua yang saya inginkan, kecuali layanan startup saat boot. Saya pikir ini normal ketika saya membacanya di beberapa tempat (mis. Archlinux wiki), tetapi Anda mengatakan itu harus bekerja, apakah Anda yakin tentang hal itu?
daks
@dak Ya itu berfungsi. Jika Anda masih memiliki masalah dengan itu, maka tanyakan pertanyaan baru.
Michael Hampton
12

sudodibuat untuk itu. Edit /etc/sudoersfile Anda dengan visudountuk menambahkan Cmd_aliasperintah yang Anda inginkan agar pengguna yang tidak berhak dapat menggunakan:

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

dan tambahkan baris untuk memungkinkan pengguna yang tidak memiliki hak menggunakan perintah yang didefinisikan dengan alias seperti ini:

unprivileged_user ALL=(ALL) NOPASSWD: GAME_CMDS

Baca beberapa dokumentasi lebih lanjut tentang topik untuk berbagai parameter perintah sudo.

Anda mungkin perlu menginstal sudopaket agar sudotersedia di sistem Anda.

Henrik Pingel Reinstate Monica
sumber
Saya tahu cara menggunakan sudo, ya. Saya bertanya-tanya apakah ada opsi yang akan membiarkan saya melewatkan bahkan karena dalam kasus ini hal pertama yang dilakukan systemdfile unit adalah menentukan bahwa itu perlu dijalankan sebagai gamesrv.
Shadur
1

Anda dapat mengaitkan sudodengan menyediakan akses yang setara dengan root, tetapi dapat juga digunakan untuk memungkinkan akses root pengguna tertentu untuk serangkaian perintah tertentu dan terbatas.

Bagaimana hal itu telah dijawab di Server Fault, di [ Memberikan akses serangkaian perintah ke pengguna non-root tanpa sudo akses dari serangkaian perintah ke pengguna non-root tanpa sudo).

Menggunakan PolicyKit masih jarang. Menggunakan "unit pengguna" systemd harus bekerja dengan baik, tetapi secara historis tujuan Anda telah terpenuhi berkali-kali dengan menggunakan kemampuan sudountuk memungkinkan pengguna untuk menjalankan perintah tertentu sebagai root.

Mark Stosberg
sumber