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.
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
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.
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.
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
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
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.
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.
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.
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
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
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
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
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