Konfiguracja vsftpd w Debianie

Spis treści

Serwery FTP umożliwiają przesyłanie plików przez sieć za pomocą protokołu TCP. Raczej wszyscy mieliśmy z nimi już do czynienia. Może niekoniecznie zarządzaliśmy takimi serwerami ale na pewno zdarzyło nam się pobierać pliki za ich pomocą. W tym wpisie jednak postaramy się skonfigurować taki serwer FTP w oparciu o oprogramowanie vsftpd.

Instalacja vsftpd

By postawić sobie FTP'a, w Debianie musimy doinstalować pakiet vsftpd . Standardowo w paczce jest dostępny plik konfiguracyjny /etc/vsftpd.conf , który będziemy musieli sobie nieco dostosować. Mamy także plik /etc/ftpusers , w którym są zawarte nazwy użytkowników, którzy nie będą w stanie się logować na serwer FTP. Z pakietem vsftpd są także dostarczane przykładowe pliki konfiguracyjne. Są one ulokowane w katalogu /usr/share/doc/vsftpd/examples/ . My jednak stworzymy sobie całą konfigurację od podstaw i postaramy sobie wyjaśnić większość definiowanych opcji.

Przede wszystkim musimy utworzyć sobie odpowiednią strukturę katalogów. Logujemy się zatem na użytkownika root i wydajemy w terminalu te poniższe polecenia:

# mkdir /var/run/vsftpd/empty/
# mkdir /etc/vsftpd/users/
# touch /etc/vsftpd/userlist
# touch /etc/vsftpd/chroot_list
# touch /etc/vsftpd/banned_emails
# touch /etc/vsftpd/email_passwords
# touch /etc/vsftpd/banner

Katalogu /var/run/vsftpd/empty/ raczej nie będziemy musieli tworzyć ręcznie, bo systemd stworzy go automatycznie przy starcie systemu za pomocą mechanizmu systemd-tmpfiles. W katalogu users/ będzie trzymana konfiguracja specyficzna dla konkretnych użytkowników FTP. Można przy jej pomocy nadpisać konfigurację główną. W pliku userlist będą definiowani użytkownicy, który będą mogli (ew. nie będą mogli) uzyskać dostęp do FTP'a. Dalej mamy plik chroot_list , który będzie zawierał listę chroot'owanych użytkowników lokalnych. W pliku email_passwords będą trzymane hasła dla użytkowników anonimowych. Z kolei w pliku banned_emails będą hasła, których użytkownik anonimowy nie będzie w stanie używać do zalogowania. Ostatnim plikiem jest banner , gdzie może być przechowywana informacja zwracana użytkownikom tuż po zalogowaniu się na serwer.

Tworzymy także strukturę katalogów pod samego FTP'a:

# mkdir /media/ftp/
# mkdir /media/ftp/anon/
# chown ftp:ftp /media/ftp/anon/
# mkdir /media/ftp/ftp/
# chown morfik:ftp /media/ftp/ftp/
# chmod -w /media/ftp/

Katalog /media/ftp/anon/ będzie przeznaczony dla klientów anonimowych. Natomiast w /media/ftp/ftp/ będzie faktyczny FTP. Ściągamy także prawa do zapisu głównego katalogu FTP. Musimy to zrobić na potrzeby chroot lokalnych użytkowników.

Oczywiście nie potrzebujemy wszystkich tych plików, a to, które z nich wykorzystamy będzie zależeć głównie od tego jakie parametry umieścimy w pliku /etc/vsftpd.conf . W niczym jednak te puste pliki i katalogi nie przeszkadzają. Dlatego też można je sobie stworzyć i wykorzystać w przyszłości jeśli zajdzie taka potrzeba.

Konfiguracja serwera vsftpd w pliku vsftpd.conf

Wszystkie poniższe parametry musimy umieścić w pliku /etc/vsftpd.conf . Zawierać może on dość sporo opcji i w przypadku tych, których nie będziemy używać, zostaną ustawione wartości domyślne.

Demon vsftpd

Demon vsftpd może nasłuchiwać zarówno w protokole IPv4 jak i IPv6. Może także być uruchamiany w trybie "standalone" lub za pomocą inetd. Dodajmy zatem tę poniższą zwrotkę do konfiguracji:

listen=YES
listen_address=127.0.0.1
listen_ipv6=NO
#listen_address6=
listen_port=21
background=NO
run_as_launching_user=NO
nopriv_user=ftp

Trzeba wiedzieć, że parametry listen oraz listen_ipv6 wzajemnie się wykluczają i nie możemy obu z nich ustawić na YES . Jeśli chcemy, by serwer FTP nasłuchiwał w obu protokołach, to wystarczy, że ustawimy tę drugą opcję. Nie możemy jednak podawać żadnego adresu IPv6 w listen_address6 . Jeśli jednak zamierzamy to zrobić, to będziemy musieli rozbić tę konfigurację na dwa pliki i uruchomić dwa osobne procesy vsftpd . My jednak ograniczymy się do protokołu IPv4 i odpalimy FTP na adresie określonym przez listen_address .

Domyślny port to 21 ale możemy go zmienić dostosowując odpowiednio parametr listen_port . Opcja background odpowiada za odpalenie demona w tle. Nie ustawiamy jej ze względu na systemd. Dalej mamy jeszcze opcję run_as_launching_user , która określa czy demon vsftpd ma być uruchomiony jako ten użytkownik, który wywołuje proces. Nie jest to dobrym pomysłem i dużo lepszym rozwiązaniem jest wskazanie użytkownika w parametrze nopriv_user w celu zrzucenia uprawnień.

Aktywny i pasywny tryb FTP

Serwer FTP może operować w trybie aktywnym lub pasywnym. Chodzi o to, w jaki sposób zostanie nawiązane połączenie służące do przesyłu danych. W obu przypadkach, klient chcąc nawiązać połączenie z serwerem FTP wysyła mu żądanie na port 21. To połączenie zwykle zostaje otwarte bez większego problemu. Niemniej jednak, tutaj są przesyłane jedynie polecenia kontrolne i potrzeba zestawić drugie połączenie, by przesył danych plików był możliwy.

W trybie aktywnym, klient zaczyna nasłuchiwać na losowym porcie i oczekuje połączenia od serwera FTP zwykle z portu 20. W tym celu klient wysyła do serwera polecenie PORT zawierające informacje na temat tego losowego portu. W trybie pasywnym zaś, klient przesyła polecenie PASV , na które serwer odpowiada swoim adresem i portem. W oparciu o te informacje, klient tworzy drugie połączenie, którym dane mogą zostać przesłane.

Widzimy zatem, że w przypadku trybu aktywnego mogą pojawić się problemy z połączeniem, bo większość stacji roboczych stoi zwykle za NAT'em czy też innym firewall'em i nie może zaakceptować połączenia, które zainicjował serwer FTP. Dlatego też możemy ten tryb zwyczajnie wyłączyć i akceptować jedynie połączenia w trybie pasywnym. Dopiszmy zatem ten poniższy blok parametrów do pliku konfiguracyjnego vsftpd :

port_enable=NO
connect_from_port_20=NO
ftp_data_port=20
port_promiscuous=NO
pasv_enable=YES
pasv_min_port=50000
pasv_max_port=50999
pasv_promiscuous=NO

Za włączenie trybu aktywnego odpowiada opcja port_enable . Jeśli zostanie ustawiona na NO , to serwer FTP nie będzie akceptował polecenia PORT podczas próby nawiązywania połączenia. Jeśli jednak chcielibyśmy włączyć obsługę trybu aktywnego to musimy określić w connect_from_port_20 czy te połączenia będą inicjowane z portu 20 na serwerze. Jeśli chcemy określić inny port, to możemy to zrobić w ftp_data_port . Trzeba przy tym pamiętać, że część klientów FTP wymaga portu 20 i przestawienie go na inny może powodować problemy z połączeniem. Opcję port_promiscuous ustawiamy na NO , co zapewni nas, że połączenie nawiązane przez serwer trafi jedynie do klienta, który wyraził chęć transferu danych.

Pozostałe opcje dotyczą już tylko trybu pasywnego. Który możemy włączyć lub wyłączyć przy pomocy pasv_enable . W parametrach pasv_min_port i pasv_max_port określamy zakres portów, które serwer będzie wykorzystywał, gdy będą przychodzić żądania transferu danych. Niekoniecznie musimy je tutaj podawać, bo te dwa parametry mają głównie na celu ułatwienie konfiguracji zapory sieciowej. Domyślnie serwer będzie korzystał z wolnych portów. Opcja pasv_promiscuous odpowiada za mechanizm bezpieczeństwa zapewniający, że połączenie rozpoczynające transfer danych pochodzi z tego samego adresu IP, co połączenie kontrolne na port 21.

Ograniczenie ilości połączeń

Każdy serwer jest w stanie obsłużyć skończoną ilość jednoczesnych połączeń. W przypadku, gdy nie dysponujemy za mocnym sprzętem, to możemy zmniejszyć nieco parametr max_clients . Możemy też zmniejszyć limit połączeń nawiązywanych z jednego adresu IP przy pomocy max_per_ip . Oczywiście nic nie stoi na przeszkodzie, by zaimplementować obydwa limity w tym samym czasie. Dodajmy zatem te dwa poniższe wpisy do pliku konfiguracyjnego vsftpd :

max_clients=100
max_per_ip=5

Nieudane próby logowania

Ograniczenie ilości prób logowania może spowolnić zautomatyzowane ataki siłowe na hasło. Przy pomocy parametru max_login_fails możemy ustawić maksymalną ilość prób, po przekroczeniu której połączenie zostanie unicestwione przez serwer FTP. Mamy także do dyspozycji opcje delay_failed_login oraz delay_successful_login , które są w stanie opóźnić ponownie próby logowania (czas w sekundach):

max_login_fails=3
delay_failed_login=1
delay_successful_login=0

Ograniczenie transferu

By nasz serwer FTP nie wysiadł pod naporem rządnych plików klientów, możemy wprowadzić ograniczenie transferu. Służą do tego dwa parametry: anon_max_rate oraz local_max_rate . Definiujemy w nim zarówno prędkość pobierania jak i wysyłania (w bajtach). Wartość 0 wyłącza ograniczenie:

anon_max_rate=0
local_max_rate=0

Pobieranie i wysyłanie plików

Za globalne ustawienia pobierania oraz wysyła plików z i do serwera FTP odpowiadają te poniższe cztery parametry:

write_enable=NO
download_enable=YES
ascii_upload_enable=NO
ascii_download_enable=NO

Nie ma raczej potrzeby rozpisywać się nad opcjami write_enable oraz download_enable . Problematyczne za to mogą okazać się te dwa ostatnie parametry. Kontrolują one włączenie trybu ASCII, który może czasem prowadzić do ataku DoS (polecenie SIZE /duzy/plik ). Najlepiej jest ten tryb po prostu wyłączyć.

Komunikaty zwracane przez serwer

Po zalogowaniu się użytkownika, serwer FTP może zwrócić mu określoną wiadomość, którą ustawimy w konfiguracji. Jeśli to ma być w miarę krótka informacja, to możemy ją określić bezpośrednio w parametrze ftpd_banner . W przypadku, gdy chcemy się nieco wysilić i stworzyć bardziej rozbudowaną wiadomość, to możemy wskazać plik tekstowy przy pomocy opcji banner_file :

ftpd_banner=Welcome to Morfikownia.
#banner_file=

Dodatkowo, w każdym katalogu możemy umieścić plik .message , który będzie czytany po włączeniu opcji dirmessage_enable . Jeśli taki plik zostanie odnaleziony w katalogu, do którego przeszedł klient, to zostanie mu wyświetlona jego zawartość. Nazwę samego pliku również możemy zmienić za pomocą parametru message_file :

dirmessage_enable=YES
message_file=.message

Strefa czasowa

Czas modyfikacji plików zwracany przez vsftpd jest standardowo ustawiony w oparciu o UTC. W Polsce mamy czas zimowy UTC+1 i czas letni UTC+2, co będzie powodować podawanie nieprawidłowego czasu zwracanego w listingach plików i katalogów. Przy pomocy opcji use_localtime możemy wymusić, by ten czas był podawany w oparciu o naszą lokalną strefę czasową:

use_localtime=YES

By to powyższe ustawienie było w ogóle możliwe, trzeba wyeksportować zmienną TZ . Nie możemy jednak tego robić globalnie za pomocą pliku /etc/environment i musimy to zrobić albo w skrypcie startowym, albo w usłudze systemd. W tym przypadku demon vsftpd jest odpalany za pomocą systemd, zatem edytujemy plik usługi przy pomocy systemctl edit --full vsftpd i dopisujemy w nim tę poniższą linijkę:

[Service]
...
Environment="TZ=Europe/Warsaw"

Pamiętajmy jednak, że klienty FTP są w stanie ustawić odpowiedni czas automatycznie i raczej nie ma potrzeby korzystania z parametru use_localtime . Jeśli jednak zdecydowaliśmy się na dopisanie go do pliku konfiguracyjnego, to w pewnych przypadkach listing plików i katalogów może zwracać czas z przyszłości, w zależności od różnicy czasu w stosunku do strefy UTC.

Timeout'y

Użytkownik po zalogowaniu się na FTP wykonuje zwykle jakieś działania. Niemniej jednak, po pobraniu czy wysłaniu plików, sesja pozostaje przez dłuższy czas otwarta w trybie IDLE. Czas bezczynności możemy dostosować za pomocą parametru idle_session_timeout (czas w sekundach):

idle_session_timeout=300

Istnieje także opcja, która jest w stanie rozłączyć klienta podczas przesyłania danych. Znajduje ona zastosowanie jedynie w przypadku, gdy transfer z jakiegoś powodu został zablokowany i nie ma widocznego postępu przy przesyłaniu pliku. Jeśli taka sytuacja nastąpi, to sesja użytkownika zostanie zakończona po czasie określonym w parametrze data_connection_timeout :

data_connection_timeout=60

Mamy także możliwość określenia timeout'u w przypadku ustanawiania połączenia, w którym mają być wymieniane dane. Czas oczekiwania na połączenie w trybie pasywnym definiujemy w parametrze accept_timeout . Natomiast jeśli chodzi o tryb aktywny, to odpowiada za niego opcja connect_timeout :

accept_timeout=60
connect_timeout=60

TCP wrapper

TCP wrapper jest w stanie regulować dostęp do usług sieciowych za pomocą plików /etc/hosts.allow oraz /etc/hosts.deny . Jeśli w vsftpd zostało wkompilowane wsparcie dla tego mechanizmu, to będzie można z niego skorzystać przez ustawienie opcji tcp_wrappers . Jak możemy wyczytać na stronie Achrlinux'a, ten mechanizm jest bardzo stary i lepiej nie zawracać sobie nim głowy. Dlatego też wyłączmy jego ewentualną obsługę:

tcp_wrappers=NO

Wsparcie dla UTF-8

Opcja utf8_filesystem nie jest nigdzie udokumentowana ale za jej pomocą możemy włączyć w vsftpd wparcie dla kodowania UTF-8. Chodzi generalnie o fakt błędnego interpretowania nazw plików w różnych klientach FTP, m.in. w Firefox'e. Bez określenia tej opcji, przeglądarka domyślnie w miejscu polskich znaków będzie pokazywać krzaki. Wszystko za sprawą wykrycia nieprawidłowego kodowania ISO-8859-1. Po ustawieniu tej opcji, polecenie FEAT będzie zwracać m.in. UTF8 sygnalizując klientom, by korzystały z tego kodowania znaków:

utf8_filesystem=YES

Odmawianie dostępu oraz ukrywanie plików i ich atrybutów

Na serwerze FTP możemy posiadać pliki i katalogi, które nie zawsze chcemy udostępniać wszystkim logującym się użytkownikom. Opcje hide_file oraz deny_file włączają ciekawy mechanizm, który sprawia, że przeciętny użytkownik nie będzie w stanie zobaczyć i pobrać pewnych rzeczy. Gdy dany plik jest umieszczony w pierwszej dyrektywie, to klienci nie zobaczą określonych plików i katalogów na listingu. Będą jednak w stanie uzyskać dostęp do tych zasobów ręcznie wpisując odpowiednie ścieżki. Jeśli taki schemat nie jest pożądany, możemy te wzory dopasowań umieścić także w drugiej dyrektywie. Pamiętajmy też, że wpisanie pliku jedynie do deny_file wprawdzie uniemożliwi jego pobranie czy usunięcie ale nie ukryje go i będzie on widoczny cały czas na listingu. Poniżej przykład zastosowania:

hide_file={*.mp3,.hidden,hide*,h?}
deny_file={*.mp3}

Jeśli listing plików nie jest pożądany, to możemy go całkowicie wyłączyć przy pomocy opcji dirlist_enable . To ustawienie jest przydatne jedynie w przypadku, gdy chcemy aby ktoś wrzucał nam pliki na FTP'a bez udzielania mu informacji co do tego jakie pliki już na tym serwerze się znajdują. W każdym innym przypadku lepiej jest włączyć tę opcję:

dirlist_enable=YES

Listing plików i katalogów zawiera numery identyfikacyjne użytkowników (UID) i grup (GID). Możemy zamaskować tę informację korzystając z parametru hide_ids . W takim przypadku, numery ID będą wskazywać na użytkownika i grupę ftp :

hide_ids=NO

Serwer vsftpd standardowo nie pokazuje plików ukrytych, tj. tych, których nazwy zaczynają się od . . Jest to standardowy mechanizm spotykany w linux'ach. Jeśli jednak chcemy, by te pliki były pokazywane, to możemy włączyć opcję force_dot_files :

force_dot_files=YES

Dozwolone i zabronione polecenia

W vsftpd mamy dwa parametry, tj. cmds_allowed oraz cmds_denied , które są w stanie odpowiednio wyprofilować polecenia, które zalogowany użytkownik będzie mógł przesyłać do serwera FTP. Wszystkie polecenia używane w protokole FTP można znaleźć na wiki.

#cmds_allowed=PASV,RETR,QUIT
#cmds_denied=

Lista zablokowanych klientów

Mechanizm listy użytkowników, który można włączyć w vsftpd za pomocą parametru userlist_enable działa na dobrą sprawę na dwa sposoby. Pierwszy z nich ma na celu zablokować próby logowania wszystkich użytkowników, który zostaną zdefiniowani w pliku określonym przez opcję userlist_file . To jest standardowe zachowanie i można je wykorzystać do blokowania próby przesłania haseł w postaci czystego tekstu. Z kolei drugi tryb możemy włączyć przy pomocy parametru userlist_deny poprzez przestawienie jego wartości na NO . W takim przypadku, tylko te loginy, które znajdują się na liście będą mieć możliwość zalogowania się na FTP:

userlist_enable=YES
userlist_file=/etc/vsftpd/userlist
userlist_deny=YES

Nadpisywanie konfiguracji użytkowników

Konfiguracja globalna, którą w tej chwili cały czas dostosowujemy może zostać nadpisana za pomocą osobnych plików, które trzeba umieścić w katalogu określonym przez parametr user_config_dir :

user_config_dir=/etc/vsftpd/users/

W tym folderze umieszczamy zwykle pliki tekstowe o nazwach kont użytkowników, którzy mogą logować się na FTP'a. Gdy taki użytkownik próbuje się zalogować, system może mu przypisać niestandardowe ustawienia. W taki sposób, można, np. wyłączyć globalnie tryb zapisu dla wszystkich użytkowników, po czym w tych plikach przepisać ten sam parametr ale tylko w przypadku tych klientów, którym chcemy zezwolić na zapis danych. Trzeba jednak mieć na uwadze, że nie wszystkie parametry można dostosować osobno dla każdego klienta.

Prawa dostępu do plików (umask)

Pliki wysyłane przez użytkowników na serwer FTP muszą posiadać jakieś domyślne uprawnienia, które są aplikowane podczas ich tworzenia na maszynie zdalnej. W vsftpd odpowiadają za to trzy parametry: file_open_mode , anon_umask oraz local_umask . Wartość file_open_mode wskazuje zwykle 0666 lub 0777 . To, którą z nich wybierzemy zależy głównie od tego czy chcemy, aby przesyłane na FTP pliki posiadały domyślnie atrybut wykonywalności. Lepiej jest tutaj ustawić zatem 0666 . Pozostałe dwa parametry odpowiadają za umask. Bezpieczne prawa do plików wyglądają zatem tak:

file_open_mode=0666
anon_umask=0022
local_umask=0022

Oczywiście ten umask nie musi wskazywać na taką samą wartość i może być inny w przypadku użytkowników lokalnych jak i anonimowych. Niemniej jednak, w tym przypadku wszystkie pliki tworzone na FTP'ie będą posiadać prawa 644 (0666-0022). Więcej informacji na temat umask można znaleźć tutaj.

Konta z błędnym shell'em

Konta FTP nie muszą posiadać poprawnego shell'a. Możemy tę sytuację wykorzystać i wszystkim takim użytkownikom zablokować możliwość logowania się w systemie, co znacznie poprawi bezpieczeństwo systemu. Jest tylko jeden problem. Chodzi o to, że vsftpd weryfikuje poprawność shell'a i gdy konto ma ustawiony, np. /bin/false , to zostanie zgłoszony błąd. Lista poprawnych shell'ów jest dostępna w pliku /etc/shells . Można by oczywiście dopisać tam kilka pozycji ale jest prostszy sposób. Możemy posłużyć się opcją check_shell , która wyłączy sprawdzanie shell'a i tym samym umożliwi logowanie się użytkownikom mającym /bin/false :

check_shell=NO

Ten mechanizm znajduje zastosowanie jedynie w przypadku, gdy vsftpd nie został skompilowany z obsługą PAM.

Użytkownicy anonimowi

Na FTP mogą logować się przeróżni użytkownicy. W sporej części przypadków będziemy mieli do czynienia z użytkownikami anonimowymi. Są to tacy klienci, którzy identyfikują się loginem ftp lub anonymous . W zależności od przeznaczenia FTP'a możemy skonfigurować go tak, by wpuszczał takich użytkowników bez podania hasła lub też możemy założyć im hasło. Ustawiamy zatem odpowiednio parametry anonymous_enable oraz no_anon_password :

anonymous_enable=YES
no_anon_password=YES

W przypadku, gdy no_anon_password jest ustawiony na NO , anonimowi klienci będą musieli podać jakieś hasło. Nie jest dobrym wyjściem nadawanie każdemu takiemu użytkownikowi tego samego hasła. Po pierwsze, system będzie ich w stanie odróżnić jeśli będą się oni posługiwać innymi hasłami. A po drugie, jeśli jedno z haseł zostanie skompromitowane, to zawsze można je zablokować. Ten mechanizm w vsftpd konfigurujemy za pomocą parametrów deny_email_enable i secure_email_list_enable :

deny_email_enable=YES
banned_email_file=/etc/vsftpd/banned_emails

secure_email_list_enable=YES
email_password_file=/etc/vsftpd/email_passwords

Hasła, z których użytkownicy nie mogą skorzystać wpisujemy do pliku określonego przez opcję banned_email_file . Podobnie postępujemy w przypadku haseł dozwolonych, z tym, że wpisujemy je do pliku, który widnieje w parametrze email_password_file .

Jeśli chcemy, by użytkownik anonimowy był w stanie wysyłać pliki na FTP, to musimy jeszcze dopisać do konfiguracji parametr anon_upload_enable :

anon_upload_enable=YES

Definiujemy też podstawowe uprawnienia do plików dla klienta anonimowego. Po pierwsze musimy oddelegować konkretne konto w systemie, na którym będą operować ci klienci. Zwykle do tego celu jest wyznaczany nobody . Niemniej jednak, jest on używany do szeregu innych rzeczy i raczej nie powinniśmy z niego korzystać. Zamiast tego powinniśmy w systemie utworzyć dedykowanego użytkownika, np. ftp i określić go w parametrze ftp_username :

ftp_username=ftp

Użytkownik anonimowy po zalogowaniu się na FTP'a musi znaleźć się w określonym katalogu roboczym. Ten katalog jest określany przez parametr anon_root . Pamiętajmy, że użytkownik ftp musi być w stanie zapisywać określony katalog. W przeciwnym razie klienci anonimowi nie będą mógi wysyłać plików. Nie jest zatem dobrym pomysłem zmiana uprawnień głównego katalogu FTP'a. Lepiej stworzyć wewnątrz niego podkatalog i to jemu nadać prawa do zapisu przez anonimowych klientów:

anon_root=/media/ftp/

Jeśli użytkownicy anonimowi mają być w stanie tworzyć nowe katalogi na FTP'ie, musimy to wyraźnie określić za sprawą opcji anon_mkdir_write_enable . Trzeba też pamiętać, że użytkownik taki, musi mieć prawa do zapisu danego katalogu oraz, że opcja write_enable musi być aktywna:

anon_mkdir_write_enable=YES

Przy pomocy parametru anon_other_write_enable jesteśmy w stanie rozszerzyć nieco uprawnienia anonimowych użytkowników. Standardowo nie mogą oni zmieniać nazw czy usuwać plików z serwera. Mogą oni jedynie zapisywać pliki i ewentualnie tworzyć nowe katalogi:

anon_other_write_enable=YES

W przypadku, gdybyśmy chcieli uniemożliwić użytkownikom anonimowym pobieranie plików, które mają uprawnienia, np. 640, to możemy pokusić się o przestawienie parametru anon_world_readable_only na YES :

anon_world_readable_only=NO

Wszystkie pliki, które są przesyłane przez anonimowych użytkowników mogą podlegać pod przepisanie uprawnień. Ten mechanizm możemy włączyć przy pomocy opcji chown_uploads . Natomiast jeśli chodzi o nowego właściciela plików i prawa to nich, to określamy to w chown_username oraz chown_upload_mode , przykładowo:

chown_uploads=YES
chown_username=morfik
chown_upload_mode=0644

Użytkownicy lokalni

Poza użytkownikami anonimowymi, do FTP'a mogą mieć także dostęp użytkownicy lokalni, tj. ci, którzy mają fizyczne konto w systemie. By zalogować się na FTP przy pomocy takiego konta, trzeba podać jego login i hasło. Tych użytkowników możemy włączyć lub wyłączyć za pomocą opcji local_enable :

local_enable=YES

Podobnie jak w przypadku użytkowników anonimowych, musimy określić odpowiedni katalog roboczy, do którego ci użytkownicy zostaną przeniesieni po zalogowaniu. Standardowo jest to folder domowy. Możemy go przepisać, tak by każdy użytkownik po zalogowaniu znalazł się w konkretnym katalogu przy pomocy opcji local_root :

local_root=/media/ftp/

Problem z takim rozwiązaniem jest taki, że użytkownicy lokalni mogą sobie biegać praktycznie po całym drzewie katalogów, co nie jest zbytnio bezpieczne. Przydałoby się zatem zastosować mechanizm chroot, tak by nie mogli oni opuścić głównego katalogu FTP'a. Możemy to zrobić przy pomocy parametru chroot_local_user . Musimy jednak mieć gdzie ten chroot wykonać. Ścieżkę do pustego katalogu, który nie może być zapisywalny przez użytkownika ftp podajemy w secure_chroot_dir :

chroot_local_user=YES
secure_chroot_dir=/run/vsftpd/empty/

Nie zawsze jednak wszyscy użytkownicy muszą podlegać temu mechanizmowi ochrony. Opcje chroot_list_enable oraz chroot_list_file aktywują listę, która może zawierać pewne określone nazwy kont systemowych. W takim przypadku, jeśli użytkownik zaloguje się na konto znajdujące się na liście, to nie będzie chroot'owany:

chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list

Parametr allow_writeable_chroot

vsftpd nie zezwala na dokonanie chroot'a w przypadku, gdy główny katalog serwera FTP posiada prawa zapisu. Jeśli spróbowalibyśmy się podłączyć do takiego serwera, to zobaczymy poniższy komunikat:

Response:    500 OOPS: vsftpd: refusing to run with writable root inside chroot()

Możemy oczywiście ściągnąć te uprawnienia zapisu, tak jak to zostało zrobione w tym artykule. Na sieci jednak można się spotkać z parametrem allow_writeable_chroot , który, jak nazwa wskazuje, umożliwia dokonanie chroot w przypadku, gdy główny katalog FTP jest zapisywalny. Nie jestem przekonany co do tej opcji i nigdzie nie mogę znaleźć na jej temat żadnej dokumentacji. Na dobrą sprawę to nie wiem czym grozi przestawienie tego parametru na YES , dlatego też lepiej jest go zostawić w spokoju.

allow_writeable_chroot=NO

Logi systemowe

Logi to bardzo ważna rzecz, zwłaszcza w fazie testów i dostrajania konfiguracji FTP'a. vsftpd może zostać przełączony w tryb logowania za pomocą opcji syslog_enable . Jeśli nie odpowiada nam domyślny plik logu, możemy go zmienić w parametrze vsftpd_log_file . W przypadku, gdy potrzebujemy bardziej szczegółowych komunikatów dotyczących wymiany informacji w protokole FTP, to możemy także włączyć opcję log_ftp_protocol .

syslog_enable=YES
vsftpd_log_file=/var/log/vsftpd.log
log_ftp_protocol=YES

Cały plik konfiguracyjny vsftpd.conf znajduje się na moim github'ie.

Mikhail Morfikov avatar
Mikhail Morfikov
Po ponad 10 latach spędzonych z różnej maści linux'ami (Debian/Ubuntu, OpenWRT, Android) mogę śmiało powiedzieć, że nie ma rzeczy niemożliwych i problemów, których nie da się rozwiązać. Jedną umiejętność, którą ludzki umysł musi posiąść, by wybrnąć nawet z tej najbardziej nieprzyjemniej sytuacji, to zdolność logicznego rozumowania.