The Net Wizard HauptseiteISP SetupNetzwerkeVelotourenSoftwareKryptografieVaria

Postgresql

Traditionell existieren mailempfänger auf einem Unix basierten System auch als Benutzer auf Betriebssystemebene. Das bringt allerdings einige Nachteile mit sich. So ist es zum Beispiel wesentlich einfacher, ein System vor Fehlmanipulationen durch einen Benutzer zu schützen, wenn kein Systemaccount vorhanden ist. Das ist der Hauptgrund, warum ich mich entschieden habe, mit virtuellen Konten zu arbeiten.
Es gibt im wesentlichen zwei M√∂glichkeiten der Userverwaltung. Einerseiits Ldap, andererseits eine Datenbank. Ldap hat den Vorteil, dass es auf sehr schnelles Lesen optimiert wurde. Bei grösseren Instanzen würde ich deshalb Ldap verwenden. Wenn man allerdings weiss, dass die Anzahl Kunden nicht markant über 10'000 Konten gehen wird, funktioniert eine Datenbank auch.

Warum postgresql

Die erste Version in der ich eine ISP Plattform aufgesetzt habe, lief mit MySQL als backend. Nachden dann aber MySQL von Sun gekauft wurde und kurz danach Sun von Oracle gekauft wurde, habe ich mich entschieden, eine andere Datenbank einzusetzen. Und da war Postgresql die naheliegendste Wahl. Aber das Setup funktioniert eigentlich mit jeder Datenbank, die den SQL Standard implementiert hat.

Struktur der Datenbank

Im Prinzip muss die Datenbank dieselben Informationen zur Verfügung stellen, die bei einem Unix System durch /etc/shadow resp. /etc/passwd bereitgestellt werden.
  • login (in diesem Fall die email Adresse).
  • User ID
  • Group ID
  • Home Directoy (dort werden bei ftp Zugang die Daten hochgeladen)
  • Passwort als Hash
  • Name
Ich habe mich dafür entschieden auch noch die Domains, für die ich Emails annehme, sowie die Aliases in der Datenbank zu führen. Dafür habe ich separate Tabellen definiert. Die Bedeutung der einzelnen Felder wird unter dem Kapitel postfix näher behandelt. Als erstes muss man die Datenbank und die notwendigen user erstellen. Die nun folgenden Schritte müssen von einen Datenbank-Benutzer durchgeführt werden, der superuser Rechte besitzt. Per default ist das der postgres user. Mit diesem Nenutzer loged man sich dann auf der psql Shell ein: psql -U postgres
  1. Erstellen von Rollen für die Benutzer der Datenbank. Es werden als erstes einmal minimale Rechte vergeben. Ich trenne normalerweise immer zwischen einem Benutzer, der nur lesen kann und einem, der auch schreiben darf.
    CREATE ROLE mailagent LOGIN;
    CREATE ROLE mailagent_write LOGIN;
    \password mailagent;
    \password mailagent_write;
    Nach der Eingabe von \password user in der sql Shell erscheint ein Propmt, der es erlaubt, ein Passwort zu setzen.
  2. Erstellen der Datenbank und vergeben der Rechte.
    CREATE DATABASE maildb WITH TEMPLATE = template0 OWNER = owner;
    REVOKE CONNECT ON DATABASE maildb FROM PUBLIC;
    GRANT CONNECT ON DATABASE maildb TO mailagent_write;
    GRANT CONNECT ON DATABASE maildb TO mailagent;
    ALTER DATABASE maildb SET log_statement TO 'none';
    owner muss dabei ein existierender DB Benutzer sein.
  3. Als nächstes werden die notwendigen Tabellen erstellt. Dazu logged man sich als superuser ein, verbindet sich mit der Datenbank und schlüpft danach in die Rolle des owners der Datenbank. Am Schluss muss man noch die Rechte für die Benurzer setzen, welche von den einzelnen Diensten benutzt werden.
    \c maildb;
    SET ROLE owner; CREATE SEQUENCE users_uid_seq
    START WITH 1
    INCREMENT BY 1
    MINVALUE 0
    NO MAXVALUE
    CACHE 1;

    CREATE TABLE users (
    email character varying(80) NOT NULL,
    name character varying(255) NOT NULL,
    quota bigint DEFAULT 100000000 NOT NULL,
    created timestamp without time zone DEFAULT now(),
    modified timestamp without time zone DEFAULT now(),
    active timestamp without time zone DEFAULT now(),
    uid integer DEFAULT nextval('users_uid_seq'::regclass) NOT NULL,
    webroot character varying(128),
    shell character varying(80) DEFAULT '/bin/false'::character varying,
    gid integer DEFAULT 1000 NOT NULL,
    abo_number bigint DEFAULT 0 NOT NULL,
    md5_hash character varying(35) NOT NULL
    );

    CREATE TABLE domains (
    dom_id integer NOT NULL,
    domain character varying(50) NOT NULL,
    transport character(11),
    email character varying(80),
    owner_id bigint
    );

    CREATE TABLE forwardings (
    source character varying(80) NOT NULL,
    destination text NOT NULL
    );

    CREATE TABLE transport (
    domain character varying(128) NOT NULL,
    transport character varying(128) NOT NULL
    );
    GRANT SELECT ON ALL TABLE IN SCHEMA public TO mailagent;
    GRANT USAGE ON ALL SEQUENCES IN SCHEMA public TO mailagent;
    GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO mailagent_write;

Die Bedeutung der einzelnen Felder wird dann in den nächsten Kapiteln genauer erklärt.

Powered by w3.css