Samba Dosya Paylaşım Temel Kavramlar
Tags: cifs, kerberos, smb, samba
Published: 2021-11-05 06:59:38

## CIFS dosya paylaşımları oluşturun ve yapılandırın

### CIFS (Common Internet File System)

CIFS, bilgisayar kullanıcılarının kurumsal intranetler ve İnternet üzerinden dosya paylaşmalarının standart yoludur.  Kullanıcılara Linux'ler ve Windows tabanlı istemciler arasında sorunsuz dosya ve yazıcı servislerinin birlikte çalışabilirliğini sağlar. 

#### CIFS Kullanarak Linux'ta Windows Share Nasıl Oluşturulur

Windows paylaşımlarının Linux sistemlerinde nasıl oluşturulacağını açıklayacağım. 

1.CIFS Yardımcı Program Paketlerini Yükleme

Linux sistemine bir Windows paylaşımı eklemek için önce CIFS yardımcı program paketlerini yüklememiz gerekir.

```
sudo apt update 
sudo apt install cifs-utils
```

2.CIFS Windows Paylaşımını Oluşturma

Windows paylaşımının bağlanması, normal dosya sistemlerinin bağlanmasına benzer.

İlk olarak, Windows paylaşımı için bağlama noktası görevi görecek bir dizin oluşturuyoruz.

```
sudo mkdir /win_paylasim
```

Paylaşımı bağlamak için aşağıdaki komutu root veya sudo ayrıcalıklarına sahip kullanıcı olarak çalıştırın:

```
sudo mount -t cifs -o username=<kullanici>,domain=<sunucu> //<win-share-ip>/<paylasim-klasörü> /win_paylasim/
```

Windows paylaşımının başarıyla bağlandığını doğrulamak için **df -h** komutunu kullanıyoruz.

```
Dosyasistemi          Boy  Dolu   Boş Kull% Bağlanılan yer
udev                 979M     0  979M    0% /dev
tmpfs                200M   15M  186M    8% /run
/dev/sda1             31G  2,5G   27G    9% /
tmpfs                998M   16K  998M    1% /dev/shm
tmpfs                5,0M     0  5,0M    0% /run/lock
tmpfs                998M     0  998M    0% /sys/fs/cgroup
tmpfs                200M     0  200M    0% /run/user/1000
//10.154.127.247/ss   32G   19G   13G   60% /win_paylasim**
```

Paylaşım bağlandıktan sonra, bağlama noktası, bağlanan dosya sisteminin kök dizini olur. Artık Paylaşılan dosyalarla yerel dosyalarmış gibi çalışabiliriz.

3.Otomatik Mount Etme

Paylaşım mount komutuyla manuel olarak bağlandığında, yeniden başlatmanın ardından devam etmez. Sistem başlangıcında nereye ve hangi dosya sisteminin bağlanacağını tanımlayan bir giriş listesi **/etc/fstab** dosyasında bulunur.

Linux sisteminiz başladığında bir Windows paylaşımını otomatik olarak bağlamak için, **/etc/fstab** dosyasında bağlamayı tanımlayalım.

**/etc/fstab** dosyasını metin düzenleyiciyle açıyoruz:

```
sudo nano /etc/fstab
```

Dosyaya aşağıdaki satırı ekleyin:

```
# <file system>   <dir>   <type> <options>  <dump>  <pass>
//win-share-ip/paylasim-klasörü  /win_paylasim  cifs  credentials=/etc/win-credentials,file_mode=0755,dir_mode=0755   0   0
```

Paylaşımı bağlamak için aşağıdaki komutu çalıştıralım:

```
sudo mount /win_paylasim
```

*mount* komutu, **/etc/fstab** dosyasının içeriğini okuyacak ve paylaşımı bağlayacaktır. Sistemi yeniden başlattığınızda, Windows paylaşımı otomatik olarak yüklenecektir.

4.Windows Paylaşımını Kaldırma

*umount* komutu, bağlı dosya sistemini dizin ağacından bağını kaldırır.

Bağlı bir Windows paylaşımını ayırmak için, *umount* komutunu ve ardından da bağlı olduğu dizini ya da uzak paylaşımını yazıyoruz:

```
sudo umount /win_paylasim
```

CIFS bağlamasının fstab dosyasında bir girişi varsa, bu girişleri kaldırıyoruz.

#### Kerberos

Protokol, adını Yunan mitlerindeki efsanevi üç başlı köpek Kerberos'tan (Cerberus olarak da bilinir), yeraltı dünyasının girişindeki köpek koruyucusundan alır. Kerberos'un üç başı istemciyi, sunucuyu ve Anahtar Dağıtım Merkezi'ni (KDC) temsil eder. Kerberos, client ve server arasında; kdc (key distribution center) dan yardım alarak güvenli bir iletişimin  kurulmasını sağlar.

Windows 2000 ve sonrası sürümler kimlik doğrulama metodu olarak Kerberosu kullanmaktadır. Kerberos uygulamaları, Apple OS, FreeBSD, UNIX ve Linux gibi diğer işletim sistemleri için de mevcuttur.

Kerberos'u kullanan kullanıcılar, makineler ve hizmetler, kimlik doğrulama ve bilet verme işlevlerini sağlayan tek bir işlem olarak çalışan Anahtar Dağıtım Merkezine(KDC) bağlıdır. KDC biletleri, tüm taraflara kimlik doğrulaması sunarak düğümlerin kimliklerini güvenli bir şekilde doğrulamasını sağlar. Kerberos kimlik doğrulama işlemi, ağda dolaşan paketlerin okunmasını veya değiştirilmesini engelleyen ve aynı zamanda mesajları gizlice dinleme, oynatma veya yeniden oynatma saldırılarına karşı koruyan geleneksel bir paylaşılan gizli şifreleme kullanır.

**Kerberos Protokol Akışı**

Kerberos iş akışında yer alan başlıca varlıklar şunlardır:

- **Client**. İstemci, kullanıcı adına hareket eder ve bir hizmet talebi için iletişimi başlatır.
- **Server**. Sunucu, kullanıcının erişmek istediği hizmeti barındırır.
- **Key Distribution Center (KDC)**. Kerberos ortamında, kimlik doğrulama sunucusu mantıksal olarak üç bölüme ayrılmıştır: Bir veritabanı (db), Kimlik Doğrulama Sunucusu (AS) ve Bilet Verme Sunucusu (TGS). Bu üç bölüm, sırayla, Anahtar Dağıtım Merkezi adı verilen tek bir sunucuda bulunur.
- **Authentication Server (AS)**. Kimlik doğrulama hizmeti, istenen istemci kimlik doğrulamasını gerçekleştirir. Kimlik doğrulama başarılı olursa, AS istemciye TGS adlı bir bilet verir. Bu bilet, diğer sunuculara istemcinin kimliğinin doğrulandığını garanti eder.
- **Ticket Granting Server (TGS)**. TGS, hizmet biletlerini hizmet olarak yayınlayan bir uygulama sunucusudur.

Protokol akışı aşağıdaki adımlardan oluşur:

İlk olarak, Kerberos akışında yer alan üç önemli gizli anahtar vardır. İstemci/kullanıcı, TGS ve Kimlik doğrulama sunucu ile paylaşılan sunucu için benzersiz gizli anahtarlar vardır.

1.İstemci kimlik doğrulama ister

Kullanıcı, kimlik doğrulama sunucusundan bir Bilet Verme Bileti (TGT) ister. Bu istek, müşteri kimliğini içerir.

2.Kimlik doğrulama sunucu istemcinin kimlik bilgilerini doğrular

Kimlik doğrulama sunucusu, kullanıcı ve TGS'nin kullanılabilirliği için veritabanını kontrol eder. Her iki değeri de bulursa, kullanıcının parola karmasını kullanarak bir istemci/kullanıcı gizli anahtarı oluşturur.

3.TGT'yi istemciye gönderir

Kimlik doğrulama sunucusu daha sonra TGS gizli anahtarını hesaplar ve istemci/kullanıcı gizli anahtarı tarafından şifrelenmiş bir oturum anahtarı (SK1) oluşturur. Kimlik doğrulama sunucusu daha sonra istemci kimliğini, istemci ağ adresini, zaman damgasını, yaşam süresini ve SK1'i içeren bir TGT oluşturur. TGS gizli anahtarı daha sonra bileti şifreler ve istemciye sunar.

4.İstemci, erişim istemek için TGT'yi kullanır

İstemci mesajın şifresini çözer. Daha sonra çıkarılan TGT'yi ve oluşturulan kimlik doğrulayıcıyı TGS'ye göndererek hizmeti sunan sunucudan bir bilet talep eder.

5.TGS, dosya sunucusu için bir bilet oluşturur

TGS, kimlik doğrulayıcının şifresini çözer ve istemci kimliği ve istemci ağ adresiyle eşleşip eşleşmediğini kontrol eder. TGS, TGT'nin süresinin dolmadığından emin olmak için çıkarılan zaman damgasını da kullanır. İşlem tüm kontrolleri başarılı bir şekilde yürütürse, KDC, istemci ile hedef sunucu arasında paylaşılan bir hizmet oturum anahtarı (SK2) oluşturur.

KDC, istemci kimliği, istemci ağ adresi, zaman damgası ve SK2'yi içeren bir hizmet bileti oluşturur. Bu bilet daha sonra sunucunun db'den alınan gizli anahtarıyla şifrelenir.

6.TGS, SK1 ile şifrelenmiş olan hizmet biletini ve SK2'yi içeren mesajı istemciye iletir.

7.İstemci, kimlik doğrulaması için dosya biletini kullanır

İstemci, SK1'i kullanarak mesajın şifresini çözer ve SK2'yi çıkarır. Bu işlem, istemci ağ adresini, istemci kimliğini ve zaman damgasını içeren, SK2 ile şifrelenmiş yeni bir kimlik doğrulayıcı oluşturur ve hizmet biletini servis sunucuya gönderir.

8.Hedef sunucu şifre çözme ve kimlik doğrulamasını alır

Hedef sunucu, hizmet biletinin şifresini çözmek ve SK2'yi çıkarmak için sunucunun gizli anahtarını kullanır. Sunucu, kimlik doğrulayıcının şifresini çözmek için SK2'yi kullanır ve kimlik doğrulayıcıdan gelen istemci kimliği ve istemci ağ adresinin ve hizmet biletinin eşleştiğinden emin olmak için kontroller gerçekleştirir. Sunucu ayrıca hizmet biletinin süresinin dolup dolmadığını kontrol eder.

Kontroller karşılandığında, hedef sunucu istemciye, istemcinin ve sunucunun birbirini doğruladığını doğrulayan bir mesaj gönderir. Kullanıcı artık güvenli bir oturuma girebilir.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bxws8tdk54x4kml37qc2.png)



##### Kerberos kimlik doğrulamasıyla bir Windows paylaşımı bağlayın

Öncelikle gerekli paketleri kuruyoruz

```
	apt-get install krb5-user krb5-config cifs-utils keyutils
```

Paketleri kurduktan sonra nano ile /etc/krb5.conf 'un default_realm alanına domainimizi yazıyoruz

```
[libdefaults]
default_realm = DOMAIN.LAB
```

Daha sonra sunucudan bir bilet almak için aşağıdaki komutu çalıştırıyoruz. Kullanıcı adı user@DOMAIN biçiminde olmalıdır. Domain adı her zaman BÜYÜK HARFLER olmalıdır. 

*FQDN(Fully Qualified Domain Name - Tam Nitelikli Alan Adı) denen bu yapıda her alan adı maksimum  63 karakterden oluşabilir ve toplamda da 255 karakteri aşamaz. Alan adı düğümlerin her biri DNS sunucusunda birer dizindir ve en alttan en üste ilerlenecek şekilde birleştirileren okunur.*

```
kinit yourUserName@SUBDOMAIN.DOMAIN.LOCAL
```

Şimdi sunucudan bir kerberos bileti almış olmalıyız, ***klist*** komutu ile kontrol ediyoruz.

```
test@SalihBilgisayar:~$ klist
Ticket cache: FILE:/tmp/krb5cc_1000
Default principal: administrator@SALIH.LAB

Valid starting       Expires              Service principal
21-10-2021 07:53:51  21-10-2021 17:53:51  krbtgt/SALIH.LAB@SALIH.LAB
	renew until 22-10-2021 07:53:46
```

Biletimizin oluştuğunu görebiliyoruz. Bu bilet ile paylaşıma iznimiz varsa, paylaşımı aşağıdaki komut ile mount edebiliriz. 

```
smbclient \\\\subdomain.domain.local\\paylasim-klasörü -k
```

Domain adı, aldığımız bilet adı ile aynı olmalıdır. Bileti aldığımız domain adından farklı bir ad girdiğimizde aşağıdaki gibi bir hata verecektir.

```
gensec_spnego_client_negTokenInit_step: gse_krb5: creating NEG_TOKEN_INIT for cifs/salihpc.salih.lab failed (next[(null)]): NT_STATUS_NO_LOGON_SERVERS
```

Domain adımız, aldığımız bilet ile aynı veya herhangi bir hata yoksa SMB istemcisi **(smb: \\>)** çalışır ve kaynaklara erişebiliriz. Sonrasında ***klist*** ile biletimizi tekrar kontrol ettiğimizde cifs bağlantısının biletimize eklendiğini görebiliriz.

```
test@SalihBilgisayar:~$ klist
Ticket cache: FILE:/tmp/krb5cc_1000
Default principal: administrator@SALIH.LAB

Valid starting       Expires              Service principal
21-10-2021 08:27:02  21-10-2021 18:27:02  krbtgt/SALIH.LAB@SALIH.LAB
	renew until 22-10-2021 08:26:59
21-10-2021 08:27:03  21-10-2021 18:27:02  cifs/salihpc.salih.lab@SALIH.LAB
```



### SMB

Sunucu İleti Bloğu (SMB), günümüzün en popüler dosya sunucusu protokollerinden biridir. Düzgün bir şekilde uygulandığında SMB, güvenli, verimli ve ölçeklenebilir ağ kaynağı ve dosya paylaşımı sağlar.

SMB, bir istemci-sunucu modeli kullanan bir ağ dosyası ve kaynak paylaşım protokolüdür. Ağdaki PC'ler gibi SMB istemcileri, dosyalar ve dizinler gibi kaynaklara erişmek veya ağ üzerinden yazdırma gibi görevleri gerçekleştirmek için SMB sunucularına bağlanır.

SMB Client

Bir SMB istemcisi, bir SMB sunucusundaki kaynaklara erişen cihazdır. Örneğin, bir şirket ağı içinde, paylaşılan bir sürücüye erişen kullanıcı bilgisayarları SMB istemcileridir.

İstemciyi çalıştırmak için aşağıdaki komutu çalıştırıyoruz.

```
smbclient \\\\<win-share-ip>\\<paylasim-klasörü> -U <kullanıcı>%<şifre> -W <sunucu>
```

İstemci çalıştığında, kullanıcıya **smb: \\>** diye bir bilgi istemi sunulur. *ls* komutuyla paylaşılan klasör içeriğini görüntüleyebiliriz.

```
smb: \> ls 
  .                                   D        0  Fri Oct 22 07:53:42 2021
  ..                                  D        0  Fri Oct 22 07:53:42 2021
  file1                               D        0  Tue Oct 19 11:19:22 2021
  file2                               D        0  Tue Oct 19 10:01:25 2021
  New Text Document.txt               A        0  Fri Oct 22 07:53:42 2021
  newfile                             D        0  Wed Oct 20 16:13:50 2021

		8260095 blocks of size 4096. 3329607 blocks available
```


Sunucuda çalışan tüm komutlar aslında sunucuya bir istek göndererek gerçekleştirilir. 

**Sık Kullanılan Komutlar**

| Parametre                                  | Açıklama                                                     |
| ------------------------------------------ | ------------------------------------------------------------ |
| cd *dizin-adı*                             | Dizin adı belirtilirse, sunucudaki geçerli çalışma dizini belirtilen dizine gider. |
| ls *mask*                                  | Sunucudaki geçerli çalışma dizinindeki maskeyle eşleşen dosyaların bir listesini sunucudan alır ve görüntüler. |
| mkdir *dizin-adı*                          | Belirtilen adla sunucuda yeni bir dizin oluşturur.           |
| more *dosya adı*                           | Sunucudaki dosyayı alır ve içeriğiyle birlikte görüntüler.     |
| get *sunucu-dosya-adı* *[yerel-dosya-adı]* | Sunucu-dosya-adı adlı dosyayı sunucudan istemciyi çalıştıran makineye kopyalar. Belirtilmişse, yerel kopyayı yerel-dosya-adı olarak adlandırır. |
| put *yerel-dosya-adı* *[sunucu-dosya-adı]* | İstemciyi çalıştıran makineden yerel dosyayı sunucuya kopyalar. |
| lcd *[dizin-adı]*                          | Dizin adı belirtilirse, yerel makinedeki geçerli çalışma dizini belirtilen dizinle değiştirilir. |
| mget *mask*                                | Maskeyle eşleşen tüm dosyaları sunucudan istemciyi çalıştıran makineye kopyalar. |
| mput *mask*                                | Yerel makinedeki geçerli çalışma dizinindeki maskeyle eşleşen tüm dosyaları sunucudaki geçerli çalışma dizinine kopyalar. |
| print *dosya-adı*                          | Belirtilen dosyayı, sunucudaki yazdırılabilir bir hizmet aracılığıyla yerel makineden yazdırır. |
| rm *mask*                                  | Sunucudaki geçerli çalışma dizininden, maskeyle eşleşen tüm dosyaları kaldırır. |
| rmdir *dizin-adı*                          | Belirtilen dizini sunucudan kaldırır.                        |
| del *mask*                                 | İstemci, sunucudaki geçerli çalışma dizininden maskeyle eşleşen tüm dosyaları siler. |
| exit                                       | Sunucu ile bağlantıyı sonlandırır ve programdan çıkar.       |



### SAMBA

Samba, birlikte kullanıldığında bir Linux sunucusunun dosya sunumu, kimlik doğrulama/yetkilendirme, ad çözümleme ve yazdırma hizmetleri gibi ağ eylemlerini gerçekleştirmesine izin veren farklı uygulamalar topluluğudur.

CIFS gibi, Samba da Windows istemcilerinin bir Samba sunucusundaki Linux dizinlerine, yazıcılarına ve dosyalarına şeffaf bir şekilde erişmesine izin veren SMB protokolünü uygular.

En önemlisi, Samba, bir Linux sunucusunun **Etki Alanı Denetleyicisi** olarak hareket etmesine izin verir. Bunu yaparak, Windows etki alanındaki kullanıcı kimlik bilgilerinin yeniden oluşturulması ve ardından Linux sunucusunda manuel olarak eşitlenmesi gerekmeden kullanılabilir. Bu Etki Alanı Denetçisine Windows, Mac ve GNU/Linux sistemler aynı yapılandırma ile erişebilmektedir.

## Samba paylaşım erişimi yapılandırma parametrelerini yönetin

Dosya  bölümlerden ve parametrelerden oluşur. Bir bölüm, köşeli parantez içindeki bölümün adıyla başlar ve bir sonraki bölüm başlayana kadar devam eder. Bölümler, formun parametrelerini içerir:

**[etc/samba/smb.conf]**

```[etc/samba/smb.conf]
[paylasim]
path=/home/kullanici_adiniz/paylasim
comment=paylasim dizini
valid users=@admins
invalid users=@kullanici1 @kullanici2
browsable=yes
writeable=yes
read only=no
guest ok=yes
```

Dosya satır tabanlıdır, yeni satırla sonlandırılan her satır bir yorumu, bölüm adını veya parametreyi temsil eder. Parametrelerde eşittir girişini izleyen değerlerin tümü ya bir dizedir ya da evet/hayır veya doğru/yanlış olarak verilebilen bir booleandır.

| Parametre     | Açıklama                                                     |
| ------------- | ------------------------------------------------------------ |
| path          | Hizmet kullanıcısına erişim izni verilecek bir dizini belirtir. |
| comment       | Yeni paylaşımla ilişkilendirilecek yorum dizesi              |
| valid users   | Bu hizmete giriş yapmasına izin verilen kullanıcıların listesidir. |
| invalid users | Bu hizmete giriş yapmasına izin verilmemesi gereken kullanıcıların listesidir. |
| browsable     | Bu paylaşımın bir ağ görünümündeki kullanılabilir paylaşımlar listesinde ve göz atma listesinde görünüp görünmeyeceğini kontrol eder. |
| writeable     | Yazma yetkisini kontrol eder.                                |
| read only     | Sadece okuma yetkisini kontrol eder.                         |
| guest ok      | Misafir olarak belirlenen kullanıcılara erişim yetkisi verir. |