chmod Komutu: Linux’ta Dosya İzinleri Ayarlama Komple Rehber

Linux’ta dosya güvenliğinin temel taşı izin sistemidir ve bu sistemi anlamadan ciddi bir sistem yöneticisi olamazsın. Yanlış yapılandırılmış bir izin, ya kritik bir servisi çalışmaz hale getirir ya da sistemi güvenlik açıklarına karşı savunmasız bırakır. chmod komutu da tam bu noktada devreye giriyor: dosya ve dizin izinlerini kontrol altında tutmanın en doğrudan yolu.

Linux İzin Sistemi Nasıl Çalışır?

Bir dosyanın izinlerine bakmadan önce Linux’un izin modelini kavramak gerekiyor. Her dosya veya dizin için üç farklı kullanıcı kategorisi vardır:

  • owner (sahip): Dosyayı oluşturan kullanıcı
  • group (grup): Dosyanın ait olduğu grup üyeleri
  • others (diğerleri): Geri kalan herkes

Bu kategorilerin her biri için üç temel izin tanımlanır:

  • r (read): Okuma izni, sayısal değeri 4
  • w (write): Yazma izni, sayısal değeri 2
  • x (execute): Çalıştırma izni, sayısal değeri 1

ls -l komutunu çalıştırdığında şöyle bir çıktı görürsün:

ls -l /var/www/html/index.php
-rwxr-xr-- 1 www-data developers 4096 Jan 15 10:30 index.php

Buradaki -rwxr-xr-- ifadesini parçalara ayıralım:

  • İlk karakter (-): Dosya türü. - normal dosya, d dizin, l sembolik link
  • rwx: Sahip (owner) izinleri, okuma + yazma + çalıştırma
  • r-x: Grup izinleri, okuma + çalıştırma (yazma yok)
  • r--: Diğerleri için izinler, sadece okuma

chmod Komutunun Söz Dizimi

chmod komutu iki farklı modda kullanılabilir: sembolik mod ve oktal (sayısal) mod. İkisini de bilmek gerekiyor çünkü farklı senaryolarda biri diğerinden daha pratik oluyor.

Temel Söz Dizimi

chmod [seçenekler] mod dosya/dizin

Başlıca parametreler:

  • -R: Dizinleri ve içeriklerini özyinelemeli olarak işler
  • -v: Yapılan her değişikliği ekrana yazdırır (verbose)
  • -c: Sadece gerçekten değişen izinleri rapor eder
  • –reference=dosya: Belirtilen dosyanın izinlerini kopyalar

Oktal (Sayısal) Mod ile Kullanım

Oktal mod, izinleri sayılarla ifade ettiğin için hızlı ve kesin sonuç verir. Özellikle script yazmada tercih edilir çünkü mevcut izinden bağımsız olarak tam olarak ne istediğini belirtirsin.

Hesaplama mantığı basit: Her izin kategorisi için r=4, w=2, x=1 değerlerini topla.

  • rwx = 4+2+1 = 7
  • rw- = 4+2+0 = 6
  • r-x = 4+0+1 = 5
  • r-- = 4+0+0 = 4
  • --- = 0+0+0 = 0

Sık Kullanılan Oktal Değerler

# Web sunucusu PHP dosyaları için klasik ayar
chmod 644 /var/www/html/config.php

# Çalıştırılabilir script dosyası
chmod 755 /usr/local/bin/backup.sh

# Sadece sahibi okuyup yazabilsin, kimse başkası erişemesin
chmod 600 ~/.ssh/id_rsa

# SSH authorized_keys dosyası
chmod 644 ~/.ssh/authorized_keys

# SSH dizininin kendisi
chmod 700 ~/.ssh

chmod 755 çok yaygın kullanılır. Sahip her şeyi yapabilir (7=rwx), grup ve diğerleri okuyup çalıştırabilir ama yazamaz (5=r-x). Web sunucusu dizinleri için ideal.

Sembolik Mod ile Kullanım

Sembolik mod, mevcut izinlerin üzerine ekleme veya çıkarma yapmak istediğinde daha okunaklı bir alternatif sunar.

Syntax şöyle çalışır: [kim][operatör][izin]

Kim kısmı:

  • u: user (sahip)
  • g: group (grup)
  • o: others (diğerleri)
  • a: all (hepsi)

Operatörler:

  • +: İzin ekle
  • : İzni kaldır
  • =: İzni tam olarak belirle
# Sahibine çalıştırma izni ekle
chmod u+x deploy.sh

# Grubun yazma iznini kaldır
chmod g-w /etc/nginx/nginx.conf

# Diğerlerinden tüm izinleri al
chmod o-rwx /home/user/private/

# Herkes için sadece okuma iznini ayarla
chmod a=r readme.txt

# Sahibe rwx, gruba rx, diğerlerine hiçbir şey (bir satırda)
chmod u=rwx,g=rx,o= /opt/myapp/bin/app

Sembolik modun gerçek gücü şu senaryoda ortaya çıkıyor: Diyelim ki bir dosyanın diğer tüm izinlerine dokunmadan sadece execute bitini kaldırmak istiyorsun. Oktal modda önce mevcut izni bilmen gerekir, sembolik modda ise:

chmod a-x tehlikeli_script.sh

Tamam, bu kadar basit.

Özyinelemeli Kullanım: -R Parametresi

Dizin yapılarında çalışırken -R parametresi hayat kurtarır. Ama dikkatli kullanmak gerekiyor.

# Tüm web dizinine 755 ver (YANLIŞ yaklaşım - dosyalara da 755 verir)
chmod -R 755 /var/www/html/

# Daha doğrusu: dizinlere 755, dosyalara 644 ver
find /var/www/html/ -type d -exec chmod 755 {} ;
find /var/www/html/ -type f -exec chmod 644 {} ;

Bu iki find komutu kombinasyonu çok önemli. Dosyalara execute verme alışkanlığı güvenlik açığı doğurur. Bir PHP veya HTML dosyasının çalıştırılabilir olmasına gerek yok.

WordPress Projesi için Gerçek Dünya Örneği

WordPress kurulumu yapan birçok sysadmin izin sorunuyla boğuşur. İşte doğru yaklaşım:

# WordPress dizinine git
cd /var/www/html/wordpress

# Sahip olarak www-data kullanıcısını ata
chown -R www-data:www-data .

# Dizinlere 755
find . -type d -exec chmod 755 {} ;

# Dosyalara 644
find . -type f -exec chmod 644 {} ;

# wp-config.php daha kısıtlı olmalı
chmod 600 wp-config.php

# Uploads dizini yazılabilir olmalı (plugin yüklemeleri için)
chmod -R 775 wp-content/uploads/

Bu yapı hem güvenli hem de WordPress’in düzgün çalışması için gerekli olan her şeyi karşılıyor.

Özel İzin Bitleri: SUID, SGID ve Sticky Bit

Bunlar genellikle atlanır ama bir sistem yöneticisi olarak mutlaka bilmen gereken konular.

SUID (Set User ID) – 4000

SUID biti olan bir çalıştırılabilir dosya, çalıştıran kullanıcının değil dosya sahibinin yetkileriyle çalışır. passwd komutu bunun klasik örneğidir:

ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 59640 Mar 22  2022 /usr/bin/passwd

s harfine dikkat et, execute pozisyonunda x yerine s var. Bu SUID aktif demek.

# SUID bitini ayarla (oktal: 4 ön eke)
chmod 4755 /usr/local/bin/ozel_program

# Sembolik modda
chmod u+s /usr/local/bin/ozel_program

Uyarı: SUID bitini gelişigüzel kullanma. Root sahibi bir SUID dosyası yanlış yazılmışsa ciddi güvenlik açığı doğurur. Sistemindeki SUID dosyalarını periyodik olarak denetle:

find / -perm -4000 -type f 2>/dev/null

SGID (Set Group ID) – 2000

Dosyalarda SUID gibi çalışır ama grup için. Dizinlerde ise farklı bir işlev üstlenir: o dizinde oluşturulan tüm yeni dosyalar, dizinin grubunu miras alır.

# Paylaşım dizini için SGID
chmod 2775 /srv/shared-project/

# Sembolik modla
chmod g+s /srv/shared-project/

Bu özellik ekip çalışması ortamlarında çok faydalı. Farklı kullanıcılar dosya oluştursa bile hepsi aynı grup altında toplanır, dosya paylaşımı sorunsuz işler.

# Gerçek senaryo: Geliştirici ekibi paylaşım dizini
groupadd developers
mkdir /srv/dev-project
chown root:developers /srv/dev-project
chmod 2775 /srv/dev-project

# Artık developers grubundaki herkes bu dizine dosya ekleyebilir
# ve eklenen dosyalar otomatik olarak developers grubuna ait olur

Sticky Bit – 1000

Sticky bit dizinlerde kullanılır. Aktif olduğunda, dizindeki bir dosyayı sadece dosyanın sahibi, dizinin sahibi veya root silebilir. /tmp dizini en bilinen örnek:

ls -ld /tmp
drwxrwxrwt 20 root root 4096 Jan 15 12:00 /tmp

Sondaki t sticky bit’in aktif olduğunu gösteriyor.

# Sticky bit ekle
chmod +t /srv/public-uploads/
chmod 1777 /srv/public-uploads/

# Kontrol
ls -ld /srv/public-uploads/
drwxrwxrwt 2 root root 4096 Jan 15 12:00 /srv/public-uploads/

umask ile İlişkisi

chmod konusunu konuşurken umask‘tan bahsetmemek olmaz. umask, yeni oluşturulan dosya ve dizinlerin varsayılan izinlerini belirler.

# Mevcut umask değerini gör
umask
# Çıktı: 0022

# Dosyalar için: 666 - 022 = 644
# Dizinler için: 777 - 022 = 755

Yani varsayılan umask 022 ile:

  • Yeni oluşturulan dosyalar otomatik olarak 644 iznine sahip olur
  • Yeni oluşturulan dizinler 755 iznine sahip olur

Güvenlik gerektiren ortamlarda daha kısıtlayıcı umask kullanabilirsin:

# .bashrc veya /etc/profile içine ekle
umask 027
# Dosyalar: 640, Dizinler: 750

Pratik Senaryolar ve Sık Yapılan Hatalar

Senaryo 1: SSH Bağlantısı Kurulamıyor

En sık karşılaşılan sorunlardan biri. SSH, dosya izinleri yanlışsa bağlantıyı reddeder.

# Doğru SSH izin yapısı
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub
chmod 644 ~/.ssh/authorized_keys
chmod 644 ~/.ssh/known_hosts

# SSH config dosyası varsa
chmod 600 ~/.ssh/config

Senaryo 2: Web Sunucusu 403 Forbidden Hatası

# Nginx veya Apache'nin dosyayı okuyabilmesi için
# Web root ve tüm üst dizinlerde execute biti olmalı
namei -l /var/www/html/index.html
# Bu komut her seviyedeki izinleri gösterir

# Tipik düzeltme
chmod 755 /var/www/
chmod 755 /var/www/html/
chmod 644 /var/www/html/index.html

Senaryo 3: Cron Job Çalışmıyor

# Script çalıştırılabilir mi kontrol et
ls -l /opt/scripts/backup.sh

# Değilse düzelt
chmod +x /opt/scripts/backup.sh

# Cron genellikle root veya belirli bir kullanıcı olarak çalışır
# Sahipliği de kontrol et
chown root:root /opt/scripts/backup.sh
chmod 700 /opt/scripts/backup.sh

Senaryo 4: Uygulama Log Dizini İzinleri

# Uygulama log dizini: uygulama yazabilmeli, başkaları okuyabilmeli
APP_USER="myapp"
LOG_DIR="/var/log/myapp"

mkdir -p $LOG_DIR
chown $APP_USER:$APP_USER $LOG_DIR
chmod 755 $LOG_DIR

# Mevcut log dosyaları
chmod 644 $LOG_DIR/*.log 2>/dev/null || true

İzin Doğrulama ve İzleme

Değişiklik yaptıktan sonra doğrulama yapmak iyi bir alışkanlık:

# Detaylı izin bilgisi
stat /var/www/html/config.php
# File: /var/www/html/config.php
# Access: (0644/-rw-r--r--)  Uid: ( 33/www-data)   Gid: ( 33/www-data)

# Belirli izne sahip dosyaları bul
find /var/www -perm /o+w -type f
# Diğerlerinin yazabildiği dosyaları listele (güvenlik kontrolü)

# SUID/SGID dosyalarını tara
find /usr /bin /sbin -perm /6000 -type f -ls 2>/dev/null

Toplu İzin Denetimi Script’i

#!/bin/bash
# Güvenlik açığı olan izinleri tara

echo "=== Dünya için yazılabilir dosyalar ==="
find /var/www /opt /srv -perm /o+w -type f 2>/dev/null | head -20

echo ""
echo "=== SUID bitleri ==="
find / -perm -4000 -type f 2>/dev/null

echo ""
echo "=== Sahipsiz dosyalar ==="
find /var/www /opt /srv -nouser -o -nogroup 2>/dev/null | head -20

echo ""
echo "=== 777 izinli dizinler ==="
find / -perm 777 -type d 2>/dev/null | grep -v proc | head -20

Bu scripti /etc/cron.weekly/permission-audit.sh olarak kaydedip düzenli çalıştırabilirsin.

–reference Parametresi: İzin Kopyalama

Az bilinen ama çok işe yarayan bir özellik. Bir dosyanın izinlerini başka bir dosyaya kopyalarsın:

# referans dosyasının iznini hedef dosyaya uygula
chmod --reference=/etc/nginx/nginx.conf /etc/nginx/sites-available/yeni-site.conf

# Bu özellikle şablondan oluşturulan konfig dosyalarında çok kullanışlı
TEMPLATE="/etc/myapp/template.conf"
NEW_CONFIG="/etc/myapp/production.conf"
cp $TEMPLATE $NEW_CONFIG
chmod --reference=$TEMPLATE $NEW_CONFIG

ACL ile chmod İlişkisi

Standart Linux izin modeli bazen yetmez. Mesela aynı dosyaya üç farklı kullanıcıya üç farklı izin vermek istiyorsun. İşte bu noktada ACL (Access Control List) devreye girer. chmod çalıştırdığında ACL’leri etkileyebilirsin:

# ACL'leri görüntüle
getfacl /var/www/html/config.php

# ACL varsa ls çıktısında + işareti görünür
ls -l /var/www/html/config.php
-rw-r--r--+ 1 www-data www-data 1024 Jan 15 10:30 config.php

# chmod mask'ı değiştirir, tüm ACL'leri silmez
# ACL'leri tamamen kaldırmak için:
setfacl -b /var/www/html/config.php

Güvenlik İpuçları ve En İyi Pratikler

Yıllar içinde edindiğim deneyimden bazı pratik kurallar:

  • En az yetki prensibini uygula: Bir dosyanın ihtiyacı olan minimum izni ver, fazlasını değil.
  • 777 izninden kaçın: “Geçici çözüm” olarak verilen 777 izinleri genellikle kalıcı olur. Sorunun gerçek kaynağını bul.
  • Üretim ortamında -v kullan: chmod -Rv 755 /var/www/html/ ile neyin değiştiğini takip et.
  • Script dosyalarına dikkat: Yazılabilir bir execute scriptini herhangi biri kötüye kullanabilir.
  • Periyodik denetim yap: Yukarıdaki audit scriptini düzenli çalıştır.
  • Değişiklikleri logla: Kritik dizinlerde yapılan izin değişikliklerini auditd ile kayıt altına al.
# auditd ile izin değişikliklerini izle
auditctl -w /etc -p wa -k etc-permission-changes
auditctl -w /var/www -p wa -k www-permission-changes

# Logları incele
ausearch -k etc-permission-changes

Sonuç

chmod basit görünen ama derinliği olan bir komut. Temel oktal ve sembolik kullanımı ezberlemek yetmez; SUID/SGID/sticky bit gibi özel bitleri, umask ile ilişkisini ve güvenlik denetimi pratiklerini de kavramak gerekiyor.

Gerçek ortamlarda en çok zaman kaybettiren şeyler şunlar: ya fazla izin verip güvenlik açığı oluşturmak, ya da az izin verip servisleri çalışmaz hale getirmek. İkisinin arasındaki doğru dengeyi bulmak için hem uygulamanın ihtiyaçlarını hem de güvenlik gereksinimlerini anlamak şart.

Bir sonraki adım olarak chown, chgrp ve ACL konularına bakmanı öneririm. İzin yönetimi bu üçünün birlikte kullanımıyla tam anlam kazanıyor. Düzenli güvenlik denetimleri ve en az yetki prensibi ile çalışmak, uzun vadede seni çok ciddi sorunlardan koruyacak.

Yorum yapın