Linux'ta dosya izinleri: chmod, chown ve sık yapılan hatalar
"Permission denied" Linux'ta en sık görülen hatalardan biridir. Çözüm olarak chmod 777 yazmak işi görür gibi görünür ama ciddi bir güvenlik açığı bırakır. İzin sistemini bir kez anlamak bu hatayı doğru çözmeni sağlar.
İzinleri okumak
$ ls -l
-rw-r--r-- 1 ayse www-data 1204 Kas 10 09:12 config.php
drwxr-x--- 2 ayse www-data 4096 Kas 10 09:12 uploads
İlk karakter türdür (- dosya, d klasör). Sonraki dokuz karakter üç gruba ayrılır:
| Grup | Kim | Örnek |
|---|---|---|
| ilk üçlü | Sahibi (user) | rw- |
| ikinci üçlü | Grup (group) | r-- |
| üçüncü üçlü | Diğer herkes (others) | r-- |
r= okuma (4),w= yazma (2),x= çalıştırma (1)- Sayısal gösterim toplamdır:
rw-= 6,r-x= 5,r--= 4
Klasörlerde x farklı anlama gelir
Bir klasörde x izni, klasörün içine girebilmek ve içindeki dosyalara erişebilmek demektir. Dosyayı okuma iznin olsa bile, yolundaki herhangi bir klasörde x iznin yoksa dosyaya ulaşamazsın. Web sunucusunun bir dosyayı okuyamadığı durumların çoğu buradan çıkar.
Yoldaki bütün klasörlerin izinlerini tek seferde görmek için:
namei -l /var/www/site/public/index.php
chmod ve chown
chmod 640 config.php # sahibi okur/yazar, grup okur, diğerleri hiçbir şey
chmod 750 uploads # sahibi her şey, grup girer/okur
chmod u+x deploy.sh # sadece sahibine çalıştırma izni ekle
chown ayse:www-data config.php
Toplu düzeltme yaparken dosya ve klasörleri ayır:
find /var/www/site -type d -exec chmod 755 {} +
find /var/www/site -type f -exec chmod 644 {} +
Makul varsayılanlar (web sitesi örneği)
- Kod dosyaları:
644, klasörler:755 - Gizli bilgi içeren dosyalar (
.env, anahtarlar):600veya640(sadece sahibi ya da sahibi + web sunucusu grubu) - Uygulamanın yazması gereken klasörler (önbellek, yüklemeler): web sunucusunu çalıştıran kullanıcıya ait olsun,
755veya775
Neden 777 kullanmamalı?
777, sunucudaki her kullanıcının ve her sürecin o dosyayı değiştirebileceği anlamına gelir. Paylaşımlı sunucuda başka bir kullanıcı, ya da sitendeki başka bir uygulamanın açığından giren biri, dosyana kendi kodunu yazabilir. Doğru çözüm genellikle izni açmak değil, sahipliği düzeltmektir: dosya, ona yazması gereken kullanıcıya ait olmalı.
Diğer ipuçları
sudoile oluşturduğun dosyalar root'a ait olur. Sonra normal kullanıcı veya web sunucusu yazamaz.ls -lile sahibine bak.umaskyeni oluşturulan dosyaların varsayılan iznini belirler (022→ dosyalar 644, klasörler 755).- Bir betiği çalıştıramıyorsan:
xizni var mı, ilk satırda#!/bin/bashgibi doğru yorumlayıcı var mı, dosya Windows satır sonlarıyla (\r\n) kaydedilmiş mi? (Sonuncusunda "bad interpreter" hatası alırsın,dos2unixile düzeltilir.)