Proftpd – serwer ftp

Proftpd to jeden z najpopularniejszych serwerów ftp. Z poniższej notatki dowiesz się jak go zainstalować i konfigurować.

Contents

Instalacja

Instalacji możesz dokonać ze źródeł lub z pakietu. Najprostsza jest oczywiście instalacja z pakietu ale pamiętaj iż program ma wtedy ustawione pewne parametry już podczas kompilacji, które mogą Ci przeszkadzać.

W dystrybucjach używających systemu pakietów rpm instalacje wykonasz wykorzystując polecenie:

rpm -i proftpd-wersja.pakietu.rpm

Instalacje w Debianie dokonasz wydając polecenie:

apt-get install proftpd

W przypadku dystrybucji Mandriva (dawny Mandrake) możesz wykorzystać z wygodnego narzędzia graficznego rpmdrake albo wydać w linii poleceń komendę:

urpmi proftpd

Uruchomienie, restart i zatrzymanie serwera

Serwer WWW uruchamiamy (w trybie konsoli) w dystrybucjach wykorzystujących schemat V System (czyli np. Red Hat, Debian, Mandriva (dawny Mandrake) ale nie Slackware) przy pomocy polecenia:

/etc/init.d/proftpd start

Serwer restartujemy poleceniem:

/etc/init.d/proftpd restart

Zatrzymania serwera dokonamy przy pomocy polecenia:

/etc/init.d/proftpd stop

Podstawowy plik konfiguracyjny

Podstawowym plikiem konfiguracyjnym jest /etc/proftpd.conf. Jego składania przypomina plik konfiguracyjny Apache’a.

Najprostszy, umożliwiający w miarę poprawną pracę serwera, plik konfiguracyjny to:

# najprostszy plik konfiguracyjny dla serwera proftpd
ServerName "Nazwa naszego serwera"
ServerAdmin email@do.administratora.serwera
ServerType standalone
DefaultServer on
DefaultRoot ~
Port 21
Umask 002

#Ustawienia użytkownika i grupy serwera
User nobody - użytkownik na jakiego odpalony jest serwer FTP
Group nobody - grupa do której należy ten użytkownik (przypuszczalnie musisz ją sobie stworzyć)

Ustawienie to wymaga aby firewall nie pracował. Jeżeli zdecydujemy się na rozwiązanie z pracującym firewallem należy korzystać tylko z aktywnego trybu pracy i przepuszczania połączenia do i z portów 20 i 21:

iptables -A INPUT -p tcp --dport 20 -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j ACCEPT

iptables -A OUTPUT -p tcp --sport 21 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 20 -j ACCEPT

Jeżeli chcemy aby były również obsługiwane połączenia typu pasywnego należy określić zakres portów, na których ma pracować pasywny ftp oraz przepuszczać przez firewalla ten typ połączeń.

Problem zbyt długiego oczekiwania na wprowadzenie nazwy użytkownika

Problem ten pojawia się gdy zbyt restrykcyjnie ustawiamy firewall-a. Musi on przepuszczać oprócz pakietów skierowanych na port 20 i 21 (a także z nich) pakiety icmp typu: echo-reply, echo-request, destination-unreachable. Przykładowa konfiguracja firewalla to:

iptables -A INPUT -p icmp --icmp-type   echo-reply  -j ACCEPT
iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

Połączenia pasywne

Połączenie pasywne polega na tym iż transmisja danych nie przebiega po porcie 20 ale po jakimś innym z wysokich portów. W celu efektywnego zarządzania połączeniami pasywnymi należy zdefiniować w pliku /etc/proftpd.conf zakres portów do pracy w trybie pasywnym. Dokonamy tego przy pomocy dyrektywy PassivePorts, przyjmijmy dla potrzeb przykładu iż są to porty 34000-34500 :

PassivePorts                    34000 34500

Następnie na firewallu musimy przepuszczać takie połączenia:

iptables  -A OUTPUT -p tcp   --sport 34000:34500 -j ACCEPT
iptables -A INPU T -p tcp --dport 34000:34500 -j ACCEPT

Po przeładowaniu demona profpd program będzie już poprawnie reagował na połączenia pasywne.

Timeouty (ograniczenia czasowe)

Bardzo przydatne okazuje się zdefiniowanie limitów czasowych na pewne operacje serwera ftp. Pozwala to na obniżenie jego obciążenia. I tak możemy zdefiniować czasy następujących zdarzeń: czas bezczynności (TimeoutIdle), TimeiutStalled, TimeoutLogin, max. czas bezczynnego połączenia z serwerem (TimeoutnoTransfer). Wszystkie te czasy są podane w sekundach.

przykładowe definicje:

#Timeouty - różne
TimeoutIdle 300
TimeoutStalled 300
TimeoutLogin 60
TimeoutNoTransfer 300

Logi

każdy lubi wiedzieć co się dzieje. Proftpd ma bogate opcje umożliwiające zapisywanie do dzienników systemowych zdarzeń związanych z nim. Podstawowym parametrem jest ExtendedLog wskazujący programowi gdzie ma umieszczać logi, możliwe cele to: plik (wskazujemy wtedy położenie pliku np. /var/log/proftpd.log), konsola (np. /dev/tty11).

ExtendedLog                     /var/log/proftpd.log   # miejsce składowania logów
ExtendedLog /dev/tty11 # konsola na której są wyświetlane logi
DisplayLogin .welcome.msg # wiadomość powitalna
MaxInstances 20
MaxLoginAttempts 2

Ograniczenia obciążenia serwera

Kiedyś było lepiej. Ludzie byli grzeczni i nikt nie nadużywał zasad dobrego zachowania. Mniej było też ludzi i ruch znacznie mniejszy. Obecnie należy ograniczać tak samo ilość jednoczenie podłączonych klientów (by zbytnio serwera nie obciążać) jak również połączeń z jednego komputera (jeżeli są za sprytni i otwierają dużą ilość połączeń). Wykorzystujemy do tego dwa polecenia MaxClients (ilość maksymalnie podłączonych programów klienckich) oraz MaxClientsPerHost (maksymalna ilość klientów podłączonych z jednego komputera).

Przykładowe konfigurację to:

MaxClients 200 "Komunikat wyświetlany podczas połączenia, gdy przekroczono max ilość

MaxClientsPerHost 40 "komunikat wyświetlany dla klientów, którzy zbyt dużo maja otwartych połączeń

"Uwięzienie" użytkownika w jego katalogu domowym

 

Proftpd umożliwia również uwięzienie poszczególnych użytkowników, całych grup lub wszystkich w katalogu określonym katalogu (najczęściej domowym). Korzystamy wtedy z polecenia DefaultRoot

.

Jeżeli chcemy ograniczyć określoną użytkownika lub grupę w określonym katalogu należy użyć jako parametrów nazwę katalogu a następnie nazwę wykluczanych użytkowników lub grup. Możemy również użyć znaku "!" (wykrzyknik). Specjalnym znakiem jest "~" oznaczający katalog domowy. Przykład:

DefaultRoot /home/foo foo
DefaultRoot ~ ziutus

Przykład 2:
Przypuśćmy iż serwer biurowy udostępniany jest także klientom firmy. Chcielibyśmy aby zaufani pracownicy firmy mieli możliwość działania na całym systemie a wszyscy inni tylko w katalogach domowych.

DefaultRoot ~ ! @biuro

Ograniczenia IP/hostów z których można się zalogować

Kiedy już kto nas mocno zirytuje albo jest naprawdę niegrzeczny należy wprowadzić ograniczenia dostępu do serwera ftp. Możesz to określić na dwa sposoby: domyślnie wpuszczać wszystkich z wyjątkiem pewnych adresów (patrz opcja a.) lub domyślnie wpuszczać wybranych a resztę odrzucać (patrz opcja b.).

Opcja a) Możesz zalogować się z każdego komputera poza tymi co są w polach "Deny from". Wpisy w tych polach mogą oznaczać pojedynczy komputer (np. knf.p.lodz.pl) albo całą domenę (np. p.lodz.pl).

<Limit LOGIN> 
Order allow,deny
Deny from knf.p.lodz.pl
Deny from .p.lodz.pl
</Limit>

Opcja b) możesz zalogować się tylko z określonego miejsca (ziutus.com.pl). Podobnie jak w opcji a. możesz określić dokładnie jeden komputer lub całą sieć (domenę).

<Limit LOGIN> 
Order deny,allow
Allow from .ziutus.com.pl
</Limit>

Ograniczenia przy pomocy polecenia Limit

Komendy do których odnosi się

CWD (Change Working Directory) Wysyłane przez klienta gdy zmienia katalog. Ten limit dotyczy także komendy CDUP (Change Directory UP).
MKD (MaKe Directory) Wysyłane przez klienta gdy tworzy nowy katalog.
RNFR (ReName FRom)
RNTO (ReName TO)
Wysyłane przez klienta jako para komend gdy zmieniane jest położenie pliku między katalogami.
DELE (DELEte) Wysyłane przez klienta gdy kasuje plik.
RMD (ReMove Directory) Wysyłane przez klienta gdy usuwa katalog
RETR (RETRieve) Transfer pliku z serwera do klienta.
STOR (STORe) Transfer pliku od klienta do serwera.

Grupy komend do których odnosi się

READ wszystkie komendy FTP wiążące się z czytaniem pliku (ale nie listing katalogu), np. RETR, STAT, itd.
WRITE wszystkie komendy FTP wiążące się z zapisem, tworzeniem, kasowaniem (obejmuje m.in. MKD i RMD).
DIRS wszystkie komendy FTP wiążące się z wyświetleniem zawartości katalogu np. LIST i NLST.
ALL wszystkie komendy FTP (identycznie zadziałałoby połączenie READ WRITE DIRS). Ta grupa komend ma najniższy priorytet ze wszystkich i nie powoduje nadpisania limitów określonych przez wymienione powyżej grupy komend (np. DIRS)

Przykładowe limity ustawione przy pomocy polecenia limit:

<Limit  WRITE>
DenyAll
<Limit>

< Limit READ DIRS>
IgnoreHidden on
<Limit>

Użytkownik anonimowy Anonymous

Użytkownik anonymous jest to specjalny użytkownik umożliwiający dostęp do upublicznionych zasobów serwera. Możemy na niego zalogować się bez podawania hasła (albo podając swój email) i swobodnie pobierać oprogramowanie. Na takich kontach udostępnia się przeważnie rzeczy, które chcemy rozdawać wszystkim użytkownikom Internetu. Przykładami takich serwerów (i kont) są serwery z publicznym oprogramowaniem (np. sunsite.icm.edu.pl) lub serwery udostępniające wersje demonstracyjne programów.

Sekcja konfiguracyjna użytkownika anonymous jest dość typowa. Najpierw w sekcji Anonymous definiujemy nazwę użytkownika, pod którą występuje anonymous w systemie. Następnie definiujemy nazwę użytkownika (User nazwa) i grupy (Group nazwa) w systemie. Należy wyłączyć sprawdzanie hasła (AnonRequirePassword off) oraz dla wygody i zachowania standardu stworzyć alias ftp do nazwy anonymous (UserAlias anonymous ftp). Możemy także określić komunikat powitalny (DisplayLogin .welcome.msg) oraz komunikat wyświetlany podczas każdorazowego wejścia do katalogu (DisplayFirstChDir .message). Możemy też określić maskę nowo utworzonych plików (Umas 002) oraz ??? (GroupOwner ftp). Na koniec możemy zabronić uploadu (patrz niżej).

Przykładowe konfiguracje to:

#########################
# A N O N Y M O U S #
########################


User ftp -użytkownik
Group ftp - grupa
AnonRequirePassword off - logowanie bez hasła
UserAlias anonymous ftp - aliasy tego użytkownika
DisplayLogin .welcome.msg - powitalna wiadomość
DisplayFirstChdir .message - wiadomość która pokazuje się po wejściu do katalogu
GroupOwner ftp
Umask 002

<Limit WRITE>
DenyAll
<Limit>

<Limit READ DIRS>
IgnoreHidden on
<Limit>

# to jest koniec ustawień dla tego użytkownika

UPLOAD

< Directory uploads/*> 
<Limit READ>
DenyAll
<Limit>
<Limit STOR>
AllowAll
<Limit>
<Limit MKD>
AllowAll
<Limit>
< /Directory>

Ustawienia dla poszczególnych użytkowników

Możemy także stworzyć konta specjalne (np. na wewnętrzne potrzeby pracowników firmy). Definiujemy wtedy sekcje Anonymous podobnie jak poprzednio tylko że zmieniamy kilka parametrów: nazwę użytkownika i grupy (oczywiste), włączamy sprawdzanie hasła (w końcu trzeba jakoś to sprawdzać czy ktoś jest z firmy), ograniczamy ilość klientów (aby ktoś nam nie zapchał serwera) i adresy (do adresów firmy).

######################
# DLA PRACOWNIKOW FIRMY #
######################
< Anonymous ~wybrany>
#-użytkownik wybrany
User firma
Group ftpusers
AnonRequirePassword on
DisplayLogin .welcome.msg
DisplayFirstChdir .message
GroupOwner firma
Umask 002
# HideUser root
# HideGroup root
HideNoAccess on
MaxClients 10 ">>> Ale dzis duzo ludu sie przywloklo <<<"
MaxClientsPerHost 5 ">>> Za duzo polaczen z jednego IP <<<"

<Limit LOGIN>
Order allow,deny
Allow from 127.0.0.1
Allow from 192.168.1.
Allow from 212.160.79.
DenyAll
<Limit>

opcja a) bez prawa do UPLOADu

<Limit  WRITE> 
DenyAll
<Limit>

<Limit READ DIRS>
IgnoreHidden on
<Limit>

opcja b) zezwala na UPLOAD

<Directory uploads/*> 
<Limit READ> DenyAll <Limit>
<Limit STOR> AllowAll <Limit>
<Limit MKD> AllowAll <Limit> </Directory&>
#zakończenie sekcji anonymous

Serwery wirtualne

Uwaga: Podstawowym ograniczeniem domen wirtualnych ftp jest fakt iż dla każdego serwera wirtualnego należy mieć osobny adres IP (protokół FTP nie obejmuje aliasów domen, tak jak HTTP).

Jeżeli chcemy zdefiniować własny wirtualny serwer ftp trzeba go utworzyć w osobnej sekcji . Definiujemy tam wszystkie elementy tak jak dla podstawowego serwera ftp z wyjątkiem trybu pracy.

Przykład (z dokumentacji do programu):

<VirtualHost www.ftech.net> 
ServerAdmin webmaster@Ftech.net
ServerName "Master Webserver"
MaxLoginAttempts 2
RequireValidShell no
TransferLog /var/spool/syslog/proftpd/xferlog.www
MaxClients 50
DefaultServer on
DefaultRoot ~ !staff
AllowOverwrite yes

#
# No quickly do we kick someone out
#
TimeoutLogin 120
TimeoutIdle 600
TimeoutNoTransfer 900

</VirtualHost>

Popularne komunikaty błędów

chroot("~/"): No such file or directory Postfix ma ustawioną opcję Defaulroot i wystąpił błąd w dostępie do katalogu, być może niewłaściwie ustawione prawa dostępu.
dir("/data/www/serwis.www/htdocs"): No such file or directory Wystąpił błąd w dostępie do katalogu, być może niewłaściwie ustawione prawa dostępu.
   
   

Przydatne programy pomocnicze

gproftpd

Program gproftpd jest przydatny dla ludzi, którzy na komputerze ze środowiskiem graficznym utrzymują serwer ftp. Można wtedy wygodnie z interfejsu graficznego zarządzać serwerem. Niestety, program nie posiada opcji zarządzania zdalnym serwerem.

ftpcount

Program ftpcount wyświetla liczbę aktualnie połączonych użytkowników z każdym zdefiniowanym serwerem.

ftpwho

Program ftpwho pokazuje informacje o wszystkich aktualnie połączonych użytkownikach.

ftptop

Program ftptop jest odpowiednikiem systemowego polecenia top w stosunku do połączeń ftp.

ftpshut

Program zamyka wszystkie zdefiniowane serwery ftp o określonej godzinie.

przydatne strony

Przydatne strony związane z proftpd to:

Kompendium wiedzy o FTP jest dokument RFC 959, zawierający oficjalny opis techniczny protokołu FTP. Dokumenty RFC dostępne są w wielu miejscach, na przykład ftp://nic.merit.edu/documents/rfc/rfc0959.txt

ćwiczenie 2

Należy zainstalować serwer ftp a następnie:

  1. połączyć się z kontem użytkownika tester1
  2. zmienić napis, którym przedstawia się serwer ftp na " witaj na moim serwerze
  3. ustawić limit połączenia z jednego komputera na 2
  4. ustawić limit ogólnej liczby połączeń z serwerem na 3
  5. Ustawić plik logów z serwera na /var/log/moj_ftp.log
  6. Zablokuj dostęp do serwera ftp z domeny www.ntgroup.pl

Odpowiedzi do ćwiczeń

ćwiczenie 2

W celu połączenia się z serwerem Proftpd należy użyć któregoś z programów klienckich (np. mc, ftp, gftp). Programy zapytają o hasło a następnie podłączą się pod zdalną strukturę katalogów. Ustawiamy odpowiednie zmienne na wartości 3 i 2:

MaxClients 3 "Przykro nam ale zbyt dużo komputerów jest teraz połączonych z naszym serwerem 
MaxClientsPerHost 2 "Chyba jesteś zbyt sprytny! Możesz mieć otwartych max 2 sesji ftp naraz
ExtendedLog /var/log/moj_ftp.log

Dyrektywa blokująca dostęp z serwera www.ntgroup.pl powinna mieć postać:

<limit login>
Order deny,allow
Deny from www.ntgroup.pl
Allow from all
</limit>

Zobacz także

Dodaj komentarz