Kullanıcı, Grup ve Erişim Yetkileri

Linux, çok kullanıcılı bir işletim sistemidir. Çalışan her uygulama mutlaka bir kullanıcı ve grup no ile ilişkilidir; kullanıcı veya grubu olmayan bir uygulamanın olması söz konusu değildir. Uygulama içerisinden yapılan tüm erişimler, bu kullanıcı ve grup hakları doğrultusunda gerçekleştirilir.

Benzer şekilde dosya sistemi katmanında da her dosya ve dizin mutlaka bir kullanıcı ve grupla ilişkili durumdadır. Linux sanal dosya sistemi katmanı (Virtual Filesystem Switch) ile dosya sistemlerinin (ext4, xfs, btrfs vb.) alt seviye implementasyon detayları soyutlanmış ve ayrı bir katman oluşturulmuştur.

Dosyaların kullanıcı, grup sahiplikleri ve erişim yetkileri, VFS katmanında tanımlanmış bir özelliktir. FAT32 gibi kendi içinde bu özelliklere sahip olmayan bir dosya sistemine Linux altında erişim yapılırken, kullanıcı, grup sahiplikleri ve erişim yetkileri öntanımlı değerlerle simüle edilir.

Okuma, Yazma ve Çalıştırma Yetkileri

Dosya ve dizinler üzerindeki yetki kontrolleri temel olarak okuma (read - r), yazma (write - w) ve çalıştırma (execute - x) bitleri üzerinden kontrol edilir. Bu bilgiler dosya sistemi üzerinde inode yapılarında saklanmaktadır.

Bu yetki bitlerinin dosya ve dizinler üzerindeki anlamları aşağıdaki gibidir:

Yetki Açıklama
r Dosyalar için okuma yetkisi, dosya içeriğine ulaşılabilmesi anlamını taşır. Dizinlerde olduğunda ise, dizin içeriğinin listelenebilmesini (dizinlerin okunması gibi düşünülebilir) sağlar.
w Dosyalar için yazma yetkisi, dosya içeriğinin değiştirilebilmesini kontrol eder. Dizinler içinse, dizin içerisinde yeni dosya ve dizin oluşturma/silme operasyonlarını kontrol eder.
x Dosyalar için çalıştırma yetkisi anlamı taşır. Dizinler için ilgili dizine geçilip geçilemeyeceğini belirtir.

Standart read, write ve execute yetki bitleri haricinde SUID, SGID ve Sticky Bit olmak üzere 3 farklı bit daha bulunmaktadır.

SUID (Set User ID) Yetkisi

SUID yetkisi dosyanın sahibiyle ilgili erişim yetkileri arasında yer alıp, SUID biti üzerinden kontrol edilir.

Bir uygulamada SUID biti aktif ise, o uygulamayı hangi kullanıcı çalıştırırsa çalıştırsın, uygulama dosyasının sahibi kim ise, onun haklarıyla çalışır.

En tipik örnek passwd uygulamasıdır. Bu uygulamayı kullanarak sistemdeki her kullanıcı kendi parolasını değiştirebilir. Ancak parola değişikliğinin yapılabilmesi için sadece root kullanıcısının yazma yetkisi olan /etc/shadow dosyasında değişiklik yapılması gereklidir. Sistemdeki /usr/bin/passwd dosyasının sahibi root kullanıcısı olmakla birlikte, biz herhangi bir normal kullanıcı olarak bu dosyayı çalıştırdığımızda, ilgili process kendi kullanıcı ID değerimizle ve bu değerin sistem ve dosya sistemi üzerindeki haklarıyla kısıtlı olarak faaliyet gösterecektir. Dolayısıyla parola değişimi için gereken /etc/shadow dosyasına yazma yetkisi olmadığından işlemi gerçekleştiremeyecek, hata alacaktır.

Bu problemin çözümü için, bazı uygulamaların çalıştıran kullanıcının kim olduğundan bağımsız olarak sistemde belirli bir kullanıcının yetkileriyle (örneğimizde root) çalışabilmesi için bir olanak sunulması gereklidir. SUID biti bu noktada devreye girer ve /usr/bin/passwd uygulamasına eklenen SUID biti sayesinde, uygulama çalıştırıldığı andan itibaren uygulama dosyasının dosya sistemindeki sahibi olan root kullanıcısının haklarıya çalışır.

Peki bu bir güvenlik zaafiyeti yaratmıyor mu, şeklinde bir soru aklınıza gelebilir. Elbette yaratıyor. Ama durum göründüğü kadar kötü değil. SUID bitine sahip uygulamaların geliştirilmesinde çok daha fazla özen gösterilir ve bu uygulamalar kısa bir zaman diliminde net bir şekilde belirlenmiş bir işlevi gerçekleştirip sona ererler. Örneğimizdeki passwd uygulaması, herhangi bir zaafiyet içermediği yıllardır kanıtlanmış olan güvenilir bir uygulamadır. Ancak SUID bitinin çok daha büyük ve kompleks uygulamalarda kullanılması sonucu, uygulama içi herhangi bir buffer overflow sorunu olması halinde, uygulamaya yapılacak başarılı bir saldırı sonrası sistemde root erişimi elde edilmesi gibi istenmeyen durumlar oluşabilir. 2000'li yıllardan önce bu tarz sorunlar çok daha fazla görülmekteydi ancak günümüzde hem bu tarz saldırıları zorlaştırıcı pek çok önlem mevcut hem de güvenlik tarafında artık belirli bir kültür oluştuğu için, bu bit daha bilinçli ve dikkatli biçimde kullanılmaktadır.

SGID (Set Group ID) Yetkisi

SUID biti ile benzer mantıkta, bir uygulamanın, kimin çalıştırdığına bakılmaksızın uygulama dosyasının grup sahibinin grup erişim yetkileri doğrultusunda çalıştırılmasını sağlamaktadır. SGID biti, SUID bitine oranla pratikte daha az kullanım alanı bulmaktadır.

Sticky Bit

Unix tabanlı işletim sistemlerinde /tmp dizini geçici dosya oluşturmak için tüm kullanıcıların ve uygulamaların kullanımına açılmıştır. Root kullanıcısının haklarıyla çalışan bir uygulama da, farklı kullanıcıların haklarıyla çalışan diğer uygulamalar da herhangi bir anda kısa veya uzun süreliğine geçici bir dosya oluşturma ihtiyacı duyabilir. Sistemde yazılabilir bir dizinin deneme/yanılma ile aranması makul bir süreç olmadığından, /tmp dizini bu işler için ayrılmıştır.

Bu noktada karşımıza önemli bir problem çıkmaktadır: /tmp dizini tüm kullanıcılar tarafından yazılabilir durumda ise, A kullanıcısının oluşturduğu /tmp/test.txt dosyasına B kullanıcısı tarafından yazılması veya dosyanın tamamen silinmesi nasıl engellenecektir?

İşte sticky bit (t olarak gösterilir) bu özel durumun çözümünde kullanılır.

Bir dizin üzerinde sticky bit aktif ise, o dizin altında her kullanıcı yeni dosya oluşturabilir ve kendi oluşturduğu dosyaları silebilir. Diğer kullanıcıların oluşturduğu dosyaları ise silemez.

Sticky bit kullanımı dizinler için anlamlı olmakla birlikte, dosyalar için de kullanımı geçerlidir. Sticky bit aktif olan çalıştırılabilir bir uygulama dosyasının, işletim sistemi tarafından ilk çalıştırıldığı andan sonra bellekte tutulmaya devam edilmesi ve sonraki yüklemelerinin hızlı gerçekleştirilmesi istenir. Çok eskiden bu anlamlı bir kullanım iken, günümüzde modern işletim sistemlerindeki gelişmiş paylaşımlı kütüphane, sanal bellek ve page cache stratejileri sayesinde bu kullanım ihtiyacı ortadan kalkmıştır.

Erişim Yetkilerinin Görüntülenmesi

Bir dosya üzerindeki erişim yetkilerinin görüntülenmesi için ls komutu -l parametresi ile çalıştırılmalıdır:

$ ls -l /etc/debian_version 
-rw-r--r-- 1 root root 11 May  5  2013 /etc/debian_version

Dizinler için aynı parametrelerle çalıştırıldığında, ilgili dizinin içeriği listelenecektir. Dizinin kendisiyle ilgili erişim yetkilerini görmek içinse komut -d parametresi eklenerek kullanılmalıdır:

$ ls -ld /etc/init.d
drwxr-xr-x 2 root root 4096 Feb  2 22:36 /etc/init.d

C kütüphanesi üzerinden erişim yetkilerini test edebilmek için stat() fonksiyonu kullanılır. Ayrıntılı kullanımı için man sayfasına bakabilirsiniz: man 2 stat

ls komutunun çıktısındaki erişim yetkileriyle ilgili ilk karakter aşağıdaki tablo doğrultusunda anlamlandırılır:

Karakter Anlam
- standart dosya (regular file)
d dizin
c karakter tabanlı aygıt dosyası (/dev/console vb.)
b blok tabanlı aygıt dosyası (/dev/sda3 vb.)
s özel dosya (unix domain soket vb.)

Erişim yetkileriyle ilgili ilk karakterden sonraki 3'lü blok, dosya/dizin sahibinin dosya/dizin üzerindeki erişim yetkilerini gösterir.

Bir sonraki 3'lü blok, dosya/dizin'in grup sahibinin dosya/dizin üzerindeki erişim yetkilerini gösterir.

Sonraki ve son 3'lü blok ise, dosya/dizin için sahibi veya grup sahibi kısmına girmeyen kullanıcılar için (other) tanımlanmış olan erişim yetkilerini gösterir.

Erişim Yetkilerinin Düzenlenmesi

Dosya sisteminde yer alan bir dosya/dizin için erişim yetkilerinin düzenlenmesi işlemi chmod komutu ile yapılır. Değiştirilmek istenen yetkilerin neler olduğu ve üçlü erişim yetki bloklarından hangisi veya hangileriyle ilişkili olduğu parametre olarak belirtilir. Parametrelerde erişim yetki grubu belirtildikten sonra, + veya - ile hangi yetkilerin ekleneceği veya çıkartılabileceği belirtilebileceği gibi, = ile tam olarak hangi yetkilere sahip olacağı da belirtilebilmektedir.

chmod Erişim Yetki Grupları

Karakter Etkilediği Grup
u Dosya/dizin sahibi
g Dosya/dizin grup sahibi
o Dosya/dizin sahibi ve grup sahibi dışında kalanlar (others)
a Dosya/dizin sahibi, grup sahibi ve bunların dışında kalanlar dahil her üç blok

chmod Erişim Yetki Parametreleri

Karakter Yetki
r Okuma
w Yazma
x Çalıştırma
X Sadece dizinler için çalıştırma yetkisi
s Çalışma zamanında user id veya grup id değişimi (suid bit)
S Suid biti aktif fakat çalıştırma yetkisi yok
t Sticky bit
u Dosyanın kullanıcı (user) olarak sahibinin yetkileri
g Dosyanın grup sahibi yetkileri
o Dosya ile ilgili diğer (other) kullanıcıların yetkileri

Örnekler

Aşağıdaki file1 dosyası ve dir1 dizini için erişim yetki değişikliği örneklerini inceleyiniz:

Komut Açıklama
chmod u+rwx file1 Dosyanın sahibine okuma, yazma, çalıştırma yetkisi ver
chmod u-wx file1 Dosyanın sahibinden yazma ve çalıştırma yetkisini kaldır
chmod u+w-r file1 Dosyanın sahibine yazma yetkisini ver, okuma yetkisini kaldır
chmod u=rw file1 Dosyanın sahibine okuma ve yazma yetkisi ver, çalıştırma yetkisi verme
chmod u+x,g+wx file1 Dosyanın sahibine çalıştırma yetkisi ekle, aynı zamanda grup sahibine yazma ve çalıştırma yetkisi ekle
chmod g=rw file1 Dosyanın grup sahibine okuma ve yazma yetkisi ver, çalıştırma yetkisini kaldır
chmod o=r file1 Sahip veya grup sahibi dışında kalan diğer kullanıcılara sadece okuma yetkisi ver
chmod +x file1 Tüm erişim gruplarına (sahip, grup ve diğer), çalıştırma yetkisi ekle
chmod -x file1 Tüm erişim gruplarından çalıştırma yetkisini kaldır
chmod a=r file1 Tüm erişim gruplarına (a = all) okuma yetkisi ver, yazma ve çalıştırma yetkisini kaldır
chmod u+s file1 SUID yetkisini ekle
chmod g+s file1 SGID yetkisini ekle
chmod +t file1 Sticky bitini aktifleştir
chmod -R g-X dir1/ Dizin altında recursive olarak dolaş, sadece bulunan alt dizinlerin grup sahiblerinden dizin içine geçme (x) yetkisini kaldır

Sekizli Sistemle Gösterim

chmod komutu yukarıdaki bölümde anlattığımız şekilde kullanılabileceği gibi, chmod 755 dir örneğindeki gibi erişim yetkilerinin bir sayı ile ifade edilmesi yöntemiyle de kullanılabilir.

Erişim yetkilerinin sayısal değerlerle ifade edildiği bu modelin kullanımı kulağa daha zor gelse de, en sık kullanılan 3-5 erişim yetki deseni için bir süre sonra numaralarının öğrenilmesi neticesinde pratikte sayısal değerlerin kullanımının oldukça yaygın olduğunu söyleyebiliriz.

Örnek olarak, dosyanın sadece sahibinin okuma/yazma yapıp, grup sahibi ve geri kalanların sadece okuma yaptığı 644 sayısı veya tüm kullanıcı ve gruplara tüm hakların verilmesini ifade eden 777 sayısı pek çok kullanıcı tarafından ezbere bilinir.

İstediğimiz erişim yetki bitleri için doğru sayıyı bulabilmek için aşağıdaki tablodan faydalanabilirsiniz. Soldan sağa doğru, read, write ve execute şeklinde sıralanan erişim bitlerinin aktif olma veya olmama durumuna göre (1 veya 0), elde edilen rakam önemlidir. Her 3 erişim yetki grubu için bu 3 bitin durumundan elde edilen sayı yazılıp birleştirildiğinde chmod için kullanılacak değer öğrenilmiş olur. Yani 644 olarak sayıyı görmek yerine, 1. üçlü erişim biti kombinasyonu değerinin 6 (rw-), 2. üçlü erişim biti kombinasyonu değerinin 4 (r--) ve son olarak 3. erişim biti kombinasyonu değerinin de 4 (r--) olduğunu düşünmeliyiz. Bu rakamları yanyana yazdığımızda 644'ü elde ediyoruz.

8'li değer Read Write Execute
7 r w x
6 r w -
5 r - x
4 r - -
3 - w x
2 - w -
1 - - x
0 - - -

Peki SUID, SGID ve Sticky Bit'inin rakam olarak ifadesini nasıl yapacağız?

3 adet olan bu özel bitleri de, ls komutu çıktısında gösterildiği sırasıyla, sst (rwx) biçiminde görebiliriz.

SUID SGID Sticky Bit
s s t

Bu özel bitlerin aktif olup olmama durumuna göre gene 0-7 arasında bir sayı değeri elde edilecektir. Örneği SUID ve SGID biti işaretlenmemiş ancak Sticky Bit işaretlenmişse bu bloktan elde edilecek sayı değeri 1 olacaktır. Dosya veya dizinin geri kalan erişim bitleri de 755 şeklinde ise özel bitlerin kombinasyonundan gelen rakam da bu değerin soluna eklenir ve 1755 şeklinde ifade edilir: chmod 1755 mydir

Benzer şekilde 2755, 4755 değerlerinin nasıl bir erişim yetkisini ifade ettiğini düşününüz.

Artık neden bazı fonksiyon dokümantasyonlarında erişim modlarının 0644, 0755 gibi ifade edildiğini de öğrenmiş olduk. Çoğu zaman bu özel 3 bit aktif olmadığından hep 0 değerini üretecektir.

results matching ""

    No results matching ""