ubuntu: bir kullanıcının root izinlerine sahip bir komut dosyası çalıştırmasına izin ver


9

Ubuntu 8.04 var ve roother kullanıcının çalıştırabileceği bir bash betiği yazmak istiyorum .

Ben kendim sudo yapabilirim.

Bunu nasıl yaparım?

AÇIKLAMALAR : Bunu sudo ile yapmak istemiyorum, çünkü o zaman kullanıcılar parolalarını yazmak zorunda kalacaklar. Sadece senaryoyu root olarak çalıştırmasını istiyorum, belki setuid, dunno.

Yanıtlar:


23

Bu normal bir ikiliyse, çalıştırabilirsiniz.

# chmod u+s /path/to/binary

Ne yazık ki, komut dosyaları ayarlanamaz. (Evet, ama yok sayılır). Bunun nedeni, komut dosyasının ilk satırının işletim sistemine komut dosyasını hangi yorumlayıcıda çalıştıracağını söylemesidir. Örneğin:

#!/bin/bash

Sonuçta koşuyorsun

/bin/bash /path/to/script

Açıkçası, yorumlayıcının setuid olması gerekir, bu da tüm komut dosyalarının setuid olacağı anlamına gelir. Bu kötü olur.

Bunu sudo ile / etc / sudoers dosyanıza visudo çalıştırarak yapabilirsiniz.

ALL ALL=NOPASSWD: /path/to/script

Ve şimdi herhangi bir kullanıcı çalıştırabilir

$ sudo /path/to/script

Bu, komut dosyasını parolalarını yazmadan çalıştırmalarını sağlar.

Komutta sudo gerektirmeyen, komut dosyanızı çalıştıran küçük bir setli ikili dosya oluşturmayı gerektiren bir alternatif vardır, ancak her ek setuid ikili dosyası başka bir potansiyel güvenlik sorunu ekler.


Sanırım aradığım cevap bu. Bir bash betiği ayarlayamaz mıyım, sadece bir ikili? (Elbette, düzenlenemez hale getirmek için önlemler alırım)
flybywire

Hayır, komut dosyası setuid'i oluşturamazsınız.
wfaulk

wfaulk: Eskiden yapabildin, ancak en son Linux dağıtımları artık buna izin vermiyor. Komut dosyasını 'derlemek' ve ardından setuid yapmak için shc gibi bir araç kullanabilirsiniz.
Kyle Brandt

wfaulk: Tabii ki, kasıtlı olarak devre dışı bırakılan bir şey yapmak için yolunuzdan çıkacak, bu muhtemelen kötü bir fikir :-)
Kyle Brandt

ALLYalnızca bir sudoer'in şifre girmeden çalışabilmesi için terimi bir kullanıcı adıyla değiştirin.
Mart'ta hdave

3

Ben / etc / sudoers SONUNDA bu satırı eklemek gerekiyordu : ALL ALL = NOPASSWD: <filename> Görünüşe göre, daha sonra %admin ALL=(ALL) ALLgeçersiz kılma yönetici kullanıcılar için bir şifre gerekli.

Komut dosyası iyi belirlenmiş, zararsız, izin verilen bir eylem gerçekleştirdiği ve herhangi bir parametre değeri betiğin hatalı davranmasına neden olamazsa, bir komut dosyasının kök olarak çalıştırılmasına izin veren bir güvenlik sorunu yoktur.

Ama bir gotcha var ...

Komut ve dosya adlarında her zaman tam yolları kullanın. Eğer böyle bir şey yazarsan echo Hello world!içinde myrootscript, birisi bir yazabiliriz ~/bin/echo scriptve myrootscriptbunun ne varsa kök olarak yürütülür.

/bin/echo "Hoping this will keep you safe" :-)


makinedeki kök olmayan bir kullanıcının bu komut dosyasını düzenlemesi mümkünse, o kullanıcının makineyi devralması mümkündür. Aynı kullanıcının zayıf bir parolası varsa, hiçbir şey makinenizin tamamen tehlikeye atılmasını engellemez.
Mart'ta hdave

2

Varsayılan olarak, wheelgrubun üyelerinin sudoherhangi bir komut için olarak izin verilir root. Muhtemelen sudobugüne kadar böyle kullanıyorsunuz .

Başka bir kullanıcıya izin vermek için bir sudoerskural oluşturmanız gerekir . Örneğin:

mickey.mouse ALL = (root) NOPASSWD: /usr/local/bin/test.sh

Kullanıcı izin verecek mickey.mousekomutu çalıştırmak için /usr/local/bin/test.sholduğu gibi rootek bir parola istemi gerektirmeden.

Daha fazla bilgi için bu belgeyi okumalısınız .


Debian / Ubuntu, tekerlek yerine yönetici grubunu kullanır. Muhtemelen biraz daha doğru bir isim.
David Pashley

Bana eski moda de, ama ..;)
Dan Carley

1
eski moda: P
David Pashley

0

chmod +s <filename>Suid bitini görmek için kullanın . Bu, dosya yürütüldüğünde, dosyanın sahibinin izinleriyle çalıştığı anlamına gelir (bu nedenle, dosyayı bu şekilde çalışmasını sağlamak için kök dizinine ayarlayın).

Ancak, bu bir bash betikleri gibi bir şeyle ÇOK tehlikeli olabilir, çünkü bir kullanıcı bunu değiştirmenin bir yolunu bulur, kolayca bir kök kabuk kazanabilir. Kök dışında kimse tarafından yazılamayacağından emin olun.

Linux, betiklere setuid yapmanıza izin vermez, bunu yapmak için bir program olarak derlemeniz gerekir. Bunun yerine, sudoers dosyasını (/ etc / sudoers) kullanabilir ve buna benzer bir satır ekleyebilirsiniz.

<username> ALL = NOPASSWD: /path/to/script


0

Başka bir alternatif: bu komut dosyasının etrafında küçük bir setuid C sarıcı yapabilirsiniz.

  • uygulamak isteyebileceğiniz sınırlamaları kontrol eder (kullanıcı listesi, zaman, sistem yükü, ...)
  • istenirse yürütme kayıtları / denetimleri
  • komut dosyasını yürütür

Bir çeşit kendi alt kümeniz gibi çoklu yetenekler sudo.

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.