Kök olmayan kullanıcıların bir system.d servisini kontrol etmelerine nasıl izin verebiliriz?


60

Bununla birlikte sysvinit, sudoersböyle bir giriş yeterli olacaktır:

%webteam cms051=/sbin/service httpd *

Bu, aşağıdaki gibi komutlara izin verir:

  • sudo service httpd status
  • sudo service httpd restart

Şimdi, systemdhizmet adıyla son argümandır. Yani, servisin yeniden başlatılması şöyle yapılır:

systemctl restart httpd.service

Doğal olarak, komutun systemctl * httpd.serviceişe yarayıp yaramayacağını, ancak bunun systemctl restart puppet.service httpd.serviceistenen etki olmayan bir şeye izin vereceğini düşündüm .

Bu dikkate alındığında, root olmayan kullanıcıların bir system.dservisi kontrol etmelerine izin vermenin en iyi yolu ne olabilir ? Bunun olması gerekmez sudoers; belki bir dosya izni değişikliği yeterli olabilir?


Bir süredir herhangi bir sudokonfigürasyona dokunmadım , ama böyle bir şey yapamaz mıydınız cms051=systemctl * httpd.service?
John WH Smith

1
Bu daha sonra herhangi bir hizmeti yeniden başlatmanıza izin verir. Bu çekinceyi soruya dahil etmeliydim. Üzgünüm.
Belmin Fernandez

Yanıtlar:


43

Gerekli tüm komutları sudoersayrı ayrı eklemeniz yeterlidir:

%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üm birim komutları yakalamayı umuyordum ama eğer onları sıraya koymak zorunda kalırsam, yapmam gerekecek sanırım.
Belmin Fernandez

9
Herhangi bir kullanıcı yapabileceği gibi durum yararlı değil
Dereckson

5
Nedir cms051?
kevin

1
Peki, systemctl'yi yeniden çağırırsam http.service mariadb.service ;-) 'ı yeniden başlatırsam ne olur? Muhtemelen mariadb de yeniden başlatılacak
Marek Wajdzik

1
@MarekWajdzik sudo, birinin açıkça *veya benzer desenlere izin vermemesi durumunda ekstra argümanlara izin vermez .
jofel

31

@ jofel'in cevabı çalışan bir kurulum için tam da ihtiyacım olan şeydi. Bu soruyu tökezleyen başkaları için bunu diyorum. capistranoYerel makinemden konuşlandırdıktan sonra Ruby uygulamamı yeniden başlatmak için bir yola ihtiyacım vardı . Bu, systemdhizmetleri yeniden başlatmak için şifresiz erişime ihtiyacım olduğu anlamına geliyor . BU ne var ve harika çalışıyor!

Not : benim kullanıcı ve grubum deployer
burada özel bir dosyaya kod koyma adı verilir : /etc/sudoers.d/deployer
Kod:

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

Bu deployerdurumda kullanıcı olarak giriş yaptıktan sonra systemctlsudo ile komutu çalıştırmanız gerektiğini eklemem gerekiyor .
Muyiwa Olu

8

Erişmelerini istediğiniz komutlarla bir komut diğer adı oluşturun. Ardından grubu bu komuta diğer adına atayın:

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

%webteam ALL=APACHE-SVC

Sudoers dosyasını doğrudan düzenlemek yerine, /etc/sudoers.d/filename'in içine düzenleme yapmak iyi bir uygulamadır. Çoğu yeni dağıtımın yaptığı sudo'larda .d / dosya adınızı gösterdiğinizden emin olun. Bu 2 satırı sudo'larınıza yerleştirmek hile yapmalı:

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

Not: includedir önünde bu # bir yorum değildir. Kalmalı.


Parola girmeden stop / start / restart komutunu çalıştırma şansı nasıl olur?
Nikolay Baranenko

En iyi cevap IMO. Herkes bir takma ad eklemeli ve bununla çalışmalıdır.
DASKAjA

6

Onları jofel in önerdiği gibi tanımlamak en güvenli şey .

Birinin bir komutun yeteneklerinin sınırlı bir alt kümesini kullanmasına izin vermek istersem, bunu yapmak için bir sudoers hattında joker karakterlere güvenmem. Dil kabuk küreciklerinden daha anlamlı olsa bile, takip etmesi gereken çok fazla köşe durumu var.

" service httpd *" Satırı göreceli olarak güvenlidir, çünkü (bunu doğrula :) service, --status-allözellikle hassas olan hiçbir şey yapmayan yalnızca bir yararlı bayrağa ( ) sahiptir ve (bunu da doğrula :) /etc/init.d/httpd, yalnızca izin vermek istediğiniz komut satırlarını kabul eder.

Bunları listelemek çok garip hale gelirse, muhtemelen ne yaptığınızı sorgulamanız gerekir. Ancak, onlara komutu (onlar gibi /etc/init.d/http) çalıştıran dikkatlice yazılmış bir yardımcı komut dosyasına erişme izni verebilirsiniz . Bu durumda bile, hangi komutların ve seçeneklerin izin verildiğini tam olarak listelemek için mümkün olduğu kadar kesin ve açık olmalısınız ve herhangi bir kullanıcı girişini doğrudan hedef komuta geçmeyin.

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.