安装基本服务
本文档将指导你设置核心服务。它基于安装在虚拟服务器上的 AlmaLinux 9。服务器主机有防火墙,这使得 firewalld 成为多余,因此他们在安装时禁用了它。主机还禁用了 SELinux,因为它会导致问题。不过,我更喜欢同时使用这两个功能,所以这些说明重新启用了它们。
完成此设置后,您将拥有一个完全最新的系统:
- 安装的 EPEL 软件源
- 已安装 SELinux 并在许可模式下运行(不会破坏任何东西)。
- 安装了 firewalld,并只允许使用指定的端口。
- Letsencrypt 提供自动更新的有效 SSL 证书。
- 驾驶舱已安装,并持有有效证书。
- 安装了 Postix 和 dovecot 以提供电子邮件。
- 已安装 Miriadb 数据库并确保其安全。
- 已安装并配置 Apache。
- WordPress 安装在一台虚拟主机上。
- WordPress 基本加固到位
安装 EPEL 软件库并更新当前软件包
EPEL repo 添加了以后需要的其他软件包。-添加 Remi 和最新的 PHP
sudo dnf install epel-release -y
sudo dnf update -y
安装核心服务
SELinux
默认安装通常会启用 SELinux。然而,主机的安装却没有这样做。要启用 SELinux(许可模式),首先要检查 grub 中是否禁止 SELinux:
cat /proc/cmdline
查找 selinux=0 或 security=none。如果存在这两种情况,则无论 /etc/selinux/config 如何设置,SELinux 都将被禁用。如果是这种情况
sudo grubby --update-kernel=ALL --remove-args=selinux
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
sudo dnf install selinux-policy-targeted
确保 /etc/selinux/config 具有:
SELINUX=permissive
SELINUXTYPE=targeted
然后重新启动。
现在重启
系统恢复后,请检查
强制
它应该返回 允许.
设置 SELinux 类型、权限等。
Cockpit 会提醒注意任何 SELinux 问题并提出解决方案。在实施之前,应对这些建议进行审查。不过,以下建议应能解决许多问题:
sudo setsebool -P httpd_unified 1
sudo setsebool -P httpd_can_network_connect 1
sudo setsebool -P httpd_can_network_relay 1
sudo setsebool -P httpd_graceful_shutdown 1
sudo setsebool -P nis_enabled 1
安装驾驶舱(管理网络服务器)。
sudo dnf install cockpit -y
sudo systemctl enable --now cockpit.socket
启用防火墙(如果尚未启用),并允许访问驾驶舱。
sudo systemctl enable --now firewalld
sudo firewall-cmd --permanent --zone=public --add-service=cockpit
sudo firewall-cmd --reload
安装 postfix(邮件服务器)、mariadb(mysql 数据库)、apache(网络服务器)、php 和核心模块以及 certbot
sudo dnf install postfix mariadb-server mariadb httpd php php-mysqlnd php-fpm php-cli -y
sudo dnf install php-common php-opcache php-mbstring php-gd php-xml php-intl php-soap -y
sudo dnf install php-zip php-pear php-devel ImageMagick ImageMagick-devel s-nail -y
sudo dnf certbot python3-certbot-apache cyrus-sasl cyrus-sasl-plain -y
启用并启动服务
sudo systemctl enable --now httpd mariadb php-fpm certbot-renew.timer
安全的 mysql
sudo mysql_secure_installation
按照提示操作
- 设置 root 用户密码
- 使用插座
- 删除匿名用户
- 禁止 root 远程登录
- 删除测试数据库
- 重载权限表
设置 Postfix
我们需要 rspamd 进行邮件签名和邮件验证,但标准软件仓库中没有。因此,我们可以添加官方回应软件仓库。
sudo tee /etc/yum.repos.d/rspamd.repo > /dev/null <<'EOF'
[rspamd]
name=Rspamd for Centos 9 x86_64
baseurl=https://rspamd.com/rpm/centos-9/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://rspamd.com/rpm/gpg.key
EOF
清除并刷新 dnf 元数据,安装并启用 rspamd 和 dovecot
sudo dnf clean all
sudo dnf makecache
sudo dnf install rspamd dovecot -y
sudo systemctl enable --now postfix dovecot rspamd
创建 Postfix 基本配置
保存安装文件以供参考
sudo mv /etc/postfix/main.cf{,.inst}
创建一个新的 /etc/postfix/main.cf 文件,其中包含
# ===========================
# Postfix 基本配置
# ===========================
# 确保现代 Postfix 行为
compatibility_level = 2
# 路径(AlmaLinux 上的默认路径,为清晰起见或打包而保留)
queue_directory = /var/spool/postfix
command_directory = /usr/sbin
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix
sendmail_path = /usr/sbin/sendmail.postfix
newaliases_path = /usr/bin/newaliases.postfix
mailq_path = /usr/bin/mailq.postfix
# 可选文档路径
html_directory = 无
manpage_directory = /usr/share/man
sample_directory = /usr/share/doc/postfix/samples
readme_directory = /usr/share/doc/postfix/README_FILES
meta_directory = /etc/postfix
shlib_directory = /usr/lib64/postfix
# 安全相关设置
setgid_group = postdrop
mail_owner = postfix
# ===========================
# 主机和域设置
# ===========================
# 全称主机名
myhostname = alma.adpca.org
# 本地域名
mydomain = adpca.org
# 确定外发本地邮件中使用的域名
# "user@alma.adpca.org "使用 $myhostname,"user@adpca.org "使用 $mydomain
myorigin = $myhostname
# 域被视为本地域 - 发往这些域的邮件将在本地投递
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
# 接受所有接口上的连接并使用 IPv4 + IPv6
inet_interfaces = 所有
inet_protocols = all
# 仅信任本地机器转发邮件
mynetworks = 127.0.0.0/8
# 以硬错误拒绝未知用户的邮件
unknown_local_recipient_reject_code = 550
# ===========================
# 别名映射
# ===========================
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
# 修改 /etc/aliases 后运行 `newaliases
# ===========================
# MailerSend 中继设置
# ===========================
# 外部 SMTP 中继 (MailerSend)
relayhost = [smtp.mailersend.net]:587
# 为出站连接启用 TLS
smtp_use_tls = yes
smtp_tls_security_level = 加密
smtp_tls_note_starttls_offer = yes
# 可信 CA 证书(全系统)
smtp_tls_CAfile = /etc/ssl/certs/ca-bundle.crt
smtp_tls_CApath = /etc/pki/tls/certs
# 要求使用现代加密技术
smtp_tls_mandatory_protocols = !SSLv2, !SSLv3
smtp_tls_mandatory_ciphers = medium
# 性能:缓存 TLS 会话
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
# ===========================
# 用于 MailerSend 的 SMTP AUTH
# ===========================
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_sasl_tls_security_options = noanonymous
# ===========================
# 入站 TLS(可选)
# 仅在通过 TLS 接受入站邮件时需要
# ===========================
smtpd_tls_cert_file = /etc/pki/tls/certs/postfix.pem
smtpd_tls_key_file = /etc/pki/tls/private/postfix.key
smtpd_tls_security_level = may # 如果支持,则允许 STARTTLS
# ===========================
# 调试(可选)
# 用于 SMTP 调试会话
# ===========================
#debug_peer_level = 2
#debugger_command =
# PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
# ddd $daemon_directory/$process_name $process_id & sleep 5
配置 Dovecot(邮件发送和 IMAP/POP3)
编辑 /etc/dovecot/conf.d/10
mail_location = maildir:~/Maildir
#I 如果使用虚拟邮件用户,则应改为
#mail_location = maildir:/var/mail/vhosts/%d/%n/Maildir
# 为提高性能和清晰度,可选项
mail_privileged_group = mail
编辑/etc/dovecot/conf.d/10-auth.conf,使其包含该文件:
disable_plaintext_auth = 是
auth_mechanisms = 普通登录
包含 auth-system.conf.ext
为每个用户创建一个邮件目录:
mkdir -p /home/username/Maildir
chown -R username:username /home/username/Maildir
启用协议
编辑 /etc/dovecot/conf.d/10-master.conf 以包含
#E 启用 IMAP 和授权套接字,以便 Postfix 在需要时使用:
服务 imap-login {
inet_listener imap {
端口 = 143
}
inet_listener imaps {
端口 = 993
ssl = yes
}
}
服务 auth {
unix_listener /var/spool/postfix/private/auth {
模式 = 0666
user = postfix
组 = postfix
}
}
# auth socket 允许 Postfix 使用 Dovecot 进行身份验证,如果你以这种方式配置 SASL
# 验证。如果直接通过 sasl_passwd 进行 SMTP 验证,则可选。
服务 lmtp {
unix_listener /var/spool/postfix/private/dovecot-lmtp {
模式 = 0600
user = postfix
group = postfix
}
}
打开端口
sudo firewall-cmd --ad-port=110/tcp --permanent
sudo firewall-cmd --ad-port=143/tcp --permanent
sudo firewall-cmd --ad-port=993/tcp --permanent
sudo firewall-cmd --ad-port=995/tcp --permanent
您可能还需要在主机中打开它们。
添加证书
ssl = 必需
ssl_cert = </etc/letsencrypt/live/alma.adpca.org/fullchain.pem
ssl_key = </etc/letsencrypt/live/alma.adpca.org/privkey.pem
ssl_cipher_list = PROFILE=SYSTEM
ssl_min_protocol = TLSv1.2
ssl_prefer_server_ciphers = yes
为 certbot 自动更新添加钩子,以设置所需权限
创建一个可以访问证书的组,并将 dovecot 添加到该组。设置初始权限。
sudo groupadd ssl-cert
sudo usermod -aG ssl-cert dovecot
chmod 750 /etc/letsencrypt/ /etc/letsencrypt/live/ /etc/letsencrypt/archive/
chgrp ssl-cert /etc/letsencrypt/ /etc/letsencrypt/live/ /etc/letsencrypt/archive
在 /usr/local/sbin/fix-cert-permissions.s 中添加以下一行
deploy-hook = /usr/local/sbin/fix-cert-permissions.sh
然后创建脚本 /usr/local/sbin/fix-cert-permissions.sh
#!/bin/bash
# 变量
DOMAIN="alma.adpca.org"
SSL_GROUP="ssl-cert"
# 路径
# LIVE_DIR="/etc/letsencrypt/live/$DOMAIN"
# ARCHIVE_DIR="/etc/letsencrypt/archive/$DOMAIN"
COCKPIT_DIR=/etc/cockpit/ws-certs.d
LIVE_DIR="/etc/letsencrypt/live"
ARCHIVE_DIR="/etc/letsencrypt/archive"
# 修复 live 目录及其内容的权限
chgrp -R "$SSL_GROUP" "$LIVE_DIR"
chmod -R 640 "$LIVE_DIR"/*/*.pem
find "$LIVE_DIR" -type d -exec chmod 750 {}\;
# 修复存档目录及其内容的权限
chgrp -R "$SSL_GROUP" "$ARCHIVE_DIR"
chmod -R 640 "$ARCHIVE_DIR"/*/*.pem
find "$ARCHIVE_DIR" -type d -exec chmod 750 {}\;
# 重构驾驶舱证书
sudo cp $LIVE_DIR/$DOMAIN/fullchain.pem $COCKPIT_DIR/99-letsencrypt.cert
sudo cp $LIVE_DIR/$DOMAIN/privkey.pem $COCKPIT_DIR/99-letsencrypt.key
chmod 600 $COCKPIT_DIR/99-letsencrypt.cert
# 重启 Cockpit 以获取新证书
systemctl restart cockpit
echo 证书权限已修复,Cockpit 证书已创建。
该脚本还可创建驾驶舱证书。运行脚本设置所需的权限并创建驾驶舱密钥。
告诉 Postfix 使用 Dovecot LMTP
在 /etc/postfix/main.cf 中添加以下内容:
virtual_transport = lmtp:unix:private/dovecot-lmtp
生成 DKIM 密钥并发布 DNS 记录
生成和保护密钥
sudo mkdir -p /etc/rspamd/dkim/adpca.org
sudo rspamadm dkim_keygen -b 2048 -s default -d adpca.org -k \
/etc/rspamd/dkim/adpca.org/default.key
sudo chown -R _rspamd:_rspamd /etc/rspamd/dkim/adpca.org
sudo chmod 600 /etc/rspamd/dkim/adpca.org/default.key
输出结果如下
default._domainkey IN TXT ( "v=DKIM1; k=rsa; "
"p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtLlz8vwzSFZonIyLQDBiXynxUyDNuyt6eBAcNNb5Fyh9wEKCCy6W9Bs633Y6kFwWKVHCz+0l7pS0Tt2tU0Hxxh0XZjEtQAOJCCSkMmByCDAYYubAicQR+QKZEGh2H1dldHmj0i3xHwrUZ4yDB9YZ74uj5PgYAYwerPmrwkwd82wowzY/QMHpVOgPkQpe6IIqxs3ohZEuWhDXZniM2"
"sw0Kzewd6K+7U3jY5m19Qm/dlDlu1xwYknI277mxdNlHvpGEWiJIziOgQ9Eue5wSeKhmmCdsNj5LoYG2dRXa9pcrHH08JjLnFN+j1DVjbgUs7IWEvx3QXOg3LZI5/ko7jt+wIDAQAB"
) ;
公钥是 TXT 记录中 p= 参数的值 这里,公钥(粗体显示)是 p= 之后、括号之前的整个大 base64 字符串。它的格式应该是一行,没有换行符,就像这样:
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtLlz8vwzSFZonIyLQDBiXynxUyDNuyt6eBAcNNb5Fyh9wEKCCy6W9Bs633Y6kFwWKVHCz+0l7pS0Tt2tU0Hxxh0XZjEtQAOJCCSkMmByCDAYYubAicQR+QKZEGh2H1dldHmj0i3xHwrUZ4yDB9YZ74uj5PgYAYwerPmrwkwd82wowzY/QMHpVOgPkQpe6IIqxs3ohZEuWhDXZniM2sw0Kzewd6K+7U3jY5m19Qm/dlDlu1xwYknI277mxdNlHvwpGEWiJIziOgQ9Eue5wSeKhmmCdsNj5LoYG2dRXa9pcrHH08JjLnFN+j1DVjbgUs7IWEvx3QXOg3LZI5/ko7jt+wIDAQAB
向 DNS 服务器添加 TXT 记录。记录名称应为 :default._domainkey.adpca.org: ,值为
"v=DKIM1; k=rsa; p=public_key_here“.
在这种情况下,数值将是
v=DKIM1; k=rsa;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtLlz8vwzSFZonIyLQDBiXynxUyDNuyt6eBAcNNb5Fyh9wEKCCy6W9Bs633Y6kFwWKVHCz+0l7pS0Tt2tU0Hxxh0XZjEtQAOJCCSkMmByCDAYYubAicQR+QKZEGh2H1dldHmj0i3xHwrUZ4yDB9YZ74uj5PgYAYwerPmrwkwd82wowzY/QMHpVOgPkQpe6IIqxs3ohZEuWhDXZniM2sw0Kzewd6K+7U3jY5m19Qm/dlDlu1xwYknI277mxdNlHvwpGEWiJIziOgQ9Eue5wSeKhmmCdsNj5LoYG2dRXa9pcrHH08JjLnFN+j1DVjbgUs7IWEvx3QXOg3LZI5/ko7jt+wIDAQAB
重要:添加记录时,确保值是一个连续的字符串,没有换行符。
为 adpca.org 和子域创建 DNS 记录
| 类型 | 名称 | 价值/内容 | 说明 |
| A | mail.adpca.org | 您的邮件服务器 IP | 邮件服务主机 |
| MX | adpca.org | mail.adpca.org(优先级 10) | 接收域名邮件 |
| MX | *.adpca.org | mail.adpca.org(优先级 10) | 接收子域的邮件 |
| TXT | adpca.org | "v=spf1 mx ip4:\ -all" | SPF 记录 |
| TXT | default._domainkey.adpca.org | DKIM 公钥如上 | 用于 DKIM 验证 |
| TXT | _dmarc.adpca.org | "v=DMARC1; p=quarantine; rua=mailto\:postmaster\@adpca.org" | DMARC 政策 |
最后步骤
重新启动服务
sudo systemctl restart postfix dovecot rspamd
测试邮件收发。
检查邮件日志是否有错误:
sudo journalctl -u postfix
sudo journalctl -u dovecot
sudo journalctl -u rspamd
设置 Apache 和安装 WordPress
我们选择使用以下路径配置 apache (httpd) 虚拟主机:
| 文件根目录 | /var/www/example.com | 网站文件在这里 |
| HTTP 配置 | /etc/httpd/conf.d/example.com.conf | 基本网站配置 |
| HTTPS 配置 | /etc/httpd/conf.d/example.com-le-ssl.conf | 由 certbot 创建 |
| 访问日志 | /var/log/httpd/example.com_access.log | |
| 错误日志 | /var/log/httpd/example.com_error.log |
创建虚拟主机
创建 HTTP 配置文件,其中至少应包含
服务器名称 example.com
文档根目录 /var/www/example.com
允许覆盖全部
<目录
错误日志 /var/log/httpd/example.com_error.log
自定义日志 /var/log/httpd/example.com_access.log 合并
虚拟主机
重新加载 Apache 以启用网站
sudo systemctl reload httpd
创建文档根目录
在这种情况下,我们将下载 WordPress 并重命名提取的文件,以创建文档根目录。
cd ~ # 切换到您的主目录
curl -O https://wordpress.org/latest.tar.gz
sudo tar -xvzf latest.tar.gz
sudo mv wordpress /var/www/example.com
sudo chown -R apache:apache /var/www/example.com
sudo chmod -R 755 /var/www/example.com
rm latest.tar.gz
如果您使用的不是 WordPress,那么:
sudo mkdir /var/www/example.com
sudo chown -R apache:apache /var/www/example.com
sudo chmod -R 755 /var/www/example.com
然后将文件添加到 /var/www/example.com 中
获取 SSL 证书并安装
Certbot 将为您解决这一问题。
sudo certbot --apache -d example.com
按照提示操作,让 Certbot 更新虚拟主机。
如果您不使用 WordPress,可以跳过其余说明。将文件放入文档根目录,并检查是否可以访问它们。
创建 WordPress 数据库
sudo mysql -u root -p
创建数据库 wordpress;
创建用户 'wpuser'@'localhost' IDENTIFIED BY 'strongpassword';
GRANT ALL PRIVILEGES ON wordpress.* TO 'wpuser'@'localhost';
清除权限;
退出;
将数据库名称 (wordpress)、用户 (wpuser) 和密码替换为您的唯一值。不要更改"@'localhost"。
配置 WordPress
访问 https://example.com 并按照提示配置 WordPress
安全的 WordPress
设置文件权限
sudo find /var/www/example.com/ -type d -exec chmod 755 {}\;
sudo find /var/www/example.com/ -type f -exec chmod 644 {}\;
sudo chmod 600 /var/www/example.com/wp-config.php
更改安全密钥
转到 https://api.wordpress.org/secret-key/1.1/salt/ 创建随机 "盐 "值,然后用新值替换 WordPress 配置中的值。
sudo nano /var/www/example.com/wp-config.php