Linux sistemlerde dosya sahipliği kavramı, güvenlik modelinin tam merkezinde yer alır. Bir dosyanın kimin tarafından okunabileceği, yazılabileceği veya çalıştırılabileceği; o dosyanın sahibi kim, hangi gruba ait ve “diğerleri” için ne tür izinler tanımlanmış sorularının cevabına bağlıdır. İzinleri chmod ile ayarlarsın ama sahipliği değiştirmek için chown ve chgrp komutlarına ihtiyacın var. Bu iki komut, özellikle web sunucusu yapılandırmalarında, uygulama deploy süreçlerinde ve kullanıcı yönetiminde günlük hayatın vazgeçilmez parçası haline gelir. Gel, bu komutları tüm detaylarıyla inceleyelim.
Linux Dosya Sahipliği Modeli
Bir dosyanın ls -la çıktısına baktığında şöyle bir şey görürsün:
ls -la /var/www/html/index.php
-rw-r--r-- 1 www-data www-data 1024 Oca 15 10:30 /var/www/html/index.php
Bu çıktıda www-data www-data kısmı sırasıyla kullanıcı sahibi (owner) ve grup sahibi (group) bilgisini gösterir. Linux, her dosya için bu iki sahiplik bilgisini ve izin setini ayrı ayrı tutar.
- Kullanıcı sahibi (owner): Dosyayı oluşturan ya da sonradan atanan kullanıcı
- Grup sahibi (group): Dosyaya erişim yetkisi olan kullanıcı grubu
- Diğerleri (others): Ne owner ne de grup üyesi olan herkes
Bu modeli kavramak, chown ve chgrp komutlarını neden ve nasıl kullanacağını anlamak açısından kritik.
chown Komutu
chown (change owner), bir dosya veya dizinin hem kullanıcı sahibini hem de grup sahibini değiştirmek için kullanılır. Temel sözdizimi şöyledir:
chown [seçenekler] kullanıcı[:grup] dosya
Temel Kullanım Örnekleri
En basit haliyle, bir dosyanın sahibini değiştirmek:
chown ahmet dosya.txt
Bu komut dosya.txt dosyasının sahibini ahmet kullanıcısı yapar. Grup değişmez.
Hem kullanıcıyı hem grubu aynı anda değiştirmek için:
chown ahmet:gelistiriciler dosya.txt
Burada : ayracı kullanıcı ve grup adlarını birbirinden ayırır. Bazı eski sistemlerde . (nokta) da ayraç olarak kullanılırdı, ama artık : standart kabul edilir.
Sadece grubu chown ile değiştirmek istersen kullanıcı kısmını boş bırakırsın:
chown :gelistiriciler dosya.txt
Parametreler
-R: Dizin ve tüm içeriğini özyinelemeli olarak değiştirir. Web sunucusu dizin yapılarında sıkça kullanılır.
-v (verbose): Her değişiklik için bilgi mesajı basar. Hata ayıklarken işe yarar.
-c (changes): Sadece gerçekten değişiklik yapılan dosyalar için çıktı üretir, -v gibi ama yalnızca değişenler için.
–reference=DOSYA: Belirtilen dosyanın sahiplik bilgilerini hedef dosyaya kopyalar. Bir dosyayı referans alarak diğerlerini eşitlemek için kullanılır.
-h: Sembolik linklerin kendisini değiştirir, işaret ettiği dosyayı değil.
–from=kullanıcı:grup: Yalnızca belirtilen sahiplik bilgisine sahip dosyaları değiştirir. Seçici değişiklik için harika.
Recursive Kullanım: Web Sunucusu Senaryosu
Diyelim ki bir web uygulamasını yeni deploy ettin ve /var/www/uygulama dizininin tamamının www-data kullanıcısına ve grubuna ait olması gerekiyor:
chown -R www-data:www-data /var/www/uygulama
Bu komut dizin içindeki tüm dosya ve alt dizinlerin sahipliğini tek seferde değiştirir. Binlerce dosya içeren bir dizinde bu olmasa ne yapardın, bilemiyorum.
Değişiklikleri takip etmek istersen -v ekle:
chown -Rv www-data:www-data /var/www/uygulama
Çıktı şöyle görünür:
changed ownership of '/var/www/uygulama/index.php' from ahmet:ahmet to www-data:www-data
changed ownership of '/var/www/uygulama/config.php' from ahmet:ahmet to www-data:www-data
...
–reference Parametresiyle Akıllı Sahiplik Kopyalama
Bir dosyanın sahiplik bilgisini başka bir dosyadan kopyalamak istediğinde --reference parametresi işini kolaylaştırır:
chown --reference=/var/www/html/index.php /var/www/html/yeni_dosya.php
Bu senaryoda yeni_dosya.php, index.php ile aynı kullanıcı ve grup sahipliğine kavuşur. CI/CD pipeline’larında standart sahiplik şablonu uygulamak için bu yaklaşım çok işe yarar.
–from Parametresiyle Seçici Değişiklik
Sadece belirli bir sahiplik bilgisine sahip dosyaları değiştirmek istediğinde:
chown --from=eski_kullanici:eski_grup yeni_kullanici:yeni_grup /proje/
Örneğin bir ekip üyesi şirketten ayrıldı ve dosyalarının sahipliğini başka birine aktarman gerekiyor ama bu işlemi sadece o kullanıcıya ait dosyalarda yapmak istiyorsun:
find /home/projeler -user mehmet -exec chown ahmet:gelistiriciler {} ;
Ya da daha temiz şekilde --from ile:
chown -R --from=mehmet:gelistiriciler ahmet:gelistiriciler /home/projeler
chgrp Komutu
chgrp (change group), adından da anlaşılacağı üzere yalnızca grup sahipliğini değiştirmek için kullanılır. chown :grup ile aynı işi yapar ama daha okunabilir bir sözdizimi sunar ve bazı durumlarda daha az hata yapma riski taşır.
chgrp [seçenekler] grup dosya
Temel Kullanım
chgrp gelistiriciler proje/
chgrp -R www-data /var/www/html
chgrp parametreleri chown ile büyük ölçüde aynıdır:
-R: Özyinelemeli değişiklik.
-v (verbose): Ayrıntılı çıktı.
-c (changes): Sadece değişiklikleri göster.
–reference=DOSYA: Başka bir dosyadan grup bilgisini kopyala.
-h: Sembolik linklerin kendisini etkile.
Ne Zaman chgrp, Ne Zaman chown Kullanmalı?
Bu sorunun pratik cevabı şu: Eğer sadece grubu değiştiriyorsan chgrp kullan, okunabilirlik açısından niyetin daha net görünür. Hem kullanıcıyı hem grubu değiştiriyorsan chown kullan. Ama teknik olarak her ikisi de aynı işi yapabilir. Bazı sysadmin’ler her şey için chown kullanmayı tercih eder, bazıları işlevleri ayırır. Ekip içinde tutarlılık önemli.
Gerçek Dünya Senaryoları
Senaryo 1: Nginx + PHP-FPM Yapılandırması
Yeni bir Laravel projesi kurdun. PHP-FPM www-data kullanıcısıyla çalışıyor, proje dosyaları ise deploy kullanıcısına ait. Hem Nginx hem de PHP-FPM’in okuyabilmesi, deploy kullanıcısının da yazabilmesi gerekiyor.
# Proje dizininin sahibini deploy kullanıcısı yap, grubu www-data
chown -R deploy:www-data /var/www/laravel-proje
# storage ve bootstrap/cache dizinleri www-data tarafından yazılabilmeli
chown -R www-data:www-data /var/www/laravel-proje/storage
chown -R www-data:www-data /var/www/laravel-proje/bootstrap/cache
Bu yapılandırmayla proje dosyaları deploy kullanıcısına ait kalır, www-data grubu aracılığıyla Nginx ve PHP-FPM okuma erişimine sahip olur; sadece log ve cache dizinleri web sunucusu tarafından yazılabilir.
Senaryo 2: Paylaşımlı Geliştirme Ortamı
Bir geliştirme sunucusunda üç kişilik ekip çalışıyor: Ali, Ayşe ve Can. Tüm ekibin /home/proje dizinine erişmesi gerekiyor.
# Önce grup oluştur
groupadd ekip
# Kullanıcıları gruba ekle
usermod -aG ekip ali
usermod -aG ekip ayse
usermod -aG ekip can
# Proje dizininin grubunu değiştir
chgrp -R ekip /home/proje
# setgid bit ile yeni oluşturulan dosyaların da aynı grubu devralmasını sağla
chmod g+s /home/proje
Bu yapıda chgrp tek başına yeterli değil; setgid biti olmadan dizin içinde yeni oluşturulan dosyalar kullanıcının birincil grubuna atanır. chgrp ve chmod birlikte çalışarak gerçek bir paylaşımlı dizin ortamı oluşturur.
Senaryo 3: Yedekten Geri Yükleme Sonrası Sahiplik Düzeltme
Bir felaket kurtarma senaryosu düşün: Sunucuyu yeniden kurdun, kullanıcı UID’leri farklı olabilir. Yedekten geri yüklenen dosyaların sahipliği sayısal UID/GID değerleriyle gösteriliyor:
ls -la /home/kullanicilar/
drwxr-xr-x 2 1001 1001 4096 Oca 15 10:30 ali
drwxr-xr-x 2 1002 1002 4096 Oca 15 10:30 ayse
Kullanıcıları yeniden oluşturup sahipliği düzeltmek:
# Kullanıcıları eski UID ile yeniden oluştur
useradd -u 1001 ali
useradd -u 1002 ayse
# Sahipliği kullanıcı adıyla güncelle
chown -R ali:ali /home/kullanicilar/ali
chown -R ayse:ayse /home/kullanicilar/ayse
Ya da UID numarası üzerinden doğrudan da işlem yapabilirsin, chown sayısal değerleri de kabul eder:
chown -R 1001:1001 /home/kullanicilar/ali
Senaryo 4: Docker Container Sahiplik Sorunu
Docker kullananların sık karşılaştığı bir sorun: Container içinde üretilen dosyalar host’ta root olarak görünür. Volume mount noktasındaki dosyaların sahipliğini düzeltmek gerekir:
# Container UID'sini öğren
docker exec uygulama id
uid=1000(node) gid=1000(node)
# Host tarafında volume dizinini ayarla
chown -R 1000:1000 /opt/app-data
Sembolik Linklerle Dikkat Edilmesi Gerekenler
Sembolik link sahipliği konusu biraz kafa karıştırıcı olabilir. Varsayılan olarak chown sembolik linkin işaret ettiği dosyayı değiştirir, linkin kendisini değil:
ls -la link_dosya -> /etc/orijinal.conf
# Bu komut /etc/orijinal.conf dosyasının sahibini değiştirir
chown ahmet link_dosya
# Sembolik linkin kendisini değiştirmek için -h kullan
chown -h ahmet link_dosya
Çoğu durumda -h kullanmak istemezsin, çünkü linkin sahibinden çok hedef dosyanın sahibi önemlidir. Ama özellikle güvenlik taramaları sırasında linkler üzerinde çalışırken bu farkı bilmek gerekir.
Sahiplik Değiştirme Kısıtlamaları
Linux’ta dosya sahipliğini değiştirme konusunda bazı güvenlik kısıtlamaları var ve bunları bilmek sürpriz hatalarla karşılaşmamak için önemli.
Normal kullanıcılar yalnızca kendi dosyalarının grup sahipliğini değiştirebilir, o da sadece üyesi oldukları bir gruba. Sahip olmadığın bir dosyanın sahibini değiştiremezsin.
root her şeyi değiştirebilir, ama bunu bile bazen kısıtlayan durumlar var (immutable dosyalar, özel filesystem’ler gibi).
sudo ile kullanım: Üretim sunucularında chown komutlarını genellikle sudo ile çalıştırmak gerekir:
sudo chown -R www-data:www-data /var/www/html
Bir kullanıcının kendi sahipliğindeki dosyayı başkasına devretmesi Linux’ta genellikle yasaktır. Bu “chown giveaway” kısıtlaması güvenlik açısından bilinçli bir tasarım kararıdır. Kendi dosyanı başkasına devredersen geri alamazsın (root olmadığın sürece).
Pratik İpuçları ve Sık Yapılan Hatalar
find ile Birlikte Kullanım
Belirli kriterleri karşılayan dosyaların sahipliğini toplu değiştirmek için find komutuyla kombinasyon güçlü sonuçlar verir:
# Sadece dosyaları değiştir, dizinleri değil
find /proje -type f -exec chown ahmet:gelistiriciler {} ;
# Sadece dizinleri değiştir
find /proje -type d -exec chown ahmet:gelistiriciler {} ;
# Belirli bir kullanıcıya ait dosyaları bul ve değiştir
find /home -user eski_kullanici -exec chown yeni_kullanici {} ;
Sahipliği Doğrulama
Değişiklikten sonra doğrulama yapmayı alışkanlık haline getir:
# Tek dosya kontrol
ls -la dosya.txt
# Dizin ağacının sahiplik özetini al
find /var/www/html -printf '%u:%g %pn' | sort | uniq -c | sort -rn | head -20
Bu find komutu dizindeki en yaygın kullanıcı:grup kombinasyonlarını listeler. Beklenmedik sahiplikler hemen göze çarpar.
stat ile Detaylı Bilgi
stat dosya.txt
stat çıktısında Uid ve Gid satırları hem sayısal değeri hem de kullanıcı/grup adını gösterir. Özellikle sorun giderme sırasında ls çıktısından daha fazla bilgi sunar.
Sık Yapılan Hatalar
Trailing slash sorunu: Sembolik link üzerinde çalışırken dikkat et:
# Bu, linkin işaret ettiği dizini değiştirir
chown -R ahmet /linke-link/
# Bu, linkin kendisini değiştirir (eğer link ise)
chown -R ahmet /linke-link
Yanlış sıra: chown kullanici:grup doğru, chown grup:kullanici yanlış. Sıraya dikkat.
-R olmadan büyük dizin: Özyinelemeli değişiklik yaparken -R unutmak yaygın bir hata. Sadece dizinin kendisi değişir, içeriği değil.
Root olarak çalışırken dikkat: Root ile chown -R kullanırken yanlış dizin yazmak felaket olabilir. pwd ile konumunu kontrol et, komutu çalıştırmadan önce bir kere daha oku.
chown ve chmod İlişkisi
Sahiplik değişikliği izin değişikliğinden bağımsız çalışır ama ikisi birlikte anlam kazanır. Bir dosyanın sahibini değiştirdin ama izinler eski sahip için ayarlıysa yeni sahip erişemeyebilir. Ya da tam tersi, izinler çok geniş ayarlanmışsa sahiplik değişikliği güvenlik açığı yaratabilir.
# Önce sahipliği ayarla
chown -R deploy:www-data /var/www/uygulama
# Sonra izinleri düzenle
find /var/www/uygulama -type f -exec chmod 644 {} ;
find /var/www/uygulama -type d -exec chmod 755 {} ;
Bu iki adımlı yaklaşım, hem doğru sahiplik hem de doğru izinlerin birlikte ayarlandığından emin olmanı sağlar.
Sonuç
chown ve chgrp komutları, Linux sistem yönetiminin temel yapı taşlarından. Web sunucusu kurulumlarından development ortamı yapılandırmalarına, felaket kurtarma senaryolarından Docker volume yönetimine kadar onlarsız geçen bir gün yok gibi. Bu komutları sadece sözdizimi olarak değil, arkasındaki Linux dosya sahipliği modeliyle birlikte kavramak seni çok daha etkili bir sysadmin yapar.
Pratik açıdan bakacak olursam: -R ile özyinelemeli kullanımı ezberle, find ile kombinasyon kurmayı öğren ve değişiklik sonrası doğrulama alışkanlığı edin. Üretim ortamında chown -R çalıştırmadan önce iki kere düşün, hangi dizinde olduğunu ve hangi kullanıcıya devrettiğini gözden geçir. Bu komutların yaptığı değişiklikler anında uygulanır ve geri alması bazen can sıkıcı olabilir. Ama doğru kullandığında, sistem güvenliğinin temelini oluşturan sahiplik yapısını tam kontrol altına alırsın.