Sudo neden PATH'ı değiştiriyor?


281

Bu PATHsudo'suz değişken:

$ echo 'echo $PATH' | sh 
/opt/local/ruby/bin:/usr/bin:/bin

Bu PATHsudo değişkenidir:

$ echo 'echo $PATH' | sudo sh
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

Anlayabildiğim kadarıyla, dokunulmadan sudobırakılması gerekiyordu PATH. Neler oluyor? Bunu nasıl değiştirebilirim? (Bu Ubuntu 8.04 üzerindedir).

GÜNCELLEME: gördüğüm kadarıyla, komut dosyalarının hiçbiri PATHherhangi bir şekilde kök değişikliği olarak başlamadı .

Gönderen man sudo:

Komut sahtekarlığını önlemek için sudo, kullanıcının PATH'sinde (veya her ikisi PATH'de ise) bir komut ararken ``. '' Ve `` '' (her ikisini de geçerli dizini gösterir) denetler. Ancak, gerçek PATH ortam değişkeninin değiştirilmediğini ve değişmeden sudo'nun yürüttüğü programa aktarıldığını unutmayın.


Kök .bashrc içinde PATH ayarlayan bir şey var mı? Bu, Linux'ta olduğunuz için sh'nin gerçekten bash olduğunu varsayar.
Greg Hewgill

Yanıtlar:


241

Bu sinir bozucu bir işlev birçok dağıtımda sudo'nun bir özelliği .

Ubuntu bu "sorun" üzerinde çalışmak için ~ / .bashrc benim aşağıdakileri yapmak

alias sudo='sudo env PATH=$PATH'

Yukarıdakilerin, $ PATH değerini kendileri sıfırlamayan komutlar için çalışacağını unutmayın. Ancak su '$ PATH' ı sıfırlar, bu yüzden -p'yi kullanmamasını söylemelisiniz. IE:

sudo su -p

46
Bu "sinir bozucu işlev", truva atı almanızı engeller. Belirli bir $ PATH zorlama bir özellik değil, bir hata --- diyorum ki $ PATH dışında bir programın tam yolunu yazmak yapar.
Chris Jester-Young

29
Evet, ama tamamen mantıksız. Muhtemelen iyi adamları kötü adamlardan daha fazla kandırır.
Brian Armstrong

31
Sadece sezgisel değil, yanlış belgelenmiştir. Sudo için adam sayfalarını okumak ve yapılandırmayı bir Fedora kutusuyla karşılaştırmak, yolun korunması gerektiğini düşündüm. Gerçekten de, "sudo -V" bile "Korunacak ortam değişkenleri: PATH" der.
Jason R. Coombs

6
sinir bozucu. dönem. Eğer sudo tarafından 'seni trojaned olsun' olsaydı o olmadan aynı trojaned alabilir. Ancak, daha zor, ancak normal kullanıcınızla bile yanlış yerden kod çalıştırıyorsanız, işler zaten yeterince kötüdür.
gcb

7
Sudo takma adı kullanmayın; @Jacob tarafından verilen Defaults env_reset ile ilgili cevaba bakınız.
greg_1_anderson

121

Başka birinin bunun üzerinde çalışması ve tüm kullanıcılar için tüm yol değişkeninin değiştirilmesini devre dışı bırakmak istemesi durumunda.
Komutunu kullanarak Sudoers dosyasını erişin: visudo. Aşağıdaki satırı bir yerde görmelisiniz:

Varsayılanlar env_reset

sonraki satıra aşağıdakileri eklemeniz gerekir

Varsayılanlar!

secure_path varsayılan olarak etkindir. Bu seçenek, sudo yaparken $ PATH değerinin ne yapılacağını belirtir. Ünlem işareti özelliği devre dışı bırakır.


6
başka bir yol:Defaults env_keep = "PATH"
gcb

1
Secure_path benim için modern sistemlerde çok çalıştı; eski bir ubuntu 8.04 kutusunda, Defaults env_keep = "PATH" hile yaptı.
greg_1_anderson

29
Secure_path komutunu devre dışı bırakmak yerine buna ekleyebilirsiniz. Örneğin benim durumumda "Defaults secure_path = / sbin: / bin: / usr / sbin: / usr / bin: / some / custom / directory" satırını ekledim; burada "some / custom / directory", ihtiyacım olan yol sudo için kullanılabilir hale getirmek.
Hector Correa

@HectorCorrea çözümü IMO'nun daha iyi bir yoludur.
chakrit

32

PATH bir ortam değişkenidir ve varsayılan olarak sudo ile sıfırlanır.

Bunu yapabilmek için özel izinlere ihtiyacınız var.

itibaren man sudo

       -E -E (çevreyi koru) seçeneği env_reset'i geçersiz kılar
           sudo kullanıcılarında seçenek (5)). Yalnızca,
           ing komutu SETENV etiketine sahiptir veya setenv seçeneği sudo-
           ers (5).
       Komut için ayarlanacak ortam değişkenleri de iletilebilir
       komut satırı VAR = değer biçiminde , örneğin
        LD_LIBRARY_PATH = / usr / local / pkg / lib. Komutta iletilen değişkenler
       hattı normal ortam değişkenleri ile aynı kısıtlamalara tabidir.
       önemli bir istisna dışında. Setenv seçeneği ayarlanmışsa
       sudoers, çalıştırılacak komut SETENV etiket kümesine veya
       eşleşmesi TÜMÜ olduğunda, kullanıcı,
       bidden. Daha fazla bilgi için sudo kullanıcılarına (5) bakın.

Kullanım örneği:

cat >> test.sh
env | grep "MYEXAMPLE" ;
^D
sh test.sh 
MYEXAMPLE=1 sh test.sh
# MYEXAMPLE=1
MYEXAMPLE=1 sudo sh test.sh 
MYEXAMPLE=1 sudo MYEXAMPLE=2 sh test.sh 
# MYEXAMPLE=2

Güncelleme

adam 5 sudo: 

     env_reset Ayarlanmışsa, sudo ortamı yalnızca içerilecek şekilde sıfırlar
                       LOGNAME, SHELL, USER, USERNAME ve SUDO_ * değişken-
                       ables. Arayanın ortamında bulunan ve
                       daha sonra env_keep ve env_check listeleri eklenir.
                       Env_keep ve env_check'in varsayılan içeriği
                       listeler sudo kök ile çalıştırıldığında görüntülenir
                       -V seçeneği. Sudo SECURE_PATH ile derlenmişse
                       seçeneği, değeri PATH ortamı için kullanılacaktır
                       değişken. Bu bayrak varsayılan olarak açıktır.

Bu nedenle, bunun derlenmiş olup olmadığını kontrol etmeniz gerekebilir.

Gentoo'da varsayılan olarak

# ( From the build Script )
....
ROOTPATH=$(cleanpath /bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/opt/bin${ROOTPATH:+:${ROOTPATH}})
....
econf --with-secure-path="${ROOTPATH}" 

17

Görünüşe göre bu böcek bir süredir ortalıkta! Yararlı bulabileceğiniz bazı hata referansları (ve abone olmak / oy vermek, ipucu, ipucu ...) isteyebilirsiniz:


Debian bug # 85123 ("sudo: SECURE_PATH hala geçersiz kılınamıyor") (2001'den itibaren!)

Görünüşe göre Bug # 20996 sudo'nun bu versiyonunda hala mevcut. Değişiklik, çalışma zamanında geçersiz kılınabileceğini söylüyor, ancak henüz nasıl yapılacağını henüz keşfetmedim.

Sudoers dosyanıza böyle bir şey koymadan bahsediyorlar:

Defaults secure_path="/bin:/usr/bin:/usr/local/bin"

ama en azından Ubuntu 8.10 bunu yaptığımda, bana bu hatayı veriyor:

visudo: unknown defaults entry `secure_path' referenced near line 10

Ubuntu hatası # 50797 ("--with-secure-path ile oluşturulmuş sudo sorunlu")

Daha da kötüsü, anlayabildiğim kadarıyla, sudoers dosyasında secure_path'e saygı duymak imkansız. Örneğin, kullanıcılarınıza / opt altında bir şeye kolay erişim sağlamak istiyorsanız, sudo dosyasını yeniden derlemeniz gerekir.


Evet. Orada ihtiyacı recompile gerek kalmadan bu "özelliğini" geçersiz kılmak için bir yol olarak. Çevreniz için neyin en iyi olduğunu söyleyen ve sonra onu kapatmanın bir yolunu vermeyen güvenlik bağnazlarından daha kötü bir şey yoktur.


Bu gerçekten sinir bozucu. Güvenlik nedeniyle geçerli davranışı varsayılan olarak tutmak akıllıca olabilir, ancak kaynak kodundan yeniden derlemekten başka bunu geçersiz kılmanın bir yolu olmalı! Birçok insan PATH mirasına ihtiyaç duymaktadır. Acaba neden hiçbir bakıcıya bakmıyor, bu da kabul edilebilir bir çözüm bulmak kolay görünüyor.


Bu şekilde çalıştım:

mv /usr/bin/sudo /usr/bin/sudo.orig

ardından aşağıdakileri içeren bir dosya / usr / bin / sudo oluşturun:

#!/bin/bash
/usr/bin/sudo.orig env PATH=$PATH "$@"

normal sudo'nuz aynı güvenli olmayan sudo gibi çalışır


Ubuntu hatası # 192651 ("sudo yolu her zaman sıfırlanır")

Bu hatanın bir kopyasının orijinal olarak Temmuz 2006'da yapıldığı göz önüne alındığında, etkisiz bir env_keep'in ne kadar süredir faaliyette olduğu net değil. Kullanıcıları yukarıda listelenen numaralar kullanmaya zorlamanın yararları ne olursa olsun, sudo ve sudo kullanıcılarına yönelik man sayfaları kesinlikle PATH'yi değiştirme seçeneklerinin etkin bir şekilde gereksiz olduğu gerçeğini yansıtmalıdır.

Belgeleri gerçek yürütmeyi yansıtacak şekilde değiştirmek dengesiz ve çok yardımcıdır.


Ubuntu hatası # 226595 ("PATH'i korumak / belirlemek mümkün değil")

Ben sudo PATH ek std olmayan ikili klasörler ile çalıştırmak gerekir. Zaten / etc / ortamına benim gereksinimleri eklediğimde sudo altında çalıştırırken eksik komutlar hakkında hatalar var şaşırdım .....

Bunu başarılı olmadan düzeltmek için aşağıdakileri denedim:

  1. " sudo -E" Seçeneğini kullanmak - işe yaramadı. Mevcut PATH'm hala sudo tarafından sıfırlandı

  2. / Etc / sudoers içinde " Defaults env_reset" to " Defaults !env_reset" değiştirmek - ayrıca işe yaramadı (sudo -E ile birleştirildiğinde bile)

  3. / Etc / sudoers içindeki uncommenting env_reset(örn. " #Defaults env_reset") Da çalışmadı.

  4. Defaults env_keep += "PATH"/ Etc / sudoers klasörüne ' ' eklemek de işe yaramadı.

Açıkçası - adam belgelerine rağmen - sudo PATH ile ilgili olarak tamamen kodlanmıştır ve kullanıcıların PATH'ını tutma konusunda herhangi bir esnekliğe izin vermez. Sudo kullanarak kök izinleri altında varsayılan olmayan yazılım çalıştıramaz gibi çok sinir bozucu.


13

Bu benim için çalışıyor gibiydi

sudo -i 

sudo olmayan PATH


'sudo -i' Ubuntu'da yardımcı olmuyor (Ubuntu 14.04.3 LTS'yi kontrol ettim). $ PATH hala sudo tarafından değiştirildi.
Marcin Raczyński

11

Aslında sudo PATH sıfırlamak için istenir düşünüyorum: aksi takdirde kullanıcı hesabınızın güvenliğini aşmış bir saldırgan, kullanıcıların PATH her türlü araçların arka kapı sürümleri koymak olabilir ve sudo kullanırken yürütülür.

(tabii ki sudo sıfırlama, PATH bu tür sorunlara tam bir çözüm değildir, ancak yardımcı olur)

Gerçekten kullandığınızda olan budur

Defaults env_reset

/ etc / Sudoers kullanmadan exempt_groupya da env_keep.

Bu ayrıca kullanışlıdır, çünkü sudo yoluna yalnızca kök ( /sbinve gibi /usr/sbin) için yararlı olan dizinleri kullanıcılarınızın yollarına eklemeden ekleyebilirsiniz. Sudo tarafından kullanılacak yolu belirtmek için:

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

bir sudoer hesabına erişen bir saldırgan daha da kötü şeyler yapabilir.
user508546 20:12

İyi bir tavsiye. Ubuntu 12.04 Sunucusunda benzer bir ayar varsayılan değerdir.
Tsutomu

7

Şimdi karmik depolardan sudo kullanarak çalışır. Yapılandırmamdan ayrıntılar:

root@sphinx:~# cat /etc/sudoers | grep -v -e '^$' -e '^#'
Defaults    env_reset
Defaults    secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/grub-1.96/sbin:/opt/grub-1.96/bin"
root    ALL=(ALL) ALL
%admin ALL=(ALL) ALL
root@sphinx:~# cat /etc/apt/sources.list
deb http://au.archive.ubuntu.com/ubuntu/ jaunty main restricted universe
deb-src http://au.archive.ubuntu.com/ubuntu/ jaunty main restricted universe

deb http://au.archive.ubuntu.com/ubuntu/ jaunty-updates main restricted universe
deb-src http://au.archive.ubuntu.com/ubuntu/ jaunty-updates main restricted universe

deb http://security.ubuntu.com/ubuntu jaunty-security main restricted universe
deb-src http://security.ubuntu.com/ubuntu jaunty-security main restricted universe

deb http://au.archive.ubuntu.com/ubuntu/ karmic main restricted universe
deb-src http://au.archive.ubuntu.com/ubuntu/ karmic main restricted universe

deb http://au.archive.ubuntu.com/ubuntu/ karmic-updates main restricted universe
deb-src http://au.archive.ubuntu.com/ubuntu/ karmic-updates main restricted universe

deb http://security.ubuntu.com/ubuntu karmic-security main restricted universe
deb-src http://security.ubuntu.com/ubuntu karmic-security main restricted universe
root@sphinx:~# 

root@sphinx:~# cat /etc/apt/preferences 
Package: sudo
Pin: release a=karmic-security
Pin-Priority: 990

Package: sudo
Pin: release a=karmic-updates
Pin-Priority: 960

Package: sudo
Pin: release a=karmic
Pin-Priority: 930

Package: *
Pin: release a=jaunty-security
Pin-Priority: 900

Package: *
Pin: release a=jaunty-updates
Pin-Priority: 700

Package: *
Pin: release a=jaunty
Pin-Priority: 500

Package: *
Pin: release a=karmic-security
Pin-Priority: 450

Package: *
Pin: release a=karmic-updates
Pin-Priority: 250

Package: *
Pin: release a=karmic
Pin-Priority: 50
root@sphinx:~# apt-cache policy sudo
sudo:
  Installed: 1.7.0-1ubuntu2
  Candidate: 1.7.0-1ubuntu2
  Package pin: 1.7.0-1ubuntu2
  Version table:
 *** 1.7.0-1ubuntu2 930
         50 http://au.archive.ubuntu.com karmic/main Packages
        100 /var/lib/dpkg/status
     1.6.9p17-1ubuntu3 930
        500 http://au.archive.ubuntu.com jaunty/main Packages
root@sphinx:~# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/opt/grub-1.96/sbin:/opt/grub-1.96/bin
root@sphinx:~# exit
exit
abolte@sphinx:~$ echo $PATH
/home/abolte/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/opt/grub-1.96/sbin:/opt/grub-1.96/bin:/opt/chromium-17593:/opt/grub-1.96/sbin:/opt/grub-1.96/bin:/opt/xpra-0.0.6/bin
abolte@sphinx:~$ 

Sonunda bunu bir hack kullanmadan çözmek harika.


4
Belki de temiz bir Karmic kurulumuna sahip birisinin bu sorunu çözmek için yapılandırmalarını nasıl güncelleyebileceğini belirtmek için bunu yeniden yazmayı düşünebilirsiniz.
Jason R. Coombs

4
# cat .bash_profile | grep PATH
PATH=$HOME/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin
export PATH

# cat /etc/sudoers | grep Defaults
Defaults    requiretty
Defaults    env_reset
Defaults    env_keep = "SOME_PARAM1 SOME_PARAM2 ... PATH"

3

/ Etc / sudoers içindeki "Defaults env_reset" komutunu yazmanız yeterlidir


3

Sadece düzenleme env_keepiçinde/etc/sudoers

Şuna benziyor:

Defaults env_keep = "LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION LC_MEASURE MENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE LC_TIME LC_ALL L ANGUAGE LINGUAS XDG_SESSION_COOKIE"

Sadece sonunda PATH ekleyin, bu yüzden değişiklikten sonra şöyle görünecektir:

Defaults env_keep = "LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION LC_MEASURE MENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE LC_TIME LC_ALL L ANGUAGE LINGUAS XDG_SESSION_COOKIE PATH"

Terminali kapatın ve tekrar açın.


Bekle PATH 2 ** gerekir? PATH neden ** gereklidir?
CMCDragonkai

@CMCDragonkai Kalın (işaretlemede) olarak biçimlendirilmiş, ancak birisi (yığın taşması parmakları işaret etmeme izin vermiyor) kod olarak işaretlemek için düzenledi.
1j01

2

Secure_path arkadaşın, ama kendini secure_path'tan muaf tutmak istiyorsan

sudo visudo

Ve ekle

Varsayılanlar exempt_group = your_goup

Bir grup kullanıcının bir grup oluşturmasını muaf tutmak istiyorsanız, tüm kullanıcıları gruba ekleyin ve bunu exempt_group'unuz olarak kullanın. adam 5 sudoers daha fazlası için.


1

OpenSUSE dağıtımındaki yorumlarda önerilen çözüm değiştirmeyi önerir:

Defaults env_reset

için:

Defaults !env_reset

ve muhtemelen gerekli olmayan aşağıdaki satırı yorumlamak için:

Defaults env_keep = "LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION LC_MEASURE    MENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE LC_TIME LC_ALL L    ANGUAGE LINGUAS XDG_SESSION_COOKIE"

1

/ etc / sudores dosyasındaki "Default env_reset" ve "Default secure_path ..." için yorum yapın


1

Dosyanızı sudoers kullanılan bir dizine taşıyabilirsiniz:

    sudo mv $HOME/bash/script.sh /usr/sbin/ 

0

E, yolunuza bir şey eklemezseniz gerçekten bir test değil:

bill @ bill-desktop: ~ $ ls -l / opt / pkg / bin
toplam 12
-rwxr-xr-x 1 kök kökü 28 2009-01-22 18:58 foo
bill @ bill-desktop: ~ $ hangi foo
/ Opt / pkg / bin / foo
bill @ bill-desktop: ~ $ sudo su
root @ bill-desktop: / home / bill # hangi foo
Tasarı-masaüstüne @ root: / home / fatura # 

0

Su veya sudo kullanıldığında ENH_SUPATH ve /etc/login.defs içinde tanımlanan ENV_PATH tanımlarıyla PATH sıfırlanacaktır.


0

$ PATH bir ortam değişkenidir ve $ PATH değerinin başka kullanıcılar için farklı olabileceği anlamına gelir .

Sisteminizde oturum açarken profil ayarınız $ PATH değerine karar verir .

Şimdi bir göz atalım: -

User       |        Value of $PATH
--------------------------
root                /var/www
user1               /var/www/user1
user2               /var/www/html/private

Bunların farklı kullanıcılar için $ PATH değerleri olduğunu varsayalım. Şimdi sudo ile herhangi bir komutu yürüttüğünüzde, gerçek anlamda kök kullanıcı bu komutu yürütür.

Terminalde şu komutları yürüterek onaylayabilirsiniz: -

user@localhost$ whoami
username
user@localhost$ sudo whoami
root
user@localhost$ 

Sebep bu. Sanırım bu açık.

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.