Usługa FTP służy, jest wykorzystywana, do przenoszenia plików na inny serwer.

Pierwotna postać FTP ma jednak zasadniczą wadę – dane wysyłane tym protokołem są niezaszyfrowane, przez co łatwo je podsłuchać. Aby temu zaradzić, można użyć FTP poprzez SSL, czyli przesyłać protokołem FTP ale z użyciem szyfrowania, lub wykorzystać inny protokół – SFTP, także używający szyfrowania.

Jeszcze słowem wstępu… poniżej wystąpią: komputer, na którym udostępniam serwer FTP, ma on lokalny adres 192.168.1.101 a jego hostname to qrgo (Ubuntu18.04LTS – pracuje poprzez terminal), komputer podłączony do monitora dellwiks (Ubuntu20.04LTS – pracuje z klawiaturą i monitorem), oraz wirtualny Windows7

Aby postawić na Ubuntu zwyczajny serwer FTP, można użyć proftpd:

wiks@qrgo:~$ sudo apt-get install proftpd -y

szczegółowo opisane jest to tutaj.

Jeśli jednak chcemy użyć SFTP, należy zainstalować SSH ( zobacz, na co zwrócić uwagę ), np tak:

wiks@qrgo:~$ sudo apt install ssh

…i tak jak można się wtedy łączyć terminalem:

wiks@dellwiks:~$ ssh wiks@192.168.1.101
wiks@192.168.1.101's password: 
Linux qrgo.pl 4.9.0-8-686-pae #1 SMP Debian 4.9.144-3.1 (2019-02-19) i686

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
No mail.
wiks@qrgo:~$ exit
wylogowanie
Connection to 192.168.1.101 closed.

(przy czym port 22 należy zmienić na inny, np 59999 – odrobinę bezpieczniej, jeśli wyłączymy również motd)

wiks@dellwiks:~$ ssh wiks@192.168.1.101 -p 59999

tak można również poprzez SFTP (z komputera @dellwiks, lub innego): z MENU: Akcesoria -> Pliki -> wybieramy „Inne położenia”

po prawej na dole w miejscu „połącz z serwerem”:

sftp://wiks@192.168.1.101:59999/

i przycisk połącz. Zapytani – podajemy hasło i zasób udostępniany na innym serwerze jest dla nas dostępny.

Możemy tworzyć, kopiować i przesyłać pliki, a w oknie po lewej mamy w zasobach lub sieci ikonę z opisem, symbolizującą dołączony serwer.

Zasób, który udostępniamy z Ubuntu, może być oczywiście także dostępny pod Windows ( Windows7 ). O ile normalne FTP jest dostępne w zasadzie na domyślnej instalacji, to dla SFTP należy pobrać i zainstalować program, który nazywa się WinSCP.exe:

Aby się połączyć, wybieramy protokół pliku (SFTP), podajemy IP/domenę serwera (tutaj lokalna: 192.168.1.101), port (tutaj 59999), użytkownika (wiks) jego hasło i wciskamy logowanie/połącz:

po połączeniu – jak wcześniej dla Linux, tak i dla Windows mam dostęp do tego wszystkiego, do czego dostęp ma użytkownik wiks:

Proste. Problem polega jednak na tym, że w ten sposób udostępniamy poprzez SFTP to wszystko, co jest normalnie dostępne dla zalogowanego poprzez SSH użytkownika. Np pod Windowsem moglibyśmy edytować plik konfiguracji SSH, którego używamy (okropne, prawda?):

Aby to zmienić, ustawić co będzie wolno zobaczyć poprzez SFTP, trzeba utworzyć dedykowanego dla SFTP użytkownika i ograniczyć mu możliwość podróżowania po dysku serwera z SFTP.

Niech to będzie zatem tak -na komputerze udostępniającym serwer SFTP, czyli qrgo (tworzymy grupę, użytkownika, hasło dla użytkownika):

wiks@qrgo:/$ sudo addgroup sftp
[sudo] hasło użytkownika wiks: 
Dodawanie grupy "sftp" (GID 1002)...
Gotowe.

wiks@qrgo:/$ sudo useradd -m sftp -g sftp

wiks@qrgo:/$ sudo passwd sftpuser
Proszę podać nowe hasło UNIX:   
Proszę ponownie podać hasło UNIX:
passwd: hasło zostało zmienione

W tej chwili powinno się dać połączyć zarówno poprzez SSH jak i SFTP do naszego serwera, jako użytkownik sftp.

wiks@dellwiks:~$ ssh sftp@192.168.1.101 -p 59999
sftp@192.168.1.101's password: 
[...]
wiks@qrgo:~$ exit
wylogowanie
Connection to 192.168.1.101 closed.
wiks@dellwiks:~$ 

Zatem -pora ograniczyć spacery temu użytkownikowi. Należy wyedytować konfigurację SFTP,

wiks@qrgo:~$ sudo nano /etc/ssh/sshd_config

dodając na końcu:

Match group sftp
    ChrootDirectory /home/sftp
    X11Forwarding no
    AllowTcpForwarding no
    ForceCommand internal-sftp

Warto jednak zauważyć, że to nie wystarczy. Nie wystarczy z powodu wymagań ChrootDirectory (o tym za chwilę). Gdybyśmy teraz spróbowali się połączyć do sftp, taka próba niewiele by dała. Połączenie by się w tym wypadku prawdopodobnie udało, ale już działania na plikach serwera – nie. Gdyby zaś wpisano w powyższym inną wartość ChrootDirectory, również połączenie mogłoby się nie udać.

Warto także wiedzieć (autor sparzył się na tym), że wpisywanie Match group dla użytkownika, którym działamy właśnie poprzez SSH, może skończyć się źle – stracimy połączenie… W logach zaś znajdziemy informacje:

wiks@qrgo:~$ sudo tail -n 5000 /var/log/auth.log|grep fatal
[...]
Jan 16 14:07:28 qrgo sshd[6667]: fatal: bad ownership or modes for chroot directory "/home/sftp"
Jan 16 15:02:56 qrgo sshd[10286]: fatal: bad ownership or modes for chroot directory component "/home/wiks/"

Dlaczego?

Folder, na który wskazuje ChrootDirectory powinien być w posiadaniu root:root i mieć ustawiony tryb 700 lub 755 (dla 777 nie będzie działać!). A więc:

wiks@qrgo:/home$ sudo chown root:root sftp
wiks@qrgo:/home$ sudo chmod 755 sftp
wiks@qrgo:~$ sudo systemctl restart ssh

No i teraz jeszcze trzeba utworzyć folder wewnątrz /home/sftp/ nazwijmy go np ftp/ , któremu nadamy uprawnienia dla usera sftp wszelakie:

wiks@qrgo:/home$ cd sftp
wiks@qrgo:/home/sftp$ sudo mkdir ftp
wiks@qrgo:/home/sftp$ sudo chown sftp:sftp ftp
wiks@qrgo:/home/sftp$ sudo chmod 755 sftp

Jeśli teraz połączę się do SFTP naszego Linuxa (np. z Windows) to mogę zauważyć, że w pasku adresu określającym miejsce w serwerze, ścieżka nie zaczyna się od ’/home/sftp’ -jak było wcześniej, tylko od ’/’- zupełnie jakby to było w głównym folderze. Po wejściu do '/home/sftp/ftp’ (pamiętamy) – w ścieżce jest tylko '/ftp’. ChrootDirectory uwięził nas i nie pozwala wyjść poza.

A jak z tworzeniem plików/katalogów?

…bingo! Wewnątrz /ftp/ (czyli pamiętam: /home/sftp/ftp/) można utworzyć i skasować pliki i foldery, a jak z '/’ (czyli /home/sftp) ?

🙂 tak jak miało być. Właścicielem jest root, a nie użytkownik sftp, dlatego serwer odmawia utworzenia katalogu…

Warto jeszcze na koniec pamiętać, aby ustawić (poza innymi, ważnymi kwestiami zabezpieczeń – zalecenia CIS Benchmarks.) maksymalną ilość prób logowań dla SSH. W Ubuntu robi się to … . I -jak wspomniano wcześniej, przenieść port SSH z 22 na jakiś nieużywany (np. 59999).