如何安全地设置 Postfix 邮件服务器和 Dovecot 与数据库(MariaDB) - 第一部分
在这个由 3 篇文章组成的系列中,我们将讨论如何在CentOS 7中设置具有防病毒和垃圾邮件保护功能的Postfix邮件服务器。请注意,这些说明也适用于其他发行版,例如RHEL / Fedora和Debian / Ubuntu。
我们的计划包括将电子邮件帐户和别名存储在MariaDB数据库中,为方便起见,将通过phpMyAdmin进行管理。
如果您选择不安装phpMyAdmin,或者正在处理仅限 CLI 的服务器,我们还将提供等效代码来创建本系列中将使用的数据库表。
由于保持邮件服务器正常运行是通常分配给系统管理员和工程师的基本任务之一,我们还将提供一些技巧,以便在生产环境中有效地运行这一关键服务。
在 DNS 中为域创建 A 和 MX 记录
在继续进行之前,必须满足一些先决条件:
1.您需要一个通过域名注册商注册的有效域名。在本系列中,我们将使用通过GoDaddywww.linuxnewz.com
注册的。
2.该域名必须指向您的 VPS 或云托管提供商的外部 IP。如果您自行托管邮件服务器,则可以使用FreeDNS提供的服务(需要注册)。
无论如何,您也必须为您的域名设置A
和记录(您可以在 Google 的常见问题解答中了解有关 MX 记录的更多信息)。MX
添加后,您可以使用在线工具(如MxToolbox或ViewDNS)查找它们,以确保它们已正确设置。
重要提示:请注意,DNS记录传播并让您的域名可用可能需要一段时间(1-2天)。在此期间,您可以通过其IP地址访问您的VPS来执行下面指示的任务。
3.配置VPS的FQDN(完全限定域名):
# hostnamectl set-hostname yourhostname
设置系统主机名,然后按如下方式编辑/etc/hosts (将AAA.BBB.CCC.DDD、yourhostname和yourdomain替换为您服务器的公共 IP、您的主机名和您的注册域):
AAA.BBB.CCC.DDD yourhostname.yourdomain.com yourhostname
其中yourhostname是先前使用hostnamectl命令设置的系统主机名。
安装所需软件包
4.要安装所需的软件包(如 Apache、Postfix、Dovecot、MariaDB、PhpMyAdmin、SpamAssassin、ClamAV 等),您需要启用EPEL存储库:
# yum install epel-release
5.完成上述步骤后,安装必要的软件包:
在基于 CentOS 的系统中:
# yum update && yum install httpd httpd-devel postfix dovecot dovecot-mysql spamassassin clamav clamav-scanner clamav-scanner-systemd clamav-data clamav-update mariadb mariadb-server php phpMyAdmin
在 Debian 及其衍生版本中:
# aptitude update && aptitude install apache2 postfix dovecot-core dovecot-imapd dovecot-pop3d dovecot-lmtpd dovecot-mysql spamassassin clamav clamav-daemon clamav-base mariadb-client mariadb-server php5 phpMyAdmin
6.启动并启用Web和数据库服务器:
在基于 CentOS 的系统中:
# systemctl enable httpd mariadb # systemctl start httpd mariadb
在 Debian 及其衍生版本中:
# systemctl enable apache2 mariadb # systemctl start apache2 mariadb
当安装完成并且上述服务启用并运行时,我们将开始设置数据库和表来存储有关 Postfix 邮件帐户的信息。
创建 Postfix 邮件帐户数据库
为简单起见,我们将使用phpMyAdmin (一种通过 Web 界面处理MySQL / MariaDB数据库管理的工具)来创建和管理电子邮件数据库。
但是,为了登录并使用此工具,我们需要遵循以下步骤:
7.启用MariaDB帐户(您可以通过mysql_secure_installation
从命令行运行该实用程序、为用户 root 分配密码并设置该工具建议的默认设置(除了“禁止远程 root 登录? ”)来执行此操作:
或者以其他方式创建一个新的数据库用户:
MariaDB [(none)]> CREATE USER 'dba'@'localhost' IDENTIFIED BY 'YourPasswordHere'; MariaDB [(none)]> GRANT ALL PRIVILEGES ON * . * TO 'dba'@'localhost'; MariaDB [(none)]> FLUSH PRIVILEGES;
使用证书保护 Apache
8.由于我们将使用 Web 应用程序来管理电子邮件服务器数据库,因此我们需要采取必要的预防措施来保护与服务器的连接。否则,我们的phpMyAdmin凭据将以纯文本形式通过网络传输。
要在服务器中设置传输层安全性( TLS ),请按照RHCE 系列第 8 部分中概述的步骤进行操作:使用 Apache 的网络安全服务 (NSS) 通过 TLS 实现 HTTPS,然后再继续操作。
注意:如果您无法访问服务器的控制台,则需要找到另一种方法来在密钥创建期间生成必要的熵。在这种情况下,您可能需要考虑安装rng-tools并运行rngd -r /dev/urandom。
配置并保护 PhpMyAdmin
9.在/etc/httpd/conf.d/phpMyAdmin.conf ( CentOS ) 或/etc/phpmyadmin/apache.conf(Debian及其衍生产品)中,找到以下行的所有出现位置,并确保它们指向服务器的公共 IP:
Require ip AAA.BBB.CCC.DDD Allow from AAA.BBB.CCC.DDD
此外,禁用默认别名并创建一个新别名来访问您的 phpMyAdmin 登录页面。这将有助于保护网站免受机器人和以www.yourdomain.com/phpmyadmin或www.yourdomain.com/phpMyAdmin为目标的外部攻击者的攻击。
#Alias /phpMyAdmin /usr/share/phpMyAdmin #Alias /phpmyadmin /usr/share/phpMyAdmin Alias /managedb /usr/share/phpMyAdmin
另外,在里面添加以下行<IfModule mod_authz_core.c>
:
Require all granted
为域创建 Apache VirtualHost
10.确保您的域名已添加到已启用的站点。创建/etc/httpd/sites-available/linuxnewz.com.conf ( CentOS ) 或/etc/apache2/sites-available/linuxnewz.com ( Debian ),并包含以下内容(确保DocumentRoot、sites-available和sites-enabled目录存在):
<VirtualHost *:80> ServerName www.linuxnewz.com ServerAlias linuxnewz.com DocumentRoot /var/www/linuxnewz.com/public_html ErrorLog /var/www/linuxnewz.com/error.log CustomLog /var/www/linuxnewz.com/requests.log combined Options Indexes FollowSymLinks </VirtualHost>
和符号链接:
在 CentOS 上:
# ln -s /etc/httpd/sites-available/linuxnewz.com.conf /etc/httpd/sites-enabled/linuxnewz.com.conf
在 Debian 上:
# a2ensite linuxnewz.com
您已经完成。
设置 Postfix 电子邮件数据库
11.现在您可以打开您的phpMyAdmin界面https://www.yourdomain.com/managedb
(请注意,managedb是我们之前为 phpMyAdmin 数据目录设置的别名)。
如果这暂时不起作用(这可能是由于传播延迟或缺少 DNS 记录配置造成的),您可以尝试使用服务器的公共 IP 地址而不是www.yourdomain.com:
无论如何,登录 phpMyAdmin 后,您将看到以下界面。单击左侧部分的“新建” :
输入数据库的名称(本例中为EmailServer_db,无需选择排序规则)并单击创建:
12.在下一个屏幕上,为第一个表选择一个名称(我们将在其中存储该邮件服务器将管理的域)。
请注意,即使在本系列中我们只管理一个域,您也可以稍后添加更多域)以及您想要的字段数量,然后单击“开始”。 系统将提示您命名和配置这两个字段,您可以安全地继续,如下图所示:
当您在DomainId的Index下选择PRIMARY时,接受默认值并单击Go:
或者,您可以单击“预览 SQL”来查看底层代码:
CREATE TABLE `EmailServer_db`.`Domains_tbl` ( `DomainId` INT NOT NULL AUTO_INCREMENT , `DomainName` VARCHAR(50) NOT NULL , PRIMARY KEY (`DomainId`)) ENGINE = InnoDB;
准备就绪后,单击“保存”以确认更改。然后,您将能够单击EmailServer_db下的“新建”以继续创建表:
13.现在按照以下步骤创建其余表。单击SQL选项卡并输入每个数据库对象的指示代码。
请注意,在这种情况下,我们选择使用 SQL 查询创建表,因为必须在不同的表之间建立关系:
用户表
CREATE TABLE `Users_tbl` ( `UserId` INT NOT NULL AUTO_INCREMENT, `DomainId` INT NOT NULL, `password` VARCHAR(100) NOT NULL, `Email` VARCHAR(100) NOT NULL, PRIMARY KEY (`UserId`), UNIQUE KEY `Email` (`Email`), FOREIGN KEY (DomainId) REFERENCES Domains_tbl(DomainId) ON DELETE CASCADE ) ENGINE = InnoDB;
您应该会收到一条确认消息(如果没有,phpMyAdmin 将提示语法错误):
别名_tbl
CREATE TABLE `Alias_tbl` ( `AliasId` INT NOT NULL AUTO_INCREMENT, `DomainId` INT NOT NULL, `Source` varchar(100) NOT NULL, `Destination` varchar(100) NOT NULL, PRIMARY KEY (`AliasId`), FOREIGN KEY (DomainId) REFERENCES Domains_tbl(DomainId) ON DELETE CASCADE ) ENGINE = InnoDB;
(单击底部的“Go”继续创建表)。
到目前为止,您应该具有以下数据库结构:
这意味着您已准备好在下一部分开始添加一些记录。
创建 Postfix 域、用户和别名
14.现在我们将以下记录插入到三个表中。example @linuxnewz.com和linuxsay@linuxnewz.com的密码将被加密,并且INSERT INTO Users_tbl语句。
另请注意,发送至info@linuxnewz.com的电子邮件将被重定向至example@linuxnewz.com:
INSERT INTO Domains_tbl (DomainName) VALUES ('linuxnewz.com'); INSERT INTO Users_tbl (DomainId, password, Email) VALUES (1, ENCRYPT('PasswordForFirstEmailAccount', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'example@linuxnewz.com'); INSERT INTO Users_tbl (DomainId, password, Email) VALUES (1, ENCRYPT('PasswordForSecondEmailAccount', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'linuxsay@linuxnewz.com'); INSERT INTO Alias_tbl (DomainId, Source, Destination) VALUES (1, 'info@linuxnewz.com', 'example@linuxnewz.com');
添加了我们的域名、两个用户帐户和一个电子邮件别名后,我们准备在本系列的下一篇文章中继续设置我们的电子邮件服务器,我们将在其中配置Dovecot和Postfix。
概括
在本文中,我们列出了在 CentOS 7 VPS 中安装 Postfix 电子邮件服务器所需的软件包,并解释了如何使用 phpMyAdmin 管理底层数据库。
在接下来的两篇文章中,我们将回顾负责我们域的电子邮件分发的两个程序的配置(第 2 部分),并向您展示如何为您的服务器添加针对垃圾邮件和病毒的保护(第 3 部分)。
在此之前,如果您有任何问题或意见,请随时通过下面的表格与我们联系。