Proftpd wspomagany bazą danych

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.

Contents

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

Dodaj komentarz