Rehber

Linux dosya izinleri: chmod, chown ve sudo örneklerle

Güncellendi: · Skillaria.Top

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, d dizin, l sembolik 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>
İzinDosya içinDizin için
r (read)içeriği okumakdosya listesini görmek (ls)
w (write)içeriği değiştirmekiçinde dosya oluşturmak, silmek ve yeniden adlandırmak
x (execute)program olarak çalıştırmakdizine 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İzinlerHesap
7rwx4+2+1
6rw-4+2
5r-x4+1
4r--4
0---0

Ezberlenmesi gereken yaygın kümeler:

ead>
ModBiçimNerede kullanılır
644rw-r--r--normal dosyalar, yapılandırmalar, HTML
755rwxr-xr-xdizinler, betikler ve programlar
600rw-------özel SSH anahtarları, parola içeren dosyalar
700rwx------~/.ssh dizini, kişisel dizinler
640rw-r-----servis grubunun okuduğu yapılandırmalar
777rwxrwxrwxherkese 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 konuyu videoyla öğrenin

Bu konu “Linux: с нуля до уверенного администрирования” kursunda uygulamalı olarak ayrıntılı işleniyor.

Kursa git