Linux Dosya İzinleri: chmod 755, 644 ve 777 Açıklaması
Linux dosya izinleri, sistemdeki her dosya ve klasörü kimin okuyabileceğine, yazabileceğine veya çalıştırabileceğine karar verir. Her öğenin üç kullanıcı sınıfı vardır (sahip, bir grup ve herkes) ve her sınıf üç izin biti alır: okuma (r), yazma (w) ve çalıştırma (x). Bu, dosya başına dokuz bit eder. chmod bunları ayarlar ve her yerde gördüğünüz kısaltma sekizliktir: her sınıfın rwx değeri 0’dan 7’ye kadar tek bir rakama indirgenir (okuma 4 + yazma 2 + çalıştırma 1).
Üç mod, hayatınız boyunca yazacağınız şeylerin neredeyse tamamını kapsar:
- 755 (
rwxr-xr-x) — dizinler ve betikler: sahip bunları değiştirebilir, herkes okuyup çalıştırabilir. - 644 (
rw-r--r--) — sıradan dosyalar: sahip yazar, herkes okur. - 777 (
rwxrwxrwx) — herkes için tam erişim. Neredeyse her zaman yanlıştır; sorunu çözmek yerine güvenlik açığı yaratır.
Herhangi bir kombinasyonu ücretsiz chmod hesaplayıcı içinde açıp kapatın ve sekizlik değerin, rwx dizisinin ve tam komutun birlikte güncellendiğini izleyin. Bu rehberin geri kalanı bu sayıların nasıl çalıştığını ve her birinin nereye ait olduğunu açıklıyor.
30 saniyede Linux dosya izinleri
| Sekizlik | Sembolik | Tipik kullanım |
|---|---|---|
| 400 | r-------- | SSH özel anahtarı, salt okunur |
| 600 | rw------- | Özel dosyalar, SSH anahtarları, .env |
| 644 | rw-r--r-- | Web sayfaları, yapılandırma, çoğu dosya |
| 700 | rwx------ | Özel dizinler (~/.ssh) |
| 755 | rwxr-xr-x | Betikler, ikili dosyalar, web dizinleri |
| 775 | rwxrwxr-x | Grup paylaşımlı dizinler |
| 777 | rwxrwxrwx | Herkes, her şey — kaçının |
| 1777 | rwxrwxrwt | /tmp gibi paylaşımlı geçici dizinler |
Genel kural: dosyalar için 644, dizinler için 755, sonra oradan sıkılaştırın. Bir modu yalnızca somut bir şey bozulduğunda gevşetin; ihtimale karşı önceden gevşetmeyin.
İzin modeli: sahip, grup, diğerleri
Üç sınıf tek bir dosyayı paylaşır. Sahip (genellikle onu kim oluşturduysa o), tek bir grup ve diğerleri, yani ne sahip ne de grubun üyesi olan her hesap. Her sınıf bağımsız olarak okuma, yazma ve çalıştırma alır:
- okuma (r) — bir dosyanın içeriğini görüntüleme veya bir dizinin girdilerini listeleme.
- yazma (w) — bir dosyayı değiştirme veya bir dizinde girdi ekleyip kaldırma.
- çalıştırma (x) — bir dosyayı program olarak çalıştırma veya bir dizine girme (
cdile).
İnsanları yanıltan püf nokta şu: bir dizinde bitler farklı bir anlam taşır. r size adları listeleme izni verir, w içeride girdi oluşturup silme izni verir ve x içinden geçip alttaki dosyalara ulaşma, böylece cd ile girme izni verir. Bir dizinde x olmadan r tutabilir, üzerinde ls çalıştırabilir ve girmeye çalıştığınız anda yine de “Permission denied” alabilirsiniz. Dizinlerin 644 değil de 755 olmasının nedeni tam olarak budur.
Bir ls -l satırını okuma
ls -l çalıştırın; her girdi on karakterlik bir blokla başlar:
$ ls -l
-rw-r--r-- 1 jack staff 1400 Jul 17 10:00 index.html
drwxr-xr-x 5 jack staff 160 Jul 17 10:00 assets
Soldan sağa okuyun. İlk karakter dosya türüdür, bir izin değil: - sıradan bir dosya, d bir dizin, l bir sembolik bağlantı, c veya b bir aygıt, p adlandırılmış bir boru, s bir sokettir. Sonraki dokuz karakter üç rwx grubudur: sahip, grup, diğerleri. Yani -rw-r--r--, sahibin okuyup yazdığı (rw-), grup ve diğerlerinin ise yalnızca okuduğu (r-- r--) sıradan bir dosyadır, ki bu da 644’tür. drwxr-xr-x ise 755 olan bir dizindir.
Bazı sistemler dokuz bitten sonra bir işaret ekler. Sondaki bir . bir SELinux bağlamını, bir + temel bitlerin ötesinde kural ekleyen bir ACL’yi ve macOS’ta bir @ genişletilmiş öznitelikleri belirtir. Bunların hiçbiri sekizliği değiştirmez. İşareti göz ardı edip dokuz karakteri okuyun.
Sekizlik gösterim: 755 nasıl rwxr-xr-x olur
Sekizlik dosya izinleri, her iznin ikinin bir kuvveti olması sayesinde çalışır:
- okuma = 4
- yazma = 2
- çalıştırma = 1
Bir sınıfın tuttuğu bitleri toplayın, o sınıfın rakamını elde edersiniz. rwx şu eder: 4 + 2 + 1 = 7. r-x şu eder: 4 + 1 = 5. r-- ise 4’tür. Böylece rwxr-xr-x, üçerli olarak, 7 5 5 okunur. Aynısını rw-r--r-- için yapın; 4 + 2, 4, 4 → 644 elde edersiniz. Bütün numara bundan ibaret; sekizlik izinlerde üç bağımsız toplamdan başka bir şey yoktur.
Bir bakışta 0–7 izin rakamları
| Rakam | İkili | İzinler |
|---|---|---|
| 0 | 000 | İzin yok |
| 1 | 001 | Yalnızca çalıştırma |
| 2 | 010 | Yalnızca yazma |
| 3 | 011 | Yazma + çalıştırma |
| 4 | 100 | Yalnızca okuma |
| 5 | 101 | Okuma + çalıştırma |
| 6 | 110 | Okuma + yazma |
| 7 | 111 | Okuma + yazma + çalıştırma |
Sekizlik yalnızca 8 tabanıdır, dolayısıyla her rakam bir sonraki sınıfa taşmadan üç biti paketler. Konumsal aritmetik biraz pas tuttuysa, sayı tabanı dönüştürücü 8 tabanının, her izin rakamının yaptığı gibi ikiliye nasıl eşlendiğini gösterir.
chmod 755 vs 644 vs 777: gerçekten yazacağınız modlar
chmod 755 vs 644 vs 777 sorusuna şu karşılaştırma doğrudan yanıt verir:
| Sekizlik | Sembolik | Sahip | Grup | Diğerleri | Tipik kullanım | Risk |
|---|---|---|---|---|---|---|
| 644 | rw-r--r-- | okuma/yazma | okuma | okuma | Sıradan dosyalar | Güvenli varsayılan |
| 755 | rwxr-xr-x | tümü | okuma/çalıştırma | okuma/çalıştırma | Dizinler, betikler | Güvenli varsayılan |
| 600 | rw------- | okuma/yazma | — | — | Özel dosyalar, anahtarlar | Çok güvenli |
| 700 | rwx------ | tümü | — | — | Özel dizinler | Çok güvenli |
| 775 | rwxrwxr-x | tümü | tümü | okuma/çalıştırma | Grup paylaşımlı dizinler | Grup yazabilir |
| 777 | rwxrwxrwx | tümü | tümü | tümü | (kaçının) | Herkese açık yazma |
755 ile 644 arasındaki fark tek bir bittir: çalıştırma. Dizinlerin, betiklerin ve ikili dosyaların girilebilmesi veya çalıştırılabilmesi için x gerekir, bu yüzden 755’te dururlar. Bir HTML sayfası, bir görsel veya bir yapılandırma gibi sıradan bir dosyanın çalıştırılabilir olmasının hiçbir nedeni yoktur, bu yüzden 644’te kalır. İkisini karıştırmak, günlük izin hatalarının çoğunun arkasındaki nedendir.
777 neden tehlikeli. Ele geçirilmiş bir servis hesabı ya da kaçırılmış bir web işlemi de dahil olmak üzere, makinedeki her hesaba yazma erişimi verir. Herkese açık yazma iznine sahip bir web kök dizini, tahrif edilmiş bir siteye veya enjekte edilmiş kötü amaçlı yazılıma giden ders kitabı örneği yoldur, çünkü ona ulaşan herkes kodunuzun üzerine yazabilir. Bir forum gönderisi size bir şeyi “çalışması için” chmod 777 yapmanızı söylediğinde, sorun neredeyse her zaman aşağıda ele alınan sahipliktir.
1777 istisnası. /tmp bilerek herkese açık yazılabilirdir, ancak bir koruma ile. Mod 1777, herkesin dosya oluşturmasına izin verirken kullanıcıların sahibi olmadıkları dosyaları silmesini veya yeniden adlandırmasını engelleyen sticky bit’i ekler. Paylaşımlı geçici dizinlerin düz 777’de değil de 1777’de güvenli olmasının nedeni budur. chmod hesaplayıcı içine 777 yazın; risk paneli bunu anında işaretler, 1777 ise standart paylaşımlı dizin deseni olarak tanınır.
Sayısal vs sembolik mod
chmod aynı bitleri iki farklı şekilde alır.
Sayısal (mutlak) mod, sonucun tamamını belirtir. chmod 755 file, daha önce ne olduğuna bakmaksızın dokuz bitin tamamını rwxr-xr-x olarak ayarlar. Bilinen-iyi bir durumu dayattığınız betiklerde ve dağıtımda isteyeceğiniz şey budur.
Sembolik (göreli) mod bir değişikliği tanımlar. chmod u+x file tek bir biti değiştirir (sahip için çalıştırmayı ekler) ve geri kalan her şeyi olduğu gibi bırakır. chmod u=rwx,go=rx file sınıfların tamamını açıkça ayarlar. Sembolik mod, modun tümünü yeniden belirtmenin aşırı olacağı tek seferlik ayarlamalara uygundur.
# Numeric: overwrite the whole mode
$ chmod 644 report.txt
# Symbolic: change only what you name
$ chmod u+x deploy.sh # add execute for the owner
$ chmod go-w shared.conf # remove write from group and others
$ chmod u=rw,go=r notes.md # set each class explicitly → 644
Sembolik modda bir tuzak: sınıf belirtmeden yazılan chmod +x, umask’ınız tarafından süzülür. Yaygın olan umask 022 ile chmod +x script.sh, çalıştırmayı herkes için ekler, dolayısıyla chmod a+x ile eşleşir. 077 gibi daha katı bir umask altında yalnızca sahibi etkiler. Garantili bir sonuç istediğinizde sınıfı belirtin: yalnızca sahip için u+x, herkes için a+x.
Özel izinler: setuid, setgid ve sticky bit
Dokuz standart bitin ötesinde, dördüncü ve baştaki bir sekizlik rakam setuid, setgid ve sticky bit olmak üzere üç özel modu taşır:
- setuid = 4000 — program, çağıranın değil, dosya sahibinin ayrıcalıklarıyla çalışır. root’a ait olan
passwd, sıradan bir kullanıcının root’a ait bir parola veritabanını güncellemesine işte bu şekilde izin verir. - setgid = 2000 — grup için aynı fikir. Bir dizinde ayrıca yeni dosyaların dizinin grubunu miras almasını sağlar; bu da paylaşımlı bir projenin tutarlı biçimde grup mülkiyetinde kalmasını sürdürür.
- sticky bit = 1000 — paylaşımlı bir dizinde silmeyi kısıtlar, böylece kullanıcılar yalnızca kendi dosyalarını kaldırabilir. 1777’deki
/tmpbunun standart örneğidir.
$ chmod 4755 /usr/local/bin/mytool # setuid
$ chmod 2775 /srv/shared # setgid on a shared dir
$ chmod 1777 /tmp # sticky bit
$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 59976 Jul 17 10:00 /usr/bin/passwd
s/S ve t/T büyük-küçük harf kuralı
ls -l içinde özel bitler çalıştırma yuvasını yeniden kullanır ve büyük-küçük harf, çalıştırmanın da ayarlı olup olmadığını söyler. Küçük harf s (setuid/setgid) veya t (sticky), özel bitin ve çalıştırmanın açık olduğu anlamına gelir; bu normal durumdur. Büyük harf S veya T, özel bitin ayarlı ama çalıştırmanın ayarlı olmadığı anlamına gelir; bu genellikle bir hatadır, çünkü çalıştırılamaz bir dosyadaki özel bit hiçbir işe yaramaz.
rwsr-xr-x (4755, çalıştırma ile setuid, doğru) ile rwSr--r-- (4644, çalıştırma olmadan setuid, şüpheli) karşılaştırın. Büyük harf S veya T gördüğünüzde, birinin çalıştırma bitini yanlışlıkla düşürüp düşürmediğini kontrol edin.
Kimsenin bahsetmediği GNU dizin tuzağı
Neredeyse her öğreticinin yanlış anladığı bir platform farkı var. Linux (GNU coreutils) üzerinde sayısal bir chmod 755 dir, o dizindeki mevcut bir setuid veya setgid bitini temizlemez. Onu korur. Bir dizin zaten 2755 (setgid) ise ve temiz bir sayfa bekleyerek chmod 755 çalıştırırsanız, setgid biti kalır ve dizin gerçekte hâlâ 2755’tir.
Onu gerçekten temizlemek için açık olun:
$ chmod 00755 dir # five-digit form zeroes the special digit
$ chmod =755 dir # = clears every bit not listed
$ chmod u-s,g-s dir # remove setuid and setgid by name
BSD ve macOS bunun tersini yapar: sayısal bir chmod 755 özel bitleri varsayılan olarak temizler. Yani izinleri chmod -R 755 ile “sıfırlayan” bir dağıtım betiği, bir Mac dizüstü bilgisayarda bir Linux sunucusundakinden farklı davranır. Bu koruma, GNU coreutils kılavuzu içinde belgelenmiştir; şüphe duyduğunuzda, sonucun her yerde aynı olması için beş haneli veya u-s,g-s biçimini kullanın.
umask: yeni oluşturulan dosyaların aldığı izinler
Her dosyayı elle chmod etmezsiniz; çoğu, modunu oluşturma anında alır ve buna umask karar verir. Bir umask, kapatılacak bir bit kümesidir. Yeni dosyalar taban 666’dan, yeni dizinler ise 777’den başlar ve umask bitleri maskeleyerek kaldırır:
effective mode = base & ~umask
Dosyalar 777’den değil 666’dan başlar, çünkü yepyeni bir dosyanın varsayılan olarak çalıştırılabilir olmasının hiçbir gereği yoktur. O bit, chmod +x ile bilinçli olarak eklenir.
| umask | Yeni dosyalar | Yeni dizinler | Anlamı |
|---|---|---|---|
| 022 | 644 | 755 | Varsayılan — diğerleri okur, yazmaz |
| 077 | 600 | 700 | Sahibe özel |
| 002 | 664 | 775 | Grup iş birliği |
Varsayılan 022’yi elle hesaplayın: 666 & ~022 = 666 & 755 = 644; 777 & ~022 = 755. Mevcut değerinizi umask ile kontrol edin ve hiçbir şeyin grup veya herkes tarafından okunabilir olmaması gereken bir makinede, diyelim ki umask 077 ile bir oturum varsayılanı ayarlayın.
chmod vs chown: izinler mi, sahiplik mi
chmod ve chown farklı sorulara yanıt verir. chmod, sahibin, grubun ve diğerlerinin ne yapabileceğini değiştirir: izin bitlerini. chown, sahibin ve grubun gerçekte kim olduğunu değiştirir. 777’ye uzanmak, çoğu zaman izin kılığına girmiş bir sahiplik sorunudur.
Klasik durum: www-data olarak çalışan bir web sunucusu, yükleme dizinine yazamıyor. chmod 777, tüm dünyanın yazmasına izin vererek hatayı ortadan kaldırır ve geride bir açık bırakır. Doğru çözüm, sahipliği ona ihtiyaç duyan işleme atar:
# Wrong: opens the directory to every account on the box
$ sudo chmod -R 777 /var/www/uploads
# Right: give it to the web user, keep a tight mode
$ sudo chown -R www-data:www-data /var/www/uploads
$ sudo find /var/www/uploads -type d -exec chmod 755 {} +
$ sudo find /var/www/uploads -type f -exec chmod 644 {} +
Bir şey beklenmedik biçimde okunamaz olduğunda tanı sırası: önce kimin sahibi olduğunu görmek için ls -l çalıştırın, ikinci olarak modu çözün, ardından çözümün chown mu, chmod mu, yoksa bir kullanıcıyı bir gruba eklemek mi olduğuna karar verin.
Özyinelemeli izinler doğru şekilde
Toptancı bir chmod -R 755 ., her sıradan dosyayı çalıştırılabilir olarak işaretler; bu, en iyi ihtimalle gürültü, en kötü ihtimalle sessiz bir risktir. Bunun yerine türe göre özyineleyin:
$ find . -type d -exec chmod 755 {} + # directories → 755
$ find . -type f -exec chmod 644 {} + # files → 644
GNU chmod, büyük X ile tek satırlık bir kestirme sunar; bu, çalıştırmayı yalnızca dizinlere ve zaten bir çalıştırma biti taşıyan dosyalara ekler:
$ chmod -R u+rwX,go+rX .
chmod hesaplayıcı, seçtiğiniz herhangi bir mod için yalnızca dizinlere ve yalnızca dosyalara yönelik find komutları üretir; böylece düz bir -R’ye uzanmak yerine doğru ayrımı kopyalayabilirsiniz.
Linux dosya izinleri için en iyi uygulamalar
- İşe yarayan en az ayrıcalığı verin. En sıkı moddan başlayın ve yalnızca bozulanı açın. Fazladan her yazma biti bir saldırı yüzeyidir.
- Varsayılan olarak 755 dizinler içinde 644 dosyalar tutun. Bu eşleştirme neredeyse her web kökü ve depo teslim alması için işe yarar. Sıradan dosyaların nadiren çalıştırmaya ihtiyacı olur; dizinlerin ise her zaman vardır.
- Bir sunucunun ulaşabileceği hiçbir şeyde 777 bırakmayın. Birkaç hesabın yazması gerekiyorsa, modu dünyaya açmak yerine 775 veya 2775 ile paylaşımlı bir grup kullanın (setgid, grup mülkiyetini tutarlı tutar).
- SSH özel anahtarlarını 600’de tutun, veya kesinleştiğinde 400’de. OpenSSH, grup veya herkes tarafından okunabilen özel anahtarları düpedüz reddeder. Anahtar dosyası gereksiniminin tam hâli için OpenSSH kılavuzu belgesine bakın. Açık anahtarlar ve
authorized_keysiçin 644 sorun değildir. - Dosya modlarını başka denetimlerle katmanlandırın. İzinler temeldir; bir klasör için giriş gerektiğinde bunları htpasswd oluşturucu ile temel kimlik doğrulamayla eşleştirin ve dosya modlarını web güvenliği temelleri rehberimizde ele alınan tablonun bir parçası olarak görün.
SSS
drwxr-xr-x başındaki d veya l ne anlama gelir?
Bir ls -l satırındaki ilk karakter dosya türüdür, bir izin değil. d bir dizini, l bir sembolik bağlantıyı, - sıradan bir dosyayı, c veya b bir aygıtı, p adlandırılmış bir boruyu ve s bir soketi işaretler. Yalnızca ondan sonraki dokuz karakter gerçek okuma, yazma ve çalıştırma bitlerini kodlar.
İzinlerde küçük harf s ile büyük harf S arasındaki fark nedir?
Küçük harf s ve büyük harf S, ikisi de setuid veya setgid bitinin ayarlı olduğu anlamına gelir. Küçük harf s, çalıştırmanın da ayarlı olduğu anlamına gelir; bu normal çalışma durumudur. Büyük harf S, özel bitin açık ama çalıştırmanın kapalı olduğu anlamına gelir (4644’te olduğu gibi); bu neredeyse her zaman bir yapılandırma hatasıdır, çünkü çalıştırma olmadan bir özel bit anlamsızdır.
umask nedir ve varsayılan izinlere nasıl karar verir?
umask, bir dosya oluşturulduğunda kapatılan izin bitleri kümesidir. Yeni dosyalar taban 666’dan, dizinler 777’den başlar, ardından effective = base & ~umask maskelenen bitleri kaldırır. Varsayılan 022; 644 dosyalar ve 755 dizinler verir; kendinizinkini görmek için umask, daha özel bir varsayılan için umask 077 çalıştırın.
644 veya 755 yerine 400 veya 700’ü ne zaman kullanmalıyım?
Bir dosya ya da dizin tamamen özel kalmalıysa 400 veya 700 kullanın. 400 (r--------), asla düzenlemediğiniz, kesinleşmiş bir SSH özel anahtarı için ideal, salt okunur özel bir dosyadır. 700 (rwx------), ~/.ssh veya ~/.gnupg gibi yalnızca sahibin girebileceği bir dizindir. 644 ve 755’in aksine, başka hiç kimseye hiçbir şey vermezler.
Bir dizini neden listeleyebiliyorum ama içine cd ile giremiyorum?
Dizin izinleri listelemeyi geçişten ayırır: r biti adları listemenize, x biti girmenize izin verir. r olan ama x olmayan bir dizin (644 bir dizin), adlarını ls altında gösterir ama cd’yi ve içindeki dosyalara herhangi bir erişimi engeller. Girilebilir hâle getirmek için çalıştırmayı ekleyin (755 yapın).
Dosya izinleri macOS’ta Linux’takiyle aynı çalışır mı?
Her ikisi de POSIX’i izlediği için, dosya izinleri ikisinde de aynı temel rwx ve sekizlik modeli paylaşır, ancak ayrıntılar farklıdır. BSD ve macOS, sayısal bir chmod işleminde bir dizinin setuid/setgid’ini varsayılan olarak temizler, Linux ise korur. Bir modu okumak da farklıdır: Linux’ta stat -c '%a' file, macOS’ta stat -f '%Lp' file; macOS ise ACL’ler ile dosya bayraklarını da ekler.
Dosya izinlerini komut satırı olmadan değiştirebilir miyim?
İzinleri bir terminal olmadan hesaplayıp çözebilirsiniz. Ücretsiz chmod hesaplayıcı, bir izin matrisini işaretlemenize, bir sekizlik değer yazmanıza veya bir ls -l satırı yapıştırmanıza olanak tanır, ardından tam chmod komutunu geri kopyalar. Bunu gerçek bir dosyaya uygulamak yine de sunucuda o komuta, ya da izin alanlarını gösteren bir GUI veya FTP istemcisine ihtiyaç duyar.