Ubuntu Sunucuda Dosya İzinlerini Doğru Yapılandırma Rehberi: Güvenlik ve Erişim Dengesi 
Selam sistemciler!
Bugün, belki de en çok gözden kaçan ama bir o kadar da kritik bir konuya terminalimizi çeviriyoruz: Dosya ve Dizin İzinleri (File Permissions). Bir web sunucusu kurduk, her şey harika çalışıyor derken, "403 Forbidden" hatasıyla karşılaşmak ya da daha kötüsü, yanlış izinler yüzünden sunucunun ele geçirilmesi riski... İşte tüm bunların temelinde genellikle bu konu yatıyor. Gelin, bu karmaşık gibi görünen ama aslında mantığı basit olan dünyayı birlikte keşfedelim ve sunucunuzdaki güvenlik ve işlevselliğin temel taşını sağlamlaştıralım.
Neden İzinler Bu Kadar Önemli?
Linux'taki her dosya ve dizin, üç temel izin kategorisine sahiptir:

İzinleri Okumak: Sayısal ve Sembolik Gösterim
Terminalde `ls -l` komutunu çalıştırdığınızda şöyle bir çıktı görürsünüz:
İlk 10 karakter izinleri gösterir. İlk karakter dosya tipidir (`-` dosya, `d` dizin). Sonraki 9 karakter, 3'erli gruplar halinde Owner|Group|Others izinleridir.
Örnekte `index.php` için: `rwx` (sahibi okur, yazar, çalıştırır), `r-x` (grubu okur, çalıştırır, yazamaz), `r--` (diğerleri sadece okur).
Bu sembolik gösterimi sayısal (octal) değere çevirmek de çok yaygındır:
Temel Araçlar: chmod ve chown
İzinleri değiştirmek için chmod (change mode), sahipliği değiştirmek için chown (change owner) kullanırız.
1. chmod ile Sembolik Kullanım:
2. chmod ile Sayısal (Octal) Kullanım (Daha Yaygın):
3. chown ile Sahiplik Değiştirme:
`-R` parametresi dizin içindeki tüm dosya ve alt dizinlere recursive olarak uygular. Dikkatli kullanın! 
Pratik Senaryolar ve En İyi Uygulamalar
İleri Seviye: ACL (Access Control List) ile Detaylı Kontrol
Bazen geleneksel owner/group/others modeli yeterli olmaz. Örneğin, bir dosyaya iki farklı grubun farklı izinlerle erişmesini istiyorsanız, ACL (Erişim Kontrol Listesi) devreye girer.
1. Önce ACL desteğini kurun:
2. Temel ACL Komutları:
Umask: Varsayılan İzinleri Belirlemek
Yeni oluşturulan dosya ve dizinlerin izinleri, `umask` değeri tarafından belirlenir. Bu değer, "izinlerden çıkarılacak" maskeyi ifade eder. Sistem geneli `/etc/profile` veya `/etc/bash.bashrc` dosyalarında, kullanıcı bazında ise `~/.bashrc` dosyasında ayarlanır.
Son Kontrol ve Audit
İzinlerle işiniz bittiğinde, özellikle web dizinlerinde, SUID (Set User ID) gibi özel izin bayrakları olup olmadığını kontrol etmek iyi olur. Bu bayraklar, bir programın, çalıştıran kullanıcının değil, dosya sahibinin haklarıyla çalışmasını sağlar ve potansiyel bir güvenlik riskidir.
Listede `passwd`, `sudo` gibi beklenen sistem araçları dışında şüpheli bir şeyler görürseniz araştırın! 
**Özetle:** Doğru izinler, sunucunuzun sessiz bekçileridir. Ne çok sıkı ne de çok gevşek olmalılar. Web sunucunuzun çalışmasına izin verirken, gereksiz erişim kapılarını da kapalı tutmalılar.
Peki ya siz? Sunucularınızda dosya izinlerini düzenli olarak kontrol etmek için favori bir script'iniz veya yönteminiz var mı? Yoksa "bir kere ayarladım, unuttum" mu diyorsunuz? Yorumlarda deneyimlerinizi paylaşın, hep birlikte öğrenelim!
Selam sistemciler!
Neden İzinler Bu Kadar Önemli?
Linux'taki her dosya ve dizin, üç temel izin kategorisine sahiptir:
- Sahip (Owner): Dosyayı oluşturan veya sahipliğini alan kullanıcı.
- Grup (Group): Dosyanın ait olduğu kullanıcı grubu.
- Diğerleri (Others): Sistemdeki diğer tüm kullanıcılar.
- Okuma (r - read): Dosyanın içeriğini görüntüleme veya dizinin içeriğini listeleme hakkı.
- Yazma (w - write): Dosyayı değiştirme veya dizine yeni dosya ekleme/silme hakkı.
- Çalıştırma (x - execute): Dosyayı bir program olarak çalıştırma veya dizine "girme" (cd) hakkı.
İzinleri Okumak: Sayısal ve Sembolik Gösterim
Terminalde `ls -l` komutunu çalıştırdığınızda şöyle bir çıktı görürsünüz:
Bash:
-rwxr-xr-- 1 www-data www-data 2048 May 10 14:30 index.php
drwxr-x--- 2 sshuser developers 4096 May 10 14:25 projeler/
İlk 10 karakter izinleri gösterir. İlk karakter dosya tipidir (`-` dosya, `d` dizin). Sonraki 9 karakter, 3'erli gruplar halinde Owner|Group|Others izinleridir.
Örnekte `index.php` için: `rwx` (sahibi okur, yazar, çalıştırır), `r-x` (grubu okur, çalıştırır, yazamaz), `r--` (diğerleri sadece okur).
Bu sembolik gösterimi sayısal (octal) değere çevirmek de çok yaygındır:
- r (read) = 4
- w (write) = 2
- x (execute) = 1
- Sahip: rwx = 4+2+1 = 7
- Grup: r-x = 4+0+1 = 5
- Diğer: r-- = 4+0+0 = 4
Temel Araçlar: chmod ve chown
İzinleri değiştirmek için chmod (change mode), sahipliği değiştirmek için chown (change owner) kullanırız.
1. chmod ile Sembolik Kullanım:
Bash:
# Sahibe yazma izni ekle, gruptan çalıştırma iznini kaldır.
chmod u+w,g-x dosyaadi
# Herkes (others) için tüm izinleri kaldır.
chmod o-rwx dosyaadi
# Sahip için rwx, grup ve diğerler için r-x yap.
chmod u=rwx,go=rx script.sh
2. chmod ile Sayısal (Octal) Kullanım (Daha Yaygın):
Bash:
# Klasik web dizini izni: 755 (rwxr-xr-x)
chmod 755 /var/www/html/sitem
# Hassas konfigürasyon dosyası: 640 (rw-r-----) - Sahibi okur/yazar, grubu sadece okur, diğerleri hiçbir şey yapamaz.
chmod 640 /etc/bir-ayar.conf
# Özel bir script: 700 (rwx------) - Sadece sahibi erişebilir.
chmod 700 ~/.ozel-script.sh
3. chown ile Sahiplik Değiştirme:
Bash:
# Bir dosyanın sahibini ve grubunu değiştir.
chown kullanici:grup dosyaadi
# Web dizinini genelde Nginx/Apache'nin çalıştığı kullanıcıya (www-data) veririz.
sudo chown -R www-data:www-data /var/www/html/
# Sadece grubu değiştirmek için.
chown :developers proje_dizini/
Pratik Senaryolar ve En İyi Uygulamalar
- Web Dizinleri (Nginx/Apache): Web sunucusu dosyaları okuyabilmeli, ancak gereksiz yere yazmamalı (güvenlik!). Genel kural:
* Dizinler: 755 (rwxr-xr-x)
* Dosyalar (HTML, CSS, JS, resimler): 644 (rw-r--r--)
* Neden? Sunucu prosesi (www-data) genellikle "others" kategorisindedir. `r` izni ile içeriği servis eder. Upload dizini gibi yazma gereken yerler 755 (dizin) ve 664 (dosya) olabilir, ancak mümkünse daha kısıtlayıcı tutulmalıdır. - Kullanıcı Dizinleri (~/): Ev dizininiz genelde 700 (drwx------) olmalı ki başka kullanıcılar erişemesin.
- SSH Anahtarları (~/.ssh/): Kritik öneme sahiptir!
Bash:chmod 700 ~/.ssh chmod 600 ~/.ssh/id_rsa # Özel anahtar ÇOK GİZLİ! chmod 644 ~/.ssh/id_rsa.pub # Genel anahtar okunabilir. chmod 644 ~/.ssh/authorized_keys - Sistem Konfigürasyon Dosyaları (/etc/): Çoğu root'a aittir ve diğer kullanıcıların yazma izni yoktur (ör. 644 veya 640).
- Script'ler ve Programlar: Çalıştırılabilir olmaları için `x` izni gerekir. Kullanıcı script'i: 700, herkesin kullanabileceği bir script: 755.
İleri Seviye: ACL (Access Control List) ile Detaylı Kontrol
Bazen geleneksel owner/group/others modeli yeterli olmaz. Örneğin, bir dosyaya iki farklı grubun farklı izinlerle erişmesini istiyorsanız, ACL (Erişim Kontrol Listesi) devreye girer.
1. Önce ACL desteğini kurun:
Bash:
sudo apt install acl
2. Temel ACL Komutları:
Bash:
# Bir dosya/dizinin ACL'ini görüntüle.
getfacl /var/www/ozel-proje/
# Belirli bir kullanıcıya izin ekle.
setfacl -m u:ahmet:rwx /var/www/ozel-proje/
# Belirli bir gruba izin ekle.
setfacl -m g:developerlar:rx /var/www/ozel-proje/
# Varsayılan ACL'yi bir dizine ayarla (yeni oluşturulan dosyalar bu ACL'yi miras alır).
setfacl -m d:g:stajerler:r-x /var/www/ozel-proje/
# Tüm ACL kurallarını kaldır.
setfacl -b /var/www/ozel-proje/
Umask: Varsayılan İzinleri Belirlemek
Yeni oluşturulan dosya ve dizinlerin izinleri, `umask` değeri tarafından belirlenir. Bu değer, "izinlerden çıkarılacak" maskeyi ifade eder. Sistem geneli `/etc/profile` veya `/etc/bash.bashrc` dosyalarında, kullanıcı bazında ise `~/.bashrc` dosyasında ayarlanır.
Bash:
# Mevcut umask değerini görüntüle
umask
# Örnek: Varsayılan umask 022'dir.
# Dizin için maksimum izin: 777 - 022 = 755 (rwxr-xr-x)
# Dosya için maksimum izin: 666 - 022 = 644 (rw-r--r--)
# Daha güvenli bir umask: 027 (grup yazamaz, others hiçbir şey yapamaz)
umask 027
Son Kontrol ve Audit
İzinlerle işiniz bittiğinde, özellikle web dizinlerinde, SUID (Set User ID) gibi özel izin bayrakları olup olmadığını kontrol etmek iyi olur. Bu bayraklar, bir programın, çalıştıran kullanıcının değil, dosya sahibinin haklarıyla çalışmasını sağlar ve potansiyel bir güvenlik riskidir.
Bash:
# Sistemde SUID/SGID bayraklı dosyaları bulmak (root olarak çalıştırın)
sudo find / -type f \( -perm -4000 -o -perm -2000 \) -ls 2>/dev/null
**Özetle:** Doğru izinler, sunucunuzun sessiz bekçileridir. Ne çok sıkı ne de çok gevşek olmalılar. Web sunucunuzun çalışmasına izin verirken, gereksiz erişim kapılarını da kapalı tutmalılar.
Peki ya siz? Sunucularınızda dosya izinlerini düzenli olarak kontrol etmek için favori bir script'iniz veya yönteminiz var mı? Yoksa "bir kere ayarladım, unuttum" mu diyorsunuz? Yorumlarda deneyimlerinizi paylaşın, hep birlikte öğrenelim!