Okuma biti vs. Linux'ta dizin izinleri nasıl çalışır?


380

CMS'imde, dizinlerin +xkullanıcının açması için ayarlanmış çalıştırılabilir bit'e ( ) ihtiyacı olduğunu fark ettim . Neden bir dizini okumak için yürütme izni gerekiyor ve Linux'ta dizin izinleri nasıl çalışıyor?


17
... ah, çünkü "+ x" bayrağı ne için :)
badp


16
Bunun gibi düşünün: dizin girişi dosya adlarını içeriyor , bu nedenle "bir dizini okumak" dosyaları listeliyor, "dizini kullanarak" dosyalara erişiyor.
tylerl

7
Directory execute bit set ile onun hiyerarşisinde dolaşmanıza izin verilir . Verilen "diğer" insanlara ait ve sadece bit set ( chmod 771 dirOne) işlemini yürütürseniz, dirOne içeriğini listeleyemezsiniz. AMA "dirTwo" alt dizini içeriyorsa ( chmod 774 dirTwo) gibi ayarlanmış haklara sahip olmalısınız.
Stphane

1
Gelecek ziyaretçiler de AskUbuntu'da ilgili soruyu görmelidir: askubuntu.com/q/1106822/295286
Sergiy Kolodyazhnyy

Yanıtlar:


351

Linux'ta dizinlere izinler uygulanırken izin bitlerinin normal dosyalardan farklı anlamları vardır.

  • Okuma bit ( r) dizin içindeki dosyaları listelemek için etkilenen kullanıcı sağlar
  • Yazma biti ( w) etkilenen kullanıcı oluşturmak yeniden adlandırma veya dizin içindeki dosyaları silmek ve dizinin özelliklerini değiştirmenize olanak tanır
  • Yürütmek biraz ( x) dizini girmek için etkilenen kullanıcı sağlar ve erişim dosya ve dizinleri içeride
  • Yapışkan bit ( Tveya tyürütme bit diğerleri için ayarlanırsa) bu dizin içindeki dosya ve dizinleri sadece silinecek ya da sahibinin (veya kök) tarafından yeniden adlandırılabilir belirtmektedir

25
Harika cevap, ama bence son cümle yanıltıcıdır. Bu izinlerin hiçbiri aslında dosya başına geçersiz kılınamaz. Burada “erişim” biraz belirsizdir: +xdizinde bu belirli dizin üzerinden dosya düğümlerine erişim sağlanır (daha az hiçbir şey, daha fazla, iyi değil ... belki de chdirgerekir +x). Bir dosyanın içeriğini okumak veya yazmak için, kullanıcının da bu dosyaya +r/ ihtiyacı vardır +w, ancak bunlar farklı izinlerdir (hiçbir şeyi geçersiz kılmazlar).
Stéphane Gimenez

2
Değişmez bayrağı dosya sistemine özgüdür ve bu izinleri kesinlikle geçersiz kılmaz, bu yüzden son cümlenin yanıltıcı olduğunu düşünüyorum :-)
Stéphane Gimenez

1
Ben bir tek Chris Down verilen bilgileri dikkate alacaktır eğer bazı dizinleri yanıltıcı olabilir için, bu ve diğer yanıtlar ACL söz başvurularını neden yararlı olabileceğini düşünüyorum
user907860

4
Baldrick'in cevabı aşağıda da belirtildiği gibi, bu cevabın yazma biti ile yürütme bitiğinin birleşik etkisinden bahsetmediği görülüyor mu? yani, yalnızca yazma izniniz varsa, ancak yürütme izniniz yoksa, bu tamamen işe yaramaz.
xji

1
@ StéphaneGimenez " +xdizindeki dosyalara inode erişimi veriyor" - Bu iyi bir nemonik gibi gözüküyor, ama belki de tüm hikayeyi anlatmıyor? Bir dizinde execute bit ayarlanmamışsa, o dizindeki bir dosyanın dosya adını değiştiremezsiniz. Bunun neden olduğunu merak ediyorum, çünkü dosya ismi bir inode değil, bir dizin girişinde saklanıyor.
Kevin Wheeler

259

İlk önce, düşünün: Bir dizin nedir? Bu sadece içinde yaşayan öğelerin bir listesi (dosyalar ve diğer dizinler). Yani: dizin = adların listesi.

Read bit = Ayarlandıysa, bu listeyi okuyabilirsiniz. Öyleyse, örneğin, bir dizininiz varsa poems:

  • İçinde ls poemsyaşayan öğelerin bir listesini alabilirsin ve alacaksın ( -lhiçbir ayrıntıyı açığa çıkarmayacak!).
  • Komut satırı tamamlama kullanabilirsiniz touch poems/so <TAB> poems/somefile.
  • Sen yapamaz poems(yani sizin çalışma dizinini cdiçine).

Yazma biti = Eğer ayarlanmışsa, bu listeyi değiştirebilirsin, yani üzerine {isim ekleyebilir, ismini değiştirebilirsin. Fakat! Aslında yalnızca yürütme biti ayarlanmışsa bunu yapabilirsiniz.

Execute bit = Bu dizini çalışma dizininiz, yani dizininiz yapın cd. İsterseniz bu izne ihtiyacınız vardır:

  • içinde yaşayan öğelere erişme (okuma, yazma, yürütme).
  • listenin kendisini değiştirir, yani üzerine isim ekler, isimlendirir, sil (elbette yazma biti dizinde ayarlanmış olmalıdır).

İlginç durum 1 : Bir dizinde yazma + yürütme izniniz varsa, bu öğeler üzerinde yazma hakkınız olmasa bile içinde yaşayan öğeleri {silebilir, yeniden adlandırabilirsiniz}. (bunu önlemek için yapışkan bit kullanın)

İlginç durum 2 : Bir dizinde yürütme (ancak yazma) izniniz varsa ve içinde yaşayan bir dosyaya yazma izniniz varsa, dosyayı silemezsiniz (çünkü listeden çıkarmayı içerir). Bununla birlikte, içeriğini silebilirsiniz, örneğin bir metin dosyasıysa, açmak ve her şeyi silmek için vi kullanabilirsiniz. Dosya hala orada olacak, fakat boş olacak.

Özet:

Read bit = Listedeki isimleri okuyabilirsiniz.
Yazma biti = Eğer yürütme biti ayarlanmışsa, listedeki {ekleyebilir, yeniden adlandırabilir, silebilirsiniz.
Execute bit = Bu dizini çalışma dizininiz yapabilirsiniz.

Not: Kusalananda'nın bahsettiği makale iyi bir okuma.


17
Dizini bir liste olarak düşünmek işleri daha net ve mantıklı hale getirir.
Trismegistos

20
Harika cevap, ancak "çalışma dizini" terimi üzerinde duruldu. İhtiyacım xiçin biraz herhangi bu dosyaya erişimi: için cat a/b/c/d, ihtiyacım xtümü üzerinde biraz a, bve cben CWD'sindeki olarak kullanabilirsiniz olmasa bile,.
glglgl

1
Burası senin de çalıştırılabilir olmadığı sürece yazamadığını öğrendim! 2. vaka da ilginç, büyük cevap!
Mirko

1
Diğer bir not, xdizinde izniniz olsa bile , dosyadakix izniniz yoksa , dosyayı gerçekten "çalıştıramazsınız". Yalnızca catörneğin yapabilirsiniz, ancak dosyayı çalıştıramazsınız.
xji

2
Eğer istersen ls -lbir klasör için çalışmak, hem ihtiyaç rve xizni.
Eric Wang,

44

Bu tabloyu tüm olası izinler ve pratik etkileri ile hazırladım.

linux dizin izinleri

(*) Yalnızca dosya adları : Boyut veya tarih gibi diğer özellikler kabul edilemez. Örneğin, otomatik tamamlama için sekme tuşunu kullanabilirsiniz, ancak ls komutunu kullanamazsınız.

Bazı düşünceler :

  • İle X sertleşmemiş , R ve W daha çok işe yaramaz.
  • Yalnızca X'i devre dışı bırakmak, RW'yi yanlış bir güvenlik hissi verir; çünkü dosya içeriğini gizli olarak okuyabilir ve yazabilir ve alt dizinlere erişebilirsiniz. Dizinin her doğrudan çocuğunun açık izinleri olduğundan emin olmalısınız.
  • Nadiren aşağıdakilerden başka değerler kullanacaksınız:
    • 0 : Erişim yok.
    • 1 : Enine erişim sağlayan minimum erişim.
    • 5 : Dizin ağacının yapısını değiştirmemeye, okumasına / yazmasına izin verin.
    • 7 : Tam erişim.

1
5 okumaya / yazmaya izin vermek, ancak dizin ağacının yapısını değiştirmek istemiyorsanız yararlı bir değer olarak düşünürdüm.
hgiesel

Haklısın. Güncellenmiş!
David

4
Harika bir özet çizelgesi. Birinin -W-fonksiyonel ---olarak dizinler için neye eşdeğer olduğunu düşündüğünü merak etmemi sağlıyor . Çok sezgisel değil. Tabii ki bu düşük seviyeli bit türleri genellikle değildir.
CivFan

2
Bunu mac'umda test ettim, ancak -W-dizini yeniden adlandırabilirim (yapışkan bitli bir dizinde) ancak ile ---. Bu bir fark gibi görünüyor
cosyconemotel

3
@David, Yapışkan parçayı kaçırıyorsunuz.
Pacerier

42

İşte bu konuda iyi bir makale.

Özet:

xBit ayarlı bir dizin , kullanıcının cdbu dizine girmesine (dizini değiştirmesine) ve içindeki dosyalara erişmesine izin verir .

Detaylar:

  • Oku ( r)

    Bu dizinde kayıtlı dosyaların adlarını okuyabilme.

  • Yaz ( w)

    Yürütme izniniz varsa, dizindeki dosyaları yeniden adlandırma, yeni dosyalar oluşturma veya varolan dosyaları silme özelliği. Yürütme izniniz yoksa, yazma izniniz anlamsızdır.

  • Yürüt ( x)

    Yeteneği cdbu dizine ve bu dizindeki dosyalara erişmek.

Anlaşmayı kolaylaştırması gereken birkaç örnek:

# "Full Access".  Reegen can list, create, delete, rename, delete,
# and stat any files in dir.
# Access to file contents is subject to the permissions
# of the file itself.
# New files can be created, any file can be deleted, regardless of
# file permissions.
drwx------  1 reegen    reegen          4096 Jan 01 2003  dir

# Reegen can do everything in the "Full Access" list except create,
# delete, or rename files in this directory.
dr-x------  1 reegen    reegen          4096 Jan 01 2003  dir

# Reegen can do everything in the "Full Access" list except list the
# filenames in this directory.  If she suspects there is a file
# named "program" she can list it, but cannot do an 'ls'
# of the directory itself.  She can access any file (file
# permissions permitting) if she knows its name.  She can
# create new files, or rename/delete existing ones.
d-wx------  1 reegen    reegen          4096 Jan 01 2003  dir

# Reegen cannot create or delete any files in this directory.
# She can access any file (permissions permitting) if she
# knows its name already.
d--x------  1 reegen    reegen          4096 Jan 01 2003  dir

Hacking Linux Exposed makalesinde daha fazla bilgi var .



2

Bir dosyaya veya dizine erişen herhangi bir işlem için önce dosyanın veya dizinin yolunu çözmesi gerekir. Çözünürlük, kullanıcının son yol bileşeni hariç, yol boyunca tüm dizinlerde izin çalıştırmasını gerektirir. Bu nedenle, dizinler için yürütme bitinin "çözülebilir" anlamına geldiğini düşünebilirsiniz.

Örnek olarak yol alın /a/b/c.txt, kullanıcının 1) üzerinde /ve üzerinde /a; 2) üzerinde okuma izni var /a/b; 3) okuma ve yazma izni /a/b/c.txt.

  • Kullanıcı /aokuma izni vermeyecektir , çünkü okuma izni yoktur. Ancak yol çözünürlüğü başarısız olmaz.

  • Kullanıcı (listeyi) okumak mümkün olacak /a/bkullanıcı izni yürütmek olduğundan, /, /ave üzerinde okuma izni /a/b. Okurken /a/b, dosya adının c.txtgörünür olduğunu, ancak meta verilerin (örn. Dosya boyutu) ve içeriğin bulunmadığını, çünkü dosya adının dosyayla değil, dosyayla aynı dizinde, ancak meta verilerin dosya dizininde saklandığını unutmayın.

  • Kullanıcı okumak için başarısız olur /a/b/c.txt, yolu çözümlerken, çünkü /hiç /aiçin /a/b, en başarısız /a/bkullanıcı yürütme iznine sahip olmadığı için.

Ayrıca bir yol adının bir dosyaya nasıl çözümlendiğine bakın .


0

Faydalı bir benzetme, her dosyayı bir kitap, her bir dizini de kitapların tutulduğu bir oda olarak düşünmektir.

Bir odadaki tüm isimleri listeleyebilmek için kurallar vardır: dizinler için okunan bit. Bir kitabı odadan çıkarma kuralları: dizinler için yazma biti. Ve bir odaya girip keşfetmek için kurallar: elde edilen dizin bit'i çalıştırır.

Bu kurallar her kitap için kurallardan ayrı ve farklıdır. Birinin bir kitap açmasına ve içeriğini okumasına izin vermek için kurallar vardır: her dosyanın okuma biti (ler) i. Bir kitabın içeriğini değiştirmek için kurallar vardır: her dosya için yazma bit (ler) i. Ve bir dosyayı çalıştırmak için: her bir dosya için çalıştırma bit (ler) i.

Bit (ler) yazarım çünkü her eylem için üç bit vardır. Sahibi için bir okuma biti, gruplar için bir okuma biti ve diğerleri için bir okuma biti var (diğerleri). Bu üç bitten herhangi biri belirli bir kullanıcı için ayarlanmışsa, bu kullanıcı aktif okuma biti vardır. O biraz yoluyla aktif olduğu bulunmuştur nasıl fark etmez u ser veya g RUBU veya o aynı etkili sonuçları vardır ther.

Böylece, bir kullanıcının bir odaya girmesine ve kitapları kütüphaneden çıkarmasına izin verilebilir, ancak aynı kitabın içeriğini okumasına izin verilmez.

Bu nedenle dizinler için okuma biti gereklidir: oda içeriğini kimlerin listeleyebileceğini kontrol etmek için (kitap başlıkları).

Ve yürütme biti, kitap odasına kimlerin girebileceğini kontrol etmek için kullanılır.


-1

Yürütme dizini için anlamı oldukça açıktır. Traverse izni olmadığından, Windows'un aksine bir şeyi aşırı yüklemelisiniz. Tasarımcılar, Yürütmeyi seçtiler, bu sonsuz karışıklığa neden oluyor. Bir bilgisayar güvenlik görevlisi olarak, Gerçekleştirmek niyetinde olmadığınız bir şey için Yürütme haklarını atama, çok tehlikeli görünüyor.


1
Uygulama izni bitinin icadı, yaklaşık yirmi yıl sonra farklı bir geçiş izni konseptinin icat edilmesine öncülük eder. Bu yanıtın mantığı, gerçek dünyanınkine benzer olmayan tarihi bir zaman çizelgesine dayanır ve aynı zamanda onun varlığını GENERIC_EXECUTEve ne olduğunu fark etmekte başarısız olur .
JdeBP
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.