Samba ile Linux-Windows Dosya Paylaşımı

Karma ortamlarda çalışan her sysadmin’in er ya da geç karşılaştığı problem şudur: Windows kullanıcıları Linux sunucusundaki dosyalara nasıl erişecek, ya da tam tersi? Bu sorunun en olgun ve güvenilir cevabı neredeyse her zaman Samba oluyor. Samba, SMB/CIFS protokolünü Linux üzerinde implement eden açık kaynaklı bir yazılım ve onlarca yıldır production ortamlarında canla başla çalışıyor. Bu yazıda Samba’yı sıfırdan kurup yapılandıracağız, güvenlik ayarlarını doğru yapacağız ve gerçek dünya senaryolarına uygun paylaşım yapıları oluşturacağız.

Samba Nedir ve Neden Kullanmalısınız?

Samba, temelde SMB (Server Message Block) protokolünün açık kaynak implementasyonudur. Windows makineler birbirleriyle dosya paylaşırken bu protokolü kullanır. Samba sayesinde Linux sunucunuz Windows ağında sanki bir Windows dosya sunucusuymuş gibi görünür. Kullanıcılar Explorer’dan sunucuya bağlanabilir, dosya sürükleyip bırakabilir, klasörleri network drive olarak map edebilir.

Peki neden NFS değil de Samba? Eğer ortamınızda sadece Linux makineler varsa NFS kesinlikle daha performanslı ve daha az overhead’li bir seçenek. Ama Windows istemcileriniz varsa ya da karma bir ortam yönetiyorsanız, Samba vazgeçilmez oluyor. Active Directory entegrasyonu, kullanıcı bazlı izinler ve Windows’un nativeolarak tanıması büyük avantajlar.

Kurulum

Debian/Ubuntu tabanlı sistemlerde kurulum son derece basit:

sudo apt update
sudo apt install samba samba-common-bin -y

# Servis durumunu kontrol et
sudo systemctl status smbd
sudo systemctl status nmbd

Red Hat/CentOS/Rocky Linux için:

sudo dnf install samba samba-common samba-client -y

# Servisleri başlat ve enable et
sudo systemctl enable --now smbd nmbd
sudo systemctl enable --now smb nmb

Kurulumdan sonra yapılandırma dosyasının yedeğini almayı unutmayın. Bu alışkanlık sizi bir gün kurtaracak:

sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.backup

smb.conf Dosyasını Anlamak

Samba’nın tüm yapılandırması /etc/samba/smb.conf dosyasında toplanır. Bu dosya ini formatındadır ve iki ana bölümden oluşur: [global] bölümü ve paylaşım tanımları.

[global] bölümünde sunucunuzun genel davranışını belirlersiniz. Paylaşım tanımlarında ise hangi dizinin, kimlerle, hangi izinlerle paylaşılacağını yazarsınız.

Yapılandırmayı doğrulamak için testparm komutu kullanılır. Herhangi bir değişiklik yaptıktan sonra bu komutu çalıştırın:

sudo testparm
sudo testparm -s  # Sessiz mod, sadece aktif ayarları gösterir

Temel Yapılandırma: Basit Dosya Paylaşımı

En yaygın senaryo ile başlayalım: Bir dizini ağdaki herkese salt okunur ya da yazılabilir olarak açmak. Önce paylaşılacak dizini oluşturup izinlerini ayarlayalım:

# Paylaşım dizini oluştur
sudo mkdir -p /srv/samba/public
sudo chmod 777 /srv/samba/public
sudo chown nobody:nogroup /srv/samba/public

Şimdi /etc/samba/smb.conf dosyasını düzenleyelim:

sudo nano /etc/samba/smb.conf

Dosyanın içeriği şöyle olmalı:

[global]
   workgroup = WORKGROUP
   server string = Dosya Sunucusu
   netbios name = FILESERVER
   security = user
   map to guest = bad user
   dns proxy = no
   log file = /var/log/samba/log.%m
   max log size = 1000

[public]
   comment = Genel Paylaşım Klasörü
   path = /srv/samba/public
   browseable = yes
   writable = yes
   guest ok = yes
   guest only = yes
   create mask = 0664
   directory mask = 0775

Yapılandırmayı kaydedip servisi yeniden başlatın:

sudo testparm
sudo systemctl restart smbd nmbd

Windows tarafından erişmek için Explorer adres çubuğuna \SUNUCU-IP ya da \FILESERVER yazmanız yeterli.

Kullanıcı Tabanlı Güvenli Paylaşım

Production ortamlarında guest erişim pek tercih edilmez. Kullanıcı adı ve şifre ile erişilen güvenli paylaşımlar çok daha yaygın. Samba kendi kullanıcı veritabanını tutar, bu nedenle önce sistem kullanıcısı oluşturup sonra bunu Samba’ya ekleriz:

# Sistem kullanıcısı oluştur (shell olmadan, sadece dosya erişimi için)
sudo useradd -M -s /sbin/nologin ahmet
sudo useradd -M -s /sbin/nologin ayse

# Samba şifresi belirle
sudo smbpasswd -a ahmet
sudo smbpasswd -a ayse

# Kullanıcıları aktif et
sudo smbpasswd -e ahmet
sudo smbpasswd -e ayse

Kullanıcıların paylaşım dizini:

sudo mkdir -p /srv/samba/private
sudo chown root:root /srv/samba/private
sudo chmod 770 /srv/samba/private

smb.conf dosyasına güvenli paylaşım ekleyin:

[private]
   comment = Yetkili Kullanıcı Alanı
   path = /srv/samba/private
   valid users = ahmet ayse
   browseable = yes
   writable = yes
   read only = no
   create mask = 0660
   directory mask = 0770
   guest ok = no

Grup Tabanlı İzin Yönetimi

Büyük ortamlarda kullanıcı listesini tek tek yazmak yerine Linux gruplarını kullanmak çok daha sürdürülebilir bir yaklaşım. Mesela muhasebe departmanı için özel bir paylaşım oluşturalım:

# Grup oluştur
sudo groupadd muhasebe

# Kullanıcıları gruba ekle
sudo usermod -aG muhasebe ahmet
sudo usermod -aG muhasebe fatma

# Paylaşım dizinini grupla ilişkilendir
sudo mkdir -p /srv/samba/muhasebe
sudo chown root:muhasebe /srv/samba/muhasebe
sudo chmod 2770 /srv/samba/muhasebe
# 2770: setgid bit, yeni dosyalar da grup sahibine ait olur

smb.conf dosyasına eklenecek bölüm:

[muhasebe]
   comment = Muhasebe Departmanı
   path = /srv/samba/muhasebe
   valid users = @muhasebe
   browseable = no
   writable = yes
   create mask = 0660
   directory mask = 2770
   guest ok = no
   write list = @muhasebe

@muhasebe: @ işareti Linux grubunu ifade eder. Bu şekilde gruba yeni kullanıcı eklediğinizde smb.conf dosyasını düzenlemenize gerek kalmaz.

browseable = no: Paylaşım ağda listelenmez ama doğrudan path yazarak erişilebilir. Gizli departman klasörleri için güzel bir trick.

write list: Sadece bu listedekiler yazma iznine sahip, diğer valid users salt okunur erişir.

Kullanıcıya Özel Home Dizini Paylaşımı

Her kullanıcının kendi home dizinine Samba üzerinden erişmesi sık kullanılan bir senaryo. Samba bunu [homes] bölümüyle neredeyse otomatik halleder:

[homes]
   comment = Kişisel Dosyalar
   browseable = no
   read only = no
   create mask = 0700
   directory mask = 0700
   valid users = %S

%S: Bağlanan kullanıcının adını temsil eden Samba değişkeni. Ahmet bağlandığında /home/ahmet dizinini görür, Ayşe bağlandığında kendi home’unu görür. Zarif ve pratik.

Güvenlik Duvarı Ayarları

Samba birden fazla port kullanır. Güvenlik duvarını doğru yapılandırmazsanız bağlantı sorunları yaşarsınız:

# UFW ile (Ubuntu/Debian)
sudo ufw allow samba
sudo ufw status

# firewalld ile (CentOS/Rocky)
sudo firewall-cmd --permanent --add-service=samba
sudo firewall-cmd --reload
sudo firewall-cmd --list-services

# Manuel port açma (iptables)
sudo iptables -A INPUT -p tcp --dport 445 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 139 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 137 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 138 -j ACCEPT

Samba’nın kullandığı portlar:

  • 137/UDP: NetBIOS isim servisi
  • 138/UDP: NetBIOS datagram servisi
  • 139/TCP: NetBIOS session servisi (eski SMB)
  • 445/TCP: Microsoft-DS (modern SMB, NetBIOS olmadan)

SELinux ile Uyum

CentOS, Rocky Linux veya RHEL kullanıyorsanız SELinux devredeyse Samba paylaşımlarının çalışması için ek adımlar gerekir:

# SELinux durumunu kontrol et
getenforce
sestatus

# Samba için SELinux boolean'larını aktif et
sudo setsebool -P samba_enable_home_dirs on
sudo setsebool -P samba_export_all_rw on

# Paylaşım dizinine SELinux context ata
sudo chcon -t samba_share_t /srv/samba/public -R
# Ya da kalıcı olarak:
sudo semanage fcontext -a -t samba_share_t "/srv/samba/public(/.*)?"
sudo restorecon -Rv /srv/samba/public

SELinux’u tamamen kapatmak yerine bu şekilde doğru context’i atamak çok daha güvenli bir yaklaşım. Production’da SELinux’u disable etmek kötü bir pratik.

Samba İstemci Kullanımı (Linux Tarafından Erişim)

Linux makinelerden Samba paylaşımlarına bağlanmak için smbclient kullanabilirsiniz:

# Paylaşımları listele
smbclient -L //192.168.1.100 -U ahmet

# Paylaşıma bağlan (interaktif mod)
smbclient //192.168.1.100/public -U ahmet

# Dosya kopyala
smbclient //192.168.1.100/muhasebe -U ahmet -c "get rapor.xlsx /tmp/rapor.xlsx"

# Mount et (kalıcı erişim için)
sudo mount -t cifs //192.168.1.100/public /mnt/samba -o username=ahmet,password=sifre,uid=1000,gid=1000

# fstab ile kalıcı mount
echo "//192.168.1.100/public /mnt/samba cifs credentials=/etc/samba/.credentials,uid=1000,gid=1000,_netdev 0 0" | sudo tee -a /etc/fstab

Credentials dosyası oluşturun (şifreyi fstab’a yazmayın):

sudo nano /etc/samba/.credentials

İçeriği:

username=ahmet
password=gizlisifre
domain=WORKGROUP
sudo chmod 600 /etc/samba/.credentials

Log Yönetimi ve Sorun Giderme

Samba log dosyaları /var/log/samba/ altında tutulur. Her makine için ayrı log dosyası oluşturulur:

# Genel log
tail -f /var/log/samba/log.smbd

# Belirli bir makine için log
tail -f /var/log/samba/log.WINDOWS-PC

# Aktif bağlantıları görüntüle
sudo smbstatus

# Aktif bağlantıları ve kilitleri göster
sudo smbstatus -L
sudo smbstatus -S

# NetBIOS isimlerini sorgula
nmblookup -A 192.168.1.100

Bağlantı sorunlarında debug seviyesini artırabilirsiniz:

# smb.conf'ta global bölümüne ekle
log level = 3

# Servisi yeniden başlat ve loglara bak
sudo systemctl restart smbd
tail -f /var/log/samba/log.smbd

Gerçek Dünya Senaryosu: Şirket Dosya Sunucusu

Küçük-orta ölçekli bir şirkette tipik bir yapı oluşturalım. IT, Muhasebe ve Genel olmak üç bölüm var ve her birinin kendi alanı olacak:

# Dizin yapısını oluştur
sudo mkdir -p /srv/fileserver/{genel,it,muhasebe,yedek}

# Grupları oluştur
sudo groupadd it-dept
sudo groupadd muhasebe-dept

# Dizin izinlerini ayarla
sudo chown root:root /srv/fileserver/genel
sudo chmod 777 /srv/fileserver/genel

sudo chown root:it-dept /srv/fileserver/it
sudo chmod 2770 /srv/fileserver/it

sudo chown root:muhasebe-dept /srv/fileserver/muhasebe
sudo chmod 2770 /srv/fileserver/muhasebe

Kapsamlı smb.conf yapılandırması:

[global]
   workgroup = SIRKET
   server string = Sirket Dosya Sunucusu v%v
   netbios name = FILESERVER
   security = user
   encrypt passwords = yes
   smb passwd file = /etc/samba/smbpasswd
   log file = /var/log/samba/log.%m
   max log size = 5000
   log level = 1
   server min protocol = SMB2
   ntlm auth = ntlmv2-only
   map to guest = never
   invalid users = root

[genel]
   comment = Tum Calisanlara Acik Alan
   path = /srv/fileserver/genel
   browseable = yes
   writable = yes
   guest ok = no
   valid users = @it-dept @muhasebe-dept
   create mask = 0664
   directory mask = 0775

[it]
   comment = IT Departmani - Yetkisiz Giris Yasaktir
   path = /srv/fileserver/it
   browseable = no
   writable = yes
   valid users = @it-dept
   read only = no
   create mask = 0660
   directory mask = 2770

[muhasebe]
   comment = Muhasebe Departmani
   path = /srv/fileserver/muhasebe
   browseable = no
   writable = yes
   valid users = @muhasebe-dept
   read only = no
   create mask = 0660
   directory mask = 2770

[homes]
   comment = Kisisel Dizin
   browseable = no
   writable = yes
   valid users = %S
   create mask = 0700
   directory mask = 0700

Önemli güvenlik parametreleri:

  • server min protocol = SMB2: SMB1 protokolünü devre dışı bırakır. SMB1 çok eski ve güvensiz, WannaCry bu protokolü kullanmıştı.
  • ntlm auth = ntlmv2-only: Sadece NTLMv2 kimlik doğrulamasına izin verir.
  • invalid users = root: Root hesabıyla Samba üzerinden giriş yapılamaz.
  • map to guest = never: Başarısız girişler guest olarak yönlendirilmez.

Performans Optimizasyonu

Büyük dosyalar transferi ya da yoğun kullanım durumunda bazı ayarlar işe yarar:

[global]
   # Socket seçenekleri
   socket options = TCP_NODELAY IPTOS_LOWDELAY SO_RCVBUF=131072 SO_SNDBUF=131072
   
   # Read/Write boyutları
   read raw = yes
   write raw = yes
   max xmit = 65535
   
   # Oplocks - dosya kilitleme performansı
   oplocks = yes
   level2 oplocks = yes
   
   # Async I/O
   aio read size = 16384
   aio write size = 16384

Kullanıcı Yönetimi için Pratik Komutlar

Günlük operasyonlarda kullanacağınız komutlar:

# Tüm Samba kullanıcılarını listele
sudo pdbedit -L

# Kullanıcı detaylarını gör
sudo pdbedit -L -v ahmet

# Kullanıcı şifresini değiştir
sudo smbpasswd ahmet

# Kullanıcıyı devre dışı bırak (silinmeden)
sudo smbpasswd -d ahmet

# Kullanıcıyı yeniden aktif et
sudo smbpasswd -e ahmet

# Kullanıcıyı tamamen sil
sudo smbpasswd -x ahmet

Sonuç

Samba, doğru yapılandırıldığında production ortamında son derece güvenilir çalışan bir çözüm. Bu yazıda temel kurulumdan başlayıp güvenli kullanıcı yönetimine, SELinux uyumuna ve gerçek bir şirket senaryosuna kadar geniş bir yelpazeyi ele aldık.

Dikkat etmeniz gereken kritik noktaları özetleyelim: SMB1’i mutlaka kapatın, şifreyi hiçbir zaman fstab’a düz metin olarak yazmayın, credentials dosyalarının izinlerini 600 yapın, SELinux’u kapatmak yerine doğru context atayın ve production’a almadan önce testparm ile yapılandırmayı doğrulayın.

Samba kurulumu bir seferlik iş değil. Kullanıcı eklendiğinde, grup değiştiğinde, dizin yapısı büyüdüğünde düzenli bakım gerekiyor. Log dosyalarını takip etmek, smbstatus ile aktif oturumları kontrol etmek ve periyodik güvenlik güncellemelerini uygulamak bu bakımın parçası.

Daha karmaşık senaryolara, örneğin Active Directory’ye join etmeye ya da Kerberos ile entegrasyona geçmeyi planlıyorsanız, temel Samba yapısını iyi anlamak o süreçte size çok yardımcı olacak. Önce bunu sağlam kurun, sonra üstüne inşa edin.

Yorum yapın