Linux Dosya İzinleri: chmod 755 Ne Demek?
Linux dosya izinleri nasıl okunur? chmod 755, 644 ve 600 ne demek, umask ve SUID ne işe yarar? Tablolar ve güvenli komut örnekleriyle öğren.
Linux dosya izinleri, her dosya için üç soruyu yanıtlar: kim okuyabilir, kim değiştirebilir, kim çalıştırabilir. Cevap sahip, grup ve diğer herkes için ayrı ayrı tutulur. chmod 755 ne demek sorusunun yanıtı da buradan çıkar: sahip her şeyi yapar, grup ve diğerleri yalnız okur ve çalıştırır. Bu yazıda izinleri okumayı, hesaplamayı ve güvenli biçimde değiştirmeyi öğreneceksin.
Linux dosya izinleri nasıl okunur?
İzinleri görmenin en kısa yolu ls -l komutudur. Çıktının ilk sütunu dosya türünü ve dokuz izin harfini gösterir:
$ ls -l yedekle.sh -rwxr-xr-x 1 ayse gelistirme 1204 Eki 13 09:12 yedekle.sh
Bu satırı soldan sağa şöyle okursun:
- İlk karakter türdür.
-sıradan dosya,ddizin,lsembolik bağlantı demektir. - Sonraki üç harf (
rwx) sahibin iznidir. - Ortadaki üç harf (
r-x) grubun iznidir. - Son üç harf (
r-x) diğer herkesin iznidir. aysedosyanın sahibi,gelistirmegrubudur.
Harflerin anlamı sabittir: r okuma, w yazma, x çalıştırma. Yerinde - varsa o izin yoktur.
| Sınıf | Kimi kapsar | chmod'daki harfi |
|---|---|---|
| Sahip | Dosyanın sahibi olan kullanıcı | u |
| Grup | Dosyanın grubundaki kullanıcılar | g |
| Diğerleri | Sahip ve grup dışındaki herkes | o |
| Hepsi | Üç sınıfın tamamı | a |
Sayısal değeri doğrudan görmek istersen Linux'ta stat -c '%a %A %U:%G %n' yedekle.sh komutu 755 -rwxr-xr-x ayse:gelistirme yedekle.sh gibi bir satır verir. Temel komutların geri kalanını 20 temel Linux komutu yazısında bulabilirsin.
chmod 755 ne demek, sayısal izin nasıl hesaplanır?
Her izin bir bit ile tutulur ve bir değeri vardır: okuma 4, yazma 2, çalıştırma 1. Bir sınıfın rakamı bu değerlerin toplamıdır. Üç rakam sırayla sahip, grup ve diğerlerini gösterir.
- 7 = 4 + 2 + 1, yani okuma, yazma ve çalıştırma
- 6 = 4 + 2, yani okuma ve yazma
- 5 = 4 + 1, yani okuma ve çalıştırma
- 4 = yalnız okuma
- 0 = hiçbir izin yok
755'i bu kuralla çözersen sahip 7 (rwx), grup 5 (r-x), diğerleri 5 (r-x) alır. Sayılar sekizlik tabanda okunur. GNU belgesine göre 0755 ile 755 aynı anlama gelir.
| Değer | Harflerle | Anlamı | Nerede kullanılır |
|---|---|---|---|
| 600 | rw------- | Yalnız sahip okur ve yazar | Gizli anahtar, parola içeren ayar dosyası |
| 644 | rw-r--r-- | Sahip yazar, herkes okur | Sıradan metin ve web dosyası |
| 700 | rwx------ | Yalnız sahip her şeyi yapar | Özel betik, ~/.ssh dizini |
| 750 | rwxr-x--- | Sahip her şeyi yapar, grup okur ve girer | Ekibe açık, dışarıya kapalı dizin |
| 755 | rwxr-xr-x | Sahip her şeyi yapar, herkes okur ve çalıştırır | Program, herkese açık dizin |
| 777 | rwxrwxrwx | Herkes her şeyi yapar | Kullanma |
Dördüncü bir rakam da görebilirsin: 4755 ya da 1777. Baştaki rakam özel bitleri taşır. Aşağıda ayrı bir başlıkta ele alıyoruz.
Dosyada ve dizinde r, w, x aynı şey mi?
Değil. Aynı harf dosyada ve dizinde farklı iş görür. GNU coreutils belgesi farkı şöyle tanımlar:
| İzin | Dosyada | Dizinde |
|---|---|---|
| r | İçeriği okuma | İçindeki adları listeleme |
| w | İçeriği değiştirme | İçinde dosya oluşturma ve silme |
| x | Program olarak çalıştırma | İçindeki dosyalara erişme |
Bu tablonun iki pratik sonucu var. Birincisi, bir dosyayı silmek için dosyanın değil, içinde durduğu dizinin yazma iznine bakılır. Sticky bit yoksa, yazamadığın bir dosyayı yazabildiğin bir dizinde silebilirsin. İkincisi, x izni olmayan bir dizine giremezsin. Adını bilsen bile içindeki dosyayı açamazsın.
Bu yüzden dizinlere genellikle x verilir (755, 750, 700), sıradan dosyalara verilmez (644, 640, 600).
chmod komutu nasıl kullanılır?
chmod iki biçimde yazılır. Sayısal biçim izni baştan sona yeniden atar. Sembolik biçim var olan izne ekleme ya da çıkarma yapar.
chmod 640 rapor.txt # sahip rw, grup r, diğerleri hiçbir şey chmod u+x yedekle.sh # sahibe çalıştırma ekle chmod go-w paylasim.conf # grup ve diğerlerinden yazmayı al chmod a=r,u+w notlar.txt # herkese okuma, sahibe ek olarak yazma
Sembolik biçimde u, g, o, a sınıfı seçer. + izin ekler, - izin alır, = izni tam olarak ayarlar.
Bir dizini ve içindekileri topluca düzeltmen gerekiyorsa chmod -R 755 yazma. Bu komut tüm dosyaları da çalıştırılabilir yapar. Bunun yerine büyük harf X kullan:
chmod -R u=rwX,go=rX proje/
X, çalıştırma iznini yalnız dizinlere ve zaten çalıştırılabilir olan dosyalara verir. Sonuç dizinlerde 755, sıradan dosyalarda 644 olur. -c seçeneği yalnız gerçekten değişen dosyaları ekrana yazar, böylece neye dokunduğunu görürsün.
Yeni dosyalar neden 644 olarak oluşur? umask nedir?
Yeni dosyanın izni chmod ile değil, umask ile belirlenir. umask, yeni dosyalardan hangi izinlerin çıkarılacağını söyleyen maskedir. Linux kılavuzuna göre tipik varsayılan değer 022'dir.
Hesap şöyle işler. Programlar yeni dosyayı genellikle 666, yeni dizini 777 izniyle ister. umask bu istekten kendi bitlerini düşer:
| umask | Yeni dosya | Yeni dizin | Ne zaman uygun |
|---|---|---|---|
| 022 | 644 | 755 | Çoğu masaüstü ve sunucu varsayılanı |
| 027 | 640 | 750 | Diğer kullanıcılara kapalı sunucu |
| 077 | 600 | 700 | Gizli dosya üreten betik ve hizmet |
Kendi umask değerini görmek için terminale umask yazman yeterli. Gizli dosya üreten bir betiğin başına umask 077 eklersen, betik içinde oluşturulan her dosya baştan yalnız sana açık olur. Sonradan chmod ile daraltmaya gerek kalmaz. Bu tür betiklerin örneklerini Bash betik örnekleri yazısında bulabilirsin.
SUID, SGID ve sticky bit neye yarar?
Üç özel bit, izin sayısının başına eklenen dördüncü rakamla ayarlanır. GNU belgesindeki tanımlar şöyle:
| Bit | Değer | ls -l görünümü | Ne yapar |
|---|---|---|---|
| SUID | 4000 | -rwsr-xr-x | Program, çalıştıranın değil dosya sahibinin kimliğiyle çalışır |
| SGID | 2000 | -rwxr-sr-x | Program dosyanın grubuyla çalışır. Dizinde yeni dosyalar dizinin grubunu alır |
| Sticky bit | 1000 | drwxrwxrwt | Herkesin yazabildiği dizinde yalnız dosyanın ya da dizinin sahibi silme yapabilir |
/tmp dizini sticky bit'in klasik örneğidir: 1777. Herkes yazabilir ama kimse başkasının dosyasını silemez.
SUID meşru işler için vardır. Parola değiştiren passwd komutu bunu kullanır. Sorun, sahibi root olan ve olmaması gereken bir dosyada SUID bulunmasıdır. Böyle bir dosya, yerel bir kullanıcıya root yetkisine giden yolu açabilir. Bu yolların nasıl kapatıldığını yetki yükseltme yazısında okuyabilirsin.
Kendi sunucunda SUID envanteri çıkarmak için:
sudo find / -xdev -type f -perm -4000 -exec ls -l {} + 2>/dev/null
Listeyi kaydet ve aradan zaman geçince yeniden al. Yeni bir satır belirdiyse nedenini araştır.
Yanlış izinler hangi güvenlik açıklarını doğurur?
İzin hataları genellikle tek bir alışkanlıktan doğar: bir şey çalışmayınca izni genişletmek. Bu sık görülen durumlar gerçek açıklara dönüşür:
- Herkesin yazabildiği betik: root yetkisiyle zamanlanmış bir betiği başka bir kullanıcı değiştirirse, kendi komutunu root olarak çalıştırır.
- Herkesin okuyabildiği ayar dosyası: İçindeki veritabanı parolası sunucudaki her hesaba açılır.
- 777 web dizini: Ele geçirilen bir eklenti siteye yeni dosya bırakabilir.
- Geniş izinli SSH anahtarı: OpenSSH bu anahtarı kullanmaz. Doğru çözüm 600'dür.
Kendi sisteminde bu hataları bulmak için üç komut yeter. İlki ev dizininde diğer kullanıcıların yazabildiği dosyaları, ikincisi herkesin yazabildiği ama sticky bit taşımayan dizinleri, üçüncüsü SSH dosyalarının iznini gösterir:
find ~ -xdev -type f -perm -0002 sudo find / -xdev -type d -perm -0002 ! -perm -1000 2>/dev/null ls -ld ~/.ssh && ls -l ~/.ssh
Bulduğun her satır için önce nedenini anla. Sonra yalnız gereken sınıfa gereken izni bırak. Değişiklikten önce ve sonra ls -l ile izni oku. Toplu komutları önce küçük bir test dizininde dene, sistem dizinlerinde -R ile çalışma. Bu alıştırmaları kendi kurduğun bir sanal makinede yapmak en güvenlisidir. Kurulum için sanal siber güvenlik laboratuvarı rehberine bak.
Komutların kısa özetini Linux temel komutlar kopya kâğıdında tek sayfada görebilirsin. Bir API sunucusunda herkese yazılabilir bir ayar dosyasını bulup umask'ı düzelttiğin senaryo ise saha görevleri arasında.
Kaynaklar
Sık sorulan sorular
chmod 777 neden tehlikeli?
777, sahibe, gruba ve diğer herkese okuma, yazma ve çalıştırma izni verir. Sistemdeki her hesap ve her süreç dosyayı değiştirebilir. Ele geçirilen bir web uygulaması bile o dosyaya zararlı kod yazabilir. Bir şey çalışmadığında 777 yazmak yerine dosyanın sahibine bak ve yalnız ihtiyacı olan sınıfa gereken izni ver.
chmod 644 ile chmod 600 arasındaki fark nedir?
644'te sahip okur ve yazar, grup ve diğer kullanıcılar yalnız okur. 600'de ise yalnız sahip okur ve yazar, başka hiç kimse dosyayı açamaz. Herkesin görmesinde sakınca olmayan metin ve web dosyaları için 644 uygundur. Parola, API anahtarı ve SSH özel anahtarı gibi gizli dosyalar için 600 kullan.
chmod ile chown arasındaki fark nedir?
chmod izinleri, yani sahibin, grubun ve diğerlerinin ne yapabileceğini değiştirir. chown ise dosyanın sahibini ve grubunu değiştirir. İkisi birlikte çalışır. Dosya yanlış hesaba aitse en dar izin bile işe yaramaz, çünkü yanlış kişi sahip haklarını kullanır. Önce sahipliği, sonra izni kontrol et.
Klasörde çalıştırma (x) izni ne işe yarar?
Dizinde x izni, içindeki dosyalara erişme iznidir. r izniyle yalnız içeriği listelersin. w izniyle dosya oluşturur ve silersin. x olmadan, adını bilsen bile içerideki dosyayı açamazsın. Bu yüzden dizinler genellikle 755 ya da 700 olur, sıradan dosyalar ise 644 ya da 600 olur.
SSH özel anahtarı için hangi izin gerekir?
Özel anahtar dosyasını yalnız sahibi okuyabilmeli, başka hiç kimsenin izni olmamalı. Bunun için chmod 600 kullan, ~/.ssh dizinini de 700 yap. OpenSSH belgelerine göre ssh, başkalarının erişebildiği bir özel anahtar dosyasını kullanmaz ve yok sayar. Bağlantı bu yüzden reddedilirse sorunu izni daraltarak çöz, genişleterek değil.
- Linux
- chmod
- dosya izinleri
- umask
- SUID