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.