Linux Dosya İzinlerinde Setuid, Setgid ve StickyBit’i Anlama

Merhabalar,

 

Setuid, setgid ve sticky bit, yeni ve hevesli Linux yöneticilerinin anlaması zor olabilir. Temel tanımlar için bir web araması yapmak yeterince kolaydır  aslında.

setuid: yürütülebilir bir dosyanın sahibinin ayrıcalıklarıyla çalıştırılmasını sağlayan bir bit
setgid: dosya grubunun ayrıcalıklarıyla yürütülebilir bir çalıştırma yapan bir bit
sticky bit: dizinlerde, yalnızca sahibin veya kökün dosyaları ve alt dizinleri silmesine izin veren bir bittir.

Ancak bu ifade çok basit olabilir.Kavramları bir sınavı geçmek veya gerçek dünyada etkin bir şekilde kullanmak için yeterince iyi anlamak gerekir. Hadi buundan biraz daha derine inelim.Burada, tam da bunu yapmanıza yardımcı olacağız. Setuid, setgid ve sticky bit` in nasıl çalıştığını gözden geçireceğiz ve başlamanıza yardımcı olacak genel komutların bir listesini sağlayacağız.

Umask, setuid ve setgid dünyasına dalmadan önce, dosya izinleri, chmod ve chown’ı okumanızı öneririz. Zaten chmod ve chown konusunda rahatsanız, hemen başlayalım!

 

Setuid ve Setgid nedir?

Setuid ve setgid, kullanıcıların dosyanın sahibi olan kullanıcının (setuid) veya grubun (setgid) izinleriyle bir yürütülebilir dosyayı çalıştırmasının bir yoludur. Örneğin, bir kullanıcının root/sudo kullanıcı ayrıcalıkları gerektiren belirli bir görevi yerine getirebilmesini ancak onlara sudo veya kök erişimi vermek istemiyorsanız.

setuid ve setgid’e neden ihtiyaç duyulduğunu anlamak için, onlarsız işlerin nasıl yürüdüğüyle başlayalım.

 

Setuid veya Setgid Olmadan Nasıl Çalışır?

Normal olarak, bir Linux sistemindeki bir işlem başlatıldığında, onu hangi kullanıcı çağırdıysa onun kullanıcı kimliğini kullanarak çalışır. Bu, ilişkili kullanıcı kimliği/gid ile aynı ayrıcalıklara sahip olduğu anlamına gelir. Ne kullanıcınız ne de gerçek veya etkili gruplarınızdan herhangi biri erişime sahip değilse, sizin de erişiminiz olmayacaktır.

ls komutunu kullanarak basit bir örnek üzerinden gidelim. PIM klasörümüzde iki alt dizinimiz var: efran1 ve efran2. Her iki alt dizin de root’a aittir. efran1 alt dizini, diğer herkesin okuma ve yürütme izinlerine izin verir. efran2 alt dizini, diğer herkese ayrıcalık tanılmayacaktır.

 

Yukarıda görüldüğü gibi efran1 klasörüne  herkes erişebilir.Efran2 klasörüne sadece herkes erişemez sadece root kullanıcısı erişebilir.

 

/PIM/efran1 içindeki dosyaları listelemeye çalıştığımızda, sistem “efi” kullanıcı kimliğimize bağlı olarak ls erişimi verir.

Ancak aynı işlemi PIM/efran2 üzerinde denediğimizde izin reddedildi mesajı alıyoruz. Bunun nedeni, “efi” hesabımızın ayrıcalıklarıyla çalışırken, sistemin ls’nin efran2 alt dizinine erişimini reddetmesidir.Zaten yukarıda bu dizine erişimi olmadığını gördük.

root veya sudo hesabına geçersek, ls efran

 

2 alt dizininde iyi çalışır. Bu mantıklı çünkü artık ls komutu root kullanıcıyla ilişkili ayrıcalıklara sahiptir.

 

Setuid/Setgid Nasıl Çalışır ?

Setuid/setgid olmadan işlerin nasıl yürüdüğünü gördük ve çoğu durumda işler tam olarak böyle yürümeli. Bir kullanıcının ayrıcalıkları, yürüttükleri komutların neyi yapıp neyi yapamayacağını belirlemelidir.

Ancak bazı durumlarda, varsayılan olarak sahip olduklarından daha fazla ayrıcalığa (genellikle kök ayrıcalıklarına) sahip bir programı çalıştırmak için bir kullanıcıya ihtiyacınız olabilir. Bunun için ders kitabı örneği, kullanıcıların kendi şifrelerini değiştirmelerine izin veren passwd komutudur. Parolanızı değiştirmek, doğası gereği /etc/shadow dosyasının değiştirilmesini gerektirir. Ancak, yalnızca kök kullanıcının /etc/shadow dosyasına yazma erişimi vardır.

 

Normal şartlar altında bu, şifremizi değiştirmek için root olmamız veya sudo ayrıcalıklarına sahip olmamız gerektiğini gösterir. Ancak normal kullanıcılar, sudo veya root izinleri olmadan kendi parolalarını değiştirmek için passwd komutunu çalıştırabilir.

passwd’nin neden root düzeyinde erişim verdiğini, ancak ls’nin vermediğini anlamak için, bu iki yürütülebilir dosyadaki izinlere bir göz atalım.

 

Her iki yürütülebilir dosya da kök kullanıcısna ve grubuna aittir ve izinlerde yalnızca bir fark vardır. Gördüğünüz gibi, passwd yürütülebilir dosyasında, dosya sahibinin izinleri için bir “x” beklediğiniz bir “s” vardır. Bu “s” bize setuid bitinin ayarlandığını söyler.

Setuid biti ayarlı olduğu için passwd komutunu çalıştırdığımızda otomatik olarak dosyanın sahibi olarak çalıştırılır.root kullanıcısı dosyanın sahip olduğundan  bu işlemi yapabiliyoruz.

setgid biti de bir “s” dir, ancak dosyanın sahibi olan grup için yürütme konumunda. Örneğin, burada Ubuntu’da yürütülebilir wall gördüğümüz gibi:

Bu izinler göz önüne alındığında, wall komutunu çalıştırdığımızda tty grubunun ayrıcalıklarıyla çalışacağını biliyoruz.

 

Sticky Bit Nedir?

Linux dosya izinleri söz konusu olduğunda daha kafa karıştırıcı kavramlardan biri sticky bit ` tir. Erken Unix sistemlerinde, bir işlemden çıktıktan sonra bir programın bir kısmını takas alanında tutmak için sticky bit kullanıldı. Bu, programların daha hızlı yüklenmesini sağladı. Ancak, modern Linux sistemlerinde sticky bitin yaptığı şey bu değildir.

Bugün, sticky bit, Linux sistemlerinde bir dizindeki dosyaları kimlerin silebileceğini kısıtlar. Spesifik olarak, sticky bit ayarlandığında, yalnızca dizinin sahibi olan kullanıcı, dizinin sahibi olan kullanıcı veya kök kullanıcı dizin içindeki dosyaları silebilir. Bazı durumlarda, sticky bit daha sezgisel olarak “sınırlı silme bayrağı” veya “sınırlı silme biti” olarak adlandırılır.

/tmp dizini, sticky bit için en yaygın kullanım durumlarından biridir. Dosyalar, birçok çok kullanıcılı sistemin normal çalışması sırasında farklı kullanıcı hesapları için sıklıkla /tmp içinde oluşturulur. Kullanıcılar birbirlerinin /tmp dosyalarını silebilseydi, bu, farklı uygulamaların nasıl çalıştığına zarar verebilirdi.

Sticky bit` in nasıl çalıştığına dair basit bir örnek üzerinden geçelim.

İlk olarak, “efi” kullanıcı ve grubuna ait olan bir kullanıcı ve /efran1 dizini ile başlayacağız.

Ardından, sticky biti chmod +t /efran1 ile ayarlayacağız.

 

Bu komutun dizin izinlerinin sonuna bir “t” eklediğini görebiliriz. Bu “t” bize yapışkan bitin ayarlandığını söyler. Bu teoriyi test etmek için, “ikinci kullanıcı” hesabımızın dizinde dosyalar oluşturabildiğini ancak “efi” tarafından sahip olunan dosyaları silemediğini doğrulayalım.

İlk olarak, “firatcanoglu” olarak /efran1/  dizini içinde bir dosya oluşturmak için touch’ı kullanacağız.

 

Bu işe yaradı, dosya oluşturuldu.Şimdi bakalım “efi”ın sahip olduğu dosyayı silebilir miyiz.

 

Yapamayız! Bu, sticky bit` in işini yaptığı anlamına gelir. Normalde dizine yazma iznimiz varsa içindeki dosyaları silebiliriz. Ancak bu durumda sticky bit bizi durdurdu.

Setuid/Setgid/Sticky Bit Komutları:

Artık setuid, setgid ve sticky bit`in kavramsal olarak nasıl çalıştığına dair temel bir anlayışa sahip olduğumuza göre, bu bitleri kontrol etmek, ayarlamak ve kaldırmak için bazı komutlara geçelim.

Bir dosyanın setuid Bitinin Set Edilip Edilmediğini Kontrol Etme:

Bir dosyanın setuid bit kümesine sahip olup olmadığını kontrol etmenin en basit yolu ls -l </path/to/the/file> kullanmaktır. Kullanıcı için yürütme alanında bir “s” varsa, yapışkan bit ayarlanır. Örneğin, bunu çoğu *nix sisteminde çalıştırılabilir passwd ile görebiliriz.

 

Bir dosyanın setgid Bitinin Set Edilip Edilmediğini Kontrol Etme:

Setuid’de olduğu gibi, ls -l </path/to/the/file> kullanabiliriz. Bu durumda, grup için yürütme alanındaki “s”yi ararız.

 

Setuid Bitinin Ayarlanması:

Setuid bitini ayarlamak için chmod kullanabiliriz. Diğer izinlerde olduğu gibi, sembolik olarak veya sekizli değerler (0-7 sayıları) kullanılarak yapılabilir.

Setuid bitini sembolik olarak ayarlamak için chmod u+s </path/to/the/file> kullanabiliriz.

octal (Sekizli) gösterimi kullanarak setuid bitini ayarlamak için standart sekizli izinlerimizin önüne “4” ekleyebiliriz. Örneğin, chmod 4755 </path/to/the/file> sahibine okuma, yazma ve yürütme izinleri verir, kullanıcı ve grup okuma ve çalıştırma ve setuid bitini ayarlar.

 

Setgid Bitinin Ayarlanması:

setgid biti, setuid bitine benzer şekilde ayarlanabilir. Sembolik biçimde “u”yu “g” ile değiştiririz.

Ve sekizli biçimde “4” ile “2” yi yer değiştirmemiz yeterli olacaktır.

 

Setuid veya setgid bit seti ile tüm dosyaları listeleme

Root dizinden başlayarak, setuid veya setgid bit etkinken tüm dosyaları bulmak istiyorsanız, birçok *nix sisteminde bulunan GNU Findutils’den find en kolay yöntemlerden birini sunar.

sudo find / -perm /6000 -type f

Hadi şimdi bu  bilgileri bir örnekle taçlandıralım.aşağıdaki  gözüktüğü gibi üç adet dosyam linux.c,  onun derlenmiş hali linux ve teknikpark.txt şeklinde.

linux.c içinde yazılan kod aracılığı teknikpark.txt dosyasının içindeki metni ekrana yazdıracağım.Deneyelim.

 

 

Bakın yukarıda firatcanoglu olarak dosyayı çalıştırdım ve teknikpark.txt içindeki veriyi ekrana yazdırdı.

Şimdi izinleri kontrol edelim.teknipark.txt dosyasının sahibi dosyasını okuyup yazabilir aynı grubun üyeleri sadece dosyaları okuyabilir.Onun dışında hiç kimsenin dosyaya erişimi bulunmamaktadır.

 

Şimdi efi isimli kullanıcı ile dosyayının içeriğini görüntülemeye çalışalım.cat komutu dosyayı görüntülemeye çalıştığımda aşağıdaki erişim hatasını alıyorum.

 

Şimdi firatcanoglu kullanıcısının teknikpark.txt dosyasını kısıtlı tutmak istediğini ve kullanıcıların sadece belirli bir uygulama üzerinden okumasına izin vermek istediğini varsayalım.Bu, setuid flag kullanılarak gerçekleştirilebilir.İşte geldik beklenen o mükemmel ana.

Başka bir deyişle, efi kulllanıcsı teknikpark.txt dosyasını okuyamaz.Yine de, firatcanoglu kullanıcısının sahip olduğu okuyucuyu çalıştırarak, yürütme işlemi sırasında izinlerini devralır.Bunun için dosya sahibinin  setuid bit’i dosyanın izin tablosuna eklemesi gerekmetedir.Efi gibi başka bir kullanıcı tarafından yürütülse bile sahip ayrıcalıklarıyla işlenmesi talimatını verir.Şimdi ne yapacağız ? Direk dosyaya erişemiyoruz.Dosyayı linux dosyayısını çalıştırarak okumaya  çalışacağız.

ilk önce setuid biti ayarlanmadan  dosyayı çalıştıralım.

Gördüğünüz gibi, efi, teknikpark.txt dosyasını okumak için tasarlanmış bir C programı olan linux aşağıdaki izinler tablosuyla çalıştırmayı başardı, ancak linux, efi’ nin okuma izni olmadığı için ona teknikpark.txt’ye erişim izni veremedi.

 

 

Şimdi firatcanoglu, setuid bayrağını çalıştırarak okuyucu izinleri tablosuna eklediğinde ne olacağını görelim.

chmod u+s linux

 

ls -l çalıştırırsanız, izinler tablosunun değiştiğini fark edeceksiniz ve program adı kırmızı renkte görünerek olası riskler konusunda sizi uyaracaktır.Yeni izinler tablosu şöyle görünür

-rwsr-xr-x

S ile dosyanın setuid bayrağına sahip olduğunu gösterir; dosya her çalıştırıldığında, işlem, programı kimin yürüttüğünden bağımsız olarak dosya sahibine ait olacaktır.Sahibi dosyayı sistemden önce çalıştıracağından, yürütme Bu yüzden firatcanoglu setuid bayrağını ekledikten sonra, efi kullanıcısı teknikpark.txt dosyasını linux aracılığıyla okuyabilmelidir.

NOT: efi okuyucuyu çalıştırabilir çünkü tüm kullanıcılar yürütme haklarına sahiptir; firatcanoglu tüm kullanıcılar için yürütme izinlerini kaldırırsa, efi onu çalıştıramaz.

Setuid bayrağı, dosyayı sahibine göre tanımlar ve onu yürüten kullanıcı sahip izinlerini devralır, ancak setuid dosyayı kimin yürütebileceğini tanımlamaz.

 

 

Gördüğünüz gibi, efi dosyadaki verileri okumayı başardı.

 

Şimdi efi kullanıcısı scripti çalıştırırken aşağıdaki ps komutunu çalıştırırsam, 19854 (reader) işleminin gerçek kullanıcısı (RUSER) ile efektif kullanıcısı (USER) arasında bir fark göreceksiniz.

ps -ao pid,uid,ruser,user,rgroup,egroup,command

 

Yukarıdaki ekran görüntüsü, okuyucuyu çalıştıran gerçek kullanıcı efi veya başka bir kullanıcı olmasına rağmen, dosya her zaman firatcanoglu tarafından izinleri ile işlenir ve bu nedenle efi dosyayı sadece uygulama üzerinden görebilir.

Setuid bayrağını aşağıdaki komutu çalıştırılarak kaldırılabiliriz.

chmod u-s Dosya Adı

 

 

Sticky Bit Ayarlanması:

sticky bit` i dizinlere sembolik olarak chmod +t ile ayarlayabiliriz.

Veya octal (sekizlik= değerleri kullanarak ve standart izinlerimizin önüne “1” koyarak ayarlayabiliriz.

 

Sticky bit seti ile tüm dizinleri listeleme:

Setuid veya setgid bit seti ile tüm dosyaları bulma komutumuzda olduğu gibi, find burada yardımcı olabilir.

sudo find / -perm /1000

Setuid veya setgid bit seti ile tüm dosyaları bulma komutumuzda olduğu gibi, GNU’nun Findutils’inden find burada yardımcı olabilir:

 

Bu eğitim yazımızın sonuna geldik.Umarım bu eğitim yazısı sizler için faydalı olur.

 

 

 

 

Bu eğiticiye oy ver
[Total: 2 Average: 5]
Firat CANOĞLU TAĞ