Dosya İzinleri, Yetkiler, Kullanıcılar ve Gruplar
Linux ve türevi işletim sistemlerinin en önemli özelliklerinden birisi, "her şey bir dosyadır" felsefesidir. Bütün Linux komutlarının ve sistemlerinin çalışma prensibi bu felsefeye göre oluşturulmuştur, böylece klavye, ses cihazları, monitör gibi cihazlar bile bir metin dosyası gibi müdahale edilebilir. Örneğin cat komutu ile istenilen veri ses kayıt cihazına işaret eden "dosyaya" yönlendirilebilir.
Her şeyin bir dosya olması, beraberinde bu dosyalara erişim yetkilerini de getirmiştir. Linux üzerinde dosyalarınızın yetkilerini görüntülemek için ls komutunu -l parametresiyle çalıştırabilirsiniz.
Yukarıdaki örnekte, ~/devel/crc dizininin içindeki dosyalar yetki ve izinleriyle birlikte listeleniyor. Linux üzerinde "~" karakteri özel bir dizin işaretçisidir. Bu işaret ile mevcut kullanıcının "home" dizini kastedilir. Örneğin eaydin kullanıcısı için ~ dizini her zaman /home/eaydin dizinine işaret eder, oysa root kullanıcısı için "/root" dizinine işaret eder.
Bu örnekte dizinimizde tek dosya olduğunu görüyoruz, evet sadece bu dosyanın özelliklerine bakmak isteseydik, parametre olarak dosyanın ismini verebilirdik.
ls komutu çıktısının üçüncü ve dördüncü sütunlarında bu dosyanın hangi kullanıcı ve hangi gruba ait olduğu görülüyor. crc8.py dosyası eaydin kullanıcısına ve plugdev grubuna aitmiş.
ls komutu çıktısının ilk sütunu ise bu kullanıcı ve grubun hangi yetkilere sahip olduğunu belirtiyor.
Buradaki ilk karakter ("-") şimdilik bir kenara bırakırsak, diğer karakterler 3'erli olarak sırasıyla dosya sahibinin, grubunun ve diğer kullanıcıların yetkilerini göstermektedir. Kısacası rwx yazan kısım eaydin kullanıcısının yetkilerini, r-x yazan kısım plugdev grubunun yetkilerini, r-- yazan kısım için sistemde geriye kalan bütün kullanıcıların yetkilerini göstermektedir.
Bu yetkiler çeşitli anlamların kısaltmalarıdır. r harfi okuma yetkisi (read), w yazma yetkisi (write) ve x çalıştırma yetkisi (execute) anlamına gelmektedir. Bu durumda sistemimizdeki crc8.py dosyasını herkes okuyabiliyor, dosya içeriğini sadece eaydin kullanıcısı değiştirebiliyor, dosyayı eaydin kullanıcısı ve plugdev grubuna dahil bütün kullanıcılar çalıştırabiliyor demektir.
rwx yetkilendirme kullanımını chmod
komutuyla yapabiliriz. chmod
komutu hem sembolik (harflerle) hem de oktal (rakamlarla) gösterimi destekler.
Sembolik Gösterim:
Kimi etkileyecek:
u
(user/sahip),g
(group/grup),o
(others/diğerleri),a
(all/tümü - varsayılan).Ne yapılacak:
+
(izin ekle),-
(izin çıkar),=
(izinleri tam olarak ayarla).Hangi izin:
r
(okuma),w
(yazma),x
(çalıştırma).
Örnekler:
Oktal (Rakamlarla) Gösterim:
Öte yandan, rwx yetkilendirme biçiminin farklı bir notasyonu bulunmaktadır. Okuma, yazma ve çalıştırma işlemlerinin her biri farklı bir rakamla ifade edilmek üzere, toplamları bir dosya için tüm yetkileri gösterebilir.
Örnekle açıklamak gerekirse, okuma işlemi için 4 sayısı, yazma işlemi için 2 sayısı ve çalıştırma işlemi için 1 sayısı tahsis edilmiştir. Bu durumda Dosyanın hem okunması, hem yazılması hem de çalıştırılması için 7 sayısı (4+2+1=7) yetkilendirmeyi ifade edebilir. Veya sadece okuma ve çalıştırma yetkisi vermek için 5 sayısı (4+1=5) yeterli olacaktır.
Bu durumda crc8.py dosyamızın rwxr-xr-- yetkisini rakamla ifade etmek istersek, 754 sayısı yeterli olacaktır. İlk rakam olan 7 dosya sahibi eaydin kullanıcısının rwx yetkisine, ikinci rakam olan 5 dosyayla ilişkilendirilen plugdev grubunun r-x yetkisine, 4 sayısı ise sistemde geri kalan tüm kullanıcıların r-- yetkisine işaret etmektedir.
chmod ile bu yetkilendirmeyi vermek için aşağıdaki komutu uygulayabiliriz.
Dizin Yetkilendirmesi
Dizin yetkilendirmeleri, dosya yetkilendirmelerinden farklı anlamlar taşır.
Okuma
4
Kullanıcının, dizinin içini görüntüleyebileceği anlamına gelir. Örneğin ls komutu ile içeriği görüntülenebilir
Yazma
2
Kullanıcının, dizinin içinde yeni dosya oluşturabileceği veya mevcut dosyaları silebileceği anlamına gelir. (Aşağıdaki önemli notu inceleyin)
Çalıştırma
1
Kullanıcının ilgili dizine girebileceği (cd) anlamına gelir.
Garip Yetkilendirme Durumları
Bazı dosyaların yetkileri pek alışıldık durumda olmayabilir. Dosyanızı bu şekilde tutmanızın pek bir anlamı yoktur.
100 veya 300: Dosyanın 1 veya 3 yetkisinin olması (yani --x veya -wx yetkisinin olması) hiçbir anlam ifade etmeyecektir. Çünkü bu dosyanın kişi tarafından çalıştırılabileceği ancak okunamayacağı anlamına gelir. Linux üzerinde bir dosya okunamazsa, çalıştırılamaz da.
200: Bu durum bir dosyaya yazabileceğiniz, ancak okuyamayacağınız anlamına gelir. Belki kullanıcının okumasını istemediğiniz, ancak yazmasını istediğiniz log/rapor dosyaları için kullanılabilir, ancak pek rastlanan bir durum değildir.
007: Bu dosya sahibi ve grubu tarafından hiçbir şekilde erişilemezken geri kalan tüm kullanıcılar tarafından erişilebilir. Potansiyel güvenlik açığıdır ve durumun incelenmesi gerekir.
000: Dosyaya kimsenin bir şey yapamayacağı anlamına gelir. Sadece root kullanıcısı dosyayı okuyabilir veya yazabilir. Öte yandan dosyanın sahibi dosyanın izinlerini değiştirebilir. Dolayısıyla bazı programlar dosyanın geçici süre koruma altında olması için bu durumu seçebilir.
Bir dosyaya yazma yetkinizin olmaması, onu silemeyeceğiniz anlamına gelmez. Dizin yetkileri dosya yetkilerinden farklıdır ve bir dizine yazma yetkinizin olması, o dizin içindeki dosyaları silebileceğiniz anlamına gelmektedir. Kısacası dosyanın izinleri 000 olsa bile, dizinde yazma yetkiniz varsa, o dosyayı silebilirsiniz.
Diğer Dosya Yetkileri
Dosya izinlerini incelerken, ls -l komut çıktısının ilk sütunundaki ilk karakteri şimdilik gözardı etmiştik. Bu karakter dosya hakkındaki bazı özel durumları göstermektedir. Aşağıdaki değerleri alabilir:
-
Normal dosya.
l
Sembolik link. Dosyanın bir link olduğu, işaret ettiği dosyanın farklı noktada olduğunu belirtir.
b
Dosyanın bir blok dosyası olduğu anlamına gelir. Kısacası bu dosyaya yazarken (ve okurken) bloklar halinde yazılmalıdır. Genellikle /dev altındaki sabit disk dosyalarında görülür.
c
Dosyanın bir karakter özel dosyası olduğu anlamına gelir. Yani blok dosyalarına benzerdir ancak yazıp okuma işlemlerinde karakter kullanılmalıdır. Örneğin /dev altındaki seri port cihazları bu özelliğe sahiptir.
s
Soket dosyası. Programların birbirleri ile iletişim kurarken, doğrudan dosya işaretçisi aracılığıyla veri iletmelerini sağlar.
Öte yandan setuid ve setgid bitleri, dosyanın çalıştırma izninin yerine geçebilir (x
yerine s
veya S
olarak görünür).
setuid (SUID): Bir çalıştırılabilir dosyada setuid biti ayarlandığında, dosyayı çalıştıran kişi, dosyayı çalıştırırken geçici olarak dosyanın sahibinin yetkilerine sahip olur. Örneğin,
passwd
komutu normal kullanıcıların kendi şifrelerini değiştirebilmesi için setuid root olarak ayarlanmıştır. Dikkatli kullanılmazsa ciddi güvenlik açıklarına neden olabilir.setgid (SGID): Bir çalıştırılabilir dosyada setgid biti ayarlandığında, dosyayı çalıştıran kişi, dosyayı çalıştırırken geçici olarak dosyanın grubunun yetkilerine sahip olur.
setgid (Dizinlerde): Bir dizine setgid biti (
chmod g+s dizin_adi
) ayarlandığında, o dizin içinde oluşturulan yeni dosyalar ve alt dizinler, otomatik olarak o dizinin grubuna sahip olur (oluşturan kullanıcının birincil grubu yerine). Bu, bir grup projesi için paylaşılan dizinlerde çok kullanışlıdır. Dizinlerde setuid bitinin ise standart bir etkisi yoktur ve genellikle kullanılmaz.
crc8.py dosyamızın setuid (sahip için) ve setgid (grup için) olması durumunda ls -l çıktısı aşağıdaki gibi olurdu:
Eğer setuid veya setgid biti ayarlanmışsa ancak ilgili konumda çalıştırma (x
) izni yoksa, s
yerine büyük S
harfi görünür. Bu genellikle anlamsız bir durumu veya bir hatayı belirtir. Örneğin:
Yukarıdaki örnekte, hem sahip hem de grup için setuid/setgid bitleri ayarlanmış ancak çalıştırma izni verilmemiştir.
Bir başka özel yetki biçimi sticky bit'tir (t
veya T
). Genellikle /tmp
gibi herkesin yazabildiği dizinlerde kullanılır. Bir dizinde sticky bit ayarlıysa (chmod +t dizin_adi
), o dizin içindeki bir dosyayı veya alt dizini yalnızca dosyanın/dizinin sahibi, dizinin sahibi veya root kullanıcısı silebilir ya da yeniden adlandırabilir. Yetki dizisinin son karakterinde (x
yerine) t
veya T
olarak görünür (T
yine çalıştırma izni olmayan durumu belirtir).
Kullanıcı ve Grup Düzenleme
Linux üzerinde bir kullanıcı eklemek son derece kolaydır. root yetkisine sahip olduğunuzda aşağıdaki komutu çalıştırırsanız eaydin isimli bir kullanıcı oluşturulacaktır.
eaydin kullanıcısını şifresini tanımlamak için aşağıdaki komut çalıştırılmalı, ardından iki kere şifre girilmelidir.
Şimdi sistemimizde bir veriteknik grubu tanımlayacağız, ardından eaydin kullanıcısını bu gruba ekleyeceğiz.
Yukarıdaki tekniklerle kullanıcı ve grup ayrı ayrı oluşturulur. Örneğin aşağıdaki komut, mevcut gruba yeni bir kullanıcı oluşturup ekler.
Sistemden kullanıcı ve grup silmek içinse aşağıdaki komutlar uygulanabilir.
Bir kullanıcının hangi gruplarda yer aldığını görüntülemek için id komutu kullanılabilir.
Benzer şekilde groups komutu da kullanılabilir.
Gördüğünüz gibi eaydin kullanıcısı hem eaydin grubunda, hem de veriteknik grubunda yer almaktadır. Her kullanıcının kendi grubu da bulunur ve bu gruplar silinemez, bu gruplara primary group denilir.
Bir kullanıcıyı belirli bir ikincil gruptan silmek için genellikle gpasswd
komutu kullanılır (bu komut çoğu dağıtımda bulunur):
Debian/Ubuntu tabanlı sistemlerde deluser
komutu da bu iş için kullanılabilir:
Bir kullanıcıyı, primary group haricindeki tüm gruplardan (yani tüm _secondary group_lardan) silmek içinse aşağıdaki komut uygulanabilir.
Sistemdeki bütün gruplar, /etc/group dosyasında yer alır, aşağıdaki komut ile tamamı listelenebilir. Komutun çalışma prensibi Gelişmiş Terminal Komutları bölümünde incelenecektir.
Benzer şekilde sistemdeki tüm kullanıcıları aşağıdaki gibi görüntüleyebilirsiniz.
Bu bilgiler doğrudan /etc/group
(gruplar için) ve /etc/passwd
(kullanıcılar için) dosyalarında saklanır. Ancak bu dosyaları doğrudan düzenlemek yerine kullanıcı/grup yönetimi komutlarını (useradd, usermod, userdel, groupadd, groupmod, groupdel, gpasswd vb.) kullanmak genellikle daha güvenli ve tutarlıdır. getent passwd
ve getent group
komutları da bu dosyaların içeriğini (ve potansiyel olarak diğer veritabanlarını, örneğin LDAP) sorgulamak için kullanılabilir.
Last updated