Soru Bir komut dosyasında sudo kullanma


Bir kabuk betiğinde sudo komutunu kullanmak iyi ya da kötü bir uygulama mıdır? Bir avantajı, eğer kullanıcı betiği root olmayan bir şekilde çalıştırırsa, o zaman betik başarısızlıktan ziyade talep üzerine şifre istenir. Öte yandan, kullanıcı yakın bir zamanda sudo ile bir komut çalıştırmışsa, komut, kullanıcının istediği gibi olmayacak şekilde kökleri komut olarak örtük olarak çalıştıracaktır.

İşte bir örnek:

$ cat foo1
#!/bin/sh
sudo bar #implicit sudo
$ ./foo1

$ cat foo2
#!/bin/sh
bar
$ sudo ./foo2 #explicit sudo

5
2017-07-15 18:16


Menşei


Kötü uygulama olarak kabul edilir. bir kabuk betiğinde su ve sudo  sudo bash betikinde şifre yazdı - Bobby
Tamam, ikna oldum. Yorumunuzu cevap olarak açarsanız kabul edebilirim. - August Karlstrom
Tüm bir betik için sudo kullanarak (yani, root olarak çalışan komut içindeki her komut) korkunç bir fikir olarak görüyorum. Bir sebebi var sudoedit Düzenli dosyaları root olarak düzenlemenize izin vermez. Sisteminizi bozabilir ve kötü düşünülmüş bir senaryo ile kendinizi oldukça hızlı bir şekilde kilitleyebilirsiniz. chmod -R veya chown -R Bu, işleri hızla bozmak için ana klasörünüzü hedefler. - dragon788


Cevaplar:


Sudo kullanımı her zaman iyi bir uygulama. Ancak sudo kullanımını daha iyi hale getirmenin yolları vardır. Bir yöntem, belirli bir komutun yükseltilmiş ayrıcalıklarla çalışmasına açıkça izin vermektir.

Aşağıdakiler, yalnızca "kullanıcılar" grubundaki kullanıcıların şifre olmadan komut foo1'i çalıştırmasına izin verir.

%users ALL=(ALL) NOPASSWD: /full/path/to/foo1

Ancak, bir kullanıcı doğru şifreyi girmediği sürece yukarıdaki örnekte foo2 uygulamasına izin vermez.

Buna ek olarak, sudo'nun kullanıcı şifresini gerektirmesi ve root şifresi (şu andaki konfigürasyon seçeneğini unutuyorum) ve kullanıcıların aşağıdaki gibi ayrıcalıklarını tırmandırmasına izin verebilecek girişleri olmaması genellikle daha iyidir:

ALL ALL=(ALL) ALL

veya

%users ALL=(ALL) ALL

Herhangi bir komutun tırmanması için bir tekerlek grubunun veya benzer bir grubun kullanıcısı iyi bir uygulamadır. Sonunda, şifrelenmiş şeylerin fana vurmadığı sürece, hiç kimse tarafından (asla) kullanılmayacak olan, kök şifrenin bir kasada kilitlenmesi en iyisidir.


7
2017-07-15 18:31



Komutlarda kullanılıyorsa requiretty de kapalı olmalı. Bazı dağıtımlarda requirettyvarsayılan olarak ayarlanır. - Nils


/ kısa görüş

Şahsen, senaryoyu çalıştırmadan önce komut dosyasına bakmadığınıza inanıyorum, bu gerçekleşen yan etkiler çoğunlukla sizin hatanızdır. sudo Bu sizi örneklemez), ama aynı zamanda, her zaman bir senaryoyu ayrıştırmak ve övmek zor olabileceğini biliyorum. Genel olarak, rahatlığı ve güvenliği dengeleyebileceğim bir karma stratejiyi tercih ediyorum.

/ son görüş

Her zaman koşabildiğinizi unutmayın sudo -k İlk örtülü olmasını gerektiren bir komut dosyasını çağırmadan önce sudo şifrenizin sorulmasını çağırın; sudo komut dosyası içinde komut vermek için SADECE ilk çağrı için sizi arayacak sudo.

Sadece gerektiğinde sudo kullanarak güvenli, şiirsel bir betik gerçekleştirmenin birkaç yolu vardır, bazıları diğerlerinden daha icky / kötü tavsiye edilir. Bu gönderi, daha fazla genişleteceğimiz birkaç örnek / seçenek sunmaktadır. https://bitmingw.com/2017/01/22/use-sudo-in-scripts/

Komut dosyasını tümüyle çalıştırabilirsiniz. sudo Tanımladığınız gibi "açık", ancak bu aynı zamanda betik içindeki komutların root olarak çalıştığı anlamına gelir ve eğer iyi yazılmazsa ya da $USER komut dosyasının içinde değişebilir root ve bunun yerine kullanmak gerekiyordu $SUDO_USER o zaman sen acı dolu bir dünyada olabilirdin. Yanlışlıkla bunu geçmişte yaptım ve garip ve korkunç şeyler oldu ve sonra sen (ve ben) senin betiklerini korudun. if [ $EUID -eq 0 ]; then echo "Don't run as root!"; fi ya da tam tersi -gt 0 ve yazdığınız her betikte gardiyanlardan birini (ya da sizin için bir kısmını otomatikleştiren SaltStack / Kukla / Şef gibi konfigürasyon yönetim araçlarını öğrenmeyi) unutmayın.

sudo somescript.sh

Kullanmayı tercih ettiğim seçenek, TEMPORARILY çalışmasını çalıştırmaktır sudo sonsuz bir önbellek süresine sahip olursanız, başka hiçbir sudo komutu tarafından çalıştırılmayacak şekilde yeniden bir komut istemi (veya nasıl ayarlandığınıza bağlı olarak herhangi biri) gerekir. İdeal olarak, otomatik olarak ve test edilmiş bir işlevi (ya da "cache_sudo.sh" komut dosyasını) komut dosyalarınızın başına koyar ve ardından sonsuz zaman aşımını kaldırabilirsiniz. sudoers.d komut dosyası çıkar çıkmaz dosya (kill / finished / error) trap ve sonra sudo -k dosyayı kaldırdıktan sonra oturumu / belirtecini sona erdirmek için. Görmek bu cevap test örneği için ve sadece geçerli ise dosyayı ekleyin.

Bu manuel versiyon, bunu senaryonuza yazmayın.

sudo visudo -f /etc/sudoers.d/infinite_cache_myuser
#Add next line to the file
Defaults:YOUR_USER_NAME timestamp_timeout=-1

Sonsuz önbellek yararları betiğinizin içinde SADECE sudo ile root gerektiren komutları yükseltebilirsiniz. su $MY_REGULAR_USER some_command veya sudo -u $MY_REGULAR_USER some_command HER SINGLE komutu için. (Gereksiz yere sadece tekrar yükseltmek için daha az ağrılı ve tamamen güvensiz bir yol varsa, ayrıcalıkları düşürmek için tekrarlanan kodları gerçekten sevmiyorum).

Tekrarlanan kodun azaltılmasının bir yolu, ekleyen kısa bir komut olan "önek" tanımlar. sudo veya su $MY_USER komut dosyasının çalıştırılıp çalıştırılmayacağına bağlı olarak sudo ./myscript.sh veya ./myscript.sh ile sudo içeride.

Sen yazabilirsin sudoers ile hedef betiğin yürütülmesine izin vermek için kural sudo ve parola istemi yok ama bence bu ilk seçenek kadar kötü bir fikir, ancak root olmayan bir kullanıcı olarak çalışan bir cron işinden sudo çalıştırmak istediğinizde ancak kök gerektiren bir şeyi değiştirmeniz gerektiğinde biraz yardımcı oluyorsa veya başka bir kullanıcı, okumanız gerekse de man sudoers Bir kullanıcının başka bir kullanıcıyı taklit etmesine izin vermek için sözdizimini öğrenmek.

# Customize line below and add to /etc/sudoers or /etc/sudoers.d/my_script_runner
YOUR_USER_NAME ALL=(ALL:ALL) NOPASSWD:/abs/path/to/your/script

Ayrıca parolasız sudo'ya yalnızca gerekli olan komutlar için izin verebilir, bu da betiği root olmayan olarak çalıştırmanıza ve yine de bu komutlara erişmenize izin verir.

YOUR_USER_NAME ALL=(ALL:ALL) NOPASSWD:/usr/bin/apt-get update
YOUR_USER_NAME ALL=(ALL:ALL) NOPASSWD:/usr/bin/apt-get upgrade
YOUR_USER_NAME ALL=(ALL:ALL) NOPASSWD:/usr/bin/updatedb

Bu seçenek muhtemelen sonsuz önbellek numarasının arkasındaki ikinci tercihim. Dezavantajı, sadece ekleyebilmek yerine kök gerektiren yeni bir komut bulduğunuzda sudoers dosyasını düzenliyorsunuz. sudo komut dosyasında komutun önünde. Üst kısımda sadece şifre olmadan izin veriyorsunuz sudo Gerektiğinde, başka bir şifre girmeniz gerekebilir. sudo komutlar böylece daha güvenli kalıyor.


0
2017-11-29 02:06