Kabuk komut dosyalarında kök ayrıcalıklarını nasıl bırakabilirim?


14

OpenVPN'deki "--up" seçeneği normalde yönlendirme vb. İçin kullanılır. Bu nedenle OpenVPN, hiç kimse olarak çalışmak için kök ayrıcalıklarını bırakmadan önce işlenir. Ancak, ayrıcalıksız bir kullanıcı olarak çalışması gereken kabuk komut dosyalarını çağırıyorum.

Bunu nasıl yaparım? Ben inceledik Bırak Süreç Ayrıcalıklar , özellikle polinom 's ve tylerl verdiği cevapları, ama nasıl uygulanacağı anlamıyorum. Centos 6.5 çalışıyorum ve hemid "chmod u + s" hem de "setuid ()" olarak engellenir.

"--Down" seçeneği tarafından çağrılan komut dosyalarının root olarak çalışmasını sağlayan bir OpenVPN eklentisi ("openvpn-down-root.so") vardır. "Openvpn-up-user.so" gibi bir eşdeğer olabilir, ancak bulamadım.

Edit0

Nikola Kotur'un cevabına göre, Ian Meyer'ın runit-rpm'ini kurdum . Her ne kadar chpst komutu terminalde çalışsa da, up komut dosyasında "komut bulunamadı" ile başarısız oluyor. Ne işe yarar "sudo chpst" artı uygun ekran ve dili ayarlamak. Lütfen bkz. Terminal çıkışım neden unicode karakterleri düzgün şekilde almıyor? Bununla birlikte, up komut dosyasının şu dört satıra ihtiyacı vardır:

LANG="en_US.UTF-8"; export LANG
GDM_LANG="en_US.UTF-8"; export GDM_LANG
DISPLAY=:0; export DISPLAY
sudo chpst -u user -U user /home/user/unprivileged.sh &

Edit1

0xC0000022L yorum başına, "sudo -u kullanıcı" yanı sıra "sudo chpst -u kullanıcı -U kullanıcı" çalışır:

LANG="en_US.UTF-8"; export LANG
GDM_LANG="en_US.UTF-8"; export GDM_LANG
DISPLAY=:0; export DISPLAY
sudo -u user /home/user/unprivileged.sh &

Adam sudo'ları inceleyeceğim ve eğer sudo'yu yalnız başıma çalıştırırsam / güncelleyeceğim.


@ user66229 tarafından bırakılan yorum: " sourceforge.net/p/openvpn/mailman adresinde gezinebilir ve en uygun bulduğunuz listelere abone olabilirsiniz."
slm

@ user66229 Teşekkürler. Ancak bunun OpenVPN'e özgü bir soru olduğuna inanmıyorum. Neden olduğuna inanıyorsun?
mirimir

Yanıtlar:


7

Ben kullanın RunIt 'ın chpstböyle görevler için aracı. Örneğin, yukarı komut dosyasından ayrıcalıklı komut dosyanızı çağırın:

chpst -u nobody /path/to/script

Oh, teşekkürler. Mı github.com/imeyer/runit-rpm CentOS 6.5 içine RunIt almak için en iyi yolu? Red Hat depolarında bile bir paket bulamıyorum.
mirimir

@mirimir, evet, CentOS için bir runit paketi oluşturmam gerektiğinde bu repoyu kullanıyorum.
Nikola Kotur

11

Sadece runit ve sudo kapsayan çok özlüyor. Aslında runit gibi bir dizi araç seti ve tam olarak bunu yapmak için geniş bir araç seçeneği var, bunlar için tasarlandıkları görev:

  • Daniel J.Bernstein'ın daemontools'u setuidgid:

    setuidgid kullanıcısı /home/user/unprivileged.sh
  • Adam Sampson serbest bıraktı setuidgid:

    setuidgid kullanıcısı /home/user/unprivileged.sh
  • Bruce Guenter'in daemontools-encore'su setuidgid:

    setuidgid kullanıcısı /home/user/unprivileged.sh
  • Gerrit Pape'in runiti chpst:

    chpst -u kullanıcı /home/user/unprivileged.sh
  • Wayne Marshall'ın perp'inde runuid:

    runuid kullanıcısı / ev / kullanıcı / unprivileged.sh
  • Laurent Bercot'un s6'sı s6-setuidgid:

    s6-setuidgid kullanıcısı / ev / kullanıcı / unprivileged.sh
  • benim nosh var setuidgid:

    setuidgid kullanıcısı /home/user/unprivileged.sh

Onlar karışmaz farklı görevi ekleyerek ayrıcalıkları ve etkileşimli modda düşmek asla.

Bu arada sorunlarınız bu arada sbinhem binsizin hem de sizin için unutmanızdan biraz daha fazlasıdır PATH.

daha fazla okuma


3

ayrıcalıkları düşüren ve diğer komut dosyasını çalıştıran komut dosyası (ama burada sadece kendi kendini çalıştırmak için yaptım):

#!/bin/sh

id=`id -u`
safeuser="nobody"

if [ $id = "0" ]
then
         # we're root. dangerous!
        sudo -u $safeuser $0
else
    echo "I'm not root"
    id
fi

Misal:

root@n3:/tmp/x# id
uid=0(root) gid=0(root) группы=0(root)
root@n3:/tmp/x# ./drop.sh
I'm not root
uid=65534(nobody) gid=65534(nogroup) группы=65534(nogroup)

"Sudo -u user" kullanmak bazı komutlar için çalışırken, amaçlarım için yeterli kullanıcı ortamı sağlamaz. Ve "su -l user" terminalde iyi çalışıyorken, komut dosyalarında hiçbir şey yapmaz. Sanırım bu bir güvenlik özelliği. Görünüşe göre runit kurmaya bıraktım.
mirimir

1
@mirimir: neden? çalıştırdığı programa hangi ortam değişkenlerinin aktarılabileceği /etc/sudoerskonusunda çok açık olmayı sağlar sudo. man sudoers. Dürüst olmak gerekirse, kim sudosadece sudo su -kullanıcı bağlamı için veya değiştirmek için kullanan bu harika programın arkasında ne olduğunu ve bireysel programlar, kullanıcılar, ana bilgisayarlar vb için şeyler ne kadar kilitleyebilirsiniz hakkında hiçbir ipucu yok ...
0xC0000022L

@ 0xC0000022L Teşekkürler. Sudo'ya bir kez daha baktım. Ve evet, "sudo -u kullanıcı" artı ekran ve dil de çalışır.
mirimir

1
Tehlikeden bahsetmek - güvenemezsin $0; arayan bir komut dosyasını $0tam olarak olmasını istediği her şeye ayarlayabilir . Ve daha fazla alıntı kullanın.
Charles Duffy

2
Senaryonuzun eğer ... $0olduğunu /directory/name with spaces/script(ve hatta eğer kullanıcılar, sahip oldukları yerlerde keyfi sembolik oluşturabilir, hatırlamıyorum yok kullanmak exec -a somename yourscriptçağırmak için yourscriptbir ile $0ait somenameo zaman alırdım,) sudo -u nobody /directory/name with spacesile, withve spacessizin komuta ayrı argümanlar olarak iletilen .
Charles Duffy

1

Ne dersin:

sudo -Eu <user> <command>

Önceki bir yorumda çevre hakkında şikayet ettiniz, böylece çıktılar arasındaki farkları da karşılaştırabilirsiniz:

sudo -u <user> printenv
sudo -Eu <user> printenv

1

Linux'ta runuserveya setprivPAM oturumu gerekmiyorsa (her ikisinden de util-linux) kullanabilirsiniz:

runuser -u USER [--] COMMAND [ARGUMENTS...]

setpriv --reuid=1000 --regid=1000 --init-groups COMMAND [ARGUMENTS...]  # Like su/runuser/sudo
setpriv --reuid=1000 --regid=1000 --clear-groups COMMAND [ARGUMENTS...]  # Like daemontools setuid(8)

Gönderen suadam sayfası:

su çoğunlukla ayrıcalıklı kullanıcılar için tasarlanmıştır, ayrıcalıklı kullanıcılar için önerilen çözüm (örn. root tarafından yürütülen komut dosyaları), kimlik doğrulaması gerektirmeyen ve ayrı PAM yapılandırması sağlayan, kullanıcı kimliği olmayan komut çalıştırıcısı (1) kullanmaktır. PAM oturumu gerekli değilse, önerilen çözüm setpriv (1) komutunu kullanmaktır .

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.