"/ Usr / local" karakterini seçmek güvenli mi?


15

Ne için olduğunu biliyorum /usr/local- yerel makine için yazılım yükleme. Varsayılan olarak, rootdizine sahiptir. Bu, oraya kurmak için kullanmanız gerektiği anlamına gelir sudo. Tek kullanıcılı veya geliştirici bir makine için, bu komutun gereksiz ekstra kullanımı gibi görünüyor. Dolayısıyla, sorum - sahip olmak benim için güvenli /usr/localmi?

Örneğin, OS X için Homebrew "Just Works" çünkü yazılımlarını kullanmadan /usr/localve güvenle kurarlar sudo.

Ayrıca, yerel olarak derlenmiş bir yazılım yüklüyse /usr/local, yazılımın kendilerini değiştirmek veya eklentileri yüklemek için kök olması gerekir. Bu güvensiz görünüyor - sadece OLACAK olanı sudobildiğim zaman kullanmak istiyorum .

Görüşler?

Yanıtlar:


5

Sahibi olmayı tavsiye edemez /usr/local; çoğu durumda, muhtemelen kullanmaktan daha az güvenlidir sudo.

Sorunuz isteyebileceğiniz iki nedenden kaynaklanıyor chown /usr/local.

Birincisi, sudoyazılımı yüklemek için kullanmak zorunda kalmamaktır . Bu, bazılarına ( bu cevabın yazarı gibi ) verimli bir şekilde çalışmak istediğinizi veya sudoşifrenizi yazmak ve girmek için gereken tuş vuruşlarını kaydetmek olarak okunabilir . Ama muhtemelen "gereksiz" dediğinizde, bunun yerine en az ayrıcalık ilkesine atıfta bulunuyorsunuz :

Varsayılan olarak, rootdizine sahiptir. Bu, oraya kurmak için kullanmanız gerektiği anlamına gelir sudo. Tek kullanıcılı veya geliştirici bir makine için, bu komutun gereksiz ekstra kullanımı gibi görünüyor

"Bu sistemi kullanan tek kişi benim, bu yüzden sudobir şifre kullanmam ve girmem gerekmiyor ." Bu görüşe sahip okuyucular için ve burada alakalı olduğu için, kendimize kökün kendi şeylerine sahip olması için temel bir güvenlik nedenini hatırlatalım.

Bir Ubuntu sistemine yüklenen program dosyalarının çoğu 755 dosya moduna veya sembolik gösterime sahiptir rwxr-xr-x, yani herhangi bir kullanıcı veya program bunları yürütebilir , ancak yalnızca dosyaların sahibi, kök bunları değiştirebilir. (Teknik olarak bu, kök dışında hiç kimsenin wonları içeren dizinde iznine sahip olmamasını gerektirir , bu nedenle diğer kullanıcılar bunları silemez veya taşıyamaz.)

Bu, alçakgönüllü kullanıcı olarak herhangi bir programı yürütebileceğiniz anlamına gelir. Kök sahip olduğu bir dosyada yazma işlemi gerçekleştirmek gibi, yapma izniniz olmayan bir şey yapmak için bir program kullanmaya çalışırsanız, hata verir. Bu, bazı komutlarda, buggy uygulamalarında veya kötü amaçlı kodlarda yazım hatası yapar, sisteminizi bozma olasılığı daha düşüktür - root olarak çalışmadığı sürece bunu yapma izni olmayacaktır. Bu özellikle internet ile etkileşime giren programlar çalıştırırken faydalıdır.

Siz chown /usr/local, ayrıcalıklarınızla çalışan herhangi bir program orada dosya yazabilir, bu da daha sonra aynı adda başka bir komutun yerine geçmesi gibi bir nedenden dolayı kök olarak çalıştırılabilir. /usr/local/binvarsayılan $PATH, ve sudo's'de bulunur secure_pathve her ikisinde de diğer konumlardan önce gelir . Yani iki yürütülebilir dosyam varsa

/usr/local/bin/chown
/bin/chown

Ben çalıştırdığınızda sudo chown ..., içinde yürütülecektir .chown/usr/local/bin

Ama muhtemelen hepsini biliyordunuz, çünkü ikinci nedeniniz güvenlikle ilgili:

Ayrıca, yerel olarak derlenmiş bir yazılım yüklüyse /usr/local, yazılımın kendilerini değiştirmek veya eklentileri yüklemek için kök olması gerekir. Bu güvensiz görünüyor - sadece OLACAK olanı sudobildiğim zaman kullanmak istiyorum .

Her ihtimale karşı bunun için derlediğim yazılımı yüklemek için kesinlikle doğru (zaten FHS göre) var, burada bu söz gerekli /usr/localfakat kendisini derleme Gözlerinde farklı tamam bir yere olmalıdır $HOMEolmadan sudoyazdığınız son adıma kadar, sudo make installya da eşdeğeri.

/usr/localAyrıcalıklı sahibi olarak yüklenen bir programı çalıştırarak , size ait olmayan bazı dosya sistemi konumunu değiştirmeye çalıştığını görmek için kendini güncellemeye çalışırken belirli izin hatalarını kullanabileceğinizi düşünüyorum. istemiyorum, böylece bunu durdurabilirsiniz.

Bu yardımcı olabilir . Bunun anlamı, programın içinde /usr/localbaşka bir yerde hoşlanmadığı , ancak başka bir yerde yapmadığı şeyleri yapmak için güvenmenizdir . Yükseltilmiş izinler isterse, güncelleştirmesine izin vermeyi veya kaldırmayı reddedebilirsiniz. Bu benim için bir anlam ifade ediyor. Ama bence /usr/localbu şekilde bir tür kum havuzu olarak kullanmak muhtemelen iyi bir fikir değil ya da en azından en güvenli çözüm olması pek mümkün değil. Düzgün yalıtılmış bir yer değil ( /optvarsayılan olarak olmadığı için biraz daha yalıtılmış $PATH). Program /usr/localzarar vermek için bir şey yazabilir veya silebilir . Çalıştırdığınız diğer (potansiyel olarak kötü yazılmış) programlar, farkında olmadığınız kodları yazabilir ve yürütebilir.

Bir programın kendisini güvenli bir şekilde güncellemesine izin vermekten endişe ediyorsanız, muhtemelen alternatifleri aramalısınız (örneğin programa özgü, örneğin python'da olduğu gibi) veya ihtiyaçlarınıza uygun bir ek veya benzer bir uygulama arayabilirsiniz veya normal bir kullanıcı tarafından çalıştırılan programlar tarafından yazılmak üzere bir sistem konumu (göreceli olarak kullanıcı y bile) açığa çıkarmadan önce potansiyel olarak güvenli olmayan yazılımı test etmek için kapsayıcılar veya sanal makine). Bana öyle geliyor ki, programların izinleri geçici olarak yükseltmesine izin vermek gibi öngörülemeyen etkilere sahip sudo.


6

/usr/localSahibi olmayan olağandışıdır root. Ancak sahibi istediğiniz gibi değiştirebilirsiniz.

Ancak /usr/local/sbin, rootbir güvenlik sorunundan kaçınmak için hala sahip olunmasını öneriyorum . Buradaki komutlar genellikle yalnızca kök tarafından çağrılır.


2
Daha önce bir bower yüklemesi yaptım ve öğretici chown -R $ USER / usr / local yapmayı önerdi, bu yüzden şimdi chown -R root / usr / local / sbin - çalıştırıyorum / usr / local içinde başka klasörler var mı sahiplik konusunda daha iyi olmak? Komutu çalıştırmadan önce tüm izinleri kontrol etmeliydim. Anında "dönüş üzerine pişman".
OnethingSimple

2
Bu cevap tatmin edici değil ve açıklama gerçekten doğru değil. Güvenlik nedenleriyle, root köklerinin root'a ait olduğu komutları tutmak gerekiyorsa, o kökteki komutlar /usr/local/bin(ve diğer kullanıcılar) çalışabilir mi? Kök sahip olmaları gerekmez mi? Ayrıca, root komutları - /usr/local/sbiniçindeki komutlar dahil olmak üzere - içindeki paylaşılan kitaplıklara bağlı olabilir /usr/local/lib. Bu kitaplıkların değiştirilmesi, komutları kullanan komutların davranışında rasgele değişiklikler yapabilir. Sadece /usr/local/sbinsahip olunan kökte ısrar etmek tamamen keyfi görünüyor.
Eliah Kagan

5

Yazılımın tek sen , ihtiyaç yerine ev dizini kullanın /usr/local.

/usr/localİstemediğinizde komutların sahipliğini değiştirmek veya kök olarak çalıştırmak zorunda kalmak yerine, yapılarınızı yalnızca ana dizininiz yerine ana dizininize yüklenecek şekilde yapılandırmanız gerekir./usr/local . Bu, sahibinin ve alt dizinlerinin yolunda /usr/localnasıl olduğu da dahil olmak üzere sahipliğinin değiştirilmesiyle ilgili tüm olası sorunları giderir .binsbinroot

Diğer kullanıcıların yazılımınızı çalıştırmasına izin vermeniz gerekiyorsa, onlara erişim verebilirsiniz. Aslında, muhtemelen zaten başarabileceklerdir, çünkü varsayılan olarak ana dizininiz izin verilen okuma ve yürütme erişimi . (Bunu istemiyorsanız, sadece chmodözel yapmak istediğiniz dosya veya dizinleri kullanarak ve muhtemelen de değiştirerek kolayca değiştirebilirsiniz umask.)

Ana dizininize yazılım yüklendiğinde, /usr/local/biniçeri girecek olan ikili dosyalar yerine geçecektir . Yüklediğiniz yazılımın ihtiyaç duyduğu alt dizinlere karşılık gelen ana dizininizin diğer alt dizinlerini alırsınız . Bu, genellikle kaynak koddan yazılım yüklediğinizde otomatik olarak gerçekleşir./home/username/bin/usr/local

Yapılarınızı Yapılandırma

Kaynak koddan oluşturduğunuz çoğu yazılımın çalıştırdığınız bir adımı vardır:

./configure

Bu configureşekilde çalıştırılabilen bir komut dosyasıyla birlikte gelen yazılımların büyük çoğunluğu için, /usr/localnihayetinde sudo make installonu yüklemek için çalıştırdığınızda içerideki kurulum için yapılandırmayı varsayılan olarak yapılandırır . Bunun nedeni, dolaylı olarak çalıştırmaya eşdeğer olmasıdır:

./configure --prefix=/usr/local

Bir dizini ana dizininize yüklenmek üzere yapılandırmak için bunun yerine bunu kullanın:

./configure --prefix="$HOME"

Pratikte, Ubuntu'da, giriş dizini yolları boşluk, diğer boşluk veya özel olarak kabuk tarafından işlenecek diğer karakterler içermez *, bu nedenle kullanıcı hesabınızı oldukça garip bir şekilde ayarlamadıysanız, şunları yazabilirsiniz:

./configure --prefix=$HOME

(Bununla birlikte, komut dosyaları yazmak için alışkanlık edinmenizi önermiyorum . Ayrıca, macOS gibi bazı diğer işletim sistemlerinde, kullanıcıların ev dizinlerine giden yolların boşluk içermesi daha az yaygındır.)

İsterseniz tam giriş dizini yolunuzu da yazabilirsiniz:

./configure --prefix=/home/username

( usernameTabii ki gerçek kullanıcı adınızla değiştirin . Herhangi bir nedenle ana dizininizde değilse, /homebuna göre ayar yapmanız gerekir.)

Yapılarınızı Kurma

Eğer çalıştırdıktan sonra make, çalıştırmakta alışık olabilir sudo make install, ancak kendi ev dizininde yüklediğinizde yapabilirsiniz öyleyse, root olarak çalıştırmak için gerek yoktur - ve gerektiği --omit sudo. Sadece koş:

make install

Benzer şekilde, bir uninstallhedefi destekleyen yazılımlar için :

make uninstall

Tam olarak istediğin buydu ... sadece ana dizininizde değil /usr/local.

Programlarınızı Çalıştırma

Muhtemelenbin ev dizininin alt dizin biri geçerlidir:

  • zaten senin $PATH, ya
  • Gözlerinde farklı olacak $PATHsadece geri çıkın ve eğer.

Bunun nedeni, .profilegiriş yaptığınızda çalışan komutları içeren giriş dizininizdeki dosyanın , Ubuntu'nun çoğu sürümünde (işletim sistemini yüklediğinizde oluşturulan ilk yönetici hesabı dahil) oluşturulan kullanıcı hesapları için bunu varsayılan olarak içermesidir :

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

Bu kod, oturum açtığınızda (çünkü içinde .profile) çalıştırılır ve kişisel bindizininizi $PATH yalnızca o anda varsa yerleştirir. Bu yüzden oturumu kapatıp tekrar açmanız gerekebilir.

Ubuntu 14.04 gibi eski sürümlerin yanı sıra Ubuntu 17.10 gibi yeni sürümler de bununla birlikte gelir. Ancak, muhtemelen bu yazının en popüler sürümü olan Ubuntu 16.04, bunun yerine şunları içeriyor:

# set PATH so it includes user's private bin directories
PATH="$HOME/bin:$HOME/.local/bin:$PATH"

Bu , bu dizinlerin gerçekten var olup olmadığını kontrol etmeden bin, ana dizininizin alt dizinini - ve aynı zamanda .local/binalt dizini - ekler $PATH. Dolayısıyla, 16.04 kullanıyorsanız veya kullanıcı hesabınız oluşturulduğunda 16.04 olan bir sistemden yükseltme yaptıysanız bin, ana dizininizin alt dizini zaten$PATH .

Kişisel .profiledosya kopyalanır /etc/skelkullanıcı hesabınızın oluşturulduğunda dizinde. Kullanıcı hesabınız eski bir Ubuntu sürümünde oluşturulduysa, .profiledaha yeni bir sürüme yükselterek o sürümünün sürümünü aldı ve kullanıcı hesabınız için değiştirilmedi.

Giriş bindizininizin alt dizini sizin $PATHiçindeyse, tıpkı Ubuntu'nun paket yöneticisi tarafından yüklenen veya içine yüklenen programlarda olduğu gibi, çalıştırılabilir dosyaları oraya yüklenen programları çalıştırabilirsiniz /usr/local.

.localSeçenek

.profileYukarıda açıklanan 16.04 dahil olmak üzere bazı Ubuntu sürümlerinde oluşturulan kullanıcı hesapları için varsayılan dosyanın yalnızca $HOME/binyolunuza değil, aynı zamanda eklediğini fark etmiş olabilirsiniz $HOME/.local/bin. Eklemiyorsanız .profile, ancak eklemek istiyorsanız , o zaman kolayca düzenleyebilirsiniz.

Gerçi genellikle mağaza ayarları ve önbelleğe alınmış verileri için kullanılan , ayrıca içeride yazılım yükleyebilir .localev dizininin alt dizinine. Bir kullanılabilirlik ve güvenlik açısından olduğu gibi, bunu yaparken de sınır tanımayan hissetmelidir --prefix="$HOME/.local"benzer--prefix="$HOME" .

İle başlayan dosya ve dizinlerin .grafik dosya tarayıcılarında varsayılan olarak gösterilmediğini ( göstermek ve yeniden göstermek için Ctrl+ Hkullanın) veya lskomutla ( göstermek için -Aveya -aişaretini iletin ) unutmayın. Bu istediğiniz gibi olmayabilir veya tam olarak istediğiniz gibi olabilir. Bu kişisel bir tercih meselesidir.

Ancak, bir kişinin ev dizininde yazılım oluşturan ve yükleyen bazı otomatik kaynak tabanlı paket yöneticilerinin olduğunu gözlemledim $HOME/.local. Bunun ne kadar yaygın olduğunu bilmiyorum - daha fazla araştırmayı ve bu yanıtı güncellemeyi umuyorum - ama sadece kullanmayı tercih edebilirsiniz$HOME elle derlediğiniz şeyler için . Bu şekilde olayların nereden geldiği açık olacak. Bir çarpışma olursa, yazılım hala kabul edilebilir bir şekilde bir arada var olabilir.

Ayrıca kasıtlı olarak bazı yazılımları $HOME/.localve diğer yazılımları da yükleyebilirsiniz $HOME. Sana kalmış. Hangisi bindizin öncelikle görünen $PATHbir komut durumunda, gelen aday olacağını birini ortam değişkeni olduğunu hem de aynı adı varoldukları için komutları.


Kredi gider Zanna ve Videonauth için hatalarını işaret bir de önceki sürümde Ubuntu bültenleri hangi varsayılan koduna sahip olan ilgili, bu cevabın .profileve düzeltmek için bana yardımcı onları (ayrıca bkz burada ).


0

Sudo böyle bir rahatsızlık veriyorsa, / etc / sudoers dosyasını güncelleyin, böylece sudo komutunu çalıştırdığınızda parolanızı girmeniz gerekmez. Ben / usr / local sahibini değiştirmekten daha iyi bir çözüm olduğuna inanıyorum.


4
Parolalar sorun değil - bir programa modüller yüklemek /usr/local, potansiyel olarak tehlikeli olan sudo kullanmanız gerektiği fikridir .
PR3x
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.