Linux tabanlı sistemlerde çok kullanıcılı (multi-user) mimarinin en temel direği Linux dosya izinleri ve dosya sahipliği mekanizmasıdır. İster bir web sunucusu barındırın, ister gömülü Linux üzerinde arka plan servisleri çalıştırın; hatalı yapılandırılmış izinler sisteminizi güvenlik açıklarına karşı savunmasız bırakabilir veya servislerin çalışmasını durdurabilir.
Bu rehberde; Linux izin mantığını (oktal ve sembolik gösterim), chmod ve chown komutlarının pratik kullanımını, özel yetkilendirme bayraklarını (SUID, SGID, Sticky Bit) ve umask değerlerini derinlemesine inceleyeceğiz.
Linux İzin Yapısının Anatomisi
Bir dizinde ls -l komutunu çalıştırdığınızda dosya ve dizinlerin başında 10 karakterlik bir izin dizesi görürsünüz:
ls -l /var/www/html/index.php
-rwxr-xr-- 1 www-data www-data 4096 Oct 12 12:00 index.php
Bu dizeyi 4 temel bloğa ayırabiliriz:
| Blok | Karakterler | Anlamı |
|---|---|---|
| Dosya Tipi | - | Standart dosya (d: dizin, l: sembolik link, c: karakter aygıtı) |
| Kullanıcı (Owner / u) | rwx | Dosya sahibinin izinleri (Okuma, Yazma, Çalıştırma) |
| Grup (Group / g) | r-x | Dosyanın ait olduğu grubun izinleri (Okuma, Çalıştırma) |
| Diğerleri (Others / o) | r-- | Sistemdeki diğer tüm kullanıcıların izinleri (Yalnızca Okuma) |
Temel İzinlerin Anlamı
- Okuma (r – Read): Dosyalarda içeriği okuma (
cat,less), dizinlerde iselsile dosya listesini görebilme iznidir. - Yazma (w – Write): Dosyalarda içeriği değiştirme veya silme, dizinlerde ise içine yeni dosya oluşturma veya dosya silme hakkıdır.
- Çalıştırma (x – Execute): Dosyalarda betik veya ikili (binary) programı çalıştırma, dizinlerde ise
cdile dizinin içine girebilme iznidir.
Sayısal (Oktal) Notasyon Mantığı
Linux izinleri ikili (binary) tabanda 3 bitlik sayılarla ifade edilir:
| İzin | Sembol | İkili Değer | Sayısal Değer |
|---|---|---|---|
| Okuma (Read) | r | 100 | 4 |
| Yazma (Write) | w | 010 | 2 |
| Çalıştırma (Execute) | x | 001 | 1 |
| İzin Yok | - | 000 | 0 |
Bu değerlerin kombinasyonu izin grubunu oluşturur:
rwx= 4 + 2 + 1 = 7 (Tam Yetki)rw-= 4 + 2 + 0 = 6 (Okuma ve Yazma)r-x= 4 + 0 + 1 = 5 (Okuma ve Çalıştırma)r--= 4 + 0 + 0 = 4 (Salt Okunur)
Örneğin standart bir betik için 755 izni: Sahip=7 (rwx), Grup=5 (r-x), Diğerleri=5 (r-x) anlamına gelir.
chmod ile İzinleri Değiştirmek
chmod (change mode) komutu dosya ve dizinlerin erişim modunu değiştirmek için kullanılır.
1. Sayısal (Oktal) Yöntem
En yaygın ve hızlı yöntemdir:
# Betiğe çalıştırma izni ver (Sahip: rwx, Grup: r-x, Diğerleri: r-x)
chmod 755 deploy.sh
# Hassas yapılandırma dosyasını sadece sahibine aç (Sahip: rw-, Grup: yok, Diğer: yok)
chmod 600 ~/.ssh/id_ed25519
# Bir dizin ağacındaki TÜM dosya ve klasörleri özyinelemeli (recursive) değiştir
chmod -R 750 /opt/myproject
2. Sembolik Yöntem
Mevcut izinleri sıfırlamadan sadece belirli bir izni eklemek (+) veya kaldırmak (-) istediğinizde sembolik yöntem idealdir:
# Herkese çalıştırma izni ekle
chmod +x script.py
# Gruba yazma izni ekle
chmod g+w shared_folder/
# Diğer kullanıcıların (others) okuma iznini kaldır
chmod o-r database.env
# Kullanıcıya tam yetki ver, gruba ve diğerlerine sadece okuma ver
chmod u=rwx,g=r,o=r document.txt
chown ile Dosya ve Dizin Sahipliğini Değiştirmek
chown (change owner) komutu bir dosya veya dizinin sahibini ve grubunu değiştirmek için kullanılır. Genellikle sudo yetkisi gerektirir.
# Yalnızca dosya sahibini değiştir
sudo chown hakan app.log
# Hem sahibi hem grubu aynı anda değiştir (kullanici:grup)
sudo chown -R www-data:www-data /var/www/html/
# Sadece grubu değiştirmek (chgrp alternatifi)
sudo chown :developers project_source/
Önemli İpucu: find rehberimiz içinde gördüğümüz gibi, web projelerinde klasör izinlerini
755, dosya izinlerini ise644yapmak standarttır. Bunu tek seferde yapmak için:
“bash<br>find /var/www/html -type d -exec chmod 755 {} +<br>find /var/www/html -type f -exec chmod 644 {} +<br>“
İleri Düzey İzinler: SUID, SGID ve Sticky Bit
Standart izinlerin yetersiz kaldığı özel senaryolarda 4. oktal hane devreye girer.
1. SUID (Set User ID – Değer: 4)
Dosya çalıştırıldığında, onu çalıştıran kullanıcının değil, dosyanın sahibinin yetkileriyle çalışmasını sağlar. En bilinen örneği /usr/bin/passwd komutudur (normal kullanıcılar kendi şifrelerini değiştirirken root yetkisiyle /etc/shadow dosyasına yazar).
# SUID atama (Kullanıcı izinlerinde 's' görünür: -rwsr-xr-x)
sudo chmod 4755 /usr/local/bin/custom_tool
# veya
sudo chmod u+s /usr/local/bin/custom_tool
2. SGID (Set Group ID – Değer: 2)
Dizinler üzerinde uygulandığında, o dizin altında oluşturulan her yeni dosya, oluşturanın varsayılan grubu yerine dizinin grubunu miras alır. Ortak ekip çalışmalarında dosya paylaşımı için vazgeçilmezdir.
# SGID atama (Grup izinlerinde 's' görünür: drwxrwsr-x)
sudo chmod 2775 /shared/team_folder
# veya
sudo chmod g+s /shared/team_folder
3. Sticky Bit (Değer: 1)
Genellikle ortak yazılabilir dizinlerde (/tmp gibi) kullanılır. Bir dizinde Sticky Bit aktifse, kullanıcılar dizin içine dosya yazabilir ancak yalnızca kendi oluşturdukları dosyaları silebilirler. Başkalarının dosyalarını silemezler.
# Sticky Bit atama (Diğerleri izinlerinde 't' görünür: drwxrwxrwt)
sudo chmod 1777 /tmp/shared_scratch
# veya
sudo chmod +t /tmp/shared_scratch
umask Değeri Nedir?
Bir kullanıcı yeni bir dosya veya dizin oluşturduğunda, varsayılan olarak hangi izinlerle oluşturulacağını umask (user mask) belirler. Sistem varsayılanı genelde dizinler için 777, dosyalar için 666 baz alınarak umask değerinin çıkarılmasıyla hesaplanır:
umask
0022
- Dizin varsayılanı:
777 - 022 = 755(drwxr-xr-x) - Dosya varsayılanı:
666 - 022 = 644(-rw-r--r--)
Umask değerini ~/.bashrc veya /etc/profile içinde umask 027 şeklinde tanımlayarak yeni oluşturulan dosyaların diğer kullanıcılara tamamen kapatılmasını sağlayabilirsiniz.
Güvenlik En İyi Pratikleri (Best Practices)
- 777 İzninden Kaçının:
chmod -R 777komutu hiçbir zaman sorun çözme yöntemi olarak kullanılmamalıdır. Herkesin yazabileceği dosyalar sisteme zararlı kod enjekte edilmesine yol açar. - SSH Anahtarlarını Koruyun: Özel SSH anahtarları (
~/.ssh/id_*)600,.sshdizini ise700izinlerine sahip olmalıdır. Aksi halde OpenSSH istemcisi güvenlik uyarısı vererek anahtarı reddeder. - Web Sunucusu Sahipliği: Apache veya Nginx doküman kök dizininde (
/var/www/html) dosyaların sahibirootveya dağıtım kullanıcısı olmalı, web sunucusu servisi (www-data) yalnızca yükleme (uploads/cache) dizinlerine yazabilmelidir.
Özet
Linux sistem yöneticiliğinin temeli doğru yetkilendirmeden geçer. chmod ile oktal ve sembolik izinleri yönetebilir, chown ile mülkiyeti düzenleyebilir, SGID ve Sticky Bit gibi gelişmiş araçlarla paylaşımlı güvenli ortamlar oluşturabilirsiniz. Sistem güvenliğini pekiştirmek için izin denetimlerini düzenli otomasyonlara bağlamak en sağlıklı yaklaşımdır.