Set-user-ID mekanizması Unix'te nasıl çalışır?


12

Birisi Unix'teki set-user-id mekanizmasını açıklayabilir mi? Bu tasarım kararının ardındaki gerekçe neydi? Etkili kullanıcı kimliği mekanizmasından farkı nedir?

Yanıtlar:


10

Unix'teki dosyalar için normal okuma, yazma ve yürütme izinlerini biliyor olabilirsiniz.

Bununla birlikte, birçok uygulamada, bu tür izin yapısı - örneğin, belirli bir kullanıcıya belirli bir dosyayı okumak için tam izin vermek veya dosyayı okumak için hiçbir izin vermemek - çok kabadır. Bu nedenle, Unix başka bir izin biti, set-user-IDbit içerir. Bu bit yürütülebilir bir dosya için ayarlanmışsa, dosya sahibi dışında bir kullanıcı dosyayı yürüttüğünde, bu kullanıcı, sahibinin diğer dosyalarından herhangi birine erişirken sahibinin tüm dosya okuma / yazma / yürütme ayrıcalıklarını alır!

Bir dosya için set-user-ID bitini ayarlamak için şunu yazın

 chmod u+s filename

Grup-diğer yürütme iznini de ayarladığınızdan emin olun; grup-diğer okuma iznine sahip olmak güzel olurdu. Bütün bunlar tek bir açıklama ile yapılabilir

 chmod 4755 filename

Kayıtlı UID olarak da adlandırılır. Başlatılmış bir Set-UID biti olan bir dosya, kaydedilen UID dosya sahibinin UID'si olacaktır. Aksi takdirde, kaydedilen UID Gerçek UID olur.

Etkili kullanıcı kimliği nedir?

Bu UID, belirli bir eylemi gerçekleştirme işleminin ayrıcalıklarını değerlendirmek için kullanılır. EUID, Gerçek UID veya EUID! = 0 ise Süper Kullanıcı UID olarak değiştirilebilir. EUID = 0 ise, herhangi bir şeyle değiştirilebilir.

Misal

Böyle bir programa örnek olarak gösterilebilir passwd. Tam olarak listelerseniz, Set-UID biti olduğunu ve sahibinin "kök" olduğunu görürsünüz. Normal bir kullanıcı, "mtk" deyince, passwdşununla başlar:

Real-UID = mtk  
Effective-UID = mtk  
Saved-UID = root

Referans bağlantısı 1
Referans bağlantısı 2


5

man credentialsbu durumda iyi bir bilgi kaynağıdır. Ayrıca bu questiin Bkz SO . Tarihsel açıklama için bu arşivlenmiş gönderiye bakın .

"Set UID" ve "efektif UID" bir mekanizma olarak adlandırmak yerine, UID'lerin tüm konsepti bu şekilde adlandırılmalıdır. Çeşitli UID'lerin varlığının mantığı, ayrıcalık ayrımı ile çeşitli sıkıntılardır. Normal (ayrıcalıklı olmayan) kullanıcılar bile bazen sadece ayrıcalıklı kullanıcıların yapabileceği şeyler (erişim kaynaklarına) yapmalıdır. Bunu kolayca başarmak için programlar UID'lerini değiştirebilir. Bunların 3 tipi vardır:

  • gerçek UID - bir işlemin sahibi olan UID

  • etkin UID - bir işlemin şu anda çalıştığı UID - bu, işlemin belirli bir andaki gerçek yeteneklerini belirler. Bu aynı zamanda psUSER (KULLANICI) alanında da gösterilir.

  • kaydedilmiş küme UID - gerçek ve etkili UID'ler arasında geçiş yapmak için kullanılan yer tutucu

Sonuncusuna duyulan ihtiyaç, düzenli kullanıcıların sadece bu üç şey arasında başka bir şey arasında geçiş yapamaması ve bir setuid programının genellikle bir şekilde kimin yüklediğini bilmesi gerektiğidir (artı gerçek UID'nin değiştirilmemesi gerekir. daha büyük bir karmaşa yaratacaktır).


1

mtk'ın açıklamaları iyi.

passwdÖrnek ayrıcalık tırmanması biridir - sadece kök değiştirmek için izin verildiğini dosyalarını değiştirebilir gerektiğinden passwd daima kök olarak çalışır. Bu, passwd yürütülebilir dosyasının arabellek taşmalarına vb. Eğilimli olmamasını önemli kılar, böylece akıllı bir normal kullanıcı amaçlanmayan kullanımlara koyabilir.

Başka bir gerekçe, kullanıcıyı sukök olarak oturum açmışsanız kullanabileceğiniz şekilde korumaktır - belirli bir görev için ayrıcalıklarınızı azaltmak veya kısıtlamak amacıyla onları yükseltmek değil. Örneğin, öğelerime erişim gerektirmeyen ve kendi gereksinimlerine sahip olan (örneğin, bir logger) kendi şeylerine sahip bir daemon hizmeti başlatma iznim varsa, onu çalıştırmak, sadece bu şeylere erişebileceği anlamına gelir ve benim veya başkalarının değil.

Bununla birlikte, suid biti yürütülebilir dosyada ayarlanmamış olsa bile uid'in programlı olarak ayarlanabileceğini unutmayın , ancak bu artış için çalışmaz. Yani, normal bir kullanıcıysanız ve bir noktada uid ayarlayan bir program yazarsanız, bu program root'a geçemez. Apache'nin bu şekilde çalıştığına inanıyorum. Genellikle kök tarafından başlatılır ve daha sonra uid'i ayrıcalıklı olmayan bir kullanıcıya (örneğin, "httpd") geçiren çatalları olan bir işleme sahiptir. Bu alt süreçler gerçek web sunucusunun çalıştığı şeydir.

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.