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.