AKTUALNOŚCI Własny i bezpieczny serwer FTP - cz.2 - Linux 12 listopada 2007 15:19 Patryk Królikowski W części pierwszej pokazywaliśmy jak skonfigurować własny serwer FTP na bazie Microsoftowego IIS-a. Teraz zobaczmy jak można to zrobić na platformie Linuksowej. Zadbamy przy tym o przyzwoity poziom bezpieczeństwa takiego serwera. Podstawy W przypadku Linuksa możemy wybierać spośród bardzo szerokiej gamy darmowego oprogramowania mogącego pełnić rolę serwera FTP. Różni się ono możliwościami, poziomem bezpieczeństwa, łatwością obsługi i rodzajem zastosowań. Najczęściej wykorzystywane są ProFTPd, gltftp oraz wu-ftpd. Bez względu na to, który serwer przypadnie nam do gustu warto wiedzieć o kilku podstawowych sprawach związanych z bezpieczeństwem. Poza samą konfiguracją serwera należy ze szczególną uwagą śledzić podatności oraz ewentualne exploity, które dotyczą wykorzystywanego przez nas oprogramowania. Warto zaglądać do serwisów takich jak www.secunia.com, www.securityfocus.com czy www.securitytracker.com. Luki bezpieczeństwa to nie wszystko. Istotna jest także kwestia poziomu uprawnień, z jakimi uruchamiany jest sam demon FTP. Przeważnie, aby usługa mogła zostać podpięta pod port 21 (lub 21 i 20 w przypadku trybu active) wymagane są prawa administratora systemu - w przypadku Linuksa - roota. Jakie są metody na ograniczenie zagrożeń związanych z wykorzystaniem uprawnień? Spora część produktów została napisana w taki sposób, aby korzystać z konta root-a tylko wtedy, kiedy jest to niezbędnie konieczne - nie mamy jednak na to wielkiego wpływu, wszystko zależy od implementacji (ProFTPd na przykład uruchamia się z uprawnieniami roota, podpina pod port TCP 21, a następnie "degraduje" swoje prawa do wskazanego w konfiguracji konta np. nobody). Ponadto, niektóre pozwalają na uruchomienie usługi w więzieniu (jail, chroot), co koncepcyjnie zbliżone jest do systemowego chroot-a znanego każdemu linuksiarzowi. Rzecz jasna, nie jest to to samo. Jeżeli mamy odpowiednio dużo samozaparcia, a przy tym także wiedzy możemy pokusić się o zbudowanie systemowego chroot-a, w którym uruchomiona będzie jedynie usługa ftp. Nie jest to jednak banalne i wymaga uwzględnienia min. wszelkich bibliotek wymaganych przez demona. W środowisku, gdzie bezpieczeństwo ma absolutny priorytet (na pewno nie w przypadku domowego serwera) warto jest poświęcić czas i nerwy. Skoro mowa o samym środowisku. Już po zainstalowaniu i skonfigurowaniu demona ftp można posłużyć się specjalizowanymi aplikacjami, które pomagają w utwardzeniu systemu i podniesieniu ogólnego poziomu bezpieczeństwa - w tym usługi FTP. Znakomitym przykładem jest tutaj projekt Bastile-Linux. Kolejną sprawą, o której wspominaliśmy w części pierwszej, jest sama specyfika ftp-a. Wszystkie informacje są tutaj przesyłane otwartym tekstem - włączając w to login i hasło użytkowników oraz treść przesyłanych danych. Na szczęście deweloperzy dostrzegli ten problem dość dawno temu i większość softu umożliwia skorzystanie z mechanizmów szyfrowania w oparciu o protokoły SSL/TLS. To podstawa. Przejdźmy do rzeczy. Skorzystamy z najpopularniejszego chyba serwera FTP - ProFTPd i zainstalujemy go na systemie CentOS.
Instalacja Zanim to zrobimy musimy wykonać kilka czynności w systemie. Stwórzmy katalog, który posłuży jako domyślny dla usługi FTP (np. home/ftp-dir), a następnie dwa podkatalogi. Do jednego z nich zalogowany użytkownik będzie mógł wrzucać pliki, a z drugiego tylko je pobierać (odpowiednio home/ftp-dir/up oraz home/ftp-dir/down). Każdy z nowoutworzonych katalogów powinien mieć odpowiednie uprawnienia: # chmod 755 ftp-dir # chmod 755 down # chmod 777 up Teraz pora na użytkowników. Stwórzmy trzech - jeden będzie miał pełnię praw zarówno do wrzucania jak i pobierania oraz będzie widział zawartość wszystkich katalogów w obrębie DefaultRoot-a (użytkownik "guru"). Drugi będzie mógł wrzucić dowolne dane do katalogu "UP" oraz ściągać zawartość katalogu "DOWN" bez prawa podejrzenia jego zawartości (użytkownik "eftepowicz") oraz użytkownik, który będzie mógł tylko pobierać wskazane przez nas pliki z katalogu "DOWN" (użytkownik "down"). Żaden z użytkowników nie musi logować się do systemu, możemy im więc spokojnie jako shell wskazać /bin/false lub sbin/nologin # useradd guru -d /home/ftp-dir -s /sbin/nologin # useradd eftepowicz -d /home/ftp-dir -s /sbin/nologin # useradd down -d /home/ftp-dir -s /sbin/nologin # passwd guru (podajemy hasło dla użytkownika "guru"). # passwd eftepowicz (podajemy hasło dla użytkownika "eftepowicz"). # passwd down (hasło dla użytkownika "down") Pora na instalację serwera ProFTPd. Do tego możemy wykorzystać menedżera "Yum". Potrzebne będzie też repozytorium, z którego pobierzemy ProFTPd (aktualne wersje zawiera np. repozytorium prowadzone przez Daga Wieers-a dag.wieers.com/rpm/). Domyślne repozytoria CentOS-a nie zwierają tej paczki. Najpierw więc instalujemy repozytorium: #rpm -Uhv apt.sw.be/packages/rpmforge-release/rpmforge-release-0.3.6-1.el4.rf.i386.rpm następnie poprzez yum-a instalujemy paczkę ProFTPd: # yum install proftpd Konfiguracja Zanim uruchomimy serwer odpowiednio go skonfigurujmy. Plik konfiguracyjny dla ProFTPd to /etc/proftpd.conf i tam będziemy dokonywali wszelkich modyfikacji. Końcowy rezultat pracy widoczny jest w TABELI pod tekstem. Omówimy teraz najważniejsze parametry konfiguracyjne zacznając od ustawień podstawowych. Staramy się aby nasz serwer podawał o sobie jak najmniej informacji w momencie logowania: ServerIdent off
Teraz też musimy podjąć decyzję i wybrać jeden z dwóch trybów, w którym będzie pracował serwer. Do dyspozycji jest albo tryb INETD lub STANDALONE. W trybie inetd demon ftp jest aktywowany tylko wówczas, jeżeli zostanie o to poproszony tj. jeżeli ktoś będzie próbował połączyć się z serwerem FTP. Ma on dwie podstawowe zalety: wszelkie zmiany w konfiguracji nie wymagają ręcznego restartu usługi (aplikowane są w momencie, kiedy nawiązywane jest nowe połączenie); oszczędność zasobów (przydatne tylko wtedy gdy nasza maszyna przeznaczona jest do innych zadań, a serwer FTP stanowi tylko dodatek). Do wad należy zaliczyć przede wszystkim zubożenie możliwości konfiguracji serwera. W naszym przypadku maszyna będzie dedykowanym ftpem zatem pozostajemy przy trybie STANDALONE, gdzie demon uruchomiony jest cały czas (musimy się przy tym liczyć z każdorazowym restartem usługi w przypadku wprowadzenia zmian w konfiguracji): ServerType standalone Informujemy też serwer, że poniższa konfiguracja jest konfiguracją domyślną. Ma to dodatkowe znaczenie w przypadku serwerów wirtualnych, o których nie będziemy teraz wspominać: DefaultServer on Następnie ograniczamy obszar działania użytkowników na serwerze FTP do katalogu /home/ftp-dir (chroot w wydaniu ProFTPd): DefaultRoot /home/ftp-dir Jako model uwierzytelniania użytkowników możemy pozostawić PAM-a (Pluggable Authentication Module) wskazujące też kolejność odpytywania modułów PAM: AuthPAMConfig proftpd AuthOrder mod_auth_pam.c* mod_auth_unix.c oraz wyłączyć rozwiązywania nazw logowania oraz adresów IP klientów (większa wydajność): IdentLookups off UseReverseDNS off Dalej maksymalna liczba dozwolonych wystąpień demona ftp (ochrona przed całkowitym "zamuleniem" serwera): MaxInstances 10 maksymalny czas działania demona w trybie oczekiwania na komendy (w sekundach): TimeoutIdle 240 (4 minuty) przyda się także: TimeoutNoTransfer 240 Dzięki temu parametrowi ograniczymy czas utrzymywania otwartego połączenia podczas, gdy do serwera przystały być wysyłane polecenia lub przekazywane/pobierane dane przez klienta. Na wszelki wypadek nie pozwalamy na zalogowanie się do serwera ROOT-a:
RootLogin off oraz ograniczamy liczbę prób logowania do 3: MaxLoginAttempts 3 Przyda się także ograniczenie liczby sesji nawiązywanych z tego samego adresu IP: MaxClientsPerHost 2 Bez zmian pozostawiamy port na którym nasłuchuje demon: Port 21 Określamy z uprawnieniami jakiego użytkownika i grupy będzie działał demon protfpd bezpośrednio po podpięciu się pod port TCP 21: User nobody Group nobody Nie ma też potrzeby żeby zalogowani użytkownicy "widzieli" pliki "." lub "..": ListOptions "-A" W sekcji "#WZNAWIANIE" pozwalamy aby w razie przerwanego połączenia można było wznowić pobieranie lub umieszczanie danych. Dalej, w sekcji "#LOGOWANIE" określamy parametry logowania zdarzeń (ustawienia domyślne). Sekcja "#Ograniczenie logowania do serwera" wskazuje, z których kont użytkowników możliwe będzie zalogowanie się do serwera. Użytkownicy serwera webowego Apache dostrzegą, że ProFTPD oferuje podobną do niego logikę i składnię budowania reguł. Rzeczywiście zasady są bardzo zbliżone. Sekcja <Global> określa ustawienia wspólne dla całego serwera FTP. Wreszcie przechodzimy od sekcji "#UPRAWNIENIA", gdzie w każdej z podsekcji określamy to, co konkretnie będą mogli robić zalogowani użytkownicy w poszczególnych katalogach. Do katalogu głównego "/home/ftp-dir" mogą oni tylko zaglądać oraz przechodzić do innych katalogów (Zestaw komend DIRS). Katalog "/home/ftp-dir/up", który przeznaczyliśmy jako miejsce wrzucania plików podlega innym ograniczeniom. Tylko użytkownicy "eftepowicz" oraz "guru" mogą przeglądać jego zawartość oraz umieszczać dane (komendy DIRS STOR STOU). Prawo usuwania plików i katalogów przysługuje tylko użytkownikowi guru (komendy DELE RMD). Z kolei do katalogu "/home/ftp-dir/down" pisać oraz zaglądać może tylko i wyłącznie użytkownik "guru". Wszyscy inni mogą jedynie pobierać wskazane wcześniej pliki (jest to tzw. ślepy katalog - brak możliwości wylistowania zawartości - komenda RETR). # ProFTPD PLIK KONFIGURACJI # Id: proftpd.conf,v 1.1 2004/02/26 17:54:30 thias Exp
#USTAWIENIA PODSTAWOWE ServerName "Serwer FTP" ServerIdent off ServerType standalone DefaultServer on AccessGrantMsg "Uzytkownik %u zostal zalogowany." DefaultRoot /home/ftp-dir #MODEL UWIERZYTELNIANIA AuthPAMConfig proftpd AuthOrder mod_auth_pam.c* mod_auth_unix.c #OGRANICZENIA IdentLookups off UseReverseDNS off MaxInstances 10 TimeoutIdle 240 TimeoutNoTransfer 240 RootLogin off MaxLoginAttempts 3 MaxClientsPerHost 2 AllowForeignAddress off UseSendfile no #USTAWIENIA USLUGI Port 21 User nobody Group nobody Umask 022 ListOptions "-A" ScoreboardFile /var/run/proftpd.score #WZNAWIANIE AllowRetrieveRestart on AllowStoreRestart on #LOGOWANIE LogFormat default "%a %l %u %t \"%r\" %s %b" LogFormat auth "%v [%P] %h %t \"%r\" %s" ExtendedLog /var/log/proftpd/access.log WRITE,READ default ExtendedLog /var/log/proftpd/auth.log AUTH auth #OGRANICZENIA GLOBALNE - LOGOWANIA DO SERWERA <Global> <Limit LOGIN> AllowUser eftepowicz AllowUser down </Global>
#UPRAWNIENIA - KATALOG "home/ftp-dir" <Directory /home/ftp-dir> <Limit DIRS> AllowAll </Directory> #UPRAWNIENIA - KATALOG "home/ftp-dir/up" Z PODKATALOGAMI <Directory /home/ftp-dir/up/*> <Limit DIRS STOR STOU> AllowUser eftepowicz <Limit DELE RMD> </Directory> #UPRAWNIENIA - KATALOG "/home/ftp-dir/down" Z PODKATALOGAMI <Directory /home/ftp-dir/down/*> <Limit DIRS STOR STUP> <Limit RETR> AllowAll </Directory> W ten oto sposób dobrnęliśmy do końca. Mamy teraz funkcjonujący serwer FTP, gdzie każdy z użytkowników może dokonywać ściśle określonych działań. A co z przesyłaniem haseł i danych "otwartym tekstem"? Tym tematem zajmiemy się w ostatniej, trzeciej części cyklu.