Sudo'nun ortam değişkenlerimi korumasını nasıl sağlayabilirim?


47

Solaris 5.10'daki sudo 1.7.4p4 ve RHEL4 u6'daki sudo 1.6.7p5'in kullanılması Ortam değişkenlerimin nasıl korunacağını göremiyorum, örneğin $ PYTHONPATH. Bu satırı sudo'lara ekledim, ancak herhangi bir fark yaratmıyor:

Defaults !env_reset

Yanlış bir şey mi yapıyorum, yoksa sudo kurulumu sadece env_reset bayrağına saygı göstermiyor mu?

Düzenleme: En azından Solaris'te, bu sorunun kabuğa bağlı olduğunu gördük! Standart kök kabuğu Bourne, eğer sudo ( sudo bash) altında bash çalıştırırsak ! Env_preset çevreyi koruyacaktır (PATH ve LD_LIBRARY_PATH dahil). Söylemem gereken kafa karıştırıcı davranış budur.


Yanıtlar:


44

Dikkatli kullanın, sudo ve değişkenlerle ilgili güvenlik sorunları var.

Bilmelisin man sudoerski kullanmalısın.

Varsayılanlar env_reset
Varsayılanlar env_keep + = "PYTHONPATH DİĞER YAZILAN"

Ubuntu'da sudobazı değişkenleri korur. sudo -iroot olarak giriş yapmak ve daha sonra komutu çalıştırmak gibi. Her ikisi de uygunsuz olabilir, birincisi sudo nano myfileevinizin içindeki kök dosyalarını bırakır ve ikincisi sudo -i nano myfile/ root / myfile dosyasını açmaya çalışır.


Çalıştırmak

sudo printenv PATH

ve ne verdiğini görün. İşte verir

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

Örneğin. Şimdi koş sudo visudove satırı ekle

Defaults        secure_path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

hemen önce buldukların yerine. Gerekirse buna yeni bir yol ekleyin.

Kütüphaneler hakkında:

sudo LD_LIBRARY_PATH=/usr/lib/path/to/a/safe/library your command

Linux dağıtımları çok özen gösterir PATHve bununla oynamadan önce gerçekten dikkatli olmalısınız. " ." Gibi yollar eklemeye özellikle dikkat edin veya /home/usernamebu güvenli değil.

Yol eklemenin tehlikelerinden biri, bu yollardaki dosyaların rootkötü amaçlı yazılımdan yararlanabilecek sistem güvenliğinde bir pencere açarak yürütülme ihtimalinin açılmasıdır. Başka tehlikeler olabilir. Sadece ne yaptığını bildiğinden emin ol. sudoGüvenlik önlemlerini atlamak , Solaris'inizi Windows XP kadar güvenli hale getirebilir.


Önerin için teşekkürler. En azından Solaris'te, env_keep, PATH ve LD_LIBRARY_PATH'ı görmezden gelse de, yalnızca kısmen çalıştığı anlaşılıyor. Belki sudo, "tehlikeli" değişkenleri korumayı reddetmesini sağlayan ayarlarla inşa edilmiştir?
aknuds 1

AKNUDS gibi başka bir takılabilir ile çalıştı mı? Ayrıca sudo sudo -V komutunu çalıştırabilir (evet, iki kez sudo!) Ve ne yazdığını görebilirsiniz. İşte yukarıdaki çözüm PYTHONPATH ile iyi çalışıyor, ancak PATH gerçekten özel görünüyor. Asıl sorun PATH ile. Ubuntu’da, PATH’ı kasıtlı olarak susturan bir sudo oluştururlar.
user39559

env_keep PYTHONPATH ve HOME'u benim için sakladı, bu yüzden bazı filtreler oluyor.
aknuds 1

Gözden geçirilmiş çözümünüzde, Secure_path'i değiştirerek sudo PATH'i bağladığımı mı söylüyorsunuz? Bunu yapmak istediğimi sanmıyorum. Muhtemelen soruma bir cevaba yaklaşıyoruz; Sudo reset_env dosyasını yoksaymak ve env_keep ile belirtildiğinde PATH ve LD_LIBRARY_PATH gibi değişkenleri yoksaymak için yapıldığını düşünüyorum. Ben Hiç önemli değil, ben sudo altında YOLU / LD_LIBRARY_PATH korumadan yapabileceğini düşünüyorum ama bilmen gereken hala ilginç neden olmaz işler :)
aknuds1

İşe yaramaz çünkü sudoyazarlar sizi engellemekte dikkatli davrandılar. Kötü amaçlı kitaplığın, sudo tarafından kullanılan yolda bulunduğundan yüklenmesini istemiyorsunuz. Demek bu yüzden sıfırlandı. Kök tarafından çalıştırılması gereken şeyleri kodluyorsanız, bunları uygun sistem dizinine kopyalayın.
user39559

8

İddia etmek sudoers, başkalarının söylediği gibi, dikkatle yapılmalıdır.

Korumak istediğiniz belirli ortam değişkenleri olduğunda, daha basit durumlar için daha basit bir yaklaşım sadece istediğiniz ortam değişkenini doğrudan sudo içinden geçirmektir (bu [VAR=value]sudo cmdline yardımında gösterildiği gibi ).

Birden fazla değişken için de gösterdiğim bu küçük örneğe bakın.

$ export MY_V1=1
$ export MY_V2=2
$ printenv | grep MY_V
MY_V2=2
MY_V1=1
$ sudo MY_V1=$MY_V1 MY_V2=$MY_V2 printenv | grep MY_V
MY_V2=2
MY_V1=1

Söz konusu orijinal PYTHONPATHörnek için aşağıdakileri kullanın:

$ sudo PYTHONPATH=$PYTHONPATH python some_script.py
<script_output_here>

Bu tür bir şey için bir takma ad oluşturmak kullanışlıdır. Gibi:

$ alias sudopy='sudo PYTHONPATH=$PYTHONPATH python'

1
Bunu yapmak iyi olabilir - alias sudopy = 'sudo PYTHONPATH = $ PYTHONPATH python' - sonra sudopy kullanın some_script.py
Able Mac

@AbleMac Haklısın. Bu bir hataydı ... Düzelteceğim. Teşekkürler!
Russ

3

Sizin Defaults !env_resetgörünüyor Tamam, ayrıca sudo demeyeceğiz varsayarak -Eseçeneği.

Bu girişi tamamen kaldırmayı deneyebilirsin.

Doğru sudoers dosyasını düzenlediğini doğruladın mı? Ne olabileceğini tahmin ediyorum /etc/sudoersya /usr/local/etc/sudoersda nasıl yüklendiğine bağlı. Kullanarak düzenlediniz mi visudo?

Nasıl sudo çalıştırıyorsun? sudo python, sudo su, sudo su -, sudo -s, Başka bir şey? Sadece sudo pythonve sudo suçevrenizi koruyacaktı.

Ne env | grep PYTHONPATHdiyor? Eğer değilse, PYTHONPATH ürününün çalıştırılarak dışa aktarıldığından emin olun export PYTHONPATHve tekrar deneyin.

Ne sudo env | grep PYTHONPATHdiyor? Beklenen değeri yazdırırsa, PYTHONPATH değerinizin üzerine başka bir şey yazıyordur. Belki root'un .bashrc veya .bash_profile veya sistem genelinde konfigürasyon dosyaları.


1
Doğru sudo'ları düzenlediğimden, kurulum önekinin sudo'ya karşılık geldiğinden eminim. Ben "sudo su" olarak sudo kullanıyorum. Size geri dönmek zorunda kalacağım, birkaç gün içinde ne yazık ki, önerilerinizin kalanına bakacağım. Teşekkürler!
aknuds1

1
Doğru dosya olup olmadığını görmek için editorveya gibi önemli bir ayarı değiştirmeyi deneyin passprompt. Veya strace, dtrace, truss veya benzerini kullanın ve hangi dosyaları açtığını görün.
Mikel

env | grep PYTHONPATH kullanıcım beklenen değeri yazdırırken sudo altında hiçbir şey yazdırılmıyor. Sudoer'leri düzenleyerek, "env_keep" değiştirilerek PYTHONPATH'in korunmasını sağlayabilirim. Ancak, env_keep PATH veya LD_LIBRARY_PATH öğesini korumaz. Sanırım sudo, PATH ve LD_LIBRARY_PATH gibi değişkenleri korumamak için bir güvenlik kısıtlamasına sahip? Belki bir inşa zamanı ayarı?
aknuds1

1
! env_reset söyleyebileceğim kadarıyla yok sayılıyor, ancak yarın iki kez kontrol edebilirim. Eminim env_delete ayarlanmadı, ama ben de kontrol edebilirim.
aknuds1

1
! Env_reset dosyasının dikkate alınmadığını ve env_delete ayarlanmadığını onayladım.
aknuds 1

-1

LD_LIBRARY_PATH için Ubuntu belgelerine göre :

/Etc/ld.so.conf.d/*.conf yapılandırma dosyalarını kullanmalısınız

Sonra:

  1. İçine bir ld.soyapılandırma dosyası ekleyin /etc/ld.so.conf.d/.LD_LIBRARY_PATH

  2. Önbelleği şu şekilde güncelle:

    sudo ldconfig -v
    

Güzel, ama soru Ubuntu ile ilgili değil. İpucu: Bir dahaki sefere sorunun altındaki etiketlere bakın.
DavidPostill
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.