Bash tools
TEKNİK REHBER BASH TOOLS GÜVENLİK · İZİNLER 2026

İzinler ve
sahiplik.

chmod, chown, umask, sudo. ls -l çıktısının her biti ne anlama gelir? SUID neden /usr/bin/passwd'ı güçlü kılar? SSH anahtarın neden 600 olmalı?

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)
    
DİZİN VE EXECUTE

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.

bash
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
    
- (ilk karakter)
regular dosya. d=dizin, l=symlink, b=block device, c=char device, p=FIFO, s=socket.
rwx (2-4)
sahip (user) izinleri.
rwx (5-7)
grup izinleri.
rwx (8-10)
diğerleri (other) izinleri.
sayı (link count)
hard link sayısı. Dizinler için en az 2 (. ve ..).
sahip grubu
dosyanın sahibi kullanıcı ve grup.

02 chmod — sembolik değiştirme

Sembolik form: kim, işlem, izin. Okunabilir ve mevcut durumdan bağımsız.

bash
# 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
-R ile chmod dikkat

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
    
bash
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!)
OktalSembolikYaygın kullanım
755rwxr-xr-xProgram, betik, umumi dizin
644rw-r--r--Metin dosyaları, config, HTML
600rw-------SSH özel anahtarı, parola dosyası
700rwx------~/.ssh dizini, kişisel betikler
775rwxrwxr-xOrtak proje dizini (gruba yazma)
664rw-rw-r--Grup içi paylaşılan dosya
640rw-r-----Config, log (sahip yazar, grup okur)

04 chown ve chgrp

Dosyanın sahibini veya grubunu değiştir.

bash
# 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ı
chown neden sudo gerektirir

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
    
bash
# 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)
022
varsayılan — dosya 644, dizin 755. Web sunucuları, ortak sistemler.
027
dosya 640, dizin 750. Diğer kullanıcılar hiçbir şey göremez. Sunucularda güvenli tercih.
077
dosya 600, dizin 700. Maksimum kısıtlama — sadece sahip. Gizli anahtarlar için idealdir.

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

bash
# 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 GÜVENLİK RİSKİ

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)

bash
# 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ı

bash
# 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
BitOktalSembolikEtki
SUID4000u+s (ls'de s)Dosya: sahibinin kimliğiyle çalışır
SGID2000g+s (ls'de s)Dosya: grubunun kimliğiyle çalışır; Dizin: içindeki yeni dosyalar grubu devralır
Sticky1000+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.

bash
# 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

bash
# 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
kullanıcı HOST=(çalıştıran_olarak) komutlar
sudoers kural formatı. ALL=her host. (ALL:ALL)=her kullanıcı:grup olarak. ALL=her komut.
NOPASSWD:
bu kural için parola sorma. CI/CD, otomasyon betikleri için.
%grup
kullanıcı yerine grup kuralı (% işareti ile başlar).
visudo olmadan sudoers düzenleme

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.

bash
# 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)
    
Hızlı düzeltme

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 visudo ile düzenle
  • SSH: ~/.ssh 700, özel anahtar 600, authorized_keys 600