Bir komut dosyasının her zaman kök olarak çalıştırılmasını sağlayabilir miyim?


27

Bir betiği root olarak çalıştırma, kim yaparsa çalıştırsın nasıl yapılır?

Setuid hakkında okudum ama bunun nasıl yapılacağından emin değilim.

Linux, Ubuntu 12.04 LTS kullanıyorum.


Hangi Linux dağıtımındasınız? Veya Unix, hatta?
slhck

@slhck Linux, Ubuntu 12
HappyDeveloper

3
setuidscriptlerde çalışmaz - bugünlerde çoğu * nix dağıtımında güvenlik nedeniyle devre dışı bırakılmıştır. Bunu ayarlayabilirsiniz, ancak göz ardı edilir. Belki de asıl probleminiz hakkında daha fazla şey açıklayabilirsiniz, böylece bunu çözmenize yardımcı olabiliriz? Hangi senaryo bu? Neden root olarak çalıştırılması gerekiyor? sudoAlternatif kullanmak mı ?
slhck

Denedin sudo -smi
Nam Phung,

Yanıtlar:


29

Gerçekten dikkatli olun: setuid ile birlikte komut dosyaları tehlikelidir!

Öncelikle, özellikle bu cevap ve güvenlik uyarısı üzerine bu soruya / cevaplara bir göz atın .

Komut dosyanızı hala setuidset ile çalıştırmak istiyorsanız, kısa bir C programını sarmalayıcı olarak yazabilir ve setuidbit'i derlenmiş ikili dosyaya koyabilirsiniz .

Sarıcı örneği:

int main(void) {        
    setuid(0);
    clearenv();
    system("/absolute/path/to/your/script.sh");
}

Başka bir çözüm kullanarak sudo( burada belirtilen ):

  1. Kök olarak, komut dosyasına yazma (ve belki başka) erişimini önleyin:

    chown root /absolute/path/to/your/script.sh
    chmod 700 / absolut/path/to/your/script.sh
    
  2. Kök dışında kimsenin betiği değiştiremeyeceğini , örneğin ana klasörün erişim haklarını değiştirerek doğrulayın :

    chown kökü / mutlak / yol / dan / sizin /
    chmod 755 / mutlak / yol / için /
    
  3. İçinde değiştirmek sudo erişim hakları /etc/sudoersile visudo:

    ALL ALL = (kök) NOPASSWD: / mutlak/path/to/your/script.sh
    

    Ayarlar hakkında daha fazla ayrıntı (örneğin, belirli kullanıcılara veya gruplara erişimi kısıtlama) sudoers sayfasında bulunabilir.

Daha sonra, tüm kullanıcılar betiği şifre olmadan root olarak çalıştırabilir:

sudo /absolute/path/to/your/script.sh

Bu, yukarıdaki sarmalayıcı / setuid çözeltisini kullanmaya benzer.


3
Belirli tehlikeler çok açık değil, ancak çevre çevresinde ağır şekilde dönüyorlar. Çoğu programdan farklı olarak, bir kabuk betiğinin davranışı, onlarca ortam değişkeni tarafından önemli ölçüde değiştirilebilir; böylece, geniş kapsamlı korumalar olmadan, böyle bir komut dosyası, rasgele kod yürütmek üzere kolayca kandırılabilir.
Stephanie,

1
Clearenv () 'a sistem çağrısından önce bu sarmalayıcıda bir çağrı eklemelisiniz, çevreyi tamamen temizleyerek betiği değiştirmek için etrafta kötü bir ayar yoktur. kernel.org/doc/man-pages/online/pages/man3/clearenv.3.html
Stephanie

@Stephanie Yanlış bir şey yapıyorum, çünkü bütün bunlar ortak bir görev için çok çılgınca görünüyor. Yapmaya çalıştığım şey bu: serverfault.com/questions/401405/…
HappyDeveloper

@HappyDeveloper Kötü bir şekilde güvence altına alınmış biri, onu yönetmeyi başarabilen herkes için root olarak kullandığından, salakça bir betik için çok çılgınca değil.
Stephanie,

4
sudoTüm kullanıcıların belirli bir programa (veya komut dosyasına) erişimini sağlamak için kullanılabilir. Bu anlamda, süslü bir setuid sarmalayıcı olarak işlev görür. Öyle görünüyor ki, tipik olarak kendi setuid sarmalayıcınızı yazmaktan daha iyi bir seçim olabilir.
jjlin

4

En kolay ve en güvenli yol SETUID bitlerini dosya izinlerinde kullanmaktır. bu şekilde komut izinleri dosya sahibi izinlerine yükseltilecektir.

betiğin basılmasını engellemek için herkes için bit yazmayın.


0

Bu yararlı olabilir mi bilmiyorum ama, betiği yalnızca root olarak çalıştırması için bu shebang'ı betiğin ilk satırında kullanabilirsiniz:

#!/bin/su root
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.