Proftpd ma możliwość, dzięki modułowi mod_SQL, ma autoryzację bezpośrednio z bazy danych. W takim przypadku Proftpd korzysta z dwóch tabel, jednej określającej użytkowników oraz drugiej określającej grupy.
Kompilacja programu
Program musi być skompilowany z modułem obsługi baz danych. Jeżeli opis pakietu wskazuje na to iż tak jest nie ma potrzeby przekompilowywać programu. W przeciwnym przypadku należy przekompilować program ze źródeł
jeżeli używasz MySQLa to wystarczy wydać polecenie:
./configure --with-modules=mod_sql:mod_sql_mysql
jeżeli używasz PostreSQLa to wystarczy wydać polcenie:
./configure --with-modules=mod_sql:mod_sql_postgres
W przypadku gdy samodzielnie kompilowałeś MySQLa musisz wskazać proftpd gdzie znajdują się pliki nagłówkowe oraz biblioteki:
./configure --with-modules=mod_sql:mod_sql_mysql \ --with-includes=/usr/local/include \ --with-libraries=/usr/local/lib/mysql
If you use PostgreSQL, you’ll need something like this:
./configure --with-modules=mod_sql:mod_sql_postgres \ --with-includes=/usr/local/include \ --with-libraries=/usr/local/lib
Instalacja pakietu w Debianie Sarg
W Debianie istnieje pakiet o nazwie proftpd-mysql, wystarczy go zainstalować i program będzie już miał włączoną obsługę MySQLa.
apt-get install profptd-mysql
Configuracja programu
W celu umożliwienia autoryzacji przy pomocy bazy danych należy w pliku konfiguracyjnym proftpd umieścić następujące dyrektywy (zmieniając oczywiście zmienne):
SQLConnectInfo nazwa_bazy_danych@serwer:port uzytkownik haslo SQLUserInfo tablica_uzytkownicy kol_name kol_pass kol_uid kol_gid kol_home kol_shell SQLGroupInfo tablica_grupy kol_name kol_gid kol_members SQLAuthenticate users* groups* SQLAuthTypes PlainText
Wyjaśnienie podstawowych opcji
SQLConnectInfo | Określa nazwę bazy danych, serwer i port oraz użytkownika i hasło, który ma dostęp do bazy danych, czyli potrzebne dane do połączenia z bazą danych |
SQLUserInfo | Określa tablicę w której szukane są informacje o użytkownikach serwera ftp. Pierwsza nazwa określa nazwę tabeli w której poszukiwane są dane o użytkownikach, następne określają już nazwy kolumn odpowiadających poszczególnym |
SQLGroupInfo | Określa tablicę (pierwsze pole) oraz nazwę kolumny z nazwami grup (kol_name), numerem grupy (kol_gid) i spisem członków grup (kol_members) |
SQLAuthenticate | Określa zasady autoryzacji. W naszym przypadku mamy users* groups* co wymaga aby użytkownik i grupa do której należy istniała. Jeżeli pominiemy tutaj warunek groups* program nada domyślną grupę o GID równym 65533 lub zdefiniowaną przez dyrektywę SQLDefaultGID. Dyrektywa jest wymaga by działał moduł autoryzacji przez bazę danych. |
SQLAuthTypes | Dyrektywa określa sposób autoryzacji. Dostępne metody to: plain (hasło niezakodowane w bazie), crypt(zaszyfrowane przy pomocy polecenia cpryt()) a także inne. Dyrektywa jest wymaga by działał moduł autoryzacji przez bazę danych. |
Użytkownik z dostępem do bazy danych
Użytkownik, który zczytuje informację z bazy danych powinien mieć minimalne prawa, czyli praktycznie tylko odczyt (chociaż istnieją wyjątki od tej zasady). Najlepiej także określić hosta z którego się ten użytkownik łączy (najczęściej localhost czyli komputer lokalny).
W przypadku MySQLa wystarczy wydać polecenie:
GRANT select ON nazwa_bazy.* TO proftpd@localhost IDENTIFIED BY 'haslo'
Wygląd tabel do autoryzacji
Tabele wykorzystywane do identyfikacji użytkowników powinny być zdefiniowane co najmniej następująco:
Table "usertable" Column | Type | Modifiers --------+------------------------+----------- name | character varying(30) | not null pass | character varying(30) | not null uid | integer | gid | integer | home | character varying(255) | shell | character varying(255) | Table "grouptable" Column | Type | Modifiers ---------+------------------------+----------- name | character varying(30) | not null gid | integer | not null members | character varying(255) |
Tabele te można stworzyć wydając następujące polecenia niezależnie od typu baz danych (MySQL czy PostgreSQL): CREATE TABLE usertable (name VARCHAR(30) NOT NULL, pass VARCHAR(30) NOT NULL, uid INTEGER, gid INTEGER, home VARCHAR(255), shell VARCHAR(255)); CREATE TABLE grouptable (name VARCHAR(30) NOT NULL, gid INTEGER NOT NULL, members VARCHAR(255));
Logowanie zdarzeń do bazy danych
SQLLog i SQLNamedQuery
SQLLog pozwala określić jakie zdarzenia (komendy SQL) mają być logowane do bazy danych. W połączeniu z SQLNamedQuery definiującą zapytanie SQLa możemy stworzyć ciekawe i dokładnie statystyki używania konta.
Przykład:
SQLLog PASS updatecount SQLNamedQuery updatecount UPDATE "count=count+1 WHERE userid='%u'" users