Implementacja szyfrowanego kanału TLS w vsftpd

Jak wiadomo protokół FTP nie jest zbytnio bezpieczny przy przysyłaniu danych, bo wszelkie informacje wędrują po kablach w formie niezaszyfrowanej. W małych i do tego zaufanych sieciach, to nie stanowi większego problemu, a co w pozostałych przypadkach? By zachować prywatność, możemy zabezpieczyć nieco komunikację przez implementację obsługi zaszyfrowanego kanału TLS. W tym howto zostanie pokazane jak tego dokonać w oparciu o serwer vsftpd.
Instalujemy potrzebne pakiety:

# opkg update
# opkg install vsftpd-tls

Jak już pewnie się wszyscy domyślają, potrzebne nam będą certyfikaty, a te możemy sobie stworzyć przy pomocy narzędzi takich jak openvpn-easy-rsa czy też certtool . Będziemy potrzebować klucza prywatnego, certyfikatu od tego klucza i certyfikatu CA. Generowanie certyfikatów z wykorzystaniem obu powyższych narzędzi zostało przeze mnie dokładnie opisane w tym wątku i nie będziemy tutaj poruszać tej kwestii. Zakładam przy tym, że już posiadamy wszystkie potrzebne pliki i pierwsze co musimy zrobić to przesłać je na router i umieścić w katalogu /etc/vsftpd/certs/ :

# scp ca_192.168.1.150.crt  server_192.168.1.1.* root@192.168.1.1:/etc/vsftpd/certs
root@192.168.1.1's password:
server_192.168.1.1.crt                100% 1643     1.6KB/s   00:00
server_192.168.1.1.key                100% 8404     8.2KB/s   00:00
ca_192.168.1.150.crt                  100% 1525     1.5KB/s   00:00

Konfiguracja podstawowej wersji pakietu vsftpd została opisana dokładnie w tym wątku, tutaj skupimy się jedynie na konfiguracji TLS, którą dopiszemy do pliku /etc/vsftpd.conf .

Poniżej znajduje się wycinek mojego pliku konfiguracyjnego vsftpd przedstawiający interesujący nas blok TLS:

###
### TLS/SSL options
#
ssl_enable=yes
#debug_ssl=yes
implicit_ssl=no
allow_anon_ssl=yes
force_anon_data_ssl=no
force_anon_logins_ssl=no
force_local_data_ssl=yes
force_local_logins_ssl=yes
ssl_tlsv1=yes
ssl_sslv2=no
ssl_sslv3=no
ssl_ciphers=AES256-SHA
ca_certs_file=/etc/vsftpd/certs/ca_192.168.1.150.crt
rsa_cert_file=/etc/vsftpd/certs/server_192.168.1.1.crt
rsa_private_key_file=/etc/vsftpd/certs/server_192.168.1.1.key
ssl_request_cert=yes
require_cert=no
validate_cert=yes

Trochę tych opcji jest ale nic niezrozumiałego. Włączamy moduł TLS przy pomocy parametru ssl_enable . Dobrze jest także ustawić opcję debug_ssl przynajmniej do chwili aż skonfigurujemy ten moduł. Jeśli ustawimy implicit_ssl , vsftpd będzie korzystał z protokołu FTPS i z tego co zauważyłem, jeśli nie mamy określonego shella dla użytkowników serwera ftp, a tak jest w naszym przypadku, nie możemy skorzystać z tej opcji. Parametr allow_anon_ssl zezwala na korzystanie przez użytkowników anonimowych (tych łączących się bez hasła) z protokołu TLS. Kolejne dwie opcje, tj. allow_anon_ssl oraz force_anon_logins_ssl wymuszają korzystanie z tunelu TLS w przypadku użytkowników anonimowych. Jeśli ustawimy te dwie ostatnie na NO, użytkownicy anonimowi dalej będą mogli korzystać z tunelu TLS. Przy czym jeszcze taka uwaga, jeśli wymusimy korzystanie z TLS w tym miejscu, nie będziemy mogli połączyć się przez przeglądarkę www do serwera ftp i będziemy musieli korzystać tylko z natywnych klientów, np. filezilla. Kolejne dwie opcje (force_local_data_ssl i force_local_logins_ssl) wymuszają szyfrowanie danych logowania i przesyłanych plików dla pozostałych użytkowników, tj. innych niż anonimowi. Dalej mamy ssl_tlsv1 , ssl_sslv2 oraz ssl_sslv3 i jako, że protokół SSL jest już dość przestarzały, lepiej wyłączyć jego wsparcie i zostawić jedynie opcję od TLS. Parametr ssl_ciphers określa jaki rodzaj szyfru zostanie użyty do zaszyfrowania komunikacji. Z kolei ca_certs_file , rsa_cert_file i rsa_private_key_file są to ścieżki do plików certyfikatów, tych które przekopiowaliśmy wcześniej na router przy pomocy scp. Przy włączeniu opcji ssl_request_cert , vsftpd będzie prosił o certyfikat kliencki, z tym, że nie musimy go posiadać i uwierzytelnianie będzie odbywać się na podstawie podanego hasła. Jeśli hasło nam wystarcza do weryfikacji użytkowników serwera ftp, ustawiamy require_cert na NO. Przy czym, jeśli korzystamy z opcji certyfikatów klienckich, vsftpd może zezwolić na połączenie jedynie tym klientom, których certyfikaty zostaną pomyślnie zweryfikowane, tj. czy zostały podpisane przez jeden z zaufanych CA. W tym celu ustawiamy parametr validate_cert na YES.
I to w zasadzie cała konfiguracja modułu TLS dla serwera vsftpd . Przetestujmy zatem przykładowego użytkownika i sprawdźmy też przy okazji czy anonimowi będą w stanie zalogować się na ftp przy wykorzystaniu szyfrowanego kanału TLS.
Na początek konfiguracja połączenia ustawiona w filezilli:

Przy próbie połączenia, powinien zostać wyrzucony poniższy komunikat z prośbą o weryfikację certyfikatu serwera ftp:

Poniżej test obu użytkowników:

I jak widzimy, zarówno użytkownik morfik jak i użytkownik anonimowy zdołali się podłączyć z wykorzystaniem kanału TLS.

Witam
Bardzo dobry opis konfiguracji.
Niestety brak sposobów na rozwiązanie problemów.
U mnie mogę się zalogować ale już polecenie LIST daje komunikat o błędzie:

Polecenie: LIST
Błąd: Połączenie danych nie mogło zostać nawiązane: ECONNREFUSED - Połączenie odmówione przez serwer

Czy mogę liczyć na jakąś pomoc?
Pozdrawiam
Remigiusz

A wcześniej jakie masz komunikaty?

Łączysz się lokalnie czy zdalnie do serwera? Firewall nie blokuje portów? Jeśli używasz trybu pasive to masz podane IP zewnętrzne oraz przekierowane porty passive?

Zapis sesji:

Status: Ustalanie adresu IP dla xxx.ddns.net
Status: Łączenie z xx.xx.235.104:21...
Status: Połączenie nawiązanie, oczekiwanie na wiadomość powitalną...
Status: Inicjowanie TLS...
Status: Weryfikacja certyfikatu...
Status: Połączenie TLS nawiązane.
Status: Zalogowany
Status: Uzyskiwanie listy katalogów...
Polecenie: PWD
Odpowiedź 257 "/mnt/sda1"
Polecenie: TYPE I
Odpowiedź 200 Switching to Binary mode.
Polecenie: PASV
Odpowiedź 227 Entering Passive Mode (xx,xx,235,104,204,241).
Polecenie: LIST
Błąd: Połączenie danych nie mogło zostać nawiązane: ECONNREFUSED - Połączenie odmówione przez serwer

Jeśli TLS jest wyłączony nie ma problemu z pobieraniem listy plików i przesyłaniem plików.

No z tego logu wychodzi jasno, że sesja szyfrowana została nawiązana. Odpal sobie vsftpd w trybie debugowania i popatrz w log po stronie serwera co się dzieje gdy klient próbuje się podłączyć.

Tu masz mój przykładowy plik:
https://github.com/morfikov/files/blob/master/configs/etc/vsftpd.conf#L468

Tam jest dokumentacja co do opcji logowania, przejrzyj i ustaw je sobie.