Kök olmayan kullanıcıların örneklerle bir systemd hizmetini denetlemesine nasıl izin veririm?


12

dbaGruptaki kullanıcıların database@hizmetleri kontrol etmesine izin vermem gerekiyor . Bu ilgili sorunun cevabı systemctl, sudoersdosyada izin vermek istediğim tüm "fiilleri" listelemektir , ancak benim durumum için geçerli değildir, çünkü önceden hangi veritabanlarının sistemde mevcut olabileceğini bilmiyorum. Örneğin,

%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

bu, gelecekte var olabilecek örnekleri kapsamaz ve bir dba

$ sudo systemctl start database@omgwowyetanotherawsesomeapp

Her neyse, belirli bir sistemle uğraşmaktan ziyade ambalaj açısından daha fazla düşünüyorum.

Başka bir ilgili soruya verilen bu şaşırtıcı cevapta gösterildiği gibi, bunun için sudo globs kullanmanın sonuçta güvensiz olduğuna dikkat edin:

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

izin veriyor

$ sudo systemctl start database@awsesomeapp unrelatedservice

Kullanmanın sudosorunumu çözmeyeceğinden şüpheleniyorum (yanlış olduğumu umuyorum). Kök olmayan kullanıcıların systemdhizmetleri denetlemesine izin vermenin başka bir yolu var mı ?

Değeri için, bunu bir CentOS 7 sisteminde ve gelecekte RHEL7 sistemlerinde yapmam gerekiyor. Ayrıca Arch Linux üzerinde çalışan çözümlerle de ilgilenirim.

Yanıtlar:


1

Sudoers dosyası böyle çalışmaz, ya da bana öyle geliyor. Sudoers dosyası, bu komutla gidebilecek bağımsız değişkenleri belirtmek için değil, belirli bir komut erişimi vermek üzere tasarlanmıştır.

Kök olarak çalışan ve bunu yürüten bir komut dosyası oluşturun:

/usr/bin/systemctl start database@

Komut dosyasının anotherawesomeapp gibi bir argüman almasını sağlayın, böylece bunu yürütün:

Komut dosyası yürütür: / usr / bin / systemctl start database @ anotherawsesomeapp

Kullanıcılarınıza script.sh dosyasını / etc / sudoers ile çalıştırma izni verin.

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

Kullanıcı şu şekilde çalıştırabilir:

sh script.sh anotherawsesomeapp

Misal:

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
Olduğu gibi bu sudoers biri ile aynı sorunları var. Değişkeni alıntılamanız gerekir, aksi takdirde boşluklara bölünür.
kyrias

Bu işe yaramayacak; setuid, kabuk komut dosyaları için onurlandırılmaz (Linux'ta).
Martijn

Tek yaptığı bir komut dosyası yürütmek için sudo kullanmak. Bir 'merhaba dünya' senaryosu ile aynı şey değildir. Kök komut dosyasını çalıştırabilirse, çalışır.
Baazigar

0

SUID

Sen dayalı önerilen bir çözüm sudo ile systemctl çağıran söz konusu komut dosyası oluşturabilirsiniz. Komut dosyasının kök dizinine sahip olmasını sağlayın. SUIDVeritabanı yöneticileri grubuna (dba) kök ve okuma ve yürütme izinleri sağlayın .
Sadece gruba veya başkalarına yazma izni vermemeye dikkat edin, çünkü betiği değiştirebilir ve sudo'dan önceki herhangi bir şeyi yürütmesini sağlayabilirler! Ayrıca betiğin kurşun geçirmez girdi-bilge olduğundan emin olun.

$ cat >> start_database.sh
sudo / usr / bin / systemctl başlangıç ​​veritabanı @ $ 1
(Kontrol D)

Bu komut dosyası, argümanın gerçekten sağlanmış olup olmadığını kontrol ederek geliştirilebilir ve bir Kullanım: mesajı yoksa ..., ayrıca bir komut dosyası SUIDolduğu için kontrol etmek uygun olacaktır; argümanın ardından diğer komutların uygulanmasını önlemek için. Ya da daha iyisi bahsettiğiniz uygulama ile ilgili dizelerden sadece biri olarak girdi olarak izin verdiğinizden emin olun!
Sonra komut dosyası izinlerinin kesinlikle aşağıdakiler olduğundan emin olmalısınız:

$ 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

Ardından doğru izinleri doğrulamak için:

$ ls -la
.
.
.
-rwSr-x --- 1 kök dba 35 Ağu 2 19:11 start_database.sh
.
.
.

Yani, özetlemek

gerekirse : 1. owner of the script is root
the dosya can be read and executed by the dba group members
3. no-one else will be able to even readit.
4. SUIDkomut dosyasını çalıştıran kullanıcının komut dosyası yürütüldüğü sürece kök olmasını sağlar.
5. Yani sudo bir şifre için durmayacak.

Her durumda, çoklu kullanıcılı bir sistemde, olmak çok dikkatli ile SUIDbu izni kötüye için odayı terk edebilir çünkü.


Senaryonuzda bir shebang eksik ve o zaman bile, SUIDvarsayılan olarak komut dosyaları için çalışmaz.
Jan Tojnar
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.