00 Unix izin modeli
Her dosya ve dizinin üç özneye göre üç türde izni vardır.
Özneler: u = user (sahip) g = group o = other (diğer herkes) İzinler: r = read (4) w = write (2) x = execute (1) Dosya için: r → içeriği oku w → içeriği değiştir x → çalıştır (program veya betik) Dizin için: r → içindekileri listele (ls) w → dosya ekle/sil (mkdir, rm, mv içinde) x → içine gir, dosyalara eriş (cd, open)
Bir dizinde x olmadan r'a sahip olmak — listeleyebilirsin ama içine giremez, dosyaları açamazsın. Bir dizinde r olmadan x'e sahip olmak — içine girebilirsin ama ls çalışmaz (adını bilirsen açabilirsin). Dizine tam erişim için ikisi de gerekir.
01 ls -l çıktısını okumak
Her satır 7 ayrı bilgi taşır.
ls -la /etc/shadow /usr/bin/passwd ~/.ssh/
-rw-r----- 1 root shadow 1234 Apr 10 /etc/shadow
-rwsr-xr-x 1 root root 59K Apr 10 /usr/bin/passwd
drwx------ 2 ali ali 4096 Apr 10 /home/ali/.ssh/
- r w s r - x r - x 1 root root 59K /usr/bin/passwd
│ │ │ │ │ │ │ │ │
│ └───┘ └─┴─┘ └─┴─┘
│ u=rwx g=r-x o=r-x
│
└── dosya tipi: - = regular d = dir l = symlink
b = block c = char p = pipe s = socket
s → SUID bit (u+s): çalıştırıldığında dosyanın sahibi (root) olarak çalışır
02 chmod — sembolik değiştirme
Sembolik form: kim, işlem, izin. Okunabilir ve mevcut durumdan bağımsız.
# Sözdizimi: chmod [kim][+|-|=][izin] dosya
# Kim: u=user, g=group, o=other, a=all (hepsi)
# Ekle (+)
chmod u+x betik.sh # sahibi çalıştırabilsin
chmod g+w dosya.txt # gruba yazma ekle
chmod a+r dosya.txt # herkese okuma ekle
chmod go+rx dizin/ # grup ve diğerlere r+x ekle
# Kaldır (-)
chmod o-rwx gizli.txt # diğerlerinden her şeyi kaldır
chmod a-x dosya.txt # hiç kimse çalıştırmasın
# Tam ata (=)
chmod u=rw dosya.txt # sahip: tam olarak rw (x varsa kaldırır)
chmod go= dosya.txt # grup ve diğer: hiçbir izin (= sonrası boş)
# Özyinelemeli (-R)
chmod -R u+x scripts/ # dizin altındaki herkese +x
Dizinlere ve dosyalara aynı anda izin uygulanır. chmod -R 644 proje/ dizinlerin x bitini de kaldırır — artık cd yapamaz, içine giremezsin. Dosyalar için 644, dizinler için 755 ayrı ayrı set edilmeli: find proje/ -type f -exec chmod 644 {} + && find proje/ -type d -exec chmod 755 {} +
03 chmod — oktal değiştirme
Oktal form: üç bit grubunu tek sayıyla ifade et. Hızlı ve kesin.
r = 4 w = 2 x = 1
Sahip(u) Grup(g) Diğer(o)
rwx r-x r-x
4+2+1 4+0+1 4+0+1
= 7 = 5 = 5
→ 755
Sahip(u) Grup(g) Diğer(o)
rw- r-- r--
4+2+0 4+0+0 4+0+0
= 6 = 4 = 4
→ 644
Sahip(u) Grup(g) Diğer(o)
rw- --- ---
4+2+0 0+0+0 0+0+0
= 6 = 0 = 0
→ 600
chmod 755 betik.sh # rwxr-xr-x — çalıştırılabilir program
chmod 644 dosya.txt # rw-r--r-- — okunabilir veri dosyası
chmod 600 gizli.key # rw------- — sadece sahip okuyabilir (SSH key)
chmod 700 ~/.ssh/ # rwx------ — sadece sahip erişebilir (SSH dizini)
chmod 640 /etc/nginx/nginx.conf # rw-r----- — sahip yazar, grup okur
chmod 777 /tmp/paylas/ # rwxrwxrwx — herkese her şey (güvensiz!)
| Oktal | Sembolik | Yaygın kullanım |
|---|---|---|
| 755 | rwxr-xr-x | Program, betik, umumi dizin |
| 644 | rw-r--r-- | Metin dosyaları, config, HTML |
| 600 | rw------- | SSH özel anahtarı, parola dosyası |
| 700 | rwx------ | ~/.ssh dizini, kişisel betikler |
| 775 | rwxrwxr-x | Ortak proje dizini (gruba yazma) |
| 664 | rw-rw-r-- | Grup içi paylaşılan dosya |
| 640 | rw-r----- | Config, log (sahip yazar, grup okur) |
04 chown ve chgrp
Dosyanın sahibini veya grubunu değiştir.
# Sahibi değiştir
sudo chown ali dosya.txt
sudo chown 1001 dosya.txt # UID ile de yapılır
# Sahibi ve grubu birlikte değiştir (user:group)
sudo chown ali:developers dosya.txt
sudo chown www-data:www-data /var/www/html/
# Sadece grubu değiştir (:group veya chgrp)
sudo chown :developers dosya.txt
sudo chgrp developers dosya.txt # eşdeğer
# Özyinelemeli
sudo chown -R www-data:www-data /var/www/html/
# Symlink değil, symlink'in kendisini değiştir (-h)
sudo chown -h ali link_dosyası
Sadece root başka bir kullanıcıya sahiplik verebilir. Normal kullanıcı kendi dosyasının grubunu değiştirebilir (kendi üyesi olduğu gruba). Bu, bir kullanıcının dosyasını başka birinin adına yazarak sorumluluktan kaçmasını önler.
05 umask — yeni dosyaların varsayılan izni
umask, yeni oluşturulan dosyaların hangi izinlerle başlayacağını belirler.
Mantığı ters: umask kaldırılacak izinleri söyler. Dosya maksimum 666, dizin maksimum 777 ile başlar, umask bundan çıkarılır.
Dosya max: 6 6 6 (rw-rw-rw-)
umask: - 0 2 2 (----w--w-)
Sonuç: 6 4 4 (rw-r--r--) ← yeni dosyanın izni
Dizin max: 7 7 7 (rwxrwxrwx)
umask: - 0 2 2
Sonuç: 7 5 5 (rwxr-xr-x) ← yeni dizinin izni
# Mevcut umask'ı göster
umask # → 0022
umask -S # sembolik: u=rwx,g=rx,o=rx
# umask değiştir (sadece geçerli shell için)
umask 027 # → dosya 640, dizin 750 (diğerleri hiçbir şey göremez)
umask 077 # → dosya 600, dizin 700 (sadece sahip)
umask 022 # → varsayılan: dosya 644, dizin 755
# Kalıcı değiştirme: ~/.bashrc veya ~/.profile'a ekle
# umask 027
# Test et
umask 027 && touch test_dosyasi && ls -la test_dosyasi
# → -rw-r----- (640)
06 Özel bitler — SUID, SGID, sticky
İzin tablosuna eklenen üç özel bit, sıradan r/w/x'in ötesine geçer.
SUID (Set User ID) — dosyalar için
# ls -l çıktısında: -rwsr-xr-x (sahibin x yerine s)
ls -la /usr/bin/passwd
-rwsr-xr-x 1 root root 59640 /usr/bin/passwd
# SUID set et
chmod u+s dosya
chmod 4755 dosya # oktal: 4 = SUID
SUID ne yapar? Çalıştırıldığında, programın gerçek sahibinin kimliğiyle (root) çalışır. passwd'ı normal kullanıcı çalıştırır ama /etc/shadow'a yazma yetkisi root'a aittir. SUID, o geçici root yetkisini sağlar.
SUID root bit'li bir programda güvenlik açığı varsa, saldırgan root erişimi elde edebilir. Beklenmediyen SUID dosyaları tehlike işareti: find / -perm -4000 -type f 2>/dev/null ile sistemde mevcut SUID dosyalarını listele.
SGID (Set Group ID)
# Dosyada: grubun yetkisiyle çalışır (SUID'nin grup versiyonu)
chmod g+s dosya
chmod 2755 dosya # oktal: 2 = SGID
# Dizinde: altına oluşturulan dosyalar/dizinler aynı grubu devralır
mkdir proje/
chmod g+s proje/
chgrp developers proje/
# → proje/ altında kim dosya oluşturursa oluştursun, grubu "developers" olur
# → ekip projelerinde kullanışlı
Sticky bit — /tmp koruması
# Dizinde sticky bit: sadece sahibi silebilir
ls -la /tmp
drwxrwxrwt 17 root root /tmp
# t → sticky bit var (diğerlerin x yerine t)
# /tmp 1777 izinli: herkes yazabilir ama kendi dosyasını silebilir
# sticky bit olmasa, herkes herkesi dosyasını silebilirdi!
# Sticky bit set et
chmod +t /paylasim/
chmod 1777 /paylasim/ # oktal: 1 = sticky
| Bit | Oktal | Sembolik | Etki |
|---|---|---|---|
| SUID | 4000 | u+s (ls'de s) | Dosya: sahibinin kimliğiyle çalışır |
| SGID | 2000 | g+s (ls'de s) | Dosya: grubunun kimliğiyle çalışır; Dizin: içindeki yeni dosyalar grubu devralır |
| Sticky | 1000 | +t (ls'de t) | Dizin: yalnızca sahip silebilir (/tmp) |
07 sudo ve sudoers
sudo, belirli komutları root veya başka bir kullanıcı olarak çalıştırmana izin verir — tüm root şifresini vermeden.
# Tek komut root olarak çalıştır
sudo systemctl restart nginx
# Başka kullanıcı olarak çalıştır
sudo -u www-data ls /var/www/
# Root shell aç
sudo -s # root shell (HOME değişmez)
sudo -i # root login shell (HOME=/root, tam root ortamı)
# Parola önbelleğini temizle
sudo -k
# Bu kullanıcının neleri yapabileceğini listele
sudo -l
/etc/sudoers ve visudo
# Sudoers dosyasını her zaman visudo ile düzenle!
sudo visudo
# → sözdizimi hatasını kaydederek çıkışta yakalar
# /etc/sudoers sözdizimi örnekleri:
# ali her şeyi yapabilir (admin)
ali ALL=(ALL:ALL) ALL
# ali sadece nginx yeniden başlatabilir (parolasız)
ali ALL=(root) NOPASSWD: /usr/bin/systemctl restart nginx
# developers grubu belirli komutları çalıştırabilir
%developers ALL=(root) /usr/bin/apt, /usr/bin/systemctl
# ci-runner kullanıcısı belirli komutları parolasız çalıştırır
ci-runner ALL=(root) NOPASSWD: /usr/bin/docker, /usr/bin/kubectl
# /etc/sudoers.d/ — parça parça eklemek için
sudo visudo -f /etc/sudoers.d/developers
Hiçbir zaman sudoers'ı doğrudan nano/vim ile açma. Sözdizimi hatası sudoers'ı kullanılamaz kılar ve sudo çalışmayı durdurur — sisteme root erişimini kaybedersin. Çıkış yolu: başka bir terminalde açık root oturumu yoksa recovery mode gerekir.
08 Güvenlik örneği — SSH dizini
Neden SSH anahtarın 600, .ssh dizini 700 olmalı — teknik açıklama.
# Doğru SSH izinleri
chmod 700 ~/.ssh # rwx------
chmod 600 ~/.ssh/id_ed25519 # rw------- (özel anahtar)
chmod 644 ~/.ssh/id_ed25519.pub # rw-r--r-- (ortak anahtar)
chmod 600 ~/.ssh/authorized_keys # rw-------
chmod 644 ~/.ssh/known_hosts # rw-r--r--
chmod 600 ~/.ssh/config # rw------- (host bilgileri var)
Neden bu izinler?
sshd bağlantı kurulurken ~/.ssh/authorized_keys ve özel anahtar dosyalarının izinlerini kontrol eder. Eğer bu dosyalar başkaları tarafından okunabilir veya yazılabilirse, sshd onları güvensiz sayar ve tamamen yok sayar — anahtar tabanlı kimlik doğrulama çalışmaz.
~/.ssh/ 700 Sadece sahip girebilir
├── id_ed25519 600 Sadece sahip okuyabilir — ÖNEMLİ
├── id_ed25519.pub 644 Herkese okunabilir (paylaşılabilir)
├── authorized_keys 600 Sadece sahip okuyabilir
├── config 600 Hostname ve anahtar bilgileri
└── known_hosts 644 Host parmak izleri (paylaşılabilir)
SSH çalışmıyorsa ve "Permissions too open" hatası alıyorsan: chmod 700 ~/.ssh && chmod 600 ~/.ssh/id_ed25519 ~/.ssh/authorized_keys ~/.ssh/config
Hatırlanacaklar
ls -lçıktısı: tip + 3×3 bit (u/g/o × r/w/x), sahip, grup- Sembolik:
chmod u+x,chmod go-w,chmod a=r - Oktal: 755=rwxr-xr-x, 644=rw-r--r--, 600=rw------- , 700=rwx------
- Dizin execute = içine girebilme (cd, dosya açma) — read olmadan ls çalışmaz
chown user:group dosya→ sahip+grup, sudo gerekir- umask 022 → dosya 644, dizin 755 (varsayılan)
- SUID (4000): dosyanın sahibi olarak çalışır (passwd gibi)
- SGID dizin (2000): içindeki dosyalar grubu devralır
- Sticky bit (1000): sadece sahip silebilir (/tmp)
- Sudoers'ı her zaman
sudo visudoile düzenle - SSH: ~/.ssh 700, özel anahtar 600, authorized_keys 600