Neden setuid dizinlerde yok sayılır?


19

Linux sistemlerinde başarılı olabilirsiniz chmod u+s $some_directory, ancak yeni alt dizinlerin ve dosyaların sahipliğini, içerdiği dizinin sahibi olmaya zorlamak (ve alt dizinleri u+sde ayarlamak ) beklediğiniz gibi, sistem setuid bitini yok sayar. Alt dizinler ve dosyalar, oluşturma işlemlerinin UID'lerini devralmaya devam eder ve alt dizinler varsayılan olarak ayarlanmamıştır.

Neden setuid dizinlerde yok sayılır ve sistemin onu tanımasını sağlayabilirim?


Acaba "nosuid" montaj seçeneğinin bunu etkileyip etkilemeyeceğini merak ediyorum.
Heptit

Söz konusu dosya sistemi ile bağlanmamıştır; ancak / mount / mount olan nosuidbaşka bir tane (ramdisk /dev/shm) olmasına nosuidrağmen, setuidbitin tamamen aynı şekilde olduğu görülmektedir. 6_9
Blacklight Parlayan


2
Uygulamaya gelince, Linux kaynak kodu hazır, bu özelliği uygulamaktan çekinmeyin. FreeBSD'de zaten mevcut olduğundan, kodu kolayca eminim. Tabii ki, bu bitlerin başkalarının Linux sistemi üzerinde hala bir anlamı yoktur.
mikebabcock

Yanıtlar:


16

Setuid ve setgid bitlerinin tamamen farklı bir amaç için icat edildiğini hatırlayın: bir yürütülebilir dosyanın dosyayı çalıştıran kullanıcının uid veya gidinden ziyade sahibinin uid veya gid ile çalışmasına neden olur. Başka herhangi bir kullanım sadece ekstra bir özelliktir.

Bu bitlerin yürütülebilir olmayan normal dosyalar üzerinde bir işlevi yoktur. (Ve ayrıca güvenlik sorunları nedeniyle bazı dağıtımlarda komut dosyaları kabuk.) Başlangıçta, dizinler için de bir işlevi yoktu. Açıkçası birileri dizinlerde kullanılmayan setgid almanın ve grup sahipliğinin tutarlılığını sağlamak için kullanmanın harika olacağına karar verdi. Sonuçta, grup sahipliği ile oynuyorsanız, bunun nedeni dosyayla birden fazla kişinin çalışmasıdır ve belirli bir dizindeki tüm dosyaların onları kimin oluşturduğuna bakılmaksızın aynı gruba ait olması muhtemelen mantıklıdır. Newgrp çalıştırmayı unutan birinin sıkıntıları ortadan kaldırılır.

Öyleyse, neden setuid ve uid dosyası için aynı özelliği uygulamıyorsunuz? Uid, gid'den çok daha basit. Bunu uygularsanız, genellikle bir dosya onu oluşturan kullanıcıya ait olmaz! Muhtemelen kullanıcı dosyayı değiştirebilir (umask'ın aklı başında olduğunu varsayarak), ancak izin bitlerini değiştiremez. Bunun faydasını görmek zor.


Ben sadece tutarlılık uğruna, eğer uygulanmasını istiyorum… X3 Her durumda, bir cronjob gibi geçici olarak geçip sahiplik değiştirmek için geçici bir çözüm, / / ​​dosya sahipliğini zorlamak için herhangi bir yolu var mı?
Blacklight Parlayan

4
Emerson'a Aptalca Tutarlılık konusunda alıntı yapmaya hazırım. Beni istenen bir özellik olduğuna ikna etmeden önce, bana mantıklı bir kullanım durumu göstermelisiniz.
Isaac Rabinovitch

1
FreeBSD chmod (2) aslında bununla ilgili bir tartışmaya sahiptir, ancak yalnızca belirtilmemiş "güvenlik delikleri" nedeniyle genellikle kullanılmaması gerektiğinden bahseder. Bunun bazı kullanım durumlarını var ise, o değil çünkü diğer birçok Unixler bu özelliği kabul etmedi şüpheli olduğunu pek de kullanışlı.
jjlin

1
"Bunun yardımcı programı görmek zor" -> bir ana dizinde ayarlanır, bu yüzden kök olarak çalışan provizyon komut dosyaları yanlışlıkla bir şey chown unutma?
ufotds

1
Ana dizininizde süper kullanıcı komut dosyaları çalıştırmak gerçekten kötü bir fikir
Isaac Rabinovitch

7

Bu sorunun cevabının çoğu modern Unix benzeri işletim sisteminin "dosya hediyesine" izin vermemesine neden olan "dosya hediye" güvenlik sorunlarına dayandığını düşünüyorum. "Dosya hediye", süper kullanıcı olmayan bir kullanıcının bir dosyanın sahipliğini o kullanıcı dışında biriyle değiştirdiği zamandır. Bu yetenek, yaramazlık için birçok fırsat sağlar.

Dosya eşantiyonlarına izin verilmediğinden, aynı işlevi başka bir biçimde gerçekleştirecek dizinlerde setuid'e izin verilmez veya ayarlanmışsa yoksayılır.

Davranışı değiştirmekle ilgili olarak, işletim sistemi kitaplıklarını ve yardımcı programlarını değiştirmeniz gerekir.


2

Uygulamak için çok iyi bir kullanım örneği şudur:

Diyelim ki 3 güvenli siteye sahip çok siteli bir sunucunuz var. Farklı site yöneticilerinin her biri için bir tane olmak üzere 3 grup oluşturdunuz. Tüm sitelerdeki tüm dosyaların apache kullanıcısına ait olması gerekir, böylece apache bunları okuyabilir ve onlara yazabilir (drupal / wordpress, vb.).

Setuid, ancak dizin izinleri için setgid biti gibi çalışsaydı şöyle bir şey olurdu:

/var/www/sitea - apache:groupa  rwS rwS ---
/var/www/siteb - apache:groupb  rwS rwS ---
/var/www/sitec - apache:groupc  rwS rwS ---

Bu şekilde, her bir bakım grubu yalnızca içeriklerini görme ve bunlara dokunma erişimine sahip oldu, ancak web sunucusu kullanıcı apache tüm içeriği sunabilir ve kullanıcıların yüklenen dosyaların sahipliğini değiştirme konusunda endişelenmesine gerek kalmaz.

Başka bir kullanım durumu Anonim ftp / http veya hatta sftp / ssh yüklemeleri içindir. Yükleme dizinindeki grup ve GID kök olur ve bu nedenle sahip ve UID olur. Diğer izinler olurdu -wx. Bu, herkesin yükleme dizinine YAZMA erişimine izin verir, ancak yüklendikten sonra hiçbir şey okuyamaz ve kök yeni oluşturulan tüm dosyalara sahip olur.

Bu nedenle, dizinlerdeki UID işlevinin GID bitiyle eşleşmesini sağlamak için iki iyi ve geçerli kullanım durumu vardır.

Steven Mercurio


1
Bu, sorulan soruyu ele almıyor gibi görünüyor.
Kevin Panko

2
@KevinPanko Hayır, sorumu cevaplamıyor. Site için konu dışı bile olabilir (“kullanım durumu <nonexistent feature X>nedir?”). Ancak, sorumla ilgili ve ben, asker olarak, yararlı buluyorum.
Blacklight Shining

0

Partiye biraz geç, ancak gelecekteki okuyucuların bununla karşılaşması durumunda;) Başkaları tarafından belirtildiği gibi, standart bir OS-X dosya sisteminde dizinler için setUID göz ardı edilir - ve bunun kolay bir yolu yoktur ( mount -o.... ya da ne değil). Sıklıkla, man sayfası gerçekte belirttiği OS-X davranışına uymuyor:

4000 (set-user-ID-yürütmede bit) [...] set-user-id bit setine sahip dizinler, içinde oluşturulan tüm dosyaların ve alt dizinlerin sahiplerine değil, dizin sahibine ait olmasını zorlar oluşturma sürecinin uid [...]

ancak aynı zamanda orijinal mülkiyeti bırakmadan aynı etkiyi elde etme olasılığını da listeler. Linux benzer etkiler için '[g /] setfacls' kullanır (bunlar ilk bakışta gerçekten görünmeyen izinlerdir, bu yüzden bazen sıkıntı olabilir).

'Benzer etkileri nasıl elde edebilirim' ile ilgili olarak, tüm kılavuz sayfasını okuyun ve şunlarla uğraşın:

chmod +a 'guest allow read,write,delete,add_file,add_subdirectory,file_inherit,directory_inherit' ./[DIRECTORY]

üzerinden kontrol edebilirsin

ls -le

eğer hepsi iyi görünüyorsa. Diğer seçenekler arasında belirli konumlara kural ekleme, belirli kuralları kaldırma veya değiştirme yer alır. Buradaki iki dikkate değer seçenek , kuralların yeni bir dizine / dosyaya eklenmesine izin veren " file_inheritve directory_inherit" şeklindedir.

SetUID'i kullanmaktan gerçekten hoşlanmıyorum, ancak setGID, sadece 'ana' grubun ayarlanmasının işe yaramadığı veya istemcilerin grup yazma işlemine izin vermemesine neden olan dosya sunucularında çok kullanışlı geliyor. Bu şu şekilde çözülebilir:

chmod +a 'mygroup allow read,write,delete,add_file,add_subdirectory,file_inherit,directory_inherit' /fileserver/groupfolders/mygroup

Stack Exchange'e hoş geldiniz! Bu iyi bir cevaptır, ancak Linux dağıtımlarından ziyade OS X ile ilgili olduğu için (bahsettiğiniz gibi farklı bir ACL sistemi kullanın), burada oldukça ilgili görünmemektedir. OS X onur setuid dizinlerinin nasıl yapılacağı ile ilgili bir soruya kesinlikle uygun olacaktır ; belki bir tane göndermelisin ?
Blacklight

Bu arada, OS X'in manuel sayfasında bıraktığınız bit chownaslında oldukça önemli görünüyor! “[…] Temel dosya sistemi bu özelliği destekliyorsa: chmod (2) ve mount (8) için suiddir seçeneğine bakınız .” Aslında daha önce hiç fark etmemiştim. HFS uygulanırsa suiddir, bunun aslında ortak bir OS X sisteminde gerçekleşmesini sağlayabilirsiniz.
Blacklight Parlıyor

(Ve OS X ACL'leri de Linux ACL'leri kadar “ilk bakışta gerçekten görünmez”.)
Blacklight Shining

0

Standartlara uymalı. Sadece sftp ile oldukça az sayıda senaryo üzerinde düşünebilirim, hem acl's hem de sshd'nin yaptığı acl-mask-set ve o maskeye yapması gereken sıfırlama ile bana çok fazla sorun kurtaracağını.

Varsayılan olarak güvenlik oldukça kullanışlıdır, ancak bunu bir seçenek yapmazsanız, sadece bir kanat görünümü oluşturuyorsunuz.

https://www.gnu.org/software/coreutils/manual/html_node/Directory-Setuid-and-Setgid.html

Her iki durumda da, Linux şu an olduğu gibi, bu yüzden bunları çözmek için acl kullanın.


-1

Http://en.wikipedia.org/wiki/Setuid#setuid_and_setgid_on_directories'e göre setuid biti hem UNIX hem de Linux sistemlerindeki dizinler için yok sayılır. Ancak FreeBSD'de beklediğiniz gibi hareket etmesini sağlamak mümkün.


Yararlı değil — Neden setuiddizinler için göz ardı edildiğini ve Linux'ta tanınmasının mümkün olup olmadığını sordum .
Blacklight Shining

Linux'ta yok sayıldığı açıktır, çünkü Unix'te yok sayılmıştır, bu da Linux'un gerçek * nix ile uymasını doğru bir davranış haline getirir. Söz konusu makaleyi okumaktan çekinmeyin. Aynı cevap 2004'ten greenend.org.uk/rjk/tech/perms.html adresinde , aynı zamanda serverfault.com/questions/371541/… 'nin
mikebabcock

Peki neden Unix'te görmezden geliniyor?
Isaac Rabinovitch

@IsaacRabinovitch, Blacklight'ın Linux ile ilgili sorunun açık olduğunu belirttiğinden, bu [yanaktaki dil] ile ilgili değildir, ancak birden fazla Unix'in kendisiyle farklı şeyler yaptığı ve hiçbir şey yapmanın daha güvenli bir varsayım olduğu şüphesiz basitçe tanımlanmamış davranışından şüpheleniyorum.
mikebabcock

/ Etiketi / sorusu linuxevet, ama bu belirsiz bir “Bu şekilde yapılır, çünkü diğer sistemler bu şekilde yapılır” tercih edeceğim anlamına gelmez, neden diğer sistemlerde bu şekilde yapıldığını açıklayan bir cevaba cevap verir. (Belki de linuxetiket kaldırılmalıdır?)
Blacklight Shining
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.