NFS Güvenliği – NFS no_root_squash ve SUID

NFS Securtiy

Merhaba,
Bu yazımda sizlere Temel NFS güvenliği ile ilgili no_root_squash ve suid kullanımı aktaracağım.

Birkaç hızlı değişiklikle, daha güvenli ve emniyetli NFS sunucusuna sahip olmak için aşağıdaki adımları kılavuz olarak kullanabilirsiniz.

Dışa aktarım için temel seçenekler şunları içerir:

  • no_all_squash: Bu seçenek tüm ezmeyi devre dışı bırakır.
  • rw: Bu seçenek, NFS sunucusunun bir NFS biriminde hem okuma hem de yazma isteklerini kullanmasını sağlar.
  • ro: Bu seçenek, NFS sunucusunun bir NFS biriminde salt okunur istekler için kullanılır.
  • sync: Bu seçenek, NFS sunucusunun isteklere yalnızca değişiklikler sabit depolama alanına işlendikten sonra yanıt vermesini sağlar.
  • async: Bu seçenek, NFS sunucusunun NFS protokolünü ihlal etmesini ve herhangi bir değişiklik kararlı depolama alanına işlenmeden önce istekleri yanıtlamasını sağlar.
  • secure: Bu seçenek, isteklerin bir Internet bağlantı noktasından gelmesini gerektirir.
  • insecure: Bu seçenek herhangi bir veya tüm portları kabul eder.
  • wdelay: Bu seçenek, NFS sunucusunun, ilgili başka bir yazma isteğinin devam etmekte olduğundan veya yakında geleceğinden şüphelenmesi durumunda diske yazma isteğini işlemeyi geciktirmesini sağlar.
  • no_wdelay: Bu seçenek NFS sunucusunun birden fazla yazma isteğinin tek bir işlem içinde diske işlenmesine izin vermesini sağlar. Bu özellik performansını artırabilir. Ancak bir NFS sunucusu çok sayıda küçük istek alırsa, bu davranış performansı düşürmeye hizmet edebilir. Eğer async de ayarlanmışsa bu seçeneğin hiçbir etkisi olmayacağını bilmelisiniz.
  • subtree_check: Bu seçenek alt ağaç denetimini etkinleştirir.
  • no_subtree_check: Bu seçenek alt ağaç denetimini devre dışı bırakır, bu da bazı güvenlik sorunlarını beraberinde getirir, ancak güvenilirliği artırabilir.
  • anonuid=UID: Bu seçenekler anonim hesabın uid ve gid’sini açıkça ayarlar; bu, tüm isteklerin tek bir kullanıcıdan geliyormuş gibi görünmesini istediğinizde yararlı olabilir.
  • anongid=GID: Bu seçenek anonuid=UID’yi devre dışı bırakacaktır.

root_squash Nedir?

root_squash istemcideki root kullanıcısının NFS sunucusundaki dosyalara root olarak erişmesine ve oluşturmasına izin vericidir. Teknik olarak konuşmak gerekirse, bu seçenek NFS’i istemcinin root’unu anonim bir kimliğe değiştirmeye zorlar ve aslında bir sistemdeki root hesabının sahipliğinin diğer sisteme geçmesini önleyerek güvenliği arttırır. NFS sunucusunda root dosya sistemleri barındırıyorsanız (özellikle disksiz istemciler için) bu gereklidir. Bunu aklımızda tutalım. Seçilen host için (az miktarda) kullanılabilir. Ancak sonuçlarının farkında değilseniz no_root_squash kullanmamalısınız.

SUID & NFS

suid, kullanıcı tarafından çalıştırıldığında bir dosyanın sahibinin haklarını üstlenen bir kullanıcı yöntemidir. Bunu neden önemli buluyorum? Bir kullanıcının bir dosyayı NFS birimine kopyalayabildiğini, dosya üzerinde suid bitini etkinleştirebildiğini ve daha sonra bunu NFS sunucusu veya istemcisi üzerinde çalıştırabildiğini ve bu süreçte kendisini etkin bir şekilde root konumuna yükselttiğini hayal edin.

Riskler gösteren bir örnek ile ilerleyelim.

NFS Server hostname sunucu, NFS istemci hostname istemcidir. Örnek ağdaki alt ağ 192.168.1.0/24’tür. Bu örnekte ayrıca, işletim sistemi ana sürümleri eşleştiği sürece her iki sistemin de aynı işletim sistemi sürümlerini (yani her ikisi de RHEL 7 veya her ikisi de SLES 12) çalıştırdığını varsayıyoruz.

1. Bir NFS sunucusunda geçici bir dizin (/export/test) oluşturun ve aşağıdaki seçeneklerle dışa aktarın. (192.168.1.0/255.255.255.0) Bu ipler yerine kendi network/netmask’ınızı kullanın.

server# vi /etc/exports /export/test 192.168.1.0/255.255.255.0(no_root_squash,insecure,rw)

2. Nfs sunucusunu yeniden başlatın. Bu, linux’un çeşidine bağlı olarak değişir…

RHEL:

server# systemctl restart nfs

SUSE:

server# systemctl restart nfsserver

CENTOS:

systemctl restart nfs-server

3. İstemci makinede dışa aktarımı bağlayın:

client# mkdir /mnt/nfstest
client# mount -t nfs server:/export/test /mnt/nfstest

4. İstemcide, root kullanıcısı olarak, vi binary dosyasını NFS bağlantısına kopyalayın.

client# which vi
—— output ———
/usr/bin/vi

client# cp /usr/bin/vi /mnt/nfstest

5. Kopyalanan binary dosyadaki suid bitini ayarlayın.

client# chmod u+s /mnt/nfstest/vi

6. Yetkili olmayan bir kullanıcı olarak nfs sunucusuna SSH ile bağlanın. Yetkili olmayan kullanıcı olarak sunucudaki dışa aktarılmış bağda bulunan vi dosyasını çalıştırın:

server$ /export/test/vi /etc/passwd

7. Parola dosyasında yetkili olmayan hesabı bulun ve UID’yi 0 olarak değiştirin, kaydedin, oturumu kapatın ve yetkili olmayan kullanıcı olarak tekrar oturum açın. Kullanıcı artık root olur.

Aynı şey istemci üzerinde de çalışacaktır. Eğer vi’yi NFS mount’tan normal bir kullanıcı olarak çalıştırırsanız host’daki herhangi bir dosyaya yönlendirebilir ve root olarak düzenleyebilirsiniz. Tüm binary dosyalarla çalışacaktır.

Bunu Nasıl Önleriz?

1. Öncelikle dışa aktarım dizininden vi dosyasını silin. Ardından nfs dışa aktarımında root_squash’ı etkinleştirin. Sunucuda /etc/exports’u tekrar düzenleyin no_root_squash’ı root_squash olarak değiştirin:

server# vi /etc/exports
/export/test 192.168.1.0/255.255.255.0(root_squash,insecure,rw)

2. Nfs sunucusunu yeniden başlatın, istemcideki dosya sistemini yeniden bağlayın:

server# systemctl restart nfs

client# umount /mnt/test
client# mount -t nfs server:/export/test /mnt/nfstest

3. İstemciden, root olarak NFS mount üzerinde bazı dosyalar oluşturun, izinleri kontrol edin:

client# touch /mnt/nfstest/{test1,test2,test3}

export/test üzerinde ayarlanan izinlere bağlı olarak, ya izin reddedilir ya da dizin everyone çapında yazılabilir ise, dosyalar üzerindeki izinler aşağıdaki gibi görünür:

-rw-r--r-- 1 65534 65534 0 Nov 6 2015 test1
-rw-r--r-- 1 65534 65534 0 Nov 6 2015 test2
-rw-r--r-- 1 65534 65534 0 Nov 6 2015 test3

root_squash, root UID’sini anonim bir kullanıcının uid’si olarak yeniden eşleştiriyor. Bu uid exports dosyasında yapılandırılabilir. (Daha fazla bilgi için man /etc/exports.) İstemcide root olarak vi komutunu tekrar (izin veriliyorsa) nfs birimine kopyalayın ve yukarıdaki adımları tekrarlayın (sunucuya ssh /etc/passwd üzerinde vi çalıştırın). Bu sefer dosyayı kaydetme izniniz olmayacak, izinler ayrıcalıklı olmayan bir hesaba yükseltilecek.

Bu biraz daha güvenlidir. Henüz işimiz bitmedi. Atabileceğiniz bir diğer adım da dışa aktarılan dosya sistemini NFS sunucusuna nosuid seçeneği ile bağlamaktır.

server# vi /etc/fstab

4. export/ için bağlama noktasını bulun ve seçenekler sütununu varsayılan olarak değiştirin.

/dev/mapper/sys_vg-export_lv /export ext3 defaults 0 0
/dev/mapper/sys_vg-export_lv /export ext3 nosuid 0 0

5. Bağlantıyı yeniden bağlayın:

server# mount -o remount /export

6. Bağlama üzerindeki vi dosyasını boşaltın, suid bitini ayarlayın, yetkili olmayan bir hesaba geçin ve tekrar deneyin:

server# cp /usr/bin/vi /export/test; chmod u+s /export/test/vi

server# su - someuser
server$ /export/test/vi /etc/passwd

Geçilen dosyada bir değişiklik yaptıktan sonra, değişikliği kaydetmenize izin verilmeyecektir.

7. İstemciye yetkili olmayan bir kullanıcı olarak bağlanın ve aynısını deneyin:

client$ /export/test/vi /etc/passwd

8. Hala çalışıyor, istemcinin de nosuid seçeneği ile yeniden bağlanması gerekiyor:

client# mount -t nfs -o nosuid server:/export/test /mnt/nfstest

Yetkili olmayan hesapla tekrar test edin, başarısız olması gerekecektir.

Bağlama noktalarında çalıştırılabilecekleri daha da kısıtlamak için belirtilebilecek birkaç seçenek daha vardır, noexec (yürütülebilir dosya yok), nodev (aygıt dosyası yok) seçeneklerine göz atın. Daha fazla güvenlik gerekiyorsa, Kerberos ve NFSv4‘e bakın.

Bir sonraki yazımızda görüşmek üzere. Faydalı olması dileğiyle.