Mein perfektes Serversetup – Teil 2

Im ersten Teil habe ich alle nötigen Pakete installiert, sowie meine Grundkonfiguration des NGINX Servers gezeigt. In diesem zweiten Teil gehe ich auf meine Art und Weise ein, MariaDB und die Mailserver Datenbank vorzubereiten.

MariaDB vorbereiten

Nach der Installation starte ich die «secure installation» um MariaDB vorzubereiten:

mariadb-secure-installation

Mittels root Benutzer kann man jetzt nur noch direkt vom Server her auf die Datenbanken zugreifen.

Optional: Um einen «externen» Superuser zu haben, erstellen wir uns einen zusätzlich. Wir erstellen uns hierfür wieder ein neues Passwort mit pwgen und richten den User auf der Konsole ein:

mysql -uroot

Nun erstellen wir einen Benutzer welcher über den Unix Socket localhost wie auch über TCP 127.0.0.1 auf die Datenbank zugreifen kann. Diese beiden Zugriffsmöglichkeiten erstellen wir deshalb, weil Dienste wie z.B. Postfix in einer chroot Umgebung laufen und deshalb nicht auf die Unixsockets zugreifen können.

CREATE USER 'superuser'@'localhost' IDENTIFIED BY '...';
CREATE USER 'superuser'@'127.0.0.1' IDENTIFIED BY '...';

GRANT ALL PRIVILEGES ON *.* TO 'superuser'@'localhost' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON *.* TO 'superuser'@'127.0.0.1' WITH GRANT OPTION;

FLUSH PRIVILEGES;

Mailserver Datenbank

Wir erstellen uns wieder mit pwgen zwei neue Passwörter für den Mailserver – ich erstelle einen Read/Write Benutzer, der nur über Unixsockets zugreifen kann und einen zweiten ReadOnly Benutzer, der über TCP zugreifen kann. Der Grund hierbei ist wieder der gleiche, Postfix läuft in einer abgeschotteten Umgebung unter /var/spool/postfix und hat keinen direkten Zugriff auf /var/run/mysqld/mysqld.sock. Und da Postfix in Zukunft sowieso nur Daten lesen muss, reicht ihm ein ReadOnly Zugang. Mühsam, aber effizient. 🙂

Wieder auf die mysql Konsole und Datenbank plus Benutzer erstellen:

CREATE DATABASE mailserver;

CREATE USER 'mailserver_rw'@'localhost' IDENTIFIED BY '...';
CREATE USER 'mailserver_ro'@'127.0.0.1' IDENTIFIED BY '...';

GRANT ALL PRIVILEGES ON mailserver.* TO 'mailserver_rw'@'localhost';
GRANT SELECT ON mailserver.* to 'mailserver_ro'@'127.0.0.1';

Datenbank Tabellen erstellen

domains

Diese Tabelle beinhaltet alle vom Mailserver gehosteten Domains – nur mit diesen Domains können neue Accounts erstellt werden.

SpalteBeschreibung
idEineindeutige Nummerierung des Datenbankeintrags. Wird automatisch hochgezählt.
nameDomainname, welcher verwendet werden soll. Im Format domain.tld
CREATE TABLE `domains` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4;

accounts

Alle Mailboxen und deren Zugangsinformationen werden in diesen Tabelle hinterlegt. Zusätzlich kann hier festgelegt werden, ob es sich um eine «send-only» Mailbox handelt und ob diese aktiv oder inaktiv ist.

SpalteBeschreibung
idEineindeutige Nummerierung des Datenbankeintrags. Wird automatisch hochgezählt.
usernameDer Teil der E-Mailadresse vor dem @, z.b. amara.toledo
domainDie Domain für welche der Account erstellt werden soll, z.B. chileo.ovh
passwordDas gehashte Passwort für diesen Account. Ich nutze hier den {BLF-CRYPT} Algorhythmus, welcher u.a. Dovecot beherscht und erstellen kann. Ich ziehe Hashed ganz klar vor und werde nie irgendwelche Cleartext Passwörter in der Datenbank speichern.
quotaDas Quoata in MB für die Mailbox – als Standard wird 250 eingetragen, falls das Feld nicht ausgeüllt wird.
enabledDefiniert ob die Mailbox aktiv (1) oder inaktiv (0) ist – als Standard ist die Mailbox immer aktiv.
sendonlyDefiniert ob es sich um einen send-only User handelt (1) oder nicht (0) – send-only User können keine E-Mails empfangen – als Standard ist die Mailbox immer aktiv.
CREATE TABLE `accounts` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(64) NOT NULL,
  `domain` varchar(50) NOT NULL,
  `password` varchar(150) NOT NULL,
  `quota` int(11) DEFAULT 250,
  `enabled` tinyint(1) DEFAULT 1,
  `sendonly` tinyint(1) DEFAULT 0,
  PRIMARY KEY (`id`),
  UNIQUE KEY `username` (`username`,`domain`),
  KEY `domain` (`domain`),
  CONSTRAINT `accounts_ibfk_1` FOREIGN KEY (`domain`) REFERENCES `domains` (`name`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4;

aliases

Mit dieser Tabelle lassen sich ein oder mehrere Aliases für bestehende E-Mailadressen erstellen.

SpalteBeschreibung
idEineindeutige Nummerierung des Datenbankeintrags. Wird automatisch hochgezählt.
source_usernameDer Teil der E-Mailadresse vor dem @, z.b. at
source_domainDie Domain für welche der Alias erstellt werden soll. Hier sind nur Domains erlaubt, welche auch in der domains Tabelle enthalten sind.
destinationDie E-Mailadresse welche das Ziel des Aliases sein soll, z.B. amara.toledo@chileo.ovh
enabled Definiert ob der Alias aktiv (1) oder inaktiv (0) ist – als Standard ist der Alias immer aktiv.
CREATE TABLE `aliases` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `source_username` varchar(100) NOT NULL,
  `source_domain` varchar(50) NOT NULL,
  `destination` varchar(150) NOT NULL,
  `enabled` tinyint(1) NOT NULL DEFAULT 1,
  PRIMARY KEY (`id`),
  UNIQUE KEY `source_username` (`source_username`,`source_domain`,`destination`),
  KEY `source_domain` (`source_domain`),
  CONSTRAINT `aliases_ibfk_1` FOREIGN KEY (`source_domain`) REFERENCES `domains` (`name`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=35 DEFAULT CHARSET=utf8mb4;

Damit wäre die Datenbank für unseren Mailserver soweit vorbereitet, dass wir Postfix beibringen können, dort nach Informationen zu suchen.

Schreiben Sie einen Kommentar

Ihre E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.