Przejdź do głównej zawartości

Linux RHCE - FTP - VSFTPD

FTP czyli File Transfer Protocol jest to protokół transferu plików typu klient-serwer wykorzystujący protokół TCP/IP do dwukierunkowej wymiany plików. FTP jest zdefiniowane przez IETF w dokumencie RFC959. Jest to protokół 8 bitowy przez co nie wymaga kodowania danych do 7 bitów jak ma to miejsce przypadku protokołów pocztowych. Do komunikacji wykorzystywane są dwa połączenia TCP jedno z nich służy do przesyłania poleceń drugie do transmisji danych. Połączenie może działaś w dwóch trybach aktywnym i pasywnym. W systemie Red Hat pakietem serwera FTP jest vsftpd. Vsftpd jest to oparty o licencję GPL oprogramowaniem serwea FTP. Więcej informacji na stronie https://security.appspot.com/vsftpd.html



INSTALACJA PAKIETU VSFTPD

Krok 1 - Instalacja pakietu serwera FTP

# yum install -y vsftpd

Krok 2 - Sprawdzenie czy pakiet jest prawidłowo widoczny w systemie

# rpm -qa | grep vsftpd
vsftpd-2.2.2-6.el6_0.1.i686

Krok 3 - Ustawiamy uruchamianie serwera FTP razem z systemem Linux 

# chkconfig vsftpd on

Krok 4 - Sprawdzenie czy ustawienia uruchamiania są prawidłowe 

# chkconfig --list vsftpd
vsftpd  0:off   1:off   2:on    3:on    4:on    5:on    6:off

KONFIGURACJA vsftpd 

Głównym plikiem konfiguracyjnym dla vsftpd jest plik znajdujący się w lokalizacji /etc/vsftpd/vsftpd.conf

Krok 1 - Podgląd dostępnych domyślnych opcji konfiguracyjnych w pliku vsftpd.conf

# grep -v ^# /etc/vsftpd/vsftpd.conf

anonymous_enable=YES
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES

Krok 2 - Poznajemy do czego powyższe opcje mogą zostać użyte. 

anonymous_enable=YES        - Domyślne ustawienie zabezpieczenia , które przestawione na "NO" podnosi poziom zabezpieczeń wyłączając dostęp dla anonimowych użytkowników. 

local_enable=YES            - umożliwia zalogowanie się lokalnym użytkownikom

write_enable=YES            - Umożliwia użytkownikom zapis do katalogu 

local_umask=022             - Ustawia umask dla wszystkich dodawanych plików

dirmessage_enable=YES       - Wyświetla informację o katalogach 

xferlog_enable=YES          - Logowanie aktywności o przesyłanych plikach do /var/log/xferlog

connect_from_port_20=YES    - Bezpośrednie ustawienie portu na 20

xferlog_std_format=YES      - Wszystkie logi w standardowym formacie

listen=YES                  - Umożliwia serwerowi nasłuchiwanie na porcie

pam_service_name=vsftpd     - Nazwa używana w usłudze PAM

userlist_enable=YES         - Włącza usługę kontroli listy użytkowników

tcp_wrappers=YES            - Zezwala na zapytania po protokole TCP 

userlist_deny=YES                            -  Włącza listę użytkowników mogących zalogować się do serwera FTP

Wszystkie dostępne opcje konfiguracyjne jakie można ustawić w pliku vsftpd.conf można poznać ze stron podręcznika systemowego. 

# man vsftpd.conf

IP_CONNTRACK_FTP 

Do stworzenia połączenia FTP w trybie aktywnym wykorzystywany jest port 21 dla poleceń oraz 20 dla przesyłu danych. Inaczej rzecz się ma w przypadku połączenia pasywnego gdzie do poleceń również wykorzystywany jest port 21 ale do przesyłu danych port powyżej 1024. Jeżeli nie jest on określony będzie to port jakiego numeru nie znamy co za tym idzie nie wiemy jaki ruch należy otworzyć na zaporze iptables. W tym celu stworzony został moduł "ip_conntrack_ftp", którego zadaniem jest śledzenie jakie porty zostają użyte dla przesyłu danych w trybie pasywnym i otworzenie odpowiedniego ruchu w zaprze iptables. Po zakończonym transferze odpowiedni port zostaje zamknięty i wykluczony z zapory.

By włączyć moduł dopisujemy go w pliku: 

/etc/sysconfig/iptables-config

IPTABLES_MODULES="ip_conntrack_ftp"


Następnie restartujemy usługę iptables : 

# service iptables restart 

iptables: Flushing firewall rules:                  [  OK  ]
iptables: Setting chains to policy ACCEPT: filter   [  OK  ]
iptables: Unloading modules:                        [  OK  ]
iptables: Applying firewall rules:                  [  OK  ]
iptables: Loading additional modules: ip_conntrack_ftp [  OK  ]


KONFIGURACJA FIREWALL I SELINUX DLA VSFTPD

Zanim zaczniemy używać usługi serwera FTP należy wprowadzić reguły iptables oraz ustawienia SELinux. 

Zacznijmy od ustawień iptables umożliwiając pracę serwera FTP na portach 20 i 21. 

Krok 1 - Dodanie reguł do łańcuchów iptables 

# iptables -I INPUT 5 -p tcp -m tcp --dport 20 -j ACCEPT
# iptables -I INPUT 5 -p tcp -m tcp --dport 21 -j ACCEPT

Krok 2 - Zapisanie nowych reguł w tablicy firewall

# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[OK]

Krok 3 - Restart usługi iptables dla wprowadzenia zmian

# service iptables restart
iptables: Flushing firewall rules:                  [  OK  ]
iptables: Setting chains to policy ACCEPT: filter   [  OK  ]
iptables: Unloading modules:                        [  OK  ]
iptables: Applying firewall rules:                  [  OK  ]

Teraz zabieramy się za ustawienie opcji SELinux. Poniżej lista możliwych do konfiguracji opcji SELinux potrzebnych do działania serwera vsftpd. 

ftp_home_dir 
Zezwala serwerowi FTP na czytanie i zapisywanie plików w katalogach domowych użytkowników

allow_ftpd_full_access
Zezwala na zalogowanie do serwera FTP lokalnym użytkownikom oraz czytanie i zapisywanie wszystkich plików systemu

allow_ftpd_use_nfs
Zezwala serwerowi FTP na używanie NFS

allow_ftpd_anon_write
Umożliwia wrzucanie na serwer FTP plików dostępnych publicznie dla innych użytkowników

ftp_connect_db
Umożliwia logowanie się do bazy MySQL przez serwer FTP 

allow_ftpd_use_cifs
Umożliwia użycie CIFS przez serwer FTP 

http_enable_ftp_server
Zezwala na wy listowanie plików httpd przez port FTP

Teraz umożliwimy użytkownikom zapisywanie i odczytywanie plików w systemie 

Krok 1 - Zabezpieczenie dostępu wyłączając pełny dostęp do plików systemu 

# getsebool -a | grep ftpd_full
allow_ftpd_full_access --> off

Krok 2 - Wyłącznie ochrony SELinux 

# setsebool -P allow_ftpd_full_access=1

Krok 3 - Sprawdzenie wprowadzonych zmian 

# getsebool -a | grep ftpd_full
allow_ftpd_full_access --> on

PODSTAWY BEZPIECZEŃSTWA DLA VSFTPD

Po konfiguracji ustawień SELinuxa dla usługi vsftpd powinno się również skonfigurować podstawowe zabezpieczenia. Protokół FTP wspiera dwa różne rodzaje transferu plików. Pierwszym rodzajem jest tryb aktywny (Active mode) , który używa portu 20 do połączenia z klientem, Drugim rodzajem jest typ pasywny  (passive mode) używający ręcznie skonfigurowanego portu powyżej 1024. Ponieważ do wyboru mamy dwa typy transferu plików musimy zdecydować którego z nich będziemy używać i zgodnie z dokonanym wyborem poprawić konfigurację ustawień wraz z otworzeniem odpowiednich portów w zaporze (iptables). Wracając do opcji konfiguracji opcja ustawiająca port 20 (connect_from_port_20) jest ustawiana domyślnie i określa jak domyślny typ transferu plików tryb aktywny (active mode). 

Zobaczmy jakie inne podstawowe opcje mamy dostępne w kwestii ustawienia zabezpieczeń. Możemy uniemożliwić logowanie się do serwera FTP użytkownikom anonimowym ustawiając przełącznik annonymous_enable na wartość "NO". Opcja "local_enable" która jest opcją domyślnie włączana dla serwera FTP po instalacji zezwala lokalnym użytkownikom na logowanie do usługi FTP jest to bezpieczniejsze rozwiązanie niż wyłączenie tej opcji wraz z utrzymywaniem osobnej listy użytkowników jacy mają zezwolenie na logowanie do serwera FTP. 

DOSTĘP DLA OKREŚLONYCH UŻYTKOWNIKÓW

Kolejnym krokiem jaki należy zrobić dla podniesienia bezpieczeństwa usługi FTP jest ustalenie listy użytkowników, którzy mogą lub nie mogą logować się do serwera FTP. Opcja userlist_enable domyślnie po instalacji ustawiona jest z parametrem "YES" i umożliwia usłudze vsftpd sprawdzanie logujących się użytkowników z listą znajdującą się w pliku /etc/vsftpd/user_file. Jeżeli opcja ta używana jest w połączeniu z dodatkową opcją userlist_deny wszyscy użytkownicy których loginy znajdują się na liście mają zablokowany dostęp i uniemożliwione logowanie do usługi FTP. Jeżeli natomiast ustawimy userlist_deny z parametrem "=NO" tylko użytkownicy znajdujący się na liście mogą się zalogować. Opcje te umożliwiają dokładniejsze zarządzanie użytkownikami i ich prawami do logowania przy pomocy usługi FTP.

Krok 1 - Tworzymy plik user_file

# vim /etc/vsftpd/user_file

w pliku wpisujemy login użytkownika, który ma mieć możliwość logowania się do usługi FTP.

Krok 2 - Zmiana zmiennych logicznych SELinux

Sprawdzamy jakie zmienne są dostępne dla usługi vsftpd :


# getsebool -a | ftp
-bash: ftp: command not found
[root@station1 ftp]# getsebool -a | grep ftp
allow_ftpd_anon_write --> on
allow_ftpd_full_access --> off
allow_ftpd_use_cifs --> off
allow_ftpd_use_nfs --> off
ftp_home_dir --> off
ftpd_connect_db --> off
httpd_enable_ftp_server --> off
tftp_anon_write --> off

Zmieniamy odpowiednią zmienną tak by użytkownicy lokalni mogli logować się przez FTP do swoich katalogów domowych: 

# setsebool -P ftp_home_dir on

Ponowne sprawdzenie wprowadzonych zmian : 

# getsebool -a | grep ftp
allow_ftpd_anon_write --> on
allow_ftpd_full_access --> off
allow_ftpd_use_cifs --> off
allow_ftpd_use_nfs --> off
ftp_home_dir --> on
ftpd_connect_db --> off
httpd_enable_ftp_server --> off
tftp_anon_write --> off

Teraz użytkownicy mogą logować się do swoich katalogów domowych przy użyciu ftp. 

Należy pamiętać by konto użytkownika istniało w systemie! 

Blokowanie użytkowników z listy /etc/vsftpd/user_file 

Krok 1 - Dodanie wpisu w pliku /etc/vsftpd/vsftpd.conf

# vim /etc/vsftpd/vsftpd.conf

W ostatnich liniach pliku dodajemy wpis : 

userlist_deny=NO

Zapisujemy plik i restartujemy usługę

service vsftpd restart 

Teraz uzytkownicy, których loginy znajdują się w pliku /etc/vsftpd/user_file nie będą mogli się zalogować do usługi serwera FTP. 

DOSTĘP Z OKREŚLONYCH HOSTÓW

Inną sytuacją może być taki sposób udostępnienia możliwości korzystania z FTP , że ograniczenie obejmuję nie tylko wybranych użytkowników ale i maszyny (hosty) z jakich dani użytkownicy mogą się podłączyć.

W takiej sytuacji jednym ze sposobów jest wykorzystanie plików :
  • /etc/hosts.allow
  • /etc/hosts.deny
W plikach tych możemy ustawić jakie hosty będą mogły mieć dostęp do danej usługi uruchomionej na danej maszynie. I tak zapis w pliku hosts.deny w postaci : 

# cat /etc/hosts.deny
#
# hosts.deny    This file contains access rules which are used to
#               deny connections to network services that either use
#               the tcp_wrappers library or that have been
#               started through a tcp_wrappers-enabled xinetd.
#
#               The rules in this file can also be set up in
#               /etc/hosts.allow with a 'deny' option instead.
#
#               See 'man 5 hosts_options' and 'man 5 hosts_access'
#               for information on rule syntax.
#               See 'man tcpd' for information on tcp_wrappers
#
vsftpd: ALL

Oznacza, że wszystkie inne hosty poza lokalnym mają zablokowany dostęp do usługi vsftpd. 

Teraz jeżeli chcemy możemy umożliwić dostęp dla wybranego hosta poprzez dodanie odpowiedniego wpisu w pliku hosts.allow w postaci : 

# cat /etc/hosts.allow
#
# hosts.allow   This file contains access rules which are used to
#               allow or deny connections to network services that
#               either use the tcp_wrappers library or that have been
#               started through a tcp_wrappers-enabled xinetd.
#
#               See 'man 5 hosts_options' and 'man 5 hosts_access'
#               for information on rule syntax.
#               See 'man tcpd' for information on tcp_wrappers
#
vsftpd: 192.168.56.102

Taki wpis umożliwia udostępnienie usługi vsftpd dla użytkowników logujących się z maszyny o adresie IP 192.168.56.102 lub zapis ten mógł by wyglądać host1.example.com. 

Jeżeli dostęp do usługi FTP ma być możliwy tylko z maszyny lokalnej oraz z jednego wybranego hosta ustawienie takie można wykonać stosując konfigurację iptables. Dopuszczając ruch z wybranej maszyny na port 21 do serwera FTP.

ANONIMOWE POBIERANIE I WYSYŁANIE PLIKÓW PRZY UŻYCIU FTP

Jeżeli chcemy by usługa ftp umożliwiała użytkownikom anonimowym (czyli takim, którzy logują się do serwera użytkownikiem "anonymous" bez podania hasła lub jako hasło podając adres email ) pobieranie oraz wysyłanie plików korzystając z serwera ftp należy wykonać odpowiednią konfigurację poprzez edycję  pliku konfiguracyjnego oraz nadanie odpowiednich uprawnień i kontekstów katalogom.

Krok 1 - Edycja głównego pliku konfiguracyjnego /etc/vsftpd/vsftpd.conf 

W pliku /etc/vsftpd/vsftpd.conf konfigurujemy możliwość korzystania z serwera ftp dla użytkowników anonimowych w następujący sposób:


# grep -v ^# /etc/vsftpd/vsftpd.conf

anonymous_enable=YES
local_enable=NO
write_enable=YES
local_umask=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES

pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES

Czyli upewniamy się, że dostęp dla użytkowników anonimowych jest włączony oraz, że mają oni możliwość przesyłać pliki na serwer ftp.

Krok 2 - Stworzenie katalogów do pobierania i wysyłania plików

W lokalizacji /var/ftp tworzymy dwa katalogi :

# mkdir download 
#mkdir upload 

Krok 3 - Sprawdzenie kontekstów na katalogach

ls - Z 

unconfined_u:object_r:public_content_t:s0 download
unconfined_u:object_r:public_content_t:s0 upload

Krok 4 - Ustawienie poprawnych kontekstów

Jeżeli mamy do dyspozycji domyślny katalog servera ftp /var/ftp/pub możemy przenieść jego konteksty na tworzone nowe katalogi

# chcon --reference pub/ download/
# chcon --reference /pub upload/

otrzymując :

# ls -Z 

system_u:object_r:public_content_t:s0 download
system_u:object_r:public_content_t:s0 upload

Krok 5 - Zmiana kontekstu katalogu do przesyłania plików na serwer ftp

Jeżeli chcemy by użytkownicy anonimowi mogli przesyłać swoje pliki do katalogu upload potrzeba wykonać jeszcze jedną zmianę kontekstu.

# chcon -t public_content_rw_t upload/ 

sprawdzenie kontekstu :

# ls -Z 


system_u:object_r:public_content_rw_t:s0 upload

Krok 6 - Uprawnienia systemowe katalogów 

Katalog /download powinien umożliwiać pobieranie znajdujących się w nim plików, ale nie pozwalać na przesyłanie do niego oraz modyfikację. 

# chmod 755 download


Katalog /upload powinien umożliwiać przesyłanie plików na serwer ale uniemożliwiać pobieranie już przesłanych.

# chmod 777 upload/ 

Jeżeli chcemy by po przesłaniu pliki pozostawały niewidoczne dla użytkownika nadajemy uprawnienia zabraniające odczyt:

# chmod 753 upload/ 
lub
# chmod 733 upload/

Aby użytkownik mógł przesłać i jednocześnie widzieć listę plików pozostawiamy uprawnienia

# chmod 777 upload/ 

pomimo uprawnień umożliwiających odczyt, zapis i wykonanie nie będzie można pobierać plików ani zmodyfikować już przesłanych.



Komentarze

  1. Dziękuję za bardzo pomocny wpis - wiele sie z niego nauczyłem. Wydaje mi sie jednak, że znalazłem kilka nieścisłości:
    1. z moich "doświadczeń" wynika, że uprawnienia "write" na katalogu wcale nie sa potrzebne do upload'owania danych - wystarczą uprawnienia 'x', a kluczowy jest ustawienie kontekstu na public_content_rw_t, zmiany w SELinux (np. allow_ftpd_anon_write) i ustawienia w vsftpd.conf.
    2. Co więcej, ustawienie opcji 'w' na katalogu domyślnym użytkowników anonimowych i jednoczesne ustawienie allow_ftpd_full_access (do czego nas zachęca audit2allow) spowoduje blad przy logowaniu się tych użytkownikow ( vsftpd: refusing to run with writable anonymous root).
    Pozdrawiam,
    szamasz

    OdpowiedzUsuń

Prześlij komentarz

Najczęściej czytane w tym miesiącu

50 popularnych pytań dotyczących systemu Linux zadawanych na rozmowach kwalifikacyjnych. (Pytania & Odpowiedzi)

Jak dodać użytkownika w systemie Windows z poziomu konsoli CMD? (net user, net localgroup)

Generowanie testowych plików o określonej wielkości