Linux Dosya İzinleri ve Sahipliği
Bir sunucuya ilk kez bağlandığımda beni en çok zorlayan şey servis kurmak değildi; "Permission denied" hatasıydı. Web sunucusu dosyayı okuyamıyordu, yazdığım script çalışmıyordu, SSH anahtarımı kabul etmiyordu. Sonunda oturup izin sistemini baştan öğrendim ve o günden beri sunucu tarafındaki sorunların yarısını tek bakışta çözüyorum. Aşağıda kendi kendime öğretir gibi, sırayla anlatıyorum.
İzinleri Okumayı Öğrenmek
Her şey ls -l çıktısını doğru okumaktan başlıyor. Bir dizinde bu komutu çalıştırdığımda şuna benzer satırlar görüyorum:
-rw-r--r-- 1 ahmet developers 1240 index.html
Baştaki on karakteri parça parça çözüyorum:
- İlk karakter: dosya tipi. - normal dosya, d dizin, l sembolik bağlantı.
- Sonraki 3: sahibin izinleri (rw-)
- Ortadaki 3: grubun izinleri (r--)
- Son 3: herkesin, yani "diğerleri"nin izinleri (r--)
Ardından gelen ahmet sahibi, developers ise grubu gösteriyor. Yani bu dosyayı ahmet okuyup yazabilir, developers grubundaki kullanıcılar ve diğer herkes sadece okuyabilir.
Adım Adım Uygulama
-
Sayısal karşılıkları ezberle. chmod chown linux işlerinde en çok kullanılan gösterim sayısal olan. Mantığı çok basit: okuma 4, yazma 2, çalıştırma 1. Bunları topluyorsun.
Sayı İzin Anlamı 7 rwx oku, yaz, çalıştır 6 rw- oku, yaz 5 r-x oku, çalıştır 4 r-- sadece oku 0 --- hiçbir izin yok Üç haneli yazarken sıra hep aynı: sahip, grup, diğerleri. chmod 644 index.html dediğimde sahibe okuma-yazma, kalanlara sadece okuma vermiş oluyorum.
-
Sembolik yazımı da öğren, çünkü daha güvenli. Sayısal yazım mevcut izinleri tamamen ezer. Ben sadece bir izin eklemek istediğimde harflerle çalışıyorum:
- chmod +x deploy.sh → çalıştırma izni ekler
- chmod g+w rapor.txt → gruba yazma izni ekler
- chmod o-r gizli.conf → diğerlerinden okuma iznini alır
- chmod u=rw,go= anahtar.key → sahibe oku-yaz, kalanlara hiçbir şey
Burada u user, g group, o others, a ise hepsi anlamına geliyor.
-
Dizinlerde "x" izninin ne demek olduğunu kavra. Bu beni uzun süre yanılttı. Dizinde çalıştırma izni, "içine girebilme" demek. Bir dizinde r varsa içindekilerin listesini görebilirim ama x yoksa o dosyalara erişemem. Bu yüzden dizinler genelde 755, normal dosyalar 644 olur.
-
Sahipliği chown ile değiştir. İzin ayarlamak bazen yetmez; dosyanın doğru kullanıcıya ait olması gerekir. Söz dizimi chown kullanıcı:grup dosya şeklinde:
- sudo chown ahmet rapor.txt → sadece sahibi değiştirir
- sudo chown ahmet:developers rapor.txt → sahip ve grubu birlikte
- sudo chgrp developers rapor.txt → sadece grubu değiştirir
Sahiplik değiştirmek için neredeyse her zaman root yetkisi, yani sudo gerekir.
-
Özyinelemeli işlemleri dikkatli kullan. -R parametresi bir dizinin altındaki her şeye aynı işlemi uygular. Bir web dizininin sahipliğini toptan düzeltmek için kullandığım kalıp şu: sudo chown -R www-data:www-data /var/www/site. Ama izinlerde chmod -R 755 demek dosyaları da çalıştırılabilir yapar. Onun yerine ayırıyorum:
- Dizinler için: find /var/www/site -type d -exec chmod 755 {} +
- Dosyalar için: find /var/www/site -type f -exec chmod 644 {} +
-
Hassas dosyalarda katı ol. SSH ile uzaktan bağlantı kurarken özel anahtarın izni gevşekse sunucu bağlantıyı reddeder. Kural olarak ~/.ssh dizini 700, özel anahtar 600, authorized_keys 600 olmalı. Aynı mantık veritabanı şifresi taşıyan yapılandırma dosyaları için de geçerli: 600 ver, kimse okumasın.
-
Özel bitleri tanı. Nadiren gerekir ama gördüğünde şaşırmamak lazım. chmod +t /paylasim ile eklenen sticky bit, ortak dizinde herkesin sadece kendi dosyasını silmesini sağlar (/tmp böyle çalışır). SetUID biti ise programın sahibi yetkisiyle çalışmasına izin verir; kendi scriptlerinde kullanmaktan uzak dur.
-
Yeni dosyaların varsayılanını umask belirler. Terminalde umask yazınca genelde 0022 görürüm; bu yüzden oluşturduğum dosyalar 644, dizinler 755 olarak doğar. Varsayılanı değiştirmek istiyorsan bu değeri kabuk yapılandırmana yazabilirsin.
Sık Yapılan Hatalar
- 777 vermek. "Çalışsın yeter" diye herkese tam yetki vermek, sor
© 2026 Ağ ve Bulut