İçeriğe atla

Linux

chmod Nedir? Unix Dosya İzinleri Tahmin Etmeden

10 dk okuma

"Bu dosyayı neden silemiyorum?", Linux'ta sorulan ilk klasik sorudur. Cevap neredeyse her zaman şudur: dosyada yazma izniniz var ama onu barındıran dizin size izin vermiyor — ve chmod sayıları, 644 değerini soyut bir kod olarak okumayı bırakana kadar anlam kazanmaz. Her izin basamağının aslında üç anahtarın (oku, yaz, çalıştır) tek bir sayıya toplanmış hâli olduğunu gördüğünüz anda bütün sistem açılır. Bu rehber, tek bir fikirden başlayıp sekizli (oktal) sayılara, ls -l çıktısına ve web sunucularıyla ev dizinlerini doğru çalıştıran 644 ile 755 gibi günlük varsayılanlara uzanır.

Her dosyanın üç sahibi vardır: sahip, grup, diğerleri

Unix'teki her dosya ve dizin, kimin ne yapabileceğini yazan küçük bir kimlik kartı taşır. Üç kimlik önemlidir ve listedeki her izin karakteri bu kimliklerden her biri için bir kez geçer:

  • Sahip (u) — dosyayı oluşturan kullanıcı. Burada genellikle tam kontrol varsayılır.
  • Grup (g) — sahiple aynı grubu paylaşan kullanıcılar. Üyelik; ekiplerin her şeyi dünyaya açmadan iş birliği yapmasını sağlar.
  • Diğerleri (o) — sistemdeki herkes. Halk.

Bu kimliklerin her birine üç eylem bağlıdır: oku (r), yaz (w) ve çalıştır (x). Anlamları, nesne bir dosya değil de dizin olduğunda ince ince değişir ve kafa karışıklığının çoğu tam da buraya düşer.

Sekizli sayılar: 4, 2 ve 1 nereden geliyor?

chmod'un sayısal biçimi — herkesin gerçekte yazdığı şey — her kimlik için bir tane olmak üzere, daima sahip, grup, diğerleri sırasıyla üç sekizli basamaktır. Her basamak, eylem değerlerinin toplamıdır: oku 4, yaz 2, çalıştır 1 eder. Değerler ikinin katları olduğu için (4 + 2 + 1 = 7), 0'dan 7'ye her toplam benzersiz bir kombinasyonu tanımlar; çakışma asla olmaz:

SekizliSembolikAnlam
7rwxOku, yaz ve çalıştır
6rw-Oku ve yaz, çalıştırma yok
5r-xOku ve çalıştır, yazma yok
4r--Yalnızca oku
3-wxYalnızca yaz ve çalıştır
2-w-Yalnızca yaz
1--xYalnızca çalıştır
0---Hiçbir izin yok

Yani 644 şöyle parçalanır: sahip için 6 (oku + yaz), grup için 4 (yalnızca oku), diğerleri için 4 (yalnızca oku). Kısa çizgi sadece "bu anahtar kapalı" demektir: rw- oku ve yaz anlamına gelir, çalıştır kapalıdır.

ls -l çıktısını okumak: -rwxr-xr-- ne demek?

ls -l komutunun ilk sütununa bir bakalım. İnsanları sebepsiz yere ürküten on karakterlik bu dize aslında çok basittir:

$ ls -l
-rw-r--r--  1 mustafa web   18740 Eyl 16 09:12 index.html
drwxr-xr-x  2 mustafa web    4096 Eyl 16 09:12 assets
-rw-------  1 mustafa web     512 Eyl 16 09:12 id_rsa

İlk karakter türdür: - normal bir dosya, d bir dizin, l sembolik bir bağdır. Kalan dokuz karakter üç üçlüdür — sahip, grup, diğerleri — her biri sabit r w x konumlarına sahiptir ve hakkın olmadığı yerde kısa çizgi durur. Yani -rw-r--r--, sahibinin okuyup yazabildiği, herkesin yalnızca okuyabildiği bir dosyadır; drwxr-xr-x ise sahibinin tam özgürlüğe, grup ve diğerlerinin okuyup geçebilme hakkına sahip olduğu bir dizindir.

Convrs'taki araç, elle işaretleyeceğiniz onay kutularından bu dizeyi tam olarak yeniden üretir; "r, w, x'i işaretle" ifadesiyle son metin arasındaki eşlemeyi içselleştirmeyi güvenli hâle getirir.

chmod 644 ve 755: dosyalarla dizinler neden ayrışır?

Gerçek dünyada en sık görülen iki chmod argümanı 644 ve 755tir. İkisi de sahibe tam kontrol bırakır ve herkese okuma hakkı tanır; fark, grup ve diğerleri için çalıştırma bitinde gizlidir. Normal dosyalarda çalıştırma nadir ve bilinçli bir ayrıcalıktır — rastgele dosyaların çalıştırılabilir olmasını istemezsiniz. Dizinlerde ise anlam farklıdır: geçiş.

Bir dizine girmek, içeriğini listelemek, içindeki bir dosyayı açmak ya da altındaki herhangi bir şeye ulaşmak için dizinin kendisinde x bitine ihtiyacınız vardır. Bu isteğe bağlı değildir. Yönetici kuralı kısaca şudur:

  • Dosyalar: 644 (rw-r--r--) — herkes okur, sahibi yazar, yalnızca gerçekten gerekiyorsa çalıştırılır.
  • Dizinler: 755 (rwxr-xr-x) — herkes girer ve okur, yalnızca sahibi değiştirir.

Aynı varsayılanlar web sunucularına güç verir

NGINX ve Apache; web kullanıcısının okuyabildiği dosyaları, web kullanıcısının geçebildiği dizinlerin içinde sunar: dosyalar için 644, dizinler için 755. Özel anahtarlar 600da kalır (yalnızca sahip) ve ~/.ssh klasörünüz 700 olmalıdır — sahip oku/yaz/çalıştır, başkası değil. Bunları uygulayın, yayındaki siteler çok daha az kırılır.

Sembolik gösterim: u+x, g-w, a=r

Sekizli gösterim tam bir izin kümesi belirtmek için harikadır; ama tek bir küçük müdahale için sembolik biçim daha okunaklıdır. Sözdizimi hedef (u sahip, g grup, o diğerleri, a tümü), işleç (+ ekle, - çıkar, = birebir ayarla) ve r, w, x harfleridir. Sık kullanılan birkaç örnek:

$ chmod u+x script.sh        # sahip çalıştırabilir
$ chmod g-w config.php       # grup artık yazamaz
$ chmod a=r notes.txt        # herkes: birebir oku, başka hiçbir şey
$ chmod u=rw,g=r,o= file.txt # sahip rw, grup r, diğerleri hiç

a=r bilinesi bir tuzaktır: = birebir ayarlar, yani a=r herkesten çalıştırma ve yazmayı tamamen alır — oku ekleyip geçmez.

Özel bitler: suid, sgid ve yapışkan bit (sticky)

Üç ekstra bit nadiren gerekir ama tanımakta fayda vardır. setuid (chmod u+s, sahibin çalıştırma sütununda s olarak görünür) bir programı dosya sahibinin ayrıcalıklarıyla çalıştırır — /usr/bin/passwd normal kullanıcıların dokunamadığı bir dosyaya bu yüzden yazar. setgid (chmod g+s) aynı işi grup için yapar; dizinlerde ise yeni dosyaların üst dizinin grubunu miras almasını sağlar. Yapışkan bit (chmod +t, t olarak görünür) en sondaki karakter olarak geri döner: herkesin yazabildiği dizinlerde "herkes burada dosya oluşturabilir ama yalnızca sahibi kendi dosyasını silebilir" anlamına gelir. /tmp bunun kanonik örneğidir — ls -ld /tmp çıktısında drwxrwxrwt görürsünüz.

Nadiren, lütfen

setuid ve setgid birer güvenlik makasıdır — tek bir hata, ayrıcalıksız kullanıcılara yüksek yetkiler verir. Ortalama bir sistem yöneticisi bunları yirmi yılda sizin düşündüğünüzden az değiştirir.

Dikkatli olunması gereken an: 777 refleksi

Linux'taki izin kaynaklı güvenlik deliklerinin en büyük kaynağı, Stack Overflow yanıtlarını dolduran chmod -R 777 komutudur. 777 her şeyi herkese açar; -R ise bunu aşağıdaki her dosyaya ve dizine özyinelemeli olarak uygular. Bir web dizinine yanlışlıkla uygulanan tek bir chmod -R 777, yüklediğiniz dosyaları dünya çapında çalıştırılabilir yapar ve gelecekteki her betiğin yedeklerinizi okumasını sağlar.

Dürüst çözüm nadiren daha gevşek izinlerdir; çoğunlukla yanlış sahipler meselesidir. Web sunucusunu kendi kullanıcısıyla çalıştırın, dosyalarınızı o kullanıcıya verin ve gerisini 644/755'e bırakın. Bir yerde "izin reddedildi" yazdığında chmod -R 777 semptomu maskeler, altta yatan sahip veya grup sorununu ortaya çıkarmaz.

Convrs'te chmod'u tahmin etmeden hesaplayın

Convrs chmod hesaplayıcısı yukarıdaki tablolarla aynı mantığı çalıştırır: sahip, grup ve diğerleri için oku, yaz ve çalıştır onay kutularını işaretleyin, dosya/dizin anahtarını çevirin ve anında sekizli değeri (chmod 644), sembolik dizeyi (-rw-r--r--) ve kopyalama düğmelerini alın. Her şey tarayıcınızda çalışır; üretim sunucusu için hesapladığınız sayılar cihazınızdan asla çıkmaz.

Buy me a coffee