
Dosya Türleri ve İzinleri: Linux Dosya Yönetiminin Temelleri
- Murat Akpınar
- Linux öğrenme yolculuğu
- 16 Eylül 2023
İçindekiler
ls -l çalıştırdığınızda her satırın başında on karakterlik bir dizi görürsünüz: -rw-r--r--. Çoğu kullanıcı bu diziyi okumadan geçer ve izin gerektiğinde chmod 777 yazıp sorunu “çözer” — sonra o dosyayı sistemdeki herkesin değiştirebildiğini fark etmez.
Bu yazıda o on karakterin ne söylediğini, izinlerin sayısal karşılığını ve normal izinlerin yetmediği yerde devreye giren üç özel biti (setuid, setgid, sticky) göreceğiz.
Dosya Türleri: ls -l Çıktısının İlk Karakteri
ls -l çıktısındaki ilk karakter dosyanın türünü söyler:
| Karakter | Tür | Örnek |
|---|---|---|
- | Normal dosya | Metin, betik, resim, ikili program |
d | Dizin (directory) | /home, /etc |
l | Sembolik bağlantı | /bin → /usr/bin |
c | Karakter aygıtı | /dev/null, /dev/tty |
b | Blok aygıtı | /dev/sda |
p | Adlandırılmış boru (named pipe) | mkfifo ile oluşturulur |
s | Soket | /run/docker.sock |
Son dördü dosya ve dizin hiyerarşisi yazısında geçen /dev ve /run dizinlerinde karşınıza çıkar: Linux’ta aygıtlar da dosya olarak temsil edilir.
İzinleri Okumak: rwx Üçlüsü ve On Karakter
Linux dosya izinleri üç kategoriye ayrılır:
- Kullanıcı (Owner): Dosyanın veya dizinin sahibi. Genellikle dosyayı oluşturan kullanıcıdır.
- Grup (Group): Dosyanın veya dizinin ait olduğu grup. Birden fazla kullanıcı aynı grupta olabilir.
- Diğerleri (Others): Dosyanın veya dizinin sahibi veya gruptaki kullanıcılar dışındaki herkes.
Her bir kategori için izinler aşağıdaki şekillerde tanımlanır:
- Okuma (Read - r): Dosyanın içeriğini okuma izni.
- Yazma (Write - w): Dosyaya veri yazma veya değiştirme izni.
- Çalıştırma (Execute - x): İçeriği çalıştırma izni (eğer bir betik dosyası ise).
Diziyi Parçalara Ayırmak
Bu üçlü, üç kategori için art arda yazılır. ls -l satırının başındaki dizi şöyle bölünür:
-rwxr-xr--
│└┬┘└┬┘└┬┘
│ │ │ └── diğerleri: r-- → yalnızca okuyabilir
│ │ └───── grup: r-x → okuyabilir, çalıştırabilir
│ └──────── sahip: rwx → okur, yazar, çalıştırır
└────────── tür: - → normal dosya
Dizinlerde aynı harfler farklı anlama gelir ve en çok karıştırılan yer burasıdır:
r→ dizinin içindekileri listeleyebilirsiniz (ls).w→ dizinde dosya oluşturabilir ve silebilirsiniz. Bir dosyayı silme yetkisi dosyanın kendi izinlerine değil, içinde bulunduğu dizinin yazma iznine bağlıdır. Yazma izniniz olmayan bir dosyayı, dizine yazabiliyorsanız silebilirsiniz.x→ dizinin içine girebilirsiniz (cd) ve içindeki bir dosyaya yol üzerinden erişebilirsiniz.xolmadanrneredeyse işe yaramaz: isimleri görürsünüz ama hiçbirini açamazsınız.
Sahibini ve Grubunu Değiştirmek: chown ve chgrp
İzinler kime uygulanacağını bilmeden işe yaramaz. Bir dosyanın sahibini chown, grubunu chgrp değiştirir. chown iki tarafı iki nokta üst üste ile ayırır: soldaki sahip, sağdaki grup.
chown murat:proje rapor.txt # hem sahip hem grup
chown murat rapor.txt # yalnız sahip
chown :proje rapor.txt # yalnız grup (sol taraf boş)
chgrp proje rapor.txt # aynı işin kısa yolu
Bir dizini ve içindeki her şeyi birden değiştirmek için -R ekleyin:
chown -R murat:proje /srv/proje
chown root yetkisi ister — kendi dosyanızı bile başkasına devredemezsiniz, aksi hâlde disk kotası anlamsızlaşırdı. chgrp ise üyesi olduğunuz bir gruba geçiş yapıyorsanız yetkisiz de çalışır.

Sayısal Biçim: chmod ve Octal Mod
Üç iznin her biri bir bit değeri taşır: okuma 4, yazma 2, çalıştırma 1. Bir kategorinin izni, o kategoride açık olan bitlerin toplamıdır — rw- = 4+2 = 6, r-x = 4+1 = 5. Üç kategori yan yana yazılınca üç haneli sayı çıkar:
| Octal değer | String | İznin anlamı |
|---|---|---|
| 0 | --- | Hiçbir izin yok |
| 1 | --x | Çalıştırma |
| 2 | -w- | Yazma |
| 3 | -wx | Yazma & çalıştırma |
| 4 | r-- | Okuma |
| 5 | r-x | Okuma & çalıştırma |
| 6 | rw- | Okuma & yazma |
| 7 | rwx | Okuma & yazma & çalıştırma |
Yani chmod 750 betik.sh, -rwxr-x--- demektir: sahip her şeyi yapar, grup okur ve çalıştırır, diğerleri hiçbir şey yapamaz.
chmod 750 betik.sh # sayısal
chmod u=rwx,g=rx,o= betik.sh # aynı sonucun harfli karşılığı
chmod g+w betik.sh # mevcut izinlere ekleme yapar, diğerlerini korur
Sayısal biçim izinlerin tamamını baştan yazar; harfli biçim (+/-) yalnızca belirttiğiniz biti değiştirir. Toplu değişikliklerde bu ayrım önemlidir.
chmod 777 bir çözüm değildir. Bir erişim sorununda ilk refleks olarak 777 vermek sorunu görünürde kapatır ama dosyayı sistemdeki her kullanıcıya yazılabilir hâle getirir; web sunucusu altındaki bir dizinde bu, herhangi bir kullanıcının çalıştırılabilir kod bırakabilmesi demektir. Doğru yol, dosyayı doğru gruba verip gruba izin tanımaktır — bkz. gruplar ve üyelik yönetimi.
Sayı ile sembol arasında çevrim yaparken chmodcommand sitesini kullanıyorum.
Özel Bitler: setuid, setgid ve Sticky Bit
Üç kategorilik rwx düzeni her sorunu çözmez. “Kullanıcı kendi parolasını değiştirebilsin ama /etc/shadow‘u okuyamasın” ya da “bu dizine on kişi yazsın ama kimse başkasınınkini silmesin” gibi istekler normal izinlerle ifade edilemez. Bunun için üç ek bit vardır.
Setuid (Set User ID):
Ne İşe Yarar? Setuid, bir kullanıcının dosyayı çalıştırdığında o dosyanın sahibi olarak kabul edilmesini sağlar. Bu, kullanıcının normalde erişim hakkı olmayan sistem kaynaklarına erişmesine izin verebilir.
Nasıl Ayarlanır?
chmod u+s dosya_adı(ya da sayısal biçimdechmod 4755 dosya_adı). Setuid biti çalıştırma iznini açmaz; dosyanın zaten çalıştırılabilir olması gerekir.ls -lçıktısında sahip alanının üçüncü karakteri, çalıştırma izni varsa küçüks, yoksa büyükSgörünür — büyükSgördüyseniz bit konmuş ama etkisiz demektir,chmod u+xile tamamlamanız gerekir.Örnek Kullanım: “passwd” komutu Setuid özelliğine sahiptir, böylece kullanıcılar kendi şifrelerini değiştirebilirler:
ls -l /usr/bin/passwd # -rwsr-xr-x 1 root root 68208 /usr/bin/passwd # ↑ setuid biti: komut, çalıştıran kim olursa olsun root yetkisiyle çalışırSistemdeki tüm setuid dosyalarını listelemek için:
find / -perm -4000 -type f 2>/dev/nullSetuid kabuk betiklerinde çalışmaz. Linux çekirdeği, yorumlayıcıyla çalışan betiklerde (
#!/bin/bashile başlayan dosyalar) setuid bitini güvenlik gerekçesiyle yok sayar. Bir betiğe yetki vermek istiyorsanız doğru araçsudoyapılandırmasıdır.Neden gerekli? Parolalar
/etc/shadow‘da tutulur ve o dosyayı yalnızca root okuyabilir. Kendi parolanızı değiştirirken aslında root’a ait bir dosyaya yazmanız gerekir. Setuid biti tam olarak bu boşluğu kapatır:passwdkomutu sizin adınıza root yetkisiyle çalışır, ama yalnızca kendi satırınıza dokunur.
Setgid (Set Group ID):
Ne İşe Yarar? İki farklı işi vardır ve asıl kullanılan ikincisidir:
- Çalıştırılabilir dosyada: program, çalıştıran kullanıcının grubuyla değil, dosyanın ait olduğu grupla çalışır. Sisteminizdekileri
find / -perm -2000 -type f 2>/dev/nullile listeleyebilirsiniz. - Dizinde: o dizinde oluşturulan yeni dosyalar, oluşturan kişinin birincil grubunu değil dizinin grubunu alır. Ekip için paylaşımlı dizin kurmanın çalışan tek yolu budur; setgid olmadan herkesin dosyası kendi grubuna ait olur ve diğerleri erişemez.
- Çalıştırılabilir dosyada: program, çalıştıran kullanıcının grubuyla değil, dosyanın ait olduğu grupla çalışır. Sisteminizdekileri
Nasıl Ayarlanır?
chmod g+s dizin_adı(sayısal biçimdechmod 2775 dizin_adı).Örnek Kullanım: Bir proje dizinini
projegrubuna açmak:chgrp proje /srv/proje chmod 2775 /srv/proje ls -ld /srv/proje # drwxrwsr-x 2 root proje 4096 /srv/proje # ↑ setgid: buraya kim dosya oluşturursa oluştursun grubu "proje" olurUygulamalı senaryonun tamamı gruplar yazısında var.
Sticky Bit:
- Ne İşe Yarar? Herkesin yazabildiği bir dizinde silme yetkisini kısıtlar. Sticky bit konmuş bir dizinde bir dosyayı yalnızca dosyanın sahibi, dizinin sahibi ve root silebilir ya da yeniden adlandırabilir. Sticky bit olmadan, dizine yazma izni olan herkes içindeki her dosyayı silebilir — yukarıda anlatılan dizin kuralının doğrudan sonucu.
- Nasıl Ayarlanır?
chmod +t dizin_adı(sayısal biçimdechmod 1777 dizin_adı). - Örnek Kullanım:
/tmp. Sistemdeki her kullanıcı oraya dosya yazabilir; sticky bit olmasaydı herhangi bir kullanıcı bir başkasının geçici dosyasını silebilir ve çalışan programı bozabilirdi.
Üçü de normal izinlerin yerine geçmez, üzerine biner. Yanlış konulmuş bir setuid biti ise doğrudan yetki yükseltme açığıdır: sisteme sonradan eklenmiş setuid dosyalarını find / -perm -4000 -type f 2>/dev/null ile dönem dönem denetleyin.
| İzin Türü | Sembolik İfadesi | Rakamsal Değeri |
|---|---|---|
| Setuid | u+s | 4 |
| Setgid | g+s | 2 |
| Sticky Bit | +t | 1 |
Bu rakam, normal izinlerin önüne dördüncü hane olarak yazılır: chmod 4755 setuid’li, chmod 2775 setgid’li, chmod 1777 sticky bit’li izin verir. /tmp dizininin izni tam olarak budur:
ls -ld /tmp
# drwxrwxrwt 18 root root 4096 /tmp
# ↑ sticky bit: herkes yazabilir, ama kimse başkasının dosyasını silemez
Sonuç
İzin sistemi karmaşık görünür ama üç cümleye iner:
ls -lçıktısının ilk on karakteri her şeyi söyler: tür + sahip/grup/diğerleri için üçer izin. Bu diziyi okuyabiliyorsanızchmod‘a çoğu zaman ihtiyacınız kalmaz.- Dizinlerde harfler farklı anlama gelir. Bir dosyayı silme yetkisi dosyanın izninde değil, bulunduğu dizinin yazma iznindedir — yazamadığınız bir dosyayı silebiliyor olmanızın sebebi budur.
chmod 777sorunu çözmez, taşır. Erişim sorununun doğru çözümü uygun grubu vermek ve gerekiyorsa dizine setgid koymaktır.
Yol haritasının 3. bölümünü — temel komutlar ve dosya işlemlerini — burada tamamladık. Sırada bu izinlerin kime uygulandığı var: Kullanıcı Hesapları ve Yetkileri (sudo, su). Serinin tamamına GNU/Linux Öğrenme Yolculuğu sayfasından ulaşabilirsiniz.


