Linux dosya izinleri: chmod, chown ve sudo örneklerle
Linux'ta dosya izinleri sahip, grup ve diğerleri için üç rwx kümesiyle belirlenir; chmod komutuyla sembolik (chmod u+x) ya da sayısal biçimde (chmod 755; r=4, w=2, x=1) değiştirilir. Sahibi chown değiştirir, yönetici işlemleri sudo ile yapılır. Permission denied hatası neredeyse her zaman kullanıcınızın dosyada ya da yoldaki dizinlerden birinde gerekli iznin olmadığı anlamına gelir.
Linux'ta dosya izinleri, kimin bir dosyayla ne yapabileceğini belirler. Her dosyanın bir sahibi, bir grubu ve üç izin kümesi vardır: sahip için, grup için ve diğer herkes için. İzinler chmod ile, sahip chown ile değiştirilir; yönetici işlemleri sudo ile yapılır. Bu yazıda izinlerin nasıl okunacağını, nasıl değiştirileceğini ve Permission denied hatasının nasıl giderileceğini anlatıyoruz.
Dosya izinleri nasıl görülür
İzinler ls -l çıktısında görünür:
$ ls -l
-rw-r--r-- 1 alice developers 1204 Oct 10 14:02 notes.txt
-rwxr-xr-x 1 alice developers 356 Oct 10 14:05 deploy.sh
drwxr-x--- 2 alice developers 4096 Oct 10 13:50 secrets
İlk on karakter şöyle okunur:
- Birinci karakter — tür:
-normal dosya,ddizin,lsembolik bağlantı. - 2–4. karakterler — sahibin (user) izinleri.
- 5–7. karakterler — grubun (group) izinleri.
- 8–10. karakterler — diğerlerinin (others) izinleri.
Ardından sert bağlantı sayısı, sahip (alice), grup (developers), boyut, tarih ve ad gelir. Tek bir dosya için stat komutu kullanışlıdır:
$ stat -c '%A %a %U:%G %n' deploy.sh
-rwxr-xr-x 755 alice:developers deploy.sh
r, w ve x ne anlama gelir
Bu izinlerin anlamı dosya ve dizin için farklıdır; karışıklığın asıl kaynağı da budur.
| ead> | ||
|---|---|---|
| İzin | Dosya için | Dizin için |
r (read) | içeriği okumak | dosya listesini görmek (ls) |
w (write) | içeriği değiştirmek | içinde dosya oluşturmak, silmek ve yeniden adlandırmak |
x (execute) | program olarak çalıştırmak | dizine girmek (cd) ve yol üzerinden dosyalara erişmek |
Dikkat: bir dosyaya yazma izni olmayan bir kullanıcı da, dizin üzerinde w ve x izni varsa o dosyayı silebilir. Dizinde x yoksa ise dosyanın okunma izni olsa bile içindeki dosya açılamaz.
Sistem izinleri sırayla denetler: sahipseniz sahibin izinleri uygulanır; değilseniz ama dosyanın grubundaysanız grubun izinleri; aksi halde diğerlerinin izinleri. Root kullanıcısı okuma ve yazma denetimlerini atlar.
Sayısal gösterim: 755, 644, 600
Her iznin bir ağırlığı vardır: r = 4, w = 2, x = 1. Üç küme için bu ağırlıkların toplamı 0 ile 7 arasında bir rakam verir.
| ead> | ||
|---|---|---|
| Rakam | İzinler | Hesap |
| 7 | rwx | 4+2+1 |
| 6 | rw- | 4+2 |
| 5 | r-x | 4+1 |
| 4 | r-- | 4 |
| 0 | --- | 0 |
Ezberlenmesi gereken yaygın kümeler:
| ead> | ||
|---|---|---|
| Mod | Biçim | Nerede kullanılır |
644 | rw-r--r-- | normal dosyalar, yapılandırmalar, HTML |
755 | rwxr-xr-x | dizinler, betikler ve programlar |
600 | rw------- | özel SSH anahtarları, parola içeren dosyalar |
700 | rwx------ | ~/.ssh dizini, kişisel dizinler |
640 | rw-r----- | servis grubunun okuduğu yapılandırmalar |
777 | rwxrwxrwx | herkese her şey — neredeyse hiç gerekmez |
chmod komutu: izinler nasıl değiştirilir
Sayısal mod
Sayısal biçim izinleri bir seferde tamamen belirler:
chmod 644 index.html
chmod 755 deploy.sh
chmod 600 ~/.ssh/id_ed25519
Sembolik mod
Sembolik biçim diğer izinlere dokunmadan yalnızca seçilenleri değiştirir. Kime: u sahip, g grup, o diğerleri, a herkes. İşlem: + eklemek, - kaldırmak, = tam olarak ayarlamak.
chmod +x deploy.sh # çalıştırmaya izin ver
chmod u+x,g-w file # sahibe çalıştırma, gruptan yazma iznini kaldır
chmod o-rwx secrets/ # diğerlerine hiçbir şey
chmod g=rx app/ # gruba tam olarak okuma ve girme izni
Özyinelemeli: dosyalar ve dizinler farklı
-R bayrağı izinleri tüm ağaca uygular. Ama chmod -R 755 tüm dosyaları çalıştırılabilir yapar; bu genellikle istenmez. Daha doğrusu, find ile dizinleri ve dosyaları ayırmaktır:
find /srv/site -type d -exec chmod 755 {} +
find /srv/site -type f -exec chmod 644 {} +
Kısa bir yol da vardır: büyük X, çalıştırma iznini yalnızca zaten çalıştırılabilir olan dizin ve dosyalara ekler.
chmod -R u=rwX,go=rX /srv/site
chown komutu: sahip ve grubu değiştirmek
Bir dosyanın sahibini yalnızca root değiştirebildiği için chown neredeyse her zaman sudo ile çalıştırılır.
sudo chown alice report.txt # sahip
sudo chown alice:developers report.txt # sahip ve grup
sudo chown :www-data index.html # yalnızca grup
sudo chown -R www-data:www-data /var/www/site
Yalnızca grubu değiştirmek için ayrı komut vardır: sudo chgrp developers report.txt. Gruplarınızı id veya groups gösterir.
$ id
uid=1000(alice) gid=1000(alice) groups=1000(alice),27(sudo),1001(developers)
Kullanıcıyı gruba eklemek için: sudo usermod -aG developers bob. -a bayrağı zorunludur: onsuz kullanıcı diğer ek gruplardan çıkarılır. Yeni grup, sistemden çıkıp tekrar girildiğinde geçerli olur.
sudo: yönetici olarak işlem yapmak
sudo, tek bir komutu root (ya da başka bir kullanıcı) olarak çalıştırır ve root'un değil, kendi parolanızı sorar. Her çağrı günlüğe yazılır, böylece kimin ne yaptığı görülebilir.
sudo apt update
sudo systemctl restart nginx
sudo -u postgres psql # postgres kullanıcısı olarak
sudo -i # etkileşimli root kabuğu
sudo -l # bana neye izin verilmiş
Kimin neye izni olduğu /etc/sudoers ve /etc/sudoers.d/ dizinindeki dosyalarda tanımlanır. Bunları yalnızca sudo visudo ile düzenleyin: kaydetmeden önce sözdizimini denetler ve bir hata sizi sudo'dan mahrum bırakmaz. Ubuntu'da sudo yetkisi sudo grubu üyeliğiyle, RHEL türevlerinde wheel grubuyla verilir.
# /etc/sudoers.d/deploy — deploy kullanıcısına yalnızca nginx'i yeniden başlatma izni
deploy ALL=(root) NOPASSWD: /usr/bin/systemctl restart nginx
Neden sudo echo > file çalışmaz
Sık görülen bir tuzak:
$ sudo echo "127.0.0.1 test.local" >> /etc/hosts
bash: /etc/hosts: Permission denied
>> yönlendirmesini sudo değil kabuğunuz yapar; dosya root izni olmadan açılır. Doğrusu tee kullanmaktır:
echo "127.0.0.1 test.local" | sudo tee -a /etc/hosts
Permission denied: nedenler ve çözümler
Permission denied, çekirdeğin sürecinize o işlemi reddettiği anlamına gelir. İnceleme her zaman aynı sırayla yapılır: ben kimim (id), sahip kim ve izinler ne (ls -l), yoldaki her dizinde izinler ne (namei -l).
$ namei -l /srv/app/config/app.env
f: /srv/app/config/app.env
drwxr-xr-x root root /
drwxr-xr-x root root srv
drwxr-x--- deploy deploy app
drwxr-xr-x deploy deploy config
-rw-r----- deploy deploy app.env
Burada app dizini diğerlerine kapalı: deploy grubunda olmayan bir kullanıcı, dosyanın izinleri ne olursa olsun ilerleyemez.
Betik çalışmıyor
$ ./deploy.sh
bash: ./deploy.sh: Permission denied
Dosyada çalıştırma izni yok. Çözüm: chmod +x deploy.sh ya da betiği yorumlayıcıyla çalıştırmak: bash deploy.sh. Disk bölümü noexec seçeneğiyle bağlıysa (/tmp çoğu zaman böyledir), dosya doğrudan çalışmaz; yalnızca ikinci yöntem işe yarar.
Sistem dizinine yazamıyorum
/etc, /usr, /var/www içindeki dosyalar root'a ya da sistem kullanıcılarına aittir. Tek seferlik değişiklikler için sudo kullanın; kalıcı çalışma için izni herkese değil, bir gruba verin.
Web sunucusu 403 veriyor
Nginx veya Apache, Debian ve Ubuntu'da www-data kullanıcısıyla çalışır. Ona dosyaları okuma izni ve yoldaki tüm dizinlerde x gerekir. Çözüm: sudo chown -R www-data:www-data /var/www/site ya da dizinlerde 755, dosyalarda 644.
SSH anahtarı kabul etmiyor
SSH, çok açık izinli anahtarları kullanmayı reddeder. Özel anahtar 600, ~/.ssh dizini 700, sunucudaki authorized_keys dosyası 600 olmalıdır.
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519 ~/.ssh/authorized_keys
Docker'a erişim yok
permission denied while trying to connect to the Docker daemon socket mesajı, docker grubunda olmadığınız anlamına gelir. sudo usermod -aG docker $USER çalıştırın ve yeniden oturum açın. Bu grup üyeliğinin neredeyse root yetkisine eşdeğer olduğunu unutmayın.
chmod 777 neden kötü bir fikir
«Sadece chmod 777 yap» tavsiyesi hatayı giderir, ama dosyayı sistemdeki her kullanıcının ve her sürecin yazabileceği hâle getirir. Web uygulaması ele geçirilirse saldırgan bu dosyaları değiştirebilir. Doğru yol, hangi kullanıcının erişmesi gerektiğini bulup izni tam olarak ona vermektir: sahip ya da grup üzerinden.
umask: varsayılan izinler
Yeni dosyalar umask maskesi hesaba katılarak oluşturulur. Tipik 022 değerinde dosyalar 644, dizinler 755 izinleriyle oluşur.
$ umask
0022
Sonuç
Linux'ta dosya izinleri sahip, grup ve diğerleri için üç rwx kümesidir. chmod izinleri sayısal (755, 644, 600) ya da sembolik biçimde değiştirir, chown sahibi değiştirir, sudo ise tek bir komutu root olarak çalıştırmaya izin verir. Permission denied hatasında kullanıcıyı, dosyanın izinlerini ve yoldaki her dizini kontrol edin; sorunu 777 ile gizlemeyin. Kullanıcılar, gruplar, izinler ve sudo, kurs içinde uygulamalı olarak ayrıntılı işlenmektedir.
Sık sorulan sorular
chmod 755 ne anlama gelir?
Sahip okuyabilir, yazabilir ve çalıştırabilir (7); grup ve diğerleri okuyabilir ve çalıştırabilir (5). Dizinler ve betikler için standart kümedir.
chmod ile chown arasındaki fark nedir?
chmod izinleri değiştirir (dosyayla hangi işlemlerin yapılabileceğini), chown ise sahibi ve grubu değiştirir (bu izinlerin kime ait olduğunu).
Bir kullanıcıya sudo yetkisi nasıl verilir?
Ubuntu ve Debian'da kullanıcıyı <code>sudo</code> grubuna ekleyin: <code>sudo usermod -aG sudo ad</code>; RHEL türevlerinde <code>wheel</code> grubuna. Değişiklik yeniden oturum açıldığında geçerli olur.
4755 izni ve SUID biti nedir?
Baştaki 4 rakamı SUID'i etkinleştirir: program, onu çalıştıran kişinin değil dosya sahibinin yetkileriyle çalışır. Örneğin <code>passwd</code> böyledir; <code>ls</code> çıktısında sahibin x yerinde <code>s</code> görünür.
Root, 000 izinli bir dosyayı neden okuyabilir?
Çekirdek root için sıradan okuma ve yazma denetimlerini uygulamaz. Bu yalnızca SELinux, AppArmor veya <code>chattr +i</code> gibi başka mekanizmalarla sınırlandırılabilir.
Bu konu “Linux: с нуля до уверенного администрирования” kursunda uygulamalı olarak ayrıntılı işleniyor.
Kursa git