Linux’ta Dosya ve Dizin İzinleri
Dosya ve dizin izinleri, Linux’taki en temel güvenlik özelliklerinden biridir. Bu yazıda, Linux’ta dosya ve dizin sahiplikleri ve izinleri konusunu anlatmaya çalışacağım.
Dosya ve dizin işlemleri yazısını okuduysanız, şimdi sıra izinleri yönetmekte.
Linux’ta Dosya Sahipliği
Linux, dosya ve dizinleri koruma sürecini 3 temel kategoride işler:
- Sahip (Owner): Linux sistemlerde, tüm dosya ve dizinlerin bir sahibi vardır.
- Grup (Group): Sahipliğin yanı sıra, her dosya ve dizin bir gruba atanır. Grubun sahip olduğu izinler, o gruptaki tüm kullanıcılar için geçerli olur.
- Diğer (Other): Herhangi bir şekilde dosyanın sahibi olmayan ya da dosyanın grubunda bulunmayan bir kullanıcı, “diğer” kategorisinde ele alınır.

Yukarıdaki görselde yer alan dosyalardan bazılarını inceleyelim. Örneğin, “index.php” dosyasının sahibi “apache” (sol sütunda) ve grubu “apache” (sağ sütunda).
Benzer şekilde “wp-config.php” dosyasının sahibi ve grubu ise “root”.
Dosya Sahipliğinin Değiştirilmesi
Dosya sahibi olan kullanıcının değiştirilmesi için “chown” komutunu kullanabiliriz. Örneğin, “wp-config.php” dosyasının sahibini “apache” yapalım:
[root@gnuadmin html]# chown apache wp-config.php
[root@gnuadmin html]# ls -l wp-config.php
-rw-r--r--. 1 apache root 3189 Ara 29 02:10 wp-config.php
Dosyanın grubunu değiştirmek için ise “chgrp” komutunu kullanabiliriz:
[root@gnuadmin html]# ls -l wp-config.php
-rw-r--r--. 1 apache root 3189 Ara 29 02:10 wp-config.php
[root@gnuadmin html]# chgrp apache wp-config.php
[root@gnuadmin html]# ls -l wp-config.php
-rw-r--r--. 1 apache apache 3189 Ara 29 02:10 wp-config.php
Çıktıdan da anlaşılabileceği üzere, “wp-config.php” dosyasının hem sahibi hem de grubu “apache” olarak değiştirildi.
Aynı anda hem sahipliği hem de grubu değiştirmek için, yine “chown” komutunu kullanmak mümkün:
[root@gnuadmin html]# ls -l wp-config.php
-rw-r--r--. 1 apache apache 3189 Ara 29 02:10 wp-config.php
[root@gnuadmin html]# chown root:root wp-config.php
[root@gnuadmin html]# ls -l wp-config.php
-rw-r--r--. 1 root root 3189 Ara 29 02:10 wp-config.php
Hatta “:” karakterinden önceki parametreyi boş göndererek, “chown” ile sadece grup değişikliği de yapabilirsiniz:
[root@gnuadmin html]# chown root:root wp-config.php
[root@gnuadmin html]# ls -l wp-config.php
-rw-r--r--. 1 root root 3189 Ara 29 02:10 wp-config.php
[root@gnuadmin html]# chown :apache wp-config.php
[root@gnuadmin html]# ls -l wp-config.php
-rw-r--r--. 1 root apache 3189 Ara 29 02:10 wp-config.php

Dosya sahipliğinin değiştirilmesi ile ilgili şu konulara dikkat etmelisiniz:
- Belirttiğiniz sahip ve/veya grup, sistemde var olmalı.
- root kullanıcısı, dilediği dosyanın sahipliğini dilediği gibi değiştirebilir.
- Standart kullanıcılar, dosya sahipliklerini başka bir kullanıcıya devredemezler.
- Standart kullanıcılar, dosyanın grubunu değiştirebilir. Ancak dosyayı devretmek istedikleri grubun bir üyesi olmak zorundadırlar.
Buraya kadar sahiplikleri değiştirdik. Peki neden böyle bir şey yapıyoruz? Bu bizim ne işimize yarıyor? Yazının başında belirttiğim 3 kategorinin ayrımını, bu komutlarla yapıyoruz. Bir sonraki bölümde, bu 3 kategoriye özel izinler vereceğiz.
Linux’ta İzinlerin Değiştirilmesi
“ls -l” komutunun çıktısında, dosya ile ilgili birçok bilgi önümüze dökülür:
[root@gnuadmin html]# ls -l wp-config.php
-rw-r--r--. 1 root apache 3189 Ara 29 02:10 wp-config.php
Şimdi bu çıktıyı inceleyelim:
- En başta gördüğünüz “-” karakteri, dosyanın tipini belirtir. Burada gördüğünüz “-“, bahsi geçen dosyanın standart bir dosya olduğunu gösterir. Buna “file type code” diyoruz.
- d: directory
- c: character device file
- b: block device file
- s: local socket file
- p: named pipe
- l: symbolic link
- Devamında gelen 9 karakterlik kısım ki bizim örneğimizde “rw-r–r–” gelmiş, “permission string“tir. Biz, burayı değiştireceğiz.
- 1 karakteri, bu dosyanın sahip olduğu hard link sayısını gösterir.
- “root”, dosyanın sahibidir.
- “apache”, dosyanın grubunu belirtir.
- 3189, dosyanın byte cinsinden boyutudur.
- Tarih kısmı, dosyanın son değiştirildiği tarihtir.
- Son olarak bu dosyanın isminin “wp-config.php” olduğunu görüyoruz.
Linux’ta İzin Tipleri
Temel olarak 3 çeşit izin mevcuttur: read (okuma, r), write (yazma, w) ve execute (çalıştırma, x)
Bu izinler, dosya ve dizinlerde farklı anlamlara gelmektedir. Aşağıdaki tablo, bu farkı anlamanıza yardımcı olabilir:
İzin | Dosya | Dizin |
read | Dosyanın içeriğini okumanıza izin verir. | Dizin içindeki dosyaları listelemenize izin verir. |
write | Dosyanın içeriğini değiştirmenize izin verir. | Dizin içinde dosya oluşturma ve dizin içindeki dosyaları yeniden adlandırma, silme yetkileri verir. |
execute | Dosyaları, bir script ya da binary olarak çalıştırmanıza izin verir. | Dizin içerisine girilmesine izin verir. |
Permission String Nasıl Okunur?
9 karakterden oluşan permission string, soldan itibaren 3’erli gruplar halinde okunur.
[root@gnuadmin html]# ls -l wp-config.php
-rw-r--r--. 1 root apache 3189 Ara 29 02:10 wp-config.php
Bu örnekte yer alan “rw-r–r–” ifadesini 3’erli gruplara ayırdığımızda karşımıza şu sonuç çıkar:
- Dosyanın sahibi root, “rw-” izinlerine sahiptir. Bu dosyayı okuyabilir, içeriğini değiştirebilir ancak çalıştıramaz.
- apache grubundaki kullanıcılar, “r–” izinlerine sahiptir. Bu dosyayı sadece okuyabilirler.
- root olmayan ve apache grubunda bulunmayan kişiler ise “diğer” kategorisine girer ve onlar da bu dosyada yalnızca okuma iznine sahiptir.
Şu dosyanın izinlerine bakalım:
[root@gnuadmin html]# ls -l benioku.txt
-rw-r--r--. 1 root root 9 Oca 11 01:11 benioku.txt
Bu, benim local web server’ımda bulunan bir dosya. Tarayıcımdan bu dosyaya gittiğimde rahatlıkla okuyabiliyorum. Web sitesinin bir ziyaretçisiyim. Bu bilgisayarda bir kullanıcı değilim. “root” değilim ve “root” grubunda bulunmuyorum. Dolayısıyla yalnızca “read” yetkim var.

Bakalım okuma izni kaldırıldığında karşımıza nasıl bir manzara çıkacak:
[root@gnuadmin html]# ls -l benioku.txt
-rw-r-----. 1 root root 9 Oca 11 01:11 benioku.txt

Permission String Nasıl Değiştirilir?
İzinleri değiştirmek için “chmod” komutundan faydalanabiliriz. chmod komutunu kullanırken, symbolic mode ve octal mode olmak üzere 2 farklı yöntem kullanabiliriz.
chmod Symbolic Mode
Kullanım sırasında şunlara dikkat etmeliyiz:
- u: owner (sahip)
- g: group (grup)
- o: others (diğer)
- a: all tiers (tüm kategoriler)
- İzinler için r, w ve x harfleri kullanılır
- İzin eklemek için + karakteri kullanılır
- İzni çıkarmak için – karakteri kullanılır
- İzni doğrudan belirtmek için = karakteri kullanılır
Örnek kullanımlar deneyelim. Elimizde, aşağıdaki izinlere sahip bir dosya ve dizin olsun:
[root@gnuadmin ~]# ls -l
toplam 4
drwxr-xr-x. 2 root root 4096 Oca 11 01:22 dizin
----------. 1 root root 0 Oca 11 01:21 dosya
“dizin” için:
- Sahibinin tüm izinleri olsun (zaten var, bir şey yapmamıza gerek yok)
- Grubun okuma ve yazma izni olsun (yazma eklenecek, çalıştırma kaldırılacak)
- Kalan kullanıcıların hiçbir izni olmasın (okuma ve çalıştırma kaldırılacak)
Aşağıdaki komutları inceleyin ve “dizin”in güncel izinlerini takip edin:
[root@gnuadmin ~]# ls -l
toplam 4
drwxr-xr-x. 2 root root 4096 Oca 11 01:22 dizin
----------. 1 root root 0 Oca 11 01:21 dosya
[root@gnuadmin ~]# chmod g=rw,o-r,o-x dizin
[root@gnuadmin ~]# ls -l
toplam 4
drwxrw----. 2 root root 4096 Oca 11 01:22 dizin
----------. 1 root root 0 Oca 11 01:21 dosya
“g=rw” ile grubun yetkisini doğrudan belirttik. Dolayısıyla çalıştırma iznini kaldırmamıza gerek kalmadı. İznin, “rw” olmasını istedik.
“o-r,o-x” ile, other’dan read ve execute izinlerini kaldırdık. Dikkat ettiyseniz, bu ifadeler virgüllerle ayrıldı ancak hiçbir şekilde boşluk kullanılmadı. Ta ki, üzerinde çalışacağımız dosya ya da dizinin adını belirtene kadar.
Other’a read yetkisini geri verelim:
[root@gnuadmin ~]# chmod o+r dizin
[root@gnuadmin ~]# ls -l
toplam 4
drwxrw-r--. 2 root root 4096 Oca 11 01:22 dizin
----------. 1 root root 0 Oca 11 01:21 dosya
chmod Octal Mode
chmod ile izinleri verirken, biraz binary bilgisi gerekiyor 🙂
Şöyle özetlemeye çalışayım. Elimizde 3 bit var. Bu bitler 0 değeri alınca izin yok, 1 değeri alınca izin var.
“—” sıralamasında tüm bitler 0. “r–” yaptığımızda ise en baştaki izin verilmiş. Sayı, “100” oldu. Yanına bir de execute eklersek, string’imiz “r-x” oluyor. Yani “101”.
Elde edilen bu binary değeri, octal’a çevirirsek karşımıza şöyle bir tablo çıkıyor:
Octal değer | String | İznin anlamı |
0 | — | Hiçbir izin yok |
1 | –x | Çalıştırma |
2 | -w- | Yazma |
3 | -wx | Yazma & çalıştırma |
4 | r– | Okuma |
5 | r-x | Okuma & çalıştırma |
6 | rw- | Okuma & yazma |
7 | rwx | Okuma & yazma & çalıştırma |
Şimdi elimizdeki dosya ve dizin izinlerine tekrar bakalım:
[root@gnuadmin ~]# ls -l
toplam 4
drwxrw-r--. 2 root root 4096 Oca 11 01:22 dizin
----------. 1 root root 0 Oca 11 01:21 dosya
İzinleri şöyle değiştirmeyi deneyelim:
- “dizin” için; sahibi tüm izinlere sahip olsun. Grubu, okuma ve çalıştırma izinlerine sahip olsun. Other da okuma ve çalıştırma iznine sahip olsun.
- “dosya” için; sahibi okuma, yazma ve çalıştırma izinlerine sahip olsun. Grubu, okuma ve yazma izinlerine sahip olsun. Other ise sadece okuma iznine sahip olsun.
Öncelikle “dizin” için olan kısmı halledelim. Owner tüm izinler (rwx, 7), group okuma ve çalıştırma (r-x, 5), other okuma ve çalıştırma (r-x, 5)
[root@gnuadmin ~]# chmod 755 dizin
[root@gnuadmin ~]# ls -l
toplam 4
drwxr-xr-x. 2 root root 4096 Oca 11 01:22 dizin
----------. 1 root root 0 Oca 11 01:21 dosya
Şimdi ise “dosya” için olan izinleri verelim. Owner tüm izinler (rwx, 7), group okuma ve yazma (rw-, 6), other okuma (r–, 4):
[root@gnuadmin ~]# chmod 764 dosya
[root@gnuadmin ~]# ls -l
toplam 4
drwxr-xr-x. 2 root root 4096 Oca 11 01:22 dizin
-rwxrw-r--. 1 root root 0 Oca 11 01:21 dosya
Sonuç Olarak
Dosya ve dizin izinlerinde kategorilerin sıralaması “owner“, “group” ve “other” şeklinde. İzinlerin sıralaması ise “read“, “write” ve “execute” şeklinde.
Bu sıralamayı oturttuğunuz takdirde, izinler konusunun hiçbir kafa karıştırıcılığı kalmayacaktır.
Şimdilik 🙂