NFS мрежова файлова система
Работа и игра с Linux. И какво се случва понякога.
NFS мрежова файлова система.
NFS ви позволява да споделяте директории на Unix машина. Несигурността на NFS, и по-специално на NIS, е свързана с RPC - по отношение на броя на всички видове експлойти, RPC изглежда е неофициален лидер (с изключение на Sendmail). Тъй като тези протоколи са предназначени за вътрешни мрежи, те ще трябва да бъдат защитени от "своите" потребители. Въпреки че преди да ги използвате, трябва да решите дали наистина са необходими.
В домашна мрежа те могат да бъдат доста полезни, но в корпоративна мрежа от съображения за сигурност е по-добре да им се намери по-сигурна алтернатива.
NFS файлова система.
Мрежовата файлова система (NFS) е разработена от Sun като средство за достъп до файлове, разположени на други Unix машини в локална мрежа. NFS изобщо не е проектиран с оглед на сигурността, което е причината за много уязвимости през годините.
NFS може да работи през TCP или UDP и използва RPC системата, което означава, че трябва да работят следните често уязвими приложения: portmapper, nfs, nlockmgr (lockd), rquotad, statd и mountd.
Няма нужда да стартирате NFS - трябва да намерите алтернативно решение. Ако NFS все още е необходим, тук ще говорим за това как да минимизираме риска от използването му.
Първата стъпка е да изберете машините, които ще експортират своите файлови системи. След това можете да определите на кои машини е разрешено да се свързват към NFS сървърите (или сървъра, ако има такъв) в мрежата. Не използвайте NFS на машини, които са директно (пряко) свързани към интернет. След като машините са избрани, трябва да изберете директориите на тези машини, които ще бъдатизнесени.
Директориите за експортиране са дефинирани във файла /etc/exports. Форматът на всеки запис е прост: име на директория, списък с потребители, на които е разрешен достъп, и режим на достъп. например:
- Сигурно - Заявката за монтиране трябва да идва от привилегирован порт (до 1024). Това означава, че командата за монтиране е въведена от потребител с root права.
- Root_squash - Заявка от root потребител ще се третира като заявка от анонимен потребител. Това ви позволява да причините най-малко вреда на системата. Тази опция трябва да е активирана.
- All_squash - всички заявки (не само от root потребител) ще се третират като идващи от анонимен потребител. Полезно за публично експортирани директории.
Ако root кракер получи достъп до машина, на която е даден rw достъп до директория, посочена в /etc/exports, той ще има пълен контрол върху файловата система, така че основната директория (/) не може да бъде експортирана, нито чувствителни към системата директории като /usr, /bin, /sbin, /lib, /opt и /etc. Домашните директории на потребителите са добри за експортиране.
От страна на клиента монтирането на споделена файлова система трябва да се извърши чрез указване на опцията -o nosuid:
Това ще попречи на кракер, който има достъп до NFS сървър, да получи root достъп до клиенти.
Независимо от услугата, трябва да използвате IPTables, за да ограничите достъпа до машината. В случай на NFS сървър това е особено важно. Когато използвате IPTables, не забравяйте, че NFS демонът използва порт 2049/TCP/UDP.
Някои RPC услуги, като portmapper и NFS, използват фиксирани портове (съответно 113 и 2049/tcp/udp), но други RPC услуги нямат фиксирани портове, което затруднява филтрирането на пакети с помощта на IPTables. Единственото известно нещое, че RPC използват портове в диапазона 32768-65535.
Ако използвате ядро 2.4.13 или по-ново, можете да използвате опцията -p, за да посочите точния порт за всяка RPC услуга.
Помислете за функцията start() от файла /etc/rc.d/init.d/nfslock, използван за стартиране на nsflock:
if [ "$USERLAND_LOCKD" ]; тогава
echo -n $"Стартиране на NFS заключване: "
echo -n $"Стартиране на NFS statd: "
ехо [ $RETVAL -eq 0 ] && докосване /var/touch/lock/subsys/nfslock
За да принудите демона statd да използва определен порт, можете да използвате опцията -p, например daemon rpc.statd -p 32800 (или каквото искате). По същия начин трябва да зададете порта за mountd, nfsd, rquotad - всички те се стартират от скрипта /etc/rc.d/init.d/nfs:
действие -n $"Стартиране на NFS услуги: " /usr/sbin/exportfs -r
if t _x /usr/sbin/rpc.quotad ] ; then echo -n $"Стартиране на NFS квоти: " daemon rpc.rquotad echo
fi echo -n $"Стартиране на NFS mountd: "
демон rpc.mountd 3RPCMOUNTDOPTS
echo -n $"Стартиране на NFS демон: " демон rpc.nfsd $RPCNFSDOPTS ехо докосване /var/lock/subsys/nfs
Технологията за промяна на порта за lockd (nlockmgr) е различна от горната (не се опитвайте да промените файла /etc/rc.d/init.d/nfslock - нищо няма да работи).
Lockd е или внедрен като модул на ядрото, или статично компилиран в ядрото. За да промените номера на порта, отворете файла /etc/modules и намерете опциите, предадени на модула:
опции lockd nlm_udpport=33000 nlm_tcpport=33000
Сега, когато RPC услугите използват статични портове, които са известни, трябва да се използват IPTables. Следният набор от правила предполага, че NFS е единственият сървър, работещ на машината, до който само на машини е разрешен достъп,изброени във файла /usr/local/etc/nfsexports.hosts:
# Изчистете всички вериги
$IPT -t nat --flush $IPT -t mangle --flush $IPT -X
# Разрешаване на обратен трафик $IPT -A INPUT -i lo -j ACCEPT $IPT -A OUTPUT -o lo -j ACCEPT
# Правила по подразбиране $IPT -P INPUT DROP $IPT -P OUTPUT DROP $IPT -P FORWARD DROP
$IPT -A INPUT -m състояние --състояние УСТАНОВЕНО, СВЪРЗАНО -j ПРИЕМАНЕ $IPT -A ИЗХОД -m състояние --състояние НОВО, УСТАНОВЕНО, СВЪРЗАНО -j ПРИЕМАНЕ
# Разрешете достъп до всеки компютър,
# посочен в /usr/local/etc/nfsexports.hosts
за хост в "cat /usr/local/etc/nfsexports.hosts'; направете $IPT -I INPUT -s $host -p tcp --dport 111 -j ACCEPT
$IPT -I INPUT -s $host -p udp --dport 111 -j ПРИЕМАНЕ
$IPT -I INPUT -s $host -p udp --dport 2049 -j ПРИЕМАНЕ
$IPT -I INPUT -s $host -p tcp --dport 32800 -j ПРИЕМАНЕ
$IPT -I INPUT -s $host -p tcp --dport 32900 -j ПРИЕМАНЕ
$IPT -I INPUT -s $host -p tcp --dport 33000 -j ПРИЕМАНЕ
$IPT -I INPUT -s $host -p tcp --dport 33100 -j ПРИЕМАНЕ
Разбира се, това е само скелет, ще трябва да се добавят много повече правила: поне позволете SSH и задайте някои параметри на ядрото с /proc.
Тунелиране на NFS през SSH.
Съкращението NFS понякога се дешифрира като "No File Security" - тези три думи говорят сами за себе си. Ето защо е много важно да се гарантира защитата на NFS трафика. Това е лесно да се направи с ssh.
Първоначално можете да промените файла /etc/exports на NFS сървъра, така че файловите системи да се експортират към локалния хост:
След това трябва да използвате SSH за препращане на NFS портове и mountd. NFS използва порт 2049/udp, а mountd използва порт 33000, както е отбелязано:
# ssh [email protected] -L 200: localhost:33000 -f заспиване 120m
Тези две команди дават на потребителя интерактивна обвивка, но тъй като тя не е необходима, SSH изпълнява командата sleep 120: обратно към командния ред, но пренасочването на портове ще продължи още 2 часа.
Монтирането на файловата система от страна на клиента изглежда много необичайно:
Ако триковете с ssh тунелиране са твърде сложни, можете да използвате проекта SHFS (Shell Filesystem) (http://shfs.sourceforge.net/), който прави възможно автоматизирането на цялата тази процедура.
Веднъж инсталиран, SHFS може да бъде достъпен или с командата mount -t shfs, или с новата команда shfsmount. Синтаксисът на тази команда е подобен на предишната:
shfsmount потребител@192.168.10.1:/home/user /mnt/user
Криптографската файлова система използва прозрачно криптиране и декриптиране на NFS трафик с помощта на алгоритъма DES. В допълнение, той поддържа автоматично управление на ключове, което прави процеса възможно най-прозрачен за потребителя.
Въпреки че CFS е разработен за SunOS и BSD, той е интересен, защото изглежда е първият опит за "прозрачно" кодиране на споделени файлове. Прозрачната криптографска файлова система (TCFS) предоставя още по-прозрачен начин за кодиране на NFS трафик.
В допълнение към кодирането на данни, тази файлова система поддържа проверки за целостта на данните.