chmod ile Dosya İzinleri: Sayısal ve Sembolik Yöntem

Linux sistemlerde dosya izinleri, güvenliğin temel taşlarından birini oluşturur. Yanlış yapılandırılmış bir izin, sisteminizi saldırılara açık hale getirebilir ya da uygulamalarınızın çalışmasını engelleyebilir. chmod komutu ise bu izinleri yönetmenin en temel ve güçlü aracıdır. Bu yazıda hem sayısal (oktal) hem de sembolik yöntemi gerçek dünya senaryolarıyla birlikte detaylıca ele alacağız.

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

Bir dosyaya ls -l komutuyla baktığınızda şöyle bir çıktı görürsünüz:

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

Bu çıktıdaki -rwxr-xr-- ifadesini parçalara ayıralım. İlk karakter dosya tipini gösterir: - normal dosya, d dizin, l sembolik link anlamına gelir. Geri kalan 9 karakter ise 3’er karakterlik üç gruba ayrılır:

  • rwx: Dosya sahibinin (owner) izinleri
  • r-x: Grubun (group) izinleri
  • r–: Diğer kullanıcıların (others) izinleri

Her grupta üç temel izin bulunur. r okuma (read), w yazma (write), x çalıştırma (execute) iznini temsil eder. Tire - ise o iznin olmadığını gösterir.

Sayısal (Oktal) Yöntem

Sayısal yöntem, izinleri rakamlarla ifade eder ve deneyimli sysadminlerin günlük işlerinde en çok tercih ettiği yöntemdir. Hızlı, kesin ve betiklerle kullanıma çok uygundur.

Oktal Değerlerin Mantığı

Her izin bir bit değerine karşılık gelir:

  • 4: Okuma (r)
  • 2: Yazma (w)
  • 1: Çalıştırma (x)
  • 0: İzin yok (-)

Bu değerleri toplayarak her grup için bir rakam elde edersiniz. Örneğin rwx için 4+2+1=7, r-x için 4+0+1=5, r-- için 4+0+0=4 olur. Üç grubun değerlerini yan yana yazarak tam izin kodunu oluşturursunuz: 754 gibi.

Temel Sayısal Kullanım Örnekleri

En sık karşılaşacağınız senaryolardan başlayalım:

# Web sunucusu için tipik PHP dosyası izinleri
chmod 644 /var/www/html/config.php

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

# Sadece sahibin okuyabileceği gizli dosya
chmod 600 ~/.ssh/id_rsa

# Herkesin okuyup çalıştırabileceği ama sadece sahibin yazabileceği dizin
chmod 755 /var/www/html/

# Tam izin (dikkatli kullanın!)
chmod 777 /tmp/shared_workspace

Pratikte en çok kullanacağınız oktal değerler şunlardır:

  • 777: Herkes okur, yazar, çalıştırır (genellikle tehlikeli)
  • 755: Sahip her şeyi yapabilir, diğerleri okur ve çalıştırır
  • 644: Sahip okur ve yazar, diğerleri sadece okur
  • 600: Sadece sahip okur ve yazar
  • 400: Sadece sahip okur (salt okunur)
  • 700: Sadece sahip her şeyi yapabilir
  • 664: Sahip ve grup okur/yazar, diğerleri sadece okur
  • 640: Sahip okur/yazar, grup okur, diğerleri hiçbir şey yapamaz

Recursive Kullanım

Bir dizin ve içindeki tüm dosyaları aynı anda değiştirmek için -R bayrağını kullanırsınız:

# Tüm web dizinini ve içeriğini ayarla
chmod -R 755 /var/www/html/

# Bir projenin tüm log dosyalarını kısıtla
chmod -R 640 /var/log/myapp/

Ancak burada dikkat etmeniz gereken önemli bir nokta var: Dosyalar ve dizinler için farklı izinler gerekebilir. Dizinlerde x biti olmadan içeriğe erişemezsiniz. Bu yüzden recursive işlemlerde find komutuyla birlikte kullanmak çok daha güvenlidir:

# Dizinlere 755, dosyalara 644 ver
find /var/www/html/ -type d -exec chmod 755 {} ;
find /var/www/html/ -type f -exec chmod 644 {} ;

# Sadece shell scriptleri çalıştırılabilir yap
find /var/www/html/ -name "*.sh" -exec chmod 755 {} ;

Sembolik Yöntem

Sembolik yöntem, izinleri harfler ve semboller kullanarak ifade eder. Sayısal yönteme kıyasla daha okunabilir ve özellikle mevcut izinlere ekleme/çıkarma yaparken çok kullanışlıdır.

Sembolik Yöntemin Sözdizimi

Genel format şöyledir: chmod [kimler][operatör][izinler] dosya

Kimler:

  • u: User (dosya sahibi)
  • g: Group (grup)
  • o: Others (diğerleri)
  • a: All (hepsi, u+g+o)

Operatörler:

  • +: İzin ekle
  • : İzin kaldır
  • =: İzni tam olarak ayarla (diğerlerini sıfırla)

İzinler:

  • r: Okuma
  • w: Yazma
  • x: Çalıştırma
  • X: Sadece dizinler veya zaten çalıştırma izni olan dosyalar için çalıştırma
  • s: SUID/SGID biti
  • t: Sticky bit

Sembolik Yöntem Örnekleri

# Dosya sahibine çalıştırma izni ekle
chmod u+x deploy.sh

# Gruptan yazma iznini kaldır
chmod g-w sensitive.conf

# Diğerlerinden tüm izinleri kaldır
chmod o-rwx private_data.txt

# Hem sahibe hem gruba okuma izni ekle
chmod ug+r shared_document.txt

# Herkese okuma izni ver, ama yazma iznini kaldır
chmod a+r,a-w public_file.txt

# Sahibi rwx, grubu rx, diğerlerini hiçbir şey olarak ayarla
chmod u=rwx,g=rx,o= script.sh

Sayısal ve Sembolik Yöntem Karşılaştırması

Mevcut izinleri değiştirmeden sadece bir şey eklemek istediğinizde sembolik yöntem çok daha pratiktir:

# Sayısal yöntemle - mevcut izinleri bilmeniz gerekir
chmod 755 script.sh  # Önceki izinler ne olursa olsun bu değere set eder

# Sembolik yöntemle - sadece çalıştırma iznini ekler, diğerlerine dokunmaz
chmod +x script.sh

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

Standart rwx izinlerinin ötesinde, üç özel bit daha mevcuttur. Bu bitleri anlamadan chmod bilginiz eksik kalır.

SUID (Set User ID) Biti

SUID biti, bir programın çalışırken dosya sahibinin yetkileriyle çalışmasını sağlar. passwd komutu bunun en klasik örneğidir:

ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 59640 Mar 14  2023 /usr/bin/passwd

s harfi SUID bitinin aktif olduğunu gösterir. Normal bir kullanıcı passwd komutunu çalıştırdığında, program root yetkileriyle çalışır ve /etc/shadow dosyasını güncelleyebilir.

# SUID bitini sayısal yöntemle ayarla (4 ile başlayan 4 haneli format)
chmod 4755 /usr/local/bin/myapp

# SUID bitini sembolik yöntemle ayarla
chmod u+s /usr/local/bin/myapp

# SUID bitini kaldır
chmod u-s /usr/local/bin/myapp

SGID (Set Group ID) Biti

SGID, programlar için SUID’e benzer şekilde çalışır. Ancak dizinlerde farklı bir anlam taşır: SGID biti olan bir dizine oluşturulan yeni dosyalar, oluşturan kullanıcının grubu yerine dizinin grubunu devralır. Bu özellik ekip çalışması ortamlarında son derece değerlidir:

# Paylaşılan proje dizinine SGID koy
chmod 2775 /var/www/projects/

# Sembolik yöntemle
chmod g+s /var/www/projects/

# SGID durumunu kontrol et
ls -ld /var/www/projects/
drwxrwsr-x 2 root developers 4096 Jan 15 10:30 /var/www/projects/

Artık developers grubundaki herhangi biri bu dizine dosya oluşturduğunda, dosya otomatik olarak developers grubuna ait olacak.

Sticky Bit

Sticky bit genellikle /tmp gibi herkesin yazabildiği dizinlerde kullanılır. Bu bit aktifken, bir kullanıcı dizine dosya yazabilir ama yalnızca kendi dosyalarını silebilir:

ls -ld /tmp
drwxrwxrwt 18 root root 4096 Jan 15 11:00 /tmp

t harfi sticky bit’in aktif olduğunu gösterir.

# Sticky bit ekle
chmod +t /shared/uploads/
chmod 1777 /shared/uploads/

# Sticky bit kaldır
chmod -t /shared/uploads/

Özel Bitleri Sayısal Olarak İfade Etmek

Özel bitleri sayısal yöntemde 4 haneli formatla ifade edersiniz:

  • 4xxx: SUID
  • 2xxx: SGID
  • 1xxx: Sticky bit
  • 6xxx: SUID + SGID
  • 7xxx: SUID + SGID + Sticky bit

Gerçek Dünya Senaryoları

Senaryo 1: Web Sunucusu Güvenlik Yapılandırması

Nginx veya Apache ile çalışan bir web sunucusunda izinleri doğru ayarlamak kritik öneme sahiptir:

# Web kök dizininin sahibini ayarla
chown -R www-data:www-data /var/www/html/

# Dizinlere uygun izinler
find /var/www/html/ -type d -exec chmod 755 {} ;

# Statik dosyalar
find /var/www/html/ -type f -exec chmod 644 {} ;

# Konfigürasyon dosyaları daha kısıtlı olmalı
chmod 640 /var/www/html/config/database.php
chmod 640 /var/www/html/.env

# Upload dizini (PHP'nin yazabilmesi lazım)
chmod 775 /var/www/html/uploads/
chown www-data:developers /var/www/html/uploads/

Senaryo 2: SSH Anahtar Dosyaları

SSH özel anahtarlarının izinleri yanlışsa SSH bağlantısı bile kurulamaz:

# SSH dizini ve dosya izinleri
chmod 700 ~/.ssh/
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub
chmod 600 ~/.ssh/authorized_keys
chmod 600 ~/.ssh/config

# Tüm SSH dizinini tek seferde düzenle
find ~/.ssh/ -type f -exec chmod 600 {} ;
chmod 700 ~/.ssh/

Senaryo 3: Çoklu Geliştirici Ortamı

Bir ekip aynı sunucuda çalışıyorsa izin yönetimi kritik hale gelir:

# Geliştirici grubunu oluştur
groupadd developers

# Kullanıcıları gruba ekle
usermod -aG developers ahmet
usermod -aG developers mehmet

# Proje dizinini ayarla
mkdir -p /projects/webapp
chown root:developers /projects/webapp
chmod 2775 /projects/webapp  # SGID ile grup devamlılığı sağla

# Gizli yapılandırma dosyaları sadece grup okuyabilsin
chmod 640 /projects/webapp/secrets.env
chown root:developers /projects/webapp/secrets.env

Senaryo 4: Cron Job Script Güvenliği

Otomatik çalışan scriptler için uygun izinler:

# Backup scripti
chmod 700 /usr/local/bin/backup.sh  # Sadece root çalıştırabilsin
chown root:root /usr/local/bin/backup.sh

# Uygulama backup scripti (uygulama kullanıcısı çalıştırmalı)
chmod 750 /opt/myapp/scripts/maintenance.sh
chown myapp:myapp /opt/myapp/scripts/maintenance.sh

# Log rotation scripti
chmod 755 /etc/cron.daily/logrotate-myapp
chown root:root /etc/cron.daily/logrotate-myapp

İzinleri Görüntülemek ve Doğrulamak

# Detaylı liste görünümü
ls -la /var/www/html/

# Stat komutuyla detaylı bilgi
stat /var/www/html/index.php

# Oktal format görüntüleme (çok kullanışlı!)
stat -c "%a %n" /var/www/html/*

# Belirli izinlere sahip dosyaları bul
find /var/www/ -perm 777 -type f  # Tehlikeli 777 izinli dosyaları bul
find /var/www/ -perm /o+w -type f  # Diğerlerinin yazabildiği dosyaları bul

# SUID/SGID dosyaları bul (güvenlik taraması için)
find / -perm /6000 -type f 2>/dev/null

Sık Yapılan Hatalar ve Dikkat Edilmesi Gerekenler

777 İzni Vermekten Kaçının: “Çalışmıyor, 777 yapayım” tuzağına düşmeyin. Bu izin dosyayı herkese açık hale getirir ve ciddi güvenlik açıklarına yol açar. Neden çalışmadığını anlayın ve minimum gerekli izni verin.

Dizinlerde Execute Biti: Dizinlerde x biti aslında “içine girme” iznini temsil eder. x olmadan bir dizine giremez, içindeki dosyalara erişemezsiniz. Bu yüzden find ile recursive işlemde dosyalara 644, dizinlere 755 vermeyi unutmayın.

Root Olarak chmod Çalıştırma: Root her dosyanın iznini değiştirebilir. Yanlış bir chmod -R komutu tüm sistemi bozabilir. Komutunuzu --dry-run veya önce küçük bir test alanında deneyin.

Umask ile İlişki: chmod mevcut izinleri değiştirir ama yeni oluşturulan dosyaların varsayılan izinlerini umask belirler. Sunucunuzda umask 022 ise yeni dosyalar 644, yeni dizinler 755 izniyle oluşturulur.

# Mevcut umask değerini görüntüle
umask
# veya oktal formatta
umask -S

# Geçici olarak değiştir (sadece mevcut oturum için)
umask 027

Toplu İzin Düzeltme Scripti

Gerçek bir üretim ortamında işinize yarayacak bir script:

#!/bin/bash
# Web dizini izinlerini toplu düzelt

WEB_ROOT="/var/www/html"
WEB_USER="www-data"
WEB_GROUP="www-data"

echo "Sahiplik ayarlanıyor..."
chown -R ${WEB_USER}:${WEB_GROUP} ${WEB_ROOT}

echo "Dizin izinleri ayarlanıyor..."
find ${WEB_ROOT} -type d -exec chmod 755 {} ;

echo "Dosya izinleri ayarlanıyor..."
find ${WEB_ROOT} -type f -exec chmod 644 {} ;

echo "Script dosyaları ayarlanıyor..."
find ${WEB_ROOT} -name "*.sh" -exec chmod 755 {} ;

echo "Hassas dosyalar kısıtlanıyor..."
find ${WEB_ROOT} -name "*.env" -exec chmod 640 {} ;
find ${WEB_ROOT} -name "config.php" -exec chmod 640 {} ;

echo "Tamamlandı!"

Sonuç

chmod basit görünen ama derinlere indikçe sistem güvenliğinin çok kritik bir parçası haline gelen bir komuttur. Sayısal yöntem hız ve betik kullanımı için idealdir; 644, 755, 600 gibi değerleri ezberlemek günlük işlerinizi büyük ölçüde hızlandırır. Sembolik yöntem ise mevcut izinleri değiştirmeden ince ayar yaparken kurtarıcıdır.

SUID, SGID ve sticky bit gibi özel izinleri de anlamak, sisteminizde neden bazı programların root gibi davrandığını ve paylaşılan dizinlerin neden beklediğiniz gibi çalışmadığını anlayabilmeniz için gereklidir.

Pratik önerim şu: Her izin değişikliğini öncesinde ls -la ile kontrol edin, sonrasında tekrar kontrol edin. “Neden çalışmıyor” sorusunun cevabı çoğu zaman stat ya da ls -la çıktısında gizlidir. Güvenlik söz konusu olduğunda en az izin prensibi her zaman kazanır; bir şeyin çalışması için gereken minimum izni verin, fazlasını değil.

Yorum yapın