Başlangıç ​​işlerini ayrıcalıklı kullanıcılar olarak yürütmek


140

Yeni başlayan bir işin kullanıcı kimliğini değiştirmesinin ve komut dosyasını ayrıcalıklı olmayan bir kullanıcı olarak çalıştırmasının kurallı yolu nedir?

Açıkçası biri kullanabilir su veya sudo, ancak bu sahte görünüyor (ve gereksiz log satırları üretebilir).

Yanıtlar:


108

Başlangıç ​​v1.4 ile, setuid ve setgid config dosyasında yerel olarak desteklenir.


7
Bu konuda ayrıntılar için yemek kitabına bakın: upstart.ubuntu.com/cookbook/#run-a-job-as-a-different-user
Jason Navarrete

10
Başka bir deyişle, Hassas (12.04) ve daha yenisi ile desteklenir.
Edward Anderson

8
Başka bir deyişle, centos 6'da desteklenmiyor
socketpair

5
Kayıt için, initctl --version Mevcut başlangıç ​​sürümünüzü bulmak için.
Mahn

4
Can sıkıcı bir şekilde, AWS’deki Amazon Linux dağıtımı RHEL 6’nın başlangıç ​​sürümünü (0.6.5 !!!!) kullanıyor, bu yüzden onu kullanan herkes 'su' çözümünü kullanmak zorunda kalacak.
Asfand Qazi

86

Freenode üzerindeki #upstart kanalını sorarak, resmi meselenin üstlendiği:

Upstart’ın gelecekteki bir sürümü   bunun için yerel destek, ancak şimdilik   Gibi bir şey kullanabilirsiniz:

exec su -s /bin/sh -c 'exec "$0" "$@"' username -- /path/to/command [parameters...]

7
Amazon Linue EC2'de çalışan tek cevap budur (- session-command, -c, ad nauseum dahil tüm sudo ve su çeşitlerini denedim); hiçbiri bir kere başladığında sürecin durdurulmasına izin vermedi; Bunun için çok teşekkürler.
Kato

Bu biraz süslü bir kabuk büyüsü, +1.
Steve Kehlet

5
Bu benim için CentOS 6'da işe yaramadı (Upstart 0.6.5). Tarafından başlatılan bir dizi çatal (4 derin sanırım) var su bu şu demek oluyor expect fork ve hatta expect daemon son PID'yi yakalamayın.
Mark Lakata

2
Bunu, bir Linux sürecini başlatmak için (kendini şımartmayacak şekilde, neyse ki) başlatmak için Amazon Linux'ta (Upstart 0.6.5) kullandım! Standart çıktıyı bir günlük dosyasına yönlendirmek ve bazı ortam değişkenlerini ayarlamak için biraz değiştirmek zorunda kaldım, ama işe yaradı! Sürümüm şöyle gözüküyor: exec su -s /bin/sh -c 'HOME=/foo/bar exec "$0" "$@" &>/var/log/foobar.log' username -- /path/to/command [parameters...]
Asfand Qazi

17

Start-stop-daemon kullanmaya ne dersiniz?

exec start-stop-daemon --start --chuid daemonuser --exec /bin/server_cmd

itibaren Başlangıç ​​kitabı :

Debian ve Ubuntu sistemleri için önerilen yöntem yardımcı programı kullanmaktır. start-stop-daemon. [...] start-stop-daemon PAM ("Takılabilir Kimlik Doğrulama Modülü") limitlerini başlattığı sürece uygulamaz.

Not: start-stop-daemon RHEL'de desteklenmiyor.


2
Gerekirse grubu da kullanabilirsiniz. --Chuid daemonuser ile: daemongroup
Evgeny

13

Özellikle grup üyeliğiyle ilgili, biraz farklı anlamsallıklarla bunu yapmanın birkaç yolu var:

  • setuidgid sizi belirttiğiniz gruba koyacaktır.

  • kullanma newgrp Daha az ayrıcalıklı bir kullanıcı olduğunuzda, grubunuza tek bir grup ekler, ancak komut dosyalarının içinde kullanılmasını zorlaştıran yeni bir alt kabuk oluşturur.

  • start-stop-daemon grup üyeliğinizi korur ve sadece setuid / setgid'den çok daha fazlasını yapar.

  • chpst -u username:group1:group2:group3... commandname tam olarak hangi grup üyeliğini benimseyeceğinizi belirlemenize izin verecek, ancak Ubuntu ) sadece birlikte geliyor runit alternatif olan paket upstart.

  • su -c commandname username tüm kullanıcı adının grup üyeliğini alır sudo -u username commandname, bu yüzden muhtemelen en az şaşkınlığa giden yollardır.



4

Amazon EC2'deki bir Ubuntu 10.10 örneğinde, start-stop-daemon Komut.

Ben de diğer start-up bazıları ile mücadele kıta . Belirli bir python uygulamasını arıyorum virtualenv ve benim yürütülen programa bazı parametreler.

Aşağıdaki benim için çalıştı.

script
  export PYTHONPATH=.:/home/ubuntu/.local/lib/python2.7/site-packages/:/home/ubuntu/python/lib/python2.7/site-packages/
  exec start-stop-daemon --start  --chuid ubuntu --exec /home/ubuntu/python_envs/MyProj/bin/python /home/ubuntu/www/MyProj/MyProj.py -- --config-file-dir=/home/ubuntu/www/MyProj/config/ >> /home/ubuntu/startup.log 2>&1 &
end script

PYTHONPATH Kaynaktan bazı paketlerin yüklü olması PYTHON Bu başlatma işi çalıştığında modül yolu. Her şeyi mutlak yollarda yapmak zorunda kaldım çünkü chdir Stanza iş gibi görünmüyordu.


Ben de sorun yaşadım env ile kullanılan değişkenler start-stop-daemon yürütmek .
Thomas Bratt

3

CentOS 6 kullanıyordum ve benim için çalışmak için önerilen hack'i (Upstart 0.6.5 için), ne de 'su' numarasını alamadım çünkü katılan çatalların sayısı (4 sanırım) takip edilmedi. 'veya' daemon bekleyin '.

Sonunda yaptım

chown user:group executable
chmod +s executable

(yani setuid bitini ayarlayın ve sahipliği değiştirin).

En güvenli yöntem olmayabilir, ancak dahili bir Ar-Ge projesi için bu bizim durumumuzda önemli değildi.


Eğer yapacaksan chmod 1700 veya en azından chmod u+sx,go-x sadece yerine orada +s, "yeterince güvenli" olarak nitelendirirdi. :)
dannysauer

0

Neyi başarmaya çalıştığınıza bağlı olarak üçüncü bir olasılık var. Mümkün olabilir Söz konusu dosyalar / cihazlardaki erişim kontrollerini gevşetin . Bu, ayrıcalıklı olmayan bir kullanıcının normalde izin vermeyeceği öğeleri bağlamasına veya erişmesine izin verebilir. Sadece süreçte krallığın anahtarlarını vermediğinizden emin olun.

Ayrıca sudo parola önbelleğinin zaman aşımını değiştir . Ancak, makineniz fiziksel olarak güvende olmadıkça tavsiye etmiyorum (yani, yoldan geçenlerin sudo erişimi kazanmaya çalışmasının mümkün olmadığına inanıyorsunuz).

Ayrıcalıklı eylemler gerçekleştirmenin çok az yolu olmasının ve gerçekleştirilmelerinin iyi bir nedeni var. gereksiz gerekli günlüğü. Gevşek kısıtlamalar sisteminiz için bir güvenlik tehlikesi oluşturacak ve kayıt tutmamanız tehlikeye girdiğinizde ne olduğunu bilmenin bir yolu olmadığı anlamına gelir.

Eğer boyut Günlük dosyalarınızdan biri endişe duyuyorsa, muhtemelen bir şeyler yanlış olabilir. Sudo normal şartlar altında kullanım başına sadece bir satır üretir.

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.