systemd: Belirli bir hizmeti değiştirmek için ayrıcalıklı olmayan bir kullanıcıya izin ver


20

Başsız bir linux kutusunda özel bir oyun sunucusu çalıştırıyorum. Salak olmadığım için, sunucunun güncellemeleri indirmek ve dünya veritabanını değiştirmek için gereken minimum erişim haklarına sahip, kendi ayrıcalıklı kullanıcısı olarak çalıştığını söyledi.

Ayrıca gerektiğinde sunucuyu gerektiği gibi başlatmak, durdurmak ve yeniden başlatmak için bir sistemd birim dosyası oluşturdum (örneğin, söz konusu güncellemeler için).

Ancak, aslında arayabilmek için systemctlya service <game> start/stop/restartda root veya sudoyetenekli bir kullanıcı olarak giriş yapmam gerekiyor .

Sisteme, <game>servis için imtiyazsız kullanıcının gamesrvstart / stop / restart komutlarını çalıştırmasına izin verildiğini söylemenin bir yolu var mı ?


PolicyKit / dağılımının hangi sürümü? Debian (ve türevleri), farklı bir yapılandırma dosyası formatı gerektiren daha eski bir sürümdedir .
Gert van den Berg,

Yanıtlar:


37

Bunu yapmanın iki yolunu düşünebilirim:


Bunlardan birincisi, servisi bir sistem servisi yerine kullanıcı servisi yapmaktır.

Bir sistem birimi oluşturmak yerine, sistem birimi biriminde servis kullanıcısının ana dizini altına yerleştirilir $HOME/.config/systemd/user/daemon-name.service. Aynı kullanıcı daha sonra servisi ile yönetebilirsystemctl --user <action> daemon-name.service .

Kullanıcı biriminin açılışta başlamasına izin vermek için , root hesap için oyalanmayı etkinleştirmelidir, örn sudo loginctl enable-linger username. Birim de olmalıdır WantedBy=default.target.


Diğer yol, kullanıcının PolicyKit üzerinden sistem birimini yönetmesine izin vermektir. Bunun için systemd 226 veya daha üstü gerekir (ve JavaScript rules.d dosyaları için PolitikaKit> = 0.106 - kontrol edin pkaction --version).

/etc/polkit-1/rules.d/57-manage-daemon-name.rulesİzin vermek istediğiniz özellikleri kontrol eden yeni bir PolicyKit konfigürasyon dosyası oluşturacaksınız . For Örneğin :

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

Adlandırılmış kullanıcı daha sonra adı verilen hizmeti systemctlkullanıp kullanmadan yönetebilir sudo.


Kullanıcı modu ve loginctlçalıştı.
Shadur

1
Bu Ubuntu 16.04'te çalışıyor mu? Rules.d dizininin olmaması normal mi? Çalışmasını sağlayamıyorum. Kurallarım göz ardı edildi.
ygoe

3
PolicyKit'in etkin olması için bir şeyi yeniden başlatmam gerekir mi?
Josir,

@MichaelHampton systemd --user ile çalışmak istediğim her şeyi alabilirim, açılışta servis başlangıcı dışında. Bunun birkaç yerde okuduğum gibi normal olduğunu düşünüyorum (örn. Archlinux wiki), ama çalışması gerektiğini söylüyorsun, bundan emin misin?
18'de

@ daks Evet çalışıyor. Bununla ilgili hala bir sorununuz varsa, yeni bir soru sorun.
Michael Hampton

12

sudobunun için yapılır. Ayrıcalıklı olmayan kullanıcının kullanabilmesini istediğiniz komutlara bir eklemek için /etc/sudoersdosyanızı düzenleyin :visudoCmd_alias

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

ve imtiyazsız kullanıcının şöyle bir takma adla tanımlanan komutları kullanmasına izin vermek için bir satır ekleyin:

unprivileged_user ALL=(ALL) NOPASSWD: GAME_CMDS

Sudo komutunun çeşitli parametreleri için konuyla ilgili daha fazla belge okuyun .

Sisteminizde mevcut olması için sudopaketi kurmanız gerekebilir sudo.


Ben sudo nasıl kullanılacağını biliyorum, evet. Bunu atlamama izin verecek bir seçenek olup olmadığını merak ediyordum, çünkü bu durumda systemdbirim dosyasının yaptığı ilk şey, çalıştırılması gerektiğini belirtmesiydi gamesrv.
Shadur

1

sudoEşdeğer erişim sağlama ile ilişkilendirebilirsiniz root, ancak belirli, sınırlı bir komut kümesi için belirli bir kullanıcı kök erişimine izin vermek için de kullanılabilir.

Bu nasıl zaten Sunucu Arızasında, “Bir dizi komutun sudo olmadan root olmayan bir kullanıcıya sudo erişimi olmayan bir komut setine erişim verilmesi” bölümünde yanıtlandı .

PolicyKit kullanımı hala nadirdir. Bir sistem ve "kullanıcı birimi" kullanımı iyi çalışmalıdır, ancak tarihsel olarak amacınız sudobir kullanıcının belirli komutları root olarak çalıştırmasına izin verme yeteneği kullanılarak birçok kez gerçekleştirilmiştir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.