Parola istemi olmadan belirli bir program root olarak nasıl çalıştırılır?


169

Parola olmadan sudo olarak bir şey çalıştırmam gerekiyor, bu yüzden bunu kullandım visudove dosyama ekledim sudoers:

MYUSERNAME ALL = NOPASSWD: /path/to/my/program

Sonra denedim:

$ sudo /path/to/my/program
[sudo] password for MYUSERNAME: 

Neden şifre istiyor? Parola istemeden, komutları root olmayan bir kullanıcıyla root olarak nasıl çalıştırabilirim / kullanabilirim?

Yanıtlar:


91

sudoersDosyada, kullanıcıyla da eşleşen başka bir girişiniz var . NOPASSWDKural öncelik almak için sırayla ondan sonra olması gerekir.

Bunu yaptıktan sonra, sudonormalde tüm komutlar için normalde bir şifre /path/to/my/programister, şifrenizi sormadan her zaman koşmanıza izin verir.


6
/path/to/my/programpython betiği olsaydı bu hala işe yarar mıydı?
sadmicrowave

Can programı yerine (yani içinde bash için belirlenen bir takma ad, olmak .bashrc)? Ya da içindeki bir kabuk betiği /usr/local/sbin? Denemek için.
Nikos Alexandris

Nikos - hayır, takma ad olamaz. Gerçek bir yola işaret etmelidir.
Paul Hedderly

Sudoers? nerede? cevabınızı kullanmak için heawy (
Vasilii Suricov

@VasiliiSuricov: Genellikle var /etc, ancak bazı sistemler başka bir yere koyuyor . Bulamazsan, dene man sudoers. Bu dosyanın yerel konumu , o sistem için oluşturulduğu mansırada sayfaya değiştirilmelidir sudo.
Warren Young,

135

/etc/sudoersİçinde birden fazla eşleşen giriş varsa , sudo sonuncusunu kullanır. Bu nedenle, bir şifre istemi ile herhangi bir komutu çalıştırabilirseniz ve şifre istemi olmadan belirli bir komutu çalıştırabilmek istiyorsanız, son istisnaya ihtiyacınız vardır.

myusername ALL = (ALL) ALL
myusername ALL = (root) NOPASSWD: /path/to/my/program

Kullanımına dikkat (root)programı diğer kullanıcıları olarak root olarak değil izin vermek. (Etkilerini düşünmediğiniz sürece gerekli olandan daha fazla izin vermeyin.)

Ubuntu kullanmayan veya varsayılan sudo yapılandırmasını değiştiren okuyucular için not (Varsayılan olarak Ubuntu sudo normaldir) : Kabuk betiğinin yükseltilmiş ayrıcalıklara sahip olması risklidir, temiz bir ortamdan başlamanız gerekir (bir kez kabuk başladığında, çok geç oldu (bkz . Kabuk betiklerinde setuid'e izin verin ), bu yüzden bunun için dikkat etmeniz gerekiyor) Eğer olduğundan emin olun Defaults env_resetbölgesi /etc/sudoersveya bu seçenek (derleme zamanı varsayılan olduğunu sudo sudo -V | grep enviçermelidir Reset the environment to a default set of variables).



5
@ adrian İsteğe bağlı komutlara kök olarak izin vermek istiyorsanız, bunu yapın john ALL=(ALL) NOPASSWD: all. Geçmenin bir anlamı yok su.
Gilles

Soru: kabuk betiğimin izinlerini, güvenlik amacıyla yalnızca root kullanıcısı tarafından değiştirilip okunabilmesi için değiştirmeli miyim? Bir parola gerekmeden verilen tüm izinlere sahip olan ve istediği şeyi yapması için senaryoyu değiştiren bir saldırganı düşünüyorum. Açıkçası, saldırgan hangi komut dosyalarının bu ayrıcalığa sahip olduğunu bilmek için sudoers dosyasını bile okuyamıyor, ancak depolandığı klasörü, bazılarının izin verildiğini umduğuna veya buna benzer bir şey bulduktan sonra da tüm özel komut dosyalarımla deneyebilir. .
Jeffrey Lebowski

1
@JeffreyLebowski Komut dosyasını çalıştıran (doğrudan veya dolaylı olarak) bir sudo kuralınız varsa, yalnızca kök dizininin (veya yine de kök yetkilerine sahip kişilerin) komut dosyası dosyasına ve komut dosyası dosyasını içeren dizine ve onun ana dizini vb. Kimsenin komut dosyasını okuyabileceği önemli değil (bir şifre veya başka bir şey içermiyorsa, ancak bu kötü bir fikir, eğer bir şifre varsa, kendi dosyasında olması gerekir, aksi takdirde, örneğin, örneğin kodun bu bölümünü bu sitede bir soruda kopyalayarak yapıştırma).
Gilles

1
@alper Hayır. Çok az şey yeniden başlatmayı gerektirir. Değiştirdikten sonra sudoers, özel bir şey yapmanız gerekmez: sudoher seferinde kontrol eder.
Gilles

24

UYARI : Bu cevap güvensiz kabul edildi. Aşağıdaki yorumları görün

Komple Çözüm: Aşağıdaki adımlar istenen çıktıyı elde etmenize yardımcı olacaktır:

  1. Yeni bir komut dosyası oluşturun ( create_dir.shistediğiniz komut dosyası adıyla değiştirin ):

    vim ~/create_dir.sh
    

    Betik kullanıcının giriş dizininde oluşturulacak

  2. Kök dizin düzeyinde bir klasör oluşturmak gibi yalnızca bir kullanıcının rootveya sudokullanıcının uygulayabileceği bazı komutları ekleyin :

    mkdir /abc
    

    Not:sudo Bu komutlara ekleme . Kaydet ve çık (kullanarak :wq!)

  3. Aşağıdakileri kullanarak yürütme izinleri atayın:

    sudo chmod u+x create_dir.sh
    
  4. Değişiklikleri yapın, böylece bu komut dosyası bir şifre gerektirmez.

    1. sudoersDosyayı aç :

      sudo visudo -f /etc/sudoers
      
    2. Sonuna aşağıdaki satırı ekleyin:

      ahmad ALL=(root) NOPASSWD: /home/ahmad/create_dir.sh
      

      ahmadKullanıcı adınız ne olursa olsun ile değiştirin . Ayrıca bunun son satır olduğundan emin olun. Kaydet ve çık.

  5. Şimdi komutu çalıştırırken eklediğiniz sudogibi ekleyin :

    sudo ./create_dir.sh
    

    Bu, şifre sormadan komut dosyasındaki komutları çalıştıracaktır.

Burada belirtilen kolay adımları izleyin http://step4wd.com/2013/09/14/run-root-commands-in-linux-ubuntu-without-password/


Burada ilgili adımları sağlamış ve bağlantıyı daha ayrıntılı bilgi için yedek olarak kullanmanız daha iyi olur. Bu şekilde, cevabınız artık geçerli olmasa bile cevabınızdaki değeri korur.
Anthon

15
Bu tavsiye güvensizdir. Bir sudokısmı sudo chmod u+x create_dir.sh, kullanıcının muhtemelen ev yöneticisi üzerinde (muhtemelen) mülkiyete sahip olması nedeniyle gereksizdir. Kullanıcı yazabildiğinden create_dir.sh, etkin bir şekilde o kullanıcıya serbest bir kök kabuğu verdiniz.
Lekensteyn

1
@Lekensteyn Kullanıcı olarak çalışan herhangi bir program anlamına da gelir. Belki de kullanıcının sudo ile herhangi bir şeyi parola olmadan çalıştırmasına izin verebilirsiniz.
pydsigner

2
Bir şey mi eksik? Ayrıcalıklarınızı yükseltmeye güvendiğiniz için tümünün chmodgereksiz olduğuna inanıyorum sudo.
G-Man

10

Bence sentaksın yanlış. En azından benim için çalışan aşağıdakileri kullanıyorum:

myusername ALL=(ALL) NOPASSWD: /path/to/executable

6
(ALL)Bölüm dışarı bırakarak tamamen aynı etkiye sahiptir, isteğe bağlıdır. Having (root)olsa daha iyi olurdu, ama onun yokluğu sorunu açıklamıyor.
Gilles

Bu komut için sudo için +1 ve başka bir şey yok! Tüm sistemi kırmak için sebep yok ...
Johan

3
@Johan: Bu zaten bir soru oldu.
Gilles

5

Sudo kullanmak veya sudoers config dosyasını değiştirmek zorunda kalmaktan kaçınmak istiyorsanız, şunları kullanabilirsiniz:

sudo chown root:root path/to/command/COMMAND_NAME
sudo chmod 4775 path/to/command/COMMAND_NAME

Bu, komutu sudoya gerek duymadan root olarak çalıştırır.


Vay, daha önce bu çözümü hiç duymamıştım, boggling
şey

En iyi cevabı bulmak için neden bu şeylerin altına kaydırmam gerekiyor? Bu basit güvenli çözüm için teşekkür ederiz.
RyanNerd

5

Manjaro gibi bir dağıtımınız varsa, önce / etc / sudoers tanımını geçersiz kılan bir dosyayla ilgilenmelisiniz, yeni yapılandırmalarınızı eklemek için dosyayı silebilir veya doğrudan bu dosyayla çalışabilirsiniz.

Bu dosya:

sudo cat /etc/sudoers.d/10-installer

Görmenin SADECE yolu kök ayrıcalıkları altında, bu dizini onsuz listeleyemezsiniz, bu dosya Manjaro'ya özgüdür, bu yapılandırmayı başka bir adla fakat aynı dizinde bulabilirsiniz.

İstediğiniz dosyaya, istediğiniz konfigürasyonları almak için aşağıdaki satırları ekleyebilirsiniz:

Bir grup için kimlik doğrulamasını yoksay

%group ALL=(ALL) NOPASSWD: ALL

veya Bir kullanıcının kimlik doğrulamasını yoksay

youruser ALL=(ALL) NOPASSWD: ALL

veya Kimlik doğrulamasını yoksay, belirli bir kullanıcı için yürütülebilir bir dosya

youruser ALL=(ALL) NOPASSWD: /path/to/executable

HIZLI NOT: SUDO'yu onaylamadan kullanmak için bir kapı açıyorsunuz, yani sisteminizdeki her şeyi değiştiren her şeyi çalıştırabilir, sorumlulukla kullanabilirsiniz.


4

Sudo'nun takma olmadığını doğrulayın. Böyle koş

/usr/bin/sudo /path/to/my/program

Örneğin bunun gibi bir kabuk takma adı:

alias sudo="sudo env PATH=$PATH"

bu davranışa neden olabilir.


Haklısın, yorumum burada düzensiz, bunun için üzgünüm. Yine de merak ediyorum - takma sudoersadın sudo tarafından işlenmesini nasıl değiştirmesini bekliyorsunuz ? Yoksa sudoşifreleri bulmak için daima bu hata mesajını basan bir şeye yönlendirmekten mi bahsediyorsunuz ? Bu pek mümkün değil ...
peterph

2
OP ile aynı problemi yaşıyordum. Bu sahip kaynaklandığı ortaya çıktı alias sudo="sudo env PATH=$PATH"skinTenimde ~/.bashrc. Sadece kendim için çözmek yerine ve işim hakkında kör bir şekilde devam etmek yerine, cevabımı bu konuya gelen başkaları için olası bir çözüm olarak sundum.
Sepero

1
Sorun değil, ancak belli olmadığı zaman (ki bu durumda en azından bazılarına göre değil), bazı bağlamlar sağlamak ve insanların sihirli teşvikler kullanmasını kör bir şekilde kullanmaktan alıkoymak için cevaba bir açıklama koymak iyidir. +2 (- (- 1) +1). :)
peterph

2

Komut dosyanızı yürütürken, olarak çalıştırmanız gerekir sudo /path/to/my/script.

Düzenleme: Başka bir cevaba yaptığınız yorumunuza dayanarak, bunu bir simgeden çalıştırmak istersiniz. .desktopTıpkı terminaldeki gibi, programınızı sudo ile yürüten bir dosya oluşturmanız gerekecektir .

Ayrıca gtk-sudogörsel bir şifre istemi için kullanmayı düşünebilirsiniz .

Büyük olasılıkla işleri kök olarak çalıştırmamanız gerektiği ve sistemi yoldan daha uzağa değiştirmenin gerektiği ve böylece kök izinlerine gerek duymamanız gerektiği fikrini göz önünde bulundurmanız gerekir.


7
Kabuk betiğini setuid yapmayın . Bkz . Kabuk betiklerinde setuid'e izin ver .
Gilles

Bahsetmemeyi bile düşündüm, çünkü bu çok kötü bir seçenek. Sildim, çünkü bu askerin tavsiyeyi, kötü bir tavsiye olduğuna dair uyarıda olsa bile kullanabilir!
Caleb

2

Bu benim için sorunu çözdü (yardımcı olabilecek diğer cevapların bazılarını da denedi):

Aradığım komut dosyası /usr/bin, yazma iznimin olmadığı bir dizindeydi (genellikle orada herhangi bir dosyayı okuyabilirim). Komut dosyası chmodded + x (çalıştırılabilir izinler) idi, ancak yine de işe yaramadı. Bu dosyayı kendi ev dizinimdeki bir yola taşımak yerine /usr/bin, nihayet bir şifre girmeden sudo ile arayabildim.

Ayrıca şüphe ettiğim bir şey (gelecekteki okuyucular için açıklığa kavuşturmak): Komut dosyanızı sudo olarak çalıştırmanız gerekir. Tip sudozaman çağıran komut. sudoKomut dosyanızın içinde gerçekten kök gerektiren komut için kullanmayın (benim durumumda klavye arka ışığını değiştirme). Belki bu da işe yarıyor, ama gerek yok ve yapmamak daha iyi bir çözüm gibi görünüyor.


İkinci paragraf benim sorunumun cevabını verdi
M. Ahmad Zafar 13.03

@MuhammadAhmadZafar Yardımcı oldu mu?
Luc,

4
Aslında sudobir betiğin içini kullanmak sudoers, söz konusu komutu bir parola olmadan çalıştırmak için uygun haklara (ayarlanmış ) sahip olmanız koşuluyla mükemmel derecede iyidir . İşleri biraz daha güvenli hale getiriyor.
peterph

Gerçekten bu cevap olarak yeniden yazılır kullanabileceği bir adım adım-by 'bu bunu nasıl olduğunu' yerine başka cevaplarla bir diyalog olarak
mors Kedi

@WalrustheCat İyi nokta. Cevabımı tekrar okuduğumda sanırım kendimden biraz kafam karıştı. Şu an tam olarak, durumun ne olduğunu hatırlamıyorum, bu yüzden daha iyi bir yazı yazamıyorum. Bunu çözebilirseniz, belki de birkaç cevabın bir kombinasyonunu, elbette yeni bir cevap gönderin!
Luc

1

Komut dosyanızı çalıştırmak için super komutunu yüklemek, yapılandırmak ve sonra kullanmak başka bir olasılık olabilir.

super /path/to/your/script

Bazı ikili çalıştırmak istiyorsanız yürütülebilir (içine derledik örn ELF olduğu -ki bazı C kaynak kodundan ikili) değil kök olarak bir komut-, sen belki o yapmayı düşünün setuid (ve aslında /bin/login, /usr/bin/sudove /bin/suve supertüm bu tekniği kullanıyor ). Ancak çok dikkatli olun, çok büyük bir güvenlik açığı açabilirsiniz .

Somut olarak, programınız paranoyak olarak kodlanmalıdır (bu nedenle "harekete geçmeden önce tüm argümanları ve çevre koşullarını kontrol edin, potansiyel olarak düşman bir kullanıcı varsayarak), sonra seteuid (2) ve arkadaşları (ayrıca bkz. Setreuid (2) ) dikkatlice kullanabilirsiniz (ayrıca bkz. yetenekler (7) ve kimlik bilgileri (7) ve yürütme (2) ...)

Böyle bir binary kurarken kullanacaksınız chmod u+s( chmod (1) ).

Ama çok dikkatli ol .

Böyle bir şeyi kodlamadan önce setuid hakkında Advanced Linux Programming dahil birçok şeyi okuyun .

Bir komut dosyası veya herhangi dikkat edin shebang -ed şey, setuid olamaz. Ancak (C cinsinden) saran küçük bir setuid-ikili kodunu kodlayabilirsiniz.


0

İdeal olarak, hangi komutların sudosizin için çalıştırılabileceğini özelleştiriyorsanız, bu değişiklikleri doğrudan dosyayı /etc/sudoers.d/düzenlemek yerine ayrı bir dosyada yapmanız gerekir sudoers. Dosyaları visudodüzenlemek için her zaman kullanmanız gerekir . Sen vermek ASLA NOPASSWDüzerine ALLkomutları.

Örnek: sudo visudo -f /etc/sudoers.d/mynotriskycommand

Satır onaylama izninizi ekleyin: myuser ALL= NOPASSWD: /path/to/your/program

Sonra kaydedin ve çıkın ve visudosözdizimi hatalarınız varsa sizi uyaracaktır.

sudo -lKullanıcıya verilen izinleri görmek için koşabilirsiniz , kullanıcıya özel NOPASSWDkomutlardan herhangi %groupyouarein ALL=(ALL) ALLbiri çıktıda herhangi bir komuttan ÖNCE görünürse , şifreniz istenir.

Kendinizi bu sudoers.d dosyalarının birçoğunu oluştururken bulursanız, belki de görsellerini daha kolay hale getirmek için her bir kullanıcı için adlandırılmış oluşturmak istersiniz. FILE NAMES ve RULES dosyalarının sıralamasının çok önemli olduğunu aklınızda bulundurun, yüklü olan LAST bir önceki girişlerden daha fazla mı yoksa LESS mı olduğunu kazanır.

Dosya adı sıralamasını 00-99 veya aa / bb / cc öneki kullanarak kontrol edebilirsiniz, ancak sayısal öneki olmayan HERHANGİ bir dosyanız varsa, numaralandırılmış dosyaların ardından yükleyeceğini unutmayın. ayarlar. Bunun nedeni, dil ayarlarınıza bağlı olarak, "sözcük sıralama" sırasındaki kabuğun önce sayıları sıralar ve ardından "artan" sıralamaya göre sıralamada büyük ve küçük harfleri araya sokması olabilir.

Çalıştırmayı printf '%s\n' {{0..99},{A-Z},{a-z}} | sortve printf '%s\n' {{0..99},{A-Z},{a-z}} | LANG=C sortgeçerli dilin AaBbCcvb. Yazdırılıp yazdırılmayacağını veya ABCdaha sonra kullanılacak abcen iyi "son" harf önekinin ne olacağını belirlemek için deneyin .


0

Herhangi bir kullanıcının şifre sormadan programı sudo olarak çalıştırmasına izin vermek için aşağıdaki satırı ekleyebilirsiniz

%sudo ALL=(root) NOPASSWD: /path/to/your/program

içinde /etc/sudoers

Not % sudo yapmak.


Bu bir sudo kuralını gerçekleştirmenin bir yolu olsa da, NOPASSWD bayrağını neden bu kuralda ayarlamanın bir şifre sorgusu ile sonuçlandığına dair bir soruyu cevaplamıyor. Bunun neden olduğu hakkında bir fikir için kabul edilen cevaba bakın.
Jeff Schaller

0

Aşağıdaki seçenek, yalnızca seçeneklerin bir bölümünün değişken olduğu belirli bir seçenek kümesi varsa, parola olmadan bir komut çalıştırmak istediğiniz durum içindir . AFAIK, sudoers bildirimlerinde değişkenleri veya değer aralıklarını kullanmak mümkün değildir, yani aşağıdakilere açıkça erişime izin verebilir command option1ancak şunları kullanamazsınız command option2:

user_name ALL=(root) /usr/bin/command option1

yapıdır ama eğer command option1 value1nerede, value1değişebilir, sen her olası değeri için açık Sudoers hatları olması gerekir value1. Shell betiği etrafına bir yol sağlar.

Bu cevap, M. Ahmad Zafar'ın cevabından ilham aldı ve buradaki güvenlik sorununu düzeltti.

  1. Komutu çağırmadan bir kabuk betiği oluşturun sudo.
  2. Komut dosyasını kök ayrıcalıklı bir klasöre (örn. /usr/local/bin/) Kaydedin, dosyayı chown root:wheel /usr/local/bin/script_namebaşkalarına (örneğin chmod 755 /usr/local/bin/script_name) yazma erişimi olmayan bir kök (sahip ) yapın.
  3. Visudo kullanarak sudo'lara istisna ekleyin:

    user_name ALL=(root) NOPASSWD: /usr/local/bin/script_name.

  4. Senaryonuzu çalıştırın sudo script_name.

Örneğin, macOS'ta ekran uyku zaman aşımını değiştirmek istiyorum. Bu kullanılarak yapılır:

sudo pmset displaysleep time_in_minutes

Uyku zaman aşımını değiştirmeyi, parola yazmanın zorluğunu haklı çıkarmayan masum bir eylem olarak değiştirmeyi düşünüyorum, ancak pmsetbirçok şey yapabilir ve bu diğer şeyleri sudo parolanın arkasında tutmak isterim.

Bu yüzden aşağıdaki komut dosyası var /usr/local/bin/ds:

#!/bin/bash
if [ $# -eq 0 ]; then
        echo 'To set displaysleep time, run "sudo ds [sleep_time_in_minutes]"'
else
        if [[ $1 =~ ^([0-9]|[1-9][0-9]|1[0-7][0-9]|180)$ ]]; then
                pmset displaysleep $1 
        else
                echo 'Time must be 0..180, where 0 = never, 1..180 = number of minutes'
        fi
fi

sudoersDosyanın sonunda şu satır var:

user_name ALL=(root) NOPASSWD: /usr/local/bin/ds

Zaman aşımını 3 dakika olarak ayarlamak için komut dosyasını normal kullanıcı hesabından çalıştırıyorum user_name:

sudo ds 3

Not: Komut dosyamın çoğu, zorunlu olmayan giriş doğrulamadır, bu nedenle aşağıdakiler de işe yarar:

#!/bin/bash
pmset displaysleep $1 
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.