07/11 2003

1) Einleitung

mod_sql ist ein Authentisierung und Log Modul für ProFTPD.

Es beinhaltet ein Frontend Modul (mod_sql) und ein Backend Modul, das Datenbank spezifisch ist, wie z.B. mod_sql_mysql oder mod_sql_postgres. mod_sql überläßt hierbei das Datenbank Handling dem Backend

 

mod_sql liegt dem ProFTPD Tarball bei, es muss jedoch explizit einkompiliert werden.

 


2) Wie benutze ich ProFTPD mit mod_sql ?

Um ProFTPD mit dem mod_sql zu kompilieren, starte "configure" mit folgenden Parametern (als Beispiel):

 

Bei Verwendung von mySQL:

./configure --with-modules=mod_sql:mod_sql_mysql

 

Bei Verwendung von Progres:

./configure --with-modules=mod_sql:mod_sql_postgres

 

Ausserdem kann es notwendig sein, die Pfader der Datenbank spezifische Libraries und Header Files mit anzugeben.

 

Bei Verwendung von mySQL:

./configure --with-modules=mod_sql:mod_sql_mysql --with-includes=/usr/local/include --with-libraries=/usr/local/lib/mysql

 

Bei Verwendung von Progres:

./configure --with-modules=mod_sql:mod_sql_postgres --with-includes=/usr/local/include --with-libraries=/usr/local/lib

 


3) Wie konfiguriere ich meine SQL Datenbank für mod_sql ?

Gehen wir einmal davon aus, daß Du weisst, wie Du Deine Datenbank benutzen musst. Als Minimum, muss es mod_sql möglich sein, eine Tabelle mit zwei Feldern (userid und passwd) anzusprechen. Für eine komplette Funktionalität ist es notwendig, mehr Felder anzusprechen, inklusive einer weiteren Tabelle für die Gruppeneinträge.

 

Die folgende Tabellenbeschreibung ist wie folgt aufgebaut:

 

  • 'COLUMN' steht für die Feld Bezeichnung
  • 'TYPE' Feldtyp (Text oder numerisch)
  • 'R' notwendig
  • 'DUP' Doppelte Einträge sind erlaubt
  • 'NULL?' NULL ist erlaubt
  • 'USE' Erklärung

 

USERTABLE (muss vorhanden sein)

COLUMN 
TYP 
DUP 
NULL 
Erklärung 
userid 
text 
Username 
passwd 
text 
Password 
uid 
num 
user's uid
die Verwendung von doppelten Einträgen der UID ist zwar möglich


stellt aber durchaus ein Sicherheitsrisiko da.



Es macht zwar ggf. das Administrieren einfacher, beschränkt jedoch das individuelle Einrichten von Sicherheitsschranken und außerdem das Loggen von User Kommandos 
gid 
num 
Gruppen ID 
homedir 
text 
user's Heimatverzeichnis
Beachte bitte die Beschreibung der Anweisungen 'SQLDefaultHomedir' und 'SQLHomedirField' 
shell 
text 
user's shell
Beachte die Beschreibung der ProFTPD Anweisung 'RequireValidShell' 

GROUPTABLE:

Für vollständige Funktion des Moduls, sollte diese Tabelle existieren.

Wenn man sich entscheidet, diese Tabelle nicht zu benutzen, dann muss man die

'SQLAuthenticate' Anweisung richtig setzen.

 

Anmerkung:

Normalerweise wird mod_sql alle passenden Gruppeneinträge verbinden. Das

bedeutet, dass man entweder mehrere Zeilen für jede Gruppe hat, mit je nur einem Mitglied pro Gruppe, oder Du hast eine einzelne Zeile mit mehreren Gruppen, oder beides gemischt. Bei Verwendung der "fast" Option für "Groupset"

bei der "SQLAuthenticate" Abweisung sind NICHT mehrere Zeilen pro Gruppe erlaubt

 


COLUMN  
TYP  
R  
NULL?  
Erklärung 
groupname  
text  
J  
N  
Gruppenname 
gid  
num  
J  
N  
group's gid 
members  
text  
J  
J  
group's members
Mehrere Mitglieder einer Gruppe müssen durch Kommas getrennt werden und sollten keine Leerzeichen enthalten. 

Um die User Tabelle zu erstellen:

 

CREATE TABLE users (

userid VARCHAR(30) NOT NULL ,

passwd VARCHAR(80) NOT NULL,

uid INTEGER UNIQUE,

gid INTEGER,

homedir VARCHAR(255),

shell VARCHAR(255)

)

 

Gruppen Tabelle:

 

CREATE TABLE groups (

groupname VARCHAR(30) NOT NULL,

gid INTEGER NOT NULL,

members VARCHAR(255)

)

 


4) Installations Anweisungen

Langsamer Login und Timeout Probleme:

 

Eine oft gestellte Frage in der ProFTPD User Mailinglise ist "Wieso geht mod_sql Schrittweise jeden User in der Datenbank durch ?"

 

Hier kommt die Erklärung: mod_sql ist ausgelegt um, alle Authentisierung Funktionen zu bearbeiten, die ProFTPD übergibt. Dieses beinhaltet Funktionen, wo alle User abgefragt werden (setpwent, getpwent, endpwent) und Funktionen, wo alle Gruppen abgefragt werden (setgrent, getgrent, endgrent).

 

Falls also mod_sql alle User oder Gruppen abfragt, dann weil es so von ProFTPD angefragt wurde. Weil es keinen guten Weg gibt, eine offene Abfrage aufrecht zu erhalten, ohne gleich neuen Code an die einzelnen Backend Module anzufügen, cached mod_sql User wenn setpwent() aufgerufen wird und cached alle Gruppen, wenn setgrent() aufgerufen wird. Dieses erlaubt die getpwent() und getgrent() Aufrufe einfach zu gestalten, auf Kosten der Zeit zu Beginn.

 

In einfachen Situationen werden diese Funktionen niemals aufgerufen. Wenn Du beginnst Zugriffe auf Verzeichnisse und Dateien, oder das Aufrufen von FTP Befehlen, auf Basis von Usernamen oder Gruppenname zu beschränken, dann muss ProFTPD alle User und Gruppen abfragen, um die Rechte zu überprüfen. Ein Standard FTP Server, inklusive Virtuellen und Anonymen Server, wird wahrscheinlich nie schrittweise alle User abfragen benötigen, jedoch wird alle Gruppen so abfragen.

 

Die 'SQLAuthenticate' Anweisung sieht eine Methode vor, mod_sql stumm zu stellen, standardmässig mod_sql wird die verschiedenen pwent() und grent() Aufrufe abarbeiten. Wenn 'SQLAuthenticate' gesagt wird, die Userabfragen oder Gruppenabfragen nicht zu bearbeiten, wird mod_sql diese einfach an irgendein Authentisierungsmechanismus im System weiterleiten. Bedenke hierbei, daß wenn man 'SQLAuthenticate' so benutzt wird, es bedeutet, daß ProFTPD nicht die gleichen Informationen benutzt um den User zu authentisieren als später die Zugriffskontrolle während der Session zu überprüfen.

 

Bei denen, die bereits in der Vergangenheit die mod_sql benutzt haben, sollten die Abfragen möglicherweise ausgeschaltet werden. Versionen von mod_sql vor V 3.2.0 (irgendwo da) haben die "{set|get|end}{pw|gr}ent" Aufrufe garnicht bearbeitet, so dass ein Abstellen dieses Abfragen keinerlei Funktionsverlust mit sich bringt.

 

Neue Benutzer von mod_sql sollten ihre Bedürfnisse überdenken - ist die Abfrage jedes Benutzers und Gruppe es wert, dass die Zugriffskontroll aus der Datenbank erfolgt ? Falls nicht, sollte man die Art der Datenbank Benutzung überdenken und wo man die User und Gruppeninformationen speichert

 


5) Anweisungen

Die Anweisungen sind hier in alphabetischer Reihenfolge aufgelistet. Falls Du gerade mit mod_sql beginnst, dann sind wahrscheinlich 'SQLConnectInfo', 'SQLAuthTypes', und die Anweisung, welche Tabelle und Felder die Daten enthalten ('SQLUserInfo' und 'SQLGroupInfo') die Interessantesten.

 

Die meisten Anweisungen habe sinnvolle Default Werte, bei ganz einfachen Konfigurationen benötigt man nur zwei Anweisungen: 'SQLConnectInfo' und 'SQLAuthTypes'.

 

 


5.1) SQLAuthenticate

Syntax :  
SQLAuthenticate on / off
SQLAuthenticate [users[*]] [groups[*]] [userset[fast]] [groupset[fast]] 
Default:  
on 
Context:  
server config, <Global>, <VirtualHost> 
Module:  
mod_sql 

"SQLAuthenticate" kontrolliert das Verhalten von mod_sql. Die Anweisung gibt 
an, was authentifiziert werden soll (User und/oder Gruppen) und wie diese authentifiziert werden soll. Die Argumente können in jeder Reihenfolge übergeben werden. 
Folgende Möglichkeiten: 

on:  
Kurzfassung für 'SQLAuthenticate users groups userset groupset' 
off:  
Schaltet die mod_sql Abfragen aus 
users[*]:  
Wenn angegeben, wird mod_sql User Abfragen durchführungen. Wenn ein Sternchen "*" [Users*] angehängt wird, dann wird mod_sql die exklusive Benutzer Abfrage. Keine andere Authentifizierungs Maánahme (z.B. PAM) wird durchgeführt. Falls nicht vorhanden, wird mod_sql überhaupt keine User Abfragen durchführen, inklusive den "{set/get/end}pwent" Aufrufen (siehe unten). 
groups[*]:  
Wenn angegeben, wird mod_sql Gruppen durchführen. Wenn ein Sternchen "*" angehängt wird, dann wird mod_sql die exklusive Gruppen Abfrage. Falls nicht vorhanden, wird mod_sql überhaupt keine Gruppen Abfrage durchführen, inklusive den "{set/get/end}grent" Aufrufen (siehe unten) 
userset[fast]:  
Wenn angegeben, mod_sql wird den eventuell aufwendigen "{set/get/end}pwent" Aufruf durchführen. Falls nicht vorhanden, wird mod_sql diese Abfragen nicht durchführen. Wird der Suffix "fast" angegeben, wird die Abfrage einmal für alle User durchgeführt, anstatt eine Abfrage pro User. Dieses verringert sie Anzahl der Abfragen deutlich, kostet jedoch Speicher. Dieses Argument hat keine Auswirkung, falls "users" nicht definiert wurde. 
groupset[fast] :  
Wenn angegeben, mod_sql wird den eventuell aufwendigen "{set/get/end}grent" Aufruf durchführen. Falls nicht vorhanden, wird mod_sql diese Abfragen nicht durchführen. Wird der Suffix "fast" angegeben, wird die Abfrage einmal für alle Gruppen durchgeführt, anstatt eine Abfrage pro Gruppe. Dieses verringert sie Anzahl der Abfragen deutlich, kostet jedoch Speicher. Dieses Argument hat keine Auswirkung, falls "groups" nicht definiert wurde. 

Anmerkung:

Die 'SQLLog' und 'SQLShowInfo' Anweisungen werden immer von mod_sql abgearbeitet. Die 'SQLAuthenticate' Anweisung betrifft nur die Abfragen von "User" und "Group" durch das Modul.

 

Durch abstellen (bzw. nicht einbinden) der User oder Gruppen abfragen, wird die Funktionalität von mod_sql beeinträchtigt. Hierdurch wird ggf. die Möglichkeit der Zugriffskontrolle aufgrund von Gruppenzugehörigkeit verhindert. Dies ist jedoch Abhängig von anderen Möglichkeiten der Authentifizierung. Jedoch nimmt die Geschwindigkeit der Authentifizerung deutlich zu, diese Abfragen nicht durchführt.

 

Die "fast" Option ist nicht für jede Seite angebracht. Normalerweise, mod_sql empfängt eine Liste von Usern und Gruppen und bekommt die Informationen aus der Datenbank pro User oder pro Gruppe. Diese ist sehr Abfragen aufwendig - es benötigt (n+1) Abfragen, wobei "n" die Anzahl der User oder Gruppen ist. Wenn man die "Fast" Abfragen wählt, wird mit einer einzelnen SELECT Anfrage die Informationen aus der Datenbank geholt. Man erreicht zwar so eine dramatische Reduzierung der Abfragen, jedoch einen deutlich erhöhten Speicherbedarf, da alle User und Gruppen informationen auf einmal gelesen werden, statt in kleinen Portionen.

 

GROUP TABLE STRUKTUR

 

Normalerweise mod_sql erlaubt mehrere Gruppen per Zeile und mehrere Zeilen pro Gruppe. Bei Verwendung der Fast Option für Groupset, DARF es nur eine Zeile pro Gruppe geben. Zum Beispiel: Normalerweise behandelt mod_sql alle drei Tabellen exakt gleich.

 


GROUPNAME  
GID  
MEMBERS 
Gruppe1  
1000  
Stonki 
Gruppe2  
1000  
Paul 
Gruppe3  
1000  
Weller 
GROUPNAME  
GID  
MEMBERS 
Gruppe1  
1000  
Stonki,Paul 
Gruppe3  
1000  
Weller 
GROUPNAME  
GID  
MEMBERS 
Gruppe1  
1000  
Stonki,Paul,Weller 

5.2) SQLAuthTypes

Syntax  
SQLAuthTypes [OpenSSL] [Crypt] [Backend] [Plaintext] [Empty] 
Default:  
none 
Context:  
server config, <Global>, <VirtualHost> 
Module  
mod_sql 

Gibt die erlaubten Authentisierung Typen an und die Reihenfolge der überprüfung. Beachte: DU MUSST MINDESTENS EINE AUTHENTISIERUNGS METHODE ANGEBEN ! Falls keine Methode angegeben wird, werden mod_sql keine User authentisiert.

 

Zum Beispiel:

SQLAuthTypes Crypt Empty

 

bedeutet: überprüfe ob das Passwort in der Datenbank im UNIX crypt() Format gültig ist; wenn diese Abfrage nicht stimmt, überprüfen ob das Passwort in der Datenbank leer ist (ALLE Passwörter sind gültig); wenn dieses auch nicht simmt lehnt mod_sql die Authentisierung ab.

 

Aktuelle Typen:

 


Plaintext:  
erlaubt Passwörter in der Datenbank als Klartext 
OpenSSL:  
erlaubt Passwörter in der Datenbank in der Form "{digestname}hashedvalue". Dieser Art der Authentisierung ist nur verfügbar, wenn ProFTPD mit dem Parameter 'HAVE_OPENSSL' compiliert wurde und mit der OpenSSL 'crypto' lib gelinkt wurde. 
Crypt:  
erlaubt Passwörter in in der Datenbank im UNIX crypt() Format 
Backend:  
dieses ist eine Datenbank spezifische Lösung. Nicht alle Backends unterstützen dieses. Speziell die MySQL Datenbank benutzt diesen Typ um MySQL 'PASSWORD()' verschlüsselte Passwörter zu Authentisieren. Unter Progress passiert nichts. ACHTUNG: Wenn Dein MySQL Log lesbar ist, sind User Passwörter sichtbar 
Empty:  
dieses erlaubt leere Passwörter in der Datenbank, die mit jedem Passwort übereinstimmen. Das Feld in der Datenbank muss wirklich einen leeren String enthalten, NULL Werte werden nicht akzeptiert. SEI HIERMIT SEHR VORSICHTIG ! 

5.3) SQLConnectInfo Syntax

Syntax  
SQLConnectInfo connection-info [username] [password] [Methode] 
Default:  
none 
Context:  
server config, <Global>, <VirtualHost> 
Module:  
mod_sql 

Gibt die Verbindungsinformationen an. Die Verbindungsinformationen geben die Datenbank, Host, port und andere Backend-spezifische Angaben. "Username" und "Password" geben den User an, mit dem an die Datenbank angemeldet werden soll.

Die Standard Werte sind NULL, die das Backend in einem Backend spezifisch behandeln wird. Falls Du ein Passwort angibst, MUSST Du einen Usernamen angeben. Falls keine "SQLConnectInfo" Anweisung im Konfigurationsfile definiert ist, wird mod_sql sich selbst abschalten und niemand im Weg sein. Man hat dennoch natürlich keine Datenbank Unterstützung mehr.

 

Jedes Backend hat die Möglichkeit (aber NICHT die Verpflichtung) beim Start von ProFTPD nach Syntax Fehlern bei den Verbindungsinformationen zu suchen. Du solltest aber nicht die Erkennung logische Fehler erwarten, bis mod_sql versucht sich mit dem Server zu verbinden. Eine Datenbank Verbindung wird beherscht von einer Methode, wann die Datenbankverbindungen geöffnet und geschlossen werden soll.

 

Es gibt drei Möglichkeiten:

 


PERSESSION  
öffne die Datenbankverbindung beim Start der Session und schliesse die Verbindung am Ende der Verbindung. 
PERCALL  
öffne die Datenbankverbindung für jede Abfrage und schliesse sie danach wieder. 
# (TIMED)  
Zeitabhängige Verbindung, die sich nach # Sekunden inaktivität wieder schliesst. 

Falls die Methode nicht angegeben ist, falls die Methode keine Nummer ist; falls die Nummer kleiner 1 ist; oder falls als Methode "PERSESSION" angegeben ist, wird die "PERSESSION" Methode verwendet. Wird als Methode "PERCALL" angegeben, so wird die "PERCALL" Methode verwendet. Wird als Methode eine Zahl grösser 0 angeben, gibt diese die Zeit dafür in Sekunden an, in der die Datenbankverbindung trotz inaktivität offen gehalten wird. Nach dieser Zeit wird die Verbindung geschlossen und sobald eine Verbindung wieder benötigt wird, wieder aufgebaut.

Die MySQL und Progess Backend Verbindung Info wird im folgenden Format erwartet:

 

database[@hostname][:port]

 

Der Hostname ist Standardmässig abhängig vom Datenbank Backend und ist bei MySQL und Progres jeweils "localhost". Der Port ist ebenfalls Backend Abhängig und ist bei MySQL: 3306 und bei Postgres: 5432.

 

MySQL: Aus der Dokumentation: "Der Wert des Hosts ist entweder ein Hostname oder eine IP Adresse. Ist der Wert "NULL" oder der String "localhost" wird eine Verbindung zum lokalen Rechner angenommen. Sollte das Betriebssystem Sockets (Unix) oder Named Pipes (Windows) unterstützen, werden diese statt TCP/IP zur Verbindung benutzt.

 

PostgreSQL: Aus der Dokumentation: 'Falls [Der hostname] mit einem Slash beginnt, bezeichnet er eine Unix Domain Kommunikation statt TCP/IP. Der Wert ist der Name von einem Verzeichnis in dem das Socket File liegt. Die Voreinstellung ist eine Verbindung zu einem Unix Domain Socket in /tmp.'

 

Beachte: Wenn Du die Verwendung von PERCALL oder TIMED Verbindungen planst, bedenke den Einfluss von Anweisungen wie 'DefaultRoot' auf die lokale Socket Verbindung - nachdem der User chroot(ed) wurde, kann ggf. die Socket Datei nicht mehr erreicht werden und das wiedererstellen der Verbindung scheitert. Ein möglicher Ausweg, wäre die Verwendung von Hardlinks innerhalb der User Verzeichnisse.PERSESSION Verbindungen haben diese Einschränkung nicht, da die Verbindung vor dem Aufruf von chroot() geschieht und während der Session aktiv bleibt. Netzwerk Verbindungen sind von diesem Problem nicht betroffen, z.B. falls 'localhost' in MySQL nicht funktioniert, da MySQL eine Socket Verbindung aufbauen will, wird eine Verbindung mit 127.0.0.1 funktionieren (solange die Datenbank diese Verbindungen nicht untersagt).

 

Beispiele:

 


SQLConnectInfo ftpusers@foo.com  
Versuche mit den Datanbank "ftpuser" zu verbinden am server "foo.com" auf dem Standard Port. Benutze als Usernamen und Passwort NULL. Benutze die PERSESSION Methode. 
SQLConnectInfo ftpusers@foo.com:3000 admin mypassword PERCALL  
Versuche mit der Datenbank "ftpuser" auf dem Server "foo.com", Port 3000 zu verbinden. Benutze dafür den Usernamen "admin" und das Passwort "mypassword". benutze die PERCALL Methode. 
SQLConnectInfo ftpusers@foo.com:3000 admin mypassword 30  
Versusche mit der Datenbank "ftpuser" auf dem Server foo.com", Port 3000 zu verbinden. Benutze dafür den Usernamen "admin" und as Passwort "mypassword". Begrenze die inaktive Zeit auf 30 sekunden. 

5.4) SQLDefaultGID

Syntax  
SQLDefaultGID defaultgid 
Default:  
65533 
Context:  
server config, <Global>, <VirtualHost> 
Module  
mod_sql 
Anmerkung:  
Setzt die Standard GID (Gruppen ID) für User. Muss grösser als SQLMinUserGID sein 

5.5) SQLDefaultHomedir:

Syntax  
SQLDefaultHomedir /pfad/zum/home/dir 
Default:  
none 
Context:  
server config, <Global>, <VirtualHost> 
Module  
mod_sql 
Anleitung:  
Gibt ein Standard Heimatverzeichniss für alle Benutzer an, die mit dem mod_sql Modul authentisiert werden, hautptsächlich jede "SQLHomedirField" Anweisung. Falls kein Heimatverzeichnis mit diesen Anweisungen gesetzt wird, scheitert die Anmeldung. Diese Anweisung ändert nicht ein ggf. in der Datenbank angegebenes Heimatverzeichnis. Wenn Du ein Feld für das Heimatverzeichnis in der SQLUserInfo angibst, werden diese Daten genommen, gleichgültig ob diese Daten ein gültiges Verzeichnis, eine leeren String oder NULL enthalten. 

5.6) SQLDefaultUID

Syntax  
SQLDefaultUID defaultuid 
Default:  
65533 
Context:  
server config, <Global>, <VirtualHost> 
Module  
mod_sql 
Anleitung:  
Setzt die Standard UID für User. Muss grösser als SQLMinUserUID sein 

5.7) SQLGroupInfo

Syntax  
SQLGroupInfo grouptable groupname gid members 
Default:  
groups groupname gid members 
Context:  
server config, <Global>, <VirtualHost> 
Module:  
mod_sql 
Anleitung:  
Definiert die Gruppentabelle und die Feldnamen.
  • grouptable: Gibt den Namen der Tabelle an, die die Gruppeninformatationen enthält.
  • groupname : Gibt das Feld an, daß den Gruppennamen enthält
  • gid : Gibt das Feld an, daß den Gruppen ID (GID)
  • members

  • Gibt das Feld an, daß die Gruppenmitglieder enthält. Solltest Du ein Feld umbenennen, so musst Du ALLE Felder angegeben. 

    5.8) SQLLog

    Syntax  
    SQLLog cmd-set query-name [IGNORE_ERRORS] 
    Default:  
    none 
    Context:  
    server config, <Global>, <VirtualHost> 
    Module  
    mod_sql 

    Schreibt Informationen in eine Tabelle. Mehrere SQLLog Anweisungen können für jeden Befehl zuständig sein. z.B. ein User ändert ein Verzeichnis kann mehrere Log Aktionen starten. Das erste Parameter für SQLLOG, das Befehlsset, ist eine Liste von FTP Befehlen (per Komma getrennt, keine Leerzeichen), die ein Loggen starten. Die Liste der Befehle ist zu lang, um hier komplett aufgelistet zu werden und beinhaltet u.a. die wichtigen Befehle CWD, DELE, HELP, LIST, MKD, MODE, NLST, PASS, PASV, PORT und viele andere. Für eine komplette Liste schaut bitte in der RFC von FTP. [www.proftpd.org/docs/rfc.html]

     

    Normalerweise wird mod_sql Aktionen loggen, nachdem sie erfolgreich beendet sind. Im Falle des "QUIT" Befehles jedoch, loggt mod_sql dieses bevor der Befehl von ProFTPD aufgeführt wird.Logeinträge werden nur ausgeführt, wenn die FTP Befehle erfolgreichbeendet wurden. Ein vorgestelltes "ERR_" erlaubt das loggen, wenn der ausgeführte Befehl nicht erfolgreich beendet wurde. Um beide Möglichkeiten (also erfolgreiche und unerfolgreiche Aktion) zu loggen, müssen beide Möglichkeiten genannt werden. Die Angabe '*' bezeichnet alle FTP Befehle, während 'ERR_*' alle Fehler bezeichnet.

     

    Das zweite Argument ist der Name eine Abfrage, definiert durch die 'SQLNamedQuery' Anweisung. Die Abfrage muss vom Typ eine UPDATE, INSERT oder FREEFORM Abfrage sein - SELECT Abfragen werden nicht abgearbeitet. Das dritte Argument ist optional. Wenn man ein 'IGNORE_ERRORS' anfügt, wird SQLLOG während der Ausführung der Abfrage keine Fehlerüberprüfung vornehmen. Jedes andere Argument als "IGNORE_ERRORS' wird ohne Fehlermeldung ignoriert.

     

    Normalerweise werden Fehler in einer SQLLOG Anweisungen sehr ernst genommen und mod_sql wird die Verbindung beenden. Verweise auf nicht existierende Abfragen werden NICHT die Verbindung beenden, können jedoch fehlende Datenbank Einträge erzeugen. Prüfe Deine Anweisungen !!

     

    Beispiel:

     


    Beispiele:

    SQLLog PASS updatecount

    SQLNamedQuery updatecount UPDATE "count=count+1 WHERE userid='%u'" users

     

    Dieses ersetzt die alte 'SQLLoginCountField count' Anweisung und zählt bei jedem Einloggen den Wert des Feldes count in der Tabelle users einen höher. Ist der aktuelle User 'joe', so würde dieses übersetzt werden in: "update users set count=count+1 where userid='joe'"

     

    Diese Abfrage würde immer gestartet werden, wenn ein User sich angemeldet hat.

     


     

    SQLLog CWD updatedir

    SQLNamedQuery updatedir UPDATE "cwd='%d' where userid='%u'" users

     

    Dieses ersetzt die alte 'SQLLogDirs cwd' Anweisung und schreibt jedes Verzeichnis in das der User wechselt in die Datenbank, Tabelle "users". Ist aktuelle User 'joe' uns das aktuelle Verzeichnis '/tmp', wird dieses übersetzt in: "update users set cwd='/tmp' where userid='joe'". Diese Anfrage wird immer gestartet, wenn ein User ein Verzeichnis wechselt.

     


     

    SQLLog RETR,STOR insertfileinfo

    SQLNamedQuery insertfileinfo INSERT "'%f', %b, '%u@%v', now()" filehistory

     

    Dieses schreibt bei jedem (erfolgreich) senden oder empfangen einer Datei den Namen, die Grösse in Bytes, den User und Host sowie die aktuelle Zeit (zumindest unter MySQL) in die Tabelle filehistory. Dieses würde übersetzt werden Abfrage ähnlich:

    "insert into filehistory values ('somefile', 12345, 'joe@joe.org', '21-05-2001 20:01:00')"

     


    5.9) SQLMinID

    Syntax  
    SQLMinID minimumid 
    Default:  
    999 
    Context:  
    Server config, Global, VirtualHost 
    Module:  
    mod_sql 
    Anleitung:  
    SQLMinID ist ein schneller Weg um je SQLMinUserGID und SQLMinUserUID zu setzen. Diese Werte werden immer überprüft, wenn eine UID oder GID vom User empfangen wird. Siehe auch die 'SQLMinUserGID' und 'SQLMinUserUID' Anweisung 

    5.10) SQLMinUserGID

    Syntax:  
    SQLMinUserGID 
    Default:  
    999 
    Context:  
    server config, Global, VirtualHost 
    Module:  
    mod_sql 
    Anleitung:  
    SQLMinUserGID wird immer überprüft wenn eine User GID empfangen wird. Ist der empfangene Wert kleiner dem Wert von SQLMinUserGID, wird die GID mit dem minimalen Wert angegeben. 

    5.11) SQLMinUserUID

    Syntax:  
    SQLMinUserUID 
    Default:  
    999 
    Context:  
    server config, Global, VirtualHost 
    Module:  
    mod_sql 
    Anleitung:  
    SQLMinUserUID wird immer überprüft wenn eine User UID empfangen wird. Ist der empfangene Wert kleiner dem Wert von SQLMinUserUID, wird die UID mit dem minimalen Wert angegeben. 

    5.12) SQLNamedQuery

    Syntax:  
    SQLNamedQuery name type query-string [table] 
    Default:  
    none 
    Context:  
    server config, Global, VirtualHost 
    Module:  
    mod_sql 
    Anleitung:  
    SQLNamedQuery definiert eine Abfrage und ein Namen für die spätere Benutzung durch 'SQLShowInfo' und 'SQLLog'. Es wird SEHR empfohlen, dass Du die Dokumentation zu den ProFTPD Anweisungen 'LogFormat' und 'ExtendedLog' liest, da die Abläufe bei 'SQLNamedQuery' zum grössten Teil identisch sind. 

    Das erste Argument ist der Name, der für alle Abfragen eindeutig ein muss und keine Leerzeichen enthalten darf. Das Ergebnis bei Benutzer identischer Namen ist nicht definiert.

    Das zweite Argument "type" ist der Typ der Abfrage, entweder SELECT', 'UPDATE', 'INSERT' oder 'FREEFORM'. Bitte beachte die Anmerkungen unten über die FREEFORM Abfragen.

    Das dritte Argument ist die eigentlich Abfrage selbst und muss dem Typ (zweites Argument) entsprechen. Die Parameter hier sind dentisch zur 'LogFormat' Anweisungen.

     

    Folgende Anweisungen sind jedoch NICHT ERLAUBT:

     

    %{FOOBAR}e:  
    für 'LogFormat', diese logt den Inhalt der Umgebungsvariable "FOOBAR". Dies ist NICHT in mod_sql möglich. 
    %{format}t: and %t  
    Diese beiden Angaben loggen die lokale Serverzeit. Beide sind unter mod_sql NICHT verfügbar. Die Datenbank bietet jedoch andere Möglichkeiten die lokale Zeit zu loggen, z.B. die Funktion now() in MySQL. 

    Folgende Parameter bietet mod_sql zusätzlich zu der normalen 'LogFormat'

     

    Anweisung:

    %d  
    das aktuelle Arbeitsverzeichnis oder "-" falls nicht gegeben. 
    %{n}  
    Dieses Parameter wird intern von mod_sql und anderen Modulen benutzt um Informationen an die Datenbank weiter zu leiten. Dieses Parameter ist nur Zulässig bei einer INSERT oder UPDATE Abfrage und führt sonst zu einer Fehlermeldung. Ausserdem ist der Aufruf nur von einem Modul zulässig. 

    Die korrekte Form einer Abfrage wird aus den Angaben zur Anweisung gebildet, mit Ausnahme der FREEFORM Abfragen, die direkt zum Server geschickt werden. Folgende Beispiele sollen zeigen, die mod_sql die Anweisungen in eine Abfrage umbaut. Das vierte Argumnt 'table' ist zwingend Notwendig bei 'UPDATE' oder 'INSERT' Abfragen.

     

    Anmerkung:

    FREEFORM Abfragen sind ein nötiges übel. Die einfache Syntax der UPDATE, INSERT und SELECT Abfragen nutzen nicht die Möglichkeiten moderner Datenbanksysteme. Auf der anderen Seite, macht es die Verwendung von FREEFORM Abfragen mod_mysql unmöglich den Sinn von Abfragen zu überprüfen, z.B. die Verwendung einer SELECT Anweisung in einer SQLLOG Anweisung. Daher sollte man wenn möglich die normalen Abfrage Typen benutzen.

     

    Beispiele:

    SQLNamedQuery count SELECT "count from users where userid='%u'"

    erstellt eine Abfrage mit dem Namen 'count', die einem User mittels SQLShowInfo während dessen Login angezeigt wird. Die eigentliche Abfrage wäre ähnlich: "SELECT count from users where userid='matilda'" for user 'matilda'.

     


     

    SQLNamedQuery updatecount UPDATE "count=count+1 WHERE userid='%u'" users

    erstellt eine Abfrage mit dem Namen 'updatecount', die mittels SQLLOG dazu benutzt wird einen Login Zähler in der Tabelle 'users' zu erhöhen. Die eigentlich Abfrage für den User 'stonki' wäre ähnlich: "UPDATE users SET count=count+1 WHERE userid='stonki'"

     

     


     

    SQLNamedQuery accesslog INSERT "now(), '%u'" accesslog

    erstellt eine Abfrage mit den Namen 'accesslog', die mittels SQLLOG zum loggen der Onlinezeiten benutzt werden kann. Die eigentlich Abfrage wäre für den User 'paul' ähnlich: "INSERT INTO accesslog valueS (now(), 'paul')"

     

    Diese Tabellenstruktur mag für den täglich Gebrauch zu einfach sein, da die meisten Datenbanken die Daten für JEDE Feld benötigen. Falls man nur ein Felder ändern will, ist ggf. die FREEFORM Abfrage besser geeignet:

     

    SQLNamedquery accesslog FREEFORM "INSERT INTO accesslog(date, user) values (now(), '%u')"

    erstellt eine Abfrage mit dem Namen 'accesslog', die mittels SQLLOG zum loggen der Onlinezeiten benutzt werden kann. Die eigentlich Abfrage wäre für den User 'weller' ähnlich: "INSERT INTO accesslog(date, user) valueS (now(), 'weller')"

     


    5.13) SQLRatios

    Syntax:  
    SQLRatios on/off SQLRatios file-ratio file-creds byte-ratio byte-creds 
    Default:  
    off 
    Context:  
    server config, Global, VirtualHost 
    Module:  
    mod_sql 
    Anleitung:  
    Aktiviert mod_ratio und das schreiben von Benutzerabhängigen Ratio Daten. Siehe auch die "mod_ratio" Dokumentation für mehr Informationen über diese Felder und deren Bedeutung. Diese Anweisung benötigt weitere Felder in der User Tabelle: frate, fcred, brate, bcred
    Die Feldbezeichnungen sind die Standard Werte, die SQLRatio benutzt, wenn es aktiviert wird. Diese Anweisung wird einzig und allein von mod_ratio benutzt. Ohne mod_ratio hat diese Anweisungen keinen Effekt 

    5.14) SQLRatioStats

    Syntax:  
    SQLRatioStats on/off SQLRatioStats f-stored f-retrieved b-stored b-retrieved 
    Default:  
    off 
    Context:  
    server config, Global, VirtualHost 
    Module:  
    mod_sql 
    Anleitung:  
    Bei Verwendung von mod_ratio wird die Anzahl der gesendeten und empfangen Files, sowie das gesendete und empfangene Datenvolumen in Bytes pro User geloggt. Siehe aich die Dokumentation von mod_ratio um mehr Informationen über diese Felder und deren Bedeutung zu erfahren. Diese Anweisung benötigt einige weitere Felder in der User Tabelle: fstor, fretr, bstor, bretr.
    Die genannten Feldbezeichnungen sind die Standardwerte und werden benutzt, wenn SQLRatioStats aktiviert wird. Anmerkungen: Die Felder "bstor" und "bretr" sollten Werte grösser 32 Bit enthalten, da sonst bei ca. 4 GB nicht weitergezählt werden kann. Diese Anweisung wird einzig und allein von mod_ratio benutzt. Ohne mod_ratio hat diese Anweisungen keinen Effekt. 

    5.15) SQLShowInfo

    Syntax:  
    SQLShowInfo cmd-set numeric query-string 
    Default:  
    none 
    Context:  
    server config, Global, VirtualHost 
    Module:  
    mod_sql 
    Anleitung:  
    Erzeugt eine Nachricht, die an den User nach einem erfolgreichen Befehl gesendet wird. 

    Das erste Parameter, das Befehlsset, ist eine Liste von FTP Befehlen (per Komma getrennt, keine Leerzeichen), die ein Loggen starten. Die Liste der Befehle i st zu lang, um hier komplett aufgelistet zu werden und beinhaltet u.a. die wichtigen Befehle CWD, DELE, HELP, LIST, MKD, MODE, NLST, PASS, PASV, PORT und viele andere. Für eine komplette Liste schaü bitte in der RFC von FTP. [Anmerkung des Übersetzers: www.proftpd.org/docs/rfc.html]

     

    Logeinträge werden nur ausgeführt, wenn die FTP Befehle erfolgreich beendet wurden. Ein vorgestelltes "ERR_" erlaubt das loggen, wenn der ausgeführte Befehl nicht erfolgreich beendet wurde. Um beide Möglichkeiten (also erfolgreiche und unerfolgreiche Aktion) zu loggen, müssen beide Möglichkeiten genannt werden.

     

    Die Angabe '*' bezeichnet alle FTP Befehle, während 'ERR_*' alle Fehler bezeichnet. Das zweite Argument 'numeric' gibt den numersichen Wert an, mit dem die Nachricht, an den FTP Client gesendet wird. Wähle diese Nummern NICHT zufällig aus, sie könnte vom Client weiterverarbeitet werden. In den meisten Fällen sollte man "214" für die Hilfsnachricht benutzen. Das gibt an, dass die Nachricht für den User bestimmt ist. Das dritte Argument, der 'query-string', ist identisch mit dem 'query-string' Argument der 'SQLLog' Anweisung, mit einer Ergänzung:

     

  • %{name} : Der _erste_ Rückgabewert von SQLNamedQuery gegeben per Name.
  •  

    Es gibt derzeit keinen Weg, um mehr als einen Rückgabewert pro Abfrage zu erfragen.

     

    Alle Verweise auf nicht existierende Abfragen, nicht SELECT oder FREEFORM Abfragen, oder verweise auf Abfrage, die einen NULL Wert zuerst zurückgeben, werden mit einem String "{null}" ersetzt. Zum Beispiel:

     

    SQLNamedQuery count SELECT "count from users where userid='%u'"

    SQLShowInfo PASS "230" "You've logged on %{count} times, %u"

     

    Angenommen die Informationen existieren in der Datenbank, geben diese beiden Anweisungen an, dass der User nach einem erfolgreichen

    Login mit seinem Login Counter begrüsst wird. Beachte die Verwendung des "230" Codes. Diese ist in der RFC für FTP definiert als "230 User logged in, proceed", was soviel bedeutet, daß alles ok ist. Dieser Code ist hier angebracht, da die Nachricht unmittelbar nach Akzeptieren des Passwortes geschickt wird und die Verbindung gestartet ist. [Anmerkung des übersetzers: siehe auch [www.rfc-editor.org/rfc/rfc959.txt]

     

    5.16) SQLUserInfo

    Syntax :  
    SQLUserInfo usertable username passwd uid gid homedir shell 
    Default:  
    users userid password uid gid homedir shell 
    Context:  
    server config, Global, VirtualHost 
    Module:  
    mod_sql 
    Anleitung:  
    Spezifiziert die User Tabelle und die Felder, die die User Informationen enthalten. 
    usertable:  
    Gibt den Namen der Tabelle an, die die Informationen enthält 
    username:  
    Gibt das Feld an, dass den Usernamen enthält 
    passwd:  
    Gibt das Feld an, dass das Passwort für den User enthält 
    uid:  
    Gibt das Feld an, dass die User ID enthält. Wenn die UID von der Datenbank empfangen wird, wird diese mit dem Wert von SQLMinUserUID überprüft und ggf. angepasst. Falls der Feldname als "NULL" bezeichnet ist, wird die Datenbank keine Abfrage vornehmen und den Wert der UID auf den Wert von SQLDefaultUID setzen. 
    gid:  
    Gibt das Feld an, dass die Gruppen ID enthält. Wenn die GID von der Datenbank empfangen wird, wird diese mit dem Wert von SQLMinUserGID überprüft und ggf. angepasst. Falls der Feldname als "NULL" bezeichnet ist, wird die Datenbank keine Abfrage vornehmen und den Wert der UID auf den Wert von SQLDefaultGID setzen. 
    homedir :  
    Gibt das Feld an, dass das Heimatverzeichnis vom User enthält. Ist die Feldbezeichnung als "NULL" angegeben, wird die Datenbank nicht das Heimatverzeichnis abfragen und stattdessen den Wert vom SQLHomeDIR übernehmen. Sollte mit beiden Werten kein Heimatverzeichnis angegeben werden, so wird die Benutzerauthentisierung automatisch abgeschaltet. 
    shell :  
    Gibt das Feld an, dass die Angabe der Shell enthält. Ist die Feldbezeichnung als "NULL" angegeben, wird die Datenbank nicht die Shell abfragen und stattdessen einen leeren String ("") übergeben. 

    Lese die obige Beschreibung. Solltest Du ein dieser Feld anders benennen müssen, so müssen alle Felder angebeben werden, ggf. als NULL


    5.17) SQLUserWhereClause

    Syntax: | SQLUserWhereClause whereclause

    Default: | none

    Context: | server config, Global, VirtualHost

    Module: | mod_sql

    Anleitung: | Gibt eine Abfrage an, die an jede User Abfrage angehängt wird. Die Abfrage muss alle relevanten Zeichen enthalten, jedoch KEIN führendes "and". Um eine Verwendung einmal zu demonstrieren, stelle mir eine User Tabelle mit einem "zugang_ok" Feld vor:

    SQLUserWhereClause "zugang_ok= 'true'"

    würde an jede User relevante Abfragen folgenden String anhängen: " WHERE (zugang_ok = 'true')"

     


    6) SQL Beispiel einer Tabellen Erstellung

    Diese beiden SQL Befehle sollten mit jeder ANSI SQL Komplatiblen Datenbank funktionieren, und funktionieren definitiv unter MySQL und PostgreSQL. Beide erstellen die in Kapitel 2 dieses Dokumentes genannten Tabellen, mit sinnvollen Werten für den Datentyp und die Feldlänge.

     

    Man kann strengere Definionen bei Bedarf verwenden - wenn man z.B. das Heimatverzeichnis oder die Shell definiert sollte man diese Felder als NOT NULL oder UNIQUE (einzigartig) definieren.

     

    Um die Usertabelle zu erstellen:

    CREATE TABLE users (userid VARCHAR(30) NOT NULL UNIQUE, passwd VARCHAR(30) NOT NULL, uid INTEGER UNIQUE, gid INTEGER, homedir VARCHAR(255), shell VARCHAR(255))

     

    Um die Gruppentabelle zu erstellen:

     

    CREATE TABLE groups (groupname VARCHAR(30) NOT NULL, gid INTEGER NOT NULL, members VARCHAR(255))