Много е мъчно да се определи от къде да започнем изграждането на пощенски сървър и не защото е супер сложно а защото е един омагьосан кръг. Примерно: В случая се видя че за бази данни ще се ползва MySQL. Казваме MySQL но ще имаме в предвид MariaDB. Структурата на базата и таблиците се определя от конфигурационни файлове в Postfix и Dovecot. Получава се като яйцето и кокошката - кое е първото. За да излезем от това затруднение, приемаме структурата на таблиците и базата за даденост и стъпили върху това започваме изграждането на самия сървър.
В по предни статии се видя как се инсталира MySQL, но ако той не съществува се инсталира пакета mariadb-server. Postfix черпи данни от MySQL база за виртуалните домейни, виртуалните потребители и виртуалните псевдоними (aliases) Първата задача е да създадем база данни наречена pfdb , с принадлежащи таблици virtual_domains, virtual_users и virtual_aliases.
За начало влизаме в MySQL като главен потребител root
# mysql -u root -p Enter password: MySQL
Сега създаваме и самата база
MariaDB [(none)]> CREATE DATABASE pfdb; Query OK, 1 row affected (0.00 sec)
Сега създаваме потребител който да има права само върху базата pfdb. Потребителя ще се казва pfuser с парола pfpass
MariaDB [(none)]>CREATE USER 'pfuser'@'127.0.0.1' IDENTIFIED BY 'pfpass'; Query OK, 0 rows affected (0.00 sec)
ВАЖНО!!! Потребителя е pfuser@127.0.0.1 а не pfuser@localhost. За Debian това на практика е едно и също, но за MySQL не е. Разликата се заключава в това, че ако се иницира връзка за базата данни към localhost то тогава се говори със сокет файла намиращ се в /var/run/mysqld/mysqld.sock. Ако пък се свръжем през 127.0.0.1, то ще се създаде мрежова връзка ползваща TCP сокета на порт 3306. За какво правим всичко това: - PostFix е ограничен до началната си директория /var/spool/postfix, а сокета mysqld.sock не се намира в тази директория. За да се направи връзка между PostFix и MySQL се ползва TCP връзка. Много ясно ще си проличи когато създаваме таблиците и направим тестове. Потребителя pfuser ще може само да чете от pfdb.
MariaDB [(none)]>GRANT SELECt ON pfdb.* TO 'pfuser'@'127.0.0.1'; Query OK, 0 rows affected (0.00 sec)
Сега да създадем потребител който да управлява pfdb. Този потребител ще се ползва от PHPMyAdmin и тъй като той се свързва по-подразбиране през localhost то и връзката ще е през там.
MariaDB [(none)]>CREATE USER 'pfadmin'@'localhost' IDENTIFIED BY 'adminpass'; Query OK, 0 rows affected (0.00 sec)
pfadmin трябва да може и да чете и да пише в pfdb
MariaDB [(none)]>GRANT ALL ON pfdb.* TO 'pfadmin'@'localhost'; Query OK, 0 rows affected (0.00 sec)
Значението pfdb.* означава, че потребителя pfuser има права не само върху базата pfdb но и върху всичките нейни таблици. Активирамe промените (напрактика зачиствамe кеша на MySQL)
MariaDB [(none)]> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.00 sec)
До сега всички тези команди влияеха върху базата mysql. Ще се наложи да сменим базата mysql с pfdb за да може в нея да изградим таблици
MariaDB [(none)]> USE pfdb; Database changed
Първата таблица ще е на виртуалните домейни. Всеки домейн заема един ред.
Field | Предназначение |
---|---|
id | Номер показващ кой ред е. Добавя се автоматично в базата |
name | Име на домейна приемащ пощата за.. |
MariaDB [(none)]>CREATE TABLE IF NOT EXISTS `virtual_domains` ( `id` int(11) NOT NULL auto_increment, `name` varchar(50) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; Query OK, 0 rows affected (0.01 sec)
Създаваме таблица на виртуалните пощенските адреси и пароли (virtual_users) в базата pfdb. Всяка поща заема един ред.
Field | Предназначение |
---|---|
id | Номер показващ кой ред е. Добавя се автоматично в базата |
domain_id | Съдържа номера на домейна в таблицата virtual_domains, а delete cascade осигурява сигурност, че ако се изтрие домейна всички потребители в домейна също ще бъдат изтрити за да се избегнат осиротели редове |
пощенския адрес на пощенския потребител | |
password | Защитена парола за пощенския потребител. Най-често защитата е с {SHA256-CRYPT} , но може да се ползва и стара защита {PLAIN-MD5} |
MariaDB [(none)]>CREATE TABLE IF NOT EXISTS `virtual_users` ( `id` int(11) NOT NULL auto_increment, `domain_id` int(11) NOT NULL, `email` varchar(100) NOT NULL, `password` varchar(150) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `email` (`email`), FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; Query OK, 0 rows affected (0.01 sec)
Създаваме таблица на виртуалните псевдоними (virtual_aliases) в базата pfdb. Всеки пощенски псевдоним използва един ред
Field | Предназначение |
---|---|
id | Номер показващ кой ред е. Добавя се автоматично в базата |
domain_id | Съдържа номера на домейна в таблицата virtual_domains, а delete cascade осигурява сигурност, че ако се изтрие домейна всички потребители в домейна също ще бъдат изтрити за да се избегнат осиротели редове |
source | Пощенски адрес от който ще се препраща писмото |
destination | Пощенски адрес получен от source |
MariaDB [(none)]>CREATE TABLE IF NOT EXISTS `virtual_aliases` ( `id` int(11) NOT NULL auto_increment, `domain_id` int(11) NOT NULL, `source` varchar(100) NOT NULL, `destination` varchar(100) NOT NULL, PRIMARY KEY (`id`), FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; Query OK, 0 rows affected (0.01 sec)
Помните ли преди казахме, че pfuser@127.0.0.1 и pfuser@localhost не са едно и също. Излизаме от MySQL като root и влизаме като pfuser
MariaDB [pfdb]> quit Bye # mysql -u pfuser -p Enter password: ERROR 1045 (28000): Access denied for user 'pfuser'@'localhost' (using password: YES)
Какво значи това: Нарочно написахме именно така командата за да се види че в момента се мъчим да влезем като pfuser@localhost, а ние създадохме потребител pfuser@127.0.0.1. Затова сега ще влезем по правилния начин
# mysql -u pfuser -h 127.0.0.1 -p Enter password: pfpass
Преди да запълним с данни таблиците, проверяваме дали може да ги четем:
MariaDB [(none)]> show databases; +---------------------------+ | Database | +---------------------------+ | information_schema | | pfdb | +---------------------------+ 2 rows in set (0.00 sec)
Виждат се само тези две бази, както трябва да бъде, защото само върху тях има позволени права.
MariaDB [(none)]> use pfdb; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed
Избрахме да работим с базата pfdb
MariaDB [(none)]> show tables; +---------------------+ | Tables_in_pfdb | +---------------------+ | virtual_aliases | | virtual_domains | | virtual_users | +---------------------+ 3 rows in set (0.00 sec)
Това беше важно уточнение. Обаче потребителя който ще пише по таблиците е pfadmin и именно с него трябва да боравим. За целта излизаме от този потребител.
MariaDB [pfdb]> quit Bye
Влизаме като pfadmin
# mysql -u pfadmin -p Enter password: adminpass
Да достигнем до таблиците и да ги попълним, хем за проба дали потребителя има права върху базата, хем да има данни с които после ще боравим в пощенския сървър.
Създаваме два виртуални домейна в таблицата virtual_domains
MariaDB [(none)]> INSERT INTO `pfdb`.`virtual_domains` (`id` ,`name`) VALUES ('1', 'home.tachko.com'), ('2', 'home.tlan.net'); Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0
И веднага проверяваме съдържанието на таблицата
MariaDB [(none)]> select * from virtual_domains; ERROR 1046 (3D000): No database selected
Това е така защото не сме избрали база с която да боравим затова:
MariaDB [(none)]> use pfdb; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed
MariaDB [(none)]> select * from virtual_domains; +---+------------------------+ | id | name | +---+------------------------+ | 1 | home.tachko.com | | 2 | home.tlan.net | +---+------------------------+ 2 rows in set (0.00 sec)
Прекрасно създали сме два записа в таблицата и по важното е, че pfadmin може да пише по базата. Значи всичко до тук е правилно. Попълваме данни в таблицата virtual_users
MariaDB [pfdb]> INSERT INTO `pfdb`.`virtual_users` (`id`, `domain_id`, `password` , `email`) VALUES ('1', '1', ENCRYPT('Iceman', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'tachko@home.tlan.net'), ('2', '1', ENCRYPT('tit', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'tit@home.tlan.net'); Query OK, 2 rows affected (0.01 sec) Records: 2 Duplicates: 0 Warnings: 0
И веднага проверяваме съдържанието на таблицата
MariaDB [pfdb]> select * from virtual_users; +----+-----------+--------------------------------+------------------------------------------------------------------------------------------------------------+ | id | domain_id | email | password | +----+-----------+--------------------------------+------------------------------------------------------------------------------------------------------------+ | 1 | 1 | tachko@home.tlan.net | $6$0406f8c432058043$Crb9Ytq3KH5FoIBPh6r8RkG9vZA9DoWWaP8H4yRxW | | 2 | 1 | tit@home.tlan.net | $6$c6627f4ee53d7128$0wLXz8SUWP8uK8aUIcRdvpd/ox0BSufaXpcq6Wuc0R | +----+-----------+--------------------------------+------------------------------------------------------------------------------------------------------------+ 2 rows in set (0.00 sec)
Потребителя pfadmin има права и върху тази таблица и създаде две пощенски кутии tachko@home.tlan.net и tit@home.tlan.net И накрая попълваме таблицата virtual_aliases
MariaDB [pfdb]> INSERT INTO `pfdb`.`virtual_aliases` (`id`, `domain_id`, `source`, `destination`) VALUES ('1', '1', 'tit@home.tlan.net', 'tachko@home.tlan.net'); Query OK, 1 row affected (0.00 sec)
С този запис идеята е всички писма които идват до tit@tlan.net да се препращат и до tachko@tlan.net. Много удобна функция за големи предприятия. Примерно директора да може да вижда писмата които идват до подчините. Това е и добре и зле, защото генерира много поща за получателя а не всяка поща която пристига е важна, понякога има и спам. Проверяваме съдържанието на таблицата
MariaDB [(none)]> select * from virtual_aliases; +---+--------------+------------------------+-------------------------------+ | id | domain_id | source | destination | +---+--------------+------------------------+-------------------------------+ | 1 | 1 | tit@home.tlan.net | tachko@home.tlan.net | +---+--------------+------------------------+-------------------------------+ 1 row in set (0.00 sec)
Изход от MySQL
MariaDB [pfdb]> quit Bye
Ако по някаква причина сте объркали данните в някоя таблица спокойно може да се коригират със следните команди
MariaDB [(none)]> REPLACE INTO `pfdb`.`virtual_domains` ( `id` , `name` ) VALUES ( '2', 'home.tlan.net' );
Тази команда ще замени 2 ред в таблицата virtual_domains която е собственост на pfdb със съдържанието home.tlan.net. На практика нищо няма да се промени именно защото когато попълвахме таблицата първи ред беше със съдържание home.tlan.net. Но ако беше нещо различно щеше да го препокрие именно с home.tlan.net
MariaDB [(none)]> REPLACE INTO `pfdb`.`virtual_users` ( `id` , `domain_id` , `password` , `email` ) VALUES ('1', '1', 'johnpass' , 'john@home.tlan.net');
Отново препокриваме първи ред в таблицата virtual_users собственост на pfdb със потребителя john@home.tlan.net и с парола johnpass. Това са примерни команди на практика няма да се изпълняват.
MariaDB [(none)]> REPLACE INTO `pfdb`.`virtual_aliases` (`id`,`domain_id`,`source`,`destination`) VALUES ('1', '1', 'jack@home.tlan.net', 'john@home.tlan.net');
ВНИМАНИЕ !!!
Преди да пуснете в реална експлоатация забършете сегашните данни които създадохте за теста. Или най просто е да се забърши домейна home.tlan.net Това автоматично ще доведе до зануляване на потребителите с пощенските им кутии.
Зачистването може да стане със следната команда
MariaDB [(none)]> DELETE FROM `pfdb`.`virtual_domains` where name='home.tlan.net';
Всичко това може да се види нагледно и през PHPMyAdmin. Но е добре да се борави с MySQL от конзола, не на всеки сървър има инсталиран PHPMyAdmin и ако ви се наложи да работите на чужд сървър какво ще правите.
Доста се позабавих, но беше особено важно да се разбере идеологията на работа. Базата е създадена и има данни. Сега трябва да се укаже на Postfix да ги ползва. На практика сме готови с базата, таблиците и съдържанието им. Сега остава да се инсталират пакетите за Mail сървъра и да се конфигурират, но това в следващите статии.