Linux izin modeli küçük ve öğrenilebilir bir sistemdir, ama iki noktada sezgiye aykırı davranır: dizinlerde izinlerin anlamı değişir, ve bir dosyayı silme yetkisi dosyanın kendisinde değil bulunduğu dizindedir. Sorunların çoğu bu ikisinden çıkar.
Üç sınıf, üç izin
Her dosyanın bir sahibi ve bir grubu vardır. İzinler üç sınıf için ayrı ayrı tanımlanır: sahip, grup üyeleri ve diğer herkes.
Her sınıf için üç izin bulunur: okuma (r), yazma (w) ve çalıştırma (x).
Listelemede görülen -rwxr-xr-- dizisi böyle okunur: ilk karakter türü söyler (dosya, dizin ya da bağlantı), sonraki üçerli gruplar sırasıyla sahip, grup ve diğerlerine aittir.
Kritik nokta: sınıflar dışlayıcıdır. Dosyanın sahibiyseniz yalnızca sahip izinleri size uygulanır — grup daha geniş yetki verse bile. Bu, “gruba yazma verdim ama yazamıyorum” durumunun açıklamasıdır.
Sayılar nereden geliyor
Her izin bir değer taşır: okuma 4, yazma 2, çalıştırma 1. Bir sınıfın izni, verilen izinlerin toplamıdır.
Böylece 7 okuma+yazma+çalıştırma, 6 okuma+yazma, 5 okuma+çalıştırma, 4 yalnızca okuma demektir.
Üç sınıf yan yana yazılır: 755 sahibe tam yetki, gruba ve diğerlerine okuma ve çalıştırma verir. 644 ise sahibe okuma-yazma, diğerlerine yalnızca okuma verir.
Pratikte iki değer işin çoğunu görür: dosyalar için 644, dizinler için 755. Betikler için 755.
Dizinlerde anlam değişir
Bu, en çok kafa karıştıran kısımdır.
Bir dizinde okuma (r), içindekilerin adlarını listeleyebilmek demektir. Çalıştırma (x) ise dizine girebilmek ve içindeki bir öğeye erişebilmek demektir.
Sonuç sezgiye aykırıdır: x olmadan r verilirse dosya adlarını görürsünüz ama hiçbirini açamazsınız. Tersine, r olmadan x verilirse listeleyemezsiniz ama adını tam olarak bildiğiniz dosyaya erişebilirsiniz.
Bu yüzden dizinlerde x neredeyse her zaman gerekir — ve bir dosyaya erişmek için yoldaki her dizinde x bulunmalıdır. “İzinler doğru ama erişemiyorum” vakalarının en yaygın nedeni, üst dizinlerden birinde eksik x iznidir.
Silme yetkisi dosyada değil
İkinci sezgi kırılması: bir dosyayı silmek için o dosyada yazma izniniz olması gerekmez. Gereken şey, dosyanın bulunduğu dizinde yazma iznidir.
Bunun nedeni, silmenin aslında dizinden bir kayıt çıkarmak olmasıdır. Dosyanın kendi izinleri bu işleme karışmaz.
Ortak dizinlerde bu ciddi bir sorundur: herkesin yazabildiği bir dizinde herkes başkasının dosyasını silebilir. Çözüm yapışkan bittir: dizine eklendiğinde, bir dosyayı yalnızca sahibi ya da dizinin sahibi silebilir. /tmp dizininde varsayılan olarak açıktır.
umask: yeni dosyalar neden 644 oluyor
Yeni oluşturulan dosyalar izinlerini bir taban değerden alır ve umask o tabandan neyin çıkarılacağını belirler.
Dosyalar için taban 666, dizinler için 777’dir. Yaygın umask değeri 022 olduğu için sonuç dosyada 644, dizinde 755 olur.
Bu, çalıştırma izninin neden yeni dosyalara verilmediğini de açıklar — güvenli bir öntanımlıdır.
Servis hesaplarında umask’ın farklı ayarlanması, o servisin ürettiği dosyaların beklenmedik izinlerle oluşmasına yol açar; sistemd birimlerinde bu açıkça tanımlanabilir. Ayrıntı systemd nedir yazısında.
Özel bitler
Üç ek bit vardır ve ikisi dikkat gerektirir.
setuid, bir programın sahibinin yetkisiyle çalışmasını sağlar. Gerekli olduğu birkaç sistem aracı dışında tehlikelidir; yetki yükseltmenin klasik yoludur.
setgid dizinlerde çok işe yarar: içeride oluşturulan dosyalar, oluşturanın değil dizinin grubunu devralır. Ortak proje dizinlerinde grup tutarlılığını sağlamanın en temiz yoludur.
Yapışkan bit yukarıda anlatılan silme korumasıdır.
777 çözüm değildir
Bir izin sorununda chmod 777 çalışır — ve tam olarak bu yüzden tehlikelidir. Sorunu gizler, nedenini bulmanızı engeller ve dosyayı sistemdeki herkese açar.
Doğru yaklaşım, hangi sınıfın hangi izne ihtiyacı olduğunu bulmaktır. Erişemeyen hesap dosyanın grubunda mı? Yoldaki dizinlerde x var mı? Sahiplik doğru mu?
Windows tarafında paylaşım ve NTFS izinlerinin kesişmesi benzer bir karmaşıklık üretir; etkin izin hesaplayıcı aracı ve dosya sunucusu izinleri rehberi o tarafı ele alıyor.
Gruplar ölçeklenir, tek tek izinler ölçeklenmez
İzni kullanıcıya doğrudan vermek kısa vadede hızlıdır ama bir yıl sonra kimin neye eriştiği bilinmez hâle gelir.
Doğru düzen, erişimi gruba vermek ve kullanıcıyı gruba almaktır. Böylece bir kişi ayrıldığında ya da rol değiştirdiğinde tek bir yerde işlem yapılır.
Aynı ilkenin genel çerçevesi en az yetki ilkesi yazısında.
Kısaca
Model üç sınıf ve üç izinden ibarettir; sayılar yalnızca kısaltmadır. İki kural akılda tutulursa çoğu sorun çözülür: dizinde x girmek demektir ve silme yetkisi dizinde durur.
Ve 777 bir çözüm değil, sorunun ertelenmesidir.