Instalacja serwera ftp na OpenWrt/LEDE
Ostatnia zmiana: 2021-06-02 20:55

Jeżeli ruter posiada nośnik zewnętrzny w postaci dysku, pamięci flash lub karty SD można zainstalować serwer ftp. Dzięki temu wymiana plików może być przeprowadzona najszybszym dostępnym sposobem wykorzystując klienta ftp lub po prostu przeglądarkę WWW. Protokół FTP jest zwykle szybszy od "otoczenia sieciowego" (samby). W OpenWrt dostępne jest kilka różnych programów realizujących to zadanie, w tym poradniku zostanie wykorzystany demon o nazwie vsftpd.
Całość przetestowano na OpenWrt oraz LEDE 17.01.

Instalacja

Dysk zewnętrzny, pamięć flash lub kartę należy zamontować w dowolnym katalogu; w tym przypadku nośnik zamontowany był w /mnt/sda1. System plików na nośniku nie ma znaczenia dla ftp; może to być vfat, ntfs, ext2, ext3 lub ext4. Sposób montowania nośników opisano w tym dokumencie.
Należy pamiętać że niektóre systemy plików nie obsługują uprawnień (vfat, ntfs), więc może być problem z właściwym przypisaniem praw dostępu.

Instalacja serwera ftp sprowadza się do wydania polecenia


    # opkg update
    # opkg install vsftpd

Konfiguracja

Nośnik

Należy pamiętać że dostęp do plików przez vsftpd, niezależnie od tego jak jest ustawiona jego konfiguracja, jest możliwy jeżeli użytkownik na którego się logujemy posiada prawa dostępu (odczytu) do danego pliku i prawa zapisu żeby mógł go zapisać lub usunąć. Z powodu przyjętego rozwiązania systemu bezpieczeństwa w vsftpd użytkownik na którego się logujemy nie może mieć prawa zapisu do katalogu głównego i nie może być jego właścicielem. Zakładając że udostępniamy katalog /mnt/sda1 należy więc wykonać po zamontowaniu nośnika następujące polecenia:


    # chown root.root /mnt/sda1
    # chmod 755 /mnt/sda1

Plik konfiguracyjny

Domyślna konfiguracja serwera znajduje się w pliku /etc/vsftpd.conf, do edycji używamy edytorów typu vi lub nano. Jako podstawę można przyjąć następującą jego zawartość:


    background=yes
    listen=yes
    local_umask=022
    check_shell=no
    session_support=no
    chroot_local_user=yes
    user_config_dir=/etc/vsftpd_users
    seccomp_sandbox=no

Jeżeli chcemy mieć w logach informacje o tym kto się podłączył i co ściągał dodajemy do tego pliku jeszcze kilka linii:


    syslog_enable=yes
    log_ftp_protocol=yes

Tworzymy także brakujący katalog jeżeli go jeszcze nie ma:


    # mkdir -p /etc/vsftpd_users

Następnie w zależności od potrzeb należy ją uzupełnić o jeden z niżej wymienionych szablonów dający określony dostęp.

Dostęp anonimowy

Użytkownik anonymous określony jest w pliku /etc/passwd jako ftp. Wystarczy zmienić mu tylko katalog domowy tak, żeby wskazywał na ten który chcemy udostępnić. Można to wykonać poleceniem (w tym przypadku wskazujemy katalog /mnt/sda1):


    # sed -i 's!55:ftp:\(.*\):!55:ftp:/mnt/sda1:!' /etc/passwd


  • Tryb tylko-do-odczytu
Do pliku konfiguracyjnego /etc/vsftpd.conf dodajemy


    anonymous_enable=yes

Tworzymy plik /etc/vsftpd_users/ftp o zawartości:


    dirlist_enable=yes
    download_enable=yes
    write_enable=no
    anon_upload_enable=no
    anon_other_write_enable=no
    anon_mkdir_write_enable=no


  • Tryb zapis-odczyt
W katalogu głównym ftp tworzymy podkatalog o nazwie upload do którego użytkownik anonimowy będzie miał możliwość zapisu i nadajemy do niego prawa:


    # mkdir -p /mnt/sda1/upload
    # chmod 777 /mnt/sda1/upload

Do pliku konfiguracyjnego /etc/vsftpd.conf dodajemy


    anonymous_enable=yes

Tworzymy plik /etc/vsftpd_users/ftp o zawartości:


    dirlist_enable=yes
    download_enable=yes
    write_enable=yes
    anon_upload_enable=yes
    anon_other_write_enable=yes
    anon_mkdir_write_enable=yes

Jeżeli chcemy aby do plików i katalogów przesyłanych przez użytkownika anonymous mieli dostęp wszyscy inni (uprawnienia 555 na plikach), to dodajemy do pliku /etc/vsftpd_users/ftp kolejną linię


    anon_umask=0000

Dostęp dla określonego użytkownika

Opis dodawania do systemu nowego użytkownika opisany jest w tym dokumencie. W skrócie: należy utworzyć nowego użytkownika (w tym przypadku: malgosia) przez dopisane go do odpowiednich plików konfiguracyjnych i ustawić mu hasło. Katalog domowy będzie określał gdzie użytkownik znajdzie się po zalogowaniu przez ftp (w tym przypadku: /mnt/sda1).


    # echo "malgosia:x:1000:65534:malgosia:/mnt/sda1:/bin/false" >> /etc/passwd
    # echo "malgosia:x:0:0:99999:7:::" >> /etc/shadow
    # passwd malgosia


  • Tryb tylko-do-odczytu
Do pliku konfiguracyjnego /etc/vsftpd.conf dodajemy


    local_enable=yes

Tworzymy plik /etc/vsftpd_users/malgosia (nazwa pliku musi odpowiadać nazwie użytkownika jakiego stworzyliśmy) o zawartości:


    dirlist_enable=yes
    download_enable=yes
    write_enable=no


  • Tryb zapis-odczyt
W katalogu głównym ftp tworzymy podkatalog o nazwie upload do którego użytkownik będzie miał możliwość zapisu i nadajemy do niego prawa zapisu:


    # mkdir -p /mnt/sda1/upload
    # chmod 777 /mnt/sda1/upload

Do pliku konfiguracyjnego /etc/vsftpd.conf dodajemy


    local_enable=yes

Tworzymy plik /etc/vsftpd_users/malgosia (nazwa pliku musi odpowiadać nazwie użytkownika jakiego stworzyliśmy) o zawartości:


    dirlist_enable=yes
    download_enable=yes
    write_enable=yes


Wg podanej konfiguracji można wykonać dostęp dla wielu użytkowników mających dostęp do różnych katalogów i różnymi prawami (zapis-odczyt lub tylko do odczytu).

Dla określonych użytkowników możliwe jest obejście tworzenia katalogu upload przez ustawienie w pliku (w tym przykładzie: /etc/vsftpd_users/malgosia) opcji allow_writeable_chroot=yes. W takim przypadku katalog główny musi posiadać prawa zapisu dla użytkowników (chmod 777 /mnt/sda1). Ta opcja nie działa użytkownika anonimowego.

Uruchomienie serwera

Ostatecznie należy jeszcze uruchomić serwer poleceniem


    # /etc/init.d/vsftpd start

oraz spowodować, żeby uruchamiał się przy starcie systemu


    # /etc/init.d/vsftpd enable

Zakończenie

Jeżeli chcemy mieć dostęp do serwera ftp "z zewnątrz", należy odblokować port 21 na firewallu, czyli


    # uci add firewall rule
    # uci set firewall.@rule[-1]._name=FTP
    # uci set firewall.@rule[-1].src=wan
    # uci set firewall.@rule[-1].target=ACCEPT
    # uci set firewall.@rule[-1].proto=tcp
    # uci set firewall.@rule[-1].dest_port=21
    # uci commit firewall
    # /etc/init.d/firewall restart

Należy pamiętać że ten poradnik nie wyczerpuje możliwości konfiguracyjnych vsftpd. Dostępów i konfiguracji można wykonać na kilka różnych sposobów, po szczegóły odsyłam do manuala projektu: https://security.appspot.com/vsftpd/vsftpd_conf.html .