chown ve chgrp ile Dosya Sahipliği Değiştirme

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.

Yorum yapın