Serwer FTP

Wprowadzenie teoretyczne do lekcji nr 10

Nastąpił czas aby do naszego serwera dołożyć kolejną cegiełkę i uruchomić na nim serwer FTP, który jest często wykorzystywany do łatwego udostępniania i wymiany plików. FTP to skrót od File Transfer Protocol i jest to protokół komunikacyjny, wykorzystujący transmisję TCP, umożliwiający dwukierunkowy transfer plików. FTP pracuje w dwóch trybach – aktywnym oraz pasywnym. Ten pierwszy tryb wykorzystuje port 21 do przesyłania poleceń oraz port 20 do przesyłania danych. Połączenie na port 21 zestawia klient, a na port 20 zestawia serwer. Powoduje to chociażby problemy ze stroną kliencką, która musi mieć w firewallu odblokowany port 20. Problem ten rozwiązuje tryb pasywny, gdzie zamiast portu 20 wykorzystywany jest port o numerze większym niż 1024. Wtedy oba połączenia zestawia klient i nie ma problemu z firewallem.
Nasz serwer FTP będzie pracował w trybie aktywnym jako, że nie ma problemu z firewallami w naszej sieci. Implementacja protokołu FTP jaką sobie użyjemy nosi nazwę vsftpd, co rozwija się jako Very Secure FTP Daemon. Jest to bardzo lekki i prosty w konfiguracji serwer FTP, który do uwierzytelniania wykorzystuje konta znajdujące się w naszym systemie. Pozwala również uruchomić szyfrowane połączenie, jednakże my tym na razie nie będziemy się zajmować. Warto jednak wspomnieć co zrobimy z samym serwerem FTP. Otóż:
- zainstalujemy go i skonfigurujemy;
- uruchomimy konto anonimowe;
- stworzymy pewną strukturę gdzie będą istnieć trzy foldery, dwa konta oraz trzy grupy. Do jednego folderu będzie miała dostęp jedna grupa, do drugiego druga grupa, a do trzeciego oba konta poprzez trzecią grupę;
- na koniec powiem również jak uruchomić tryb pasywny, a także skonfigurować użytkownika dla danego folderu.

I. Instalacja i konfiguracja serwera FTP.

1. Instalacja serwera FTP.
Instalacja serwera vsftpd jest bardzo prosta. Wystarczy do tego użyć APT-a, a nazwa pakietu to vsftpd. Proszę pamiętać, że przed instalacją czegokolwiek warto zaktualizować systemowe repozytoria i pakiety.

Wpisujemy więc w konsoli:
$ sudo apt install vsftpd -y
No i oczywiście potwierdzamy proces instalcji.

Po instalacji serwera, możemy sprawdzić jego status poleceniem:
$ sudo systemctl status vsftpd
Domyślnie powinien się uruchomić i być gotowy do działania, co potwierdza powyższy screen.

2. Konfiguracja serwera FTP.
Teraz przejdziemy do głębokiej konfiguracji ustawień naszego serwera FTP. Plik konfiguracyjny to /etc/vsftpd.conf. Jest on dość obszerny i to w nim umieszczamy wszystkie ustawienia.

Przechodzimy zatem do katalogu /etc i wykonujemy kopię naszego pliku, którą umieścimy w katalogu domowym użytkownika. Użyjemy do tego polecenia:
$ sudo cp /etc/vsftpd.conf ~/vsftpd.conf-kopia
Następnie edytujemy nasz plik konfiguracyjny /etc/vsftpd.conf, poleceniem:
$ sudo nano /etc/vsftpd.conf
Na początek ustawimy sobie następujące opcje:
listen_ipv6 - upewniamy się, że jest ustawione na YES. W przeciwnym wypadku serwer może przestać nasłuchiwać również na IPv4;
local_enable - ta opcja musi być ustawiona na YES, w przeciwnym wypadku użytkownicy lokalni nie będą mogli się logować;
write_enable - ta opcja musi być ustawiona na YES, aby można było coś zapisywać;
anon_root=/srv/ftp/public - wskazujemy folder, który będzie przechowywał publiczne pliki dla użytkownika anonimowego;
no_anon_password=YES - dodajemy tę opcję, aby klient FTP nie żądał od nas wpisywania hasła dla użytkownika anonimowego (kosmetyczna zmiana);
hide_ids=YES - ta opcja jest po to, aby nie było widać właścicieli danego zasobu na serwerze;
Zapisujemy zmiany w naszym pliku, ale jeszcze z niego nie wychodzimy.

Zjeżdżamy w naszym pliku trochę niżej i odnajdujemy ustawienie ftpd_banner, w nim podajemy napis jaki ma się wyświetlić po zalogowaniu na serwer. Czysto kosmetyczna zmiana, ale będzie jakaś informacja. Następnie pod sekcją "You may restrict…", dodajemy następujące ustawienia:
chroot_local_user=YES - ta opcja jest po to, aby użytkownicy byli ograniczeni do katalogu jaki został im przypisany (zawsze jest to katalog domowy, bez jego zmiany nie da się zmienić katalogu FTP, niestety);
allow_writeable_chroot=YES - z kolei ta opcja jest po to, aby nasi użytkownicy mogli zapisywać w swoich folderach. Gdyby nie opcja wyżej, to ta nie byłaby wymagana, ale wtedy użytkownicy mogliby wyjść ze swojego katalogu i przeglądać inne rzeczy;
Podobnie jak wyżej, zapisujemy zmiany w naszym pliku, ale jeszcze z niego nie wychodzimy.

Następnie przechodzimy na sam koniec pliku i dodajemy finałowe ustawienie:
userlist_enable=YES - ta opcja jktóre mówi serwerowi, że uruchomiona jest lista użytkowników;
userlist_file=/etc/vsftpd.user_list - ta opcja ustawia lokalizację tej listy;
userlist_deny=NO - ta opcja natomiast mówi serwerowi, że ta lista zawiera użytkowników, którzy MOGĄ wejść na serwer, a nie tych którzy nie mogą. Gdybyśmy to ustawili na YES to ta lista byłaby to klasyczna blacklist. W naszym przypadku jest to whitelist;
Teraz, kiedy wszystko już skonfigurowaliśmy możemy jeszcze raz zapisać plik i zamknąć edytor.

Jako, że wcześniej ustawiliśmy tzw. whitelist to musimy edytować (a w zasadzie utworzyć) plik /etc/vsftpd.user_list klasycznym poleceniem:
$ sudo nano /etc/vsftpd.user_list
I w kolejnych linijkach dodać użytkowników, którzy mają mieć dostęp do FTP. W naszym przypadku będą to wcześniej utworzone konta takie jak: student001, student002, wozny001, a także anonymous i jego alternatywna nazwa, czyli ftp, których loginy też musimy tutaj dopisać.

3. Tworzenie folderów dla serwera FTP.
Teraz to tylko wystarczy utworzyć folder /srv/ftp, a w nim public oraz ustawić folderowi /srv/ftp i podkatalogom, uprawnienia 755. Zmienimy też właściciela i grupę temu katalogowi i jego podkatalogom na nobody i nogroup.

Najpierw więc wpisujemy polecenie, które utworzy nam folder ftp, a w nim folder public:
$ sudo mkdir -p /srv/ftp/public
Następnie wpisujemy kolejne polecenie, które zmieni nam właściciela dla folderu /srv/ftp i jego podkatalogom:
$ sudo chown -R nobody:nogroup /srv/ftp
A na koniec ustawimy pełne uprawnienia dla użytkownika, odczyt i zapis dla grupy i innych. Jest to konieczne, ponieważ inaczej serwer FTP nie dopuści użytkownika anonimowego do zalogowania się. Wpisujemy zatem:
$ sudo chmod -R 755 /srv/ftp
Możemy jeszcze sprawdzić czy nasze katalogi zostały utworzone i czy mają właściwe uprawnienia. Zastosujemy znane już polecenia:
$ ls -l
$ sudo tree
Jak widać, wszystko jest tak jak należy.

Teraz wystarczy tylko zrestartować serwer FTP poleceniem systemctl, a także sprawdzić jego status, czy działa on poprawnie:
$ sudo systemctl restart vsftpd
$ sudo systemctl status vsftpd
Jak widać wszystko się udało – serwer działa i można go przetestować.

4. Sprawdzanie serwera FTP z poziomu klienta.
Aby skorzystać z naszego serwera FTP, potrzebujemy klienta FTP. Możemy go oczywiście doinstalować, jednakże wbudowany menadżer plików w system Ubuntu Desktop, również się do tego nadaje.

Aby połączyć się z naszym serwerem musimy wybrać opcję "Pliki", potem "Inne położenia" i w okienku "Połącz z serwerem" wpisać: ftp://<adres>, gdzie adres to w naszym przypadku jest 192.168.10.10

Ubuntu poprosi nas o to, aby wybrać typ połączenia użytkownika. My na początku wybieramy Anonimowy, gdyż ten chcemy przetestować. Więc upewniamy się, że takowy jest zaznaczony i wybieramy połącz. Katalog jest pusty, więc spróbujemy utworzyć tutaj jakiś folder.

Operacja ta nie powinna się powieść, ale klikamy PPM i wybieramy Nowy katalog. Wpisujemy nazwę Testowanie i naciskamy Utwórz. Otrzymujemy informację, że takie działanie się nie powiodło.

Wróćmy na serwer, przejdźmy do katalogu /srv/ftp/public i utwórzmy tam jakiś plik i folder. Niech to będzie katalog Testowanie oraz plik plik1.txt. Zastosujemy znane polecenia:
$ sudo mkdir Testowanie
$ sudo touch plik1.txt

I ponownie z poziomu klienta zalogujmy się jako anonimowy użytkownik. Nasz plik i folder są już widoczne.

Aby pokazać jak w pełni działa serwer ftp (łącznie z komunikatem powitalnym), wykorzystamy do tego terminal, a właściwie klienta ftp wbudowanego w terminal. Uruchamiamy więc na kliencie terminal i najpierw utworzymy na pulpicie plik o nazwie "send.txt", a potem podłączymy się do naszego serwera (wpiszemy jego IP oraz nazwę użytkownika: anonymous), zmienimy ścieżkę, pobierzemy plik na pulpit i spróbujemy coś wysłać na serwer. Należy użyć nastepujących poleceń:
$ nano /home/clientadmin/Pulpit/send.txt
$ ftp 192.168.10.10
Wpisujemy anonymous i nie podajemy hasła tylko naciskamy Enter
$ ls -l
$ lcd /home/clientadmin/Pulpit
$ get plik1.txt
I widzimy, że plik jest już na "Pulpicie". Natomiast gdy chcemy coś wysłać na serwer, to używamy polecenia:
$ put send.txt
Zgodnie z nadanymi uprawnieniami, widzimy odmowę dostępu. Aby rozłączyć się z serwerem FTP, wpisujemy Exit.

Teraz łączymy się z serwerem FTP jeszcze raz, jednakże tym razem jako użytkownik z dostępem autoryzowanym i wpisujemy login i hasło do jakiegoś konta, które dodaliśmy do whitelist'y. U nas będzie to student001. Po zalogowaniu sprawdzamy zawartość serwera FTP (nic tam jeszcze nie ma), a następnie spróbujemy wysłać na serwer nasz "plik1.txt" z pulpitu. Wykonamy zatem serię podobnych poleceń:
$ ftp 192.168.10.10
Wpisujemy student001 i podajemy hasło
$ ls -l
$ lcd /home/clientadmin/Pulpit
$ put plik1.txt
$ ls -l
I widzimy, że nasz plik został wysłany na serwer ftp.

A ponieważ ten typ połączenia polega na tym, że katalog domowy danego użytkownika, którym logowaliśmy się jest miejscem przechowywania danych na serwerze FTP, to możemy sprawdzić jego zawartość:
$ ls -l /home/student001
I oczywiście nasz plik się tam znajduje

II. Konfiguracja połączenia autoryzowanego dla kilku użytkowników do serwera FTP.

1. Założenia teoretyczne.
Teraz utworzymy sobie o wiele bardziej zaawansowaną strukturę. Stworzymy trzy grupy: nauczyciele, nauczyciele_polski, nauczyciele_info. Do tego utworzymy dwóch użytkowników: nauczyciel001, nauczyciel002. W folderze /srv/ftp, utworzymy katalog nauczyciele, a w nim katalogi: polski, info, wspolne.
- grupa nauczyciele, członkowie nauczyciel001, nauczyciel002, dostęp do katalogu /srv/ftp/nauczyciele/wspolne
- grupa nauczyciele_polski, członkowie nauczyciel001, dostęp do katalogu /srv/ftp/nauczyciele/polski
- grupa nauczyciele_info, członkowie nauczyciel002, dostęp do katalogu /srv/ftp/nauczyciele/info
- użytkownik nauczyciel002 nie ma dostępu do katalogu /srv/ftp/nauczyciele/polski, a nauczyciel001 nie ma dostępu do katalogu /srv/ftp/info
Skonfigurujemy to również tak, aby nauczyciele nie mogli logować się lokalnie na serwer lub poprzez np. SSH. Zrobimy to dodając im fałszywą powłokę, którą musimy najpierw dopisać w pliku /etc/shells

2. Właściwa konfiguracja.
Zaczniemy od dodania tej fałszywej powłoki do pliku /etc/shells, a potem stworzymy nasze obiekty.

Dodanie fałszywej powłoki

Edytujemy zatem nasz plik /etc/shells poleceniem:
$ sudo nano /etc/shells
Na samym jego końcu dopisujemy /usr/sbin/noshell. Będzie to nasza fałszywa powłoka systemowa, która jako, że nie istnieje, nie pozwoli się zalogować na serwer.

Tworzenie użytkowników i grup

Zaczniewmy zatem od stworzenia grup i użytkowników. Poleceniem addgroup utworzymy trzy grupy: nauczyciele, nauczyciele_polski i nauczyciele_info:
$ sudo addgroup nauczyciele
$ sudo addgroup nauczyciele_polski
$ sudo addgroup nauczyciele_info
Teraz pozostaje nam dodać użytkowników. Użyjemy do tego tym razem polecenia useradd z parametrem d, gdzie wskażemy katalog domowy użytkownika (będzie nim katalog /srv/ftp/nauczyciele), a z parametrem s, gdzie wskażemy naszą nieistniejącą powłokę:
$ sudo useradd -d /srv/ftp/nauczyciele -s /usr/sbin/noshell nauczyciel001
$ sudo useradd -d /srv/ftp/nauczyciele -s /usr/sbin/noshell nauczyciel002
Na koniec poleceniem passwd musimy ustawić hasła naszym użytkownikom:
$ sudo passwd nauczyciel001
$ sudo passwd nauczyciel002

Tworzenie folderów

Kolejną czynnością będzie stworzenie odpowiednich folderów, nadanie im właściwych uprawnień oraz zmiana właścicieli i grup. Do utworzenia folderów użyjemy poleceń:
$ sudo mkdir -p /srv/ftp/nauczyciele/polski
$ sudo mkdir -p /srv/ftp/nauczyciele/info
$ sudo mkdir -p /srv/ftp/nauczyciele/wspolne
Następnie ustawimy uprawnienia do wszystkich folderów na 770:
$ sudo chmod 770 /srv/ftp/nauczyciele/polski
$ sudo chmod 770 /srv/ftp/nauczyciele/info
$ sudo chmod 770 /srv/ftp/nauczyciele/wspolne
I pozostała nam jeszcze zmiana właścicieli (a właściwie grup):
$ sudo chown :nauczyciele_polski /srv/ftp/nauczyciele/polski
$ sudo chown :nauczyciele_info /srv/ftp/nauczyciele/info
$ sudo chmod :nauczyciele /srv/ftp/nauczyciele/wspolne
Możemy jeszcze poleceniem tree sprawdzić naszą strukturę folderów:
$ sudo tree /srv/ftp

Dodawanie do grupy

Na koniec, zgodnie z założeniami trzeba jeszcze przypisać naszych użytkowników do odpowiednich grup:
$ sudo usermod -G nauczyciele -a nauczyciel001
$ sudo usermod -G nauczyciele -a nauczyciel002
$ sudo usermod -G nauczyciele_polski -a nauczyciel001
$ sudo usermod -G nauczyciele_info -a nauczyciel002
I poleceniem getent group <nazwa_grupy> sprawdzamy członków naszych grup:
$ getent group nauczyciele
$ getent group nauczyciele_polski
$ getent group nauczyciele_info
Oczywiście wszystko się zgadza.

Testowanie interpretera php

Teraz musimy tylko do naszej whitelist'y, mieszczącej się w pliku /etc/vsftpd.user_list, dodać użytkowników nauczyciel001 oraz nauczyciel002. Edytujemy zatem nasz plik poleceniem:
$ sudo nano /etc/vsftpd.user_list
I na końcu dopisujemy naszych użytkowników. Oczywiście zapisujemy zmiany i zamykamy plik.

PSprawdzanie serwera FTP

Teraz wystarczy tylko zrestartować serwer FTP, a także sprawdzić jego status, czy działa on poprawnie:
$ sudo systemctl restart vsftpd
$ sudo systemctl status vsftpd
Jak widać wszystko jest OK.

PTworzenie plików na serwerze FTP

Aby właściwie przetestować nasz serwer FTP, warto jeszcze utworzyć na nim jakieś dane. Przejdziemy zatem do katalogu /srv/ftp/nauczyciele i utworzymy w każdym z folderów po trzy pliki:
$ cd /srv/ftp/nauczyciele
$ ls -l
$ sudo touch info/info1.txt
$ sudo touch polski/polski1.txt
$ sudo touch wspolne/wspolne1.txt
Możemy jeszcze poleceniem tree sprawdzić naszą strukturę:
$ sudo tree

PTestowanie serwera FTP

Logujemy się więc z klienta do serwera FTP za pomocą terminala, najpierw na konto nauczyciel001:
$ ftp 192.168.10.10
Po wpisaniu nazwy użytkownika i hasła sprawdzamy co mamy na serwerze FTP znanym poleceniem:
ftp> ls -l
Następnie spróbujemy wejść do katalogu info poleceniem:
ftp> cd info
Ale oczywiście nie mamy do niego dostępu. Następnie spróbujemy wejść do katalogu polski poleceniem:
ftp> cd polski
Tym razem jest sukces, więc sprawdzamy co tam się znajduje, klasycznym poleceniem:
ftp> ls -l
Widzimy trzy, utworzone wcześniej przez nas pliki. Zmieniamy więc ścieżkę lokalną na /home/clientadmin/Pulpit poleceniem:
ftp> lcd /home/clientadmin/Pulpit
I wysyłamy z Pulpitu na serwer plik o nazwie send.txt poleceniem:
ftp> put send.txt
Operacja została zakończona sukcesem, a dla pewności możemy jeszcze sprawdzić czy ten plik znajduje się już na serwerze:
ftp> ls -l
Wszystko się zgadza, plik send.txt już tam jest. Opuszczamy zatem nasz serwer poleceniem:
ftp> exit

PTestowanie serwera FTP

Podobne czynności wykonujemy dla drugiego użytkownika. Logujemy się więc z klienta do serwera FTP za pomocą terminala na konto nauczyciel002:
$ ftp 192.168.10.10
Po wpisaniu nazwy użytkownika i hasła sprawdzamy co mamy na serwerze FTP znanym poleceniem:
ftp> ls -l
Następnie spróbujemy wejść do katalogu polski poleceniem:
ftp> cd polski
Ale oczywiście nie mamy do niego dostępu. Następnie spróbujemy wejść do katalogu info poleceniem:
ftp> cd info
Tym razem jest sukces, więc sprawdzamy co tam się znajduje, klasycznym poleceniem:
ftp> ls -l
Widzimy trzy, utworzone wcześniej przez nas pliki. Zmieniamy więc ścieżkę lokalną na /home/clientadmin/Pulpit poleceniem:
ftp> lcd /home/clientadmin/Pulpit
I wysyłamy z Pulpitu na serwer plik o nazwie send.txt poleceniem:
ftp> put send.txt
Operacja została zakończona sukcesem, a dla pewności możemy jeszcze sprawdzić czy ten plik znajduje się już na serwerze:
ftp> ls -l
Wszystko się zgadza, plik send.txt już tam jest. Opuszczamy zatem nasz serwer poleceniem:
ftp> exit

PTestowanie serwera FTP

Na koniec sprawdzimy obydwoma użytkownikami dostęp do folderu wspolne. Najpierw zrobimy to z konta nauczyciel001:
$ ftp 192.168.10.10
ftp> ls -l
Spróbujemy wejść do katalogu wspolne poleceniem:
ftp> cd wspolne
Oczywiście czynność zakończona została sukcesem, więc sprawdzamy co tam się znajduje, klasycznym poleceniem:
ftp> ls -l
Widzimy trzy, utworzone wcześniej przez nas pliki. Zmieniamy więc ścieżkę lokalną na /home/clientadmin/Pulpit poleceniem:
ftp> lcd /home/clientadmin/Pulpit
I wysyłamy z Pulpitu na serwer plik o nazwie send.txt poleceniem:
ftp> put send.txt
Operacja została zakończona sukcesem, a dla pewności możemy jeszcze sprawdzić czy ten plik znajduje się już na serwerze:
ftp> ls -l
Wszystko się zgadza, plik send.txt już tam jest. Opuszczamy zatem nasz serwer poleceniem:
ftp> exit

PTestowanie serwera FTP

Teraz logujemy się użytkownikiem nauczyciel002:
$ ftp 192.168.10.10
ftp> ls -l
Tak jak poprzednio spróbujemy wejść do katalogu wspolne poleceniem:
ftp> cd wspolne
Oczywiście czynność zakończona została sukcesem, więc sprawdzamy co tam się znajduje, klasycznym poleceniem:
ftp> ls -l
Widzimy trzy, utworzone wcześniej przez nas pliki oraz ten czwarty, który przed chwilą wysłaliśmy na serwer. Ponownie zmieniamy ścieżkę lokalną na /home/clientadmin/Pulpit poleceniem:
ftp> lcd /home/clientadmin/Pulpit
I wysyłamy z Pulpitu na serwer plik o nazwie plik1.txt poleceniem:
ftp> put plik1.txt
Operacja została zakończona sukcesem, a dla pewności możemy jeszcze sprawdzić czy ten plik znajduje się już na serwerze:
ftp> ls -l
Wszystko się zgadza, plik plik1.txt już tam jest. Opuszczamy zatem nasz serwer poleceniem:
ftp> exit