Saya telah menemukan banyak server NFS yang terbuka lebar, yang dapat dibuat sedikit lebih aman dan lebih aman dengan beberapa perubahan cepat. Ini adalah panduan cepat, membuat segalanya sedikit lebih aman. Ini sama sekali bukan panduan lengkap untuk mengamankan NFS, tetapi ini dapat membuat segalanya sedikit lebih aman tanpa banyak usaha. Untuk naik ke level lain, Anda ingin melihat penerapan NFSv4 dan Kerberos.
Opsi dasar untuk ekspor dapat mencakup:
- no_all_squash :Opsi ini menonaktifkan semua pemampatan.
- rw :Opsi ini memungkinkan server NFS menggunakan permintaan baca dan tulis pada volume NFS.
- ro :Opsi ini memungkinkan server NFS menggunakan permintaan hanya-baca pada volume NFS.
- sinkronisasi :Opsi ini memungkinkan server NFS untuk membalas permintaan hanya setelah perubahan dikomit ke penyimpanan stabil.
- tidak sinkron :Opsi ini memungkinkan server NFS melanggar protokol NFS dan membalas permintaan sebelum perubahan apa pun dilakukan pada penyimpanan stabil.
- aman :Opsi ini mengharuskan permintaan berasal dari port Internet.
- tidak aman :Opsi ini menerima salah satu atau semua port.
- penundaan :Opsi ini memungkinkan server NFS untuk menunda melakukan permintaan tulis ke disk jika mencurigai bahwa permintaan tulis terkait lainnya mungkin sedang berlangsung atau akan segera tiba.
- no_wdelay :Opsi ini memungkinkan server NFS mengizinkan beberapa permintaan tulis untuk dikomit ke disk dalam satu operasi. Fitur ini dapat meningkatkan kinerja, tetapi jika server NFS menerima banyak permintaan kecil, perilaku ini dapat menurunkan kinerja. Anda harus menyadari bahwa opsi ini tidak berpengaruh jika async juga disetel.
- subtree_check :Opsi ini mengaktifkan pemeriksaan subpohon.
- no_subtree_check :Opsi ini menonaktifkan pemeriksaan subpohon, yang memiliki beberapa masalah keamanan tersirat, tetapi dapat meningkatkan keandalan.
- anonuid=UID :Opsi ini secara eksplisit mengatur uid dan gid dari akun anonim; ini dapat berguna jika Anda ingin semua permintaan muncul seolah-olah berasal dari satu pengguna.
- anongid=GID :Opsi ini akan menonaktifkan anonuid=UID.
Apa itu root_squash?
root_squash akan memungkinkan pengguna root pada klien untuk mengakses dan membuat file di server NFS sebagai root. Secara teknis, opsi ini akan memaksa NFS untuk mengubah root klien ke ID anonim dan, pada dasarnya, ini akan meningkatkan keamanan dengan mencegah kepemilikan akun root pada satu sistem yang bermigrasi ke sistem lain. Ini diperlukan jika Anda menghosting sistem file root di server NFS (khususnya untuk klien tanpa disk); dengan mengingat hal ini, ini dapat digunakan (dengan hemat) untuk host yang dipilih, tetapi Anda tidak boleh menggunakan no_root_squash kecuali Anda mengetahui konsekuensinya.
SUID dan NFS
suid adalah metode pengguna yang mengasumsikan hak pemilik file ketika dieksekusi oleh pengguna. Mengapa saya peduli tentang ini? Bayangkan jika pengguna dapat menyalin file ke volume NFS, mengaktifkan suid bit pada file, kemudian menjalankannya di server atau klien NFS secara efektif mengangkat diri mereka untuk melakukan root dalam proses?
Berikut adalah contoh yang menunjukkan risikonya.
Nama host NFS Server adalah server, nama host klien NFS adalah klien. Subnet pada jaringan contoh adalah 192.168.1.0/24. Contoh ini juga mengasumsikan bahwa kedua sistem menjalankan versi OS yang sama (yaitu keduanya RHEL 7, atau keduanya SLES 12), selama versi utama OS cocok.
1. Pada server NFS buat direktori sementara (/export/test) dan ekspor dengan opsi berikut (gantikan 192.168.1.0/255.255.255.0 dengan jaringan/netmask Anda sendiri):
server# vi /etc/exports /export/test 192.168.1.0/255.255.255.0(no_root_squash,insecure,rw)
2. Mulai ulang server nfs. Ini bermacam-macam tergantung rasa linux..
RHEL:
server# systemctl restart nfs
SUSE:
server# systemctl restart nfsserver
3. Pada mesin klien, pasang ekspor:
client# mkdir /mnt/nfstest client# mount -t nfs server:/export/test /mnt/nfstest
4. Pada klien, sebagai pengguna root, salin biner vi ke mount NFS.
client# which vi —— output ——— /usr/bin/vi
client# cp /usr/bin/vi /mnt/nfstest
5. Atur bit suid pada biner yang disalin.
client# chmod u+s /mnt/nfstest/vi
6. SSH ke server nfs sebagai pengguna yang tidak memiliki hak istimewa. Karena tidak ada pengguna yang memiliki hak istimewa menjalankan vi yang terletak di mount yang diekspor di server:
server$ /export/test/vi /etc/passwd
7. Temukan akun yang tidak memiliki hak istimewa di file kata sandi dan ubah UID menjadi 0, simpan, keluar, lalu masuk kembali sebagai pengguna yang tidak memiliki hak istimewa. Pengguna sekarang sudah root.
Hal yang sama akan bekerja pada klien, jika Anda menjalankan vi dari mount NFS sebagai pengguna biasa, Anda dapat mengarahkannya ke file apa pun di host dan akan dapat mengedit sebagai root. Ini akan bekerja dengan biner apa pun yang dapat Anda pikirkan.
Bagaimana Cara Menghindarinya?
1. Pertama-tama hapus file vi dari direktori ekspor :), lalu aktifkan root_squash pada ekspor nfs. Di server edit /etc/exports ubah lagi no_root_squash menjadi root_squash:
server# vi /etc/exports /export/test 192.168.1.0/255.255.255.0(root_squash,insecure,rw)
2. Restart server nfs, remount filesystem pada klien:
server# systemctl restart nfs
client# umount /mnt/test client# mount -t nfs server:/export/test /mnt/nfstest
3. Dari klien, sebagai root buat beberapa file di NFS mount, periksa izinnya:
client# touch /mnt/nfstest/{test1,test2,test3}
Bergantung pada izin yang ditetapkan pada /export/test, Anda akan mendapatkan izin ditolak atau jika direktori dapat ditulisi dunia, izin pada file akan terlihat seperti:
-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 memetakan ulang UID root menjadi uid dari pengguna anonim. Uid ini dapat dikonfigurasi dalam file ekspor, man /etc/exports untuk informasi lebih lanjut. Salin lagi perintah vi (jika diizinkan) sebagai root pada klien ke volume nfs dan ulangi langkah-langkah di atas (ssh ke server jalankan vi di /etc/passwd). Kali ini Anda tidak akan memiliki izin untuk menyimpan file, izinnya dinaikkan ke akun yang tidak memiliki hak istimewa.
Itu sedikit lebih aman, namun kami belum selesai. Langkah lain yang dapat Anda ambil adalah memasang sistem file yang diekspor di server NFS dengan opsi nosuid.
server# vi /etc/fstab
4. Temukan titik pemasangan untuk /export/, ubah default kolom opsi menjadi.
/dev/mapper/sys_vg-export_lv /export ext3 defaults 0 0 /dev/mapper/sys_vg-export_lv /export ext3 nosuid 0 0
5. Pasang kembali mount:
server# mount -o remount /export
6. Buang file vi di mount, atur bit suid, alihkan ke akun yang tidak memiliki hak istimewa dan coba lagi:
server# cp /usr/bin/vi /export/test; chmod u+s /export/test/vi
server# su - someuser server$ /export/test/vi /etc/passwd
Setelah melakukan perubahan pada file yang diteruskan, Anda tidak akan diizinkan untuk menyimpan perubahan.
7. Langsung pada klien sebagai pengguna yang tidak memiliki hak istimewa dan coba hal yang sama:
client$ /export/test/vi /etc/passwd
Masih berfungsi, klien juga perlu di-remount dengan opsi nosuid:
client# mount -t nfs -o nosuid server:/export/test /mnt/nfstest
Uji lagi dengan akun yang tidak memiliki hak istimewa, seharusnya gagal.
Ada beberapa opsi lain yang dapat ditentukan pada titik mount untuk lebih membatasi apa yang dapat dijalankan darinya, periksa noexec (tidak ada file yang dapat dieksekusi), nodev (tidak ada file perangkat). Jika keamanan lebih lanjut diperlukan, lihat Kerberos dan NFSv4.