部署不同类型的服务器
设置和配置 Web 服务器及反向代理、网络文件服务、数据库服务器、邮件传输代理和打印机
摘要
对红帽文档提供反馈 复制链接链接已复制到粘贴板!
我们感谢您对我们文档的反馈。让我们了解如何改进它。
通过 Jira 提交反馈(需要帐户)
- 登录到 Jira 网站。
- 单击顶部导航栏中的 Create。
- 在 Summary 字段中输入描述性标题。
- 在 Description 字段中输入您对改进的建议。包括文档相关部分的链接。
- 点对话框底部的 Create。
第 1 章 设置 Apache HTTP web 服务器 复制链接链接已复制到粘贴板!
1.1. Apache HTTP web 服务器简介 复制链接链接已复制到粘贴板!
Web 服务器是一个通过 Web 向客户端提供内容的网络服务。这通常是网页,但也可以提供任何其他文档。Web 服务器也称为 HTTP 服务器,因为它们使用 超文本传输协议 (HTTP)。
Apache HTTP 服务器 httpd 是由 Apache Software Foundation 开发的开源 Web 服务器。
如果您要从之前的 Red Hat Enterprise Linux 版本升级,您必须相应地更新 httpd 服务配置。本节介绍了一些新添加的功能,并指导您完成之前的配置文件的更新。
1.2. Apache HTTP 服务器中的显著变化 复制链接链接已复制到粘贴板!
Apache HTTP 服务器 已从 RHEL 7 中的 2.4.6 版本更新至 RHEL 8 中的 2.4.37 版本。这个版本包括了几个新功能,但在外部模块的配置和应用程序二进制接口(ABI)级别上保持与 RHEL 7 版本的向后兼容性。
新特性包括:
-
HTTP/2支持现在由mod_http2软件包提供,这是httpd模块的一部分。 -
支持 systemd 套接字激活。详情请查看
httpd.socket(8)手册页。
添加了多个新模块:
-
mod_proxy_hcheck- 代理健康检查模块 -
mod_proxy_uwsgi- Web 服务器网关接口(WSGI)代理 -
mod_proxy_fdpass- 支持将客户端套接字传递给另一个进程 -
mod_cache_socache- 使用的 HTTP 缓存,如 memcache backend -
mod_md- ACME 协议 SSL/TLS 证书服务
-
现在默认载入以下模块:
-
mod_request -
mod_macro -
mod_watchdog
-
-
添加了一个新的子
软件包 httpd-filesystem,其中包含 Apache HTTP 服务器 的基本目录布局,包括目录的正确权限。 -
引入了实例化服务支持
httpd@.service。如需更多信息,请参阅httpd.serviceman page。
-
新的
httpd-init.service替换%post 脚本来创建自签名的mod_ssl密钥对。
-
mod_md软件包现在支持使用自动证书管理环境(ACME)协议进行自动 TLS 证书置备和续订(用于Let 的加密等证书提供商)。 -
Apache HTTP 服务器 现在支持直接从
PKCS#11模块的硬件安全令牌加载 TLS 证书和私钥。现在,mod_ssl配置可以使用PKCS#11URL 来标识 TLS 私钥,(可选)以及SSLCertificateKeyFile和SSLCertificateFile指令中的 TLS 证书。 现在,支持
/etc/httpd/conf/httpd.conf文件中的ListenFree指令。与
Listen指令类似,listenFree也提供有关服务器侦听的 IP 地址、端口或 IP 地址和端口组合的信息。但是,使用ListenFree时,默认启用IP_FREEBIND套接字选项。因此,允许httpd绑定到非本地 IP 地址或尚不存在的 IP 地址。这允许httpd侦听套接字,无需在httpd尝试绑定到底层网络接口或指定的动态 IP 地址处于在线状态。请注意,
ListenFree指令目前仅在 RHEL 8 中可用。有关
ListenFree的详情,请查看下表:Expand 表 1.1. ListenFree 指令的语法、状态和模块 语法 状态 模块 ListenFree [IP-address:]portnumber [protocol]
MPM
event、worker、prefork、mpm_winnt、mpm_netware、mpmt_os2
其他显著变化包括:
删除了以下模块:
-
mod_file_cache mod_nss使用
mod_ssl作为替换。有关从mod_nss迁移的详情,请参考 第 1.14 节 “从 NSS 数据库导出私钥和证书,以便在 Apache Web 服务器配置中使用它们”。-
mod_perl
-
-
在 RHEL 8 中,Apache HTTP 服务器 使用的默认 DBM 验证数据库已经从
SDBM改为db5。 -
Apache HTTP 服务器的
mod_wsgi模块已更新为 Python 3。WSGI 应用程序现在只支持 Python 3,且必须从 Python 2 中迁移。 默认情况下,使用 Apache HTTP 服务器配置 的多处理模块(MPM)从多进程(称为
prefork)的派生模型更改为高性能多线程模型事件。任何不是线程的第三方模块都需要被替换或删除。要更改配置的 MPM,请编辑
/etc/httpd/conf.modules.d/00-mpm.conf文件。详情请查看httpd.service(8)手册页。- 现在,suEXEC 允许的用户的 UID 和 GID 最少为 1000 和 500(之前为 100 和 100)。
-
/etc/sysconfig/httpd文件不再被支持用来为httpd服务设置环境变量。为 systemd 服务添加了httpd.service(8)手册页。 -
现在,停止
httpd服务默认使用"正常停止"。 -
mod_auth_kerb模块已被mod_auth_gssapi模块替代。
1.3. 更新配置 复制链接链接已复制到粘贴板!
要从 Red Hat Enterprise Linux 7 中使用的 Apache HTTP 服务器版本更新配置文件,请选择以下选项之一:
-
如果
/etc/sysconfig/httpd用于设置环境变量,请创建一个 systemd drop-in文件。 - 如果使用任何第三方模块,请确保它们与线程 MPM 兼容。
- 如果使用 suexec,请确保用户和组群 ID 满足新的最小值。
您可以使用以下命令检查配置中的错误:
apachectl configtest
# apachectl configtest
Syntax OK
1.4. Apache 配置文件 复制链接链接已复制到粘贴板!
默认情况下,httpd 在启动后读取配置文件。您可以在下表中查看配置文件的位置列表。
| 路径 | 描述 |
|---|---|
|
| 主配置文件。 |
|
| 主配置文件中包含的配置文件的辅助目录。 |
|
| 用于载入 Red Hat Enterprise Linux 中打包动态模块的配置文件的辅助目录。在默认配置中,首先会处理这些配置文件。 |
虽然默认配置适用于大多数情况,但您也可以使用其他配置选项。要让任何更改生效,请首先重启 web 服务器。
要检查配置中的可能错误,在 shell 提示符后输入以下内容:
apachectl configtest
# apachectl configtest
Syntax OK
要更方便地从错误中恢复,请在编辑前复制原始文件。
1.5. 管理 httpd 服务 复制链接链接已复制到粘贴板!
本节描述了如何启动、停止和重新启动 httpd 服务。
先决条件
- 已安装 Apache HTTP 服务器。
流程
要启动
httpd服务,请输入:systemctl start httpd
# systemctl start httpdCopy to Clipboard Copied! Toggle word wrap Toggle overflow 要停止
httpd服务,请输入:systemctl stop httpd
# systemctl stop httpdCopy to Clipboard Copied! Toggle word wrap Toggle overflow 要重启
httpd服务,请输入:systemctl restart httpd
# systemctl restart httpdCopy to Clipboard Copied! Toggle word wrap Toggle overflow
1.6. 设置单实例 Apache HTTP 服务器 复制链接链接已复制到粘贴板!
您可以设置单实例 Apache HTTP 服务器来提供静态 HTML 内容。
如果 Web 服务器应该为与服务器关联的所有域提供相同的内容,请按照以下流程操作。如果要为不同的域提供不同的内容,请设置基于名称的虚拟主机。详情请参阅 配置 Apache 基于名称的虚拟主机。
流程
安装
httpd软件包:yum install httpd
# yum install httpdCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果使用
firewalld,请在本地防火墙中打开 TCP 端口80:firewall-cmd --permanent --add-port=80/tcp firewall-cmd --reload
# firewall-cmd --permanent --add-port=80/tcp # firewall-cmd --reloadCopy to Clipboard Copied! Toggle word wrap Toggle overflow 启用并启动
httpd服务:systemctl enable --now httpd
# systemctl enable --now httpdCopy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:将 HTML 文件添加到
/var/www/html/目录中。注意在 向
/var/www/html/添加内容时,在httpd默认运行的情况下,文件和目录必须可被用户读取。内容所有者可以是root用户和root用户组,也可以是管理员选择的其他用户或组。如果内容所有者是root用户和root用户组,则文件必须可被其他用户读取。所有文件和目录的 SELinux 上下文必须为httpd_sys_content_t,其默认应用于/var/www目录中的所有内容。
验证
使用 Web 浏览器连接到
http://server_IP_or_host_name/。如果
/var/www/html/目录为空,或者不包含index.html或index.htm文件,则 Apache 会显示Red Hat Enterprise Linux 测试页面。如果/var/www/html/包含具有不同名称的 HTML 文件,您可以通过输入该文件的 URL 来加载它们,如http://server_IP_or_host_name/example.html。
1.7. 配置基于 Apache 名称的虚拟主机 复制链接链接已复制到粘贴板!
基于名称的虚拟主机可让 Apache 为解析到服务器 IP 地址的不同域提供不同的内容。
您可以使用单独的文档根目录为 example.com 和 example.net 域设置虚拟主机。两个虚拟主机都提供静态 HTML 内容。
先决条件
客户端和 Web 服务器将
example.com和example.net域解析为 Web 服务器的 IP 地址。请注意,您必须手动将这些条目添加到 DNS 服务器中。
流程
安装
httpd软件包:yum install httpd
# yum install httpdCopy to Clipboard Copied! Toggle word wrap Toggle overflow 编辑
/etc/httpd/conf/httpd.conf文件:为
example.com域添加以下虚拟主机配置:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 这些设置配置以下内容:
-
<VirtualHost *:80>指令中的所有设置都是针对这个虚拟主机的。 -
DocumentRoot设置虚拟主机的 Web 内容的路径。 ServerName设置此虚拟主机为其提供内容服务的域。要设置多个域,请在配置中添加
ServerAlias参数,并在此参数中指定用空格分开的额外域。-
CustomLog设置虚拟主机的访问日志的路径。 ErrorLog设置虚拟主机错误日志的路径。注意Apache 还将配置中找到的第一个虚拟主机用于与
ServerName和Server Alias参数中设置的任何域不匹配的请求。这还包括发送到服务器 IP 地址的请求。
-
为
example.net域添加类似的虚拟主机配置:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 为两个虚拟主机创建文档根目录:
mkdir /var/www/example.com/ mkdir /var/www/example.net/
# mkdir /var/www/example.com/ # mkdir /var/www/example.net/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您在
DocumentRoot参数中设置的路径不在/var/www/中,请在两个文档根中设置httpd_sys_content_t上下文:semanage fcontext -a -t httpd_sys_content_t "/srv/example.com(/.*)?" restorecon -Rv /srv/example.com/ semanage fcontext -a -t httpd_sys_content_t "/srv/example.net(/.\*)?" restorecon -Rv /srv/example.net/
# semanage fcontext -a -t httpd_sys_content_t "/srv/example.com(/.*)?" # restorecon -Rv /srv/example.com/ # semanage fcontext -a -t httpd_sys_content_t "/srv/example.net(/.\*)?" # restorecon -Rv /srv/example.net/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 这些命令在
/srv/example.com/和/srv/ example.net/目录中设置httpd_sys_content_t上下文。请注意,您必须安装
policycoreutils-python-utils软件包才能运行restorecon命令。如果您使用
firewalld,请在本地防火墙中打开端口80:firewall-cmd --permanent --add-port=80/tcp firewall-cmd --reload
# firewall-cmd --permanent --add-port=80/tcp # firewall-cmd --reloadCopy to Clipboard Copied! Toggle word wrap Toggle overflow 启用并启动
httpd服务:systemctl enable --now httpd
# systemctl enable --now httpdCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
在每个虚拟主机的文档 root 中创建不同的示例文件:
echo "vHost example.com" > /var/www/example.com/index.html echo "vHost example.net" > /var/www/example.net/index.html
# echo "vHost example.com" > /var/www/example.com/index.html # echo "vHost example.net" > /var/www/example.net/index.htmlCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
使用浏览器并连接到
http://example.comWeb 服务器显示example.com虚拟主机中的示例文件。 -
使用浏览器并连接到
http://example.netWeb 服务器显示example.net虚拟主机中的示例文件。
1.8. 为 Apache HTTP web 服务器配置 Kerberos 验证 复制链接链接已复制到粘贴板!
要在 Apache HTTP web 服务器中执行 Kerberos 身份验证,RHEL 8 使用 mod_auth_gssapi Apache 模块。Generic Security Services API(GSSAPI)是请求使用安全库(如 Kerberos)的应用程序的接口。gssproxy 服务允许对 httpd 服务器实施特权分离,从安全的角度来看,这优化了此过程。
mod_auth_gssapi 模块取代了已删除的 mod_auth_kerb 模块。
先决条件
-
httpd和gssproxy软件包已经安装。 -
Apache Web 服务器已设置,并且
httpd服务在运行。
1.8.1. 在 IdM 环境中设置 GSS-Proxy 复制链接链接已复制到粘贴板!
这个流程描述了如何设置 GSS-Proxy ,以便在 Apache HTTP Web 服务器中执行 Kerberos 身份验证。
流程
通过创建服务主体来启用对 HTTP/<SERVER_NAME>@realm 主体的
keytab文件的访问:ipa service-add HTTP/<SERVER_NAME>
# ipa service-add HTTP/<SERVER_NAME>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 检索存储在
/etc/gssproxy/http.keytab文件中的主体的keytab:ipa-getkeytab -s $(awk '/^server =/ {print $3}' /etc/ipa/default.conf) -k /etc/gssproxy/http.keytab -p HTTP/$(hostname -f)# ipa-getkeytab -s $(awk '/^server =/ {print $3}' /etc/ipa/default.conf) -k /etc/gssproxy/http.keytab -p HTTP/$(hostname -f)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 此步骤将权限设置为 400,因此只有
root用户有访问keytab文件的权限。apache用户无法访问。使用以下内容创建
/etc/gssproxy/80-httpd.conf文件:[service/HTTP] mechs = krb5 cred_store = keytab:/etc/gssproxy/http.keytab cred_store = ccache:/var/lib/gssproxy/clients/krb5cc_%U euid = apache
[service/HTTP] mechs = krb5 cred_store = keytab:/etc/gssproxy/http.keytab cred_store = ccache:/var/lib/gssproxy/clients/krb5cc_%U euid = apacheCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重启并启用
gssproxy服务:systemctl restart gssproxy.service systemctl enable gssproxy.service
# systemctl restart gssproxy.service # systemctl enable gssproxy.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow
1.9. 在Apache HTTP服务器上配置TLS加密 复制链接链接已复制到粘贴板!
默认情况下,Apache 使用未加密的 HTTP 连接向客户端提供内容。这部分论述了如何在 Apache HTTP 服务器上启用 TLS 加密和配置常用的与加密相关的设置。
先决条件
- Apache HTTP 服务器已安装并运行。
1.9.1. 在 Apache HTTP 服务器中添加 TLS 加密 复制链接链接已复制到粘贴板!
您可以在 Apache HTTP 服务器上为 example.com 域启用 TLS 加密。
先决条件
- Apache HTTP 服务器已安装并运行。
私钥存储在
/etc/pki/tls/private/example.com.key文件中。有关创建私钥和证书签名请求(CSR)的详细信息,以及如何从证书颁发机构(CA)请求证书,请参阅您的 CA 文档。或者,如果您的 CA 支持 ACME 协议,您可以使用
mod_md模块自动检索和调配 TLS 证书。-
TLS 证书存储在
/etc/pki/tls/certs/example.com.crt文件中。如果您使用其他路径,请调整该流程的对应步骤。 -
CA 证书存储在
/etc/pki/tls/certs/ca.crt文件中。如果您使用其他路径,请调整该流程的对应步骤。 - 客户端和网页服务器会将服务器的主机名解析为 web 服务器的 IP 地址。
流程
安装
mod_ssl软件包:yum install mod_ssl
# yum install mod_sslCopy to Clipboard Copied! Toggle word wrap Toggle overflow 编辑
/etc/httpd/conf.d/ssl.conf文件,并将以下设置添加到<VirtualHost _default_:443>指令中:设置服务器名称:
ServerName example.com
ServerName example.comCopy to Clipboard Copied! Toggle word wrap Toggle overflow
服务器名称必须与证书的 Common Name字段中设置的条目匹配。
可选:如果证书在
Subject Alt Names(SAN)字段中包含额外的主机名,您可以 配置mod_ssl来为这些主机名提供 TLS 加密。要配置此功能,请添加具有对应名称的ServerAliases参数:ServerAlias www.example.com server.example.com
ServerAlias www.example.com server.example.comCopy to Clipboard Copied! Toggle word wrap Toggle overflow 设置到私钥、服务器证书和 CA 证书的路径:
SSLCertificateKeyFile "/etc/pki/tls/private/example.com.key" SSLCertificateFile "/etc/pki/tls/certs/example.com.crt" SSLCACertificateFile "/etc/pki/tls/certs/ca.crt"
SSLCertificateKeyFile "/etc/pki/tls/private/example.com.key" SSLCertificateFile "/etc/pki/tls/certs/example.com.crt" SSLCACertificateFile "/etc/pki/tls/certs/ca.crt"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出于安全考虑,配置成只有
root用户才可以访问私钥文件:chown root:root /etc/pki/tls/private/example.com.key chmod 600 /etc/pki/tls/private/example.com.key
# chown root:root /etc/pki/tls/private/example.com.key # chmod 600 /etc/pki/tls/private/example.com.keyCopy to Clipboard Copied! Toggle word wrap Toggle overflow 警告如果私钥被设置为可以被未授权的用户访问,则需要撤销证书,然后再创建一个新私钥并请求一个新证书。否则,TLS 连接就不再安全。
如果您使用
firewalld,请在本地防火墙中打开端口443:firewall-cmd --permanent --add-port=443/tcp firewall-cmd --reload
# firewall-cmd --permanent --add-port=443/tcp # firewall-cmd --reloadCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重启
httpd服务:systemctl restart httpd
# systemctl restart httpdCopy to Clipboard Copied! Toggle word wrap Toggle overflow
注意如果您使用密码来保护私钥文件,则必须在每次
httpd服务启动时都输入此密码。
验证
-
使用浏览器并连接到
https://example.com。
1.9.2. 在 Apache HTTP 服务器中设置支持的 TLS 协议版本 复制链接链接已复制到粘贴板!
默认情况下,RHEL 上的 Apache HTTP 服务器使用系统范围的加密策略来定义安全默认值,这些值也与最新的浏览器兼容。例如,DEFAULT 策略定义 TLSv1.2 和 TLSv1.3 协议版本仅在 apache 中启用。
您可以手动配置 Apache HTTP 服务器支持哪个 TLS 协议版本。如果您的环境只需要启用特定的 TLS 协议版本,请按照以下步骤操作,例如:
-
如果您的环境要求客户端也可以使用弱
TLS1(TLSv1.0)或TLS1.1协议。 -
如果你想将 Apache 配置为只支持
TLSv1.2或TLSv1.3协议。
先决条件
- TLS 加密在服务器上启用,如 将 TLS 加密添加到 Apache HTTP 服务器 中所述。
流程
编辑
/etc/httpd/conf/httpd.conf文件,并将以下设置添加到您要为其设置 TLS 协议版本的<VirtualHost>指令中。例如,只启用TLSv1.3协议:SSLProtocol -All TLSv1.3
SSLProtocol -All TLSv1.3Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重启
httpd服务:systemctl restart httpd
# systemctl restart httpdCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
使用以下命令来验证服务器是否支持
TLSv1.3:openssl s_client -connect example.com:443 -tls1_3
# openssl s_client -connect example.com:443 -tls1_3Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用以下命令来验证服务器是否不支持
TLSv1.2:openssl s_client -connect example.com:443 -tls1_2
# openssl s_client -connect example.com:443 -tls1_2Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果服务器不支持该协议,命令会返回一个错误:
140111600609088:error:1409442E:SSL routines:ssl3_read_bytes:tlsv1 alert protocol version:ssl/record/rec_layer_s3.c:1543:SSL alert number 70
140111600609088:error:1409442E:SSL routines:ssl3_read_bytes:tlsv1 alert protocol version:ssl/record/rec_layer_s3.c:1543:SSL alert number 70Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 可选:重复用于其他 TLS 协议版本的命令。
1.9.3. 在 Apache HTTP 服务器中设置支持的密码 复制链接链接已复制到粘贴板!
默认情况下,Apache HTTP 服务器使用定义安全默认值的系统范围的加密策略,这些值也与最新的浏览器兼容。有关系统范围加密允许的密码列表,请查看/etc/crypto-policies/back-ends/openssl.config 文件。
您可以手动配置 Apache HTTP 服务器支持哪种密码。如果您的环境需要特定的加密系统,请按照以下步骤操作。
先决条件
- TLS 加密在服务器上启用,如 将 TLS 加密添加到 Apache HTTP 服务器 中所述。
流程
编辑
/etc/httpd/conf/httpd.conf文件,并将SSLCipherSuite参数添加到您要为其设置 TLS 密码的<VirtualHost>指令中:SSLCipherSuite "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH:!SHA1:!SHA256"
SSLCipherSuite "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH:!SHA1:!SHA256"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 这个示例只启用
EECDH+AESGCM、EDH+AESGCM、AES256+EECDH和AES256+EDH密码,并禁用所有使用SHA1和SHA256消息身份验证码(MAC)的密码。重启
httpd服务:systemctl restart httpd
# systemctl restart httpdCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
显示 Apache HTTP 服务器支持的密码列表:
安装
nmap软件包:yum install nmap
# yum install nmapCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
nmap工具来显示支持的加密:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
1.10. 配置 TLS 客户端证书身份验证 复制链接链接已复制到粘贴板!
客户端证书身份验证可让管理员只允许使用证书进行身份验证的用户访问 web 服务器上的资源。您可以为 /var/www/html/Example/ 目录配置客户端证书身份验证。
如果 Apache HTTP 服务器使用 TLS 1.3 协议,某些客户端将需要额外的配置。例如,在 Firefox 中,将about:config菜单中的security.tls.enable_post_handshake_auth参数设置为true。
先决条件
- TLS 加密在服务器上启用,如 将 TLS 加密添加到 Apache HTTP 服务器 中所述。
流程
编辑
/etc/httpd/conf/httpd.conf文件,并将以下设置添加到你要为其配置客户端验证的<VirtualHost>指令中:<Directory "/var/www/html/Example/"> SSLVerifyClient require </Directory>
<Directory "/var/www/html/Example/"> SSLVerifyClient require </Directory>Copy to Clipboard Copied! Toggle word wrap Toggle overflow SSLVerifyClient require设置定义了服务器必须成功验证客户端证书,然后客户端才能访问/var/www/html/Example/目录中的内容。重启
httpd服务:systemctl restart httpd
# systemctl restart httpdCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
使用
curl工具在没有客户端身份验证的情况下访问https://example.com/Example/URL:curl https://example.com/Example/
$ curl https://example.com/Example/ curl: (56) OpenSSL SSL_read: error:1409445C:SSL routines:ssl3_read_bytes:tlsv13 alert certificate required, errno 0Copy to Clipboard Copied! Toggle word wrap Toggle overflow 这个错误表示 web 服务器需要客户端证书验证。
将客户端私钥和证书以及 CA 证书传递给
curl以便使用客户端身份验证来访问相同的URL:curl --cacert ca.crt --key client.key --cert client.crt https://example.com/Example/
$ curl --cacert ca.crt --key client.key --cert client.crt https://example.com/Example/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果请求成功,
curl会显示存储在/var/www/html/Example/目录中的index.html文件。
1.11. 使用 ModSecurity 在 web 服务器上保护 Web 应用程序 复制链接链接已复制到粘贴板!
ModSecurity 是一个开源 Web 应用程序防火墙(WAF),受到各种 web 服务器(如 Apache、Nginx 和 IIS)支持,它可以降低 web 应用程序中的安全风险。ModSecurity 为配置服务器提供了可自定义的规则集。
mod_security-crs 软件包包含核心规则集(CRS),针对跨 Web 站点脚本、错误的用户代理、SQL 注入、Trojans、会话劫持和其他利用的规则。
1.11.1. 为 Apache 部署基于 web 的 ModSecurity 应用程序防火墙 复制链接链接已复制到粘贴板!
要通过部署 ModSecurity 来降低在 web 服务器上运行的基于 Web 的应用程序的风险,请为 Apache HTTP 服务器安装 mod_security 和 mod_security_crs 软件包。mod_security_crs 软件包为 ModSecurity 基于 Web 的应用程序防火墙(WAF)模块提供核心规则集(CRS)。
流程
安装
mod_security、mod_security_crs和httpd软件包:yum install -y mod_security mod_security_crs httpd
# yum install -y mod_security mod_security_crs httpdCopy to Clipboard Copied! Toggle word wrap Toggle overflow 启动
httpd服务器:systemctl restart httpd
# systemctl restart httpdCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
验证 Apache HTTP 服务器上是否启用了 ModSecurity 基于 web 的应用程序防火墙:
httpd -M | grep security
# httpd -M | grep security security2_module (shared)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 检查
/etc/httpd/modsecurity.d/activated_rules/目录是否包含由mod_security_crs提供的规则:ls /etc/httpd/modsecurity.d/activated_rules/
# ls /etc/httpd/modsecurity.d/activated_rules/ ... REQUEST-921-PROTOCOL-ATTACK.conf REQUEST-930-APPLICATION-ATTACK-LFI.conf ...Copy to Clipboard Copied! Toggle word wrap Toggle overflow
1.11.2. 向 ModSecurity 中添加自定义规则 复制链接链接已复制到粘贴板!
如果 ModSecurity 核心规则集(CRS)中包含的规则不能适合您的场景,如果您想要阻止其他可能的攻击,则可以将自定义规则添加到 ModSecurity 基于 web 的应用防火墙使用的规则集中。以下示例演示了添加一条简单的规则。有关创建更复杂的规则,请参阅 ModSecurity Wiki 网站上的参考手册。
先决条件
- ModSecurity for Apache 已安装并启用。
流程
在您选择的文本编辑器中打开
/etc/httpd/conf.d/mod_security.conf文件,例如:vi /etc/httpd/conf.d/mod_security.conf
# vi /etc/httpd/conf.d/mod_security.confCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在以
SecRuleEngine On开头的行后添加以下示例规则:SecRule ARGS:data "@contains evil" "deny,status:403,msg:'param data contains evil data',id:1"
SecRule ARGS:data "@contains evil" "deny,status:403,msg:'param data contains evil data',id:1"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果
data参数包含evil字符串,则前面的规则禁止用户使用资源。- 保存更改,退出编辑器。
重启
httpd服务器:systemctl restart httpd
# systemctl restart httpdCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
创建一个
test.html页面:echo "mod_security test" > /var/www/html/test.html
# echo "mod_security test" > /var/www/html/test.htmlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重启
httpd服务器:systemctl restart httpd
# systemctl restart httpdCopy to Clipboard Copied! Toggle word wrap Toggle overflow 请求
test.html,而在 HTTP 请求的GET变量没有恶意数据:curl http://localhost/test.html?data=good
$ curl http://localhost/test.html?data=good mod_security testCopy to Clipboard Copied! Toggle word wrap Toggle overflow 请求
test.html,而在 HTTP 请求的GET变量中带有恶意数据:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 检查
/var/log/httpd/error_log文件,并找到带有param data containing an evil data信息的拒绝访问的日志条目:[Wed May 25 08:01:31.036297 2022] [:error] [pid 5839:tid 139874434791168] [client ::1:45658] [client ::1] ModSecurity: Access denied with code 403 (phase 2). String match "evil" at ARGS:data. [file "/etc/httpd/conf.d/mod_security.conf"] [line "4"] [id "1"] [msg "param data contains evil data"] [hostname "localhost"] [uri "/test.html"] [unique_id "Yo4amwIdsBG3yZqSzh2GuwAAAIY"]
[Wed May 25 08:01:31.036297 2022] [:error] [pid 5839:tid 139874434791168] [client ::1:45658] [client ::1] ModSecurity: Access denied with code 403 (phase 2). String match "evil" at ARGS:data. [file "/etc/httpd/conf.d/mod_security.conf"] [line "4"] [id "1"] [msg "param data contains evil data"] [hostname "localhost"] [uri "/test.html"] [unique_id "Yo4amwIdsBG3yZqSzh2GuwAAAIY"]Copy to Clipboard Copied! Toggle word wrap Toggle overflow
1.12. 安装 Apache HTTP 服务器手册 复制链接链接已复制到粘贴板!
您可以安装 Apache HTTP 服务器手册。手册提供了详细信息,例如:
- 配置参数和指令
- 性能调整
- 身份验证设置
- 模块
- 内容缓存
- 安全提示
- 配置 TLS 加密
安装后,您可以使用 Web 浏览器显示手册。
先决条件
- Apache HTTP 服务器已安装并运行。
流程
安装
httpd-manual软件包:yum install httpd-manual
# yum install httpd-manualCopy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:默认情况下,所有连接到 Apache HTTP 服务器的客户端都可以显示手册。要限制对特定 IP 范围的访问,如
192.0.2.0/24子网,编辑/etc/httpd/conf.d/manual.conf文件,并将Require ip 192.0.2.0/24设置添加到<Directory "/usr/share/httpd/manual">指令中:<Directory "/usr/share/httpd/manual"> ... Require ip 192.0.2.0/24 ... </Directory><Directory "/usr/share/httpd/manual"> ... Require ip 192.0.2.0/24 ... </Directory>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重启
httpd服务:systemctl restart httpd
# systemctl restart httpdCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
-
要显示 Apache HTTP 服务器手册,使用 Web 浏览器连接到
http://host_name_or_IP_address/manual/
1.13. 使用 Apache 模块 复制链接链接已复制到粘贴板!
httpd 服务是一个模块化应用程序,您可以使用多个 Dynamic Shared Objects (DSOs)对其进行扩展。Dynamic Shared Objects 是您可以可以根据需要在运行时动态加载或卸载的模块。您可以在 /usr/lib64/httpd/modules/ 目录中找到这些模块。
1.13.1. 载入 DSO 模块 复制链接链接已复制到粘贴板!
作为管理员,您可以通过配置服务器应加载哪个模块来选择要包含在服务器中的功能。若要载入特定的 DSO 模块,可使用LoadModule 指令。请注意,由单独的包提供的模块通常在/etc/httpd/conf.modules.d/目录中有自己的配置文件。
先决条件
-
您已安装了
httpd软件包。
流程
在
/etc/httpd/conf.modules.d/目录中的配置文件中搜索模块名称:grep mod_ssl.so /etc/httpd/conf.modules.d/*
# grep mod_ssl.so /etc/httpd/conf.modules.d/*Copy to Clipboard Copied! Toggle word wrap Toggle overflow 编辑在其中找到了模块名称的配置文件,然后取消对模块的
LoadModule指令的注释:LoadModule ssl_module modules/mod_ssl.so
LoadModule ssl_module modules/mod_ssl.soCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果没有找到模块,例如,因为 RHEL 软件包没有提供该模块,请创建一个配置文件,如
/etc/httpd/conf.modules.d/30-example.conf:LoadModule ssl_module modules/<custom_module>.so
LoadModule ssl_module modules/<custom_module>.soCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重启
httpd服务:systemctl restart httpd
# systemctl restart httpdCopy to Clipboard Copied! Toggle word wrap Toggle overflow
1.13.2. 编译自定义 Apache 模块 复制链接链接已复制到粘贴板!
您可以创建自己的模块,并使用 httpd-devel 软件包帮助构建,该软件包包含 include 文件、头文件以及编译模块所需的 APache eXtenSion (pxs)工具。
先决条件
-
您已安装了
httpd-devel软件包。
流程
使用以下命令构建自定义模块:
apxs -i -a -c module_name.c
# apxs -i -a -c module_name.cCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
- 加载模块的方式与 加载 DSO 模块 中所述的方法一样。
1.14. 从 NSS 数据库导出私钥和证书,以便在 Apache Web 服务器配置中使用它们 复制链接链接已复制到粘贴板!
RHEL 8 不再为 Apache web 服务器提供mod_nss 模块,红帽建议使用mod_ssl模块。如果您将私钥和证书存储在网络安全服务(NSS)数据库中,例如,因为您将 web 服务器从 RHEL 7 迁移了到 RHEL 8,请按照以下步骤以 Privacy Enhanced Mail(PEM)格式提取密钥和证书。然后,您可以使用 mod_ssl 配置中的文件,如 在 Apache HTTP 服务器上配置 TLS 加密 中所述。
这个过程假设 NSS 数据库存储在 /etc/httpd/alias/中,并将导出的私钥和证书存储在/etc/pki/tls/目录中。
先决条件
- 私钥、证书和证书颁发机构(CA)证书存储在 NSS 数据库中。
流程
列出 NSS 数据库中的证书:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在下一步中需要证书的别名。
要提取私钥,您必须临时将密钥导出到一个 PKCS #12 文件:
使用与私钥关联的证书的别名,将密钥导出到一个 PKCS #12 文件:
pk12util -o /etc/pki/tls/private/export.p12 -d /etc/httpd/alias/ -n "Example Server Certificate"
# pk12util -o /etc/pki/tls/private/export.p12 -d /etc/httpd/alias/ -n "Example Server Certificate" Enter password for PKCS12 file: password Re-enter password: password pk12util: PKCS12 EXPORT SUCCESSFULCopy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,您必须在 PKCS #12 文件中设置一个密码。下一步需要这个密码。
从 PKCS #12 文件中导出私钥:
openssl pkcs12 -in /etc/pki/tls/private/export.p12 -out /etc/pki/tls/private/server.key -nocerts -nodes
# openssl pkcs12 -in /etc/pki/tls/private/export.p12 -out /etc/pki/tls/private/server.key -nocerts -nodes Enter Import Password: password MAC verified OKCopy to Clipboard Copied! Toggle word wrap Toggle overflow 删除临时 PKCS #12 文件:
rm /etc/pki/tls/private/export.p12
# rm /etc/pki/tls/private/export.p12Copy to Clipboard Copied! Toggle word wrap Toggle overflow
对
/etc/pki/tls/private/server.key设置权限,以确保只有root用户才可以访问该文件:chown root:root /etc/pki/tls/private/server.key chmod 0600 /etc/pki/tls/private/server.key
# chown root:root /etc/pki/tls/private/server.key # chmod 0600 /etc/pki/tls/private/server.keyCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用 NSS 数据库中的服务器证书的别名导出 CA 证书:
certutil -d /etc/httpd/alias/ -L -n "Example Server Certificate" -a -o /etc/pki/tls/certs/server.crt
# certutil -d /etc/httpd/alias/ -L -n "Example Server Certificate" -a -o /etc/pki/tls/certs/server.crtCopy to Clipboard Copied! Toggle word wrap Toggle overflow 对
/etc/pki/tls/certs/server.crt设置权限,以确保只有root用户才可以访问该文件:chown root:root /etc/pki/tls/certs/server.crt chmod 0600 /etc/pki/tls/certs/server.crt
# chown root:root /etc/pki/tls/certs/server.crt # chmod 0600 /etc/pki/tls/certs/server.crtCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用 NSS 数据库中 CA 证书的别名导出 CA 证书:
certutil -d /etc/httpd/alias/ -L -n "Example CA" -a -o /etc/pki/tls/certs/ca.crt
# certutil -d /etc/httpd/alias/ -L -n "Example CA" -a -o /etc/pki/tls/certs/ca.crtCopy to Clipboard Copied! Toggle word wrap Toggle overflow 按照 在 Apache HTTP 服务器上配置 TLS 加密 来配置 Apache web 服务器,并:
-
将
SSLCertificateKeyFile参数设置为/etc/pki/tls/private/server.key。 -
将
SSLCertificateFile参数设置为/etc/pki/tls/certs/server.crt。 -
将
SSLCACertificateFile参数设置为/etc/pki/tls/certs/ca.crt。
-
将
第 2 章 设置和配置 NGINX 复制链接链接已复制到粘贴板!
NGINX 是一个高性能和模块化的服务器,可作为:
- Web 服务器
- 反向代理服务器
- 负载均衡器
2.1. 安装并准备 NGINX 复制链接链接已复制到粘贴板!
红帽使用 Application Streams 来提供不同的 NGINX 版本。您可以执行以下操作:
- 选择流并安装 NGINX
- 在防火墙中打开所需端口
-
启用并启动
nginx服务
使用默认配置,NGINX 作为 Web 服务器在端口80上运行,并提供/usr/share/nginx/html/目录中的内容。
先决条件
- 已安装了 RHEL 8。
- 主机订阅了红帽客户门户网站。
-
firewalld服务已启用并已启动
流程
显示可用的 NGINX 模块流:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果要安装与默认流不同的流,请选择相关的流:
yum module enable nginx:stream_version
# yum module enable nginx:stream_versionCopy to Clipboard Copied! Toggle word wrap Toggle overflow 安装
nginx软件包:yum install nginx
# yum install nginxCopy to Clipboard Copied! Toggle word wrap Toggle overflow 打开 NGINX 应该在其防火墙中提供其服务的端口。例如,要在
firewalld中为HTTP(端口 80)和 HTTPS(端口 443)开放默认端口,请输入:firewall-cmd --permanent --add-port={80/tcp,443/tcp} firewall-cmd --reload# firewall-cmd --permanent --add-port={80/tcp,443/tcp} # firewall-cmd --reloadCopy to Clipboard Copied! Toggle word wrap Toggle overflow 设置
nginx服务在系统启动时自动启动:systemctl enable nginx
# systemctl enable nginxCopy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:启动
nginx服务:systemctl start nginx
# systemctl start nginxCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您不想使用默认配置,请跳过这一步,并在启动该服务前相应地配置 NGINX。
PHP 模块需要一个特定的 NGINX 版本。使用不兼容的版本可能会在升级到较新的 NGNIX 流时导致冲突。使用 PHP 7.2 流和 NGNIX 1.24 流时,您可以通过在安装 NGINX 之前启用较新的 PHP 流 7.4 来解决此问题。
验证
使用
yum工具来验证是否已安装了nginx软件包:yum list installed nginx
# yum list installed nginx Installed Packages nginx.x86_64 1:1.14.1-9.module+el8.0.0+4108+af250afe @rhel-8-for-x86_64-appstream-rpmsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 确保在 firewalld 中打开了 NGINX 需要的端口:
firewall-cmd --list-ports
# firewall-cmd --list-ports 80/tcp 443/tcpCopy to Clipboard Copied! Toggle word wrap Toggle overflow 验证
nginx服务是否已启用:systemctl is-enabled nginx
# systemctl is-enabled nginx enabledCopy to Clipboard Copied! Toggle word wrap Toggle overflow
2.2. 将 NGINX 配置为一个为不同域提供不同内容的 web 服务器 复制链接链接已复制到粘贴板!
默认情况下,NGINX 作为 web 服务器,为与服务器的 IP 地址关联的所有域名提供相同的内容。此流程解释了如何配置 NGINX 来实现一下情况:
-
使用
/var/www/example.com/目录中的内容提供对example.com域的请求 -
使用
/var/www/example.net/目录中的内容为example.net域提供请求 -
使用
/usr/share/nginx/html/目录中的内容为所有其他请求提供服务,例如,向服务器的IP地址或与服务器的IP地址相关联的其他域发送请求
先决条件
- NGINX 已安装
客户端和 Web 服务器将
example.com和example.net域解析为 Web 服务器的 IP 地址。请注意,您必须手动将这些条目添加到 DNS 服务器中。
流程
编辑
/etc/nginx/nginx.conf文件:默认情况下,
/etc/nginx/nginx.conf文件已包含catch-all配置。如果您已从配置中删除了这部分,请将以下server块重新添加到/etc/nginx/nginx.conf文件中的http块中:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 这些设置配置以下内容:
-
listen指令定义服务监听的 IP 地址和端口。在本例中,NGINX 监听所有 IPv4 和 IPv6 地址的80端口 。default_server参数表示,NGINX 使用此server块作为匹配 IP 地址和端口的请求的默认值。 -
server_name参数定义此server块所负责的主机名。将server_name设置为_,会将NGINX配置为接受这个server块的任何主机名。 -
root指令设置此server块的 Web 内容的路径。
-
将类似于
example.com域的server块添加到http块中:Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
access_log指令为此域定义一个单独的访问日志文件。 -
error_log指令为此域定义单独的错误日志文件。
-
将类似于
example.com域的一个server块添加到http块中:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
为这两个域创建根目录:
mkdir -p /var/www/example.com/ mkdir -p /var/www/example.net/
# mkdir -p /var/www/example.com/ # mkdir -p /var/www/example.net/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在两个根目录中设置
httpd_sys_content_t上下文:semanage fcontext -a -t httpd_sys_content_t "/var/www/example.com(/.*)?" restorecon -Rv /var/www/example.com/ semanage fcontext -a -t httpd_sys_content_t "/var/www/example.net(/.\*)?" restorecon -Rv /var/www/example.net/
# semanage fcontext -a -t httpd_sys_content_t "/var/www/example.com(/.*)?" # restorecon -Rv /var/www/example.com/ # semanage fcontext -a -t httpd_sys_content_t "/var/www/example.net(/.\*)?" # restorecon -Rv /var/www/example.net/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 这些命令在
/var/www/example.com/和/var/www/example.net/目录中设置httpd_sys_content_t上下文。请注意,您必须安装
policycoreutils-python-utils软件包才能运行restorecon命令。为这两个域创建日志目录:
mkdir /var/log/nginx/example.com/ mkdir /var/log/nginx/example.net/
# mkdir /var/log/nginx/example.com/ # mkdir /var/log/nginx/example.net/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重启
nginx服务:systemctl restart nginx
# systemctl restart nginxCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
在每个虚拟主机的文档 root 中创建不同的示例文件:
echo "Content for example.com" > /var/www/example.com/index.html echo "Content for example.net" > /var/www/example.net/index.html echo "Catch All content" > /usr/share/nginx/html/index.html
# echo "Content for example.com" > /var/www/example.com/index.html # echo "Content for example.net" > /var/www/example.net/index.html # echo "Catch All content" > /usr/share/nginx/html/index.htmlCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
使用浏览器并连接到
http://example.comWeb 服务器显示/var/www/example.com/index.html文件中的示例内容。 -
使用浏览器并连接到
http://example.netWeb 服务器显示/var/www/example.net/index.html文件中的示例内容。 -
使用浏览器连接到
http://IP_address_of_the_server。Web 服务器显示/usr/share/nginx/html/index.html文件中的示例内容。
2.3. 在 NGINX web 服务器中添加 TLS 加密 复制链接链接已复制到粘贴板!
您可以在 NGINX web 服务器上为example.com 域启用 TLS 加密。
先决条件
- NGINX 已安装。
私钥存储在
/etc/pki/tls/private/example.com.key文件中。有关创建私钥和证书签名请求(CSR)的详细信息,以及如何从证书颁发机构(CA)请求证书,请参阅您的 CA 文档。
-
TLS 证书存储在
/etc/pki/tls/certs/example.com.crt文件中。如果您使用其他路径,请调整该流程的对应步骤。 - CA 证书已附加到服务器的 TLS 证书文件中。
- 客户端和网页服务器会将服务器的主机名解析为 web 服务器的 IP 地址。
-
在本地防火墙中打开端口
443。
流程
编辑
/etc/nginx/nginx.conf文件,并将以下server块添加到配置中的http块中:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出于安全考虑,配置成只有
root用户才可以访问私钥文件:chown root:root /etc/pki/tls/private/example.com.key chmod 600 /etc/pki/tls/private/example.com.key
# chown root:root /etc/pki/tls/private/example.com.key # chmod 600 /etc/pki/tls/private/example.com.keyCopy to Clipboard Copied! Toggle word wrap Toggle overflow 警告如果私钥被设置为可以被未授权的用户访问,则需要撤销证书,然后再创建一个新私钥并请求一个新证书。否则,TLS 连接就不再安全。
重启
nginx服务:systemctl restart nginx
# systemctl restart nginxCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
-
使用浏览器连接到
https://example.com
2.4. 将 NGINX 配置为 HTTP 流量的反向代理 复制链接链接已复制到粘贴板!
您可以将 NGINX web 服务器配置为作为 HTTP 流量的反向代理。例如,您可以使用此功能将请求转发到远程服务器上的特定子目录。从客户端的角度来看,客户端从它所访问的主机加载内容。但是 NGINX 会从远程服务器加载实际内容并将其转发给客户端。
这个流程解释了如何将流向web 服务器上的/example目录的流量转发到URLhttps://example.com。
先决条件
- NGINX 已安装,如 安装和准备 NGINX 中所述。
- 可选:反向代理上启用了 TLS 加密。
流程
编辑
/etc/nginx/nginx.conf文件,并将以下设置添加到提供反向代理的server块中:location /example { proxy_pass https://example.com; }location /example { proxy_pass https://example.com; }Copy to Clipboard Copied! Toggle word wrap Toggle overflow location块定义了 NGINX 将/example目录中的所有请求传给https://example.com。将
httpd_can_network_connectSELinux 布尔值参数设置为1,以便将 SELinux 设置为允许 NGINX 转发流量:setsebool -P httpd_can_network_connect 1
# setsebool -P httpd_can_network_connect 1Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重启
nginx服务:systemctl restart nginx
# systemctl restart nginxCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
-
使用浏览器连接到
http://host_name/example,就会显示https://example.com的内容。
2.5. 将 NGINX 配置为 HTTP 负载均衡器 复制链接链接已复制到粘贴板!
您可以使用 NGINX 反向代理功能进行负载均衡流量。这个步骤描述了如何将 NGINX 配置为 HTTP 负载均衡器。它会根据服务器上的活跃连接的数量,将请求发送到不同服务器(发送到活跃连接数量最小的服务器)。如果两个服务器都不可用,这个过程还定义了第三个主机用于回退。
先决条件
- NGINX 已安装,如 安装和准备 NGINX 中所述。
流程
编辑
/etc/nginx/nginx.conf文件并添加以下设置:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在名为
backend的主机组中的least_conn指令定义了 NGINX 将请求发送到server1.example.com或server2.example.com,具体取决于哪个主机具有最少的活动连接数。NGINX 仅在其他两个主机不可用时使用server3.example.com作为备份。proxy_pass指令设置为http://backend时,NGINX 充当反向代理,并使用backend主机组根据该组的设置分发请求。您还可以指定其他方法,而不是
least_conn负载均衡方法:- 不指定方法,使用轮询的方式在服务器间平均分发请求。
-
ip_hash根据从 IPv4 地址的前三个八位字节或客户端的整个 IPv6 地址计算的哈希值将来自一个客户端地址的请求发送到同一台服务器。 -
hash,根据用户定义的密钥(可以是字符串、变量或两者的组合)来确定服务器。用consistent参数来进行配置,NGINX可根据用户定义的哈希密钥值向所有的服务器分发请求。 -
random将请求发送到随机挑选的服务器。
重启
nginx服务:systemctl restart nginx
# systemctl restart nginxCopy to Clipboard Copied! Toggle word wrap Toggle overflow
第 3 章 使用 Samba 作为服务器 复制链接链接已复制到粘贴板!
Samba 在Red Hat Enterprise Linux中实现了服务器消息块(SMB)协议。SMB 协议用于访问服务器上的资源,如文件共享和共享打印机。此外,Samba 实现了Microsoft Windows 使用的分布式计算环境远程过程调用(DCE RPC)协议。
您可以以以下方式运行 Samba:
- Active Directory(AD)或 NT4 域成员
- 独立服务器
NT4 主域控制器(PDC)或备份域控制器(BDC)
注意红帽支持仅在支持 NT4 域的 Windows 版本的现有安装中支持 PDC 和 BDC 模式。红帽建议不要设置新的 Samba NT4 域,因为 Windows 7 和 Windows Server 2008 R2之后的Microsoft操作系不支持 NT4 域。
红帽不支持将 Samba 作为 AD 域控制器(DC)来运行。
有别于安装模式,您可以选择共享目录和打印机。这可让 Samba 充当文件和打印服务器。
3.1. 了解不同的 Samba 服务和模式 复制链接链接已复制到粘贴板!
samba 软件包提供多个服务。根据您的环境和您要配置的场景,您需要一个或多个这些服务,并在不同模式下配置 Samba。
3.1.1. Samba 服务 复制链接链接已复制到粘贴板!
Samba 提供以下服务:
smbd此服务使用 SMB 协议提供文件共享和打印服务。另外,该服务负责资源锁定和验证连接用户。要对域成员进行身份验证,
smbd需要winbindd。smbsystemd 服务启动并停止smbd守护进程。要使用
smbd服务,请安装samba软件包。nmbd此服务通过 IPv4 协议使用 NetBIOS 提供主机名和 IP 解析。除了名字解析之外,
nmbd服务还支持浏览 SMB 网络来查找域、工作组、主机、文件共享和打印机。为此,服务可将此信息直接报告给广播客户端,或者将其转发到本地或主浏览器。nmbsystemd 服务启动并停止nmbd守护进程。请注意,现代 SMB 网络使用 DNS 来解析客户端和 IP 地址。对于 Kerberos,需要一个正常工作的 DNS 设置。
要使用
nmbd服务,请安装samba软件包。winbindd该服务为名字服务交换机(NSS)提供了一个接口,以便使用本地系统上的 AD 或 NT4 域用户和组。例如,这使域用户能够对在 Samba 服务器上托管的服务或其他本地服务进行身份验证。
winbindsystemd 服务启动并停止winbindd守护进程。如果将 Samba 设置为域成员,则必须在
smbd服务运行之前启动winbindd。否则,本地系统将无法使用域用户和组。要使用
winbindd服务,请安装samba-winbind软件包。重要红帽仅支持将 Samba 作为带有
winbindd服务的服务器运行,以便为本地系统提供域用户和组。由于某些限制,如缺少 Windows 访问控制列表(ACL)支持和 NT LAN Manager(NTLM)回退,目前不支持 SSSD。
3.1.2. Samba 安全服务 复制链接链接已复制到粘贴板!
/etc/samba/smb.conf文件中的[global]部分中的security参数管理 Samba 如何验证连接到该服务的用户的身份。根据您在其中安装 Samba 的模式,参数必须设为不同的值:
- 对于 AD 域成员,设置
security = ads 在这个模式中,Samba 使用 Kerberos 来验证 AD 用户。
有关将 Samba 设置为域成员的详情,请参考 将 Samba 设置为 AD 域成员服务器。
- 对于单独服务器,设置
security = user 在这个模式中,Samba 使用本地数据库验证连接用户。
有关将 Samba 设置为独立服务器的详情,请参考 将 Samba 设置为独立服务器。
- 对于NT4 PDC 或 BDC ,设置
security = user - 在此模式中,Samba 将用户身份验证到本地或 LDAP 数据库。
- 对于 NT4 域成员,设置
security = domain 在此模式中,Samba 将连接的用户验证到 NT4 PDC 或 BDC。您不能在 AD 域成员中使用这个模式。
有关将 Samba 设置为域成员的详情,请参考 将 Samba 设置为 AD 域成员服务器。
3.1.3. Samba 服务和 Samba 客户端工具加载并重新载入其配置的情况 复制链接链接已复制到粘贴板!
下面描述了 Samba 服务和工具加载并重新载入其配置:
Samba 服务在以下情况下重新载入其配置:
- 每 3 分钟自动进行
-
在手动请求时,例如运行
smbcontrol all reload-config命令。
- Samba 客户端实用程序仅在启动时读取其配置。
请注意,某些参数(如security )需要重启smb服务才能生效,而重新载入不足以生效。
3.1.4. 以安全的方式编辑 Samba 配置 复制链接链接已复制到粘贴板!
Samba 服务每 3 分钟自动重新载入其配置。要防止服务在您使用 testparm 工具验证配置前重新载入更改,您可以以安全的方式编辑 Samba 配置。
先决条件
- 已安装 Samba。
流程
创建
/etc/samba/smb.conf文件的副本:cp /etc/samba/smb.conf /etc/samba/samba.conf.copy
# cp /etc/samba/smb.conf /etc/samba/samba.conf.copyCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 编辑复制的文件,并进行必要的更改。
验证
/etc/samba/samba.conf.copy文件中的配置:testparm -s /etc/samba/samba.conf.copy
# testparm -s /etc/samba/samba.conf.copyCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果
testparm报告错误,请修复这些错误,然后再次运行该命令。使用新配置覆盖
/etc/samba/smb.conf文件:mv /etc/samba/samba.conf.copy /etc/samba/smb.conf
# mv /etc/samba/samba.conf.copy /etc/samba/smb.confCopy to Clipboard Copied! Toggle word wrap Toggle overflow 等待 Samba 服务自动重新载入其配置或手动重新载入配置:
smbcontrol all reload-config
# smbcontrol all reload-configCopy to Clipboard Copied! Toggle word wrap Toggle overflow
3.2. 使用 testparm 工具验证 smb.conf 文件 复制链接链接已复制到粘贴板!
testparm工具验证/etc/samba/smb.conf文件中的 Samba 配置是否正确。该工具不但检测无效的参数和值,还检测不正确的设置,如 ID 映射。如果testparm报告没有问题,Samba 服务将成功加载/etc/samba/smb.conf文件。请注意,testparm无法验证配置的服务是否可用或按预期工作。
红帽建议在每次修改此文件后,使用testparm来验证/etc/samba/smb.conf文件。
先决条件
- 已安装 Samba。
-
退出
/etc/samba/smb.conf文件。
流程
以
root用户身份运行testparm工具:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 前面的示例输出会报告不存在的参数以及不正确的 ID 映射配置。
-
如果
testparm报告了配置中不正确的参数、值或其他错误,请修复问题并再次运行该工具。
3.3. 将 Samba 设置为独立服务器 复制链接链接已复制到粘贴板!
您可以将 Samba 设置为不是域成员的服务器。在此安装模式中,Samb身份验证到本地数据库,而不是中央DC。另外,您可以启用客户机访问,允许用户在没有身份验证的情况下连接到一个或多个服务。
3.3.1. 为独立服务器设置服务器配置 复制链接链接已复制到粘贴板!
您可以为 Samba 独立服务器设置服务器配置。
流程
安装
samba软件包:yum install samba
# yum install sambaCopy to Clipboard Copied! Toggle word wrap Toggle overflow 编辑
/etc/samba/smb.conf文件并设置以下参数:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 此配置在
Example-learning工作组里定义了一个名为Server的独立服务器。此外,此配置启用了最小级别(1)的日志记录,日志文件将存储在/var/log/samba/目录中。Samba 将把日志文件参数中的%m宏扩展到连接客户端的 NetBIOS 名称。这可为每个客户端启用独立的日志文件。可选:配置文件或打印机共享。请参阅:
验证
/etc/samba/smb.conf文件:testparm
# testparmCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您设置了需要身份验证的共享,请创建用户帐户。
详情请参阅 创建和启用本地用户帐户。
打开所需的端口并使用
firewall-cmd工具重新载入防火墙配置:firewall-cmd --permanent --add-service=samba firewall-cmd --reload
# firewall-cmd --permanent --add-service=samba # firewall-cmd --reloadCopy to Clipboard Copied! Toggle word wrap Toggle overflow 启用并启动
smb服务:systemctl enable --now smb
# systemctl enable --now smbCopy to Clipboard Copied! Toggle word wrap Toggle overflow
3.3.2. 创建并启用本地用户帐户 复制链接链接已复制到粘贴板!
要让用户在连接到共享时进行身份验证,您必须在 Samba 主机上的操作系统和 Samba 数据库中创建帐户。Samba 要求操作系统帐户验证文件系统对象上的访问控制列表(ACL)和 Samba 帐户,来验证连接用户的身份。
如果您使用了passdb backend = tdbsam 默认设置,Samba 会将用户帐户存储在/var/lib/samba/private/passdb.tdb数据库中。
您可以创建一个名为 example 的本地 Samba 用户。
先决条件
- Samba 已安装,并配置为独立服务器。
流程
创建操作系统帐户:
useradd -M -s /sbin/nologin example
# useradd -M -s /sbin/nologin exampleCopy to Clipboard Copied! Toggle word wrap Toggle overflow 此命令添加了
example帐户,而不创建主目录如果帐户仅用于对 Samba 进行身份验证,请将/sbin/nologin命令指定为 shell,以防止帐户在本地登录。为操作系统帐户设置密码以启用它:
passwd example
# passwd example Enter new UNIX password: password Retype new UNIX password: password passwd: password updated successfullyCopy to Clipboard Copied! Toggle word wrap Toggle overflow Samba 不会使用操作系统帐户中的密码集进行身份验证。然而,您需要设置密码才能启用帐户。如果一个帐户被禁用,当这个用户连接时,Samba 会拒绝访问。
将用户添加到 Samba 数据库,并为帐户设置密码:
smbpasswd -a example
# smbpasswd -a example New SMB password: password Retype new SMB password: password Added user example.Copy to Clipboard Copied! Toggle word wrap Toggle overflow 当使用此帐户连接到 Samba 共享时,使用此密码进行验证。
启用 Samba 帐户:
smbpasswd -e example
# smbpasswd -e example Enabled user example.Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.4. 了解并配置 Samba ID 映射 复制链接链接已复制到粘贴板!
Windows 域通过唯一安全标识符(SID)来区分用户和组。但是,Linux 需要为每个用户和组群有唯一的 UID 和 GID。如果您以域成员身份运行 Samba,winbindd服务负责向操作系统提供域用户和组的信息。
要启用winbindd服务来向 Linux提供唯一的用户和组ID,您必须在/etc/samba/smb.conf文件中为以下情况配置 ID 映射:
- 本地数据库(默认域)
- Samba 服务器所属的 AD 或 NT4 域
- 每个用户必须能够访问这个 Samba 服务器上的资源的可信域
Samba 为特定配置提供不同的 ID 映射后端。最常用的后端是:
| 后端 | 使用案例 |
|---|---|
|
|
|
|
| 仅限 AD 域 |
|
| AD 和 NT4 域 |
|
|
AD、NT4 和 |
3.4.1. 规划 Samba ID 范围 复制链接链接已复制到粘贴板!
无论您在 AD 中是否存储了 Linux UID 和 GID,还是将 Samba 配置为生成它们,每个域配置都需要一个唯一的 ID 范围,其不得与任何其他域重叠。
如果您设置了重叠 ID 范围,Samba 无法正常工作。
例 3.1. 唯一的 ID 范围
以下显示了默认(*)、AD-DOM和TRUST-DOM域的非重叠 ID 映射范围。
每个域只能分配一个范围。因此,在域范围之间有足够的空间。这可让您在域扩展后扩展范围。
如果您稍后给某个域分配了一个不同的范围,那么之前由这些用户和组创建的文件和目录的所有权将会丢失。
3.4.2. * 默认域 复制链接链接已复制到粘贴板!
在域环境中,您可以为以下每个情况添加一个 ID 映射配置:
- Samba 服务器所属的域
- 每个可以访问 Samba 服务器的可信域
但是,对于所有其他对象,Samba 会从默认域分配 ID。这包括:
- 本地 Samba 用户和组
-
Samba 内置帐户和组,如
BUILTIN\Administrators
您必须按照描述配置默认域,以便使 Samba 正确运行。
默认域后端必须可写,才能永久存储分配的 ID。
对于默认域,您可以使用以下后端之一:
tdb当您将默认域配置为使用
tdb后端时,请设置一个足够大的 ID 范围,以包含将来要创建的对象,这些对象不属于已定义的域ID映射配置的一部分。例如,在
/etc/samba/smb.conf文件中的[global]部分中设置以下内容:idmap config * : backend = tdb idmap config * : range = 10000-999999
idmap config * : backend = tdb idmap config * : range = 10000-999999Copy to Clipboard Copied! Toggle word wrap Toggle overflow 详情请查看 使用 TDB ID 映射后端。
autorid当您将默认域配置为使用
autorid后端时,为域添加额外的 ID 映射配置是可选的。例如,在
/etc/samba/smb.conf文件中的[global]部分中设置以下内容:idmap config * : backend = autorid idmap config * : range = 10000-999999
idmap config * : backend = autorid idmap config * : range = 10000-999999Copy to Clipboard Copied! Toggle word wrap Toggle overflow 详情请查看 使用 autorid ID 映射后端。
3.4.3. 使用 tdb ID 映射后端 复制链接链接已复制到粘贴板!
winbindd服务默认使用可写的tdb ID 映射后端来存储安全标识符(SID)、UID 以及 GID 映射表。这包括本地用户、组和内置主体。
仅将此后端用于*默认域。例如:
idmap config * : backend = tdb idmap config * : range = 10000-999999
idmap config * : backend = tdb
idmap config * : range = 10000-999999
3.4.4. 使用 ad ID 映射后端 复制链接链接已复制到粘贴板!
您可以将 Samba AD 成员配置为使用 ad ID 映射后端。
ad ID 映射后端实现了一个只读 API,以便从 AD 读取帐户和组信息。它具有以下优点:
- 所有用户和组群设置都集中存储在 AD 中。
- 使用这个后端的所有 Samba 服务器中的用户和组群 ID 是一致的。
- ID 不会存储在本地数据库中(本地数据库可能会被损坏),因此文件所有者不会丢失。
ad ID 映射后端不支持具有单向信任的Active Directory域。如果您使用单向信任在 Active Directory 中配置域成员,请使用以下一种 ID 映射后端: tdb、delete 或 autorid。
后端从 AD 读取以下属性:
| AD 属性名称 | 对象类型 | 映射到 |
|---|---|---|
|
| 用户和组群 | 用户和组名称,取决于对象 |
|
| 用户 | 用户 ID(UID) |
|
| 组 | 组 ID(GID) |
|
| 用户 | 用户 shell 的路径 |
|
| 用户 | 用户主目录的路径 |
|
| 用户 | 主组群 ID |
[a]
如果您设置了 idmap config DOMAIN:unix_nss_info = yes,则 Samba 只读取这个属性。
[b]
如果您设置了 idmap config DOMAIN:unix_primary_group = yes,则 Samba 只读取这个属性。
| ||
先决条件
-
用户和组必须在 AD 中设置唯一的 ID,并且 ID 必须在
/etc/samba/smb.conf文件中配置的范围之内。其ID 不在范围之内的对象在 Samba 服务器上不可用。 - 用户和组必须在 AD 中设置所有必需的属性。如果缺少所需的属性,该用户或组将无法在 Samba 服务器中可用。所需的属性取决于您的配置。
- 已安装 Samba。
-
Samba 配置(除了ID 映射)位于
/etc/samba/smb.conf文件中。
流程
编辑
/etc/samba/smb.conf文件中的[global]部分:如果默认域(
*)不存在,请为其添加 ID 映射配置。例如:idmap config * : backend = tdb idmap config * : range = 10000-999999
idmap config * : backend = tdb idmap config * : range = 10000-999999Copy to Clipboard Copied! Toggle word wrap Toggle overflow 为 AD 域启用
adID 映射后端:idmap config DOMAIN : backend = ad
idmap config DOMAIN : backend = adCopy to Clipboard Copied! Toggle word wrap Toggle overflow 设置分配给 AD 域中用户和组的 ID 范围。例如:
idmap config DOMAIN : range = 2000000-2999999
idmap config DOMAIN : range = 2000000-2999999Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重要范围不得与这个服务器上的任何其他域配置重叠。此外,范围必须足够大,以便包含将来分配的所有 ID。详情请查看 规划 Samba ID 范围。
当从AD读取属性时,使用RFC 2307模式来设置 Samba:
idmap config DOMAIN : schema_mode = rfc2307
idmap config DOMAIN : schema_mode = rfc2307Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要让 Samba 从对应的 AD 属性读取登录 shell 和用户主目录的路径,请设置:
idmap config DOMAIN : unix_nss_info = yes
idmap config DOMAIN : unix_nss_info = yesCopy to Clipboard Copied! Toggle word wrap Toggle overflow 或者,您可以设置适用于所有用户的统一的域范围的主目录路径和登录 shell。例如:
template shell = /bin/bash template homedir = /home/%U
template shell = /bin/bash template homedir = /home/%UCopy to Clipboard Copied! Toggle word wrap Toggle overflow 默认情况下,Samba 使用用户对象的
primaryGroupID属性作为 Linux 上用户的主组。或者,您可以将 Samba 配置为使用gidNumber属性中设置的值:idmap config DOMAIN : unix_primary_group = yes
idmap config DOMAIN : unix_primary_group = yesCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
/etc/samba/smb.conf文件:testparm
# testparmCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重新载入 Samba 配置:
smbcontrol all reload-config
# smbcontrol all reload-configCopy to Clipboard Copied! Toggle word wrap Toggle overflow
3.4.5. 使用网格 ID 映射后端 复制链接链接已复制到粘贴板!
您可以将 Samba 域成员配置为使用 rid ID 映射后端。
Samba 可以使用 Windows SID 的相对标识符(RID),以便在 Red Hat Enterprise Linux 上生成 ID。
RID 是 SID 的最后部分。例如,如果用户的 SID 是S-1-5-21-5421822485-1151247151-421485315-30014,那么30014是对应的 RID。
ridID映射后端实施了一个只读 API,以便根据 AD 和 NT4 域的算法映射方案计算帐户和组信息。当配置后端时,您必须在 idmap config DOMAIN : range参数中设置最低和最高的 RID。Samba 不会映射比这个参数中设置低或更高 RID 的用户或组。
作为只读后端,rid无法分配新的ID,例如为BUILTIN组。因此,请勿将此后端用于 * 默认域。
使用网格后端的好处
- 所有在配置范围内具有 RID 的域用户和组都会自动在域成员中可用。
- 您不需要手动分配 ID、主目录和登录 shell。
使用网格后端的缺陷
- 所有域用户可以获得相同的登录 shell 和主目录。但是,您可以使用变量。
-
如果它们都使用具有相同ID范围设置的
rid后端,那么用户和组ID只在 Samba 域成员之间是相同的。 - 您不能阻止单独的用户或组在域成员中可用。只有超出配置范围以外的用户和组才会包括。
-
根据
winbindd服务用于计算 ID 的公式,如果不同域中的对象有相同的 RID,那么在多域环境中可能会有重复ID的事情发生 。
先决条件
- 您已安装了 Samba。
-
Samba 配置(除了ID 映射)位于
/etc/samba/smb.conf文件中。
流程
编辑
/etc/samba/smb.conf文件中的[global]部分:如果默认域(
*)不存在,请为其添加 ID 映射配置。例如:idmap config * : backend = tdb idmap config * : range = 10000-999999
idmap config * : backend = tdb idmap config * : range = 10000-999999Copy to Clipboard Copied! Toggle word wrap Toggle overflow 为域启用
ridID映射后端:idmap config DOMAIN : backend = rid
idmap config DOMAIN : backend = ridCopy to Clipboard Copied! Toggle word wrap Toggle overflow 设置一个足够大的范围,以包括将来将要分配的所有RID。例如:
idmap config DOMAIN : range = 2000000-2999999
idmap config DOMAIN : range = 2000000-2999999Copy to Clipboard Copied! Toggle word wrap Toggle overflow Samba 会忽略此域中其RID不在范围内的用户和组。
重要范围不得与这个服务器上的任何其他域配置重叠。此外,范围必须足够大,以便包含将来分配的所有 ID。详情请查看 规划 Samba ID 范围。
设置分配给所有映射用户的 shell 和主目录路径。例如:
template shell = /bin/bash template homedir = /home/%U
template shell = /bin/bash template homedir = /home/%UCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
/etc/samba/smb.conf文件:testparm
# testparmCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重新载入 Samba 配置:
smbcontrol all reload-config
# smbcontrol all reload-configCopy to Clipboard Copied! Toggle word wrap Toggle overflow
3.4.6. 使用自动 ID 映射后端 复制链接链接已复制到粘贴板!
您可以将 Samba 域成员配置为使用 autorid ID 映射后端。
autorid后端的工作方式与ridID 映射后端类似,但可以为不同的域自动分配 ID。这可让您在以下情况下使用autorid后端:
-
仅用于
*默认域 -
对于
*默认域和附加域,不需要为每个附加域创建 ID 映射配置 - 只适用于特定域
如果您对默认域使用autorid,为域添加额外的 ID 映射配置是可选的。
本节的部分内容来自在 Samba Wiki 中发布的 idmap config autorid 文档。许可证: CC BY 4.0。作者和贡献者:请参阅 Wiki页面上的历史选项卡。
使用自动扩展后端的好处
- 所有在配置范围内计算 UID 和 GID 的域用户和组都会在域成员中自动可用。
- 您不需要手动分配 ID、主目录和登录 shell。
- 没有重复的 ID,即使多域环境中的多个对象有相同的 RID。
缺陷
- 在 Samba 域成员中用户和组群 ID 不相同。
- 所有域用户可以获得相同的登录 shell 和主目录。但是,您可以使用变量。
- 您不能阻止单独的用户或组在域成员中可用。只有计算 UID 或 GID 不在配置范围内的用户和组才会包括。
先决条件
- 您已安装了 Samba。
-
Samba 配置(除了ID 映射)位于
/etc/samba/smb.conf文件中。
流程
编辑
/etc/samba/smb.conf文件中的[global]部分:为
*默认域启用autoridID映射后端:idmap config * : backend = autorid
idmap config * : backend = autoridCopy to Clipboard Copied! Toggle word wrap Toggle overflow 设置一个足够大的范围来为所有现有和将来的对象分配 ID。例如:
idmap config * : range = 10000-999999
idmap config * : range = 10000-999999Copy to Clipboard Copied! Toggle word wrap Toggle overflow Samba 忽略在此域中计算 ID 不在范围范围内的用户和组。
警告设置范围并开始使用 Samba 后,您只能增加范围的上限。对范围的任何其他变化都可能会导致分配新的 ID,从而会丢失文件的所有者信息。
可选:设置范围大小。例如:
idmap config * : rangesize = 200000
idmap config * : rangesize = 200000Copy to Clipboard Copied! Toggle word wrap Toggle overflow Samba 会为每个域的对象分配这个连续的ID号,直到
idmap config * : range参数中设置的范围内的所有ID分配完。注意如果设置了 rangesize,则需要相应地调整 range。range 必须是 rangesize 的倍数。
设置分配给所有映射用户的 shell 和主目录路径。例如:
template shell = /bin/bash template homedir = /home/%U
template shell = /bin/bash template homedir = /home/%UCopy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:为域添加额外的 ID 映射配置。如果没有针对单个域的配置,Samba 则使用之前配置的
*默认域中的autorid后端设置来计算 ID。重要范围不得与这个服务器上的任何其他域配置重叠。此外,范围必须足够大,以便包含将来分配的所有 ID。详情请查看 规划 Samba ID 范围。
验证
/etc/samba/smb.conf文件:testparm
# testparmCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重新载入 Samba 配置:
smbcontrol all reload-config
# smbcontrol all reload-configCopy to Clipboard Copied! Toggle word wrap Toggle overflow
3.5. 将 Samba 设置为 AD 域成员服务器 复制链接链接已复制到粘贴板!
如果您正在运行 AD 或 NT4 域,请使用 Samba 将 Red Hat Enterprise Linux 服务器添加为域的成员,以便可以:
- 访问其他域成员上的域资源
-
对本地服务(如
sshd)验证域用户 - 托管在服务器上的共享目录和打印机,以充当文件和打印服务器
3.5.1. 将 RHEL 系统添加到 AD 域中 复制链接链接已复制到粘贴板!
Samba Winbind 是系统安全服务守护进程(SSSD)的替代方案,用于将 Red Hat Enterprise Linux(RHEL)系统与活动目录(AD)进行连接。您可以使用 realmd 将 RHEL 系统加入到 AD 域来配置 Samba Winbind 。
先决条件
- 主机使用 DNS 服务器来解析 AD 域。
- 主机上的时间与 AD 中的时间同步,时区设置是正确的。
流程
如果您的 AD 需要弃用的 RC4 加密类型进行 Kerberos 验证,请在 RHEL 中启用对这些密码的支持:
update-crypto-policies --set DEFAULT:AD-SUPPORT
# update-crypto-policies --set DEFAULT:AD-SUPPORTCopy to Clipboard Copied! Toggle word wrap Toggle overflow 安装以下软件包:
yum install realmd oddjob-mkhomedir oddjob samba-winbind-clients \ samba-winbind samba-common-tools samba-winbind-krb5-locator krb5-workstation# yum install realmd oddjob-mkhomedir oddjob samba-winbind-clients \ samba-winbind samba-common-tools samba-winbind-krb5-locator krb5-workstationCopy to Clipboard Copied! Toggle word wrap Toggle overflow 要在域成员中共享目录或打印机,请安装
samba软件包:yum install samba
# yum install sambaCopy to Clipboard Copied! Toggle word wrap Toggle overflow 备份现有的
/etc/samba/smb.confSamba 配置文件:mv /etc/samba/smb.conf /etc/samba/smb.conf.bak
# mv /etc/samba/smb.conf /etc/samba/smb.conf.bakCopy to Clipboard Copied! Toggle word wrap Toggle overflow 加入域。例如,要加入名为
ad.example.com的域:realm join --membership-software=samba --client-software=winbind ad.example.com
# realm join --membership-software=samba --client-software=winbind ad.example.comCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用上面的命令,
realm工具会自动:-
为
ad.example.com域中的成员创建/etc/samba/smb.conf文件 -
将用于用户和组查找的
winbind模块添加到/etc/nsswitch.conf文件中 -
更新
/etc/pam.d/目录中的可插拔验证模块(PAM)配置文件 -
启动
winbind服务,并使服务在系统引导时启动
-
为
可选:在
/etc/samba/smb.conf文件中设置备用的 ID 映射后端或自定义 ID 映射设置。详情请参阅 了解并配置 Samba ID 映射。
验证
winbind服务是否运行:systemctl status winbind
# systemctl status winbind ... Active: active (running) since Tue 2018-11-06 19:10:40 CET; 15s agoCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重要要启用 Samba 来查询域用户和组信息,必须在启动
smb之前运行winbind服务。如果您安装了
samba软件包来共享目录和打印机,请启用并启动smb服务:systemctl enable --now smb
# systemctl enable --now smbCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
如果您要向活动目录验证本地登录,请启用
winbind_krb5_localauth插件。请参阅 对 MIT Kerberos 使用本地授权插件。
验证
显示 AD 用户的详情,如 AD 域中的 AD 管理员帐户:
getent passwd "AD\administrator"
# getent passwd "AD\administrator" AD\administrator:*:10000:10000::/home/administrator@AD:/bin/bashCopy to Clipboard Copied! Toggle word wrap Toggle overflow 查询 AD 域中的域用户组成员:
getent group "AD\Domain Users"
# getent group "AD\Domain Users" AD\domain users:x:10000:user1,user2Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:验证在对文件和目录设置权限时,您是否可以使用域用户和组。例如,将
/srv/samba/example.txt文件的所有者设置为AD\administrator,组设置为AD\Domain Users:chown "AD\administrator":"AD\Domain Users" /srv/samba/example.txt
# chown "AD\administrator":"AD\Domain Users" /srv/samba/example.txtCopy to Clipboard Copied! Toggle word wrap Toggle overflow 验证 Kerberos 验证是否如预期正常工作:
对于 AD 域成员,为
administrator@AD.EXAMPLE.COM主体获取一个ticket:kinit administrator@AD.EXAMPLE.COM
# kinit administrator@AD.EXAMPLE.COMCopy to Clipboard Copied! Toggle word wrap Toggle overflow 显示缓存的 Kerberos ticket:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
显示可用域:
wbinfo --all-domains
# wbinfo --all-domains BUILTIN SAMBA-SERVER ADCopy to Clipboard Copied! Toggle word wrap Toggle overflow
3.5.2. 使用 MIT Kerberos 的本地授权插件 复制链接链接已复制到粘贴板!
winbind服务向域成员提供Active Directory用户。在某些情况下,管理员希望域用户能够对域成员上运行的本地服务(如SSH服务器)启用身份验证。当使用 Kerberos 来验证域用户时,启用winbind_krb5_localauth插件,通过winbind 服务将 Kerberos 主体正确映射到Active Directory帐户。
例如,如果Active Directory用户的sAMAccountName属性设置为EXAMPLE,并且用户尝试使用小写的用户名进行日志记录,Kerberos将返回大写的用户名。因此,条目不匹配,身份验证失败。
使用winbind_krb5_localauth插件时,帐户名称会被正确映射。请注意,这只适用于 GSSAPI 身份验证,不适用于获取初始票据授权票据(TGT)。
先决条件
- Samba 配置为 Active Directory 的成员。
- Red Hat Enterprise Linux 对 Active Directory 进行身份验证。
-
winbind服务在运行。
流程
编辑/etc/krb5.conf文件,并添加以下部分:
[plugins]
localauth = {
module = winbind:/usr/lib64/samba/krb5/winbind_krb5_localauth.so
enable_only = winbind
}
[plugins]
localauth = {
module = winbind:/usr/lib64/samba/krb5/winbind_krb5_localauth.so
enable_only = winbind
}
3.6. 在 IdM 域成员中设置 Samba 复制链接链接已复制到粘贴板!
您可以在加入到 Red Hat Identity Management (IdM)域的主机上设置 Samba。来自IdM的用户,以及来自受信任的 Active Directory(AD)域的用户(如果有的话)可以访问 Samba 提供的共享和打印机服务。
对 IdM 域成员使用 Samba 是一种不受支持的技术预览特性,且包含了某些限制。例如,IdM 信任控制器不支持活动目录全局目录服务,并且不支持使用分布式计算环境/远程过程调用(DCE/RPC)协议解析 IdM 组。因此,AD 用户在登录到其他 IdM 客户端时只能访问托管在 IdM 客户端上的 Samba 共享和打印机;登录到 Windows 机器的 AD 用户无法访问托管在 IdM 域成员上的 Samba 共享。
我们鼓励在 IdM 域成员中部署 Samba 的用户向红帽提供反馈意见。
如果 AD 域中的用户需要访问 Samba 提供的共享和打印机服务,请确保在 AD 中启用了 AES 加密类型。如需更多信息,请参阅 使用 GPO 在活动目录中启用 AES 加密类型。
先决条件
- 主机作为 IdM 域的客户端加入。
- IdM 服务器和客户端必须在 RHEL 8.1 或更高版本中运行。
3.6.1. 准备 IdM 域以便在域成员中安装 Samba 复制链接链接已复制到粘贴板!
在IdM客户端上设置Samba之前,必须在IdM服务器上使用ipa-adtrust-install工具来准备IdM域。
运行ipa-adtrust-install命令的任何系统都会自动成为 AD 信任控制器。但是,您只能在 IdM 服务器上运行ipa-adtrust-install一次。
先决条件
- IdM 服务器已安装。
- 您有 root 特权来安装软件包和重启 IdM 服务。
流程
安装所需的软件包:
yum install ipa-server-trust-ad samba-client
[root@ipaserver ~]# yum install ipa-server-trust-ad samba-clientCopy to Clipboard Copied! Toggle word wrap Toggle overflow 以 IdM 管理用户身份进行身份验证:
kinit admin
[root@ipaserver ~]# kinit adminCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行
ipa-adtrust-install工具:ipa-adtrust-install
[root@ipaserver ~]# ipa-adtrust-installCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果 IdM 安装了集成的 DNS 服务器,则会自动创建 DNS 服务记录。
如果您安装的IdM没有集成 DNS 服务器,
ipa-adtrust-install会打印一个服务记录列表,您必须手动将其添加到DNS后才能继续操作。该脚本会提示您
/etc/samba/smb.conf已存在,并将被重写:WARNING: The smb.conf already exists. Running ipa-adtrust-install will break your existing Samba configuration. Do you wish to continue? [no]: yes
WARNING: The smb.conf already exists. Running ipa-adtrust-install will break your existing Samba configuration. Do you wish to continue? [no]: yesCopy to Clipboard Copied! Toggle word wrap Toggle overflow 该脚本提示您配置
slapi-nis插件,这是一个兼容性插件,允许旧的 Linux 客户端与受信任的用户一起工作:Do you want to enable support for trusted domains in Schema Compatibility plugin? This will allow clients older than SSSD 1.9 and non-Linux clients to work with trusted users. Enable trusted domains support in slapi-nis? [no]: yes
Do you want to enable support for trusted domains in Schema Compatibility plugin? This will allow clients older than SSSD 1.9 and non-Linux clients to work with trusted users. Enable trusted domains support in slapi-nis? [no]: yesCopy to Clipboard Copied! Toggle word wrap Toggle overflow 提示时,输入 IdM 域的 NetBIOS 名称,或者按 Enter 接受推荐的名称:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 系统会提示您运行 SID 生成任务,以便为任何现有用户创建 SID:
Do you want to run the ipa-sidgen task? [no]: yes
Do you want to run the ipa-sidgen task? [no]: yesCopy to Clipboard Copied! Toggle word wrap Toggle overflow 这是一个资源密集型任务,因此如果您有大量的用户,您可以在其他时间运行此任务。
可选:默认情况下,对于 Windows Server 2008 及更高版本,动态 RPC 端口范围定义为
49152-65535。如果您需要为您的环境定义不同的动态 RPC 端口范围,请将 Samba 配置为使用不同的端口,并在防火墙设置中开放这些端口。以下示例将端口范围设置为55000-65000。net conf setparm global 'rpc server dynamic port range' 55000-65000 firewall-cmd --add-port=55000-65000/tcp firewall-cmd --runtime-to-permanent
[root@ipaserver ~]# net conf setparm global 'rpc server dynamic port range' 55000-65000 [root@ipaserver ~]# firewall-cmd --add-port=55000-65000/tcp [root@ipaserver ~]# firewall-cmd --runtime-to-permanentCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重启
ipa服务:ipactl restart
[root@ipaserver ~]# ipactl restartCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
smbclient工具来验证 Samba 是否响应 IdM 端的 Kerberos 身份验证:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.6.2. 在 IdM 客户端中安装和配置 Samba 服务器 复制链接链接已复制到粘贴板!
您可以在 IdM 域中注册的客户端上安装和配置 Samba。
先决条件
- IdM 服务器和客户端必须在 RHEL 8.1 或更高版本中运行。
- 已准备好 IdM 域,如 为在域成员上安装 Samba 准备 IdM 域 中所述。
- 如果 IdM 具有配置了 AD 的信任,请为 Kerberos 启用 AES 加密类型。例如,使用组策略对象(GPO)来启用 AES 加密类型。详情请参阅 使用 GPO 在活动目录中启用 AES 加密。
流程
安装
ipa-client-samba软件包:yum install ipa-client-samba
[root@idm_client]# yum install ipa-client-sambaCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
ipa-client-samba工具准备客户端并创建初始 Samba 配置:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 默认情况下,
ipa-client-samba会自动将[homes]部分添加到/etc/samba/smb.conf文件中,该文件在用户连接时动态共享用户的主目录。如果用户在这个服务器上没有主目录,或者您不想共享主目录,请从/etc/samba/smb.conf中删除以下行:[homes] read only = no[homes] read only = noCopy to Clipboard Copied! Toggle word wrap Toggle overflow 共享目录和打印机。详情请查看:
在本地防火墙中打开 Samba 客户端所需的端口:
firewall-cmd --permanent --add-service=samba-client firewall-cmd --reload
[root@idm_client]# firewall-cmd --permanent --add-service=samba-client [root@idm_client]# firewall-cmd --reloadCopy to Clipboard Copied! Toggle word wrap Toggle overflow 启用并启动
smb和winbind服务:systemctl enable --now smb winbind
[root@idm_client]# systemctl enable --now smb winbindCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
在安装了 samba-client 软件包的不同 IdM 域成员上运行以下验证步骤:
使用 Kerberos 身份验证列出 Samba 服务器中的共享:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.6.3. 如果 IdM 信任新域,请手动添加 ID 映射配置 复制链接链接已复制到粘贴板!
Samba 需要一个 ID 映射配置,用户可从该域访问资源。在 IdM 客户端上运行的现有 Samba 服务器上,在管理员向 Active Directory(AD)域添加了新的信任后,您必须手动添加 ID 映射配置。
先决条件
- 您在 IdM 客户端中配置了 Samba。之后,IdM 增加了一个新的信任。
- 在可信 AD 域中必须禁用 Kerberos 的 DES 和 RC4 加密类型。为了安全起见,RHEL 8 不支持这些弱加密类型。
流程
使用主机的 keytab 进行身份验证:
kinit -k
[root@idm_client]# kinit -kCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
ipa idrange-find命令来显示新域的基本 ID 和 ID 范围大小。例如,以下命令显示了ad.example.com域的值:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在后续步骤中,您需要
ipabaseid和ipaidrangesize属性的值。要计算可用最高的 ID,请使用以下公式:
maximum_range = ipabaseid + ipaidrangesize - 1
maximum_range = ipabaseid + ipaidrangesize - 1Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用上一步中的值,
ad.example.com域的最大可用 ID 是1918599999(1918400000 + 200000 - 1)。编辑
/etc/samba/smb.conf文件,并将域的 ID 映射配置添加到[global]部分:idmap config AD : range = 1918400000 - 1918599999 idmap config AD : backend = sss
idmap config AD : range = 1918400000 - 1918599999 idmap config AD : backend = sssCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将
ipabaseid属性的值指定为最小值,将上一步中的计算值指定为该范围的最大值。重启
smb和winbind服务:systemctl restart smb winbind
[root@idm_client]# systemctl restart smb winbindCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
使用 Kerberos 身份验证列出 Samba 服务器中的共享:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.13. 为 macOS 客户端配置 Samba 复制链接链接已复制到粘贴板!
fruit 虚拟文件系统(VFS)Samba 模块提供了与 Apple 服务器消息块(SMB)客户端增强了的兼容性。
3.15. 将 Samba 设置为打印服务器 复制链接链接已复制到粘贴板!
如果您将 Samba 设置为打印服务器,那么网络中的客户端可以使用 Samba 进行打印。此外,如果进行了配置, Windows 客户端可以从 Samba 服务器下载驱动程序。
本节的部分内容摘自在 Samba Wiki 中发布的将Samba设置为打印服务器文档。许可证: CC BY 4.0。作者和贡献者:请参阅 Wiki 页面上的历史选项卡。
先决条件
Samba 采用以下模式之一设置:
3.15.1. 在 Samba 中启用打印服务器支持 复制链接链接已复制到粘贴板!
默认情况下,在 Samba 中不启用打印服务器支持。要将 Samba 用作打印服务器,您必须相应地配置 Samba。
打印作业和打印机操作需要远程过程调用(RPC)。默认情况下,Samba 根据需要启动 rpcd_spools 服务来管理 RPC。在第一个 RPC 调用过程中,或者当您更新 CUPS 中的打印机列表时,Samba 会从 CUPS 检索打印机信息。每个打印机可能需要 1 秒。因此,如果您有超过 50 个打印机,请调优 rpcd_spools 设置。
先决条件
打印机是在 CUPS 服务器中配置的。
有关在 CUPS 中配置打印机的详情,请查看打印服务器上 CUPS Web 控制台(https://printserver:631/help)中提供的文档。
流程
编辑
/etc/samba/smb.conf文件:添加
[printers]部分,以在 Samba 中启用打印后端:[printers] comment = All Printers path = /var/tmp/ printable = yes create mask = 0600[printers] comment = All Printers path = /var/tmp/ printable = yes create mask = 0600Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重要[printers]共享名称是写死的,不能更改。如果 CUPS 服务器运行在不同的主机或端口,请在
[printers]部分中指定设置:cups server = printserver.example.com:631
cups server = printserver.example.com:631Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您有许多打印机,将空闲秒数设置为高于连接到 CUPS 的打印机数。例如,如果您有 100 台打印机,请在
[global]部分中设置:rpcd_spoolss:idle_seconds = 200
rpcd_spoolss:idle_seconds = 200Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果这个设置在您的环境中没有缩放,请在
[global]部分中增加rpcd_spoolsworker 的数量:rpcd_spoolss:num_workers = 10
rpcd_spoolss:num_workers = 10Copy to Clipboard Copied! Toggle word wrap Toggle overflow 默认情况下,
rpcd_spools启动 5 个 worker。
验证
/etc/samba/smb.conf文件:testparm
# testparmCopy to Clipboard Copied! Toggle word wrap Toggle overflow 打开所需的端口,并使用
firewall-cmd工具重新加载防火墙配置:firewall-cmd --permanent --add-service=samba firewall-cmd --reload
# firewall-cmd --permanent --add-service=samba # firewall-cmd --reloadCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重启
smb服务:systemctl restart smb
# systemctl restart smbCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重启服务后,Samba 会自动共享在 CUPS 后端中配置的所有打印机。如果想要仅手动共享特定打印机,请参阅 手动共享特定的打印机。
验证
提交打印作业。例如,要打印 PDF 文件,请输入:
smbclient -Uuser //sambaserver.example.com/printer_name -c "print example.pdf"
# smbclient -Uuser //sambaserver.example.com/printer_name -c "print example.pdf"Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.15.2. 手动共享特定的打印机 复制链接链接已复制到粘贴板!
如果您将 Samba 配置为打印服务器,默认情况下,Samba 会共享在 CUPS 后端中配置的所有打印机。以下流程解释了如何只共享特定的打印机。
先决条件
- Samba 被设置为打印服务器
流程
编辑
/etc/samba/smb.conf文件:在
[global]部分中,通过以下设置禁用自动打印机共享:load printers = no
load printers = noCopy to Clipboard Copied! Toggle word wrap Toggle overflow 为您要共享的每个打印机添加一段。例如,要在 Samba 中将 CUPS 后端中名为
example的打印机共享为Example-Printer,请添加以下部分:[Example-Printer] path = /var/tmp/ printable = yes printer name = example[Example-Printer] path = /var/tmp/ printable = yes printer name = exampleCopy to Clipboard Copied! Toggle word wrap Toggle overflow 您不需要为每个打印机单独设置 spool 目录。您可以在打印机的
path参数中设置与您在[printers]部分中设置的完全相同的 spool 目录。
验证
/etc/samba/smb.conf文件:testparm
# testparmCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重新载入 Samba 配置:
smbcontrol all reload-config
# smbcontrol all reload-configCopy to Clipboard Copied! Toggle word wrap Toggle overflow
3.16. 在 Samba 打印服务器中为 Windows 客户端设置自动打印机驱动程序下载 复制链接链接已复制到粘贴板!
如果您在为 Windows 客户端运行 Samba 打印服务器,你可以上传驱动程序并预配置打印机。如果用户连接到打印机,Windows 会自动在客户端本地下载并安装驱动程序。用户不需要本地管理员权限进行安装。另外,Windows 应用预配置的驱动程序设置,如纸匣的数量。
本节的部分内容摘自 Samba Wiki 上发布的为 Windows 客户端设置自动打印机驱动程序下载文档。许可证: CC BY 4.0。作者和贡献者:请参阅 Wiki 页面上的历史选项卡。
先决条件
- Samba 被设置为打印服务器
3.16.1. 有关打印机驱动程序的基本信息 复制链接链接已复制到粘贴板!
本节提供有关打印机驱动程序的一般信息。
支持的驱动程序模型版本
Samba 只支持 Windows 2000 及更高版本支持的,以及 Windows Server 2000 及更高版本支持的打印机驱动程序模型版本 3。Samba 不支持 Windows 8 和 Windows Server 2012 中引入的驱动程序模型版本 4。但是,这些及之后的 Windows 版本也支持版本 3 驱动程序。
包感知驱动程序
Samba 不支持包感知驱动程序。
准备上传的打印机驱动程序
在您将驱动程序上传到 Samba 打印服务器之前:
- 如果驱动程序采用压缩格式提供,请解包它。
有些驱动程序需要启动一个设置应用程序,以便在 Windows 主机上本地安装驱动程序。在某些情况下,安装程序会在设置运行期间将单个文件提取到操作系统的临时文件夹中。使用驱动程序文件上传:
- 启动安装程序。
- 将临时文件夹中的文件复制到新位置。
- 取消安装。
请您的打印机厂商提供支持上传到打印服务器的驱动程序。
为客户端提供 32 位和 64 位驱动
要为 32 位和 64 位 Windows 客户端提供打印机的驱动程序,您必须上传两个架构具有完全相同名称的驱动程序。例如,如果您上传名为Example PostScript的 32 位驱动程序和名为Example PostScript (v1.0) 的 64 位驱动程序,则名称不匹配。因此,您只能为打印机分配其中一个驱动程序,且该驱动程序无法对这两个架构都适用。
3.16.2. 启用用户上传和预配置驱动程序 复制链接链接已复制到粘贴板!
要上传和预配置打印机驱动程序,用户或组需要被赋予 SePrintOperatorPrivilege 特权。用户必须被添加到 printadmin 组中。在安装 samba 软件包时,Red Hat Enterprise Linux 会自动创建这个组。printadmin 组被分配了低于 1000 的最小可用动态系统 GID。
流程
例如,要对
printadmin组赋予SePrintOperatorPrivilege特权:net rpc rights grant "printadmin" SePrintOperatorPrivilege -U "DOMAIN\administrator"
# net rpc rights grant "printadmin" SePrintOperatorPrivilege -U "DOMAIN\administrator" Enter DOMAIN\administrator's password: Successfully granted rights.Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意在域环境中,将
SePrintOperatorPrivilege赋予域组。这可让您通过更新用户的组成员资格来集中管理特权。列出所有被赋予了
SePrintOperatorPrivilege的用户和组:net rpc rights list privileges SePrintOperatorPrivilege -U "DOMAIN\administrator"
# net rpc rights list privileges SePrintOperatorPrivilege -U "DOMAIN\administrator" Enter administrator's password: SePrintOperatorPrivilege: BUILTIN\Administrators DOMAIN\printadminCopy to Clipboard Copied! Toggle word wrap Toggle overflow
3.16.4. 创建 GPO 以启用客户端信任 Samba 打印服务器 复制链接链接已复制到粘贴板!
出于安全考虑,最近的 Windows 操作系统会阻止客户端从不受信任的服务器下载非包感知的打印机驱动程序。如果您的打印服务器是 AD 中的成员,您可以在域中创建一个组策略对象(GPO)来信任 Samba 服务器。
先决条件
- Samba 打印服务器是 AD 域的成员。
- 您用来创建 GPO 的 Windows 计算机必须安装有 Windows 远程服务器管理工具(RSAT)。详情请查看 Windows 文档。
流程
-
使用允许编辑组策略的帐户(如 AD 域
Administrator用户)登录到 Windows 计算机。 -
打开
组策略管理控制台。 右键单击 AD 域并选择
创建此域中的 GPO,并链接到此处。-
为 GPO 输入一个名称,如
Legacy Printer Driver Policy,并点击OK。新的 GPO 将在域条目下显示。 -
右键单击新创建的 GPO,然后选择
编辑以打开组策略管理编辑器。 进入 → → → 。
在窗口的右侧,双击
指向和打印限制来编辑策略:启用策略并设置以下选项:
-
选择
用户只能指向并打印到这些服务器,再将 Samba 打印服务器的完全限定域名(FQDN)输入到此选项旁边的字段。 在
安全提示下的两个复选框中,选择不显示警告 或 高程提示。
-
选择
- 点击确定。
双击
包指向和打印 - 已批准的服务器来编辑策略:-
启用策略并单击
显示按钮。 输入 Samba 打印服务器的 FQDN。
-
单击
OK,关闭显示内容和策略的属性窗口。
-
启用策略并单击
-
关闭
组策略管理编辑器。 -
关闭
组策略管理控制台。
在 Windows 域成员应用了组策略后,用户连接到打印机时会自动从 Samba 服务器下载打印机驱动程序。
3.16.5. 上传驱动程序和预配置打印机 复制链接链接已复制到粘贴板!
在 Windows 客户端使用 打印管理 应用程序上传托管在 Samba 打印服务器上的驱动程序和预配置打印机。详情请查看 Windows 文档。
3.17. 在启用了 FIPS 模式的服务器上运行 Samba 复制链接链接已复制到粘贴板!
本节概述了在启用了 FIPS 模式的情况下运行 Samba 的限制。还提供了在运行 Samba 的 Red Hat Enterprise Linux 主机上启用 FIPS 模式的流程。
3.17.1. 在 FIPS 模式中使用 Samba 的限制 复制链接链接已复制到粘贴板!
在指定条件下,以下 Samba 模式和功能在 FIPS 模式下工作:
- Samba 仅在活动目录(AD)或带有使用 AES 密码的 Kerberos 身份验证的 Red Hat Enterprise Linux 身份管理(IdM)环境中作为域成员。
- Samba 作为 Active Directory 域成员上的文件服务器。但是,这需要客户端使用 Kerberos 向服务器进行身份验证。
由于 FIPS 的安全性增强,如果启用了 FIPS 模式,以下 Samba 特性和模式将无法正常工作:
- NT LAN Manager(NTLM)验证,因为 RC4 密码已被阻止
- 服务器消息块版本 1(SMB1)协议
- 独立文件服务器模式,因为它使用了 NTLM 身份验证
- NT4 风格的域控制器
- NT4 风格的域成员.请注意,红帽继续支持后台使用的主域控制器(PDC)功能 IdM。
- 针对Samba 服务器的密码修改.您只能对 Active Directory 域控制器使用 Kerberos 进行密码修改。
以下特性没有在 FIPS 模式下测试,因此红帽不支持:
- 将 Samba 作为打印服务器来运行
3.17.2. 在 FIPS 模式下使用 Samba 复制链接链接已复制到粘贴板!
您可以在运行 Samba 的 RHEL 主机上启用 FIPS 模式。
先决条件
- 在 Red Hat Enterprise Linux 主机上配置了Samba 。
- Samba 以 FIPS 模式支持的模式运行。
流程
在 RHEL 中启用 FIPS 模式:
fips-mode-setup --enable
# fips-mode-setup --enableCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重启服务器:
reboot
# rebootCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
testparm工具来验证配置:testparm -s
# testparm -sCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果命令显示任何错误或不兼容,请修复它们以确保 Samba 正常工作。
3.18. 调整 Samba 服务器的性能 复制链接链接已复制到粘贴板!
了解在某些情况下,哪些设置可以提高 Samba 的性能,以及哪些设置可能会对性能有负面影响。
本节的部分内容来自在 Samba Wiki 中发布的 Performance Tuning 文档。许可证: CC BY 4.0。作者和贡献者:请参阅 Wiki 页面上的历史选项卡。
先决条件
- Samba 被设置为文件或打印服务器
3.18.1. 设置 SMB 协议版本 复制链接链接已复制到粘贴板!
每个新的 SMB 版本都添加了特性并提高了协议的性能。最新的 Windows 和 Windows 服务器操作系统始终支持最新的协议版本。如果 Samba 也使用最新的协议版本,那么连接到 Samba 的 Windows 客户端将从性能改进中受益。在 Samba 中,server max protocol的默认值被设置为最新支持的稳定的 SMB 协议版本。
要始终拥有最新的稳定的 SMB 协议版本,请不要设置 server max protocol 参数。如果手动设置参数,则需要修改 SMB 协议的每个新版本的设置,以便启用最新的协议版本。
以下流程解释了如何对 server max protocol 参数使用默认值。
流程
-
从
/etc/samba/smb.conf文件的[global]部分中删除server max protocol参数。 重新载入 Samba 配置
smbcontrol all reload-config
# smbcontrol all reload-configCopy to Clipboard Copied! Toggle word wrap Toggle overflow
3.18.3. 可能会对性能造成负面影响的设置 复制链接链接已复制到粘贴板!
默认情况下,Red Hat Enterprise Linux 中的内核会根据高网络性能进行了微调。例如,内核对缓冲区大小使用自动轮询机制。在 /etc/samba/smb.conf 文件中设置 socket options 参数会覆盖这些内核设置。因此,设置此参数会在大多数情况下降低 Samba 网络性能。
要使用内核的优化的设置,请从 /etc/samba/smb.conf 中的 [global] 部分删除 socket options 参数。
3.19. 将 Samba 配置为与需要 SMB 版本低于默认版本的客户端兼容 复制链接链接已复制到粘贴板!
Samba 对它支持的最小服务器消息块(SMB)版本使用合理的安全默认值。但是,如果您的客户端需要较旧的 SMB 版本,您可以配置 Samba 来支持它。
3.19.1. 设置 Samba 服务器支持的最小 SMB 协议版本 复制链接链接已复制到粘贴板!
在 Samba 中,/etc/samba/smb.conf 文件中的 server min protocol 参数定义了 Samba 服务器支持的最小服务器消息块(SMB)协议版本。您可以更改最小 SMB 协议版本。
默认情况下,RHEL 8.2 及之后版本上的 Samba 只支持 SMB2 和更新的协议版本。红帽建议不要使用已弃用的 SMB1 协议。但是,如果您的环境需要 SMB1,您可以手动将 server min protocol 参数设置为 NT1 来重新启用 SMB1。
先决条件
- 已安装并配置 Samba。
流程
编辑
/etc/samba/smb.conf文件,添加server min protocol参数,并将参数设置为服务器应支持的最小 SMB 协议版本。例如,要将 SMB 协议的最小版本设置为SMB3,请添加:server min protocol = SMB3
server min protocol = SMB3Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重启
smb服务:systemctl restart smb
# systemctl restart smbCopy to Clipboard Copied! Toggle word wrap Toggle overflow
3.20. 经常使用 Samba 命令行工具 复制链接链接已复制到粘贴板!
本章论述了使用 Samba 服务器时经常使用的命令。
3.20.1. 使用 net ads join 和 net rpc join 命令 复制链接链接已复制到粘贴板!
使用 net 工具的 join 子命令,您可以将 Samba 加入到 AD 或 NT4 域。要加入域,您必须手动创建 /etc/samba/smb.conf 文件,并有选择地更新其他配置,如 PAM。
红帽建议使用 realm 工具来加入域。realm 工具自动更新所有涉及的配置文件。
流程
使用以下设置手动创建
/etc/samba/smb.conf文件:对于 AD 域成员:
[global] workgroup = domain_name security = ads passdb backend = tdbsam realm = AD_REALM
[global] workgroup = domain_name security = ads passdb backend = tdbsam realm = AD_REALMCopy to Clipboard Copied! Toggle word wrap Toggle overflow 对于 NT4 域成员:
[global] workgroup = domain_name security = user passdb backend = tdbsam
[global] workgroup = domain_name security = user passdb backend = tdbsamCopy to Clipboard Copied! Toggle word wrap Toggle overflow
-
为
*默认域和要加入到/etc/samba/smb.conf文件中[global] 部分的域添加 ID 映射配置。 验证
/etc/samba/smb.conf文件:testparm
# testparmCopy to Clipboard Copied! Toggle word wrap Toggle overflow 以域管理员身份加入域:
加入 AD 域:
net ads join -U "DOMAIN\administrator"
# net ads join -U "DOMAIN\administrator"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要加入 NT4 域:
net rpc join -U "DOMAIN\administrator"
# net rpc join -U "DOMAIN\administrator"Copy to Clipboard Copied! Toggle word wrap Toggle overflow
将
winbind源追加到/etc/nsswitch.conf文件中的passwd和group数据库条目中:passwd: files winbind group: files winbind
passwd: files winbind group: files winbindCopy to Clipboard Copied! Toggle word wrap Toggle overflow 启用并启动
winbind服务:systemctl enable --now winbind
# systemctl enable --now winbindCopy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:使用
authselect工具配置 PAM。详情请查看您系统上的
authselect (8)手册页。可选:对于 AD 环境,请配置 Kerberos 客户端。
详情请查看您的 Kerberos 客户端文档。
3.20.2. 使用 net rpc right 命令 复制链接链接已复制到粘贴板!
在 Windows 中,您可以为帐户和组分配特权来执行特殊操作,如对共享设置 ACL 或上传打印机驱动程序。在 Samba 服务器上,您可以使用 net rpc permissions 命令来管理特权。
列出您可以设置的权限
若要列出所有可用的特权及其所有者,可使用 net rpc permissions list 命令。例如:
授予权限
若要为帐户或组赋予特权,可使用 net rpc rights grant 命令。
例如,将SePrintOperatorPrivilege 特权赋予 DOMAIN\printadmin 组 :
net rpc rights grant "DOMAIN\printadmin" SePrintOperatorPrivilege -U "DOMAIN\administrator"
# net rpc rights grant "DOMAIN\printadmin" SePrintOperatorPrivilege -U "DOMAIN\administrator"
Enter DOMAIN\administrator's password:
Successfully granted rights.
撤销权限
若要从帐户或组撤销特权,可使用 net rpc rights revoke 命令。
例如,要对DOMAIN\printadmin 组撤销 SePrintOperatorPrivilege 特权:
net rpc rights remoke "DOMAIN\printadmin" SePrintOperatorPrivilege -U "DOMAIN\administrator"
# net rpc rights remoke "DOMAIN\printadmin" SePrintOperatorPrivilege -U "DOMAIN\administrator"
Enter DOMAIN\administrator's password:
Successfully revoked rights.
3.20.4. 使用 net user 命令 复制链接链接已复制到粘贴板!
net user 命令允许您在 AD DC 或 NT4 PDC 中执行以下操作:
- 列出所有用户帐户
- 添加用户
- 删除用户
只有在列出域用户帐户时,才需要指定连接方法,如 AD 域的ads 或 NT4 域的rpc 。其他用户相关的子命令可以自动探测连接方法。
将 -U user_name 参数传给命令,以指定允许执行所请求的操作的用户。
列出域用户帐户
列出 AD 域中的所有用户:
net ads user -U "DOMAIN\administrator"
# net ads user -U "DOMAIN\administrator"
列出 NT4 域中的所有用户:
net rpc user -U "DOMAIN\administrator"
# net rpc user -U "DOMAIN\administrator"
在域中添加用户帐户
在 Samba 域成员中,您可以使用 net user add 命令将用户帐户添加到域。
例如,将 user 账户添加到域:
添加帐户:
net user add user password -U "DOMAIN\administrator"
# net user add user password -U "DOMAIN\administrator" User user addedCopy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:使用远程过程调用(RPC) shell 来启用 AD DC 或 NT4 PDC 上的帐户。例如:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
从域中删除用户帐户
对于 Samba 域成员,您可以使用 net user delete 命令从域中删除用户帐户。
例如,从域中删除 user 账户:
net user delete user -U "DOMAIN\administrator"
# net user delete user -U "DOMAIN\administrator"
User user deleted
3.20.5. 使用 rpcclient 工具 复制链接链接已复制到粘贴板!
The rpcclient 工具可让您在本地或远程 SMB 服务器上手动执行客户端 Microsoft 远程过程调用(MS-RPC)功能。但是,大部分特性都已集成到 Samba 提供的单独工具中。使用 rpcclient 只用于测试 MS-PRC 功能。
先决条件
-
samba-client软件包已安装。
示例
例如,您可以使用 rpcclient 工具来:
管理打印机假脱机子系统(SPOOLSS)。
例 3.7. 将驱动程序分配给打印机
rpcclient server_name -U "DOMAIN\administrator" -c 'setdriver "printer_name" "driver_name"'
# rpcclient server_name -U "DOMAIN\administrator" -c 'setdriver "printer_name" "driver_name"' Enter DOMAIN\administrators password: Successfully set printer_name to driver driver_name.Copy to Clipboard Copied! Toggle word wrap Toggle overflow 检索有关 SMB 服务器的信息。
例 3.8. 列出所有文件共享和共享的打印机
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用安全帐户管理器远程(SAMR)协议来执行操作。
例 3.9. 在 SMB 服务器中列出用户
rpcclient server_name -U "DOMAIN\administrator" -c 'enumdomusers'
# rpcclient server_name -U "DOMAIN\administrator" -c 'enumdomusers' Enter DOMAIN\administrators password: user:[user1] rid:[0x3e8] user:[user2] rid:[0x3e9]Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您针对独立服务器或域成员运行命令,它将列出本地数据库中的用户。针对 AD DC 或 NT4 PDC 运行命令列出域用户。
3.20.6. 使用 samba-regedit 应用程序 复制链接链接已复制到粘贴板!
某些设置(如打印机配置)存储在 Samba 服务器上的注册表中。您可以使用基于 ncurses 的 samba-regedit 应用程序来编辑 Samba 服务器的注册表。
先决条件
-
samba-client软件包已安装。
流程
要启动应用程序,请输入:
samba-regedit
# samba-regedit
使用以下键:
- 上键和下键:在注册表树和值中进行导航。
- Enter:打开关键字或编辑值。
-
选项卡 :在
Key和Value窗格间切换。 - Ctrl+C:关闭应用程序。
3.20.7. 使用 smbcontrol 工具 复制链接链接已复制到粘贴板!
smbcontrol 工具允许您向 smbd、nmbd、winbindd 或 所有这些服务发送命令消息。这些控制消息指示服务重新载入其配置。
先决条件
-
samba-common-tools软件包已安装。
流程
-
通过将
reload-config消息类型发送到所有目的地,来重新载入smbd、nmbd、winbindd服务的配置:
smbcontrol all reload-config
# smbcontrol all reload-config
3.20.8. 使用 smbpasswd 工具 复制链接链接已复制到粘贴板!
smbpasswd 工具管理本地 Samba 数据库中的用户帐户和密码。
先决条件
-
samba-common-tools软件包已安装。
流程
如果您以用户身份运行命令,
smbpasswd将修改运行命令的用户的 Samba 密码。例如:smbpasswd
[user@server ~]$ smbpasswd New SMB password: password Retype new SMB password: passwordCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果以
root用户身份运行smbpasswd,例如,您可以使用该工具来:创建一个新用户:
smbpasswd -a user_name
[root@server ~]# smbpasswd -a user_name New SMB password: password Retype new SMB password: password Added user user_name.Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意在将用户添加到 Samba 数据库之前,您必须先在本地操作系统中创建帐户。请参阅配置基本系统设置指南中的 从命令行添加新用户 部分。
启用 Samba 用户:
smbpasswd -e user_name
[root@server ~]# smbpasswd -e user_name Enabled user user_name.Copy to Clipboard Copied! Toggle word wrap Toggle overflow 禁用 Samba 用户:
smbpasswd -x user_name
[root@server ~]# smbpasswd -x user_name Disabled user user_nameCopy to Clipboard Copied! Toggle word wrap Toggle overflow 删除用户:
smbpasswd -x user_name
[root@server ~]# smbpasswd -x user_name Deleted user user_name.Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.20.9. 使用 smbstatus 工具 复制链接链接已复制到粘贴板!
smbstatus 工具报告,关于:
-
每个
smbd守护进程的每个 PID 到 Samba 服务器的连接。此报告包括用户名、主组群、SMB 协议版本、加密和签名信息。 -
每个 Samba 共享的连接。此报告包括
smbd守护进程的 PID、连接机器的 IP、连接建立的时间戳、加密和签名信息。 - 锁定文件列表。报告条目包括更多详情,如 Opportunistic lock(oplock)类型
先决条件
-
samba软件包已安装。 -
smbd服务在运行。
流程
3.20.10. 使用 smbtar 工具 复制链接链接已复制到粘贴板!
smbtar 工具备份 SMB 共享的内容或其子目录,并将内容存储在 tar 存档中。或者,您可以将内容写入磁带设备。
先决条件
-
samba-client软件包已安装。
流程
使用以下命令备份
//server/example/共享中demo目录的内容,并将内容存储在/root/example.tar归档中:smbtar -s server -x example -u user_name -p password -t /root/example.tar
# smbtar -s server -x example -u user_name -p password -t /root/example.tarCopy to Clipboard Copied! Toggle word wrap Toggle overflow
3.20.11. 使用 wbinfo 工具 复制链接链接已复制到粘贴板!
wbinfo 工具查询并返回 winbindd 服务创建和使用的信息。
先决条件
-
samba-winbind-clients软件包已安装。
流程
例如,您可以使用 wbinfo 来:
列出域用户:
wbinfo -u
# wbinfo -u AD\administrator AD\guest ...Copy to Clipboard Copied! Toggle word wrap Toggle overflow 列出域组:
wbinfo -g
# wbinfo -g AD\domain computers AD\domain admins AD\domain users ...Copy to Clipboard Copied! Toggle word wrap Toggle overflow 显示用户的 SID:
wbinfo --name-to-sid="AD\administrator"
# wbinfo --name-to-sid="AD\administrator" S-1-5-21-1762709870-351891212-3141221786-500 SID_USER (1)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 显示域和信任的信息:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第 4 章 设置和配置 BIND DNS 服务器 复制链接链接已复制到粘贴板!
BIND 是一个功能丰富的 DNS 服务器,它完全符合互联网工程任务 Force (IETF) DNS 标准和草案标准。例如,管理员经常使用 BIND,如下所示:
- 在本地网络中缓存 DNS 服务器
- 区域的权威 DNS 服务器
- 二级服务器来为区域提供高可用性
4.1. 有关使用 SELinux 保护 BIND 的注意事项,或者在更改 root 环境中运行 复制链接链接已复制到粘贴板!
要保护 BIND 安装,您可以:
运行
named而不需要 change-root 环境。在这种情况下,enforcing模式中的 SELinux 会阻止利用已知的 BIND 安全漏洞。默认情况下,Red Hat Enterprise Linux 在enforcing模式中使用 SELinux。重要在 SELinux 处于
enforcing模式的 RHEL 上运行 BIND 比在 change-root 环境中运行 BIND 更安全。在 change-root 环境中运行
named-chroot服务。利用 change-root 功能,管理员可以定义进程的根目录及其子进程与
/目录不同。当您启动named-chroot服务时,BIND 将其根目录切换到/var/named/chroot/。因此,服务使用mount --bind命令使/etc/named-chroot.files中列出的文件和目录保存在/var/named/chroot/中,并且进程无法访问/var/named/chroot/以外的文件。
如果您决定使用 BIND:
-
在正常模式中,使用
named服务。 -
在 change-root 环境中,使用
named-chroot服务。这要求您安装named-chroot软件包。
4.2. BIND 管理员参考手册 复制链接链接已复制到粘贴板!
bind 软件包中包括的综合 BIND 管理员参考手册 :
- 配置示例
- 有关高级功能的文档
- 配置参考
- 安全考虑
要在安装了 bind 软件包的主机上显示 BIND Administrator Reference Manual,请在浏览器中打开 /usr/share/doc/bind/Bv9ARM.html 文件。
4.3. 将 BIND 配置为缓存 DNS 服务器 复制链接链接已复制到粘贴板!
默认情况下,BIND DNS 服务器解析和缓存成功并失败的查找。随后,服务会从其缓存中应答相同记录的请求。这可显著提高 DNS 查找速度。
先决条件
- 服务器的 IP 地址是静态的。
流程
安装
bind和bind-utils软件包:yum install bind bind-utils
# yum install bind bind-utilsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 这些软件包提供 BIND 9.11。如果您需要 BIND 9.16,请安装
bind9.16和bind9.16-utils软件包。如果要在 change-root 环境中运行 BIND,请安装
bind-chroot软件包:yum install bind-chroot
# yum install bind-chrootCopy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,在 SELinux 处于
enforcing模式(默认设置)的主机上运行 BIND 更为安全。编辑
/etc/named.conf文件,并在options语句中进行以下更改:更新
listen-on和listen-on-v6语句,以指定 BIND 应该侦听的 IPv4 和 IPv6 接口:listen-on port 53 { 127.0.0.1; 192.0.2.1; }; listen-on-v6 port 53 { ::1; 2001:db8:1::1; };listen-on port 53 { 127.0.0.1; 192.0.2.1; }; listen-on-v6 port 53 { ::1; 2001:db8:1::1; };Copy to Clipboard Copied! Toggle word wrap Toggle overflow 更新
allow-query语句,以配置哪些 IP 地址和范围客户端可以查询此 DNS 服务器:allow-query { localhost; 192.0.2.0/24; 2001:db8:1::/64; };allow-query { localhost; 192.0.2.0/24; 2001:db8:1::/64; };Copy to Clipboard Copied! Toggle word wrap Toggle overflow 添加
allow-recursion语句,以定义 BIND 接受递归查询的 IP 地址和范围:allow-recursion { localhost; 192.0.2.0/24; 2001:db8:1::/64; };allow-recursion { localhost; 192.0.2.0/24; 2001:db8:1::/64; };Copy to Clipboard Copied! Toggle word wrap Toggle overflow 警告不要在服务器的公共 IP 地址中递归。否则,服务器可能会成为大规模 DNS 扩大攻击的一部分。
默认情况下,BIND 通过将从根服务器递归查询到权威 DNS 服务器来解析查询。或者,您可以将 BIND 配置为将查询转发到其他 DNS 服务器,比如您的供应商之一。在这种情况下,添加一个带有 BIND 应该转发查询的 DNS 服务器的 IP 地址列表的
forwarders语句:forwarders { 198.51.100.1; 203.0.113.5; };forwarders { 198.51.100.1; 203.0.113.5; };Copy to Clipboard Copied! Toggle word wrap Toggle overflow 作为回退行为,如果转发器服务器没有响应,BIND 会以递归方式解析查询。要禁用此行为,请添加
forward only;语句。
验证
/etc/named.conf文件的语法:named-checkconf
# named-checkconfCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果命令没有显示输出,则语法为正确的。
更新
firewalld规则,以允许传入的 DNS 流量:firewall-cmd --permanent --add-service=dns firewall-cmd --reload
# firewall-cmd --permanent --add-service=dns # firewall-cmd --reloadCopy to Clipboard Copied! Toggle word wrap Toggle overflow 启动并启用 BIND:
systemctl enable --now named
# systemctl enable --now namedCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果要在 change-root 环境中运行 BIND,请使用
systemctl enable --now named-chroot命令启用并启动该服务。
验证
使用新设置 DNS 服务器解析域:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 本例假定 BIND 在同一主机上运行并响应
localhost接口上的查询。在第一次查询记录后,BIND 会将条目添加到其缓存中。
重复前面的查询:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 由于对条目进行了缓存,进一步对相同记录的请求会非常快,直到条目过期为止。
4.4. 在 BIND DNS 服务器中配置日志记录 复制链接链接已复制到粘贴板!
默认 /etc/named.conf 文件中的配置(如 bind 软件包提供)使用 default_debug 通道,并将消息记录到 /var/named/data/named.run 文件中。default_debug 频道仅在服务器的 debug 级别为零时记录条目。
使用不同的频道和类别,您可以将 BIND 配置为将具有定义的严重性的不同事件写入单独的文件。
先决条件
- 已配置了 BIND,例如作为缓存名称服务器。
-
named或named-chroot服务正在运行。
流程
编辑
/etc/named.conf文件,并将category和channel添加到logging语句中,例如:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用这个示例配置,BIND 会记录与区域传送相关的消息,到
/var/named/log/transfer.log。BIND 创建最多10个日志文件版本,如果它们达到50MB 的最大大小,则轮转它们。category定义了 BIND 向哪些频道发送类别信息。channel定义了日志消息的目的地,包括版本数量、最大文件大小以及 BIND 应记录到频道的严重性等级。其他设置(如启用日志的时间戳、类别和严重性)是可选的,但可用于调试目的。如果不存在,创建日志目录,并为
named用户授予对这个目录的写权限:mkdir /var/named/log/ chown named:named /var/named/log/ chmod 700 /var/named/log/
# mkdir /var/named/log/ # chown named:named /var/named/log/ # chmod 700 /var/named/log/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 验证
/etc/named.conf文件的语法:named-checkconf
# named-checkconfCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果命令没有显示输出,则语法为正确的。
重启 BIND:
systemctl restart named
# systemctl restart namedCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果在 change-root 环境中运行 BIND,请使用
systemctl restart named-chroot命令来重启该服务。
验证
显示日志文件的内容:
cat /var/named/log/transfer.log ... 06-Jul-2022 15:08:51.261 xfer-out: info: client @0x7fecbc0b0700 192.0.2.2#36121/key example-transfer-key (example.com): transfer of 'example.com/IN': AXFR started: TSIG example-transfer-key (serial 2022070603) 06-Jul-2022 15:08:51.261 xfer-out: info: client @0x7fecbc0b0700 192.0.2.2#36121/key example-transfer-key (example.com): transfer of 'example.com/IN': AXFR ended
# cat /var/named/log/transfer.log ... 06-Jul-2022 15:08:51.261 xfer-out: info: client @0x7fecbc0b0700 192.0.2.2#36121/key example-transfer-key (example.com): transfer of 'example.com/IN': AXFR started: TSIG example-transfer-key (serial 2022070603) 06-Jul-2022 15:08:51.261 xfer-out: info: client @0x7fecbc0b0700 192.0.2.2#36121/key example-transfer-key (example.com): transfer of 'example.com/IN': AXFR endedCopy to Clipboard Copied! Toggle word wrap Toggle overflow
4.5. 编写 BIND ACL 复制链接链接已复制到粘贴板!
控制 BIND 的某些功能的访问可以防止未经授权的访问和攻击,如拒绝服务 (DoS)。BIND 访问控制列表 (acl) 语句是 IP 地址和范围的列表。每个 ACL 都有一个别名,您可以在几个语句中使用,如 allow-query 来引用指定的 IP 地址和范围。
BIND 仅在 ACL 中使用第一个匹配条目。例如,如果您定义了 ACL { 192.0.2/24; !192.0.2.1; } 以及带有 192.0.2.1 IP 地址的主机的连接,即使第二个条目排除这个地址,也会授予访问权限。
BIND 有以下内置 ACL:
-
none:不匹配主机。 -
any: 匹配所有主机。 -
localhost:匹配回环地址127.0.0.1和::1,以及服务器上运行 BIND 的服务器上的所有接口的 IP 地址。 -
localnets:匹配回环地址127.0.0.1和::1,以及运行 BIND 的服务器都直接连接到的所有子网。
先决条件
- 已配置了 BIND,例如作为缓存名称服务器。
-
named或named-chroot服务正在运行。
流程
编辑
/etc/named.conf文件并进行以下更改:将
acl语句添加到文件中。例如,要为127.0.0.1、192.0.2.0/24和2001:db8:1::/64创建名为internal-networks的 ACL,请输入:acl internal-networks { 127.0.0.1; 192.0.2.0/24; 2001:db8:1::/64; }; acl dmz-networks { 198.51.100.0/24; 2001:db8:2::/64; };acl internal-networks { 127.0.0.1; 192.0.2.0/24; 2001:db8:1::/64; }; acl dmz-networks { 198.51.100.0/24; 2001:db8:2::/64; };Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在支持它们的声明中使用 ACL 的别名,例如:
allow-query { internal-networks; dmz-networks; }; allow-recursion { internal-networks; };allow-query { internal-networks; dmz-networks; }; allow-recursion { internal-networks; };Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
/etc/named.conf文件的语法:named-checkconf
# named-checkconfCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果命令没有显示输出,则语法为正确的。
重新载入 BIND:
systemctl reload named
# systemctl reload namedCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果在 change-root 环境中运行 BIND,请使用
systemctl reload named-chroot命令来重新加载该服务。
验证
执行操作,以触发使用配置的 ACL 的功能。例如,此流程中的 ACL 只允许来自定义的 IP 地址的递归查询。在这种情况下,在不属于 ACL 定义的主机上输入以下命令来尝试解析外部域:
dig +short @192.0.2.1 www.example.com
# dig +short @192.0.2.1 www.example.comCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果命令没有返回任何输出,BIND 拒绝访问,且 ACL 可以正常工作。有关客户端的详细输出,请使用不带
+short选项的命令:dig @192.0.2.1 www.example.com
# dig @192.0.2.1 www.example.com ... ;; WARNING: recursion requested but not available ...Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.6. 在 BIND DNS 服务器中配置区 复制链接链接已复制到粘贴板!
DNS 区域是包含域空间中特定子树的资源记录的数据库。例如,如果您负责 example.com 域,可以在 BIND 中为它设置一个区。因此,客户端可将 www.example.com 解析为在这个区中配置的 IP 地址。
4.6.1. 区域文件中的 SOA 记录 复制链接链接已复制到粘贴板!
SOA(start of authority)记录在一个 DNS 区中是必必需的记录。例如,如果多个 DNS 服务器对某个区域具有权威,那么此记录非常重要,但也指向 DNS 解析器。
BIND 中的 SOA 记录具有以下语法:
name class type mname rname serial refresh retry expire minimum
name class type mname rname serial refresh retry expire minimum
为提高可读性,管理员通常将区域文件中的记录分成多行,其中包含以分号(;)开头的注释。请注意,如果您分割 SOA 记录,圆括号将记录保留在一起:
请注意完全限定域名 (FQDN) 末尾的结尾点。FQDN 包含多个域标签,它们用点分开。由于 DNS root 有一个空标签,所以 FQDN 以点结尾。因此,BIND 在没有结尾点的情况下将区域名称附加到名称中。不含尾部点的主机名(例如 ns1.example.com)会被扩展为 ns1.example.com.example.com.,对于主域名服务器,这不是正确的地址。
以下是 SOA 记录中的字段:
-
name:区域的名称,即所谓的源(origin)。如果将此字段设置为@,BIND 会将其扩展为/etc/named.conf中定义的区域名称。 -
class:在 SOA 记录中,必须将此字段始终设置为 Internet (IN)。 -
type:在 SOA 记录中,必须将此字段始终设置为SOA。 -
mname(主名称):此区域的主域名服务器的主机名。 -
rname(负责名称): 负责此区域的电子邮件地址。请注意,格式不同。您必须将 at 符号 (@) 替换为点 (.)。 serial:此区域文件的版本号。次要域名服务器仅在主服务器上的序列号较高时更新其区域副本。格式可以是任意数字值。通常的格式是
<year><month><day><two-digit-number>。使用这种格式,在理论上可以每天修改区域文件上百次。-
refresh:在检查主服务器更新时,次要服务器应等待的时间。 -
retry:当次要服务器在尝试失败后重试查询主服务器的时间长度。 -
expire:当所有之前的尝试失败时,次要服务器停止查询主服务器的时间长度。 -
minimum:RFC 2308 将此字段的含义改为负缓存时间。兼容解析器使用它来确定缓存NXDOMAIN名称错误的时间。
refresh, retry, expire, 和 minimum 项中的值定义了一个时间(以秒为单位)。但是,为了提高可读性,请使用时间后缀,如 m 表示分钟、h 表示小时,以及 d 表示天。例如,3h 代表 3 小时。
4.6.2. 在 BIND 主服务器上设置转发区 复制链接链接已复制到粘贴板!
转发区域将名称映射到 IP 地址和其他信息。例如,如果您负责域 example.com,您可以在 BIND 中设置转发区来解析名称,如 www.example.com。
先决条件
- 已配置了 BIND,例如作为缓存名称服务器。
-
named或named-chroot服务正在运行。
流程
在
/etc/named.conf文件中添加区定义:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 这些设置定义:
-
此服务器作为
example.com区域的主服务器 (类型 master)。 -
/var/named/example.com.zone文件是区域文件。如果您设置了相对路径,如本例中所示,这个路径相对于您在options语句中的目录中创建的directory相对。 - 任何主机都可以查询此区域。另外,还可指定 IP 范围或 BIND 访问控制列表 (ACL) 别名来限制访问。
- 没有主机可以传输区域。仅在设置次要服务器并且仅为次要服务器的 IP 地址时才允许区域传送。
-
此服务器作为
验证
/etc/named.conf文件的语法:named-checkconf
# named-checkconfCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果命令没有显示输出,则语法为正确的。
使用以下内容创建
/var/named/example.com.zone文件:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 这个区域文件:
-
将资源记录的默认生存时间 (TTL) 值设置为 8 小时。如果没有时间后缀(例如没有使用
h指定小时),BIND 会将该值解析为秒。 - 包含所需的 SOA 资源记录,以及有关该区域的详细信息。
-
将
ns1.example.com设置为此区域的权威 DNS 服务器。要正常工作,区域需要至少一个域名服务器 (NS) 记录。但是,若要与 RFC 1912 兼容,您需要至少有两个域名服务器。 -
将
mail.example.com设置为example.com域的邮件交换器 (MX)。主机名前面的数字值是记录的优先级。较低值的条目具有更高的优先级。 -
设置
www.example.com的 IPv4 和 IPv6 地址、mail.example.com和ns1.example.com。
-
将资源记录的默认生存时间 (TTL) 值设置为 8 小时。如果没有时间后缀(例如没有使用
在区域文件上设置安全权限,仅允许
named组读取它:chown root:named /var/named/example.com.zone chmod 640 /var/named/example.com.zone
# chown root:named /var/named/example.com.zone # chmod 640 /var/named/example.com.zoneCopy to Clipboard Copied! Toggle word wrap Toggle overflow 验证
/var/named/example.com.zone文件的语法:named-checkzone example.com /var/named/example.com.zone
# named-checkzone example.com /var/named/example.com.zone zone example.com/IN: loaded serial 2022070601 OKCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重新载入 BIND:
systemctl reload named
# systemctl reload namedCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果在 change-root 环境中运行 BIND,请使用
systemctl reload named-chroot命令来重新加载该服务。
验证
从
example.com区域查询不同的记录,并验证输出是否与您在区域文件中配置的记录匹配:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 本例假定 BIND 在同一主机上运行并响应
localhost接口上的查询。
4.6.3. 在 BIND 主服务器中设置反向区 复制链接链接已复制到粘贴板!
反向区域将 IP 地址映射到名称。例如,如果您负责 IP 范围 192.0.2.0/24,您可以在 BIND 中设置反向区域,以将 IP 地址从这个范围内的 IP 地址解析为主机名。
如果您为整个类网络创建一个反向区域,请相应地命名区域。例如,对于 C network 192.0.2.0/24,区域的名称是 2.0.192.in-addr.arpa。如果要为不同的网络大小创建反向区域,如 192.0.2.0/28,区域的名称为 28-2.0.192.in-addr.arpa。
先决条件
- 已配置了 BIND,例如作为缓存名称服务器。
-
named或named-chroot服务正在运行。
流程
在
/etc/named.conf文件中添加区定义:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 这些设置定义:
-
此服务器作为
2.0.192.in-addr.arpa反向区域的主服务器(type master)。 -
/var/named/2.0.192.in-addr.arpa.zone文件是区域文件。如果您设置了相对路径,如本例中所示,这个路径相对于您在options语句中的目录中创建的directory相对。 - 任何主机都可以查询此区域。另外,还可指定 IP 范围或 BIND 访问控制列表 (ACL) 别名来限制访问。
- 没有主机可以传输区域。仅在设置次要服务器并且仅为次要服务器的 IP 地址时才允许区域传送。
-
此服务器作为
验证
/etc/named.conf文件的语法:named-checkconf
# named-checkconfCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果命令没有显示输出,则语法为正确的。
使用以下内容创建
/var/named/2.0.192.in-addr.arpa.zone文件:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 这个区域文件:
-
将资源记录的默认生存时间 (TTL) 值设置为 8 小时。如果没有时间后缀(例如没有使用
h指定小时),BIND 会将该值解析为秒。 - 包含所需的 SOA 资源记录,以及有关该区域的详细信息。
-
将
ns1.example.com设置为此反向区域的权威 DNS 服务器。要正常工作,区域需要至少一个域名服务器 (NS) 记录。但是,若要与 RFC 1912 兼容,您需要至少有两个域名服务器。 -
设置
192.0.2.1和192.0.2.30地址的指针(PTR)记录。
-
将资源记录的默认生存时间 (TTL) 值设置为 8 小时。如果没有时间后缀(例如没有使用
在区域文件上设置安全权限,仅允许
named组读取它:chown root:named /var/named/2.0.192.in-addr.arpa.zone chmod 640 /var/named/2.0.192.in-addr.arpa.zone
# chown root:named /var/named/2.0.192.in-addr.arpa.zone # chmod 640 /var/named/2.0.192.in-addr.arpa.zoneCopy to Clipboard Copied! Toggle word wrap Toggle overflow 验证
/var/named/2.0.192.in-addr.arpa.zone文件的语法:named-checkzone 2.0.192.in-addr.arpa /var/named/2.0.192.in-addr.arpa.zone
# named-checkzone 2.0.192.in-addr.arpa /var/named/2.0.192.in-addr.arpa.zone zone 2.0.192.in-addr.arpa/IN: loaded serial 2022070601 OKCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重新载入 BIND:
systemctl reload named
# systemctl reload namedCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果在 change-root 环境中运行 BIND,请使用
systemctl reload named-chroot命令来重新加载该服务。
验证
从反向区查询不同的记录,并验证输出是否与您在区域文件中配置的记录匹配:
dig +short @localhost -x 192.0.2.1 dig +short @localhost -x 192.0.2.30
# dig +short @localhost -x 192.0.2.1 ns1.example.com. # dig +short @localhost -x 192.0.2.30 www.example.com.Copy to Clipboard Copied! Toggle word wrap Toggle overflow 本例假定 BIND 在同一主机上运行并响应
localhost接口上的查询。
4.6.4. 更新 BIND 区文件 复制链接链接已复制到粘贴板!
在某些情况下,例如,如果服务器的 IP 地址有变化,您必须更新区域文件。如果多个 DNS 服务器负责某个区,则仅在主服务器中执行这个步骤。存储区域副本的其他 DNS 服务器将通过区域传送接收更新。
先决条件
- zone 被配置。
-
named或named-chroot服务正在运行。
流程
可选:识别
/etc/named.conf文件中的区文件的路径:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 您可以在区域定义的
file指令中找到到区域文件的路径。相对路径相对于options语句中的directory设置的相对路径。编辑区域文件:
- 进行必要的更改。
在 SOA 记录中递增序列号。
重要如果序列号等于或低于先前值,次要服务器不会更新其区域的副本。
验证区文件的语法:
named-checkzone example.com /var/named/example.com.zone
# named-checkzone example.com /var/named/example.com.zone zone example.com/IN: loaded serial 2022062802 OKCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重新载入 BIND:
systemctl reload named
# systemctl reload namedCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果在 change-root 环境中运行 BIND,请使用
systemctl reload named-chroot命令来重新加载该服务。
验证
查询您添加、修改或删除的记录,例如:
dig +short @localhost A ns2.example.com
# dig +short @localhost A ns2.example.com 192.0.2.2Copy to Clipboard Copied! Toggle word wrap Toggle overflow 本例假定 BIND 在同一主机上运行并响应
localhost接口上的查询。
4.6.5. 使用自动密钥生成和区维护功能进行 DNSSEC 区域签名 复制链接链接已复制到粘贴板!
您可以使用域名系统安全扩展 (DNSSEC) 为区域签名,以确保身份验证和数据完整性。此类区域包含额外的资源记录。客户端可以使用它们来验证区域信息的真实性。
如果您为区启用 DNSSEC 策略功能,BIND 会自动执行以下操作:
- 创建密钥
- 为区域签名
- 维护区域,包括重新签名并定期替换密钥。
要启用外部 DNS 服务器以验证区的真实性,您必须在父区中添加该区域的公钥。请联系您的域供应商或 registry,以了解更多有关如何完成此操作的详细信息。
此流程使用 BIND 中的内置 default DNSSEC 策略。这个策略使用单一 ECDSAP256SHA 密钥签名。另外,还可创建自己的策略来使用自定义密钥、算法和计时。
先决条件
-
已安装 BIND 9.16 或更高版本。要满足此要求,请安装
bind9.16软件包,而不是bind。 - 配置您要启用 DNSSEC 的区域。
-
named或named-chroot服务正在运行。 - 服务器可将时间与时间服务器同步。对于 DNSSEC 验证,系统时间准确非常重要。
流程
编辑
/etc/named.conf文件,并将dnssec-policy default;添加到您要启用 DNSSEC 的区域:zone "example.com" { ... dnssec-policy default; };zone "example.com" { ... dnssec-policy default; };Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重新载入 BIND:
systemctl reload named
# systemctl reload namedCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果在 change-root 环境中运行 BIND,请使用
systemctl reload named-chroot命令来重新加载该服务。BIND 将公钥存储在
/var/named/K<zone_name>.+<algorithm>+<key_ID>.key文件中。使用此文件显示区的公钥,格式为父区所需的格式:DS 记录格式:
dnssec-dsfromkey /var/named/Kexample.com.+013+61141.key
# dnssec-dsfromkey /var/named/Kexample.com.+013+61141.key example.com. IN DS 61141 13 2 3E184188CF6D2521EDFDC3F07CFEE8D0195AACBD85E68BAE0620F638B4B1B027Copy to Clipboard Copied! Toggle word wrap Toggle overflow DNSKEY 格式:
grep DNSKEY /var/named/Kexample.com.+013+61141.key
# grep DNSKEY /var/named/Kexample.com.+013+61141.key example.com. 3600 IN DNSKEY 257 3 13 sjzT3jNEp120aSO4mPEHHSkReHUf7AABNnT8hNRTzD5cKMQSjDJin2I3 5CaKVcWO1pm+HltxUEt+X9dfp8OZkg==Copy to Clipboard Copied! Toggle word wrap Toggle overflow
- 请求将区域的公钥添加到父区。请联系您的域供应商或 registry,以了解更多有关如何完成此操作的详细信息。
验证
从启用了 DNSSEC 签名的区域查询您自己的 DNS 服务器:
dig +dnssec +short @localhost A www.example.com
# dig +dnssec +short @localhost A www.example.com 192.0.2.30 A 13 3 28800 20220718081258 20220705120353 61141 example.com. e7Cfh6GuOBMAWsgsHSVTPh+JJSOI/Y6zctzIuqIU1JqEgOOAfL/Qz474 M0sgi54m1Kmnr2ANBKJN9uvOs5eXYw==Copy to Clipboard Copied! Toggle word wrap Toggle overflow 本例假定 BIND 在同一主机上运行并响应
localhost接口上的查询。在将公钥添加到父区并传播到其他服务器后,验证服务器是否将查询上的身份验证数据(
ad)标记设置为已签名区域:dig @localhost example.com +dnssec
# dig @localhost example.com +dnssec ... ;; flags: qr rd ra ad; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1 ...Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.7. 在 BIND DNS 服务器中配置区传输 复制链接链接已复制到粘贴板!
区域传送可确保所有具有区域副本的 DNS 服务器均使用最新数据。
先决条件
- 在未来的主服务器中,已配置要设置区域传送的区域。
- 在未来的次要服务器上,已配置 BIND,例如作为缓存名称服务器。
-
在两个服务器上,
named或named-chroot服务正在运行。
流程
在现有主服务器中:
创建一个共享密钥,并将其附加到
/etc/named.conf文件中:tsig-keygen example-transfer-key | tee -a /etc/named.conf
# tsig-keygen example-transfer-key | tee -a /etc/named.conf key "example-transfer-key" { algorithm hmac-sha256; secret "q7ANbnyliDMuvWgnKOxMLi313JGcTZB5ydMW5CyUGXQ="; };Copy to Clipboard Copied! Toggle word wrap Toggle overflow 这个命令显示
tsig-keygen命令的输出,并自动将其附加到/etc/named.conf中。稍后,在次要服务器上,您还需要命令的输出。
编辑
/etc/named.conf文件中的区定义:在
allow-transfer语句中,定义服务器必须提供example-transfer-key语句中指定的密钥来传输区:zone "example.com" { ... allow-transfer { key example-transfer-key; }; };zone "example.com" { ... allow-transfer { key example-transfer-key; }; };Copy to Clipboard Copied! Toggle word wrap Toggle overflow 另外,在
allow-transfer语句中使用 BIND 访问控制列表 (ACL) 别名。默认情况下,在更新区域后,BIND 会通知所有在区中有名称服务器 (
NS) 记录的域名服务器。如果您不计划为二级服务器添加NS记录,您可以配置 BIND 通知这个服务器。为此,请将这个次要服务器的 IP 地址添加also-notify声明到区:zone "example.com" { ... also-notify { 192.0.2.2; 2001:db8:1::2; }; };zone "example.com" { ... also-notify { 192.0.2.2; 2001:db8:1::2; }; };Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
/etc/named.conf文件的语法:named-checkconf
# named-checkconfCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果命令没有显示输出,则语法为正确的。
重新载入 BIND:
systemctl reload named
# systemctl reload namedCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果在 change-root 环境中运行 BIND,请使用
systemctl reload named-chroot命令来重新加载该服务。
在未来的次要服务器中:
按如下方式编辑
/etc/named.conf文件:添加与主服务器相同的密钥定义:
key "example-transfer-key" { algorithm hmac-sha256; secret "q7ANbnyliDMuvWgnKOxMLi313JGcTZB5ydMW5CyUGXQ="; };key "example-transfer-key" { algorithm hmac-sha256; secret "q7ANbnyliDMuvWgnKOxMLi313JGcTZB5ydMW5CyUGXQ="; };Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在
/etc/named.conf文件中添加区定义:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 这些设置状态:
-
此服务器是
example.com区域的次要服务器 (type slave)。 -
/var/named/slaves/example.com.zone文件是区域文件。如果您设置了相对路径,如本例中所示,这个路径相对于您在options语句中的目录中创建的directory相对。要隔离此服务器从属的区域文件,您可以将它们存储在/var/named/slaves/目录中。 - 任何主机都可以查询此区域。另外,还可指定 IP 范围或 ACL 别名来限制访问。
- 没有主机可以从该服务器传输区域。
-
此区域的主服务器的 IP 地址是
192.0.2.1和2001:db8:1::2。或者,您可以指定 ACL 别名。此次要服务器将使用名为example-transfer-key的键向主服务器进行身份验证。
-
此服务器是
验证
/etc/named.conf文件的语法:named-checkconf
# named-checkconfCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重新载入 BIND:
systemctl reload named
# systemctl reload namedCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果在 change-root 环境中运行 BIND,请使用
systemctl reload named-chroot命令来重新加载该服务。
-
可选:修改主服务器上的区域文件,并为新的次要服务器添加一个
NS记录。
验证
在次要服务器中:
显示
named服务的systemd日志条目:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果在 change-root 环境中运行 BIND,请使用
journalctl -u named-chroot命令显示日志条目。验证 BIND 创建了区域文件:
ls -l /var/named/slaves/
# ls -l /var/named/slaves/ total 4 -rw-r--r--. 1 named named 2736 Jul 6 15:08 example.com.zoneCopy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,默认情况下,次要服务器以二进制原始格式存储区域文件。
从次要服务器查询传输的区的记录:
dig +short @192.0.2.2 AAAA www.example.com
# dig +short @192.0.2.2 AAAA www.example.com 2001:db8:1::30Copy to Clipboard Copied! Toggle word wrap Toggle overflow 本例假定您在此流程中设置的次要服务器侦听 IP 地址
192.0.2.2。
4.8. 在 BIND 中配置响应策略区以覆盖 DNS 记录 复制链接链接已复制到粘贴板!
使用 DNS 块和过滤,管理员可以重写 DNS 响应来阻止对某些域或主机的访问。在 BIND 中,响应策略区域 (RPZ) 提供此功能。您可以为受阻条目配置不同的操作,如返回 NXDOMAIN 错误或不响应查询。
如果您的环境中有多个 DNS 服务器,请使用此流程在主服务器上配置 RPZ,稍后配置区传输以在您的次要服务器上提供 RPZ。
先决条件
- 已配置了 BIND,例如作为缓存名称服务器。
-
named或named-chroot服务正在运行。
流程
编辑
/etc/named.conf文件并进行以下更改:在
options语句中添加response-policy定义:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 您可以在
response-policy的zone语句中为 RPZ 设置自定义名称。但是,在下一步中,您必须在区定义中使用相同的名称。为您在上一步中设置的 RPZ 添加
zone定义:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 这些设置状态:
-
此服务器是名为
rpz.local的 RPZ 的主服务器 (type master)。 -
/var/named/rpz.local文件是区域文件。如果您设置了相对路径,如本例中所示,这个路径相对于您在options语句中的目录中创建的directory相对。 -
allow-query中定义的任何主机都可以查询此 RPZ。另外,还可指定 IP 范围或 BIND 访问控制列表 (ACL) 别名来限制访问。 - 没有主机可以传输区域。仅在设置次要服务器并且仅为次要服务器的 IP 地址时才允许区域传送。
-
此服务器是名为
验证
/etc/named.conf文件的语法:named-checkconf
# named-checkconfCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果命令没有显示输出,则语法为正确的。
使用以下内容创建
/var/named/rpz.local文件,例如:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 这个区域文件:
-
将资源记录的默认生存时间 (TTL) 值设置为 10 分钟。如果没有时间后缀(例如没有使用
h指定小时),BIND 会将该值解析为秒。 - 包含所需的 SOA 资源记录,以及有关该区域的详细信息。
-
将
ns1.example.com设置为此区域的权威 DNS 服务器。要正常工作,区域需要至少一个域名服务器 (NS) 记录。但是,若要与 RFC 1912 兼容,您需要至少有两个域名服务器。 -
将查询的
NXDOMAIN错误返回给该域中的example.org和主机。 -
将查询丢弃至此域中的
example.net和主机。
有关操作和示例的完整列表,请参阅 IETF 草案:DNS 响应策略区域(RPZ)。
-
将资源记录的默认生存时间 (TTL) 值设置为 10 分钟。如果没有时间后缀(例如没有使用
验证
/var/named/rpz.local文件的语法:named-checkzone rpz.local /var/named/rpz.local
# named-checkzone rpz.local /var/named/rpz.local zone rpz.local/IN: loaded serial 2022070601 OKCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重新载入 BIND:
systemctl reload named
# systemctl reload namedCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果在 change-root 环境中运行 BIND,请使用
systemctl reload named-chroot命令来重新加载该服务。
验证
尝试解析
example.org中的主机,该主机在 RPZ 中配置,以返回NXDOMAIN错误:dig @localhost www.example.org
# dig @localhost www.example.org ... ;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 30286 ...Copy to Clipboard Copied! Toggle word wrap Toggle overflow 本例假定 BIND 在同一主机上运行并响应
localhost接口上的查询。尝试解析
example.net域中的主机,该域在 RPZ 中配置以丢弃查询:dig @localhost www.example.net
# dig @localhost www.example.net ... ;; connection timed out; no servers could be reached ...Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.9. 从 RHEL 7 到 RHEL 8 的绑定迁移 复制链接链接已复制到粘贴板!
要将 BIND 从 RHEL 7 迁移到 RHEL 8,您需要通过以下方法调整绑定配置:
-
删除
dnssec-lookaside auto配置选项。 -
默认情况下,
BIND默认将侦听任何配置的 IPv6 地址,因为listen-on-v6配置选项的默认值已从none改为any。 -
当允许更新其区域时,多个区域无法共享相同的区域文件。如果您需要在多个区域定义中使用相同的文件,请确保 allow-updates 只使用
none。不要使用非空的update-policy或启用inline-signing,否则使用in-view子句来共享区域。
更新了命令行选项、默认行为和输出格式:
-
每个接口使用的 UDP 侦听程序的数量已更改为一个处理器数量的函数。您可以将
-U参数设为BIND来覆盖它。 -
statistics-channel中使用的 XML 格式已更改。 -
rndc flushtree选项现在清除DNSSEC验证失败以及特定的名称记录。 -
您必须使用
/etc/named.root.key文件,而不是/etc/named.iscdlv.key文件。/etc/named.iscdlv.key文件不再可用。 - querylog 格式已被修改为包含客户端对象的内存地址。它有助于调试。
-
named和dig工具现在默认发送一个DNS COOKIE(RFC 7873),这可能会破坏限制性防火墙或入侵检测系统。您可以使用send-cookie配置选项更改此行为。 -
dig工具可以以文本格式显示Extended DNS Errors(EDE、RFC 8914)。
4.10. 使用 dnstap 记录 DNS 查询 复制链接链接已复制到粘贴板!
作为网络管理员,您可以记录域名系统(DNS)详情来分析 DNS 流量模式、监控 DNS 服务器性能,并对 DNS 问题进行故障排除。如果您希望有一个高级方法来监控和记录传入名称查询的详细信息,请使用 dnstap 接口记录从 named 服务发送的消息。您可以捕获并记录 DNS 查询,来收集有关网站或 IP 地址的信息。
先决条件
-
bind-9.11.26-2软件包或更新的版本已安装。
如果您已安装并运行了 BIND 版本,添加新版本的 BIND 将覆盖现有的版本。
流程
通过编辑
options块中的/etc/named.conf文件来启用dnstap和目标文件:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要指定您要记录的 DNS 流量类型,请将
dnstap过滤器添加到/etc/named.conf文件中的dnstap块中。您可以使用以下过滤器:-
auth- 权威区域响应或回答。 -
client- 内部客户端查询或回答。 -
forwarder- 转发的查询或来自它的响应。 -
resolver- 迭代的解析查询或响应。 -
update- 动态区域更新请求。 -
all- 以上选项中的任何一个。 query或response- 如果您没有指定query或response关键字,则dnstap两个都记录。注意dnstap过滤器包含多个由;分隔的定义,dnstap {}块的语法如下:dnstap{(all | auth | client | forwarder | resolver | update)[(query | response)]; … };
-
要应用您的更改,请重启
named服务:systemctl restart named.service
# systemctl restart named.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 为活跃日志配置定期回滚
在以下示例中,
cron调度程序每天运行一次用户编辑的脚本的内容。值为3的roll选项指定dnstap最多可以创建三个备份日志文件。值3覆盖dnstap-output变量的version参数,并将备份日志文件数限制为三个。此外,二进制日志文件被移到另一个目录并被重命名,并且永远不会达到.2后缀,即使三个备份文件已存在。如果根据大小限制自动回滚二进制日志足够了,则您可以跳过这一步。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
dnstap-read工具以人类可读的格式处理和分析日志:在以下示例中,
dnstap-read工具以YAML文件格式打印输出。Example: dnstap-read -p /var/named/data/dnstap.bin
Example: dnstap-read -p /var/named/data/dnstap.binCopy to Clipboard Copied! Toggle word wrap Toggle overflow
第 5 章 部署 NFS 服务器 复制链接链接已复制到粘贴板!
通过使用网络文件系统(NFS)协议,远程用户可以通过网络挂载共享目录,并像它们是本地挂载的那样使用它们。这可让您将资源整合到网络的集中服务器中。
5.1. 次 NFSv4 版本的主要功能 复制链接链接已复制到粘贴板!
每个次 NFSv4 版本均带来了旨在提高性能和安全的增强。使用这些改进来充分利用 NFSv4 的潜力,确保网络之间高效且可靠的文件共享。
NFSv4.2 的主要功能
- 服务器端复制
- 服务器端复制是 NFS 服务器在服务器上复制文件,而无需通过网络来回传输数据的一种能力。
- 稀疏文件
- 使文件有一个或多个空白或间隙,它们是仅由零组成的未分配或未初始化的数据块。这使应用程序可以在稀疏文件中映射出孔的位置。
- 保留空间
- 在写数据前,客户端可以在存储服务器上保留或分配空间。这防止服务器耗尽空间。
- 标记的 NFS
- 强制实施数据访问权限,并为 NFS 文件系统上的各个文件在客户端和服务器之间启用 SELinux 标签。
- 布局增强
- 提供了使并行 NFS (pNFS)服务器收集更好的性能统计信息的功能。
NFSv4.1 的主要功能
- 对 pNFS 的客户端支持
- 对集群服务器高速 I/O 的支持,可让您在多台机器上存储数据,来提供对数据的直接访问,以及对元数据的同步更新。
- 会话
- 会话维护相对于属于客户端连接的服务器的状态。这些会话通过减少与为每个远程过程调用(RPC)操作建立和终止连接关联的开销,提供了改进的性能和效率。
NFSv4.0 的主要功能
- RPC 和安全性
-
RPCSEC_GSS框架增强了 RPC 安全性。NFSv4 协议为带内安全协商引入了一个新操作。这可让客户端查询服务器策略,来安全地访问文件系统资源。 - 流程和操作结构
-
NFS 4.0 引入了
COMPOUND流程,它允许客户端将多个操作合并为一个请求,来减少 RPC。 - 文件系统模型
NFS 4.0 保留分层的文件系统模型,将文件视为字节流,并使用 UTF-8 对名称进行编码以实现国际化。
文件处理类型
使用易失性文件句柄,服务器可以根据需要对文件系统更改进行调整,并使客户端能够适应,而无需永久的文件句柄。
属性类型
文件属性结构包括 required, recommended, 和 named 属性,各自有不同的目的。从 NFSv3 派生的 required 属性对于区分文件类型至关重要,而 recommended 属性(如 ACL)提供增强的访问控制。
多服务器命名空间
命名空间跨多个服务器,根据属性、支持引用、冗余和无缝服务器迁移简化文件系统传输。
- OPEN 和 CLOSE 操作
- 这些操作可在一个点上组合文件查找、创建和语义共享,并使文件访问管理更高效。
- 文件锁定
- 文件锁定是协议的一部分,消除了对 RPC 回调的需求。文件锁定状态由服务器在基于租期的模式下管理的,其中无法续订租期可能导致服务器释放状态。
- 客户端缓存和委托
- 缓存与之前的版本类似,具有客户端决定属性和目录缓存的超时。NFS 4.0 中的委派允许服务器将某些职责分配给客户端,保证特定的文件共享语义,并在没有立即服务器交互的情况下启用本地文件操作。
5.2. AUTH_SYS 身份验证方法 复制链接链接已复制到粘贴板!
AUTH_SYS 方法(也称为 AUTH_UNIX )是一种客户端身份验证机制。使用 AUTH_SYS ,客户端向服务器发送用户的用户 ID (UID)和组 ID (GID),来在访问文件时验证其身份和权限。它被视为不太安全,因为它依赖于客户端提供的信息,使得在错误配置时容易受到未经授权的访问。
映射机制可确保 NFS 客户端在服务器上可以访问具有合适权限的文件,即使系统间的 UID 和 GID 分配有所不同。UID 和 GID 是使用以下机制在 NFS 客户端和服务器间进行映射的:
- 直接映射
UID 和 GID 直接由 NFS 服务器和本地及远程系统之间的客户端进行映射。这需要在所有参与 NFS 文件共享的系统上进行一致的 UID 和 GID 分配。例如,客户端上 UID 为 1000 的用户只能访问服务器上 UID 为 1000 的用户有权限访问的共享上的文件。
对于 NFS 环境中简化的 ID 管理,管理员通常依赖集中服务,如 LDAP 或网络信息服务(NIS)来管理跨多个系统的 UID 和 GID 映射。
- 用户和组 ID 映射
-
NFS 服务器和客户端可以使用
idmapd服务在不同的系统间转换 UID 和 GID,以进行一致的识别和权限分配。
5.3. AUTH_GSS 身份验证方法 复制链接链接已复制到粘贴板!
Kerberos 是一种网络身份验证协议,它允许通过非安全网络对客户端和服务器进行安全身份验证。它使用对称密钥加密,并需要一个可信密钥分发中心(KDC)来验证用户和服务。
与 AUTH_SYS 不同,使用 RPCSEC_GSS Kerberos 机制,服务器不依赖于客户端就可正确表示哪个用户正在访问文件。相反,加密用于向服务器验证用户的身份,这可防止恶意的客户端在没有用户的 Kerberos 凭据的情况下模拟该用户。
在 /etc/exports 文件中,sec 选项定义一个或多个共享应提供的 Kerberos 安全性的方法,并且客户端可以通过以下方法之一挂载共享。sec 选项支持以下值:
-
sys: 无加密保护(默认) -
krb5:仅用于验证 -
krb5i: 身份验证和完整性保护 -
krb5p:身份验证、完整性检查和流量加密
请注意,方法提供的加密功能越多,性能越低。
5.4. 导出的文件系统上的文件权限 复制链接链接已复制到粘贴板!
导出的文件系统上的文件权限决定了对客户端通过 NFS 访问它们的文件和目录的访问权限。
远程主机挂载了 NFS 文件系统后,每个共享文件所拥有的唯一保护是其文件系统权限。如果共享同一用户 ID (UID)值的两个用户在不同的客户端系统上挂载相同的 NFS 文件系统,则他们可以修改彼此的文件。
NFS 将客户端上的 root 用户视为与服务器上的 root 用户相同。但是,默认情况下,在访问 NFS 共享时,NFS 服务器将 root 映射为 nobody 帐户。root_squash 选项控制此行为。
5.5. NFS 服务器上需要的服务 复制链接链接已复制到粘贴板!
Red Hat Enterprise Linux (RHEL)使用内核模块和用户空间进程的组合来提供 NFS 文件共享:
| 服务名称 | NFS 版本 | 描述 |
|---|---|---|
|
| 3, 4 | 为请求共享 NFS 文件系统提供服务的 NFS 内核模块。 |
|
| 3 |
这个进程接受来自本地远程过程调用(RPC)服务的端口保留,使其可用或被宣传出去,允许相应的远程 RPC 服务访问它们。 |
|
| 3, 4 |
此服务处理来自 NFSv3 客户端的 它检查请求的 NFS 共享是否当前由 NFS 服务器导出,是否允许客户端访问它。 |
|
| 3, 4 | 这个进程通告显式的 NFS 版本和服务器定义的协议。它与内核合作来满足 NFS 客户端的动态需求,例如在每次 NFS 客户端连接时提供服务器线程。
|
|
| 3 | 这个内核模块实现 Network Lock Manager (NLM)协议,它允许客户端锁定服务器上的文件。当 NFS 服务器运行时,RHEL 自动加载模块。 |
|
| 3, 4 | 此服务为远程用户提供了用户配额信息。 |
|
| 4 | 此进程提供 NFSv4 客户端和服务器向上调用,它会在 NFSv4 名称('user@domain' 形式的字符串)和本地用户及组 ID 之间进行映射。 |
|
| 3, 4 |
此服务代表 |
|
| 4 | 此服务提供一个 NFSv4 客户端跟踪守护进程,在网络分区和服务器重启过程中,当其他客户端获取了冲突的锁时,该进程防止服务器授予锁回收。 |
|
| 3 | 此服务在本地主机重启时向其他 NFSv3 客户端提供通知,在远程 NFSv3 主机重启时向内核提供通知。 |
5.6. /etc/exports 配置文件 复制链接链接已复制到粘贴板!
/etc/exports 文件控制服务器导出哪些目录。每行包含一个导出点、一个允许挂载目录的空格分开的客户端的列表,以及每个客户端的选项:
<directory> <host_or_network_1>(<options_1>) <host_or_network_n>(<options_n>)...
<directory> <host_or_network_1>(<options_1>) <host_or_network_n>(<options_n>)...
以下是 /etc/exports 条目的各个部分:
- <export>
- 正在被导出的目录。
- <host_or_network>
- 导出要共享给的主机或网络。例如,您可以指定主机名、IP 地址或 IP 网络。
- <options>
- 用于主机或网络的选项。
在客户端和服务器选项之间添加一个空格,会改变行为。例如,以下行含义不同:
/projects client.example.com(rw) /projects client.example.com (rw)
/projects client.example.com(rw)
/projects client.example.com (rw)
在第一行中,服务器只允许 client.example.com 以读写模式挂载 /projects 目录,而其他主机都不能挂载共享。但是,由于第二行中的 client.example.com 和 (rw) 之间的空格,服务器以只读模式(默认设置)将目录导出到 client.example.com,但所有其他主机都可以以读写模式挂载共享。
NFS 服务器对每个导出的目录使用以下默认设置:
| 默认设置 | 描述 |
|---|---|
|
| 以只读模式导出目录。 |
|
| 在之前的请求所做的更改写入磁盘之前,NFS 服务器不会回复请求。 |
|
| 如果服务器怀疑有另一个写请求待处理,那么服务器会延迟写入磁盘。 |
|
|
防止客户端上的 |
5.7. 配置只使用 NFSv4 的服务器 复制链接链接已复制到粘贴板!
如果您的网络中没有任何 NFSv3 客户端,您可以将 NFS 服务器配置为只支持 NFSv4 或其特定的次版本。在服务器上仅使用 NFSv4 可减少向网络开放的端口数量。
流程
安装
nfs-utils软件包:dnf install nfs-utils
# dnf install nfs-utilsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 编辑
/etc/nfs.conf文件,并进行以下更改:在
[nfsd]部分中禁用vers3参数来禁用 NFSv3:[nfsd] vers3=n
[nfsd] vers3=nCopy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:如果您只需要特定的 NFSv4 次版本,请取消所有
vers4.<minor_version>参数的注释,并相应地设置它们,例如:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用这个配置,服务器仅提供 NFS 版本 4.2。
重要如果您只需要特定的 NFSv4 次版本,则只为次版本设置参数。不要取消
vers4参数的注释,以避免不可预测的次版本的激活或停用。默认情况下,vers4参数启用或禁用所有 NFSv4 次版本。但是,如果您将vers4与其他vers参数一起设置了,则此行为会改变。
禁用所有与 NFSv3 相关的服务:
systemctl mask --now rpc-statd.service rpcbind.service rpcbind.socket
# systemctl mask --now rpc-statd.service rpcbind.service rpcbind.socketCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将
rpc.mountd守护进程配置为不侦听 NFSv3 挂载请求。使用以下内容创建/etc/systemd/system/nfs-mountd.service.d/v4only.conf文件:[Service] ExecStart= ExecStart=/usr/sbin/rpc.mountd --no-tcp --no-udp
[Service] ExecStart= ExecStart=/usr/sbin/rpc.mountd --no-tcp --no-udpCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重新载入
systemd管理器配置,并重启nfs-mountd服务:systemctl daemon-reload systemctl restart nfs-mountd
# systemctl daemon-reload # systemctl restart nfs-mountdCopy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:创建一个您要共享的目录,例如:
mkdir -p /nfs/projects/
# mkdir -p /nfs/projects/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果要共享一个现有目录,请跳过这一步。
在
/nfs/projects/目录上设置所需的权限:chmod 2770 /nfs/projects/ chgrp users /nfs/projects/
# chmod 2770 /nfs/projects/ # chgrp users /nfs/projects/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 这些命令为
/nfs/projects/目录上的users组设置写权限,并确保自动在此目录中创建的新条目上设置同样的组。为每个您要共享的每个目录向
/etc/exports文件中添加一个导出点:/nfs/projects/ 192.0.2.0/24(rw) 2001:db8::/32(rw)
/nfs/projects/ 192.0.2.0/24(rw) 2001:db8::/32(rw)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 此条目将
/nfs/projects/目录共享为可被192.0.2.0/24和2001:db8::/32子网中的客户端读写。在
firewalld中打开相关的端口:firewall-cmd --permanent --add-service nfs firewall-cmd --reload
# firewall-cmd --permanent --add-service nfs # firewall-cmd --reloadCopy to Clipboard Copied! Toggle word wrap Toggle overflow 启用并启动 NFS 服务器:
systemctl enable --now nfs-server
# systemctl enable --now nfs-serverCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
在服务器上,验证服务器是否只提供您配置的 NFS 版本:
cat /proc/fs/nfsd/versions -3 +4 -4.0 -4.1 +4.2
# cat /proc/fs/nfsd/versions -3 +4 -4.0 -4.1 +4.2Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在客户端上执行以下步骤:
安装
nfs-utils软件包:dnf install nfs-utils
# dnf install nfs-utilsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 挂载导出的 NFS 共享:
mount server.example.com:/nfs/projects/ /mnt/
# mount server.example.com:/nfs/projects/ /mnt/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以
users组成员的用户身份,在/mnt/中创建一个文件:touch /mnt/file
# touch /mnt/fileCopy to Clipboard Copied! Toggle word wrap Toggle overflow 列出目录以验证文件是否已创建:
ls -l /mnt/
# ls -l /mnt/ total 0 -rw-r--r--. 1 demo users 0 Jan 16 14:18 fileCopy to Clipboard Copied! Toggle word wrap Toggle overflow
5.8. 配置一个具有可选的 NFSv4 的 NFSv3 服务器 复制链接链接已复制到粘贴板!
在仍然使用 NFSv3 客户端的网络中,配置服务器,以使用 NFSv3 协议提供共享。如果在您的网络中还有较新的客户端,您也可以启用 NFSv4。默认情况下,Red Hat Enterprise Linux NFS 客户端使用服务器提供的最新 NFS 版本。
流程
安装
nfs-utils软件包:dnf install nfs-utils
# dnf install nfs-utilsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:默认启用 NFSv3 和 NFSv4。如果您不需要 NFSv4 或只需要特定的次版本,请取消所有
vers4.<minor_version>参数的注释,并相应地设置它们:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用这个配置,服务器仅提供 NFS 版本 3 和 4.2。
重要如果您只需要特定的 NFSv4 次版本,则只为次版本设置参数。不要取消
vers4参数的注释,以避免不可预测的次版本的激活或停用。默认情况下,vers4参数启用或禁用所有 NFSv4 次版本。但是,如果您将vers4与其他vers参数一起设置,则此行为会改变。默认情况下,NFSv3 RPC 服务使用随机端口。要启用防火墙配置,请在
/etc/nfs.conf文件中配置固定端口号:在
[lockd]部分中,为nlockmgrRPC 服务设置固定端口号,例如:[lockd] port=5555
[lockd] port=5555Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用这个设置时,服务会自动对 UDP 和 TCP 协议使用这个端口号。
在
[statd]部分中,为rpc.statd服务设置一个固定端口号,例如:[statd] port=6666
[statd] port=6666Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用这个设置时,服务会自动对 UDP 和 TCP 协议使用这个端口号。
可选:创建一个您要共享的目录,例如:
mkdir -p /nfs/projects/
# mkdir -p /nfs/projects/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果要共享一个现有目录,请跳过这一步。
在
/nfs/projects/目录上设置所需的权限:chmod 2770 /nfs/projects/ chgrp users /nfs/projects/
# chmod 2770 /nfs/projects/ # chgrp users /nfs/projects/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 这些命令为
/nfs/projects/目录上的users组设置写权限,并确保自动在此目录中创建的新条目上设置同样的组。为每个您要共享的每个目录向
/etc/exports文件中添加一个导出点:/nfs/projects/ 192.0.2.0/24(rw) 2001:db8::/32(rw)
/nfs/projects/ 192.0.2.0/24(rw) 2001:db8::/32(rw)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 此条目将
/nfs/projects/目录共享为可被192.0.2.0/24和2001:db8::/32子网中的客户端读写。在
firewalld中打开相关的端口:firewall-cmd --permanent --add-service={nfs,rpc-bind,mountd} firewall-cmd --permanent --add-port={5555/tcp,5555/udp,6666/tcp,6666/udp} firewall-cmd --reload# firewall-cmd --permanent --add-service={nfs,rpc-bind,mountd} # firewall-cmd --permanent --add-port={5555/tcp,5555/udp,6666/tcp,6666/udp} # firewall-cmd --reloadCopy to Clipboard Copied! Toggle word wrap Toggle overflow 启用并启动 NFS 服务器:
systemctl enable --now rpc-statd nfs-server
# systemctl enable --now rpc-statd nfs-serverCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
在服务器上,验证服务器是否只提供您配置的 NFS 版本:
cat /proc/fs/nfsd/versions +3 +4 -4.0 -4.1 +4.2
# cat /proc/fs/nfsd/versions +3 +4 -4.0 -4.1 +4.2Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在客户端上执行以下步骤:
安装
nfs-utils软件包:dnf install nfs-utils
# dnf install nfs-utilsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 挂载导出的 NFS 共享:
mount -o vers=<version> server.example.com:/nfs/projects/ /mnt/
# mount -o vers=<version> server.example.com:/nfs/projects/ /mnt/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 验证是否使用指定的 NFS 版本挂载了共享:
mount | grep "/mnt"
# mount | grep "/mnt" server.example.com:/nfs/projects/ on /mnt type nfs (rw,relatime,vers=3,...Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以
users组成员的用户身份,在/mnt/中创建一个文件:touch /mnt/file
# touch /mnt/fileCopy to Clipboard Copied! Toggle word wrap Toggle overflow 列出目录以验证文件是否已创建:
ls -l /mnt/
# ls -l /mnt/ total 0 -rw-r--r--. 1 demo users 0 Jan 16 14:18 fileCopy to Clipboard Copied! Toggle word wrap Toggle overflow
5.9. 在 NFS 服务器上启用配额支持 复制链接链接已复制到粘贴板!
如果要限制用户或组群可以存储的数据量,您可以在文件系统上配置配额。在 NFS 服务器上,rpc-rquotad 服务确保配额也应用于 NFS 客户端上的用户。
流程
验证是否已在您导出的目录上启用了配额:
对于 ext 文件系统,请输入:
quotaon -p /nfs/projects/
# quotaon -p /nfs/projects/ group quota on /nfs/projects (/dev/sdb1) is on user quota on /nfs/projects (/dev/sdb1) is on project quota on /nfs/projects (/dev/sdb1) is offCopy to Clipboard Copied! Toggle word wrap Toggle overflow 对于 XFS 文件系统,请输入:
findmnt /nfs/projects
# findmnt /nfs/projects TARGET SOURCE FSTYPE OPTIONS /nfs/projects /dev/sdb1 xfs rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,usrquota,grpquotaCopy to Clipboard Copied! Toggle word wrap Toggle overflow
安装
quota-rpc软件包:dnf install quota-rpc
# dnf install quota-rpcCopy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:默认情况下,配额 RPC 服务在端口 875 上运行。如果要在不同的端口上运行服务,请将
-p <port_number>附加到/etc/sysconfig/rpc-rquotad文件中的RPCRQUOTADOPTS变量中:RPCRQUOTADOPTS="-p __<port_number>__"
RPCRQUOTADOPTS="-p __<port_number>__"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:默认情况下,远程主机只能读取配额。要允许客户端设置配额,请将
-S选项附加到/etc/sysconfig/rpc-rquotad文件中的RPCRQUOTADOPTS变量中:RPCRQUOTADOPTS="-S"
RPCRQUOTADOPTS="-S"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在
firewalld中打开端口:firewall-cmd --permanent --add-port=875/udp firewall-cmd --reload
# firewall-cmd --permanent --add-port=875/udp # firewall-cmd --reloadCopy to Clipboard Copied! Toggle word wrap Toggle overflow 启用并启动
rpc-rquotad服务:systemctl enable --now rpc-rquotad
# systemctl enable --now rpc-rquotadCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
在客户端中:
挂载导出的共享:
mount server.example.com:/nfs/projects/ /mnt/
# mount server.example.com:/nfs/projects/ /mnt/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 显示配额。命令取决于导出的目录的文件系统。例如:
要显示所有挂载的 ext 文件系统上特定用户的配额,请输入:
quota -u <user_name>
# quota -u <user_name> Disk quotas for user demo (uid 1000): Filesystem space quota limit grace files quota limit grace server.example.com:/nfs/projects 0K 100M 200M 0 0 0Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要显示 XFS 文件系统上用户和组配额,请输入:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
5.10. 在 NFS 服务器上启用 NFS over RDMA 复制链接链接已复制到粘贴板!
远程直接内存访问(RDMA)是一种协议,它使客户端系统将数据直接从存储服务器的内存传到其自己的内存。这提高了存储吞吐量,降低了服务器和客户端之间数据传输的延迟,并减少了两端的 CPU 负载。如果 NFS 服务器和客户端都通过 RDMA 连接在一起,则客户端可以使用 NFSoRDMA 来挂载导出的目录。
先决条件
- NFS 服务正在运行且已配置
- 服务器上安装了 InfiniBand 或 RDMA over Converged Ethernet (RoCE)设备。
- IP over InfiniBand (IPoIB)已在服务器上配置,InfiniBand 设备已分配了一个 IP 地址。
流程
安装
rdma-core软件包:dnf install rdma-core
# dnf install rdma-coreCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果软件包已安装,请验证
/etc/rdma/modules/rdma.conf文件中的xprtrdma和svcrdma模块是否已取消注释:NFS over RDMA client support NFS over RDMA server support
# NFS over RDMA client support xprtrdma # NFS over RDMA server support svcrdmaCopy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:默认情况下,RDMA 上的 NFS 使用端口 20049。如果要使用不同的端口,请在
/etc/nfs.conf文件的[nfsd]部分中设置rdma-port设置:rdma-port=<port>
rdma-port=<port>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在
firewalld中打开 NFSoRDMA 端口:firewall-cmd --permanent --add-port={20049/tcp,20049/udp} firewall-cmd --reload# firewall-cmd --permanent --add-port={20049/tcp,20049/udp} # firewall-cmd --reloadCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您设置了与 20049 不同的端口,请调整端口号。
重启
nfs-server服务:systemctl restart nfs-server
# systemctl restart nfs-serverCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
在带有 InfiniBand 硬件的客户端上执行以下步骤:
安装以下软件包:
dnf install nfs-utils rdma-core
# dnf install nfs-utils rdma-coreCopy to Clipboard Copied! Toggle word wrap Toggle overflow 通过 RDMA 挂载导出的 NFS 共享:
mount -o rdma server.example.com:/nfs/projects/ /mnt/
# mount -o rdma server.example.com:/nfs/projects/ /mnt/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您设置了与默认端口号(20049)不同的端口号,请将 port
= <port_number>传给命令:mount -o rdma,port=<port_number> server.example.com:/nfs/projects/ /mnt/
# mount -o rdma,port=<port_number> server.example.com:/nfs/projects/ /mnt/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 验证共享是否已使用
rdma选项挂载了:mount | grep "/mnt"
# mount | grep "/mnt" server.example.com:/nfs/projects/ on /mnt type nfs (...,proto=rdma,...)Copy to Clipboard Copied! Toggle word wrap Toggle overflow
如果使用 Red Hat Enterprise Linux Identity Management (IdM),您可以将 NFS 服务器加入到 IdM 域中。这可让您集中管理用户和组,并使用 Kerberos 进行身份验证、完整性保护和流量加密。
先决条件
- NFS 服务器已在 Red Hat Enterprise Linux Identity Management (IdM)域中 注册。
- NFS 服务器正在运行并已配置。
流程
以 IdM 管理员身份获取 kerberos 票据:
kinit admin
# kinit adminCopy to Clipboard Copied! Toggle word wrap Toggle overflow 创建一个
nfs/<FQDN>服务主体:ipa service-add nfs/nfs_server.idm.example.com
# ipa service-add nfs/nfs_server.idm.example.comCopy to Clipboard Copied! Toggle word wrap Toggle overflow 从 IdM 检索
nfs服务主体,并将其存储在/etc/krb5.keytab文件中:ipa-getkeytab -s idm_server.idm.example.com -p nfs/nfs_server.idm.example.com -k /etc/krb5.keytab
# ipa-getkeytab -s idm_server.idm.example.com -p nfs/nfs_server.idm.example.com -k /etc/krb5.keytabCopy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:显示
/etc/krb5.keytab文件中的主体:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 默认情况下,当您将主机加入到 IdM 域时,IdM 客户端会将主机主体添加到
/etc/krb5.keytab文件中。如果缺少主机主体,请使用ipa-getkeytab -s idm_server.idm.example.com -p host/nfs_server.idm.example.com -k /etc/krb5.keytab命令添加它。使用
ipa-client-automount工具配置 IdM ID 的映射:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 更新
/etc/exports文件,并将 Kerberos 安全方法添加到客户端选项中。例如:/nfs/projects/ 192.0.2.0/24(rw,sec=krb5i)
/nfs/projects/ 192.0.2.0/24(rw,sec=krb5i)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您希望客户端可以从多个安全方法中选择,请使用冒号分割它们:
/nfs/projects/ 192.0.2.0/24(rw,sec=krb5:krb5i:krb5p)
/nfs/projects/ 192.0.2.0/24(rw,sec=krb5:krb5i:krb5p)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重新载入导出的文件系统:
exportfs -r
# exportfs -rCopy to Clipboard Copied! Toggle word wrap Toggle overflow
第 6 章 配置 Squid 缓存代理服务器 复制链接链接已复制到粘贴板!
Squid 是一个代理服务器,可缓存内容以减少带宽并更快地加载 Web 页面。本章论述了如何将 Squid 设置为 HTTP、HTTPS 和 FTP 协议的代理,以及验证和限制访问。
6.1. 将 Squid 设置为没有身份验证的缓存代理 复制链接链接已复制到粘贴板!
您可以将 Squid 配置为没有身份验证的缓存代理。此流程会根据 IP 范围限制对代理的访问。
先决条件
-
流程假设
/etc/squid/squid.conf文件是由squid软件包提供的。如果您在之前编辑了这个文件,请删除该文件并重新安装该软件包。
流程
安装
squid软件包:yum install squid
# yum install squidCopy to Clipboard Copied! Toggle word wrap Toggle overflow 编辑
/etc/squid/squid.conf文件:调整
localnet访问控制列表(ACL)以匹配应该允许使用代理的 IP 范围:acl localnet src 192.0.2.0/24 acl localnet 2001:db8:1::/64
acl localnet src 192.0.2.0/24 acl localnet 2001:db8:1::/64Copy to Clipboard Copied! Toggle word wrap Toggle overflow 默认情况下,
/etc/squid/squid.conf文件包含http_access allow localnet规则,该规则允许使用localnetACL 中指定的所有 IP 范围的代理。请注意,您必须在http_access allow localnet规则前指定所有localnetACL。重要删除所有与您的环境不匹配的现有
acl localnet条目。以下 ACL 存在于默认配置中,并将
443定义为使用 HTTPS 协议的端口:acl SSL_ports port 443
acl SSL_ports port 443Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果用户也可以在其它端口上使用 HTTPS 协议,请为每个端口添加 ACL:
acl SSL_ports port port_number
acl SSL_ports port port_numberCopy to Clipboard Copied! Toggle word wrap Toggle overflow 更新
acl Safe_ports规则列表,以配置 Squid 可对哪个端口建立连接。例如,若要配置使用代理的客户端只能访问端口 21(FTP)、80(HTTP)和 443(HTTPS)上的资源,请在配置中只保留以下acl Safe_ports语句:acl Safe_ports port 21 acl Safe_ports port 80 acl Safe_ports port 443
acl Safe_ports port 21 acl Safe_ports port 80 acl Safe_ports port 443Copy to Clipboard Copied! Toggle word wrap Toggle overflow 默认情况下,配置包含
http_access deny !Safe_ports规则,该规则定义禁止对定义在Safe_portsACL 中端口的访问。在
cache_dir参数中配置缓存类型、缓存目录的路径、缓存大小以及特定于其它缓存类型的设置:cache_dir ufs /var/spool/squid 10000 16 256
cache_dir ufs /var/spool/squid 10000 16 256Copy to Clipboard Copied! Toggle word wrap Toggle overflow 有了这些设置:
-
squid 使用
ufs缓存类型。 -
Squid 将其缓存存储在
/var/spool/squid/目录中。 -
缓存增长到
10000MB。 -
Squid 在
/var/spool/squid/目录中创建16level-1 子目录。 Squid 在每个 level-1 目录中创建
256个子目录。如果您没有设置
cache_dir指令,Squid 会在内存中存储缓存。
-
squid 使用
如果您在
cache_dir参数中设置了与/var/spool/squid/不同的缓存目录:创建缓存目录:
mkdir -p path_to_cache_directory
# mkdir -p path_to_cache_directoryCopy to Clipboard Copied! Toggle word wrap Toggle overflow 配置缓存目录的权限:
chown squid:squid path_to_cache_directory
# chown squid:squid path_to_cache_directoryCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您在
enforcing模式下运行 SELinux,请为缓存目录设置squid_cache_t上下文:semanage fcontext -a -t squid_cache_t "path_to_cache_directory(/.*)?" restorecon -Rv path_to_cache_directory
# semanage fcontext -a -t squid_cache_t "path_to_cache_directory(/.*)?" # restorecon -Rv path_to_cache_directoryCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果系统上没有
semanage工具,请安装policycoreutils-python-utils软件包。
在防火墙中打开
3128端口:firewall-cmd --permanent --add-port=3128/tcp firewall-cmd --reload
# firewall-cmd --permanent --add-port=3128/tcp # firewall-cmd --reloadCopy to Clipboard Copied! Toggle word wrap Toggle overflow 启用并启动
squid服务:systemctl enable --now squid
# systemctl enable --now squidCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
要验证代理是否正常工作,请使用 curl 工具下载网页:
curl -O -L "https://www.redhat.com/index.html" -x "proxy.example.com:3128"
# curl -O -L "https://www.redhat.com/index.html" -x "proxy.example.com:3128"
如果 curl 没有显示任何错误,并且 index.html 文件可以下载到当前目录中,那么代理工作正常。
6.2. 使用 LDAP 身份验证将 Squid 设置为缓存代理 复制链接链接已复制到粘贴板!
您可以将 Squid 配置为使用 LDAP 验证用户身份的缓存代理。此流程配置仅经过身份验证的用户可以使用代理。
先决条件
-
流程假设
/etc/squid/squid.conf文件是由squid软件包提供的。如果您在之前编辑了这个文件,请删除该文件并重新安装该软件包。 -
LDAP 目录中存在一个服务用户,如
uid=proxy_user,cn=users,cn=accounts,dc=example,dc=com。Squid 只使用此帐户搜索验证用户。如果存在身份验证用户,Squid 会以此用户的身份绑定到该目录以验证身份验证。
流程
安装
squid软件包:yum install squid
# yum install squidCopy to Clipboard Copied! Toggle word wrap Toggle overflow 编辑
/etc/squid/squid.conf文件:要配置
basic_ldap_auth帮助工具,请在/etc/squid/squid.conf的顶部添加以下配置条目:auth_param basic program /usr/lib64/squid/basic_ldap_auth -b "cn=users,cn=accounts,dc=example,dc=com" -D "uid=proxy_user,cn=users,cn=accounts,dc=example,dc=com" -W /etc/squid/ldap_password -f "(&(objectClass=person)(uid=%s))" -ZZ -H ldap://ldap_server.example.com:389
auth_param basic program /usr/lib64/squid/basic_ldap_auth -b "cn=users,cn=accounts,dc=example,dc=com" -D "uid=proxy_user,cn=users,cn=accounts,dc=example,dc=com" -W /etc/squid/ldap_password -f "(&(objectClass=person)(uid=%s))" -ZZ -H ldap://ldap_server.example.com:389Copy to Clipboard Copied! Toggle word wrap Toggle overflow 下面描述了在上面示例中传给
basic_ldap_auth帮助工具的参数:-
-b base_DN设置 LDAP 搜索基础。 -
-D proxy_service_user_DN设置 Squid 用来搜索目录中验证用户的帐户的可分辨名称(DN)。 -
-W path_to_password_file设置包含代理服务用户密码的文件路径。使用密码文件可防止在操作系统的进程列表中看到密码。 -f LDAP_filter指定 LDAP 搜索过滤器。Squid 将%s变量替换为验证用户提供的用户名。示例中的
(&(objectClass=person)(uid=%s))过滤器定义用户名必须与uid属性中设置的值匹配,并且与包含person对象类的目录条目匹配。-ZZ使用STARTTLS命令强制实现通过 LDAP 协议的 TLS 加密连接。在以下情况下省略-ZZ:- LDAP 服务器不支持加密的连接。
- URL 中指定的端口使用 LDAPS 协议。
- -H LDAP_URL 参数指定协议、主机名或 IP 地址以及 LDAP 服务器的端口,格式为 URL。
-
添加以下 ACL 和规则来配置 Squid 只允许经过身份验证的用户使用代理:
acl ldap-auth proxy_auth REQUIRED http_access allow ldap-auth
acl ldap-auth proxy_auth REQUIRED http_access allow ldap-authCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重要在
http_access deny所有规则前指定这些设置。删除以下规则以禁止绕过
localnetACL 中指定的 IP 范围的代理身份验证:http_access allow localnet
http_access allow localnetCopy to Clipboard Copied! Toggle word wrap Toggle overflow 以下 ACL 存在于默认配置中,并将
443定义为使用 HTTPS 协议的端口:acl SSL_ports port 443
acl SSL_ports port 443Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果用户也可以在其它端口上使用 HTTPS 协议,请为每个端口添加 ACL:
acl SSL_ports port port_number
acl SSL_ports port port_numberCopy to Clipboard Copied! Toggle word wrap Toggle overflow 更新
acl Safe_ports规则列表,以配置 Squid 可对哪个端口建立连接。例如,若要配置使用代理的客户端只能访问端口 21(FTP)、80(HTTP)和 443(HTTPS)上的资源,请在配置中只保留以下acl Safe_ports语句:acl Safe_ports port 21 acl Safe_ports port 80 acl Safe_ports port 443
acl Safe_ports port 21 acl Safe_ports port 80 acl Safe_ports port 443Copy to Clipboard Copied! Toggle word wrap Toggle overflow 默认情况下,配置包含
http_access deny !Safe_ports规则,该规则定义拒绝访问Safe_ports ACL中未定义的端口。在
cache_dir参数中配置缓存类型、缓存目录的路径、缓存大小以及特定于其它缓存类型的设置:cache_dir ufs /var/spool/squid 10000 16 256
cache_dir ufs /var/spool/squid 10000 16 256Copy to Clipboard Copied! Toggle word wrap Toggle overflow 有了这些设置:
-
squid 使用
ufs缓存类型。 -
Squid 将其缓存存储在
/var/spool/squid/目录中。 -
缓存增长到
10000MB。 -
Squid 在
/var/spool/squid/目录中创建16level-1 子目录。 Squid 在每个 level-1 目录中创建
256个子目录。如果您没有设置
cache_dir指令,Squid 会在内存中存储缓存。
-
squid 使用
如果您在
cache_dir参数中设置了与/var/spool/squid/不同的缓存目录:创建缓存目录:
mkdir -p path_to_cache_directory
# mkdir -p path_to_cache_directoryCopy to Clipboard Copied! Toggle word wrap Toggle overflow 配置缓存目录的权限:
chown squid:squid path_to_cache_directory
# chown squid:squid path_to_cache_directoryCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您在
enforcing模式下运行 SELinux,请为缓存目录设置squid_cache_t上下文:semanage fcontext -a -t squid_cache_t "path_to_cache_directory(/.*)?" restorecon -Rv path_to_cache_directory
# semanage fcontext -a -t squid_cache_t "path_to_cache_directory(/.*)?" # restorecon -Rv path_to_cache_directoryCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果系统上没有
semanage工具,请安装policycoreutils-python-utils软件包。
将 LDAP 服务用户的密码存储在
/etc/squid/ldap_password文件中,并为该文件设置合适的权限:echo "password" > /etc/squid/ldap_password chown root:squid /etc/squid/ldap_password chmod 640 /etc/squid/ldap_password
# echo "password" > /etc/squid/ldap_password # chown root:squid /etc/squid/ldap_password # chmod 640 /etc/squid/ldap_passwordCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在防火墙中打开
3128端口:firewall-cmd --permanent --add-port=3128/tcp firewall-cmd --reload
# firewall-cmd --permanent --add-port=3128/tcp # firewall-cmd --reloadCopy to Clipboard Copied! Toggle word wrap Toggle overflow 启用并启动
squid服务:systemctl enable --now squid
# systemctl enable --now squidCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
要验证代理是否正常工作,请使用 curl 工具下载网页:
curl -O -L "https://www.redhat.com/index.html" -x "user_name:password@proxy.example.com:3128"
# curl -O -L "https://www.redhat.com/index.html" -x "user_name:password@proxy.example.com:3128"
如果 curl 没有显示任何错误,并且 index.html 文件已下载到当前目录中,则代理工作正常。
故障排除步骤
验证 helper 工具是否正常工作:
使用您在
auth_param参数中使用的相同设置手动启动 helper 工具:/usr/lib64/squid/basic_ldap_auth -b "cn=users,cn=accounts,dc=example,dc=com" -D "uid=proxy_user,cn=users,cn=accounts,dc=example,dc=com" -W /etc/squid/ldap_password -f "(&(objectClass=person)(uid=%s))" -ZZ -H ldap://ldap_server.example.com:389
# /usr/lib64/squid/basic_ldap_auth -b "cn=users,cn=accounts,dc=example,dc=com" -D "uid=proxy_user,cn=users,cn=accounts,dc=example,dc=com" -W /etc/squid/ldap_password -f "(&(objectClass=person)(uid=%s))" -ZZ -H ldap://ldap_server.example.com:389Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输入一个有效的用户名和密码,然后按 Enter 键:
user_name password
user_name passwordCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果 helper 工具返回
OK,则身份验证成功。
6.3. 将 Squid 设置为带有 kerberos 身份验证的缓存代理 复制链接链接已复制到粘贴板!
您可以将 Squid 配置为使用 Kerberos 向活动目录(AD)验证用户的缓存代理。此流程配置仅经过身份验证的用户可以使用代理。
先决条件
-
流程假设
/etc/squid/squid.conf文件是由squid软件包提供的。如果您在之前编辑了这个文件,请删除该文件并重新安装该软件包。
流程
安装以下软件包:
yum install squid krb5-workstation
# yum install squid krb5-workstationCopy to Clipboard Copied! Toggle word wrap Toggle overflow 以 AD 域管理员身份进行身份验证:
kinit administrator@AD.EXAMPLE.COM
# kinit administrator@AD.EXAMPLE.COMCopy to Clipboard Copied! Toggle word wrap Toggle overflow 为 Squid 创建一个 keytab,将其存储在
/etc/squid/HTTP.keytab文件中,并将HTTP服务主体添加到 keytab 中:export KRB5_KTNAME=FILE:/etc/squid/HTTP.keytab net ads keytab CREATE -U administrator net ads keytab ADD HTTP -U administrator
# export KRB5_KTNAME=FILE:/etc/squid/HTTP.keytab # net ads keytab CREATE -U administrator # net ads keytab ADD HTTP -U administratorCopy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:如果系统最初是使用领域加入到 AD 域(通过
adcli)的,请使用以下说明来添加HTTP主体,并为 squid 创建一个 keytab 文件:将
HTTP服务主体添加到默认的 keytab 文件/etc/krb5.keytab中,并验证:adcli update -vvv --domain=ad.example.com --computer-name=PROXY --add-service-principal="HTTP/proxy.ad.example.com" -C klist -kte /etc/krb5.keytab | grep -i HTTP
# adcli update -vvv --domain=ad.example.com --computer-name=PROXY --add-service-principal="HTTP/proxy.ad.example.com" -C # klist -kte /etc/krb5.keytab | grep -i HTTPCopy to Clipboard Copied! Toggle word wrap Toggle overflow 加载
/etc/krb5.keytab文件,删除除HTTP以外的所有服务主体,并将剩余的主体保存到/etc/squid/HTTP.keytab文件中:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在
ktutil的交互式 shell 中,您可以使用不同的选项,直到所有不需要的主体都从 keytab 中删除了,例如:ktutil: delent 1
ktutil: delent 1Copy to Clipboard Copied! Toggle word wrap Toggle overflow Copy to Clipboard Copied! Toggle word wrap Toggle overflow 警告如果 SSSD 或 Samba/winbind 将更新机器帐户密码,则
/etc/krb5.keytab中的密钥可能会被更新。更新后,/etc/squid/HTTP.keytab中的密钥将停止工作,您需要再次执行ktutil步骤来将新密钥复制到 keytab 中。
将 keytab 文件的拥有者设为
squid用户:chown squid /etc/squid/HTTP.keytab
# chown squid /etc/squid/HTTP.keytabCopy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:验证 keytab 文件是否包含代理服务器的完全限定域名(FQDN)的
HTTP服务主体:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 编辑
/etc/squid/squid.conf文件:要配置
negotiate_kerberos_auth帮助工具,请将以下配置条目添加到/etc/squid/squid.conf的顶部:auth_param negotiate program /usr/lib64/squid/negotiate_kerberos_auth -k /etc/squid/HTTP.keytab -s HTTP/proxy.ad.example.com@AD.EXAMPLE.COM
auth_param negotiate program /usr/lib64/squid/negotiate_kerberos_auth -k /etc/squid/HTTP.keytab -s HTTP/proxy.ad.example.com@AD.EXAMPLE.COMCopy to Clipboard Copied! Toggle word wrap Toggle overflow 下面描述了在上例中传给
negotiate_kerberos_auth帮助工具的参数:-
-k file设置 keytab 文件的路径。请注意,squid 用户必须拥有这个文件的读取权限。 -s HTTP/host_name@kerberos_realm设置 Squid 使用的 Kerberos 主体。另外,您可以通过将以下一个或多个参数传给帮助工具来启用日志:
-
-i记录信息,如验证用户。 -d启用调试日志记录。Squid 将帮助工具中的调试信息记录到
/var/log/squid/cache.log文件。
-
添加以下 ACL 和规则来配置 Squid 只允许经过身份验证的用户使用代理:
acl kerb-auth proxy_auth REQUIRED http_access allow kerb-auth
acl kerb-auth proxy_auth REQUIRED http_access allow kerb-authCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重要在
http_access deny all规则前指定这些设置。删除以下规则以禁止绕过
localnetACL 中指定的 IP 范围的代理身份验证:http_access allow localnet
http_access allow localnetCopy to Clipboard Copied! Toggle word wrap Toggle overflow 以下 ACL 存在于默认配置中,并将
443定义为使用 HTTPS 协议的端口:acl SSL_ports port 443
acl SSL_ports port 443Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果用户也可以在其它端口上使用 HTTPS 协议,请为每个端口添加 ACL:
acl SSL_ports port port_number
acl SSL_ports port port_numberCopy to Clipboard Copied! Toggle word wrap Toggle overflow 更新
acl Safe_ports规则列表,以配置 Squid 可对哪个端口建立连接。例如,若要配置使用代理的客户端只能访问端口 21(FTP)、80(HTTP)和 443(HTTPS)上的资源,请在配置中只保留以下acl Safe_ports语句:acl Safe_ports port 21 acl Safe_ports port 80 acl Safe_ports port 443
acl Safe_ports port 21 acl Safe_ports port 80 acl Safe_ports port 443Copy to Clipboard Copied! Toggle word wrap Toggle overflow 默认情况下,配置包含
http_access deny !Safe_ports规则,该规则定义禁止对定义在Safe_portsACL 中端口的访问。在
cache_dir参数中配置缓存类型、缓存目录的路径、缓存大小以及特定于其它缓存类型的设置:cache_dir ufs /var/spool/squid 10000 16 256
cache_dir ufs /var/spool/squid 10000 16 256Copy to Clipboard Copied! Toggle word wrap Toggle overflow 有了这些设置:
-
squid 使用
ufs缓存类型。 -
Squid 将其缓存存储在
/var/spool/squid/目录中。 -
缓存增长到
10000MB。 -
Squid 在
/var/spool/squid/目录中创建16level-1 子目录。 Squid 在每个 level-1 目录中创建
256个子目录。如果您没有设置
cache_dir指令,Squid 会在内存中存储缓存。
-
squid 使用
如果您在
cache_dir参数中设置了与/var/spool/squid/不同的缓存目录:创建缓存目录:
mkdir -p path_to_cache_directory
# mkdir -p path_to_cache_directoryCopy to Clipboard Copied! Toggle word wrap Toggle overflow 配置缓存目录的权限:
chown squid:squid path_to_cache_directory
# chown squid:squid path_to_cache_directoryCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您在
enforcing模式下运行 SELinux,请为缓存目录设置squid_cache_t上下文:semanage fcontext -a -t squid_cache_t "path_to_cache_directory(/.*)?" restorecon -Rv path_to_cache_directory
# semanage fcontext -a -t squid_cache_t "path_to_cache_directory(/.*)?" # restorecon -Rv path_to_cache_directoryCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果系统上没有
semanage工具,请安装policycoreutils-python-utils软件包。
在防火墙中打开
3128端口:firewall-cmd --permanent --add-port=3128/tcp firewall-cmd --reload
# firewall-cmd --permanent --add-port=3128/tcp # firewall-cmd --reloadCopy to Clipboard Copied! Toggle word wrap Toggle overflow 启用并启动
squid服务:systemctl enable --now squid
# systemctl enable --now squidCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
要验证代理是否正常工作,请使用
curl工具下载网页:curl -O -L "https://www.redhat.com/index.html" --proxy-negotiate -u : -x "proxy.ad.example.com:3128"
# curl -O -L "https://www.redhat.com/index.html" --proxy-negotiate -u : -x "proxy.ad.example.com:3128"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果
curl没有显示任何错误,并且当前目录中存在index.html文件,则代理工作正常。
故障排除步骤
为 AD 帐户获取一个 Kerberos 票据:
kinit user@AD.EXAMPLE.COM
# kinit user@AD.EXAMPLE.COMCopy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:显示票据:
klist
# klistCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
negotiate_kerberos_auth_test工具测试身份验证:/usr/lib64/squid/negotiate_kerberos_auth_test proxy.ad.example.com
# /usr/lib64/squid/negotiate_kerberos_auth_test proxy.ad.example.comCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果助手工具返回令牌,则身份验证成功:
Token: YIIFtAYGKwYBBQUCoIIFqDC...
Token: YIIFtAYGKwYBBQUCoIIFqDC...Copy to Clipboard Copied! Toggle word wrap Toggle overflow
6.4. 在 Squid 中配置域拒绝列表 复制链接链接已复制到粘贴板!
通常,管理员想要阻止对特定域的访问。这部分论述了如何在 Squid 中配置域拒绝列表。
先决条件
- squid 被配置,用户可以使用代理。
流程
编辑
/etc/squid/squid.conf文件,并添加以下设置:acl domain_deny_list dstdomain "/etc/squid/domain_deny_list.txt" http_access deny all domain_deny_list
acl domain_deny_list dstdomain "/etc/squid/domain_deny_list.txt" http_access deny all domain_deny_listCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重要在允许访问用户或客户端的第一个
http_access allow语句前添加这些条目。创建
/etc/squid/domain_deny_list.txt文件,并添加您要阻止的域。例如,要阻止对example.com(包括子域)以及对example.net的访问,请添加:.example.com example.net
.example.com example.netCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重要如果您引用了 squid 配置中的
/etc/squid/domain_deny_list.txt文件,则该文件不能为空。如果文件为空,Squid 无法启动。重启
squid服务:systemctl restart squid
# systemctl restart squidCopy to Clipboard Copied! Toggle word wrap Toggle overflow
6.5. 将 Squid 服务配置为监听特定端口或 IP 地址 复制链接链接已复制到粘贴板!
默认情况下,Squid 代理服务侦听所有网络接口上的 3128 端口。您可以更改端口,并将 Squid 配置为监听特定的 IP 地址。
先决条件
-
squid软件包已安装。
流程
编辑
/etc/squid/squid.conf文件:要设置 Squid 服务侦听的端口,请在
http_port参数中设置端口号。例如,要将端口设为8080,请设置:http_port 8080
http_port 8080Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要配置 Squid 服务侦听的 IP 地址,请在
http_port参数中设置 IP 地址和端口号。例如,若要配置 Squid 仅侦听192.0.2.1IP 地址的端口3128,请设置:http_port 192.0.2.1:3128
http_port 192.0.2.1:3128Copy to Clipboard Copied! Toggle word wrap Toggle overflow 向配置文件中添加多个
http_port参数,以配置 Squid 侦听多个端口和 IP 地址:http_port 192.0.2.1:3128 http_port 192.0.2.1:8080
http_port 192.0.2.1:3128 http_port 192.0.2.1:8080Copy to Clipboard Copied! Toggle word wrap Toggle overflow
如果您配置了 Squid 使用不同的端口作为默认值(
3128):在防火墙中打开端口:
firewall-cmd --permanent --add-port=port_number/tcp firewall-cmd --reload
# firewall-cmd --permanent --add-port=port_number/tcp # firewall-cmd --reloadCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您在 enforcing 模式下运行 SELinux,请将端口分配给
squid_port_t端口类型定义:semanage port -a -t squid_port_t -p tcp port_number
# semanage port -a -t squid_port_t -p tcp port_numberCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果系统上没有
semanage工具,请安装policycoreutils-python-utils软件包。
重启
squid服务:systemctl restart squid
# systemctl restart squidCopy to Clipboard Copied! Toggle word wrap Toggle overflow
第 7 章 数据库服务器 复制链接链接已复制到粘贴板!
7.1. 介绍 复制链接链接已复制到粘贴板!
数据库服务器是一种提供数据库管理系统 (DBMS) 功能的服务。DBMS 提供数据库管理的实用程序,并与最终用户、应用程序和数据库交互。
Red Hat Enterprise Linux 8 提供以下数据库管理系统:
- MariaDB 10.3
- MariaDB 10.5 - 从 RHEL 8.4 开始提供
- MariaDB 10.11 - 从 RHEL 8.10 开始提供
- MySQL 8.0
- PostgreSQL 10
- PostgreSQL 9.6
- PostgreSQL 12 - 从 RHEL 8.1.1 开始提供
- PostgreSQL 13 - 从 RHEL 8.4 开始提供
- PostgreSQL 15 - 从 RHEL 8.8 开始提供
- PostgreSQL 16 - 从 RHEL 8.10 开始提供
7.2. 使用 MariaDB 复制链接链接已复制到粘贴板!
MariaDB 服务器是一个基于 MySQL 技术的开源、快速、强大的数据库服务器。MariaDB 是一个关系型数据库,它将数据转换为结构化信息,并为访问数据提供 SQL 接口。它包含多个存储引擎和插件,以及地理信息系统(GIS)和 JavaScript 对象表示法(JSON)功能。
了解如何在 RHEL 系统上安装和配置 MariaDB,如何备份 MariaDB 数据、如何从早期的 MariaDB 版本迁移,以及如何使用 MariaDB Galera 集群 复制数据库。
7.2.1. 安装 MariaDB 复制链接链接已复制到粘贴板!
在 RHEL 8 中,以下版本都提供了 MariaDB 服务器,每个版本都由单独的流提供:
- MariaDB 10.3
- MariaDB 10.5 - 从 RHEL 8.4 开始提供
- MariaDB 10.11 - 从 RHEL 8.10 开始提供
按照设计,无法并行安装同一模块的多个版本(stream)。因此,您必须从 mariadb 模块中只选择一个可用的流。您可以在容器中使用不同版本的 MariaDB 数据库服务器,请参阅 在容器中运行多个 MariaDB 版本。
由于 RPM 软件包有冲突,MariaDB 和 MySQL 数据库服务器无法在 RHEL 8 中并行安装。您可以在容器中并行使用 MariaDB 和 MySQL 数据库服务器,请参阅 在容器中运行多个 MySQL 和 MariaDB 版本。
要安装 MariaDB,请使用以下流程:
流程
通过从
mariadb模块选择流(版本),并指定server配置文件来安装 MariaDB 服务器软件包。例如:yum module install mariadb:10.3/server
# yum module install mariadb:10.3/serverCopy to Clipboard Copied! Toggle word wrap Toggle overflow 启动
mariadb服务:systemctl start mariadb.service
# systemctl start mariadb.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 启用
mariadb服务,使其在引导时启动:systemctl enable mariadb.service
# systemctl enable mariadb.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 推荐用于 MariaDB 10.3: 要在安装 MariaDB 时提高安全性,请运行以下命令:
mysql_secure_installation
$ mysql_secure_installationCopy to Clipboard Copied! Toggle word wrap Toggle overflow 此命令启动一个完全交互的脚本,该脚本会提示过程中的每一步。该脚本可让您通过以下方法提高安全性:
- 为 root 帐户设置密码
- 删除匿名用户
禁止远程 root 登录(在本地主机之外)
注意mysql_secure_installation 脚本在 MariaDB 10.5 或更高版本中不再有价值。从 MariaDB 10.5 开始,安全增强是默认行为的一部分。
如果要从 RHEL 8 中的早期 mariadb 流升级,请按照 切换到更新的流 和 从 MariaDB 10.3 升级到 MariaDB 10.5 或 从 MariaDB 10.5 升级到 MariaDB 10.11 中描述的流程操作。
7.2.2. 在容器中运行多个 MariaDB 版本 复制链接链接已复制到粘贴板!
要在同一主机上运行不同版本的 MariaDB,请在容器中运行它们,因为您无法并行安装同一模块的多个版本(流)。
先决条件
-
container-tools模块已安装。
流程
使用您的红帽客户门户网站帐户向
registry.redhat.io注册中心进行身份验证:podman login registry.redhat.io
# podman login registry.redhat.ioCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您已登录到容器注册中心,请跳过这一步。
在容器中运行 MariaDB 10.3 :
podman run -d --name <container_name> -e MYSQL_ROOT_PASSWORD=<mariadb_root_password> -p <host_port_1>:3306 rhel8/mariadb-103
$ podman run -d --name <container_name> -e MYSQL_ROOT_PASSWORD=<mariadb_root_password> -p <host_port_1>:3306 rhel8/mariadb-103Copy to Clipboard Copied! Toggle word wrap Toggle overflow 有关使用此容器镜像用法的更多信息,请参阅 红帽生态系统目录。
在容器中运行 MariaDB 10.5 :
podman run -d --name <container_name> -e MYSQL_ROOT_PASSWORD=<mariadb_root_password> -p <host_port_2>:3306 rhel8/mariadb-105
$ podman run -d --name <container_name> -e MYSQL_ROOT_PASSWORD=<mariadb_root_password> -p <host_port_2>:3306 rhel8/mariadb-105Copy to Clipboard Copied! Toggle word wrap Toggle overflow 有关使用此容器镜像用法的更多信息,请参阅 红帽生态系统目录。
在容器中运行 MariaDB 10.11 :
podman run -d --name <container_name> -e MYSQL_ROOT_PASSWORD=<mariadb_root_password> -p <host_port_3>:3306 rhel8/mariadb-1011
$ podman run -d --name <container_name> -e MYSQL_ROOT_PASSWORD=<mariadb_root_password> -p <host_port_3>:3306 rhel8/mariadb-1011Copy to Clipboard Copied! Toggle word wrap Toggle overflow 有关使用此容器镜像用法的更多信息,请参阅 红帽生态系统目录。
注意容器名称和两个数据库服务器的主机端口必须不同。
要确保客户端可以访问网络上的数据库服务器,请在防火墙中打开主机端口:
firewall-cmd --permanent --add-port={<host_port_1>/tcp,<host_port_2>/tcp,<host_port_3>/tcp...} firewall-cmd --reload# firewall-cmd --permanent --add-port={<host_port_1>/tcp,<host_port_2>/tcp,<host_port_3>/tcp...} # firewall-cmd --reloadCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
显示正在运行的容器的信息:
podman ps
$ podman psCopy to Clipboard Copied! Toggle word wrap Toggle overflow 连接到数据库服务器,并以 root 用户身份登录:
mysql -u root -p -h localhost -P <host_port> --protocol tcp
# mysql -u root -p -h localhost -P <host_port> --protocol tcpCopy to Clipboard Copied! Toggle word wrap Toggle overflow
7.2.3. 配置 MariaDB 复制链接链接已复制到粘贴板!
要为联网配置 MariaDB 服务器,请使用以下流程:
流程
编辑
/etc/my.cnf.d/mariadb-server.cnf文件的[mysqld]部分。您可以设置以下配置指令:bind-address- 是服务器监听的地址。可能的选项有:- 主机名
- IPv4 地址
- IPv6 地址
skip-networking- 控制服务器是否监听 TCP/IP 连接。可能的值有:- 0 - 侦听所有客户端
- 1 - 只监听本地客户端
-
port- MariaDB 监听 TCP/IP 连接的端口。
重启
mariadb服务:systemctl restart mariadb.service
# systemctl restart mariadb.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow
7.2.4. 在 MariaDB 服务器上设置 TLS 加密 复制链接链接已复制到粘贴板!
默认情况下,MariaDB 使用未加密的连接。对于安全连接,在 MariaDB 服务器上启用 TLS 支持,并将您的客户端配置为建立加密连接。
7.2.4.1. 将 CA 证书、服务器证书和私钥放在 MariaDB 服务器上 复制链接链接已复制到粘贴板!
在 MariaDB 服务器中启用 TLS 加密前,先在 MariaDB 服务器上存储证书颁发机构(CA)证书、服务器证书和私钥。
先决条件
以下 Privacy Enhanced Mail(PEM)格式的文件已复制到服务器:
-
服务器的私钥:
server.example.com.key.pem -
服务器证书:
server.example.com.crt.pem -
证书颁发机构(CA)证书:
ca.crt.pem
有关创建私钥和证书签名请求(CSR),以及从 CA 请求证书的详情,请查看您的 CA 文档。
-
服务器的私钥:
流程
将 CA 和服务器证书存储在
/etc/pki/tls/certs/目录中:mv <path>/server.example.com.crt.pem /etc/pki/tls/certs/ mv <path>/ca.crt.pem /etc/pki/tls/certs/
# mv <path>/server.example.com.crt.pem /etc/pki/tls/certs/ # mv <path>/ca.crt.pem /etc/pki/tls/certs/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 设置 CA 和服务器证书的权限,使 MariaDB 服务器能够读取文件:
chmod 644 /etc/pki/tls/certs/server.example.com.crt.pem /etc/pki/tls/certs/ca.crt.pem
# chmod 644 /etc/pki/tls/certs/server.example.com.crt.pem /etc/pki/tls/certs/ca.crt.pemCopy to Clipboard Copied! Toggle word wrap Toggle overflow 由于证书是建立安全连接前通信的一部分,因此任何客户端都可以在不需要身份验证的情况下检索它们。因此,您不需要对 CA 和服务器证书文件设置严格的权限。
将服务器的私钥存储在
/etc/pki/tls/private/目录中:mv <path>/server.example.com.key.pem /etc/pki/tls/private/
# mv <path>/server.example.com.key.pem /etc/pki/tls/private/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 对服务器的私钥设置安全权限:
chmod 640 /etc/pki/tls/private/server.example.com.key.pem chgrp mysql /etc/pki/tls/private/server.example.com.key.pem
# chmod 640 /etc/pki/tls/private/server.example.com.key.pem # chgrp mysql /etc/pki/tls/private/server.example.com.key.pemCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果未授权的用户可以访问私钥,因此到 MariaDB 服务器的连接不再是安全的。
恢复 SELinux 上下文:
restorecon -Rv /etc/pki/tls/
# restorecon -Rv /etc/pki/tls/Copy to Clipboard Copied! Toggle word wrap Toggle overflow
7.2.4.2. 在 MariaDB 服务器上配置 TLS 复制链接链接已复制到粘贴板!
要提高安全性,请在 MariaDB 服务器上启用 TLS 支持。因此,客户端可以使用 TLS 加密与服务器传输数据。
先决条件
- MariaDB 服务器已安装。
-
mariadb服务正在运行。 服务器上存在 Privacy Enhanced Mail(PEM)格式的以下文件,并可由
mysql用户读取:-
服务器的私钥:
/etc/pki/tls/private/server.example.com.key.pem -
服务器证书:
/etc/pki/tls/certs/server.example.com.crt.pem -
证书颁发机构(CA)证书
/etc/pki/tls/certs/ca.crt.pem
-
服务器的私钥:
- 主题可分辨名称(DN)或服务器证书中的主题备用名称(SAN)字段与服务器的主机名匹配。
流程
创建
/etc/my.cnf.d/mariadb-server-tls.cnf文件:添加以下内容来配置到私钥、服务器和 CA 证书的路径:
[mariadb] ssl_key = /etc/pki/tls/private/server.example.com.key.pem ssl_cert = /etc/pki/tls/certs/server.example.com.crt.pem ssl_ca = /etc/pki/tls/certs/ca.crt.pem
[mariadb] ssl_key = /etc/pki/tls/private/server.example.com.key.pem ssl_cert = /etc/pki/tls/certs/server.example.com.crt.pem ssl_ca = /etc/pki/tls/certs/ca.crt.pemCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您有一个证书撤销列表(CRL),则将 MariaDB 服务器配置为使用它:
ssl_crl = /etc/pki/tls/certs/example.crl.pem
ssl_crl = /etc/pki/tls/certs/example.crl.pemCopy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:如果您运行 MariaDB 10.5.2 或更高版本,那么您可以拒绝未加密的连接尝试。要启用此功能,请附加:
require_secure_transport = on
require_secure_transport = onCopy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:如果您运行 MariaDB 10.4.6 或更高版本,那么您可以设置服务器应该支持的 TLS 版本。例如,要支持 TLS 1.2 和 TLS 1.3,请附加:
tls_version = TLSv1.2,TLSv1.3
tls_version = TLSv1.2,TLSv1.3Copy to Clipboard Copied! Toggle word wrap Toggle overflow 默认情况下,服务器支持 TLS 1.1、TLS 1.2 和 TLS 1.3。
重启
mariadb服务:systemctl restart mariadb.service
# systemctl restart mariadb.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
要简化故障排除,请在将本地客户端配置为使用 TLS 加密之前在 MariaDB 服务器上执行以下步骤:
验证 MariaDB 现在是否启用了 TLS 加密:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果
have_ssl变量设置为yes,则启用 TLS 加密。如果您将 MariaDB 服务配置为只支持特定的 TLS 版本,则显示
tls_version变量:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
7.2.4.3. 对特定的用户帐户需要 TLS 加密连接 复制链接链接已复制到粘贴板!
可以访问敏感数据的用户应始终使用 TLS 加密连接,以避免通过网络发送未加密的数据。
如果您无法在服务器上配置所有连接都需要安全传输(require_secure_transport = on),请将单个用户帐户配置为需要 TLS 加密。
先决条件
- MariaDB 服务器启用了 TLS 支持。
- 您配置为需要安全传输的用户已存在。
- 客户端信任签发服务器证书的 CA 证书。
流程
以管理员用户身份连接到 MariaDB 服务器:
mysql -u root -p -h server.example.com
# mysql -u root -p -h server.example.comCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您的管理用户没有远程访问服务器的权限,请在 MariaDB 服务器上执行命令,并连接到
localhost。使用
REQUIRE SSL子句强制用户必须使用 TLS 加密连接进行连接:MariaDB [(none)]> ALTER USER 'example'@'%' REQUIRE SSL;
MariaDB [(none)]> ALTER USER 'example'@'%' REQUIRE SSL;Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
使用 TLS 加密,以
example用户身份连接到服务器:mysql -u example -p -h server.example.com --ssl
# mysql -u example -p -h server.example.com --ssl ... MariaDB [(none)]>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果没有显示错误,且您可以访问交互式 MariaDB 控制台,则与 TLS 的连接成功。
尝试以禁用 TLS 的
example用户身份进行连接:mysql -u example -p -h server.example.com --skip-ssl
# mysql -u example -p -h server.example.com --skip-ssl ERROR 1045 (28000): Access denied for user 'example'@'server.example.com' (using password: YES)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 服务器拒绝登录尝试,因为此用户需要 TLS,但禁用了(
--skip-ssl)。
7.2.5. 在 MariaDB 客户端中全局启用 TLS 加密 复制链接链接已复制到粘贴板!
如果您的 MariaDB 服务器支持 TLS 加密,请将客户端配置为仅建立安全连接,并验证服务器证书。这个流程描述了如何为服务器上的所有用户启用 TLS 支持。
7.2.5.1. 将 MariaDB 客户端配置为默认使用 TLS 加密 复制链接链接已复制到粘贴板!
在 RHEL 上,您可以全局配置 MariaDB 客户端使用 TLS 加密,并验证服务器证书中的通用名称(CN)与用户连接的主机名匹配。这可防止中间人攻击。
先决条件
- MariaDB 服务器启用了 TLS 支持。
- 如果 RHEL 不信任发布服务器证书的证书颁发机构(CA),则 CA 证书已被复制到客户端。
流程
如果 RHEL 不信任发布服务器证书的 CA:
将 CA 证书复制到
/etc/pki/ca-trust/source/anchors/目录中:cp <path>/ca.crt.pem /etc/pki/ca-trust/source/anchors/
# cp <path>/ca.crt.pem /etc/pki/ca-trust/source/anchors/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 设置允许所有用户读取 CA 证书文件的权限:
chmod 644 /etc/pki/ca-trust/source/anchors/ca.crt.pem
# chmod 644 /etc/pki/ca-trust/source/anchors/ca.crt.pemCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重建 CA 信任数据库:
update-ca-trust
# update-ca-trustCopy to Clipboard Copied! Toggle word wrap Toggle overflow
使用以下内容创建
/etc/my.cnf.d/mariadb-client-tls.cnf文件:[client-mariadb] ssl ssl-verify-server-cert
[client-mariadb] ssl ssl-verify-server-certCopy to Clipboard Copied! Toggle word wrap Toggle overflow 这些设置定义 MariaDB 客户端使用 TLS 加密(
ssl),并且客户端将主机名与服务器证书中的 CN(ssl-verify-server-cert)进行比较。
验证
使用主机名连接到服务器,并显示服务器的状态:
mysql -u root -p -h server.example.com -e status
# mysql -u root -p -h server.example.com -e status ... SSL: Cipher in use is TLS_AES_256_GCM_SHA384Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果
SSL条目中包含Cipher in use is…,则连接是加密的。请注意,您在这个命令中使用的用户具有远程身份验证的权限。
如果您连接的主机名与服务器的 TLS 证书中的主机名不匹配,则
ssl-verify-server-cert参数会导致连接失败。例如,如果您连接到localhost:mysql -u root -p -h localhost -e status
# mysql -u root -p -h localhost -e status ERROR 2026 (HY000): SSL connection error: Validation of SSL server certificate failedCopy to Clipboard Copied! Toggle word wrap Toggle overflow
7.2.6. 备份 MariaDB 数据 复制链接链接已复制到粘贴板!
从 MariaDB 数据库备份数据有两种主要方法:
- 逻辑备份
逻辑备份由恢复数据所需的 SQL 语句组成。这种类型的备份以纯文本文件的形式导出信息和记录。
与物理备份相比,逻辑备份的主要优势在于可移植性和灵活性。数据可以在其他硬件配置、MariaDB 版本或数据库管理系统(DBMS)上恢复,这无法通过物理备份来实现。
请注意,逻辑备份只有在
mariadb.service运行时才能执行。逻辑备份不包括日志和配置文件。- 物理备份
物理备份由存储内容的文件和目录的副本组成。
与逻辑备份相比,物理备份具有以下优点:
- 输出更为紧凑。
- 备份的大小会较小。
- 备份和恢复速度更快。
备份包括日志和配置文件。
请注意,当
mariadb.service没有运行或者数据库中的所有表都被锁定以防止备份期间更改时,必须执行物理备份。
您可以使用以下一种 MariaDB 备份方法,来从 MariaDB 数据库备份数据:
-
使用
mysqldump的逻辑备份 -
使用
Mariabackup工具的物理在线备份 - 文件系统备份
- 作为备份解决方案复制
7.2.6.1. 使用 mysqldump 执行逻辑备份 复制链接链接已复制到粘贴板!
mysqldump 客户端是一种备份实用程序,可用于转储数据库或数据库集合,用于备份或传输到其他数据库服务器。mysqldump 的输出通常包含 SQL 语句,用于重新创建服务器表结构、给它填充数据或两者兼而有之。mysqldump 也可以以其他格式生成文件,包括 XML 和分隔的文本格式,如 CSV。
要执行 mysqldump 备份,您可以使用以下一种选项:
- 备份一个或多个所选的数据库
- 备份所有数据库
- 从一个数据库备份表子集
流程
要转储单个数据库,请运行:
mysqldump [options] --databases db_name > backup-file.sql
# mysqldump [options] --databases db_name > backup-file.sqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 要一次转储多个数据库,请运行:
mysqldump [options] --databases db_name1 [db_name2 …] > backup-file.sql
# mysqldump [options] --databases db_name1 [db_name2 …] > backup-file.sqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 要转储所有数据库,请运行:
mysqldump [options] --all-databases > backup-file.sql
# mysqldump [options] --all-databases > backup-file.sqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 要将一个或多个转储的完整数据库加载回服务器,请运行:
mysql < backup-file.sql
# mysql < backup-file.sqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 要将数据库加载到远程 MariaDB 服务器,请运行:
mysql --host=remote_host < backup-file.sql
# mysql --host=remote_host < backup-file.sqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 要转储一个数据库中的表的子集,请在
mysqldump命令的末尾添加所选表的列表:mysqldump [options] db_name [tbl_name …] > backup-file.sql
# mysqldump [options] db_name [tbl_name …] > backup-file.sqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 要载入从一个数据库转储的表的子集,请运行:
mysql db_name < backup-file.sql
# mysql db_name < backup-file.sqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注意此时,db_name 数据库必须存在。
要查看 mysqldump 支持的选项列表,请运行:
mysqldump --help
$ mysqldump --helpCopy to Clipboard Copied! Toggle word wrap Toggle overflow
7.2.6.2. 使用 Mariabackup 工具执行物理在线备份 复制链接链接已复制到粘贴板!
mariabackup 是一个基于 Percona XtraBackup 技术的工具,能够执行 InnoDB、Aria 和 MyISAM 表的物理在线备份。这个工具是由 AppStream 存储库中的 mariadb-backup 软件包提供的。
mariabackup 支持对 MariaDB 服务器的全备份功能,其中包括加密和压缩的数据。
先决条件
mariadb-backup软件包已在系统中安装:yum install mariadb-backup
# yum install mariadb-backupCopy to Clipboard Copied! Toggle word wrap Toggle overflow
- 您必须为 Mariabackup 提供要在其下运行备份的用户的凭证。您可以在命令行中或通过配置文件来提供凭证。
-
Mariabackup 的用户必须具有
RELOAD、LOCK TABLES和REPLICATION CLIENT特权。
要使用 Mariabackup 创建数据库备份,请使用以下流程:
流程
要在在命令行上提供凭证的同时创建备份,请运行:
mariabackup --backup --target-dir <backup_directory> --user <backup_user> --password <backup_passwd>
$ mariabackup --backup --target-dir <backup_directory> --user <backup_user> --password <backup_passwd>Copy to Clipboard Copied! Toggle word wrap Toggle overflow target-dir选项定义存储备份文件的目录。如果要执行全备份,目标目录必是空或者不存在。user和password选项允许您配置用户名和密码。要使用配置文件中设置的凭证创建备份:
-
在
/etc/my.cnf.d/目录中创建配置文件,例如/etc/my.cnf.d/mariabackup.cnf。 将以下行添加到新文件的
[xtrabackup]或[mysqld]部分中:[xtrabackup] user=myuser password=mypassword
[xtrabackup] user=myuser password=mypasswordCopy to Clipboard Copied! Toggle word wrap Toggle overflow 执行备份:
mariabackup --backup --target-dir <backup_directory>
$ mariabackup --backup --target-dir <backup_directory>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
-
在
7.2.6.3. 使用 Mariabackup 工具恢复数据 复制链接链接已复制到粘贴板!
备份完成后,您可以使用 mariabackup 命令及以下一个选项来从备份中恢复数据:
-
--copy-back允许您保存原始的备份文件。 -
--move-back将备份文件移到数据目录中,并删除原始的备份文件。
要使用 Mariabackup 工具来恢复数据,请使用以下流程:
先决条件
验证
mariadb服务是否没有运行:systemctl stop mariadb.service
# systemctl stop mariadb.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 验证数据目录是否为空。
-
Mariabackup 的用户必须具有
RELOAD、LOCK TABLES和REPLICATION CLIENT特权。
流程
运行
mariabackup命令:要恢复数据并保留原始备份文件,请使用
--copy-back选项:mariabackup --copy-back --target-dir=/var/mariadb/backup/
$ mariabackup --copy-back --target-dir=/var/mariadb/backup/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要恢复数据并删除原始备份文件,请使用
--move-back选项:mariabackup --move-back --target-dir=/var/mariadb/backup/
$ mariabackup --move-back --target-dir=/var/mariadb/backup/Copy to Clipboard Copied! Toggle word wrap Toggle overflow
修复文件权限。
恢复数据库时,Mariabackup 会保留备份的文件和目录特权。但是,Mariabackup 以恢复数据库的用户和组的身份将文件写入磁盘。恢复备份后,您可能需要调整数据目录的所有者,以匹配 MariaDB 服务器的用户和组,通常两者都为
mysql。例如,要递归地将文件的所有权改为
mysql用户和组:chown -R mysql:mysql /var/lib/mysql/
# chown -R mysql:mysql /var/lib/mysql/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 启动
mariadb服务:systemctl start mariadb.service
# systemctl start mariadb.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow
7.2.6.4. 执行文件系统备份 复制链接链接已复制到粘贴板!
要创建 MariaDB 数据文件的文件系统备份,请将 MariaDB 数据目录的内容复制到您的备份位置。
要同时备份当前的配置或日志文件,请使用以下流程的可选步骤:
流程
停止
mariadb服务:systemctl stop mariadb.service
# systemctl stop mariadb.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将数据文件复制到所需位置:
cp -r /var/lib/mysql /backup-location
# cp -r /var/lib/mysql /backup-locationCopy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:将配置文件复制到所需位置:
cp -r /etc/my.cnf /etc/my.cnf.d /backup-location/configuration
# cp -r /etc/my.cnf /etc/my.cnf.d /backup-location/configurationCopy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:将日志文件复制到所需位置:
cp /var/log/mariadb/* /backup-location/logs
# cp /var/log/mariadb/* /backup-location/logsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 启动
mariadb服务:systemctl start mariadb.service
# systemctl start mariadb.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将备份位置的备份数据加载到
/var/lib/mysql目录时,请确保mysql:mysql是/var/lib/mysql中所有数据的所有者:chown -R mysql:mysql /var/lib/mysql
# chown -R mysql:mysql /var/lib/mysqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
7.2.6.5. 作为备份解决方案复制 复制链接链接已复制到粘贴板!
复制是源服务器的一个替代的备份解决方案。如果源服务器复制到副本服务器,备份可以在副本上运行,而不会对源造成任何影响。当您关闭副本,并从副本备份数据时,源仍然可以运行。
复制本身并不是一个足够的备份解决方案。复制可以防止源服务器出现硬件故障,但它不能确保防止数据的丢失。建议您将对副本的任何其他备份解决方案与此方法一起使用。
7.2.7. 迁移到 MariaDB 10.3 复制链接链接已复制到粘贴板!
RHEL 7 包含了 MariaDB 5.5,其作为来自 MySQL 数据库系列的服务器的默认实现。MariaDB 数据库服务器的后续版本可作为 RHEL 7 的软件集合提供。RHEL 8 提供 MariaDB 10.3、MariaDB 10.5、MariaDB 10.11 和 MySQL 8.0。
这部分描述了从 RHEL 7 或 MariaDB 的红帽软件集合版本迁移到 MariaDB 10.3。
如果要在 RHEL 8 中从 MariaDB 10.3 迁移到 MariaDB 10.5,请参阅 从 MariaDB 10.3 升级到 MariaDB 10.5。
如果要在 RHEL 8 中从 MariaDB 10.5 迁移到 MariaDB 10.11,请参阅 从 MariaDB 10.5 升级到 MariaDB 10.11。
7.2.7.1. RHEL 7 和 RHEL 8 版本的 MariaDB 之间的显著区别 复制链接链接已复制到粘贴板!
MariaDB 5.5 和 MariaDB 10.3 之间的最重要的变化是:
- MariaDB Galera 集群 是同步的多源集群,自 10.1 起就是 MariaDB 的标准部分。
- 默认情况下 ARCHIVE 存储引擎不再启用,插件需要专门启用。
- 默认情况下 BLACKHOLE 存储引擎不再启用,插件需要专门启用。
InnoDB 而不是 XtraDB 被用作默认存储引擎,后者用于 MariaDB 10.1 及更早的版本。
如需了解更多详细信息,请参阅 InnoDB 而不是 XtraDB。
-
新的
mariadb-connector-c软件包为 MySQL 和 MariaDB 提供通用客户端库。这个程序库可用于 MySQL 和 MariaDB 数据库服务器的任何版本。因此,用户可以将应用程序的一个构建连接到 Red Hat Enterprise Linux 8 发布的任何 MySQL 和 MariaDB 服务器。
要从 MariaDB 5.5 迁移到 MariaDB 10.3,您需要执行多个 配置更改。
7.2.7.2. 配置更改 复制链接链接已复制到粘贴板!
从 MariaDB 5.5 升级到 MariaDB10.3 的迁移路径是首先升级到 MariaDB 10.0,然后再每次升级一个版本。
一次升级一个次要版本的主要优点是数据库(包括数据和配置)可以更好地适应变化。这样,升级过程可以结束后获得的主版本与 RHEL 8 中的相同(MariaDB 10.3),这可显著减少配置更改或其他问题。
有关从 MariaDB 5.5 迁移到 MariaDB 10.0 时配置更改的更多信息,请参阅 Red Hat Software Collections 文档中的 迁移到 MariaDB 10.0 。
以下介绍了迁移到 MariaDB 连续版本以及所需的配置更改:
- 红帽软件集合文档中的 迁移至MariaDB 10.1。
- 红帽软件集合文档中的 迁移到 MariaDB 10.2。
- 红帽软件集合文档中的 迁移到 MariaDB 10.3。
也可以直接从 MariaDB 5.5 迁移到 MariaDB 10.3,但您必须执行上述迁移文档中描述的不同部分所需的所有配置变化。
7.2.7.3. 使用 mysql_upgrade 工具进行原位升级 复制链接链接已复制到粘贴板!
要将数据库文件迁移到 RHEL 8,RHEL 7 上 MariaDB 的用户必须使用 mysql_upgrade 工具执行原位升级。mysql_upgrade 工具是由 mariadb-server-utils 子软件包提供的,该子软件包作为 mariadb-server 软件包的依赖项而安装的。
要执行原位升级,您必须将二进制数据文件复制到 RHEL 8 系统上的 /var/lib/mysql/ 数据目录,并使用 mysql_upgrade 工具。
您可以使用此方法迁移以下数据:
- Red Hat Enterprise Linux 7 的 MariaDB 5.5
红帽软件集合的以下版本:
- MariaDB 5.5 (不再支持)
- MariaDB 10.0 (不再支持)
- MariaDB 10.1 (不再支持)
- MariaDB 10.2 (不再支持)
MariaDB 10.3 (不再支持)
请注意,建议依次升级到 MariaDB 10.3。请参阅 红帽软件集合发行注记中相应的迁移章节。
如果您从 MariaDB 的 RHEL 7 版本升级,那么源数据将存储在 /var/lib/mysql/ 目录中。对于 MariaDB 的红帽软件集合版本,源数据目录为 /var/opt/rh/<collection_name>/lib/mysql/ (mariadb55 除外,它使用 /opt/rh/mariadb55/root/var/lib/mysql/ 数据目录)。
要使用 mysql_upgrade 工具执行升级,请使用以下流程:
先决条件
- 在执行升级前,备份存储在 MariaDB 数据库中的所有数据。
流程
确保 RHEL 8 系统上安装了
mariadb-server软件包:yum install mariadb-server
# yum install mariadb-serverCopy to Clipboard Copied! Toggle word wrap Toggle overflow 确保
mariadb服务在复制数据时没有在源和目标系统上运行:systemctl stop mariadb.service
# systemctl stop mariadb.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
将源位置的数据复制到 RHEL 8 目标系统上的
/var/lib/mysql/目录。 对目标系统上复制的文件设置适当的权限和 SELinux 上下文:
restorecon -vr /var/lib/mysql
# restorecon -vr /var/lib/mysqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在目标系统中启动 MariaDB 服务器:
systemctl start mariadb.service
# systemctl start mariadb.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行
mysql_upgrade命令来检查和修复内部表:mysql_upgrade
$ mysql_upgradeCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
升级完成后,验证
/etc/my.cnf.d/目录中的所有配置文件是否只包含 MariaDB 10.3 的有效选项。
有一些与原位升级相关的风险和已知问题。例如,一些查询可能无法正常工作,或者它们以与升级前不同的顺序运行。有关这些风险和问题的更多信息,以及有关原位升级的常规信息,请参阅 MariaDB 10.3 发行注记。
7.2.8. 从 MariaDB 10.3 升级到 MariaDB 10.5 复制链接链接已复制到粘贴板!
这部分描述了在 RHEL 8 上从 MariaDB 10.3 迁移到 MariaDB 10.5。
7.2.8.1. MariaDB 10.3 和 MariaDB 10.5 之间的显著区别 复制链接链接已复制到粘贴板!
MariaDB 10.3 和 MariaDB 10.5 之间的显著变化包括:
-
MariaDB 现在默认使用
unix_socket身份验证插件。该插件允许用户在通过本地 UNIX 套接字文件连接到 MariaDB 时使用操作系统凭证。 -
MariaDB添加了mariadb-*命名的二进制文件和指向mariadb-*的mysql*符号链接。例如,mysqladmin、mysqlaccess和mysqlshow分别指向mariadb-admin、mariadb-access和mariadb-show二进制代码。 -
SUPER特权已被分成几个特权,以更好地与每个用户角色保持一致。因此,某些语句已更改了所需的权限。 -
在并行
复制中,slave_parallel_mode现在被默认设置为静态。 -
在 InnoDB 存储引擎 中,以下变量的默认值已发生变化:
innodb_adaptive_hash_index变为OFF,innodb_checksum_algorithm变为full_crc32。 MariaDB 现在使用用于管理 MariaDB 命令历史记录(the
.mysql_history文件)的底层软件的libedit实施,而不是之前使用的readline库。此更改会影响直接使用.mysql_history文件的用户。注意.mysql_history是一个由 MariaDB 或 MySQL 应用管理的文件,用户不应直接使用该文件。人类可读的外表是巧合。注意要提高安全性,您可以考虑不维护历史记录文件。禁用记录命令历史记录:
-
删除
.mysql_history文件(如果存在的话)。 使用以下任一方法:
-
将
MYSQL_HISTFILE变量设置为/dev/null,并将此设置包含在您的任何 shell 启动文件中。 将
.mysql_history文件更改为指向/dev/null的符号链接:ln -s /dev/null $HOME/.mysql_history
$ ln -s /dev/null $HOME/.mysql_historyCopy to Clipboard Copied! Toggle word wrap Toggle overflow
-
将
-
删除
MariaDB Galera 集群 已升级到版本 4,有以下显著变化:
- Galera 添加了一个新的流复制特性,其支持复制无限大小的事务。在执行流复制的过程中,集群以小片段复制事务。
- Galera 现在完全支持全球交易 ID(GTID)。
-
/etc/my.cnf.d/galera.cnf文件中的wsrep_on选项的默认值已从1改为0,以防止最终用户在没有配置所需的附加选项的情况下启动wsrep复制。
MariaDB 10.5 中对 PAM 插件的更改包括:
-
MariaDB 10.5 添加了一个新版本的可插拔验证模块(PAM)插件。PAM 插件版本 2.0 使用单独的
setuid root助手二进制文件执行 PAM 身份验证,这使 MariaDB 能够使用额外的 PAM 模块。 -
帮助程序二进制文件只能由
mysql组中的用户执行。默认情况下,组只包含mysql用户。红帽建议管理员不要向mysql组添加更多用户,以防止无需通过这个助手工具进行节流或记录的情况下的密码猜测攻击。 -
在 MariaDB 10.5 中,可插拔验证模块(PAM)插件及其相关文件已移至新软件包
mariadb-pam中。因此,在不使用对MariaDB进行PAM 验证的系统中不会引入新的setuid root二进制文件。 -
mariadb-pam软件包同时包含 PAM 插件版本:版本 2.0 是默认值,版本 1.0 作为auth_pam_v1共享对象库提供。 -
默认情况下,
mariadb-pam软件包不与 MariaDB 服务器一起安装 。要使 PAM 身份验证插件在 MariaDB 10.5 中可用,请手动安装mariadb-pam软件包。
7.2.8.2. 从 MariaDB 10.3 的 RHEL 8 版本升级到 MariaDB 10.5 复制链接链接已复制到粘贴板!
此流程描述了使用 yum 和 mariadb-upgrade工具从 mariadb:10.3 模块流升级到 mariadb:10.5 模块流。
mariadb-upgrade 实用程序由 mariadb-server-utils 子软件包提供,该子软件包作为 mariadb-server 软件包的依赖项安装。
先决条件
- 在执行升级前,备份存储在 MariaDB 数据库中的所有数据。
流程
停止 MariaDB 服务器:
systemctl stop mariadb.service
# systemctl stop mariadb.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 执行以下命令,以确定您的系统是否已准备好切换到更新的流:
yum distro-sync
# yum distro-syncCopy to Clipboard Copied! Toggle word wrap Toggle overflow 这个命令必须以以下信息结束:Nothing to doComplete!如需更多信息,请参阅 切换到更新的流。
重置系统上的
mariadb模块:yum module reset mariadb
# yum module reset mariadbCopy to Clipboard Copied! Toggle word wrap Toggle overflow 启用新的
mariadb:10.5模块流:yum module enable mariadb:10.5
# yum module enable mariadb:10.5Copy to Clipboard Copied! Toggle word wrap Toggle overflow 同步安装的软件包以在流间进行更改:
yum distro-sync
# yum distro-syncCopy to Clipboard Copied! Toggle word wrap Toggle overflow 这将更新所有已安装的 MariaDB 软件包。
-
调整配置,以便位于
/etc/my.cnf.d/中的选项文件只包含对 MariaDB 10.5 有效的选项。详情请参阅 MariaDB 10.4 和 MariaDB 10.5 的上游文档。 启动 MariaDB 服务器。
在升级独立运行的数据库时:
systemctl start mariadb.service
# systemctl start mariadb.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在升级 Galera 集群节点时:
galera_new_cluster
# galera_new_clusterCopy to Clipboard Copied! Toggle word wrap Toggle overflow mariadb服务将自动启动。
执行 mariadb-upgrade 工具来检查和修复内部表。
在升级独立运行的数据库时:
mariadb-upgrade
# mariadb-upgradeCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在升级 Galera 集群节点时:
mariadb-upgrade --skip-write-binlog
# mariadb-upgrade --skip-write-binlogCopy to Clipboard Copied! Toggle word wrap Toggle overflow
有一些与原位升级相关的风险和已知问题。例如,一些查询可能无法正常工作,或者它们以与升级前不同的顺序运行。有关这些风险和问题的更多信息,以及有关原位升级的常规信息,请参阅 MariaDB 10.5 发行注记。
7.2.9. 从 MariaDB 10.5 升级到 MariaDB 10.11 复制链接链接已复制到粘贴板!
这部分描述了在 RHEL 8 中从 MariaDB 10.5 迁移到 MariaDB 10.11。
7.2.9.1. MariaDB 10.5 和 MariaDB 10.11 之间的显著区别 复制链接链接已复制到粘贴板!
MariaDB 10.5 和 MariaDB 10.11 之间的显著变化包括:
-
新的
sys_schema功能是一个视图、功能和流程的集合,用来提供有关数据库使用情况的信息。 -
CREATE TABLE,ALTER TABLE,RENAME TABLE,DROP TABLE,DROP DATABASE以及相关的数据定义语言(DDL)语句现在都是原子的。语句必须全部完成,否则更改会被恢复。请注意,当使用DROP TABLE删除多个表时,只有每个单独的删除是原子的,而不是表的完整列表。 -
提供了一个新的
GRANT … TO PUBLIC特权。 -
SUPER和READ ONLY ADMIN权限现在是分开的。 -
现在,您可以在新的
UUID数据库数据类型中存储通用的唯一标识符。 - MariaDB 现在支持安全套接字层(SSL)协议版本 3。
- MariaDB 服务器现在需要正确配置的 SSL 才能启动。在以前的版本中,MariaDB 默默禁用 SSL,并在 SSL 配置错误的情况下使用不安全连接。
-
MariaDB 现在支持通过
natural_sort_key()函数的自然排序。 -
新的
SFORMAT功能现在用于任意文本格式化。 -
utf8字符集(和相关排序规则)现在默认是utf8mb3的别名。 - MariaDB 支持 Unicode Collation Algorithm (UCA) 14 排序规则。
-
MariaDB 的
systemd套接字激活文件现在在/usr/share/目录中提供。请注意,与上游不同,它们不是 RHEL 中默认配置的一部分。 -
错误消息现在包含
MariaDB字符串,而不是MySQL。 - 错误消息现在以中文提供。
- 默认的 logrotate 文件已发生了很大变化。在迁移到 MariaDB 10.11 前检查您的配置。
-
对于 MariaDB 和 MySQL 客户端,命令行上指定的连接属性(如
--port=3306)现在强制客户端和服务器之间的协议通信类型,如tcp、socket、pipe或memory。例如,在以前的版本中,如果 MariaDB 客户端通过 UNIX 套接字连接,则指定的端口会被忽略。
7.2.9.2. 从 RHEL 8 版本的 MariaDB 10.5 升级到 MariaDB 10.11 复制链接链接已复制到粘贴板!
这个流程描述了使用 yum 和 mariadb-upgrade 工具从 mariadb:10.5 模块流升级到 mariadb:10.11 模块流。
mariadb-upgrade 实用程序由 mariadb-server-utils 子软件包提供,该子软件包作为 mariadb-server 软件包的依赖项安装。
先决条件
- 在执行升级前,备份存储在 MariaDB 数据库中的所有数据。
流程
停止 MariaDB 服务器:
systemctl stop mariadb.service
# systemctl stop mariadb.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 执行以下命令,以确定您的系统是否已准备好切换到更新的流:
yum distro-sync
# yum distro-syncCopy to Clipboard Copied! Toggle word wrap Toggle overflow 这个命令必须以以下信息结束:Nothing to doComplete!如需更多信息,请参阅 切换到更新的流。
重置系统上的
mariadb模块:yum module reset mariadb
# yum module reset mariadbCopy to Clipboard Copied! Toggle word wrap Toggle overflow 启用新的
mariadb:10.11模块流:yum module enable mariadb:10.11
# yum module enable mariadb:10.11Copy to Clipboard Copied! Toggle word wrap Toggle overflow 同步安装的软件包以在流间进行更改:
yum distro-sync
# yum distro-syncCopy to Clipboard Copied! Toggle word wrap Toggle overflow 这将更新所有已安装的 MariaDB 软件包。
-
调整配置,以便位于
/etc/my.cnf.d/中的选项文件只包含对 MariaDB 10.11 有效的选项。详情请查看 MariaDB 10.6 和 MariaDB 10.11 的上游文档。 启动 MariaDB 服务器。
在升级独立运行的数据库时:
systemctl start mariadb.service
# systemctl start mariadb.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在升级 Galera 集群节点时:
galera_new_cluster
# galera_new_clusterCopy to Clipboard Copied! Toggle word wrap Toggle overflow mariadb服务将自动启动。
执行 mariadb-upgrade 工具来检查和修复内部表。
在升级独立运行的数据库时:
mariadb-upgrade
# mariadb-upgradeCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在升级 Galera 集群节点时:
mariadb-upgrade --skip-write-binlog
# mariadb-upgrade --skip-write-binlogCopy to Clipboard Copied! Toggle word wrap Toggle overflow
有一些与原位升级相关的风险和已知问题。例如,一些查询可能无法正常工作,或者它们以与升级前不同的顺序运行。有关这些风险和问题的更多信息,以及有关原位升级的常规信息,请参阅 MariaDB 10.11 发行注记。
7.2.10. 使用 Galera 复制 MariaDB 复制链接链接已复制到粘贴板!
您可以在 Red Hat Enterprise Linux 8 中使用 Galera 解决方案复制 MariaDB 数据库
7.2.10.1. MariaDB Galera 集群介绍 复制链接链接已复制到粘贴板!
Galera 复制是基于同步多源 MariaDB Galera集群 的创建,该群集由多个 MariaDB 服务器组成。与传统的主/副本设置(副本通常是只读的)不同,MariaDB Galera 群集中的节点都是可写的。
Galera 复制和 MariaDB 数据库之间的接口由写集复制 API(wsrep API) 定义的。
MariaDB Galera 集群 的主要特性是 :
- 同步复制
- 主动-主动多源拓扑
- 对任何集群节点的读和写
- 自动成员资格控制,故障节点从集群中删除
- 自动节点加入
- 行一级的并行复制
- 直接客户端连接:用户可以登录到集群节点,并在复制运行时直接使用这些节点
同步复制意味着服务器在提交时复制事务,方法是将与事务关联的写入集合广播到集群中的每个节点。客户端(用户应用程序)直接连接到数据库管理系统(DBMS),可以体验类似于原生 MariaDB 的行为。
同步复制保证集群中一个节点上的更改会同时在集群中的其他节点上发生。
因此,与异步复制相比,同步复制具有以下优势:
- 在特定集群节点间传播更改没有延迟
- 所有集群节点始终一致
- 如果其中一个集群节点崩溃,则不会丢失最新的更改
- 所有集群节点上的事务都会并行执行
- 整个集群的因果关系
7.2.10.2. 构建 MariaDB Galera 集群的组件 复制链接链接已复制到粘贴板!
要构建 MariaDB Galera 集群,您必须在您的系统上安装以下软件包:
-
mariadb-server-galera- 包含 MariaDB Galera 集群 的支持文件和脚本。 -
MariaDB-server- 由 MariaDB 上游打补丁,以包含写入集复制 API(wsrep API)。此 API 提供 Galera 复制和 MariaDB 之间的接口。 Galera- 由 MariaDB 上游打补丁,以添加对 MariaDB 的完全支持。galera软件包包含以下内容:- Galera Replication 程序库 提供整个复制功能。
- Galera Arbitrator 工具可用作参与脑裂场景的集群成员。但是,Galera Arbitrator 无法参与实际的复制。
-
Galera Systemd 服务 和 Galera 打包程序脚本,它们用于部署 Galera Arbitrator 工具。RHEL 8 中的 MariaDB 10.3、MariaDB 10.5 和 MariaDB 10.11 包括
garbdsystemd 服务的红帽版本,以及/usr/lib/systemd/system/garbd.service中galera软件包和/usr/sbin/garbd-wrapper文件中相应的包装器脚本。从 RHEL 8.6 开始,与 RHEL 一起分发的 MariaDB 还提供位于/usr/share/doc/galera/garb-systemd和/usr/share/doc/galera/garbd.service中的这些文件的上游版本。
7.2.10.3. 部署 MariaDB Galera 集群 复制链接链接已复制到粘贴板!
您可以部署 MariaDB Galera Cluster 软件包,并更新配置。要组成一个新集群,您必须引导集群的第一个节点。
先决条件
- 集群中的所有节点都 设置了 TLS。
所有节点上所有证书的
Extended Key Usage字段都必须设置为:TLS Web Server Authentication, TLS Web Client Authentication
TLS Web Server Authentication, TLS Web Client AuthenticationCopy to Clipboard Copied! Toggle word wrap Toggle overflow
流程
通过从
mariadb模块选择流(版本),并指定galera配置文件来安装 MariaDB Galera 集群 软件包。例如:yum module install mariadb:10.3/galera
# yum module install mariadb:10.3/galeraCopy to Clipboard Copied! Toggle word wrap Toggle overflow 因此,以下软件包会与依赖项一起安装:
-
mariadb-server-galera -
mariadb-server galera有关需要安装哪些软件包来构建 MariaDB Galera 集群 的更多信息,请参阅 构建 MariaDB 集群的组件。
-
在系统第一次添加到集群之前,更新 MariaDB 服务器复制配置。默认配置在
/etc/my.cnf.d/galera.cnf文件中。在部署 MariaDB Galera 集群 之前,请将所有节点上的/etc/my.cnf.d/galera.cnf文件中的wsrep_cluster_address选项设置为以以下字符串开头:gcomm://
gcomm://Copy to Clipboard Copied! Toggle word wrap Toggle overflow 对于初始节点,可以将
wsrep_cluster_address设置为空列表:wsrep_cluster_address="gcomm://"
wsrep_cluster_address="gcomm://"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 对于所有其他节点,将
wsrep_cluster_address设置为包含已属于正在运行的集群的一部分的任何节点的地址。例如:wsrep_cluster_address="gcomm://10.0.0.10"
wsrep_cluster_address="gcomm://10.0.0.10"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 有关如何设置 Galera 集群地址的更多信息,请参阅 Galera 集群地址。
-
通过在
/etc/my.cnf.d/galera.cnf配置文件中设置wsrep_on=1选项来在每个节点上启用wsrepAPI。 将
wsrep_provider_options变量添加到带有 TLS 密钥和证书 Galera 的配置文件中。例如:wsrep_provider_options="socket.ssl_cert=/etc/pki/tls/certs/source.crt;socket.ssl_key=/etc/pki/tls/private/source.key;socket.ssl_ca=/etc/pki/tls/certs/ca.crt”
wsrep_provider_options="socket.ssl_cert=/etc/pki/tls/certs/source.crt;socket.ssl_key=/etc/pki/tls/private/source.key;socket.ssl_ca=/etc/pki/tls/certs/ca.crt”Copy to Clipboard Copied! Toggle word wrap Toggle overflow 通过在该节点上运行以下 wrapper 来引导新集群的第一个节点:
galera_new_cluster
# galera_new_clusterCopy to Clipboard Copied! Toggle word wrap Toggle overflow 这个打包程序确保 MariaDB 服务器守护进程(
mysqld)使用--wsrep-new-cluster选项运行。此选项提供了没有要连接的现有群集的信息。因此,节点会创建一个新的 UUID 来识别新集群。注意mariadb服务支持 systemd 方法来与多个 MariaDB 服务器进程进行交互。因此,在有多个 MariaDB 服务器运行的情况下,您可以通过将实例名称指定为后缀来引导特定的实例:galera_new_cluster mariadb@node1
# galera_new_cluster mariadb@node1Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在每个节点上运行以下命令将其他节点连接到集群:
systemctl start mariadb.service
# systemctl start mariadb.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 因此,节点连接到集群,并将自己与集群的状态同步。
验证
7.2.10.4. 检查 MariaDB Galera 集群的状态 复制链接链接已复制到粘贴板!
监控和确保 MariaDB Galera 集群的健康、性能和同步非常重要。为此,您可以在每个节点上查询状态变量,来监控节点和集群。
要检查 MariaDB Galera 集群的状态,您可以使用以下查询:
显示集群中节点的数量:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 显示节点的集群组件状态:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow wsrep_cluster_status变量的值表示当前节点所属的集群组件的状态。可能的值有:-
Primary:集群正常运行。存在仲裁。在健康的集群中,所有节点都报告Primary。 -
Non-primary:节点丢失了到集群的主组件的连接,且不再是活跃集群的一部分。但是,节点仍然可以提供读查询,但不能处理写操作。 -
disconnected:节点没有连接到任何集群组件。因此,它无法接受查询,也不会复制任何数据。
-
显示节点的状态:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下是
wsrep_local_state_comment变量常用的值:-
Synced:节点在集群内完全同步,并积极参与复制。 -
Desynced:节点仍然是集群的一部分,但主要忙于状态传输。 -
Joining:节点正在加入集群。 -
Joined:节点已成功加入集群。它可以从集群接收和应用写集合。 -
Donor: 节点当前向正在加入的节点提供状态快照传输(SST)。当新节点加入并需要全状态转移时,集群会选择一个现有节点来发送必要的数据。
-
检查节点是否接受来自集群的写集合:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 当
wsrep_ready变量为ON时,节点已成功初始化其组件,并连接到集群。另外,节点也会同步,或达到一个可以提供查询的状态。检查节点是否与其他主机有网络连接:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ON值表示节点与集群中的至少一个成员有连接性。显示自上次
FLUSH STATUS命令或自服务器启动以来写集合的本地接收的队列的平均大小:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 接近 0 的值是理想的状态,表示节点在收到写集时继续应用它们。持久高或增长的值可能是性能瓶颈的一种指示,如磁盘 I/O 慢。
显示流控制状态:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 这个变量代表节点已暂停,且无法处理新传入的事务的时间分数,因为其本地接收队列太满、触发了流控制。接近 0 的值表示节点继续高效地复制工作负载。接近 1.0 的值意味着节点在应用写集合时频繁或持续遇到困难,并可能成为集群的瓶颈。
如果节点频繁暂停,您可以调整
/etc/my.cnf.d/galera.cnf文件中的wsrep_slave_threads参数。显示节点可并行应用的最低和最高序列号之间的平均距离:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 数值越高,表示并行的程度越大。它是您可以在
/etc/my.cnf.d/galera.cnf文件中的wsrep_slave_threads参数中可使用的最佳值。
7.2.10.5. 在 MariaDB Galera 集群中添加新节点 复制链接链接已复制到粘贴板!
要在 MariaDB Galera 集群 中添加新节点,请使用以下步骤。
请注意,您也可以使用此流程重新连接已存在的节点。
流程
在特定节点上,在
/etc/my.cnf.d/galera.cnf配置文件的[mariadb]部分的wsrep_cluster_address选项中为一个或多个现有群集成员提供一个地址:[mariadb] wsrep_cluster_address="gcomm://192.168.0.1"
[mariadb] wsrep_cluster_address="gcomm://192.168.0.1"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 当新节点连接到现有群集节点中的一个时,就可以看到集群中的所有节点。
但是,最好在
wsrep_cluster_address中列出集群的所有节点。因此,任何节点都可以通过连接到任何其他群集节点来加入群集,即使一个或多个群集节点停机了也没关系。当所有成员就成员资格达成一致时,集群的状态将会改变。如果新节点的状态与集群状态不同,新节点需要请求增加状态转移(IST)或状态快照传输(SST),来确保与其他节点保持一致。
7.2.10.6. 重启 MariaDB Galera 集群 复制链接链接已复制到粘贴板!
如果您同时关闭所有节点,您将停止集群,正在运行的集群不再存在。但是,集群的数据仍然存在。
要重启集群,请引导第一个节点,如 配置 MariaDB Galera 集群 中所述。
如果集群没有 bootstrap ,并且 mariadb 在第一个节点上仅通过 systemctl start mariadb.service 命令启动,则节点会尝试连接到 /etc/my.cnf.d/galera.cnf 文件中 wsrep_cluster_address 选项中列出的至少一个节点。如果当前没有节点运行,那么重启失败。
7.2.11. 开发 MariaDB 客户端应用程序 复制链接链接已复制到粘贴板!
红帽建议针对 MariaDB 客户端库开发 MariaDB 客户端应用程序。
针对 MariaDB 客户端库构建应用程序所需的开发文件和程序由 mariadb-connector-c-devel 软件包提供。
不使用直接库名称,而是使用 mariadb_config 程序,该程序在 mariadb-connector-c-devel 软件包中分发。此程序确保返回正确的构建标志。
7.3. 使用 MySQL 复制链接链接已复制到粘贴板!
MySQL 服务器是一个开源、快速且强大的数据库服务器。MySQL 是一个关系型数据库,其将数据转换为结构化的信息,并提供 SQL 接口来访问数据。它包含多个存储引擎和插件,以及地理信息系统(GIS)和 JavaScript 对象表示法(JSON)功能。
了解如何在 RHEL 系统上安装和配置 MySQL,如何备份 MySQL 数据、如何从较早的 MySQL 版本迁移,以及如何复制 MySQL。
7.3.1. 安装 MySQL 复制链接链接已复制到粘贴板!
在 RHEL 8 中,MySQL 8.0 服务器是作为 mysql:8.0 模块流提供的。
由于 RPM 软件包冲突,MySQL 和 MariaDB 数据库服务器无法在 RHEL 8 中并行安装。您可以在容器中并行使用 MySQL 和 MariaDB 数据库服务器,请参阅 在容器中运行多个 MySQL 和 MariaDB 版本。
要安装 MySQL,请使用以下流程。
流程
从
mysql模块中选择8.0流(版本),并指定服务器配置文件来安装 MySQL 服务器软件包:yum module install mysql:8.0/server
# yum module install mysql:8.0/serverCopy to Clipboard Copied! Toggle word wrap Toggle overflow 启动
mysqld服务:systemctl start mysqld.service
# systemctl start mysqld.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在引导时启用
mysqld服务:systemctl enable mysqld.service
# systemctl enable mysqld.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 建议:要在安装 MySQL 时提高安全性,请运行以下命令:
mysql_secure_installation
$ mysql_secure_installationCopy to Clipboard Copied! Toggle word wrap Toggle overflow 此命令启动一个完全交互的脚本,该脚本会提示过程中的每一步。该脚本可让您通过以下方法提高安全性:
- 为 root 帐户设置密码
- 删除匿名用户
- 禁止远程 root 登录(在本地主机之外)
7.3.2. 在容器中运行多个 MySQL 和 MariaDB 版本 复制链接链接已复制到粘贴板!
要在同一个主机上运行 MySQL 和 MariaDB,请在容器中运行它们,因为由于 RPM 软件包冲突,您无法并行安装这些数据库服务器。
此流程以 MySQL 8.0 和 MariaDB 10.5 作为示例,但您可以使用红帽生态系统目录中提供的任何 MySQL 或 MariaDB 容器版本。
先决条件
-
container-tools模块已安装。
流程
使用您的红帽客户门户网站帐户向
registry.redhat.io注册中心进行身份验证:podman login registry.redhat.io
# podman login registry.redhat.ioCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您已登录到容器注册中心,请跳过这一步。
在容器中运行 MySQL 8.0 :
podman run -d --name <container_name> -e MYSQL_ROOT_PASSWORD=<mysql_root_password> -p <host_port_1>:3306 rhel8/mysql-80
$ podman run -d --name <container_name> -e MYSQL_ROOT_PASSWORD=<mysql_root_password> -p <host_port_1>:3306 rhel8/mysql-80Copy to Clipboard Copied! Toggle word wrap Toggle overflow 有关使用此容器镜像用法的更多信息,请参阅 红帽生态系统目录。
在容器中运行 MariaDB 10.5 :
podman run -d --name <container_name> -e MYSQL_ROOT_PASSWORD=<mariadb_root_password> -p <host_port_2>:3306 rhel8/mariadb-105
$ podman run -d --name <container_name> -e MYSQL_ROOT_PASSWORD=<mariadb_root_password> -p <host_port_2>:3306 rhel8/mariadb-105Copy to Clipboard Copied! Toggle word wrap Toggle overflow 有关使用此容器镜像用法的更多信息,请参阅 红帽生态系统目录。
在容器中运行 MariaDB 10.11 :
podman run -d --name <container_name> -e MYSQL_ROOT_PASSWORD=<mariadb_root_password> -p <host_port_3>:3306 rhel8/mariadb-1011
$ podman run -d --name <container_name> -e MYSQL_ROOT_PASSWORD=<mariadb_root_password> -p <host_port_3>:3306 rhel8/mariadb-1011Copy to Clipboard Copied! Toggle word wrap Toggle overflow 有关使用此容器镜像用法的更多信息,请参阅 红帽生态系统目录。
注意容器名称和两个数据库服务器的主机端口必须不同。
要确保客户端可以访问网络上的数据库服务器,请在防火墙中打开主机端口:
firewall-cmd --permanent --add-port={<host_port>/tcp,<host_port>/tcp,...} firewall-cmd --reload# firewall-cmd --permanent --add-port={<host_port>/tcp,<host_port>/tcp,...} # firewall-cmd --reloadCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
显示正在运行的容器的信息:
podman ps
$ podman psCopy to Clipboard Copied! Toggle word wrap Toggle overflow 连接到数据库服务器,并以 root 用户身份登录:
mysql -u root -p -h localhost -P <host_port> --protocol tcp
# mysql -u root -p -h localhost -P <host_port> --protocol tcpCopy to Clipboard Copied! Toggle word wrap Toggle overflow
7.3.3. 配置 MySQL 复制链接链接已复制到粘贴板!
要为网络配置 MySQL 服务器,请使用以下流程。
流程
编辑
/etc/my.cnf.d/mysql-server.cnf文件的[mysqld]部分。您可以设置以下配置指令:bind-address- 是服务器监听的地址。可能的选项有:- 主机名
- IPv4 地址
- IPv6 地址
skip-networking- 控制服务器是否监听 TCP/IP 连接。可能的值有:- 0 - 侦听所有客户端
- 1 - 只监听本地客户端
-
端口- MySQL 侦听 TCP/IP 连接的端口。
重启
mysqld服务:systemctl restart mysqld.service
# systemctl restart mysqld.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow
7.3.4. 在 MySQL 服务器上设置 TLS 加密 复制链接链接已复制到粘贴板!
默认情况下,MySQL 使用未加密的连接。对于安全连接,请在 MySQL 服务器上启用 TLS 支持,并将您的客户端配置为建立加密连接。
7.3.4.1. 将 CA 证书、服务器证书和私钥放在 MySQL 服务器上 复制链接链接已复制到粘贴板!
在 MySQL 服务器上启用 TLS 加密前,请将证书颁发机构(CA)证书、服务器证书和私钥存储在 MySQL 服务器上。
先决条件
以下 Privacy Enhanced Mail(PEM)格式的文件已复制到服务器:
-
服务器的私钥:
server.example.com.key.pem -
服务器证书:
server.example.com.crt.pem -
证书颁发机构(CA)证书:
ca.crt.pem
有关创建私钥和证书签名请求(CSR),以及从 CA 请求证书的详情,请查看您的 CA 文档。
-
服务器的私钥:
流程
将 CA 和服务器证书存储在
/etc/pki/tls/certs/目录中:mv <path>/server.example.com.crt.pem /etc/pki/tls/certs/ mv <path>/ca.crt.pem /etc/pki/tls/certs/
# mv <path>/server.example.com.crt.pem /etc/pki/tls/certs/ # mv <path>/ca.crt.pem /etc/pki/tls/certs/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在 CA 和服务器证书上设置权限,以使 MySQL 服务器能够读取文件:
chmod 644 /etc/pki/tls/certs/server.example.com.crt.pem /etc/pki/tls/certs/ca.crt.pem
# chmod 644 /etc/pki/tls/certs/server.example.com.crt.pem /etc/pki/tls/certs/ca.crt.pemCopy to Clipboard Copied! Toggle word wrap Toggle overflow 由于证书是建立安全连接前通信的一部分,因此任何客户端都可以在不需要身份验证的情况下检索它们。因此,您不需要对 CA 和服务器证书文件设置严格的权限。
将服务器的私钥存储在
/etc/pki/tls/private/目录中:mv <path>/server.example.com.key.pem /etc/pki/tls/private/
# mv <path>/server.example.com.key.pem /etc/pki/tls/private/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 对服务器的私钥设置安全权限:
chmod 640 /etc/pki/tls/private/server.example.com.key.pem chgrp mysql /etc/pki/tls/private/server.example.com.key.pem
# chmod 640 /etc/pki/tls/private/server.example.com.key.pem # chgrp mysql /etc/pki/tls/private/server.example.com.key.pemCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果未授权的用户可以访问私钥,则到 MySQL 服务器的连接不再是安全的。
恢复 SELinux 上下文:
restorecon -Rv /etc/pki/tls/
# restorecon -Rv /etc/pki/tls/Copy to Clipboard Copied! Toggle word wrap Toggle overflow
7.3.4.2. 在 MySQL 服务器上配置 TLS 复制链接链接已复制到粘贴板!
要提高安全性,请在 MySQL 服务器上启用 TLS 支持。因此,客户端可以使用 TLS 加密与服务器传输数据。
先决条件
- 您已安装了 MySQL 服务器。
-
mysqld服务正在运行。 服务器上存在 Privacy Enhanced Mail(PEM)格式的以下文件,并可由
mysql用户读取:-
服务器的私钥:
/etc/pki/tls/private/server.example.com.key.pem -
服务器证书:
/etc/pki/tls/certs/server.example.com.crt.pem -
证书颁发机构(CA)证书
/etc/pki/tls/certs/ca.crt.pem
-
服务器的私钥:
- 主题可识别名称(DN)或服务器证书中的主题备用名称(SAN)字段与服务器的主机名相匹配。
流程
创建
/etc/my.cnf.d/mysql-server-tls.cnf文件:添加以下内容来配置到私钥、服务器和 CA 证书的路径:
[mysqld] ssl_key = /etc/pki/tls/private/server.example.com.key.pem ssl_cert = /etc/pki/tls/certs/server.example.com.crt.pem ssl_ca = /etc/pki/tls/certs/ca.crt.pem
[mysqld] ssl_key = /etc/pki/tls/private/server.example.com.key.pem ssl_cert = /etc/pki/tls/certs/server.example.com.crt.pem ssl_ca = /etc/pki/tls/certs/ca.crt.pemCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您有证书撤销列表(CRL),请配置 MySQL 服务器来使用它:
ssl_crl = /etc/pki/tls/certs/example.crl.pem
ssl_crl = /etc/pki/tls/certs/example.crl.pemCopy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:拒绝没有加密的连接尝试。要启用此功能,请附加:
require_secure_transport = on
require_secure_transport = onCopy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:设置服务器应支持的 TLS 版本。例如,要只支持 TLS 1.3,请附加:
tls_version = TLSv1.3
tls_version = TLSv1.3Copy to Clipboard Copied! Toggle word wrap Toggle overflow 默认情况下,服务器支持 TLS 1.2 和 TLS 1.3。
重启
mysqld服务:systemctl restart mysqld.service
# systemctl restart mysqld.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
要简化故障排除,请在将本地客户端配置为使用 TLS 加密前在 MySQL 服务器上执行以下步骤:
验证 MySQL 现在是否启用了 TLS 加密:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您将 MySQL 服务器配置为只支持特定的 TLS 版本,请显示
tls_version变量:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 验证服务器是否使用正确的 CA 证书、服务器证书和私钥文件:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
7.3.4.3. 对特定的用户帐户需要 TLS 加密连接 复制链接链接已复制到粘贴板!
可以访问敏感数据的用户应始终使用 TLS 加密连接,以避免通过网络发送未加密的数据。
如果您无法在服务器上配置所有连接都需要安全传输(require_secure_transport = on),请将单个用户帐户配置为需要 TLS 加密。
先决条件
- MySQL 服务器启用了 TLS 支持。
- 您配置为需要安全传输的用户已存在。
- CA 证书存储在客户端上。
流程
以管理用户身份连接到 MySQL 服务器:
mysql -u root -p -h server.example.com
# mysql -u root -p -h server.example.comCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您的管理用户没有远程访问服务器的权限,请在 MySQL 服务器上执行命令,并连接到
localhost。使用
REQUIRE SSL子句强制用户必须使用 TLS 加密连接进行连接:MySQL [(none)]> ALTER USER 'example'@'%' REQUIRE SSL;
MySQL [(none)]> ALTER USER 'example'@'%' REQUIRE SSL;Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
使用 TLS 加密,以
example用户身份连接到服务器:mysql -u example -p -h server.example.com
# mysql -u example -p -h server.example.com ... MySQL [(none)]>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果没有显示错误,且您可以访问交互式 MySQL 控制台,则与 TLS 的连接成功。
默认情况下,如果服务器提供了,客户端会自动使用 TLS 加密。因此,
--ssl-ca=ca.crt.pem和--ssl-mode=VERIFY_IDENTITY选项不是必需的,但可以提高安全性,使用这些选项,客户端可以验证服务器的身份。尝试以禁用 TLS 的
example用户身份进行连接:mysql -u example -p -h server.example.com --ssl-mode=DISABLED
# mysql -u example -p -h server.example.com --ssl-mode=DISABLED ERROR 1045 (28000): Access denied for user 'example'@'server.example.com' (using password: YES)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 服务器拒绝登录尝试,因为此用户需要 TLS,但禁用了(
--ssl-mode=DISABLED)。
7.3.5. 在 MySQL 客户端中使用 CA 证书验证全局启用 TLS 加密 复制链接链接已复制到粘贴板!
如果您的 MySQL 服务器支持 TLS 加密,请将您的客户端配置为仅建立安全连接,并验证服务器证书。这个流程描述了如何为服务器上的所有用户启用 TLS 支持。
7.3.5.1. 将 MySQL 客户端配置为默认使用 TLS 加密 复制链接链接已复制到粘贴板!
在 RHEL 上,您可以全局配置 MySQL 客户端使用 TLS 加密,并验证服务器证书中的通用名称(CN)是否与用户连接的主机名匹配。这可防止中间人攻击。
先决条件
- MySQL 服务器启用了 TLS 支持。
-
CA 证书存储在客户端上的
/etc/pki/tls/certs/ca.crt.pem文件中。
流程
使用以下内容创建
/etc/my.cnf.d/mysql-client-tls.cnf文件:[client] ssl-mode=VERIFY_IDENTITY ssl-ca=/etc/pki/tls/certs/ca.crt.pem
[client] ssl-mode=VERIFY_IDENTITY ssl-ca=/etc/pki/tls/certs/ca.crt.pemCopy to Clipboard Copied! Toggle word wrap Toggle overflow 这些设置定义 MySQL 客户端使用 TLS 加密,并且客户端将主机名与服务器证书中的 CN 进行比较(
ssl-mode=VERIFY_IDENTITY)。另外,它还指定到 CA 证书的路径(ssl-ca)。
验证
使用主机名连接到服务器,并显示服务器的状态:
mysql -u root -p -h server.example.com -e status
# mysql -u root -p -h server.example.com -e status ... SSL: Cipher in use is TLS_AES_256_GCM_SHA384Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果
SSL条目中包含Cipher in use is…,则连接是加密的。请注意,您在这个命令中使用的用户具有远程身份验证的权限。
如果您连接的主机名与服务器的 TLS 证书中的主机名不匹配,则
ssl-mode=VERIFY_IDENTITY参数会导致连接失败。例如,如果您连接到localhost:mysql -u root -p -h localhost -e status
# mysql -u root -p -h localhost -e status ERROR 2026 (HY000): SSL connection error: error:0A000086:SSL routines::certificate verify failedCopy to Clipboard Copied! Toggle word wrap Toggle overflow
7.3.6. 备份 MySQL 数据 复制链接链接已复制到粘贴板!
从 MySQL 数据库备份数据有两种主要方法:
- 逻辑备份
逻辑备份由恢复数据所需的 SQL 语句组成。这种类型的备份以纯文本文件的形式导出信息和记录。
与物理备份相比,逻辑备份的主要优势在于可移植性和灵活性。数据可以在其他硬件配置、MySQL 版本或数据库管理系统(DBMS)上恢复,而这些数据无法进行物理备份。
请注意,逻辑备份只在
mysqld.service运行时才执行。逻辑备份不包括日志和配置文件。- 物理备份
物理备份由存储内容的文件和目录的副本组成。
与逻辑备份相比,物理备份具有以下优点:
- 输出更为紧凑。
- 备份的大小会较小。
- 备份和恢复速度更快。
备份包括日志和配置文件。
请注意,当
mysqld.service没有运行或数据库中的所有表被锁住时,才能执行物理备份,以防在备份过程中数据有更改。
您可以使用以下 MySQL 备份方法之一从 MySQL 数据库备份数据:
-
使用
mysqldump的逻辑备份 - 文件系统备份
- 作为备份解决方案复制
7.3.6.1. 使用 mysqldump 执行逻辑备份 复制链接链接已复制到粘贴板!
mysqldump 客户端是一种备份实用程序,可用于转储数据库或数据库集合,用于备份或传输到其他数据库服务器。mysqldump 的输出通常包含 SQL 语句,用于重新创建服务器表结构、给它填充数据或两者兼而有之。mysqldump 也可以以其他格式生成文件,包括 XML 和分隔的文本格式,如 CSV。
要执行 mysqldump 备份,您可以使用以下一种选项:
- 备份一个或多个所选的数据库
- 备份所有数据库
- 从一个数据库备份表子集
流程
要转储单个数据库,请运行:
mysqldump [options] --databases db_name > backup-file.sql
# mysqldump [options] --databases db_name > backup-file.sqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 要一次转储多个数据库,请运行:
mysqldump [options] --databases db_name1 [db_name2 ...] > backup-file.sql
# mysqldump [options] --databases db_name1 [db_name2 ...] > backup-file.sqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 要转储所有数据库,请运行:
mysqldump [options] --all-databases > backup-file.sql
# mysqldump [options] --all-databases > backup-file.sqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 要将一个或多个转储的完整数据库加载回服务器,请运行:
mysql < backup-file.sql
# mysql < backup-file.sqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 要将数据库加载到远程 MySQL 服务器,请运行:
mysql --host=remote_host < backup-file.sql
# mysql --host=remote_host < backup-file.sqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 要从一个数据库中转储表的字面子集,请在
mysqldump命令末尾添加所选表的列表:mysqldump [options] db_name [tbl_name ...] > backup-file.sql
# mysqldump [options] db_name [tbl_name ...] > backup-file.sqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 要加载从一个数据库转储的表的字面子集,请运行:
mysql db_name < backup-file.sql
# mysql db_name < backup-file.sqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注意此时,db_name 数据库必须存在。
要查看 mysqldump 支持的选项列表,请运行:
mysqldump --help
$ mysqldump --helpCopy to Clipboard Copied! Toggle word wrap Toggle overflow
7.3.6.2. 执行文件系统备份 复制链接链接已复制到粘贴板!
要创建 MySQL 数据文件的文件系统备份,请将 MySQL 数据目录的内容复制到您的备份位置。
要同时备份当前的配置或日志文件,请使用以下流程的可选步骤:
流程
停止
mysqld服务:systemctl stop mysqld.service
# systemctl stop mysqld.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将数据文件复制到所需位置:
cp -r /var/lib/mysql /backup-location
# cp -r /var/lib/mysql /backup-locationCopy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:将配置文件复制到所需位置:
cp -r /etc/my.cnf /etc/my.cnf.d /backup-location/configuration
# cp -r /etc/my.cnf /etc/my.cnf.d /backup-location/configurationCopy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:将日志文件复制到所需位置:
cp /var/log/mysql/* /backup-location/logs
# cp /var/log/mysql/* /backup-location/logsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 启动
mysqld服务:systemctl start mysqld.service
# systemctl start mysqld.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将备份位置的备份数据加载到
/var/lib/mysql目录时,请确保mysql:mysql是/var/lib/mysql中所有数据的所有者:chown -R mysql:mysql /var/lib/mysql
# chown -R mysql:mysql /var/lib/mysqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
7.3.6.3. 作为备份解决方案复制 复制链接链接已复制到粘贴板!
复制是源服务器的一个替代的备份解决方案。如果源服务器复制到副本服务器,备份可以在副本上运行,而不会对源造成任何影响。当您关闭副本,并从副本备份数据时,源仍然可以运行。
有关如何复制 MySQL 数据库的说明,请参阅 复制 MySQL。
复制本身并不是一个足够的备份解决方案。复制可以防止源服务器出现硬件故障,但它不能确保防止数据的丢失。建议您将对副本的任何其他备份解决方案与此方法一起使用。
7.3.7. 迁移到 MySQL 8.0 的 RHEL 8 版本 复制链接链接已复制到粘贴板!
RHEL 7 包含 MariaDB 5.5 ,来作为 MySQL 数据库系列的服务器的默认实现。RHEL 7 的 Red Hat Software Collections 提供了 MySQL 8.0 和几个 MariaDB 版本。RHEL 8 提供了 MySQL 8.0、MariaDB 10.3 和 MariaDB 10.5。
此流程描述了使用 mysql_upgrade 工具从 MySQL 8.0 的 Red Hat Software Collections 版本迁移到 MySQL 8.0 的 RHEL 8 版本。mysql_upgrade 工具由 mysql-server 软件包提供。
在 MySQL 的 Red Hat Software Collections 版本中,源数据目录为 /var/opt/rh/rh-mysql80/lib/mysql/。在 RHEL 8 中,MySQL 数据存储在 /var/lib/mysql/ 目录中。
先决条件
- 在进行升级前,请备份存储在 MySQL 数据库中的所有数据。
流程
确定在 RHEL 8 系统上安装了
mysql-server软件包:yum install mysql-server
# yum install mysql-serverCopy to Clipboard Copied! Toggle word wrap Toggle overflow 确保在复制数据时
mysqld服务不在源或目标系统上运行:systemctl stop mysqld.service
# systemctl stop mysqld.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
将 RHEL 7 源系统上
/var/opt/rh/rh-mysql80/lib/mysql/目录中的数据复制到 RHEL 8 目标系统上的/var/lib/mysql/目录中。 对目标系统上复制的文件设置适当的权限和 SELinux 上下文:
restorecon -vr /var/lib/mysql
# restorecon -vr /var/lib/mysqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 确保
mysql:mysql是/var/lib/mysql目录中所有数据的所有者:chown -R mysql:mysql /var/lib/mysql
# chown -R mysql:mysql /var/lib/mysqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在目标系统上启动 MySQL 服务器:
systemctl start mysqld.service
# systemctl start mysqld.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注意:在 MySQL 的早期版本中,需要
mysql_upgrade命令来检查和修复内部表。现在,当您启动服务器时会自动完成此操作。
7.3.8. 复制具有 TLS 加密的 MySQL 复制链接链接已复制到粘贴板!
MySQL 为复制提供各种配置选项,范围从基本到高级。这部分描述了使用全局事务标识符(GTID)在新安装的 MySQL 服务器上在 MySQL 中进行复制的一种基于事务的方法。使用 GTID 简化了事务识别和一致性验证。
要在 MySQL 中设置复制,您必须:
如果要使用现有的 MySQL 服务器进行复制,您必须首先同步数据。如需更多信息,请参阅 上游文档。
7.3.8.1. 配置 MySQL 源服务器 复制链接链接已复制到粘贴板!
您可以设置 MySQL 源服务器所需的配置选项,以便正确运行并通过 TLS 协议复制数据库服务器上所做的所有更改。
先决条件
- 源服务器已安装。
源服务器已 设置了 TLS。
重要源和目标证书必须由同一证书颁发机构签名。
流程
包括
/etc/my.cnf.d/mysql-server.cnf文件中[mysqld]部分下的以下选项:bind-address=source_ip_adress从副本到源的连接需要这个选项。
server-id=idid 必须是唯一的。
log_bin=path_to_source_server_log此选项定义 MySQL 源服务器的二进制日志文件的路径。例如:
log_bin=/var/log/mysql/mysql-bin.log。gtid_mode=ON此选项在服务器上启用全局事务标识符(GTID)。
enforce-gtid-consistency=ON服务器通过仅允许执行可使用 GTID 进行安全记录的语句来强制实施 GTID 一致性。
可选:
binlog_do_db=db_name如果您只想复制所选的数据库,则使用这个选项。要复制多个所选的数据库,请分别指定每个数据库:
binlog_do_db=db_name1 binlog_do_db=db_name2 binlog_do_db=db_name3
binlog_do_db=db_name1 binlog_do_db=db_name2 binlog_do_db=db_name3Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:
binlog_ignore_db=db_name使用此选项从复制中排除特定的数据库。
重启
mysqld服务:systemctl restart mysqld.service
# systemctl restart mysqld.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow
7.3.8.2. 配置 MySQL 副本服务器 复制链接链接已复制到粘贴板!
您可以设置 MySQL 副本服务器所需的配置选项,以确保成功复制。
先决条件
- 副本服务器已安装。
副本服务器已 设置了 TLS。
重要源和目标证书必须由同一证书颁发机构签名。
流程
包括
/etc/my.cnf.d/mysql-server.cnf文件中[mysqld]部分下的以下选项:server-id=idid 必须是唯一的。
relay-log=path_to_replica_server_log中继日志是在复制过程中由 MySQL 副本服务器创建的一组日志文件。
log_bin=path_to_replica_sever_log此选项定义了 MySQL 副本服务器的二进制日志文件的路径。例如:
log_bin=/var/log/mysql/mysql-bin.log。副本中不需要这个选项,但强烈建议使用。
gtid_mode=ON此选项在服务器上启用全局事务标识符(GTID)。
enforce-gtid-consistency=ON服务器通过仅允许执行可使用 GTID 进行安全记录的语句来强制实施 GTID 一致性。
log-replica-updates=ON这个选项可确保从源服务器接收的更新记录在副本的二进制日志中。
skip-replica-start=ON此选项可确保在副本服务器启动时不启动复制线程。
可选:
binlog_do_db=db_name如果您只想复制某些数据库,则使用这个选项。要复制多个数据库,请分别指定每个数据库:
binlog_do_db=db_name1 binlog_do_db=db_name2 binlog_do_db=db_name3
binlog_do_db=db_name1 binlog_do_db=db_name2 binlog_do_db=db_name3Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:
binlog_ignore_db=db_name使用此选项从复制中排除特定的数据库。
重启
mysqld服务:systemctl restart mysqld.service
# systemctl restart mysqld.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow
7.3.8.3. 在 MySQL 源服务器上创建复制用户 复制链接链接已复制到粘贴板!
您必须创建一个复制用户,并授予这个用户所需的复制流量的权限。此流程演示了如何创建具有适当权限的复制用户。仅在源服务器上执行这些步骤。
先决条件
- 源服务器已安装并配置,如 配置 MySQL 源服务器 中所述。
流程
创建复制用户:
mysql> CREATE USER 'replication_user'@'replica_server_hostname' IDENTIFIED WITH mysql_native_password BY 'password';
mysql> CREATE USER 'replication_user'@'replica_server_hostname' IDENTIFIED WITH mysql_native_password BY 'password';Copy to Clipboard Copied! Toggle word wrap Toggle overflow 授予用户复制权限:
mysql> GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'replica_server_hostname';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'replica_server_hostname';Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重新载入 MySQL 数据库中的授权表:
mysql> FLUSH PRIVILEGES;
mysql> FLUSH PRIVILEGES;Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将源服务器设置为只读状态:
mysql> SET @@GLOBAL.read_only = ON;
mysql> SET @@GLOBAL.read_only = ON;Copy to Clipboard Copied! Toggle word wrap Toggle overflow
7.3.8.4. 将副本服务器连接到源服务器 复制链接链接已复制到粘贴板!
在 MySQL 副本服务器上,您必须配置凭证和源服务器的地址。使用以下流程实现副本服务器。
先决条件
- 源服务器已安装并配置,如 配置 MySQL 源服务器 中所述。
- 副本服务器已安装并配置,如 配置 MySQL 副本服务器 中所述。
- 您已创建了复制用户。请参阅 在 MySQL 源服务器上创建复制用户。
流程
将副本服务器设置为只读状态:
mysql> SET @@GLOBAL.read_only = ON;
mysql> SET @@GLOBAL.read_only = ON;Copy to Clipboard Copied! Toggle word wrap Toggle overflow 配置复制源:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在 MySQL 副本服务器中启动副本线程:
mysql> START REPLICA;
mysql> START REPLICA;Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在源和目标服务器上取消只读状态的设置:
mysql> SET @@GLOBAL.read_only = OFF;
mysql> SET @@GLOBAL.read_only = OFF;Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:检查副本服务器的状态以进行调试:
mysql> SHOW REPLICA STATUS\G;
mysql> SHOW REPLICA STATUS\G;Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意如果复制服务器启动或连接失败,您可以跳过
SHOW MASTER STATUS命令的输出中显示的二进制日志文件位置后的某些事件。例如,从定义的位置跳过第一个事件:mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;Copy to Clipboard Copied! Toggle word wrap Toggle overflow 尝试再次启动副本服务器。
可选:停止副本服务器中的副本线程:
mysql> STOP REPLICA;
mysql> STOP REPLICA;Copy to Clipboard Copied! Toggle word wrap Toggle overflow
7.3.8.5. 验证 MySQL 服务器上的复制 复制链接链接已复制到粘贴板!
在多个 MySQL 服务器中配置复制后,您应该验证它是否正常工作。
流程
在源服务器上创建一个示例数据库:
mysql> CREATE DATABASE test_db_name;
mysql> CREATE DATABASE test_db_name;Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
验证
test_db_name数据库是否在副本服务器上进行复制。 在源或副本服务器上执行以下命令,显示 MySQL 服务器的二进制日志文件的状态信息:
mysql> SHOW MASTER STATUS;
mysql> SHOW MASTER STATUS;Copy to Clipboard Copied! Toggle word wrap Toggle overflow Executed_Gtid_Set列,针对在源上执行的事务显示一组 GTID,它不能为空。注意当在副本服务器上使用
SHOW REPLICA STATUS时,Executed_Gtid_Set行中会显示同样的 GTID 集合。
7.3.9. 开发 MySQL 客户端应用程序 复制链接链接已复制到粘贴板!
红帽建议针对 MariaDB 客户端库开发 MySQL 客户端应用程序。客户端和服务器之间的通信协议在 MariaDB 和 MySQL 之间兼容。MariaDB 客户端库适用于最常见的 MySQL 场景,但特定于 MySQL 实现的有限数量的功能除外。
针对 MariaDB 客户端库构建应用程序所需的开发文件和程序由 mariadb-connector-c-devel 软件包提供。
不使用直接库名称,而是使用 mariadb_config 程序,该程序在 mariadb-connector-c-devel 软件包中分发。此程序确保返回正确的构建标志。
7.4. 使用 PostgreSQL 复制链接链接已复制到粘贴板!
PostgreSQL 服务器是一个基于 SQL 语言的开源、健壮且高度可扩展的数据库服务器。PostgreSQL 服务器提供了一个对象关系型数据库系统,其可以管理大量的数据集和大量的并发用户。因此,PostgreSQL 服务器可在集群中用来管理大量数据。
PostgreSQL 服务器包括用于确保数据完整性、构建容错环境和应用程序的功能。使用 PostgreSQL 服务器,您可以使用您自己的数据类型、自定义功能或来自不同编程语言的代码来扩展数据库,而无需重新编译数据库。
了解如何在 RHEL 系统上安装和配置 PostgreSQL,如何备份 PostgreSQL 数据,以及如何从早期的 PostgreSQL 版本迁移。
7.4.1. 安装 PostgreSQL 复制链接链接已复制到粘贴板!
在 RHEL 8 中,PostgreSQL 服务器在多个版本中提供,每个版本都由单独的流提供:
- PostgreSQL 10 - 默认流
- PostgreSQL 9.6
- PostgreSQL 12 - 从 RHEL 8.1.1 开始提供
- PostgreSQL 13 - 从 RHEL 8.4 开始提供
- PostgreSQL 15 - 从 RHEL 8.8 开始提供
- PostgreSQL 16 - 从 RHEL 8.10 开始提供
按照设计,无法并行安装同一模块的多个版本(stream)。因此,您必须从 postgresql 模块中只选择一个可用流。您可以在容器中使用不同版本的 PostgreSQL 数据库服务器,请参阅 在容器中运行多个 PostgreSQL 版本。
要安装 PostgreSQL,请使用以下流程:
流程
通过从
postgresql模块中选择一个流(版本),并指定 server 配置文件来安装 PostgreSQL 服务器软件包。例如:yum module install postgresql:16/server
# yum module install postgresql:16/serverCopy to Clipboard Copied! Toggle word wrap Toggle overflow postgres超级用户会自动创建。初始化数据库集群:
postgresql-setup --initdb
# postgresql-setup --initdbCopy to Clipboard Copied! Toggle word wrap Toggle overflow 红帽建议将数据存储在默认的
/var/lib/pgsql/data目录中。启动
postgresql服务:systemctl start postgresql.service
# systemctl start postgresql.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 启用
postgresql服务,以便在引导时启动:systemctl enable postgresql.service
# systemctl enable postgresql.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow
有关使用模块流的详情,请参阅 安装、管理和删除用户空间组件。
如果要从 RHEL 8 中早期的 postgresql 流升级,请按照 切换到更新的流 和 迁移到 RHEL 8 版本的 PostgreSQL 中描述的流程操作。
7.4.2. 在容器中运行多个 PostgreSQL 版本 复制链接链接已复制到粘贴板!
要在同一台主机上运行 PostgreSQL 的不同版本,请在容器中运行它们,因为您无法并行安装同一模块的多个版本(流)。
此流程以 PostgreSQL 13 和 PostgreSQL 15 作为示例,但您可以使用 Red Hat Ecosystem Catalog 中提供的任何 PostgreSQL 容器版本。
先决条件
-
container-tools模块已安装。
流程
使用您的红帽客户门户网站帐户向
registry.redhat.io注册中心进行身份验证:podman login registry.redhat.io
# podman login registry.redhat.ioCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您已登录到容器注册中心,请跳过这一步。
在容器中运行 PostgreSQL 13 :
podman run -d --name <container_name> -e POSTGRESQL_USER=<user_name> -e POSTGRESQL_PASSWORD=<password> -e POSTGRESQL_DATABASE=<database_name> -p <host_port_1>:5432 rhel8/postgresql-13
$ podman run -d --name <container_name> -e POSTGRESQL_USER=<user_name> -e POSTGRESQL_PASSWORD=<password> -e POSTGRESQL_DATABASE=<database_name> -p <host_port_1>:5432 rhel8/postgresql-13Copy to Clipboard Copied! Toggle word wrap Toggle overflow 有关使用此容器镜像用法的更多信息,请参阅 红帽生态系统目录。
在容器中运行 PostgreSQL 15 :
podman run -d --name <container_name> -e POSTGRESQL_USER=<user_name> -e POSTGRESQL_PASSWORD=<password> -e POSTGRESQL_DATABASE=<database_name> -p <host_port_2>:5432 rhel8/postgresql-15
$ podman run -d --name <container_name> -e POSTGRESQL_USER=<user_name> -e POSTGRESQL_PASSWORD=<password> -e POSTGRESQL_DATABASE=<database_name> -p <host_port_2>:5432 rhel8/postgresql-15Copy to Clipboard Copied! Toggle word wrap Toggle overflow 有关使用此容器镜像用法的更多信息,请参阅 红帽生态系统目录。
在容器中运行 PostgreSQL 16 :
podman run -d --name <container_name> -e POSTGRESQL_USER=<user_name> -e POSTGRESQL_PASSWORD=<password> -e POSTGRESQL_DATABASE=<database_name> -p <host_port_3>:5432 rhel8/postgresql-16
$ podman run -d --name <container_name> -e POSTGRESQL_USER=<user_name> -e POSTGRESQL_PASSWORD=<password> -e POSTGRESQL_DATABASE=<database_name> -p <host_port_3>:5432 rhel8/postgresql-16Copy to Clipboard Copied! Toggle word wrap Toggle overflow 有关使用此容器镜像用法的更多信息,请参阅 红帽生态系统目录。
注意容器名称和两个数据库服务器的主机端口必须不同。
要确保客户端可以访问网络上的数据库服务器,请在防火墙中打开主机端口:
firewall-cmd --permanent --add-port={<host_port_1>/tcp,<host_port_2>/tcp,...} firewall-cmd --reload# firewall-cmd --permanent --add-port={<host_port_1>/tcp,<host_port_2>/tcp,...} # firewall-cmd --reloadCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
显示正在运行的容器的信息:
podman ps
$ podman psCopy to Clipboard Copied! Toggle word wrap Toggle overflow 连接到数据库服务器,并以 root 用户身份登录:
psql -u postgres -p -h localhost -P <host_port> --protocol tcp
# psql -u postgres -p -h localhost -P <host_port> --protocol tcpCopy to Clipboard Copied! Toggle word wrap Toggle overflow
7.4.3. 创建 PostgreSQL 用户 复制链接链接已复制到粘贴板!
PostgreSQL 用户为以下类型:
-
postgresUNIX 系统用户 - 应该仅用于运行 PostgreSQL 服务器和客户端应用程序,如pg_dump。不要将postgres系统用户用于 PostgreSQL 管理的任何交互式工作,如数据库创建和用户管理。 -
数据库超级用户 - 默认的
postgresPostgreSQL 超级用户与postgres系统用户无关。您可以在pg_hba.conf文件中限制postgres超级用户的权限,否则没有其他权限限制。您也可以创建其他数据库超级用户。 具有特定数据库访问权限的角色:
- 数据库用户 - 默认具有登录权限
- 一组用户 - 启用整个组的管理权限
角色可以拥有数据库对象(如表和函数),并且可以使用 SQL 命令将对象特权分配给其他角色。
标准数据库管理特权包括 SELECT、INSERT、UPDATE、DELETE、TRUNCATE、REFERENCES、TRIGGER、CREATE、CONNECT、TEMPORARY、EXECUTE 和 USAGE。
角色属性是特殊的特权,如 LOGIN、SUPERUSER、CREATEDB 和 CREATEROLE。
红帽建议以不是超级用户的角色身份执行大部分任务。常见的做法是创建一个具有 CREATEDB 和 CREATEROLE 特权的角色,并将此角色用于所有数据库和角色的日常管理。
先决条件
- PostgreSQL 服务器已安装。
- 数据库集群已初始化。
流程
要创建用户,请为用户设置密码,并为该用户分配
CREATEROLE和CREATEDB权限:postgres=# CREATE USER mydbuser WITH PASSWORD 'mypasswd' CREATEROLE CREATEDB;
postgres=# CREATE USER mydbuser WITH PASSWORD 'mypasswd' CREATEROLE CREATEDB;Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将 mydbuser 替换为 username,将mypasswd 替换为用户的密码。
例 7.1. 初始化、创建和连接到 PostgreSQL 数据库
本例演示了如何初始化 PostgreSQL 数据库,创建具有例行数据库管理特权的数据库用户,以及如何创建可通过具有管理特权的任何系统帐户访问的数据库帐户。
安装 PosgreSQL 服务器:
yum module install postgresql:13/server
# yum module install postgresql:13/serverCopy to Clipboard Copied! Toggle word wrap Toggle overflow 初始化数据库集群:
postgresql-setup --initdb
# postgresql-setup --initdb * Initializing database in '/var/lib/pgsql/data' * Initialized, logs are in /var/lib/pgsql/initdb_postgresql.logCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将密码哈希算法设为
scram-sha-256。在
/var/lib/pgsql/data/postgresql.conf文件中,更改以下行:#password_encryption = md5 # md5 or scram-sha-256
#password_encryption = md5 # md5 or scram-sha-256Copy to Clipboard Copied! Toggle word wrap Toggle overflow 改为:
password_encryption = scram-sha-256
password_encryption = scram-sha-256Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在
/var/lib/pgsql/data/pg_hba.conf文件中,更改 IPv4 本地连接的以下行:host all all 127.0.0.1/32 ident
host all all 127.0.0.1/32 identCopy to Clipboard Copied! Toggle word wrap Toggle overflow 改为:
host all all 127.0.0.1/32 scram-sha-256
host all all 127.0.0.1/32 scram-sha-256Copy to Clipboard Copied! Toggle word wrap Toggle overflow
启动 postgresql 服务:
systemctl start postgresql.service
# systemctl start postgresql.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 以名为
postgres的系统用户身份登录:su - postgres
# su - postgresCopy to Clipboard Copied! Toggle word wrap Toggle overflow 启动 PostgreSQL 交互终端:
psql
$ psql psql (13.7) Type "help" for help. postgres=#Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:获取有关当前数据库连接的信息:
postgres=# \conninfo You are connected to database "postgres" as user "postgres" via socket in "/var/run/postgresql" at port "5432".
postgres=# \conninfo You are connected to database "postgres" as user "postgres" via socket in "/var/run/postgresql" at port "5432".Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建名为
mydbuser的用户,为mydbuser设置密码,并为mydbuser分配CREATEROLE和CREATEDB权限:postgres=# CREATE USER mydbuser WITH PASSWORD 'mypasswd' CREATEROLE CREATEDB; CREATE ROLE
postgres=# CREATE USER mydbuser WITH PASSWORD 'mypasswd' CREATEROLE CREATEDB; CREATE ROLECopy to Clipboard Copied! Toggle word wrap Toggle overflow mydbuser用户现在可以执行日常数据库管理操作:创建数据库并管理用户索引。使用
\qmeta 命令从交互终端退出:postgres=# \q
postgres=# \qCopy to Clipboard Copied! Toggle word wrap Toggle overflow 退出
postgres用户会话:logout
$ logoutCopy to Clipboard Copied! Toggle word wrap Toggle overflow 以
mydbuser用户身份登录到 PostgreSQL 终端,指定主机名,并连接到默认的postgres数据库,该数据库是在初始化过程中创建的:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建名为
mydatabase的数据库:postgres=> CREATE DATABASE mydatabase; CREATE DATABASE postgres=>
postgres=> CREATE DATABASE mydatabase; CREATE DATABASE postgres=>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 退出会话:
postgres=# \q
postgres=# \qCopy to Clipboard Copied! Toggle word wrap Toggle overflow 以
mydbuser用户身份连接到 mydatabase:psql -U mydbuser -h 127.0.0.1 -d mydatabase
# psql -U mydbuser -h 127.0.0.1 -d mydatabase Password for user mydbuser: psql (13.7) Type "help" for help. mydatabase=>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:获取有关当前数据库连接的信息:
mydatabase=> \conninfo You are connected to database "mydatabase" as user "mydbuser" on host "127.0.0.1" at port "5432".
mydatabase=> \conninfo You are connected to database "mydatabase" as user "mydbuser" on host "127.0.0.1" at port "5432".Copy to Clipboard Copied! Toggle word wrap Toggle overflow
7.4.4. 配置 PostgreSQL 复制链接链接已复制到粘贴板!
在 PostgreSQL 数据库中,所有数据和配置文件都存储在一个名为database cluster的目录中。红帽建议将所有数据(包括配置文件)存储在默认的 /var/lib/pgsql/data/ 目录中。
PostgreSQL 配置由以下文件组成:
-
PostgreSQL.conf- 用于设置数据库集群参数。 -
PostgreSQL.auto.conf- 包含与postgresql.conf类似的基本 PostgreSQL 设置。但是这个文件由服务器控制。它由ALTER SYSTEM查询来编辑,无法手动编辑。 -
pg_ident.conf- 用于将来自外部身份验证机制的用户身份映射到 PostgreSQL 用户身份。 -
pg_hba.conf- 用于为 PostgreSQL 数据库配置客户端身份验证。
要修改 PostgreSQL 配置,请使用以下流程:
流程
编辑
/var/lib/pgsql/data/postgresql.conf文件,并配置数据库集群参数的基本设置,例如:log_connections = yes log_destination = 'syslog' search_path = '"$user", public' shared_buffers = 128MB password_encryption = scram-sha-256
log_connections = yes log_destination = 'syslog' search_path = '"$user", public' shared_buffers = 128MB password_encryption = scram-sha-256Copy to Clipboard Copied! Toggle word wrap Toggle overflow 编辑
/var/lib/pgsql/data/pg_hba.conf文件,并配置客户端身份验证,例如:TYPE DATABASE USER ADDRESS METHOD
# TYPE DATABASE USER ADDRESS METHOD local all all trust host postgres all 192.168.93.0/24 ident host all all .example.com scram-sha-256Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重启
postgresql服务,以使修改生效:systemctl restart postgresql.service
# systemctl restart postgresql.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow
7.4.5. 在 PostgreSQL 服务器上配置 TLS 加密 复制链接链接已复制到粘贴板!
默认情况下,PostgreSQL 使用未加密的连接。如需更多安全连接,您可以在 PostgreSQL 服务器上启用传输层安全(TLS)支持,并配置客户端,以建立加密连接。
先决条件
- PostgreSQL 服务器已安装。
- 数据库集群已初始化。
流程
安装 OpenSSL 库:
yum install openssl
# yum install opensslCopy to Clipboard Copied! Toggle word wrap Toggle overflow 生成 TLS 证书和密钥:
openssl req -new -x509 -days 365 -nodes -text -out server.crt \ -keyout server.key -subj "/CN=dbhost.yourdomain.com"
# openssl req -new -x509 -days 365 -nodes -text -out server.crt \ -keyout server.key -subj "/CN=dbhost.yourdomain.com"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将 dbhost.yourdomain.com 替换为您的数据库主机和域名。
将签名的证书和私钥复制到数据库服务器上所需的位置:
cp server.{key,crt} /var/lib/pgsql/data/.# cp server.{key,crt} /var/lib/pgsql/data/.Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将签名证书和私钥的所有者和组所有权改为
postgres用户:chown postgres:postgres /var/lib/pgsql/data/server.{key,crt}# chown postgres:postgres /var/lib/pgsql/data/server.{key,crt}Copy to Clipboard Copied! Toggle word wrap Toggle overflow 限制私钥的权限,使其只对所有者可读:
chmod 0400 /var/lib/pgsql/data/server.key
# chmod 0400 /var/lib/pgsql/data/server.keyCopy to Clipboard Copied! Toggle word wrap Toggle overflow 通过更改
/var/lib/pgsql/data/postgresql.conf文件中的以下行,将密码哈希算法设为scram-sha-256:#password_encryption = md5 # md5 or scram-sha-256
#password_encryption = md5 # md5 or scram-sha-256Copy to Clipboard Copied! Toggle word wrap Toggle overflow 改为:
password_encryption = scram-sha-256
password_encryption = scram-sha-256Copy to Clipboard Copied! Toggle word wrap Toggle overflow 通过更改
/var/lib/pgsql/data/postgresql.conf文件中的以下行,将 PostgreSQL 配置为使用 SSL/TLS:#ssl = off
#ssl = offCopy to Clipboard Copied! Toggle word wrap Toggle overflow 改为:
ssl=on
ssl=onCopy to Clipboard Copied! Toggle word wrap Toggle overflow 通过更改
/var/lib/pgsql/data/pg_hba.conf文件中 IPv4 本地连接的以下行,将对所有数据库的访问限制为只接受使用 TLS 的客户端连接:host all all 127.0.0.1/32 ident
host all all 127.0.0.1/32 identCopy to Clipboard Copied! Toggle word wrap Toggle overflow 改为:
hostssl all all 127.0.0.1/32 scram-sha-256
hostssl all all 127.0.0.1/32 scram-sha-256Copy to Clipboard Copied! Toggle word wrap Toggle overflow 另外,您可以通过添加以下新行来限制对单个数据库和用户的访问:
hostssl mydatabase mydbuser 127.0.0.1/32 scram-sha-256
hostssl mydatabase mydbuser 127.0.0.1/32 scram-sha-256Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将 mydatabase 替换为数据库名称,将 mydbuser 替换为 username。
通过重启
postgresql服务来使更改有效:systemctl restart postgresql.service
# systemctl restart postgresql.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
要手动验证连接是否是加密的:
以 mydbuser 用户身份连接到 PostgreSQL 数据库,指定主机名和数据库名称:
psql -U mydbuser -h 127.0.0.1 -d mydatabase
$ psql -U mydbuser -h 127.0.0.1 -d mydatabase Password for user mydbuser:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将 mydatabase 替换为数据库名称,将 mydbuser 替换为 username。
获取有关当前数据库连接的信息:
mydbuser=> \conninfo You are connected to database "mydatabase" as user "mydbuser" on host "127.0.0.1" at port "5432". SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
mydbuser=> \conninfo You are connected to database "mydatabase" as user "mydbuser" on host "127.0.0.1" at port "5432". SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)Copy to Clipboard Copied! Toggle word wrap Toggle overflow
您可以编写一个简单的应用程序,其验证到 PostgreSQL 的连接是否是加密的。本例演示了使用 C 编写的使用
libpq客户端库(由libpq-devel软件包提供)的应用程序:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将 mypassword 替换为密码,将 mydatabase 替换为数据库名称,将 mydbuser 替换为 username。
注意您必须使用
-lpq选项为编译加载pq库。例如,要使用 GCC 编译器编译应用程序:gcc source_file.c -lpq -o myapplication
$ gcc source_file.c -lpq -o myapplicationCopy to Clipboard Copied! Toggle word wrap Toggle overflow 其中 source_file.c 包含上面的示例代码,myapplication 是用于验证安全的 PostgreSQL 连接的应用程序的名称。
例 7.2. 初始化、创建,并使用 TLS 加密连接到 PostgreSQL 数据库
本例演示了如何初始化 PostgreSQL 数据库,创建数据库用户和数据库,以及如何使用安全连接连接到数据库。
安装 PosgreSQL 服务器:
yum module install postgresql:13/server
# yum module install postgresql:13/serverCopy to Clipboard Copied! Toggle word wrap Toggle overflow 初始化数据库集群:
postgresql-setup --initdb
# postgresql-setup --initdb * Initializing database in '/var/lib/pgsql/data' * Initialized, logs are in /var/lib/pgsql/initdb_postgresql.logCopy to Clipboard Copied! Toggle word wrap Toggle overflow 安装 OpenSSL 库:
yum install openssl
# yum install opensslCopy to Clipboard Copied! Toggle word wrap Toggle overflow 生成 TLS 证书和密钥:
openssl req -new -x509 -days 365 -nodes -text -out server.crt \ -keyout server.key -subj "/CN=dbhost.yourdomain.com"
# openssl req -new -x509 -days 365 -nodes -text -out server.crt \ -keyout server.key -subj "/CN=dbhost.yourdomain.com"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将 dbhost.yourdomain.com 替换为您的数据库主机和域名。
将签名的证书和私钥复制到数据库服务器上所需的位置:
cp server.{key,crt} /var/lib/pgsql/data/.# cp server.{key,crt} /var/lib/pgsql/data/.Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将签名证书和私钥的所有者和组所有权改为
postgres用户:chown postgres:postgres /var/lib/pgsql/data/server.{key,crt}# chown postgres:postgres /var/lib/pgsql/data/server.{key,crt}Copy to Clipboard Copied! Toggle word wrap Toggle overflow 限制私钥的权限,使其只对所有者可读:
chmod 0400 /var/lib/pgsql/data/server.key
# chmod 0400 /var/lib/pgsql/data/server.keyCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将密码哈希算法设为
scram-sha-256。在/var/lib/pgsql/data/postgresql.conf文件中,更改以下行:#password_encryption = md5 # md5 or scram-sha-256
#password_encryption = md5 # md5 or scram-sha-256Copy to Clipboard Copied! Toggle word wrap Toggle overflow 改为:
password_encryption = scram-sha-256
password_encryption = scram-sha-256Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将 PostgreSQL 配置为使用 SSL/TLS。在
/var/lib/pgsql/data/postgresql.conf文件中,更改以下行:#ssl = off
#ssl = offCopy to Clipboard Copied! Toggle word wrap Toggle overflow 改为:
ssl=on
ssl=onCopy to Clipboard Copied! Toggle word wrap Toggle overflow 启动
postgresql服务:systemctl start postgresql.service
# systemctl start postgresql.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 以名为
postgres的系统用户身份登录:su - postgres
# su - postgresCopy to Clipboard Copied! Toggle word wrap Toggle overflow 以
postgres用户身份启动 PostgreSQL 交互终端:psql -U postgres
$ psql -U postgres psql (13.7) Type "help" for help. postgres=#Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建名为
mydbuser的用户,并为mydbuser设置密码:postgres=# CREATE USER mydbuser WITH PASSWORD 'mypasswd'; CREATE ROLE postgres=#
postgres=# CREATE USER mydbuser WITH PASSWORD 'mypasswd'; CREATE ROLE postgres=#Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建名为
mydatabase的数据库:postgres=# CREATE DATABASE mydatabase; CREATE DATABASE postgres=#
postgres=# CREATE DATABASE mydatabase; CREATE DATABASE postgres=#Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将 all 权限赋予
mydbuser用户:postgres=# GRANT ALL PRIVILEGES ON DATABASE mydatabase TO mydbuser; GRANT postgres=#
postgres=# GRANT ALL PRIVILEGES ON DATABASE mydatabase TO mydbuser; GRANT postgres=#Copy to Clipboard Copied! Toggle word wrap Toggle overflow 退出交互终端:
postgres=# \q
postgres=# \qCopy to Clipboard Copied! Toggle word wrap Toggle overflow 退出
postgres用户会话:logout
$ logoutCopy to Clipboard Copied! Toggle word wrap Toggle overflow 通过更改
/var/lib/pgsql/data/pg_hba.conf文件中 IPv4 本地连接的以下行,将对所有数据库的访问限制为只接受使用 TLS 的客户端连接:host all all 127.0.0.1/32 ident
host all all 127.0.0.1/32 identCopy to Clipboard Copied! Toggle word wrap Toggle overflow 改为:
hostssl all all 127.0.0.1/32 scram-sha-256
hostssl all all 127.0.0.1/32 scram-sha-256Copy to Clipboard Copied! Toggle word wrap Toggle overflow 通过重启
postgresql服务来使更改有效:systemctl restart postgresql.service
# systemctl restart postgresql.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 以
mydbuser用户身份连接到 PostgreSQL 数据库,指定主机名和数据库名称:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
7.4.6. 备份 PostgreSQL 数据 复制链接链接已复制到粘贴板!
要备份 PostgreSQL 数据,请使用以下方法之一:
- SQL 转储
- 文件系统级别备份
- 持续归档
7.4.6.1. 使用 SQL 转储备份 PostgreSQL 数据 复制链接链接已复制到粘贴板!
SQL 转储方法基于使用 SQL 命令生成转储文件。当转储上传回数据库服务器时,它会按与转储时相同的状态重新创建数据库。
以下 PostgreSQL 客户端应用程序为 SQL 转储提供了保证:
- pg_dump 转储单个数据库,而没有有关角色或表空间的集群范围的信息
- pg_dumpall 转储给定集群中的每个数据库,并保留集群范围的数据,如角色和表空间定义。
默认情况下,pg_dump 和 pg_dumpall 命令将它的们结果写入标准输出。要将转储保存到文件中,请将输出重定向到 SQL 文件。生成的 SQL 文件可以是文本格式,也可以是允许并行且可以更详细地控制对象恢复的其他格式。
您可以在任何可访问数据库的远程主机中执行 SQL 转储。
7.4.6.1.1. SQL 转储的优点和缺陷 复制链接链接已复制到粘贴板!
与其它 PostgreSQL 备份方法相比,SQL 转储具有以下优点:
- SQL 转储是唯一的、不针对特定服务器版本的 PostgreSQL 备份方法。pg_dump 工具的输出可以重新加载到 PostgreSQL 的后续版本中,这不适用于文件系统级备份或持续归档。
- SQL 转储是将数据库传输到不同计算机架构(比如从 32 位服务器传输到 64 位服务器)的唯一方法。
- SQL 转储提供内部一致的转储。转储代表 pg_dump 开始运行时数据库的快照。
- pg_dump 工具在运行时不会阻止数据库上的其他操作。
SQL 转储的一个缺点是,与文件系统级备份相比,它需要更长的时间。
7.4.6.1.2. 使用 pg_dump 执行 SQL 转储 复制链接链接已复制到粘贴板!
要转储一个没有集群范围信息的单个数据库,请使用 pg_dump 工具。
先决条件
-
您必须对要转储的所有表具有读的权限。若要转储整个数据库,您必须以
postgres超级用户或具有数据库管理员特权的用户身份运行命令。
流程
转储没有集群范围信息的数据库:
pg_dump dbname > dumpfile
$ pg_dump dbname > dumpfileCopy to Clipboard Copied! Toggle word wrap Toggle overflow 要指定 pg_dump 将联系哪个数据库服务器,请使用以下命令行选项:
-h选项用来定义主机的。默认主机要么是本地主机,要么是
PGHOST环境变量所指定的主机。-p选项用来定义端口 。默认端口是由
PGPORT环境变量或编译后的默认值指明的。
7.4.6.1.3. 使用 pg_dumpall 执行 SQL 转储 复制链接链接已复制到粘贴板!
要转储给定数据库集群中的每个数据库,并保留集群范围的数据,请使用 pg_dumpall 工具。
先决条件
-
您必须以
postgres超级用户或具有数据库管理员特权的用户身份运行命令。
流程
转储数据库集群中的所有数据库,并保留集群范围的数据:
pg_dumpall > dumpfile
$ pg_dumpall > dumpfileCopy to Clipboard Copied! Toggle word wrap Toggle overflow
要指定 pg_dumpall 将联系哪个数据库服务器,请使用以下命令行选项:
-h选项用来定义主机的。默认主机要么是本地主机,要么是
PGHOST环境变量所指定的主机。-p选项用来定义端口 。默认端口是由
PGPORT环境变量或编译后的默认值指明的。-l选项用来定义默认数据库。这个选项使您能够选择一个与初始化过程中自动创建的
postgres数据库不同的默认数据库。
7.4.6.1.4. 使用 pg_dump 恢复转储的数据库 复制链接链接已复制到粘贴板!
要从使用 pg_dump 工具转储的 SQL 转储恢复数据库,请按照以下流程。
先决条件
-
您必须以
postgres超级用户或具有数据库管理员特权的用户身份运行命令。
流程
创建新数据库:
createdb dbname
$ createdb dbnameCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 验证在转储数据库中拥有对象或被赋予了对象权限的所有用户是否已存在。如果这样的用户不存在,恢复将无法重新创建具有原始所有权和权限的对象。
运行
psql工具来恢复 pg_dump 工具创建的文本文件转储:psql dbname < dumpfile
$ psql dbname < dumpfileCopy to Clipboard Copied! Toggle word wrap Toggle overflow 其中
dumpfile是pg_dump命令的输出。要恢复非文本文件转储,请使用pg_restore工具:pg_restore non-plain-text-file
$ pg_restore non-plain-text-fileCopy to Clipboard Copied! Toggle word wrap Toggle overflow
7.4.6.1.5. 使用 pg_dumpall 恢复转储的数据库 复制链接链接已复制到粘贴板!
要从使用 pg_dumpall 工具转储的数据库集群中恢复数据,请按照以下步骤。
先决条件
-
您必须以
postgres超级用户或具有数据库管理员特权的用户身份运行命令。
流程
- 确保在转储数据库中拥有对象或已被赋予了对象权限的所有用户已存在。如果这样的用户不存在,恢复将无法重新创建具有原始所有权和权限的对象。
运行 psql 工具来恢复由 pg_dumpall 工具创建的文本文件转储:
psql < dumpfile
$ psql < dumpfileCopy to Clipboard Copied! Toggle word wrap Toggle overflow 其中
dumpfile是pg_dumpall命令的输出。
7.4.6.1.6. 在另一服务器上执行数据库的 SQL 转储 复制链接链接已复制到粘贴板!
将数据库从一台服务器直接转储到另一台服务器是可能的,因为 pg_dump 和 psql 可以写入管道并从管道读取。
流程
要从一个服务器到另一个服务器转储数据库,请运行:
pg_dump -h host1 dbname | psql -h host2 dbname
$ pg_dump -h host1 dbname | psql -h host2 dbnameCopy to Clipboard Copied! Toggle word wrap Toggle overflow
7.4.6.1.7. 在恢复过程中处理 SQL 错误 复制链接链接已复制到粘贴板!
默认情况下,如果出现 SQL 错误,psql 会继续执行,从而导致数据库只部分恢复。
要修改默认行为,在恢复转储时使用以下任一方法:
先决条件
-
您必须以
postgres超级用户或具有数据库管理员特权的用户身份运行命令。
流程
请设置
ON_ERROR_STOP变量,使 psql 在发生 SQL 错误时退出,且有一个为 3 的退出状态码:psql --set ON_ERROR_STOP=on dbname < dumpfile
$ psql --set ON_ERROR_STOP=on dbname < dumpfileCopy to Clipboard Copied! Toggle word wrap Toggle overflow 指定整个转储作为一个事务来恢复,以便要么全部完成,要么全部取消。
使用
psql工具恢复文本文件转储时:psql -1
$ psql -1Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
pg_restore工具恢复非文本文件转储时:pg_restore -e
$ pg_restore -eCopy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,在使用这个方法时,即使一个小的错误也可以取消已经运行了很长时间的恢复操作。
7.4.6.2. 使用文件系统级别备份来备份 PostgreSQL 数据 复制链接链接已复制到粘贴板!
要创建文件系统级备份,请将 PostgreSQL 数据库文件复制到另一个位置。例如,您可以使用以下任一方法:
- 使用 tar 工具创建归档文件。
- 使用 rsync 工具将文件复制到其它位置。
- 创建数据目录的一致快照。
7.4.6.2.1. 文件系统备份的优点和限制 复制链接链接已复制到粘贴板!
与其它 PostgreSQL 备份方法相比,文件系统级备份有以下优点:
- 文件系统级备份通常比 SQL 转储快。
与其它 PostgreSQL 备份方法相比,文件系统级备份有以下限制:
- 当您想从 RHEL 7 升级到 RHEL 8 ,并将数据迁移到升级的系统时,这个备份方法不适用。文件系统级别备份特定于架构和 RHEL 主版本。如果升级不成功,您可以恢复 RHEL 7 系统上的数据,但您无法恢复 RHEL 8 系统上的数据。
- 在备份和恢复数据前,数据库服务器必须关闭。
- 无法备份和恢复某些单独的文件或表。备份文件系统只适用于整个数据库集群的完整备份和恢复。
7.4.6.2.2. 执行文件系统级备份 复制链接链接已复制到粘贴板!
要执行文件系统级备份,请使用以下流程。
流程
选择数据库集群的位置,并初始化该集群:
postgresql-setup --initdb
# postgresql-setup --initdbCopy to Clipboard Copied! Toggle word wrap Toggle overflow 停止 postgresql 服务:
systemctl stop postgresql.service
# systemctl stop postgresql.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用任意方法创建文件系统备份,如
tar归档:tar -cf backup.tar /var/lib/pgsql/data/
$ tar -cf backup.tar /var/lib/pgsql/data/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 启动 postgresql 服务:
systemctl start postgresql.service
# systemctl start postgresql.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow
7.4.6.3. 通过持续存档来备份 PostgreSQL 数据 复制链接链接已复制到粘贴板!
PostgreSQL 将对数据库的数据文件所做的每项修改记录到预写日志(WAL)文件中,该文件位于集群数据目录的 pg_wal/ 子目录中。此日志主要用于崩溃恢复。崩溃后,可用上次检查点以后所记录的日志条目将数据库恢复到一致。
持续归档方法也称为在线备份,以在运行的服务器上执行的基础备份或文件系统级备份的形式,将 WAL 文件与数据库集群的副本结合起来。
如果需要进行数据库恢复,您可以从数据库集群的副本恢复数据库,然后从备份的 WAL 文件中重新执行日志,使系统恢复到当前状态。
使用持续归档方法时,您必须保持所有归档的 WAL 文件的连续顺序,这些文件至少可扩展到上一次基础备份的开始时间。因此,基本备份的理想频率取决于:
- 归档 WAL 文件的存储卷。
- 需要恢复时数据恢复的最可能持续时间。自上次备份以来的很长一段时间,系统重新运行了更多 WAL 段,因此恢复需要更长的时间。
您不能将 pg_dump 和 pg_dumpall SQL 转储用作持续归档备份解决方案的一部分。SQL 转储生成逻辑备份,但所包含的信息不足以供WAL重新执行。
7.4.6.3.1. 持续归档的优点和缺陷 复制链接链接已复制到粘贴板!
与其它 PostgreSQL 备份方法相比,持续归档具有以下优势:
- 使用持续备份方法时,可以使用不完全一致的基础备份,因为备份中的任何内部不一致都可以被重新执行日志所修正。因此,您可以在运行的 PostgreSQL 服务器上执行基础备份。
-
不需要文件系统快照;
tar或类似的归档工具就足够了。 - 持续备份可以通过继续归档 WAL 文件来实现,因为日志重播的 WAL 文件序列可能会无限期地延长。这对大型数据库尤其重要。
- 持续备份支持点恢复。不需要将 WAL 条目重新显示到结尾。可在任何时间点停止重新执行,并且数据库可以恢复到执行基础备份以后的任何状态。
- 如果已经加载了相同的基础备份文件的另一台机器可以连续使用WAL文件系列,那么可以在任何时候用数据库几乎当前的副本来恢复其它机器。
与其他 PostgreSQL 备份方法相比,持续归档有以下缺点:
- 持续备份方法只支持恢复整个数据库集群,而不是子集。
- 持续备份需要广泛的归档存储。
7.4.6.3.2. 设置 WAL 归档 复制链接链接已复制到粘贴板!
运行的 PostgreSQL 服务器会生成一系列预写日志(WAL)记录。服务器物理上将该序列分成 WAL 段文件,这些文件被指定了数字名称,以反映它们在 WAL 序列中的位置。如果不进行 WAL 归档,段文件将被重新使用,并被重命名为更高的段号。
在归档 WAL 数据时,在重用段文件之前,都会捕获每一个段文件的内容,并将其保存在一个新的位置。您有多个保存内容的选项,例如其他机器上的 NFS 挂载目录、磁带驱动器或 CD。
请注意,WAL 记录不包括对配置文件的修改。
要启用 WAL 归档,请使用以下流程:
流程
在
/var/lib/pgsql/data/postgresql.conf文件中:-
将
wal_level配置参数设置为replica或更高的值。 -
将
archive_mode参数设置为on。 在
archive_command配置参数中指定 shell 命令。您可以使用cp命令、其它命令或 shell 脚本。例如:
archive_command = 'test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f'
archive_command = 'test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中
%p参数替换为归档文件的相对路径,%f参数替换为文件名。此命令将可归档的 WAL 段复制到
/mnt/server/archivedir/目录中。替换%p和%f参数后,执行的命令如下所示:test ! -f /mnt/server/archivedir/00000001000000A900000065 && cp pg_wal/00000001000000A900000065 /mnt/server/archivedir/00000001000000A900000065
test ! -f /mnt/server/archivedir/00000001000000A900000065 && cp pg_wal/00000001000000A900000065 /mnt/server/archivedir/00000001000000A900000065Copy to Clipboard Copied! Toggle word wrap Toggle overflow 对每个归档的新文件都会生成类似的命令。
注意归档命令只对已完成的 WAL 段执行。生成小 WAL 流量的服务器在交易完成和其归档存储中的安全记录之间可能会有很长时间的延迟。要限制未归档数据可保留多久,您可以:
-
设置
archive_timeout参数,来强制服务器以给定频率切换到新的 WAL 段文件。 -
使用
pg_switch_wal参数强制段切换,以确保交易在完成后立即归档。
-
设置
-
将
重启
postgresql服务以使修改生效:systemctl restart postgresql.service
# systemctl restart postgresql.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 测试您的归档命令,并确保它不会覆盖现有的文件,如果失败,它将返回一个非零退出状态。
- 要保护您的数据,请确保将段文件归档到不具有组或全局读权限的目录中。
7.4.6.3.3. 进行基础备份 复制链接链接已复制到粘贴板!
您可以通过多种方法创建基础备份:执行基础备份的最简单方法是在运行的 PostgreSQL 服务器上使用 pg_basebackup 工具。
基础备份进程会创建一个备份历史记录文件,该文件存储在 WAL 归档区,并以基础备份所需的第一个 WAL 段文件来命名。
备份历史记录文件是一个小文本文件,其包含开始和结束时间,以及备份的 WAL 段。如果您使用标签字符串来标识关联的转储文件,那么您可以使用备份历史记录文件来确定要恢复哪个转储文件。
请考虑保留多个备份集,以确保您可以恢复数据。
先决条件
-
您必须以
postgres超级用户身份、具有数据库管理员特权的用户身份或至少具有REPLICATION权限的其他用户身份来运行命令。 - 您必须保留在基础备份期间和之后生成的所有 WAL 段文件。
流程
使用
pg_basebackup工具执行基础备份。将基础备份创建为单个的文件(纯格式):
pg_basebackup -D backup_directory -Fp
$ pg_basebackup -D backup_directory -FpCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用您选择的备份位置替换 backup_directory。
如果您在与服务器相同的主机上使用表空间并执行基础备份,那么也必须使用
--tablespace-mapping选项,否则当试图将备份写入到同一位置时,备份将失败。将基础备份创建为一个
tar归档(tar和压缩格式):pg_basebackup -D backup_directory -Ft -z
$ pg_basebackup -D backup_directory -Ft -zCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用您选择的备份位置替换 backup_directory。
要恢复此数据,您必须手动提取正确位置中的文件。
要指定serverpg_basebackup将与哪个数据库联系,请使用以下命令行选项:
-h选项用来定义主机的。默认主机要么是本地主机,要么是
PGHOST环境变量所指定的主机。-p选项用来定义端口。默认端口是由
PGPORT环境变量或编译后的默认值指明的。
- 基础备份进程完成后,将备份历史记录文件中指定的数据库集群副本和备份过程中使用的 WAL 段文件进行安全归档。
- 删除比基础备份中使用的 WAL 段文件数值更低的WAL段,因为这些比基础备份旧,并且不再需要进行恢复。
7.4.6.3.4. 使用持续归档备份来恢复数据库 复制链接链接已复制到粘贴板!
要使用持续备份来恢复数据库,请使用以下流程:
流程
停止服务器:
systemctl stop postgresql.service
# systemctl stop postgresql.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将必要的数据复制到临时位置。
最好复制整个集群数据目录和任何表空间。请注意,这需要系统上有足够的可用空间来保存现有数据库的两个副本。
如果您没有足够的空间,就保存集群的
pg_wal目录的内容,其中可能包含系统关闭前没有归档的日志。- 删除集群数据目录下的所有现有文件和子目录,并在您要使用的任何表空间的根目录下删除。
从您的基础备份恢复数据库文件。
确保:
-
恢复的文件具有正确的所有权(数据库系统用户,而不是
root)。 - 恢复的文件具有正确的权限。
-
pg_tblspc/子目录中的符号链接被正确恢复。
-
恢复的文件具有正确的所有权(数据库系统用户,而不是
删除
pg_wal/子目录中的任何文件。这些文件源自基础备份,因此已过时。如果您没有归档
pg_wal/,请重新创建它,并使其具有正确的权限。-
将你在步骤 2 中保存的任何未归档的 WAL 段文件复制到
pg_wal/中。 在集群数据目录中创建
restore.conf恢复命令文件,并在restore_command配置参数中指定 shell 命令。您可以使用cp命令、其它命令或 shell 脚本。例如:restore_command = 'cp /mnt/server/archivedir/%f "%p"'
restore_command = 'cp /mnt/server/archivedir/%f "%p"'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 启动服务器:
systemctl start postgresql.service
# systemctl start postgresql.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 服务器将进入恢复模式,并继续读取所需的存档 WAL 文件。
如果恢复因为外部错误而终止,那么可以重启服务器,它将继续进行恢复。恢复过程完成后,服务器将
restore.conf重命名为restore.done。这可以防止服务器在启动正常的数据库操作后意外重新进入恢复模式。检查数据库的内容,以验证数据库是否已恢复到所需的状态。
如果数据库尚未恢复到所需状态,请返回到第 1 步。如果数据库已恢复到所需的状态,那么通过恢复
pg_hba.conf文件中的客户端身份验证配置来允许用户进行连接。
7.4.7. 迁移到 PostgreSQL 的 RHEL 8 版本 复制链接链接已复制到粘贴板!
Red Hat Enterprise Linux 7 包含 PostgreSQL 9.2 作为 PostgreSQL 服务器的默认版本。另外,PostgreSQL 的几个版本也作为 RHEL 7 的软件集合提供。
Red Hat Enterprise Linux 8 提供 PostgreSQL 10 作为默认的 postgresql 流、PostgreSQL 9.6、PostgreSQL 12、PostgreSQL 13、PostgreSQL 15 和 PostgreSQL 16。
Red Hat Enterprise Linux 上的 PostgreSQL 用户可为数据库文件使用两个迁移路径:
快速升级方法比转储和恢复过程要快。然而,在某些情况下,快速升级无法正常工作,您只能使用转储和恢复过程。这种情况包括:
- 跨架构升级
-
使用
plpython或plpython2扩展的系统。请注意,RHEL 8 AppStream 存储库只包含postgresql-plpython3软件包,而不包含postgresql-plpython2软件包。 - 从 PostgreSQL 的 Red Hat Software Collections 版本迁移不支持快速升级。
迁移到更新版本的 PostgreSQL 的先决条件是备份所有 PostgreSQL 数据库。
转储和恢复过程需要转储数据库并执行SQL文件备份,建议使用快速升级方法。
在迁移到 PostgreSQL 的更高版本前,请参阅您要迁移到的 PostgreSQL 版本的 上游兼容性备注,以及您要迁移的版本和目标版本之间所有跳过的 PostgreSQL 版本。
7.4.7.1. PostgreSQL 15 和 PostgreSQL 16 之间的显著区别 复制链接链接已复制到粘贴板!
PostgreSQL 16 引入了以下显著变化。
postmasters 二进制文件不再提供
PostgreSQL 不再与 postmaster 二进制文件一起分发。使用提供的 systemd 单元文件启动 postgresql 服务器( systemctl start postgres.service 命令)的用户不受此更改的影响。如果您之前直接通过 postmaster 二进制文件启动了 postgresql 服务器,则您现在必须使用 postgres 二进制文件。
文档不再被打包
PostgreSQL 不再在软件包中以 PDF 格式提供文档。改为使用 在线文档。
7.4.7.2. PostgreSQL 13 和 PostgreSQL 15 之间的显著区别 复制链接链接已复制到粘贴板!
PostgreSQL 15 引入了以下向后不兼容的更改:
public 模式的默认权限
在 PostgreSQL 15 中修改了 public 模式的默认权限。新创建的用户需要使用 GRANT ALL ON SCHEMA public TO myuser; 命令明确授予权限。
以下示例在 PostgreSQL 13 及更早版本中正常工作:
postgres=# CREATE USER mydbuser; postgres=# \c postgres mydbuser postgres=$ CREATE TABLE mytable (id int);
postgres=# CREATE USER mydbuser;
postgres=# \c postgres mydbuser
postgres=$ CREATE TABLE mytable (id int);
以下示例在 PostgreSQL 15 及更高版本中正常工作:
postgres=# CREATE USER mydbuser; postgres=# GRANT ALL ON SCHEMA public TO mydbuser; postgres=# \c postgres mydbuser postgres=$ CREATE TABLE mytable (id int);
postgres=# CREATE USER mydbuser;
postgres=# GRANT ALL ON SCHEMA public TO mydbuser;
postgres=# \c postgres mydbuser
postgres=$ CREATE TABLE mytable (id int);
确保 mydbuser 访问在 pg_hba.conf 文件中被正确配置了。如需更多信息,请参阅 创建 PostgreSQL 用户。
Pipeline 模式下不再支持 PQsendQuery()
从 PostgreSQL 15 开始,管道模式中不再支持 libpq 库 PQsendQuery () 函数。修改受影响的应用程序,以使用 PQsendQueryParams() 函数。
7.4.7.3. 使用 pg_upgrade 工具快速升级 复制链接链接已复制到粘贴板!
在快速升级过程中,必须将二进制数据文件复制到 /var/lib/pgsql/data/ 目录中,并使用 pg_upgrade 工具。
您可以使用此方法迁移数据:
- 从 RHEL 7 系统的 PostgreSQL 9.2 迁移到 RHEL 8 的 PostgreSQL 10
- 从 RHEL 8 的 PostgreSQL 10 版本到 RHEL 的 PostgreSQL 12 版本
- 从 RHEL 8 版本的 PostgreSQL 12 的到 RHEL 版本的 PostgreSQL 13
- 从 RHEL 版本的 PostgreSQL 13 到 RHEL 版本的 PostgreSQL 15
- 从 RHEL 版本的 PostgreSQL 15 到 RHEL 版本的 PostgreSQL 16
如果要从 RHEL 8 上的早期 postgresql 流升级,请按照 切换到更新流 中描述的步骤,然后迁移 PostgreSQL 数据。
若要在 RHEL 上的其他 PostgreSQL 版本组合之间迁移,以及从 PostgreSQL 的红帽软件集合版本迁移到 RHEL,请使用 Dump 和恢复升级。
以下流程描述了使用快速升级方法从 PostgreSQL 9.2 的 RHEL 7 系统版本迁移到 PostgreSQL 的 RHEL 8 版本。
先决条件
-
在执行升级前,请备份存储在 PostgreSQL 数据库中的所有数据。默认情况下,所有数据都存储在 RHEL 7 和 RHEL 8 系统上的
/var/lib/pgsql/data/目录中。
流程
在 RHEL 8 系统上,启用您要迁移的流(版本):
yum module enable postgresql:stream
# yum module enable postgresql:streamCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用所选 PostgreSQL 服务器版本替换 stream。
如果使用默认流(提供了 PostgreSQL 10),则可以省略这一步。
在 RHEL 8 系统上,安装
postgresql-server和postgresql-upgrade软件包:yum install postgresql-server postgresql-upgrade
# yum install postgresql-server postgresql-upgradeCopy to Clipboard Copied! Toggle word wrap Toggle overflow 另外,如果您在 RHEL 7 上使用了任何 PostgreSQL 服务器模块,那么也可以在 RHEL 8 系统上安装该模块的两个版本,分别针对 PostgreSQL 9.2 (作为
postgresql-upgrade软件包安装)和 PostgreSQL 的目标版本(作为postgresql-server软件包安装)进行编译。如果您需要编译第三方PostgreSQL服务器模块,请根据postgresql-devel和postgresql-upgrade-devel软件包来构建它。检查以下项:
-
基本配置:在 RHEL 8 系统上,检查您的服务器是否使用默认的
/var/lib/pgsql/data目录,是否正确初始化并启用了数据库。此外,数据文件必须存储在/usr/lib/systemd/system/postgresql.service文件中提及的相同路径。 - PostgreSQL 服务器:您的系统可以运行多个 PostgreSQL 服务器。确保所有这些服务器的数据目录都是独立处理的。
-
PostgreSQL 服务器模块:确保您在 RHEL 7 中使用的 PostgreSQL 服务器模块也安装在 RHEL 8 系统中。请注意,插件安装在
/usr/lib64/pgsql/目录中(或在 32 位系统上的/usr/lib/pgsql/目录中)。
-
基本配置:在 RHEL 8 系统上,检查您的服务器是否使用默认的
确保
postgresql服务在复制数据时未在源和目标系统上运行。systemctl stop postgresql.service
# systemctl stop postgresql.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
将数据库文件从源位置复制到 RHEL 8 系统上的
/var/lib/pgsql/data/目录中。 以 PostgreSQL 用户身份运行以下命令来执行升级过程:
postgresql-setup --upgrade
# postgresql-setup --upgradeCopy to Clipboard Copied! Toggle word wrap Toggle overflow 这会在后台启动
pg_upgrade进程。在出现故障时,
postgresql-setup会提供一条说明性的错误消息。将之前的配置从
/var/lib/pgsql/data-old复制到新集群。请注意,快速升级不会在较新的数据栈中重用之前的配置,配置是从零开始生成的。如果要手动组合旧配置和新配置,请使用数据目录中的 *.conf 文件。
启动新的 PostgreSQL 服务器:
systemctl start postgresql.service
# systemctl start postgresql.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 分析新的数据库集群。
对于 PostgreSQL 13 或更早版本:
su postgres -c '~/analyze_new_cluster.sh'
su postgres -c '~/analyze_new_cluster.sh'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 对于 PostgreSQL 15 或更高版本:
su postgres -c 'vacuumdb --all --analyze-in-stages'
su postgres -c 'vacuumdb --all --analyze-in-stages'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意您可能需要使用
ALTER COLLATION name REFRESH VERSION,请查看 上游文档 以了解详细信息。
如果您希望新 PostgreSQL 服务器在引导时自动启动,请运行:
systemctl enable postgresql.service
# systemctl enable postgresql.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow
7.4.7.4. 转储和恢复升级 复制链接链接已复制到粘贴板!
使用转储和恢复升级时,您必须将所有的数据库内容转储到 SQL 文件转储文件中。
请注意,转储和恢复升级比快速升级方法慢,并且可能在生成的 SQL 文件中需要一些手动修复。
您可以使用此方法迁移以下数据:
- Red Hat Enterprise Linux 7 系统的 PostgreSQL 9.2
- 早期 Red Hat Enterprise Linux 8 版本的 PostgreSQL
与来自 Red Hat Software Collections 相同或更早版本的 PostgreSQL:
- PostgreSQL 9.2 (不再支持)
- PostgreSQL 9.4 (不再支持)
- PostgreSQL 9.6 (不再支持)
- PostgreSQL 10
- PostgreSQL 12
- PostgreSQL 13
在 RHEL 7 和 RHEL 8 系统上,PostgreSQL 数据默认存储在 /var/lib/pgsql/data/ 目录中。对于 PostgreSQL 的红帽软件集合版本,默认数据目录为 /var/opt/rh/collection_name/lib/pgsql/data/ (postgresql92 除外,它使用 /opt/rh/postgresql92/root/var/lib/pgsql/data/ 目录)。
如果要从 RHEL 8 上的早期 postgresql 流升级,请按照 切换到更新流 中描述的步骤,然后迁移 PostgreSQL 数据。
要执行转储和恢复升级,请将用户改为 root。
以下流程描述了从 PostgreSQL 9.2 的 RHEL 7 系统版本迁移到 PostgreSQL 的 RHEL 8 版本。
流程
在 RHEL 7 系统中,启动 PostgreSQL 9.2 服务器:
systemctl start postgresql.service
# systemctl start postgresql.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在 RHEL 7 系统上,将所有数据库内容转储到
pgdump_file.sql文件中:su - postgres -c "pg_dumpall > ~/pgdump_file.sql"
su - postgres -c "pg_dumpall > ~/pgdump_file.sql"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 验证数据库是否已正确转储:
su - postgres -c 'less "$HOME/pgdump_file.sql"'
su - postgres -c 'less "$HOME/pgdump_file.sql"'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 结果显示的转储的 sql 文件的路径为:
/var/lib/pgsql/pgdump_file.sql。在 RHEL 8 系统中,启用您要迁移的流(版本):
yum module enable postgresql:stream
# yum module enable postgresql:streamCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用所选 PostgreSQL 服务器版本替换 stream。
如果使用默认流(提供了 PostgreSQL 10),则可以省略这一步。
在 RHEL 8 系统上,安装
postgresql-server软件包:yum install postgresql-server
# yum install postgresql-serverCopy to Clipboard Copied! Toggle word wrap Toggle overflow 另外,如果您在 RHEL 7 中使用了任何 PostgreSQL 服务器模块,也需要在 RHEL 8 系统中安装它们。如果您需要编译第三方 PostgreSQL 服务器模块,请根据
postgresql-devel软件包进行构建。在 RHEL 8 系统中,初始化新 PostgreSQL 服务器的数据目录:
postgresql-setup --initdb
# postgresql-setup --initdbCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在 RHEL 8 系统上,将
pgdump_file.sql复制到 PostgreSQL 主目录中,并检查该文件是否被正确复制:su - postgres -c 'test -e "$HOME/pgdump_file.sql" && echo exists'
su - postgres -c 'test -e "$HOME/pgdump_file.sql" && echo exists'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 复制 RHEL 7 系统中的配置文件:
su - postgres -c 'ls -1 $PGDATA/*.conf'
su - postgres -c 'ls -1 $PGDATA/*.conf'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要复制的配置文件包括:
-
/var/lib/pgsql/data/pg_hba.conf -
/var/lib/pgsql/data/pg_ident.conf -
/var/lib/pgsql/data/postgresql.conf
-
在 RHEL 8 系统中,启动新的 PostgreSQL 服务器:
systemctl start postgresql.service
# systemctl start postgresql.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在 RHEL 8 系统中,从转储的 sql 文件中导入数据:
su - postgres -c 'psql -f ~/pgdump_file.sql postgres'
su - postgres -c 'psql -f ~/pgdump_file.sql postgres'Copy to Clipboard Copied! Toggle word wrap Toggle overflow
当从 PostgreSQL 的红帽软件集合版本升级时,请将命令调整为包含 scl enable collection_name。例如,要转储 rh-postgresql96 软件集合中的数据,请使用以下命令:
su - postgres -c 'scl enable rh-postgresql96 "pg_dumpall > ~/pgdump_file.sql"'
su - postgres -c 'scl enable rh-postgresql96 "pg_dumpall > ~/pgdump_file.sql"'
7.4.8. 使用 RHEL 系统角色安装和配置 PostgreSQL 数据库服务器 复制链接链接已复制到粘贴板!
您可以使用 postgresql RHEL 系统角色自动化 PostgreSQL 数据库服务器的安装和管理。默认情况下,此角色还通过自动在 PostgreSQL 服务配置文件中配置与性能相关的设置来优化 PostgreSQL。
如果应用程序需要 PostgreSQL 数据库服务器,您可以使用 TLS 加密配置此服务,以在应用程序和数据库之间启用安全通信。通过使用 postgresql RHEL 系统角色,您可以自动化这个过程,并远程安装和配置带有 TLS 加密的 PostgreSQL。在 playbook 中,您可以使用现有私钥和由证书颁发机构(CA)发布的 TLS 证书。
postgresql 角色无法在 firewalld 服务中打开端口。要允许远程访问 PostgreSQL 服务器,请在 playbook 中添加一个使用 firewall RHEL 系统角色的任务。
先决条件
- 您已准备好控制节点和受管节点
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo权限。 受管节点的私钥和证书都存储在控制节点上的以下文件中:
-
私钥:
~/<FQDN_of_the_managed_node>.key -
证书:
~/<FQDN_of_the_managed_node>.crt
-
私钥:
流程
将敏感变量存储在加密的文件中:
创建 vault :
ansible-vault create ~/vault.yml
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在
ansible-vault create命令打开编辑器后,以<key>: <value>格式输入敏感数据:pwd: <password>
pwd: <password>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 示例 playbook 中指定的设置包括如下:
postgresql_version: <version>设置要安装的 PostgreSQL 的版本。您可以设置的版本取决于在受管节点上运行的 Red Hat Enterprise Linux 中提供的 PostgreSQL 版本。
您无法通过更改
postgresql_version变量并再次运行 playbook 来升级或降级 PostgreSQL。postgresql_password: <password>设置
postgres数据库超级用户的密码。您无法通过更改
postgresql_password变量并再次运行 playbook 来更改密码。postgresql_cert_name: <private_key_and_certificate_file>定义受管节点上没有
.crt和key后缀的证书和私钥的路径和基础名称。在 PostgreSQL 配置过程中,角色在/var/lib/pgsql/data/目录中创建引用这些文件的符号链接。证书和私钥必须在受管节点上本地存在。您可以将任务与
ansible.builtin.copy模块一起使用,来将文件从控制节点传输到受管节点,如 playbook 中所示。postgresql_server_conf: <list_of_settings>定义角色应设置的
postgresql.conf设置。角色将这些设置添加到/etc/postgresql/system-roles.conf文件中,并在/var/lib/pgsql/data/postgresql.conf的末尾包含此文件。因此,postgresql_server_conf变量中的设置会覆盖/var/lib/pgsql/data/postgresql.conf中的设置。使用
postgresql_server_conf中的不同设置重新运行 playbook 会使用新设置覆盖/etc/postgresql/system-roles.conf文件。postgresql_pg_hba_conf: <list_of_authentication_entries>在
/var/lib/pgsql/data/pg_hba.conf文件中配置客户端身份验证条目。详情请查看 PostgreSQL 文档。示例允许以下到 PostgreSQL 的连接:
- 使用本地 UNIX 域套接字的未加密的连接。
- 到 IPv4 和 IPv6 localhost 地址的 TLS 加密的连接。
-
来自 192.0.2.0/24 子网的 TLS 加密的连接。请注意,只有在您也在
postgresql_server_conf变量中适当配置了listen_addresses设置,才能从远程地址进行访问。
使用
postgresql_pg_hba_conf中的不同设置重新运行 playbook 会使用新设置覆盖/var/lib/pgsql/data/pg_hba.conf文件。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.postgresql/README.md文件。验证 playbook 语法:
ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
$ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook --ask-vault-pass ~/playbook.yml
$ ansible-playbook --ask-vault-pass ~/playbook.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
使用
postgres超级用户连接到 PostgreSQL 服务器,并执行\conninfo元命令:psql "postgresql://postgres@managed-node-01.example.com:5432" -c '\conninfo'
# psql "postgresql://postgres@managed-node-01.example.com:5432" -c '\conninfo' Password for user postgres: You are connected to database "postgres" as user "postgres" on host "192.0.2.1" at port "5432". SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果输出显示 TLS 协议版本和密码详情,则连接可以正常工作,且 TLS 加密已启用。
如果应用程序需要 PostgreSQL 数据库服务器,您可以配置带有 TLS 加密的 PostgreSQL 服务,来在应用和数据库之间启用安全通信。如果 PostgreSQL 主机是 Red Hat Enterprise Linux Identity Management (IdM)域的成员,则 certmonger 服务可以管理证书请求和将来的续订。
通过使用 postgresql RHEL 系统角色,您可以自动化此过程。您可以远程安装和配置带有 TLS 加密的 PostgreSQL,postgresql 角色使用 certificate RHEL 系统角色配置 certmonger ,并从 IdM 请求证书。
postgresql 角色无法在 firewalld 服务中打开端口。要允许远程访问 PostgreSQL 服务器,请在使用 firewall RHEL 系统角色的 playbook 中添加一个任务。
先决条件
- 您已准备好控制节点和受管节点
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo权限。 - 您在 IdM 域中注册了受管节点。
流程
将敏感变量存储在加密的文件中:
创建 vault :
ansible-vault create ~/vault.yml
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在
ansible-vault create命令打开编辑器后,以<key>: <value>格式输入敏感数据:pwd: <password>
pwd: <password>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 示例 playbook 中指定的设置包括如下:
postgresql_version: <version>设置要安装的 PostgreSQL 的版本。您可以设置的版本取决于在受管节点上运行的 Red Hat Enterprise Linux 中提供的 PostgreSQL 版本。
您无法通过更改
postgresql_version变量并再次运行 playbook 来升级或降级 PostgreSQL。postgresql_password: <password>设置
postgres数据库超级用户的密码。您无法通过更改
postgresql_password变量并再次运行 playbook 来更改密码。postgresql_certificates: < ;certificate_role_settings>-
包含
certificate角色设置的 YAML 字典的列表。 postgresql_server_conf: <list_of_settings>定义您要角色设置的
postgresql.conf设置。角色将这些设置添加到/etc/postgresql/system-roles.conf文件中,并在/var/lib/pgsql/data/postgresql.conf的末尾包含此文件。因此,postgresql_server_conf变量中的设置会覆盖/var/lib/pgsql/data/postgresql.conf中的设置。使用
postgresql_server_conf中的不同设置重新运行 playbook 会使用新设置覆盖/etc/postgresql/system-roles.conf文件。postgresql_pg_hba_conf: <list_of_authentication_entries>在
/var/lib/pgsql/data/pg_hba.conf文件中配置客户端身份验证条目。详情请查看 PostgreSQL 文档。示例允许以下到 PostgreSQL 的连接:
- 使用本地 UNIX 域套接字的未加密的连接。
- 到 IPv4 和 IPv6 localhost 地址的 TLS 加密的连接。
-
来自 192.0.2.0/24 子网的 TLS 加密的连接。请注意,只有在您也在
postgresql_server_conf变量中适当配置了listen_addresses设置,才能从远程地址进行访问。
使用
postgresql_pg_hba_conf中的不同设置重新运行 playbook 会使用新设置覆盖/var/lib/pgsql/data/pg_hba.conf文件。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.postgresql/README.md文件。验证 playbook 语法:
ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
$ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook --ask-vault-pass ~/playbook.yml
$ ansible-playbook --ask-vault-pass ~/playbook.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
使用
postgres超级用户连接到 PostgreSQL 服务器,并执行\conninfo元命令:psql "postgresql://postgres@managed-node-01.example.com:5432" -c '\conninfo'
# psql "postgresql://postgres@managed-node-01.example.com:5432" -c '\conninfo' Password for user postgres: You are connected to database "postgres" as user "postgres" on host "192.0.2.1" at port "5432". SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果输出显示 TLS 协议版本和密码详情,则连接可以正常工作,且 TLS 加密已启用。
第 8 章 部署和配置 Postfix SMTP 服务器 复制链接链接已复制到粘贴板!
作为系统管理员,您可以使用邮件传输代理(MTA) (如 Postfix)配置电子邮件基础架构,以使用 SMTP 协议在主机之间传输电子邮件消息。Postfix 是用于路由和发送邮件的服务器端应用程序。您可以使用 Postfix 建立本地邮件服务器、创建 null-client 邮件转发、使用 Postfix 服务器作为多个域的目的地,或者选择 LDAP 目录而不是文件进行查找。
postfix 软件包在 /etc/postfix/ 目录中提供多个配置文件。
要配置电子邮件基础架构,请使用以下配置文件:
-
main.cf- 包含 Postfix 的全局配置。 -
master.cf- 指定 Postfix 与各种进程的交互,以完成邮件发送。 -
access- 指定访问规则,例如允许连接到 Postfix 的主机。 -
transport- 将电子邮件地址映射到中继主机。 -
alias- 包含邮件协议所需的可配置列表,用于描述用户 ID 别名。请注意,您可以在/etc/目录中找到此文件。
Postfix 的主要功能:
- 防止常见电子邮件相关威胁的安全功能
- 自定义选项,包括支持虚拟域和别名的选项
8.1. 安装和配置 Postfix SMTP 服务器 复制链接链接已复制到粘贴板!
您可以将 Postfix SMTP 服务器配置为接收、存储和发送电子邮件消息。如果在系统安装期间没有选择邮件服务器软件包,则 Postfix 默认不可用。执行以下步骤来安装 Postfix:
先决条件
- 您有 root 访问权限。
- 注册您的系统
流程
删除 Sendmail 工具:
yum remove sendmail
# yum remove sendmailCopy to Clipboard Copied! Toggle word wrap Toggle overflow 安装 Postfix:
yum install postfix
# yum install postfixCopy to Clipboard Copied! Toggle word wrap Toggle overflow 要配置 Postfix,请编辑
/etc/postfix/main.cf文件,并进行以下更改:默认情况下,Postfix 仅在
loopback接口上接收电子邮件。要将 Postfix 配置为侦听特定的接口,请将inet_interfaces参数更新为这些接口的 IP 地址:inet_interfaces = 127.0.0.1/32, [::1]/128, 192.0.2.1, [2001:db8:1::1]
inet_interfaces = 127.0.0.1/32, [::1]/128, 192.0.2.1, [2001:db8:1::1]Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要将 Postfix 配置为侦听所有接口,请设置:
inet_interfaces = all
inet_interfaces = allCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您希望 Postfix 使用与
gethostname()函数返回的完全限定域名(FQDN)不同的主机名,请添加myhostname参数:myhostname = smtp.example.com
myhostname = smtp.example.comCopy to Clipboard Copied! Toggle word wrap Toggle overflow 例如,Postfix 将此主机名添加到它处理的电子邮件的标头中。
如果域名与
myhostname参数中的不同,请添加mydomain参数:mydomain = example.com
mydomain = example.comCopy to Clipboard Copied! Toggle word wrap Toggle overflow 添加
myorigin参数,并将其设置为mydomain的值:myorigin = $mydomain
myorigin = $mydomainCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用这个设置时,Postfix 使用域名而不是主机名作为本地发送的邮件的源。
添加
mynetworks参数,并定义允许发送邮件的可信网络的 IP 范围:mynetworks = 127.0.0.1/32, [::1]/128, 192.0.2.1/24, [2001:db8:1::1]/64
mynetworks = 127.0.0.1/32, [::1]/128, 192.0.2.1/24, [2001:db8:1::1]/64Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果来自不受信任网络(如互联网)的客户端应能够通过这个服务器发送邮件,则您必须在后续步骤中配置中继限制。
验证
main.cf文件中的 Postfix 配置是否正确:postfix check
# postfix checkCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在引导时启用
postfix服务,并启动它:systemctl enable --now postfix
# systemctl enable --now postfixCopy to Clipboard Copied! Toggle word wrap Toggle overflow 允许 smtp 流量通过防火墙,并重新载入防火墙规则:
firewall-cmd --permanent --add-service smtp firewall-cmd --reload
# firewall-cmd --permanent --add-service smtp # firewall-cmd --reloadCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
验证
postfix服务是否正在运行:systemctl status postfix
# systemctl status postfixCopy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:如果输出处于停止、等待或服务没有运行,请重启
postfix服务:systemctl restart postfix
# systemctl restart postfixCopy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:在更改
/etc/postfix/目录中配置文件中的任何选项后,请重新载入postfix服务以应用这些更改:systemctl reload postfix
# systemctl reload postfixCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证系统上本地用户之间的电子邮件通信:
echo "This is a test message" | mail -s <subject> <user@mydomain.com>
# echo "This is a test message" | mail -s <subject> <user@mydomain.com>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要验证您的邮件服务器是否没有将来自外部 IP 范围的电子邮件中继到外域,请按照以下提到的流程操作:
-
登录到不在
mynetworks中定义的子网内的客户端。 - 将客户端配置为使用您的邮件服务器。
-
尝试将电子邮件发送到不在您邮件服务器上的 mydomain 中指定的域下的电子邮件地址。例如,尝试向
non-existing-user@redhat.com发送电子邮件。 检查
/var/log/maillog文件:554 Relay access denied - the server is not going to relay. 250 OK or similar - the server is going to relay.
554 Relay access denied - the server is not going to relay. 250 OK or similar - the server is going to relay.Copy to Clipboard Copied! Toggle word wrap Toggle overflow
-
登录到不在
故障排除
-
如果出现错误,请检查
/var/log/maillog文件。
8.2. 自定义 Postfix 服务器的 TLS 设置 复制链接链接已复制到粘贴板!
要使您的电子邮件流量加密,以便更安全,您可以将 Postfix 配置为使用来自可信证书颁发机构(CA)的证书,而不是自签名证书,并自定义传输层安全(TLS)安全设置。在 RHEL 8 中,在 Postfix 服务器中默认启用 TLS 加密协议。基本的 Postfix TLS 配置包含用于入站 SMTP 的自签名证书,以及出站 SMTP 的机会 TLS。
先决条件
- 您有 root 访问权限。
-
您的服务器上已安装了
postfix软件包。 - 您有由可信证书颁发机构(CA)签名的证书和私钥。
您已将以下文件复制到 Postfix 服务器:
-
服务器证书:
/etc/pki/tls/certs/postfix.pem -
私钥:
/etc/pki/tls/private/postfix.key
-
服务器证书:
流程
通过在
/etc/postfix/main.cf文件中添加以下行,来设置运行 Postfix 的服务器上的证书和私钥文件的路径:smtpd_tls_cert_file = /etc/pki/tls/certs/postfix.pem smtpd_tls_key_file = /etc/pki/tls/private/postfix.key
smtpd_tls_cert_file = /etc/pki/tls/certs/postfix.pem smtpd_tls_key_file = /etc/pki/tls/private/postfix.keyCopy to Clipboard Copied! Toggle word wrap Toggle overflow 通过编辑
/etc/postfix/main.cf文件,将传入的 SMTP 连接限制到经过身份验证的用户:smtpd_tls_auth_only = yes
smtpd_tls_auth_only = yesCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重新载入
postfix服务以应用更改:systemctl reload postfix
# systemctl reload postfixCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
将您的客户端配置为使用 TLS 加密,并发送电子邮件。
注意要获取有关 Postfix 客户端 TLS 活动的其他信息,请通过更改
/etc/postfix/main.cf中的以下行,将日志级别从0增加到1:smtp_tls_loglevel = 1
smtp_tls_loglevel = 1Copy to Clipboard Copied! Toggle word wrap Toggle overflow
8.3. 配置 Postfix ,来将所有电子邮件转发到邮件中继 复制链接链接已复制到粘贴板!
如果要将所有电子邮件转发到邮件中继,您可以将 Postfix 服务器配置为 null 客户端。在此配置中,Postfix 仅将邮件转发到不同的邮件服务器,且无法接收邮件。
先决条件
- 您有 root 访问权限。
-
您的服务器上已安装了
postfix软件包。 - 您有要将电子邮件转发到的中继主机的 IP 地址或主机名。
流程
要防止 Postfix 接受任何本地电子邮件发送,并使其成为 null 客户端,请编辑
/etc/postfix/main.cf文件,并进行以下更改:通过将
mydestination参数设置为空值,将 Postfix 配置为转发所有电子邮件:mydestination =
mydestination =Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在此配置中,Postfix 服务器不是任何电子邮件的目的地,并充当 null 客户端。
指定从您的 null 客户端接收电子邮件的邮件中继服务器:
relayhost = [<ip_address_or_hostname>]
relayhost = [<ip_address_or_hostname>]Copy to Clipboard Copied! Toggle word wrap Toggle overflow 中继主机负责邮件发送。将
<ip_address_or_hostname>括在方括号中。将 Postfix 邮件服务器配置为仅侦听用于发送电子邮件的回环接口:
inet_interfaces = loopback-only
inet_interfaces = loopback-onlyCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您希望 Postfix 将所有传出电子邮件的发件人域重写为中继邮件服务器的公司域,请设置:
myorigin = relay.example.com
myorigin = relay.example.comCopy to Clipboard Copied! Toggle word wrap Toggle overflow 要禁用本地邮件发送,请在配置文件末尾添加以下指令:
local_transport = error: local delivery disabled
local_transport = error: local delivery disabledCopy to Clipboard Copied! Toggle word wrap Toggle overflow 添加
mynetworks参数,以便 Postfix 将来自 127.0.0.0/8 IPv4 网络和 [::1]/128 IPv6 网络的本地系统的电子邮件转发到邮件中继服务器:mynetworks = 127.0.0.0/8, [::1]/128
mynetworks = 127.0.0.0/8, [::1]/128Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
main.cf文件中的 Postfix 配置是否正确:postfix check
# postfix checkCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重启
postfix服务以应用更改:systemctl restart postfix
# systemctl restart postfixCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
验证电子邮件通信是否已转发到邮件中继:
echo "This is a test message" | mail -s <subject> <user@example.com>
# echo "This is a test message" | mail -s <subject> <user@example.com>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
故障排除
-
如果出现错误,请检查
/var/log/maillog文件。
8.4. 将 Postfix 配置为多个域的目的地 复制链接链接已复制到粘贴板!
您可以将 Postfix 配置为可接收多个域电子邮件的邮件服务器。在此配置中,Postfix 充当发送到指定域中地址的电子邮件的最终目的地。您可以配置以下内容:
- 设置指向同一电子邮件目的地的多个电子邮件地址
- 将多个域的传入电子邮件路由到同一 Postfix 服务器
先决条件
- 您有 root 访问权限。
- 您已配置了一个 Postfix 服务器。
流程
在
/etc/postfix/virtual虚拟别名文件中,指定每个域的电子邮件地址。在新行上添加每一个电子邮件地址:<info@example.com> <user22@example.net> <sales@example.com> <user11@example.org>
<info@example.com> <user22@example.net> <sales@example.com> <user11@example.org>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在这个示例中,Postfix 将发送到 info@example.com 的所有电子邮件重定向到 user22@example.net,将发送到 sales@example.com 的电子邮件重定向到 user11@example.org。
为虚拟别名映射创建一个哈希文件:
postmap /etc/postfix/virtual
# postmap /etc/postfix/virtualCopy to Clipboard Copied! Toggle word wrap Toggle overflow 此命令创建
/etc/postfix/virtual.db文件。请注意,在更新/etc/postfix/virtual文件后,您必须始终重新运行这个命令。在 Postfix
/etc/postfix/main.cf配置文件中,添加virtual_alias_maps参数,并将其指向哈希文件:virtual_alias_maps = hash:/etc/postfix/virtual
virtual_alias_maps = hash:/etc/postfix/virtualCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重新载入
postfix服务以应用更改:systemctl reload postfix
# systemctl reload postfixCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
- 通过向其中一个虚拟电子邮件地址发送电子邮件来测试配置。
故障排除
-
如果出现错误,请检查
/var/log/maillog文件。
8.5. 使用 LDAP 目录作为查找表 复制链接链接已复制到粘贴板!
如果您使用轻量级目录访问协议(LDAP)服务器来存储帐户、域或别名,您可以将 Postfix 配置为使用 LDAP 服务器作为查找表。使用 LDAP 而不是文件进行查找可让您有一个中心数据库。
先决条件
- 您有 root 访问权限。
-
您的服务器上已安装了
postfix软件包。 - 您有一个具有所需模式的 LDAP 服务器和用户凭证。
-
您已在运行 Postfix 的服务器上安装了
postfix-ldap插件。
流程
通过创建包含以下内容的
/etc/postfix/ldap-aliases.cf文件来配置 LDAP 查找参数:指定 LDAP 服务器的主机名:
server_host = ldap.example.com
server_host = ldap.example.comCopy to Clipboard Copied! Toggle word wrap Toggle overflow 指定 LDAP 搜索的基础域名称:
search_base = dc=example,dc=com
search_base = dc=example,dc=comCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
可选:根据您的要求自定义 LDAP 搜索过滤器和属性。搜索目录的过滤器默认为
query_filter = mailacceptinggeneralid=%s。
通过添加以下内容,将 LDAP 源启用为
/etc/postfix/main.cf配置文件中的查找表:virtual_alias_maps = ldap:/etc/postfix/ldap-aliases.cf
virtual_alias_maps = ldap:/etc/postfix/ldap-aliases.cfCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行
postmap命令验证 LDAP 配置,它会检查任何语法错误或连接问题:postmap -q @example.com ldap:/etc/postfix/ldap-aliases.cf
# postmap -q @example.com ldap:/etc/postfix/ldap-aliases.cfCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重新载入
postfix服务以应用更改:systemctl reload postfix
# systemctl reload postfixCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
-
发送测试电子邮件,以验证 LDAP 查找是否正常工作。检查
/var/log/maillog中的邮件日志是否存在任何错误。
8.6. 将 Postfix 配置为传出邮件服务器,以为经过身份验证的用户进行转发 复制链接链接已复制到粘贴板!
您可以将 Postfix 配置为为经过身份验证的用户中继邮件。在这种情况下,您可以通过将 Postfix 配置为具有 SMTP 身份验证、TLS 加密和发件人地址限制的传出邮件服务器,来允许用户自行验证,并使用其电子邮件地址通过 SMTP 服务器发送邮件。
先决条件
- 您有 root 访问权限。
- 您已配置了一个 Postfix 服务器。
流程
要将 Postfix 配置为传出邮件服务器,请编辑
/etc/postfix/main.cf文件,并添加以下内容:启用 SMTP 身份验证:
smtpd_sasl_auth_enable = yes broken_sasl_auth_clients = yes
smtpd_sasl_auth_enable = yes broken_sasl_auth_clients = yesCopy to Clipboard Copied! Toggle word wrap Toggle overflow 禁用没有 TLS 的访问:
smtpd_tls_auth_only = yes
smtpd_tls_auth_only = yesCopy to Clipboard Copied! Toggle word wrap Toggle overflow 仅对经过身份验证的用户允许进行邮件转发:
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destinationCopy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:限制用户以只使用他们自己的电子邮件地址作为发送者:
smtpd_sender_restrictions = reject_sender_login_mismatch
smtpd_sender_restrictions = reject_sender_login_mismatchCopy to Clipboard Copied! Toggle word wrap Toggle overflow
重新载入
postfix服务以应用更改:systemctl reload postfix
# systemctl reload postfixCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
- 在支持 TLS 和 SASL 的 SMTP 客户端中进行身份验证。发送测试电子邮件,以验证 SMTP 身份验证是否正常工作。
8.7. 将来自 Postfix 的电子邮件发送到在同一主机上运行的 Dovecot 复制链接链接已复制到粘贴板!
您可以将 Postfix 配置为使用 UNIX 套接字上的 LMTP 将传入的邮件发送到同一主机上的 Dovecot 。这个套接字在本地机器上的 Postfix 和 Dovecot 之间启用直接通信。
先决条件
- 您有 root 访问权限。
- 您已配置了一个 Postfix 服务器。
- 您已配置了一个 Dovecot 服务器,请参阅 配置并维护 Dovecot IMAP 和 POP3 服务器。
- 您已在 Dovecot 服务器上配置了 LMTP 套接字,请参阅 配置 LMTP 套接字和 LMTPS 侦听器。
流程
在
/etc/postfix/main.cf文件中,将 Postfix 配置为使用 LMTP 协议和 UNIX 域套接字来向 Dovecot 发送邮件:如果要使用虚拟邮箱,请添加以下内容:
virtual_transport = lmtp:unix:/var/run/dovecot/lmtp
virtual_transport = lmtp:unix:/var/run/dovecot/lmtpCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果要使用非虚拟邮箱,请添加以下内容:
mailbox_transport = lmtp:unix:/var/run/dovecot/lmtp
mailbox_transport = lmtp:unix:/var/run/dovecot/lmtpCopy to Clipboard Copied! Toggle word wrap Toggle overflow
重新载入
postfix以应用更改:systemctl reload postfix
# systemctl reload postfixCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
-
发送一封测试电子邮件,以验证 LMTP 套接字是否正常工作。检查
/var/log/maillog中的邮件日志是否存在任何错误。
8.8. 将来自 Postfix 的电子邮件发送到不同主机上运行的 Dovecot 复制链接链接已复制到粘贴板!
您可以通过网络在 Postfix 邮件服务器和 Dovecot 传输代理之间建立安全连接。为此,请将 LMTP 服务配置为使用网络套接字在邮件服务器之间传递邮件。默认情况下,LMTP 协议没有加密。但是,如果您配置了 TLS 加密,则 Dovecot 会自动对 LMTP 服务使用相同的设置。然后,SMTP 服务器可以使用 LMTP 上的 STARTTLS 命令连接到它。
先决条件
- 您有 root 访问权限。
- 您已配置了一个 Postfix 服务器。
- 您已配置了一个 Dovecot 服务器,请参阅 配置并维护 Dovecot IMAP 和 POP3 服务器。
- 您已在 Dovecot 服务器上配置了 LMTP 服务,请参阅配置 LMTP 套接字和 LMTPS 侦听器。
流程
通过在
/etc/postfix/main.cf文件中添加以下内容,将 Postfix 配置为使用 LMTP 协议和 INET 域套接字来将邮件发送到 Dovecot:mailbox_transport = lmtp:inet:<dovecot_host>:<port>
mailbox_transport = lmtp:inet:<dovecot_host>:<port>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将
<dovecot_host>替换为 Dovecot 服务器的 IP 地址或主机名,将<port>替换为 LMTP 服务的端口号。重新载入
postfix服务以应用更改:systemctl reload postfix
# systemctl reload postfixCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
- 将测试电子邮件发送到远程 Dovecot 服务器拥有的地址,并检查 Dovecot 日志,以确保邮件已成功发送。
8.9. 保护 Postfix 服务 复制链接链接已复制到粘贴板!
Postfix 是邮件传输代理(MTA),其使用简单邮件传输协议(SMTP)在其他 MTA 之间发送电子邮件,并将电子邮件发送给客户端或传输代理。虽然 MTA 可以加密彼此之间的流量,但默认情况下可能不会这样做。您还可以通过将设置改为更安全的值来降低各种攻击的风险。
8.9.2. 用于限制 DoS 攻击的 Postfix 配置选项 复制链接链接已复制到粘贴板!
攻击者可以用流量淹没服务器,或发送触发崩溃的信息,从而导致拒绝服务(DoS)攻击。您可以通过在 /etc/postfix/main.cf 文件中设置限制来配置系统,以降低此类攻击的风险。您可以更改现有指令的值,或者您可以使用 <directive> = <value> 格式的自定义值添加新指令。
使用以下指令列表来限制 DoS 攻击:
smtpd_client_connection_rate_limit-
限制任何客户端每个时间单元可以尝试的最大连接数。默认值为
0,这意味着客户端每个时间单位内可以尝试的 Postfix 所能接受的连接数。默认情况下,指令排除可信网络中的客户端。 anvil_rate_time_unit-
定义计算速率限制的时间单位。默认值为
60秒。 smtpd_client_event_limit_exceptions- 将客户端从连接和速率限制命令中排除。默认情况下,指令排除可信网络中的客户端。
smtpd_client_message_rate_limit- 定义每个时间单位从客户端发送到请求的最大消息数(无论 Postfix 是否实际接收了这些消息)。
default_process_limit-
定义提供给定服务的默认的 Postfix 子进程的最大数。对于
master.cf文件中的特定服务,您可以忽略此规则。默认情况下,该值为100。 queue_minfree-
定义在队列文件系统中接收邮件所需的最小可用空间量。该指令目前由 Postfix SMTP 服务器使用,以决定是否接受任何邮件。默认情况下,空闲空间量小于
message_size_limit的 1.5 倍时,Postfix SMTP 服务器会拒绝MAIL FROM命令。要指定较高的最小空闲空间限制,请将queue_minfree值指定为至少message_size_limit的 1.5 倍。默认情况下,queue_minfree值为0。 header_size_limit-
定义用于存储消息标头的最大内存量(以字节为单位)。如果消息头较大,它会丢弃超出的消息头。默认情况下,值为
102400字节。 message_size_limit-
定义消息的最大大小(以字节为单位),包括信封信息。默认情况下,值为
10240000字节。
8.9.3. 将 Postfix 配置为使用 SASL 复制链接链接已复制到粘贴板!
Postfix 支持基于简单身份验证和安全层(SASL)的 SMTP 身份验证(AUTH)。SMTP AUTH 是简单邮件传输协议的扩展。目前,Postfix SMTP 服务器通过以下方式支持 SASL 实现:
- Dovecot SASL
- Postfix SMTP 服务器可以使用 UNIX-域套接字或 TCP 套接字与 Dovecot SASL 实现进行通信。如果 Postfix 和 Dovecot 应用程序运行在单独的计算机上,则使用此方法。
- Cyrus SASL
- 启用后,SMTP 客户端必须使用服务器和客户端都支持和接受的身份验证方法与 SMTP 服务器进行身份验证。
先决条件
-
dovecot软件包已安装在系统上
流程
设置 Dovecot:
在
/etc/dovecot/conf.d/10-master.conf文件中包括以下行:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 前面的示例对 Postfix 和 Dovecot 之间的通信使用 UNIX-域套接字。该示例还假定默认的 Postfix SMTP 服务器设置,其包括位于
/var/spool/postfix/目录中的邮件队列,以及在postfix用户和组下运行的应用程序。可选:建立 Dovecot 以通过 TCP 侦听 Postfix 验证请求:
service auth { inet_listener { port = <port-number> } }service auth { inet_listener { port = <port-number> } }Copy to Clipboard Copied! Toggle word wrap Toggle overflow 通过编辑
/etc/dovecot/conf.d/10-auth.conf文件中的auth_mechanisms参数来指定电子邮件客户端用来使用 Dovecot 进行身份验证的方法:auth_mechanisms = plain login
auth_mechanisms = plain loginCopy to Clipboard Copied! Toggle word wrap Toggle overflow auth_mechanisms参数支持不同的纯文本和非纯文本身份验证方法。
通过修改
/etc/postfix/main.cf文件来建立 Postfix:在 Postfix SMTP 服务器上启用 SMTP 身份验证:
smtpd_sasl_auth_enable = yes
smtpd_sasl_auth_enable = yesCopy to Clipboard Copied! Toggle word wrap Toggle overflow 为 SMTP 身份验证启用 Dovecot SASL 实现:
smtpd_sasl_type = dovecot
smtpd_sasl_type = dovecotCopy to Clipboard Copied! Toggle word wrap Toggle overflow 提供相对于 Postfix 队列目录的身份验证路径。请注意,使用相对路径可确保无论 Postfix 服务器是否以
chroot运行,配置都可以正常工作:smtpd_sasl_path = private/auth
smtpd_sasl_path = private/authCopy to Clipboard Copied! Toggle word wrap Toggle overflow 此步骤使用 UNIX-域套接字在 Postfix 和 Dovecot 之间进行通信。
如果您使用 TCP 套接字进行通信,要将 Postfix 配置为在不同机器上查找 Dovecot,请使用类似如下的配置值:
smtpd_sasl_path = inet: <IP_address> : <port_number>
smtpd_sasl_path = inet: <IP_address> : <port_number>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在上例中,将 ip-address 替换为 Dovecot 机器的 IP 地址,将 port-number 替换为 Dovecot 的
/etc/dovecot/conf.d/10-master.conf文件中指定的端口号。指定 Postfix SMTP 服务器为客户端提供的 SASL 机制。请注意,您可以为加密和未加密的会话指定不同的机制。
smtpd_sasl_security_options = noanonymous, noplaintext smtpd_sasl_tls_security_options = noanonymous
smtpd_sasl_security_options = noanonymous, noplaintext smtpd_sasl_tls_security_options = noanonymousCopy to Clipboard Copied! Toggle word wrap Toggle overflow 以上指令指定在未加密的会话期间,不允许匿名身份验证,且不会允许传输未加密的用户名或密码的机制。对于使用 TLS 的加密会话,只允许非匿名身份验证机制。
第 9 章 配置和维护 Dovecot IMAP 和 POP3 服务器 复制链接链接已复制到粘贴板!
Dovecot 是一个高性能邮件发送代理(MDA),专注于安全性。您可以使用 IMAP 或 POP3 兼容电子邮件客户端连接到 Dovecot 服务器并读取或下载电子邮件。
Dovecot 的主要特性:
- 设计和实施侧重于安全性
- 用于高可用性的双向复制支持以提高大型环境中的性能
-
支持 high-performance
dbox邮箱格式,但出于兼容性的原因,也支持mbox和Maildir - 自我修复功能,如修复有问题的索引文件
- 遵守 IMAP 标准
- 临时解决方案支持绕过 IMAP 和 POP3 客户端中的错误
9.1. 使用 PAM 设置 Dovecot 服务器,使用 PAM 身份验证身份验证设置 Dovecot 服务器 复制链接链接已复制到粘贴板!
Dovecot 支持名称服务交换机(NSS)接口作为用户数据库,以及可插拔验证模块(PAM)框架作为身份验证后端。使用这个配置,Dovecot 可以为服务器上本地通过 NSS 提供的用户提供服务。
如果帐户,请使用 PAM 身份验证:
-
在
/etc/passwd文件中本地定义 - 存储在远程数据库中,但可以通过系统安全服务守护进程(SSSD)或其他 NSS 插件进行本地使用。
9.1.1. 安装 Dovecot 复制链接链接已复制到粘贴板!
dovecot 软件包提供:
-
dovecot服务以及维护它的工具 - Dovecot 按需启动的服务,如用于身份验证的服务
- 插件,如服务器端邮件过滤
-
/etc/dovecot/目录中的配置文件 -
/usr/share/doc/dovecot/目录中的文档
流程
安装
dovecot软件包:yum install dovecot
# yum install dovecotCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注意如果 Dovecot 已安装并且需要清理的配置文件,请重命名或删除
/etc/dovecot/目录。之后,重新安装软件包。在删除配置文件的情况下,yum reinstall dovecot命令不会重置/etc/dovecot/中的配置文件。
9.1.2. 在 Dovecot 服务器上配置 TLS 加密 复制链接链接已复制到粘贴板!
Dovecot 提供一个安全的默认配置。例如,默认启用 TLS 通过网络来传输加密的凭证和数据。要在 Dovecot 服务器上配置 TLS,您只需设置证书和私钥文件的路径。另外,您可以通过生成并使用 Diffie-Hellman 参数来提供 perfect forward secrecy(PFS)来提高 TLS 连接的安全性。
先决条件
- 已安装了 Dovecot。
以下文件已复制到服务器中列出的位置:
-
服务器证书:
/etc/pki/dovecot/certs/server.example.com.crt -
私钥:
/etc/pki/dovecot/private/server.example.com.key -
证书颁发机构(CA)证书:
/etc/pki/dovecot/certs/ca.crt
-
服务器证书:
-
服务器证书的
Subject DN字段中的主机名与服务器的完全限定域名(FQDN)匹配。
流程
对私钥文件设置安全权限:
chown root:root /etc/pki/dovecot/private/server.example.com.key chmod 600 /etc/pki/dovecot/private/server.example.com.key
# chown root:root /etc/pki/dovecot/private/server.example.com.key # chmod 600 /etc/pki/dovecot/private/server.example.com.keyCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用 Diffie-Hellman 参数生成文件:
openssl dhparam -out /etc/dovecot/dh.pem 4096
# openssl dhparam -out /etc/dovecot/dh.pem 4096Copy to Clipboard Copied! Toggle word wrap Toggle overflow 根据服务器上的硬件和熵,生成带有 4096 位的 Diffie-Hellman 参数可能需要几分钟。
在
/etc/dovecot/conf.d/10-ssl.conf文件中设置到证书和私钥文件的路径:更新
ssl_cert和ssl_key参数,并将其设置为使用服务器的证书和私钥的路径:ssl_cert = </etc/pki/dovecot/certs/server.example.com.crt ssl_key = </etc/pki/dovecot/private/server.example.com.key
ssl_cert = </etc/pki/dovecot/certs/server.example.com.crt ssl_key = </etc/pki/dovecot/private/server.example.com.keyCopy to Clipboard Copied! Toggle word wrap Toggle overflow 取消注释
ssl_ca参数,并将其设置为使用 CA 证书的路径:ssl_ca = </etc/pki/dovecot/certs/ca.crt
ssl_ca = </etc/pki/dovecot/certs/ca.crtCopy to Clipboard Copied! Toggle word wrap Toggle overflow 取消注释
ssl_dh参数,并将其设置为使用 Diffie-Hellman 参数文件的路径:ssl_dh = </etc/dovecot/dh.pem
ssl_dh = </etc/dovecot/dh.pemCopy to Clipboard Copied! Toggle word wrap Toggle overflow
重要为确保 Dovecot 从文件中读取参数的值,该路径必须以前导 <
字符开头。
9.1.3. 准备 Dovecot 以使用虚拟用户 复制链接链接已复制到粘贴板!
默认情况下,Dovecot 以使用服务的用户身份对文件系统执行许多操作。但是,将 Dovecot 后端配置为使用一个本地用户来执行这些操作有以下几项优点:
- Dovecot 以特定本地用户执行文件系统操作,而不使用用户的 ID (UID)。
- 用户不需要在服务器上本地可用。
- 您可以将所有邮箱和特定于用户的文件存储在一个根目录中。
- 用户不需要 UID 和组 ID (GID),这可以减少管理工作。
- 有权访问服务器上的文件系统的用户无法破坏其邮箱或索引,因为它们无法访问这些文件。
- 设置复制更为简单。
先决条件
- 已安装了 Dovecot。
流程
创建
vmail用户:useradd --home-dir /var/mail/ --shell /usr/sbin/nologin vmail
# useradd --home-dir /var/mail/ --shell /usr/sbin/nologin vmailCopy to Clipboard Copied! Toggle word wrap Toggle overflow Dovecot 之后将使用此用户来管理邮箱。出于安全考虑,请不要使用
dovecot或dovenull系统用户来实现这一目的。如果您使用与
/var/mail/不同的路径,请在其上设置mail_spool_tSELinux 上下文,例如:semanage fcontext -a -t mail_spool_t "<path>(/.*)?" restorecon -Rv <path>
# semanage fcontext -a -t mail_spool_t "<path>(/.*)?" # restorecon -Rv <path>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 仅将
/var/mail/的写入权限授予vmail用户:chown vmail:vmail /var/mail/ chmod 700 /var/mail/
# chown vmail:vmail /var/mail/ # chmod 700 /var/mail/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 取消注释
/etc/dovecot/conf.d/10-mail.conf文件中的mail_location参数,并将其设置为 mailbox 格式和位置:mail_location = sdbox:/var/mail/%n/
mail_location = sdbox:/var/mail/%n/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用这个设置:
-
Dovecot 在
single模式下使用高性能dbox邮箱格式。在此模式下,服务将每个邮件存储在单独的文件中,类似于maildir格式。 -
Dovecot 将路径中的
%n变量解析为用户名。这需要确保每个用户对其邮箱都有一个单独的目录。
-
Dovecot 在
9.1.4. 使用 PAM 作为 Dovecot 身份验证后端 复制链接链接已复制到粘贴板!
默认情况下,Dovecot 使用名称服务交换机(NSS)接口作为用户数据库,使用可插拔验证模块(PAM)框架作为身份验证后端。
自定义设置,以使 Dovecot 适应您的环境,并使用虚拟用户功能简化管理。
先决条件
- Dovecot 已安装。
- 虚拟用户功能已配置。
流程
更新
/etc/dovecot/conf.d/10-mail.conf文件中的first_valid_uid参数,以定义可以验证到 Dovecot 的最低用户 ID (UID):first_valid_uid = 1000
first_valid_uid = 1000Copy to Clipboard Copied! Toggle word wrap Toggle overflow 默认情况下,UID 大于或等于
1000的用户可以进行身份验证。如果需要,您也可以设置last_valid_uid参数,以定义 Dovecot 允许登录的最高 UID。在
/etc/dovecot/conf.d/auth-system.conf.ext文件中,将override_fields参数添加到userdb部分,如下所示:userdb { driver = passwd override_fields = uid=vmail gid=vmail home=/var/mail/%n/ }userdb { driver = passwd override_fields = uid=vmail gid=vmail home=/var/mail/%n/ }Copy to Clipboard Copied! Toggle word wrap Toggle overflow 由于值固定,Dovecot 不会从
/etc/passwd文件查询这些设置。因此,/etc/passwd中定义的主目录不需要存在。
9.1.5. 完成 Dovecot 配置 复制链接链接已复制到粘贴板!
安装和配置 Dovecot 后,在 firewalld 服务中打开所需的端口,然后启用并启动服务。之后,您可以测试服务器。
先决条件
在 Dovecot 中已配置了以下内容:
- TLS 加密
- 身份验证后端
- 客户端信任证书颁发机构(CA)证书。
流程
如果您只想向用户提供 IMAP 或 POP3 服务,请取消
/etc/dovecot/dovecot.conf文件中protocols参数的注释,并将其设置为所需的协议。例如,如果您不需要 POP3,请设置:protocols = imap lmtp
protocols = imap lmtpCopy to Clipboard Copied! Toggle word wrap Toggle overflow 默认情况下启用
imap、pop3和lmtp协议。在本地防火墙中打开端口。例如,要为 IMAPS、IMAP、POP3S 和 POP3 协议打开端口,请输入:
firewall-cmd --permanent --add-service=imaps --add-service=imap --add-service=pop3s --add-service=pop3 firewall-cmd --reload
# firewall-cmd --permanent --add-service=imaps --add-service=imap --add-service=pop3s --add-service=pop3 # firewall-cmd --reloadCopy to Clipboard Copied! Toggle word wrap Toggle overflow 启用并启动
dovecot服务:systemctl enable --now dovecot
# systemctl enable --now dovecotCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
使用 Mozilla Thunderbird 等邮件客户端连接到 Dovecot ,并读取电子邮件。邮件客户端的设置取决于您要使用的协议:
Expand 表 9.1. 到 Dovecot 服务器的连接设置 协议 端口 连接安全性 身份验证方法 IMAP
143
STARTTLS
PLAIN[a]
IMAPS
993
SSL/TLS
PLAIN[a]
POP3
110
STARTTLS
PLAIN[a]
POP3S
995
SSL/TLS
PLAIN[a]
[a] 客户端通过 TLS 连接传输加密的数据。因此,凭证不会被披露。请注意,这个表不会列出未加密连接的设置,因为默认情况下,Dovecot 在没有 TLS 的连接上不接受纯文本身份验证。
显示具有非默认值的配置设置:
doveconf -n
# doveconf -nCopy to Clipboard Copied! Toggle word wrap Toggle overflow
9.2. 设置具有 LDAP 身份验证的 Dovecot 服务器 复制链接链接已复制到粘贴板!
如果您的基础架构使用 LDAP 服务器来存储帐户,您可以对其验证 Dovecot 用户。在这种情况下,您可以在目录中集中管理帐户,用户不需要对 Dovecot 服务器上的文件系统进行本地访问。
如果您计划设置具有复制的多个 Dovecot 服务器,以使您的邮箱具有高可用性,则集中管理的帐户也是一个好处。
9.2.1. 安装 Dovecot 复制链接链接已复制到粘贴板!
dovecot 软件包提供:
-
dovecot服务以及维护它的工具 - Dovecot 按需启动的服务,如用于身份验证
- 插件,如服务器端的邮件过滤
-
/etc/dovecot/目录中的配置文件 -
/usr/share/doc/dovecot/目录中的文档
流程
安装
dovecot软件包:yum install dovecot
# yum install dovecotCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注意如果 Dovecot 已安装,并且需要清理配置文件,请重命名或删除
/etc/dovecot/目录。之后,重新安装软件包。无需删除配置文件,yum reinstall dovecot命令不会重置/etc/dovecot/中的配置文件。
9.2.2. 在 Dovecot 服务器上配置 TLS 加密 复制链接链接已复制到粘贴板!
Dovecot 提供一个安全的默认配置。例如,默认启用 TLS 通过网络来传输加密的凭证和数据。要在 Dovecot 服务器上配置 TLS,您只需设置证书和私钥文件的路径。另外,您可以通过生成并使用 Diffie-Hellman 参数来提供 perfect forward secrecy(PFS)来提高 TLS 连接的安全性。
先决条件
- Dovecot 已安装。
以下文件已复制到服务器上列出的位置:
-
服务器证书:
/etc/pki/dovecot/certs/server.example.com.crt -
私钥:
/etc/pki/dovecot/private/server.example.com.key -
证书颁发机构(CA)证书:
/etc/pki/dovecot/certs/ca.crt
-
服务器证书:
-
服务器证书
Subject DN字段中的主机名与服务器的完全限定域名(FQDN)匹配。
流程
对私钥文件设置安全权限:
chown root:root /etc/pki/dovecot/private/server.example.com.key chmod 600 /etc/pki/dovecot/private/server.example.com.key
# chown root:root /etc/pki/dovecot/private/server.example.com.key # chmod 600 /etc/pki/dovecot/private/server.example.com.keyCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用 Diffie-Hellman 参数生成文件:
openssl dhparam -out /etc/dovecot/dh.pem 4096
# openssl dhparam -out /etc/dovecot/dh.pem 4096Copy to Clipboard Copied! Toggle word wrap Toggle overflow 根据服务器上的硬件和熵,生成 4096 位的 Diffie-Hellman 参数可能需要几分钟。
在
/etc/dovecot/conf.d/10-ssl.conf文件中设置证书和私钥文件的路径:更新
ssl_cert和ssl_key参数,并将其设置为使用服务器的证书和私钥的路径:ssl_cert = </etc/pki/dovecot/certs/server.example.com.crt ssl_key = </etc/pki/dovecot/private/server.example.com.key
ssl_cert = </etc/pki/dovecot/certs/server.example.com.crt ssl_key = </etc/pki/dovecot/private/server.example.com.keyCopy to Clipboard Copied! Toggle word wrap Toggle overflow 取消
ssl_ca参数的注释,并将其设置为使用 CA 证书的路径:ssl_ca = </etc/pki/dovecot/certs/ca.crt
ssl_ca = </etc/pki/dovecot/certs/ca.crtCopy to Clipboard Copied! Toggle word wrap Toggle overflow 取消
ssl_dh参数的注释,并将其设置为使用 Diffie-Hellman 参数文件的路径:ssl_dh = </etc/dovecot/dh.pem
ssl_dh = </etc/dovecot/dh.pemCopy to Clipboard Copied! Toggle word wrap Toggle overflow
重要为确保 Dovecot 从文件中读取参数的值,该路径必须以
<字符开头。
9.2.3. 准备 Dovecot 以使用虚拟用户 复制链接链接已复制到粘贴板!
默认情况下,Dovecot 以使用服务的用户的身份对文件系统执行许多操作。但是,将 Dovecot 后端配置为使用一个本地用户来执行这些操作有以下几点好处:
- Dovecot 以特定的本地用户身份执行文件系统操作,而不使用用户的 ID (UID)。
- 用户不需要在服务器上本地提供。
- 您可以将所有邮箱和特定于用户的文件存储在一个根目录中。
- 用户不需要 UID 和组 ID (GID),这可以减少管理工作。
- 有权访问服务器上文件系统的用户无法破坏其邮箱或索引,因为它们无法访问这些文件。
- 设置复制很简单。
先决条件
- Dovecot 已安装。
流程
创建
vmail用户:useradd --home-dir /var/mail/ --shell /usr/sbin/nologin vmail
# useradd --home-dir /var/mail/ --shell /usr/sbin/nologin vmailCopy to Clipboard Copied! Toggle word wrap Toggle overflow Dovecot 之后将使用此用户来管理邮箱。出于安全考虑,请不要为此使用
dovecot或dovenull系统用户。如果您使用与
/var/mail/不同的路径,请对其设置mail_spool_tSELinux 上下文,例如:semanage fcontext -a -t mail_spool_t "<path>(/.*)?" restorecon -Rv <path>
# semanage fcontext -a -t mail_spool_t "<path>(/.*)?" # restorecon -Rv <path>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 仅将
/var/mail/的写权限授予vmail用户:chown vmail:vmail /var/mail/ chmod 700 /var/mail/
# chown vmail:vmail /var/mail/ # chmod 700 /var/mail/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 取消
/etc/dovecot/conf.d/10-mail.conf文件中mail_location参数的注释,并将其设置为 mailbox 格式和位置:mail_location = sdbox:/var/mail/%n/
mail_location = sdbox:/var/mail/%n/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用这个设置:
-
Dovecot 在
single模式下使用高性能dbox邮箱格式。在此模式下,服务将每个邮件存储在单独的文件中,类似于maildir格式。 -
Dovecot 将路径中的
%n变量解析为用户名。这需要确保每个用户对其邮箱都有一个单独的目录。
-
Dovecot 在
9.2.4. 使用 LDAP 作为 Dovecot 身份验证后端 复制链接链接已复制到粘贴板!
LDAP 目录中的用户通常可以向目录服务进行身份验证。Dovecot 可在用户登录到 IMAP 和 POP3 服务时使用此来验证它们。这个验证方法有很多优点,例如:
- 管理员可以在目录中集中管理用户。
- LDAP 帐户不需要任何特殊属性。它们只需要能够向 LDAP 服务器进行身份验证。因此,此方法独立于 LDAP 服务器上使用的密码存储方案。
- 用户不需要通过名称服务交换机(NSS)界面和可插拔验证模块(PAM)框架在服务器上本地提供。
先决条件
- Dovecot 已安装。
- 虚拟用户功能已配置。
- 到 LDAP 服务器的连接支持 TLS 加密。
- Dovecot 服务器上的 RHEL 信任 LDAP 服务器的证书颁发机构(CA)证书。
- 如果用户存储在 LDAP 目录中的不同树中,则存在用于 Dovecot 的专用 LDAP 帐户,以搜索目录。此帐户需要搜索其他用户的可辨识名称(DN)的权限。
流程
在
/etc/dovecot/conf.d/10-auth.conf文件中配置身份验证后端:注释掉您不需要的
auth-*.conf.ext身份验证后端配置文件的include语句,例如:#!include auth-system.conf.ext
#!include auth-system.conf.extCopy to Clipboard Copied! Toggle word wrap Toggle overflow 通过取消下列行的注释来启用 LDAP 身份验证:
!include auth-ldap.conf.ext
!include auth-ldap.conf.extCopy to Clipboard Copied! Toggle word wrap Toggle overflow
编辑
/etc/dovecot/conf.d/auth-ldap.conf.ext文件,并按如下所示将override_fields参数添加到userdb部分:userdb { driver = ldap args = /etc/dovecot/dovecot-ldap.conf.ext override_fields = uid=vmail gid=vmail home=/var/mail/%n/ }userdb { driver = ldap args = /etc/dovecot/dovecot-ldap.conf.ext override_fields = uid=vmail gid=vmail home=/var/mail/%n/ }Copy to Clipboard Copied! Toggle word wrap Toggle overflow 由于值固定,Dovecot 不会从 LDAP 服务器查询这些设置。因此,这些属性也不是必须出现。
使用以下设置创建
/etc/dovecot/dovecot-ldap.conf.ext文件:根据 LDAP 结构,配置以下之一:
如果用户存储在 LDAP 目录中的不同树中,请配置动态 DN 查找:
dn = cn=dovecot_LDAP,dc=example,dc=com dnpass = password pass_filter = (&(objectClass=posixAccount)(uid=%n))
dn = cn=dovecot_LDAP,dc=example,dc=com dnpass = password pass_filter = (&(objectClass=posixAccount)(uid=%n))Copy to Clipboard Copied! Toggle word wrap Toggle overflow Dovecot 使用指定的 DN、密码和过滤器在目录中搜索身份验证用户的 DN。在此搜索中,Dovecot 将过滤器中的
%n替换为用户名。请注意,LDAP 搜索必须只返回一个结果。如果所有用户都存储在特定条目下,请配置 DN 模板:
auth_bind_userdn = cn=%n,ou=People,dc=example,dc=com
auth_bind_userdn = cn=%n,ou=People,dc=example,dc=comCopy to Clipboard Copied! Toggle word wrap Toggle overflow
启用绑定到 LDAP 服务器的身份验证以验证 Dovecot 用户:
auth_bind = yes
auth_bind = yesCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将 URL 设置为 LDAP 服务器:
uris = ldaps://LDAP-srv.example.com
uris = ldaps://LDAP-srv.example.comCopy to Clipboard Copied! Toggle word wrap Toggle overflow 为安全起见,请只使用使用 LDAPS 的加密连接,或使用通过 LDAP 协议的
STARTTLS命令。对于后者,在设置中额外添加tls = yes。对于正常工作的证书验证,LDAP 服务器的主机名必须与其 TLS 证书中使用的主机名匹配。
启用 LDAP 服务器的 TLS 证书的验证:
tls_require_cert = hard
tls_require_cert = hardCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将基本 DN 设置为要开始搜索用户的 DN:
base = ou=People,dc=example,dc=com
base = ou=People,dc=example,dc=comCopy to Clipboard Copied! Toggle word wrap Toggle overflow 设置搜索范围:
scope = onelevel
scope = onelevelCopy to Clipboard Copied! Toggle word wrap Toggle overflow Dovecot 仅在指定的基本 DN 中使用
onelevel范围搜索,并且也使用子树中的subtree范围搜索。
对
/etc/dovecot/dovecot-ldap.conf.ext文件设置安全权限:chown root:root /etc/dovecot/dovecot-ldap.conf.ext chmod 600 /etc/dovecot/dovecot-ldap.conf.ext
# chown root:root /etc/dovecot/dovecot-ldap.conf.ext # chmod 600 /etc/dovecot/dovecot-ldap.conf.extCopy to Clipboard Copied! Toggle word wrap Toggle overflow
9.2.5. 完成 Dovecot 配置 复制链接链接已复制到粘贴板!
安装和配置 Dovecot 后,在 firewalld 服务中打开所需的端口,然后启用并启动服务。之后,您可以测试服务器。
先决条件
在 Dovecot 中已配置了以下内容:
- TLS 加密
- 身份验证后端
- 客户端信任证书颁发机构(CA)证书。
流程
如果您只想向用户提供 IMAP 或 POP3 服务,请取消
/etc/dovecot/dovecot.conf文件中protocols参数的注释,并将其设置为所需的协议。例如,如果您不需要 POP3,请设置:protocols = imap lmtp
protocols = imap lmtpCopy to Clipboard Copied! Toggle word wrap Toggle overflow 默认情况下启用
imap、pop3和lmtp协议。在本地防火墙中打开端口。例如,要为 IMAPS、IMAP、POP3S 和 POP3 协议打开端口,请输入:
firewall-cmd --permanent --add-service=imaps --add-service=imap --add-service=pop3s --add-service=pop3 firewall-cmd --reload
# firewall-cmd --permanent --add-service=imaps --add-service=imap --add-service=pop3s --add-service=pop3 # firewall-cmd --reloadCopy to Clipboard Copied! Toggle word wrap Toggle overflow 启用并启动
dovecot服务:systemctl enable --now dovecot
# systemctl enable --now dovecotCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
使用 Mozilla Thunderbird 等邮件客户端连接到 Dovecot ,并读取电子邮件。邮件客户端的设置取决于您要使用的协议:
Expand 表 9.2. 到 Dovecot 服务器的连接设置 协议 端口 连接安全性 身份验证方法 IMAP
143
STARTTLS
PLAIN[a]
IMAPS
993
SSL/TLS
PLAIN[a]
POP3
110
STARTTLS
PLAIN[a]
POP3S
995
SSL/TLS
PLAIN[a]
[a] 客户端通过 TLS 连接传输加密的数据。因此,凭证不会被披露。请注意,这个表不会列出未加密连接的设置,因为默认情况下,Dovecot 在没有 TLS 的连接上不接受纯文本身份验证。
显示具有非默认值的配置设置:
doveconf -n
# doveconf -nCopy to Clipboard Copied! Toggle word wrap Toggle overflow
9.3. 设置具有 MariaDB SQL 身份验证的 Dovecot 服务器 复制链接链接已复制到粘贴板!
如果您将用户和密码存储在 MariaDB SQL 服务器中,您可以将 Dovecot 配置为将其用作用户数据库和身份验证后端。使用这个配置,您可以在数据库中集中管理帐户,用户对 Dovecot 服务器上的文件系统没有本地访问权限。
如果您计划设置具有复制的多个 Dovecot 服务器,以使您的邮箱具有高可用性,则集中管理的帐户也是一个好处。
9.3.1. 安装 Dovecot 复制链接链接已复制到粘贴板!
dovecot 软件包提供:
-
dovecot服务以及维护它的工具 - Dovecot 按需启动的服务,如用于身份验证
- 插件,如服务器端的邮件过滤
-
/etc/dovecot/目录中的配置文件 -
/usr/share/doc/dovecot/目录中的文档
流程
安装
dovecot软件包:yum install dovecot
# yum install dovecotCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注意如果 Dovecot 已安装,并且需要清理配置文件,请重命名或删除
/etc/dovecot/目录。之后,重新安装软件包。无需删除配置文件,yum reinstall dovecot命令不会重置/etc/dovecot/中的配置文件。
9.3.2. 在 Dovecot 服务器上配置 TLS 加密 复制链接链接已复制到粘贴板!
Dovecot 提供一个安全的默认配置。例如,默认启用 TLS 通过网络来传输加密的凭证和数据。要在 Dovecot 服务器上配置 TLS,您只需设置证书和私钥文件的路径。另外,您可以通过生成并使用 Diffie-Hellman 参数来提供 perfect forward secrecy(PFS)来提高 TLS 连接的安全性。
先决条件
- Dovecot 已安装。
以下文件已复制到服务器上列出的位置:
-
服务器证书:
/etc/pki/dovecot/certs/server.example.com.crt -
私钥:
/etc/pki/dovecot/private/server.example.com.key -
证书颁发机构(CA)证书:
/etc/pki/dovecot/certs/ca.crt
-
服务器证书:
-
服务器证书
Subject DN字段中的主机名与服务器的完全限定域名(FQDN)匹配。
流程
对私钥文件设置安全权限:
chown root:root /etc/pki/dovecot/private/server.example.com.key chmod 600 /etc/pki/dovecot/private/server.example.com.key
# chown root:root /etc/pki/dovecot/private/server.example.com.key # chmod 600 /etc/pki/dovecot/private/server.example.com.keyCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用 Diffie-Hellman 参数生成文件:
openssl dhparam -out /etc/dovecot/dh.pem 4096
# openssl dhparam -out /etc/dovecot/dh.pem 4096Copy to Clipboard Copied! Toggle word wrap Toggle overflow 根据服务器上的硬件和熵,生成 4096 位的 Diffie-Hellman 参数可能需要几分钟。
在
/etc/dovecot/conf.d/10-ssl.conf文件中设置证书和私钥文件的路径:更新
ssl_cert和ssl_key参数,并将其设置为使用服务器的证书和私钥的路径:ssl_cert = </etc/pki/dovecot/certs/server.example.com.crt ssl_key = </etc/pki/dovecot/private/server.example.com.key
ssl_cert = </etc/pki/dovecot/certs/server.example.com.crt ssl_key = </etc/pki/dovecot/private/server.example.com.keyCopy to Clipboard Copied! Toggle word wrap Toggle overflow 取消
ssl_ca参数的注释,并将其设置为使用 CA 证书的路径:ssl_ca = </etc/pki/dovecot/certs/ca.crt
ssl_ca = </etc/pki/dovecot/certs/ca.crtCopy to Clipboard Copied! Toggle word wrap Toggle overflow 取消
ssl_dh参数的注释,并将其设置为使用 Diffie-Hellman 参数文件的路径:ssl_dh = </etc/dovecot/dh.pem
ssl_dh = </etc/dovecot/dh.pemCopy to Clipboard Copied! Toggle word wrap Toggle overflow
重要为确保 Dovecot 从文件中读取参数的值,该路径必须以
<字符开头。
9.3.3. 准备 Dovecot 以使用虚拟用户 复制链接链接已复制到粘贴板!
默认情况下,Dovecot 以使用服务的用户的身份对文件系统执行许多操作。但是,将 Dovecot 后端配置为使用一个本地用户来执行这些操作有以下几点好处:
- Dovecot 以特定的本地用户身份执行文件系统操作,而不使用用户的 ID (UID)。
- 用户不需要在服务器上本地提供。
- 您可以将所有邮箱和特定于用户的文件存储在一个根目录中。
- 用户不需要 UID 和组 ID (GID),这可以减少管理工作。
- 有权访问服务器上文件系统的用户无法破坏其邮箱或索引,因为它们无法访问这些文件。
- 设置复制很简单。
先决条件
- Dovecot 已安装。
流程
创建
vmail用户:useradd --home-dir /var/mail/ --shell /usr/sbin/nologin vmail
# useradd --home-dir /var/mail/ --shell /usr/sbin/nologin vmailCopy to Clipboard Copied! Toggle word wrap Toggle overflow Dovecot 之后将使用此用户来管理邮箱。出于安全考虑,请不要为此使用
dovecot或dovenull系统用户。如果您使用与
/var/mail/不同的路径,请对其设置mail_spool_tSELinux 上下文,例如:semanage fcontext -a -t mail_spool_t "<path>(/.*)?" restorecon -Rv <path>
# semanage fcontext -a -t mail_spool_t "<path>(/.*)?" # restorecon -Rv <path>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 仅将
/var/mail/的写权限授予vmail用户:chown vmail:vmail /var/mail/ chmod 700 /var/mail/
# chown vmail:vmail /var/mail/ # chmod 700 /var/mail/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 取消
/etc/dovecot/conf.d/10-mail.conf文件中mail_location参数的注释,并将其设置为 mailbox 格式和位置:mail_location = sdbox:/var/mail/%n/
mail_location = sdbox:/var/mail/%n/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用这个设置:
-
Dovecot 在
single模式下使用高性能dbox邮箱格式。在此模式下,服务将每个邮件存储在单独的文件中,类似于maildir格式。 -
Dovecot 将路径中的
%n变量解析为用户名。这需要确保每个用户对其邮箱都有一个单独的目录。
-
Dovecot 在
9.3.4. 使用 MariaDB SQL 数据库作为 Dovecot 身份验证后端 复制链接链接已复制到粘贴板!
Dovecot 可以从 MariaDB 数据库读取帐户和密码,并在用户登录到 IMAP 或 POP3 服务时使用它来验证用户。这个验证方法的好处包括:
- 管理员可以在数据库中集中管理用户。
- 用户在服务器上没有本地访问权限。
先决条件
- Dovecot 已安装。
- 虚拟用户功能已配置。
- 到 MariaDB 服务器的连接支持 TLS 加密。
-
MariaDB 中存在
dovecotDB数据库,users表至少包含username和password列。 -
password列包含使用 Dovecot 支持的方案加密的密码。 -
密码可以使用相同的方案,或者有
{pw-storage-scheme}前缀。 -
dovecotMariaDB 用户对dovecotDB数据库中的users表有读权限。 -
发布 MariaDB 服务器的 TLS 证书的证书颁发机构(CA)的证书存储在 Dovecot 服务器上的
/etc/pki/tls/certs/ca.crt文件中。
流程
安装
dovecot-mysql软件包:yum install dovecot-mysql
# yum install dovecot-mysqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在
/etc/dovecot/conf.d/10-auth.conf文件中配置身份验证后端:注释掉您不需要的
auth-*.conf.ext身份验证后端配置文件的include语句,例如:#!include auth-system.conf.ext
#!include auth-system.conf.extCopy to Clipboard Copied! Toggle word wrap Toggle overflow 通过取消以下行的注释来启用 SQL 身份验证:
!include auth-sql.conf.ext
!include auth-sql.conf.extCopy to Clipboard Copied! Toggle word wrap Toggle overflow
编辑
/etc/dovecot/conf.d/auth-sql.conf.ext文件,并将override_fields参数添加到userdb部分,如下所示:userdb { driver = sql args = /etc/dovecot/dovecot-sql.conf.ext override_fields = uid=vmail gid=vmail home=/var/mail/%n/ }userdb { driver = sql args = /etc/dovecot/dovecot-sql.conf.ext override_fields = uid=vmail gid=vmail home=/var/mail/%n/ }Copy to Clipboard Copied! Toggle word wrap Toggle overflow 由于值固定,Dovecot 不会从 SQL 服务器查询这些设置。
使用以下设置创建
/etc/dovecot/dovecot-sql.conf.ext文件:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要对数据库服务器使用 TLS 加密,请将
ssl_ca选项设置为发布 MariaDB 服务器证书的 CA 的证书路径。对于正常工作的证书验证,MariaDB 服务器的主机名必须与其 TLS 证书中使用的主机名匹配。如果数据库中的密码值包含
{pw-storage-scheme}前缀,则您可以省略default_pass_scheme设置。文件中的查询必须设置如下:
-
对于
user_query参数,查询必须返回 Dovecot 用户的用户名。查询还必须只返回一个结果。 -
对于
password_query参数,查询必须返回用户名和密码,并且 Dovecot 必须在user和password变量中使用这些值。因此,如果数据库使用不同的列名称,请使用ASSQL 命令重命名结果中的列。 -
对于
iterate_query参数,查询必须返回所有用户的列表。
-
对于
对
/etc/dovecot/dovecot-sql.conf.ext文件设置安全权限:chown root:root /etc/dovecot/dovecot-sql.conf.ext chmod 600 /etc/dovecot/dovecot-sql.conf.ext
# chown root:root /etc/dovecot/dovecot-sql.conf.ext # chmod 600 /etc/dovecot/dovecot-sql.conf.extCopy to Clipboard Copied! Toggle word wrap Toggle overflow
9.3.5. 完成 Dovecot 配置 复制链接链接已复制到粘贴板!
安装和配置 Dovecot 后,在 firewalld 服务中打开所需的端口,然后启用并启动服务。之后,您可以测试服务器。
先决条件
在 Dovecot 中已配置了以下内容:
- TLS 加密
- 身份验证后端
- 客户端信任证书颁发机构(CA)证书。
流程
如果您只想向用户提供 IMAP 或 POP3 服务,请取消
/etc/dovecot/dovecot.conf文件中protocols参数的注释,并将其设置为所需的协议。例如,如果您不需要 POP3,请设置:protocols = imap lmtp
protocols = imap lmtpCopy to Clipboard Copied! Toggle word wrap Toggle overflow 默认情况下启用
imap、pop3和lmtp协议。在本地防火墙中打开端口。例如,要为 IMAPS、IMAP、POP3S 和 POP3 协议打开端口,请输入:
firewall-cmd --permanent --add-service=imaps --add-service=imap --add-service=pop3s --add-service=pop3 firewall-cmd --reload
# firewall-cmd --permanent --add-service=imaps --add-service=imap --add-service=pop3s --add-service=pop3 # firewall-cmd --reloadCopy to Clipboard Copied! Toggle word wrap Toggle overflow 启用并启动
dovecot服务:systemctl enable --now dovecot
# systemctl enable --now dovecotCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
使用 Mozilla Thunderbird 等邮件客户端连接到 Dovecot ,并读取电子邮件。邮件客户端的设置取决于您要使用的协议:
Expand 表 9.3. 到 Dovecot 服务器的连接设置 协议 端口 连接安全性 身份验证方法 IMAP
143
STARTTLS
PLAIN[a]
IMAPS
993
SSL/TLS
PLAIN[a]
POP3
110
STARTTLS
PLAIN[a]
POP3S
995
SSL/TLS
PLAIN[a]
[a] 客户端通过 TLS 连接传输加密的数据。因此,凭证不会被披露。请注意,这个表不会列出未加密连接的设置,因为默认情况下,Dovecot 在没有 TLS 的连接上不接受纯文本身份验证。
显示具有非默认值的配置设置:
doveconf -n
# doveconf -nCopy to Clipboard Copied! Toggle word wrap Toggle overflow
9.4. 在两个 Dovecot 服务器之间配置复制 复制链接链接已复制到粘贴板!
通过双向复制,您可以使 Dovecot 服务器高度可用,而 IMAP 和 POP3 客户端都可以访问这两个服务器上的邮箱。Dovecot 会跟踪每个邮箱的索引日志中的更改,并以安全的方式解决冲突。
在两个复制合作伙伴上执行这个流程。
复制只在服务器对之间正常工作。因此,在大型集群中,您需要多个独立的后端对。
先决条件
- 两个服务器都使用相同的身份验证后端。最好使用 LDAP 或 SQL 来集中维护帐户。
-
Dovecot 用户数据库配置支持用户列表。使用
doveadm user '*'命令来验证这一点。 -
Dovecot 以
vmail用户身份而不是用户的 ID (UID)访问文件系统上的邮箱。
流程
创建
/etc/dovecot/conf.d/10-replication.conf文件,并在其中执行以下步骤:启用
notify和replication插件:mail_plugins = $mail_plugins notify replication
mail_plugins = $mail_plugins notify replicationCopy to Clipboard Copied! Toggle word wrap Toggle overflow 添加
service replicator部分:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用这些设置,当
dovecot服务启动时,Dovecot 会至少启动一个 replicator 进程。另外,本节定义了对replicator-doveadm套接字的设置。添加
service aggregator部分来配置replication-notify-fifo管道和replication-notify套接字:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 添加
service doveadm部分来定义复制服务的端口:service doveadm { inet_listener { port = 12345 } }service doveadm { inet_listener { port = 12345 } }Copy to Clipboard Copied! Toggle word wrap Toggle overflow 设置
doveadm复制服务的密码:doveadm_password = replication_password
doveadm_password = replication_passwordCopy to Clipboard Copied! Toggle word wrap Toggle overflow 两个服务器上的密码必须相同。
配置复制伙伴:
plugin { mail_replica = tcp:server2.example.com:12345 }plugin { mail_replica = tcp:server2.example.com:12345 }Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:定义并行
dsync进程的最大数量:replication_max_conns = 20
replication_max_conns = 20Copy to Clipboard Copied! Toggle word wrap Toggle overflow replication_max_conns的默认值为10。
对
/etc/dovecot/conf.d/10-replication.conf文件设置安全权限:chown root:root /etc/dovecot/conf.d/10-replication.conf chmod 600 /etc/dovecot/conf.d/10-replication.conf
# chown root:root /etc/dovecot/conf.d/10-replication.conf # chmod 600 /etc/dovecot/conf.d/10-replication.confCopy to Clipboard Copied! Toggle word wrap Toggle overflow 启用
nis_enabledSELinux 布尔值,以允许 Dovecot 打开doveadm复制端口:setsebool -P nis_enabled on
setsebool -P nis_enabled onCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将
firewalld规则配置为只允许复制伙伴访问复制端口,例如:firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="192.0.2.1/32" port protocol="tcp" port="12345" accept" firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv6" source address="2001:db8:2::1/128" port protocol="tcp" port="12345" accept" firewall-cmd --reload
# firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="192.0.2.1/32" port protocol="tcp" port="12345" accept" # firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv6" source address="2001:db8:2::1/128" port protocol="tcp" port="12345" accept" # firewall-cmd --reloadCopy to Clipboard Copied! Toggle word wrap Toggle overflow IPv4 的子网掩码
/32和 IPv6 子网掩码/128限制对指定地址的访问。- 在其他复制伙伴上也执行这个流程。
重新载入 Dovecot:
systemctl reload dovecot
# systemctl reload dovecotCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
- 在一个服务器上的邮箱中执行一个操作,然后验证 Dovecot 是否将更改复制到其他服务器上。
显示 replicator 状态:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 显示特定用户的 replicator 状态:
doveadm replicator status example_user
# doveadm replicator status example_user username priority fast sync full sync success sync failed example_user none 02:05:28 04:19:07 02:05:28 -Copy to Clipboard Copied! Toggle word wrap Toggle overflow
9.5. 向 IMAP 邮箱自动订阅用户 复制链接链接已复制到粘贴板!
通常,IMAP 服务器管理员希望 Dovecot 自动创建某些邮箱,如 Sent 和 Trash,并向它们订阅用户。您可以在配置文件中设置它。
另外,您可以定义 特殊用途邮箱。IMAP 客户端通常支持为特殊用途定义邮箱,如用于发送电子邮件。为避免用户必须手动选择和设置正确的邮箱,IMAP 服务器可以在 IMAP LIST 命令中发送 special-use 属性。然后,客户端可以使用此属性来识别和设置,例如:发送电子邮件的邮箱。
先决条件
- Dovecot 已配置。
流程
更新
/etc/dovecot/conf.d/15-mailboxes.conf文件中的inbox命名空间部分:将
auto = subscribe设置添加到应该可供用户使用的每个特殊用途邮箱中,例如:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您的邮件客户端支持更多特殊用途邮箱,您可以添加类似的条目。
special_use参数定义 Dovecot 在special-use属性中向客户端发送的值。可选:如果要定义没有特殊用途的其他邮箱,请在用户的 inbox 中为其添加
mailbox部分,例如:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 您可以将
auto参数设置为以下值之一:-
subscribe:自动创建邮箱并向其订阅用户。 -
create:自动创建邮箱,而无需向其订阅用户。 -
no(默认):Dovecot 不会创建邮箱,也不会向其订阅用户。
-
重新载入 Dovecot:
systemctl reload dovecot
# systemctl reload dovecotCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
使用 IMAP 客户端访问您的邮箱。
带有
auto = subscribe设置的邮箱会自动可见。如果客户端支持特殊用途的邮箱并定义了用途,客户端会自动使用它们。
9.6. 配置 LMTP 套接字和 LMTPS 侦听器 复制链接链接已复制到粘贴板!
SMTP 服务器(如 Postfix)使用本地邮件传输协议(LMTP)向 Dovecot 发送电子邮件。如果 SMTP 服务器运行:
- 在与 Dovecot 相同的主机上,使用 LMTP 套接字
在其他主机上,使用 LMTP 服务
默认情况下,LMTP 协议没有加密。但是,如果您配置了 TLS 加密,则 Dovecot 会自动对 LMTP 服务使用相同的设置。然后,SMTP 服务器可以使用 LMTPS 协议或 LMTP 上的
STARTTLS命令连接它。
先决条件
- Dovecot 已安装。
- 如果要配置 LMTP 服务,TLS 加密会在 Dovecot 中配置。
流程
验证 LMTP 协议是否已启用:
doveconf -a | grep -E "^protocols"
# doveconf -a | grep -E "^protocols" protocols = imap pop3 lmtpCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果输出包含
lmtp,则该协议已启用。如果
lmtp协议被禁用,请编辑/etc/dovecot/dovecot.conf文件,并将lmtp附加到protocols参数中的值:protocols = ... lmtp
protocols = ... lmtpCopy to Clipboard Copied! Toggle word wrap Toggle overflow 根据您是否需要 LMTP 套接字或服务,在
/etc/dovecot/conf.d/10-master.conf文件的service lmtp部分中进行以下更改:LMTP 套接字:默认情况下,Dovecot 会自动创建
/var/run/dovecot/lmtp套接字。可选:自定义所有权和权限:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow LMTP 服务:添加一个
inet_listener子部分:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
配置
firewalld规则,以只允许 SMTP 服务器访问 LMTP 端口,例如:firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="192.0.2.1/32" port protocol="tcp" port="24" accept" firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv6" source address="2001:db8:2::1/128" port protocol="tcp" port="24" accept" firewall-cmd --reload
# firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="192.0.2.1/32" port protocol="tcp" port="24" accept" # firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv6" source address="2001:db8:2::1/128" port protocol="tcp" port="24" accept" # firewall-cmd --reloadCopy to Clipboard Copied! Toggle word wrap Toggle overflow IPv4 的子网掩码
/32和 IPv6 子网掩码/128限制对指定地址的访问。重新载入 Dovecot:
systemctl reload dovecot
# systemctl reload dovecotCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
如果您配置了 LMTP 套接字,请验证 Dovecot 是否已创建套接字,以及权限是否正确:
ls -l /var/run/dovecot/lmtp
# ls -l /var/run/dovecot/lmtp srw-------. 1 postfix postfix 0 Nov 22 17:17 /var/run/dovecot/lmtpCopy to Clipboard Copied! Toggle word wrap Toggle overflow 配置 SMTP 服务器,以使用 LMTP 套接字或服务向 Dovecot 提交电子邮件。
使用 LMTP 服务时,请确保 SMTP 服务器使用 LMTPS 协议或发送
STARTTLS命令以使用加密连接。
9.7. 在 Dovecot 中禁用 IMAP 或 POP3 服务 复制链接链接已复制到粘贴板!
默认情况下,Dovecot 提供 IMAP 和 POP3 服务。如果您只需要其中之一,您可以禁用另一个以减少攻击面。
先决条件
- Dovecot 已安装。
流程
取消
/etc/dovecot/dovecot.conf文件中protocols参数的注释,并将它设置为使用所需的协议。例如,如果您不需要 POP3,请设置:protocols = imap lmtp
protocols = imap lmtpCopy to Clipboard Copied! Toggle word wrap Toggle overflow 默认情况下启用
imap、pop3和lmtp协议。重新载入 Dovecot:
systemctl reload dovecot
# systemctl reload dovecotCopy to Clipboard Copied! Toggle word wrap Toggle overflow 关闭本地防火墙中不再需要的端口。例如,要关闭 POP3S 和 POP3 协议的端口,请输入:
firewall-cmd --remove-service=pop3s --remove-service=pop3 firewall-cmd --reload
# firewall-cmd --remove-service=pop3s --remove-service=pop3 # firewall-cmd --reloadCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
显示
LISTEN模式下dovecot进程打开的所有端口:ss -tulp | grep dovecot
# ss -tulp | grep dovecot tcp LISTEN 0 100 0.0.0.0:993 0.0.0.0:* users:(("dovecot",pid=1405,fd=44)) tcp LISTEN 0 100 0.0.0.0:143 0.0.0.0:* users:(("dovecot",pid=1405,fd=42)) tcp LISTEN 0 100 [::]:993 [::]:* users:(("dovecot",pid=1405,fd=45)) tcp LISTEN 0 100 [::]:143 [::]:* users:(("dovecot",pid=1405,fd=43))Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在本例中,Dovecot 仅侦听 TCP 端口
993(IMAPS)和143(IMAP)。请注意,如果您将服务配置为侦听端口而不使用套接字,则 Dovecot 仅为 LMTP 协议打开端口。
9.8. 在 Dovecot IMAP 服务器上使用 Sieve 启用服务器端电子邮件过滤 复制链接链接已复制到粘贴板!
您可以使用 ManageSieve 协议将 Sieve 脚本上传到服务器。Sieve 脚本定义服务器应对传入的电子邮件验证的规则和执行的操作。例如,用户可以使用 Sieve 转发特定发件人的电子邮件,管理员可以创建一个全局过滤器,将垃圾邮件过滤器标记的邮件移到单独的 IMAP 文件夹中。
ManageSieve 插件为 Dovecot IMAP 服务器添加了对 Sieve 脚本和 ManageSieve 协议的支持。
仅使用支持通过 TLS 连接的 ManageSieve 协议的客户端。禁用此协议的 TLS 会导致客户端通过网络以纯文本形式发送凭证。
先决条件
- Dovecot 已配置,并提供 IMAP 邮箱。
- TLS 加密在 Dovecot 中已配置。
- 邮件客户端支持通过 TLS 连接的 ManageSieve 协议。
流程
安装
dovecot-pigeonhole软件包:yum install dovecot-pigeonhole
# yum install dovecot-pigeonholeCopy to Clipboard Copied! Toggle word wrap Toggle overflow 取消
/etc/dovecot/conf.d/20-managesieve.conf中以下行的注释,以启用sieve协议:protocols = $protocols sieve
protocols = $protocols sieveCopy to Clipboard Copied! Toggle word wrap Toggle overflow 除了已经启用的其他协议外,此设置还激活 Sieve。
在
firewalld中打开 ManageSieve 端口:firewall-cmd --permanent --add-service=managesieve firewall-cmd --reload
# firewall-cmd --permanent --add-service=managesieve # firewall-cmd --reloadCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重新载入 Dovecot:
systemctl reload dovecot
# systemctl reload dovecotCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
使用客户端并上传 Sieve 脚本。使用以下连接设置:
- 端口:4190
- 连接安全:SSL/TLS
- 身份验证方法: PLAIN
- 向已上传 Sieve 脚本的用户发送电子邮件。如果电子邮件与脚本中的规则匹配,请验证服务器是否执行了定义的操作。
9.9. Dovecot 如何处理配置文件 复制链接链接已复制到粘贴板!
dovecot 软件包提供主配置文件 /etc/dovecot/dovecot.conf 和 /etc/dovecot/conf.d/ 目录中的多个配置文件。Dovecot 会在您启动服务时组合文件来构建配置。
多个配置文件的主要优点是对设置进行分组并提高可读性。如果希望使用单个配置文件,您可以在 /etc/dovecot/dovecot.conf 中维护所有设置,并从该文件中删除所有 include 和include_try 语句。
第 10 章 配置打印 复制链接链接已复制到粘贴板!
通用 UNIX 打印系统(CUPS)管理 Red Hat Enterprise Linux 上的打印。用户在其主机上的 CUPS 中配置打印机,以便打印。另外,您可以在 CUPS 中共享打印机以使用主机作为打印服务器。
CUPS 支持打印到:
- AirPrint™ 和 IPP Everywhere™ 打印机
- 带有旧的基于 PostScript 打印机描述(PPD)驱动程序的网络和本地 USB 打印机
10.1. 安装和配置 CUPS 复制链接链接已复制到粘贴板!
您可以使用 CUPS 从本地主机打印。您还可以使用此主机在网络中共享打印机,并充当打印服务器。
流程
安装
cups软件包:yum install cups
# yum install cupsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您将 CUPS 配置为打印服务器,请编辑
/etc/cups/cupsd.conf文件,并进行以下更改:如果要远程配置 CUPS 或将这个主机用作打印服务器,请配置服务侦听哪个 IP 地址和端口:
Listen 192.0.2.1:631 Listen [2001:db8:1::1]:631
Listen 192.0.2.1:631 Listen [2001:db8:1::1]:631Copy to Clipboard Copied! Toggle word wrap Toggle overflow 默认情况下,CUPS 仅侦听
localhost接口(127.0.0.1和::1)。在方括号中指定 IPv6 地址。重要不要将 CUPS 配置为侦听允许从不可信网络(如互联网)访问的接口。
通过在
<Location />指令中允许相应的 IP 范围来配置哪些 IP 范围可以访问服务:<Location /> Allow from 192.0.2.0/24 Allow from [2001:db8:1::1]/32 Order allow,deny </Location>
<Location /> Allow from 192.0.2.0/24 Allow from [2001:db8:1::1]/32 Order allow,deny </Location>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在
<Location /admin>指令中,配置哪些 IP 地址和范围可以访问 CUPS 管理服务:<Location /admin> Allow from 192.0.2.15/32 Allow from [2001:db8:1::22]/128 Order allow,deny </Location>
<Location /admin> Allow from 192.0.2.15/32 Allow from [2001:db8:1::22]/128 Order allow,deny </Location>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用这些设置时,只有 IP 地址为
192.0.2.15和2001:db8:1::22的主机才能访问管理服务。可选:配置允许访问 web 界面中的配置和日志文件的 IP 地址和范围:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
如果您运行
firewalld服务,并希望配置对 CUPS 的远程访问,请在firewalld中打开 CUPS 端口:firewall-cmd --permanent --add-port=631/tcp firewall-cmd --reload
# firewall-cmd --permanent --add-port=631/tcp # firewall-cmd --reloadCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您在有多个接口的主机上运行 CUPS,请考虑限制对所需网络的访问。
启用并启动
cups服务:systemctl enable --now cups
# systemctl enable --now cupsCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
使用浏览器,并访问
http://<hostname>:631。如果您可以连接到 Web 界面,则 CUPS 工作正常。请注意,某些功能(如
Administration选项卡)需要身份验证和 HTTPS 连接。默认情况下,CUPS 使用自签名证书进行 HTTPS 访问,因此当您验证时连接是不安全的。
10.2. 在 CUPS 服务器上配置 TLS 加密 复制链接链接已复制到粘贴板!
CUPS 支持 TLS 加密的连接,默认情况下,服务为所有需要身份验证的请求强制实施加密连接。如果没有配置证书,CUPS 会创建一个私钥和一个自签名证书。如果只从本地主机访问 CUPS ,这就足够了。对于通过网络的安全连接,请使用由证书颁发机构(CA)签名的服务器证书。
如果没有加密或自签名证书,则中间人(MITM)攻击可以泄露,例如:
- 当使用 Web 界面配置 CUPS 时管理员的凭证
- 当通过网络发送打印作业时的机密数据
先决条件
流程
编辑
/etc/cups/cups-files.conf文件,并添加以下设置来禁用自动创建自签名证书:CreateSelfSignedCerts no
CreateSelfSignedCerts noCopy to Clipboard Copied! Toggle word wrap Toggle overflow 删除自签名证书和私钥:
rm /etc/cups/ssl/<hostname>.crt /etc/cups/ssl/<hostname>.key
# rm /etc/cups/ssl/<hostname>.crt /etc/cups/ssl/<hostname>.keyCopy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:显示服务器的 FQDN:
hostname -f
# hostname -f server.example.comCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将私钥和服务器证书存储在
/etc/cups/ssl/目录中,例如:mv /root/server.key /etc/cups/ssl/server.example.com.key mv /root/server.crt /etc/cups/ssl/server.example.com.crt
# mv /root/server.key /etc/cups/ssl/server.example.com.key # mv /root/server.crt /etc/cups/ssl/server.example.com.crtCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重要CUPS 要求您将私钥命名为
<fqdn>.key,将服务器证书文件命名为<fqdn>.crt。如果使用别名,则必须将文件命名为<alias>.key和<alias>.crt。对私钥设置安全权限,以使只有
root用户可以读取此文件:chown root:root /etc/cups/ssl/server.example.com.key chmod 600 /etc/cups/ssl/server.example.com.key
# chown root:root /etc/cups/ssl/server.example.com.key # chmod 600 /etc/cups/ssl/server.example.com.keyCopy to Clipboard Copied! Toggle word wrap Toggle overflow 因为在客户端和服务器建立安全连接之前,证书是它们之间通信的一部分,所以任何客户端都可以检索证书,而无需身份验证。因此,您不需要对服务器证书文件设置严格的权限。
恢复 SELinux 上下文:
restorecon -Rv /etc/cups/ssl/
# restorecon -Rv /etc/cups/ssl/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:显示证书的
CN和 SAN 字段:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果服务器证书中的
CN或 SAN 字段包含与服务器的 FQDN 不同的别名,请将ServerAlias参数添加到/etc/cups/cupsd.conf文件中:ServerAlias alternative_name.example.com
ServerAlias alternative_name.example.comCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在这种情况下,使用替代名称而不是流程剩余部分中的 FQDN。
默认情况下,CUPS 仅在任务需要身份验证时才强制实施加密的连接,例如在 web 界面中的
/admin页面中执行管理任务时。要为整个 CUPS 服务器强制实施加密,请将
Encryption Required添加到/etc/cups/cupsd.conf文件中的所有<Location>指令中,例如:<Location /> ... Encryption Required </Location>
<Location /> ... Encryption Required </Location>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重启 CUPS:
systemctl restart cups
# systemctl restart cupsCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
-
使用浏览器并访问
https://<hostname>:631/admin/。这要求您的浏览器信任 CA 证书。如果连接成功,则您正确地在 CUPS 中配置了 TLS 加密。 -
如果您为整个服务器所需的该加密,请访问
http://<hostname>:631/。本例中,CUPS 返回一个Upgrade Required错误。
故障排除
显示
cups服务的systemd日志条目:journalctl -u cups
# journalctl -u cupsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在使用 HTTPS 协议无法连接到 Web 界面后,如果日志包含
Unable to encrypt connection: Error while reading file错误,请验证私钥和服务器证书文件的名称。
10.3. 在 web 界面中授予管理权限,以管理 CUPS 服务器 复制链接链接已复制到粘贴板!
默认情况下,sys、root 和 wheel 组的成员可以在 web 界面中执行管理任务。但是,某些其他服务也使用这些组。例如,在默认情况下,wheel 组的成员可以使用 sudo 来执行具有 root 权限的命令。为了避免 CUPS 管理员在其他服务中获得意外权限,请为 CUPS 管理员使用专用组。
先决条件
- CUPS 已配置。
- 您要使用的客户端的 IP 地址具有访问 Web 界面中管理区域的权限。
流程
为 CUPS 管理员创建一个组:
groupadd cups-admins
# groupadd cups-adminsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将应在 web 界面中管理服务的用户添加到
cups-admins组中:usermod -a -G cups-admins <username>
# usermod -a -G cups-admins <username>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 更新
/etc/cups/cups-files.conf文件中SystemGroup参数的值,并附加cups-admin组:SystemGroup sys root wheel cups-admins
SystemGroup sys root wheel cups-adminsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果只有
cups-admin组应该具有管理访问权限,请从参数中删除其他组名称。重启 CUPS:
systemctl restart cups
# systemctl restart cupsCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
使用浏览器并访问
https://<hostname_or_ip_address>:631/admin/。注意只有在使用 HTTPS 协议时,才能访问 Web UI 中的管理区域。
-
开始执行一个管理任务。例如,单击
Add printer。 Web 界面会提示输入用户名和密码。要继续操作,请使用其是
cups-admins组成员的用户凭证进行身份验证。如果身份验证成功,此用户可以执行管理任务。
10.4. 带有打印机驱动程序的软件包的概述 复制链接链接已复制到粘贴板!
Red Hat Enterprise Linux (RHEL)为 CUPS 提供不同的带有打印机驱动程序的软件包。以下是这些软件包的的总体概述,以及它们包含哪些供应商的驱动程序:
| 软件包名称 | 打印机的驱动程序 |
|---|---|
|
| zebra, Dymo |
|
| Kodak |
|
| Brother, Canon, Epson, Gestetner, HP, Infotec, Kyocera, Lanier, Lexmark, NRG, Ricoh, Samsung, Savin, Sharp, Toshiba, Xerox 等 |
|
| Brother, Canon, Epson, Fujitsu, HP, Infotec, Kyocera, Lanier, NRG, Oki, Minolta, Ricoh, Samsung, Savin, Xerox 等 |
|
| HP |
|
| HP |
|
| Samsung、Xerox 等 |
请注意,一些软件包可能包含同一打印机厂商或打印机型号的驱动程序,但具有不同的功能。
安装所需的软件包后,您可以在 CUPS Web 界面中或使用 lpinfo -m 命令显示驱动程序的列表。
10.5. 确定打印机是否支持无驱动程序打印 复制链接链接已复制到粘贴板!
CUPS 支持无驱动程序打印,这意味着您可以在不为打印机型号提供任何特定于硬件的软件的情况下打印。因此,打印机必须告知客户端其功能,并使用以下标准之一:
- AirPrint™
- IPP Everywhere™
- Mopria®
- Wi-Fi Direct Print Services
您可以使用 ipptool 工具找出打印机是否支持无驱动程序打印。
先决条件
- 打印机或远程打印服务器支持 Internet 打印协议(IPP)。
- 主机可以连接到打印机或远程打印服务器的 IPP 端口。默认 IPP 端口为 631。
流程
查询
ipp-versions-supported和document-format-supported属性,并确保get-printer-attributes测试通过:对于远程打印机,请输入:
ipptool -tv ipp://<ip_address_or_hostname>:631/ipp/print get-printer-attributes.test | grep -E "ipp-versions-supported|document-format-supported|get-printer-attributes"
# ipptool -tv ipp://<ip_address_or_hostname>:631/ipp/print get-printer-attributes.test | grep -E "ipp-versions-supported|document-format-supported|get-printer-attributes" Get printer attributes using get-printer-attributes [PASS] ipp-versions-supported (1setOf keyword) = ... document-format-supported (1setOf mimeMediaType) = ...Copy to Clipboard Copied! Toggle word wrap Toggle overflow 对于远程打印服务器上的队列,请输入:
ipptool -tv ipp://<ip_address_or_hostname>:631/printers/<queue_name> get-printer-attributes.test | grep -E "ipp-versions-supported|document-format-supported|get-printer-attributes"
# ipptool -tv ipp://<ip_address_or_hostname>:631/printers/<queue_name> get-printer-attributes.test | grep -E "ipp-versions-supported|document-format-supported|get-printer-attributes" Get printer attributes using get-printer-attributes [PASS] ipp-versions-supported (1setOf keyword) = ... document-format-supported (1setOf mimeMediaType) = ...Copy to Clipboard Copied! Toggle word wrap Toggle overflow
要确保无驱动程序打印可以正常工作,请在输出中验证:
-
get-printer-attributes测试返回PASS。 - 打印机支持的 IPP 版本是 2.0 或更高版本。
格式列表包含以下内容之一:
-
application/pdf -
image/urf -
image/pwg-raster
-
-
对于彩色打印机,输出中包含上述格式之一,还包含
image/jpeg。
10.6. 使用 Web 界面向 CUPS 添加打印机 复制链接链接已复制到粘贴板!
在用户可以通过 CUPS 打印之前,您必须添加打印机。您可以使用网络打印机和直接附加到 CUPS 主机的打印机,例如通过 USB。
您可以使用 CUPS 无驱动程序功能或使用 PostScript 打印机描述(PPD)文件来添加打印机。
CUPS 更喜欢无驱动程序打印,使用驱动程序已被弃用。
Red Hat Enterprise Linux (RHEL)不提供名称服务切换多播 DNS 插件(nss-mdns),该插件通过查询 mDNS 响应程序来解析请求。因此,RHEL 不提供使用 mDNS 对本地无驱动程序打印机的自动发现和安装。要临时解决这个问题,请手动安装单个打印机,或使用 cups-browsed 自动安装在远程打印服务器上可用的大量打印队列。
先决条件
- CUPS 已配置。
- 您在 CUPS 中有管理打印机的权限。
- 如果您使用 CUPS 作为打印服务器,则将 您配置了 TLS 加密 来通过网络安全地传输数据。
- 如果要使用此功能,打印机支持无驱动程序打印。
流程
使用浏览器并访问
https://<hostname>:631/admin/。您必须使用 HTTPS 协议连接到 Web 界面。否则,CUPS 会因为安全原因在以后的步骤中阻止身份验证。
- 单击 。
- 如果您还没有验证,CUPS 会提示输入管理用户的凭证。输入授权用户的用户名和密码。
- 如果您决定不使用无驱动程序打印,并且您要添加的打印机可被自动检测到,请选择它,然后单击 。
如果没有检测到打印机:
选择打印机支持的协议。
如果您的打印机支持无驱动程序打印,且您想要使用此功能,请选择
ipp或ipps协议。- 点 。
输入到打印机或到远程打印服务器上队列的 URL。
- 点 。
输入名称,可选输入描述和位置。如果您使用 CUPS 作为打印服务器,而其他客户端应该能够通过这个打印机上的 CUPS 打印,请选择" Share this printer "。
- 在 Make 列表中选择打印机制造商。如果打印机制造商不在列表中,请选择 Generic 或上传一个打印机的 PPD 文件。
- 点 。
选择打印机型号:
- 如果打印机支持无驱动程序打印,请选择 IPP Everywhere。请注意,如果您之前在本地安装了特定于打印机的驱动程序,则列表可能还包含诸如 <printer_name> - IPP Everywhere 的条目。
- 如果打印机不支持无驱动程序打印,请选择型号或上传打印机的 PPD 文件。
- 点
Set printer options 页面上的设置和标签页取决于驱动程序以及打印机支持的功能。使用此页面设置默认选项,比如为纸张大小。
- 点 。
验证
- 打开 Web 界面中的 打印机 选项卡。
- 单击打印机的名称。
- 在 Maintenance 列表中,选择 Print test page。
故障排除
-
如果您使用无驱动程序打印,且打印不工作,请使用
lpadmin工具在命令行上添加打印机。详情请查看使用 使用 lpadmin 工具向 CUPS 添加打印机。
10.7. 使用 lpadmin 工具向 CUPS 中添加打印机 复制链接链接已复制到粘贴板!
在用户可以通过 CUPS 打印之前,您必须添加打印机。您可以使用网络打印机和直接附加到 CUPS 主机的打印机,例如通过 USB。
您可以使用 CUPS 无驱动程序功能或使用 PostScript 打印机描述(PPD)文件来添加打印机。
CUPS 更喜欢无驱动程序打印,使用驱动程序已被弃用。
Red Hat Enterprise Linux (RHEL)不提供名称服务切换多播 DNS 插件(nss-mdns),该插件通过查询 mDNS 响应程序来解析请求。因此,RHEL 不提供使用 mDNS 对本地无驱动程序打印机的自动发现和安装。要临时解决这个问题,请手动安装单个打印机,或使用 cups-browsed 自动安装在远程打印服务器上可用的大量打印队列。
先决条件
- CUPS 已配置。
- 如果要使用此功能,打印机支持无驱动程序打印。
- 打印机接受端口 631 (IPP)、9100 (套接字)或 515 (LPD)上的数据。端口取决于您用来连接到打印机的方法。
流程
在 CUPS 中添加打印机:
要添加带有无驱动程序支持的打印机,请输入:
lpadmin -p Demo-printer -E -v ipp://192.0.2.200/ipp/print -m everywhere
# lpadmin -p Demo-printer -E -v ipp://192.0.2.200/ipp/print -m everywhereCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果
-m anywhere选项不适用于您的打印机,请尝试-m driverless:<uri>,例如:-m driverless:ipp://192.0.2.200/ipp/print。要从带有无驱动程序支持的远程打印服务器添加一个队列,请输入:
lpadmin -p Demo-printer -E -v ipp://192.0.2.201/printers/example-queue -m everywhere
# lpadmin -p Demo-printer -E -v ipp://192.0.2.201/printers/example-queue -m everywhereCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果
-m anywhere选项不适用于您的打印机,请尝试-m driverless:<uri>,例如:-m driverless:ipp://192.0.2.200/printers/example-queue。要在文件中添加带有驱动程序的打印机,请输入:
lpadmin -p Demo-printer -E -v socket://192.0.2.200/ -P /root/example.ppd
# lpadmin -p Demo-printer -E -v socket://192.0.2.200/ -P /root/example.ppdCopy to Clipboard Copied! Toggle word wrap Toggle overflow 要从驱动程序在文件中的远程打印服务器添加一个队列,请输入:
lpadmin -p Demo-printer -E -v ipp://192.0.2.201/printers/example-queue -P /root/example.ppd
# lpadmin -p Demo-printer -E -v ipp://192.0.2.201/printers/example-queue -P /root/example.ppdCopy to Clipboard Copied! Toggle word wrap Toggle overflow 要添加驱动程序在本地驱动程序数据库中的打印机:
列出数据库中的驱动程序:
lpinfo -m
# lpinfo -m ... drv:///sample.drv/generpcl.ppd Generic PCL Laser Printer ...Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将带有 URI 的打印机添加到数据库中的驱动程序中:
lpadmin -p Demo-printer -E -v socket://192.0.2.200/ -m drv:///sample.drv/generpcl.ppd
# lpadmin -p Demo-printer -E -v socket://192.0.2.200/ -m drv:///sample.drv/generpcl.ppdCopy to Clipboard Copied! Toggle word wrap Toggle overflow
这些命令使用以下选项:
-
-p <printer_name>:设置 CUPS 中打印机的名称。 -
-E:启用打印机,CUPS 接受它的作业。请注意,您必须在-p之后指定这个选项。详情请查看手册页中的选项描述。 -
-v <uri>:设置到打印机或远程打印服务器队列的 URI。 -
-m <driver_uri>: 根据从本地驱动程序数据库获取的驱动程序 URI 设置 PPD 文件。 -
-P <PPD_file>:设置 PPD 文件的路径。
验证
显示可用的打印机:
lpstat -p
# lpstat -p printer Demo-printer is idle. enabled since Fri 23 Jun 2023 09:36:40 AM CESTCopy to Clipboard Copied! Toggle word wrap Toggle overflow 打印测试页:
lp -d Demo-printer /usr/share/cups/data/default-testpage.pdf
# lp -d Demo-printer /usr/share/cups/data/default-testpage.pdfCopy to Clipboard Copied! Toggle word wrap Toggle overflow
10.8. 使用 Web 界面在 CUPS 打印机上执行维护和管理任务 复制链接链接已复制到粘贴板!
打印机管理员有时需要在打印服务器上执行不同的任务。例如:
- 维护任务,如在技术人员修复打印机时临时暂停打印机
- 管理任务,如更改打印机的默认设置
您可以使用 CUPS Web 界面执行这些任务。
先决条件
- CUPS 已配置。
- 您在 CUPS 中有管理打印机的权限。
- 如果您使用 CUPS 作为打印服务器,您配置 TLS 加密 来不通过网络发送纯文本凭证。
- 打印机已在 CUPS 中存在。
流程
使用浏览器并访问
https://<hostname>:631/printers/。您必须使用 HTTPS 协议连接到 Web 界面。否则,CUPS 会因为安全原因在以后的步骤中阻止身份验证。
- 点击您要配置的打印机的名称。
- 根据您是否要执行维护或管理任务,从列表中选择所需的操作。
- 如果您还没有验证,CUPS 会提示输入管理用户的凭证。输入授权用户的用户名和密码。
- 执行任务。
10.9. 使用 Samba 打印到使用 Kerberos 验证的 Windows 打印服务器 复制链接链接已复制到粘贴板!
使用 samba-krb5-printing 包装器,登录到 Red Hat Enterprise Linux (RHEL)的活动目录(AD)用户可以使用 Kerberos 向活动目录(AD)进行身份验证,然后打印到将打印作业转发到 Windows 打印服务器的本地 CUPS 打印服务器。
此配置的好处在于,RHEL 上的 CUPS 管理员不需要在配置中存储固定的用户名和密码。CUPS 使用发送打印作业的用户的 Kerberos ticket 验证 AD。
红帽支持只支持从本地系统向 CUPS 提交打印作业,不支持在 Samba 打印服务器上重新共享打印机。
先决条件
- 要添加到本地 CUPS 实例中的打印机在 AD 打印服务器上是共享的。
- 您将 RHEL 主机作为成员加入到 AD 。
-
CUPS 安装在 RHEL 上,并且
cups服务正在运行。 -
打印机的 PostScript 打印机描述(PPD)文件存储在
/usr/share/cups/model/目录中。
流程
安装
samba-krb5-printing、samba-client和krb5-workstation软件包:yum install samba-krb5-printing samba-client krb5-workstation
# yum install samba-krb5-printing samba-client krb5-workstationCopy to Clipboard Copied! Toggle word wrap Toggle overflow 可选: 作为域管理员授权并显示 Windows 打印服务器上共享的打印机列表:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:显示 CUPS 模型列表以识别打印机的 PPD 名称:
lpinfo -m ... samsung.ppd Samsung M267x 287x Series PXL ...
lpinfo -m ... samsung.ppd Samsung M267x 287x Series PXL ...Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在下一步中添加打印机时,需要 PPD 文件的名称。
在 CUPS 中添加打印机:
lpadmin -p "example_printer" -v smb://win_print_srv.ad.example.com/Example -m samsung.ppd -o auth-info-required=negotiate -E
# lpadmin -p "example_printer" -v smb://win_print_srv.ad.example.com/Example -m samsung.ppd -o auth-info-required=negotiate -ECopy to Clipboard Copied! Toggle word wrap Toggle overflow 该命令使用以下选项:
-
-p printer_name在 CUPS 中设置打印机的名称。 -
-v URI_to_Windows_printer设置到 Windows 打印机的 URI 。使用以下格式:smb://host_name/printer_share_name. -
-m PPD_file设置打印机使用的 PPD 文件。 -
-o auth-info-required=negotiate将 CUPS 配置为在将打印作业转发到远程服务器时使用 Kerberos 身份验证。 -
-e启用打印机,CUPS 接受打印机的作业。
-
验证
- 以 AD 域用户身份登录到 RHEL 主机。
以 AD 域用户身份进行身份验证:
kinit domain_user_name@AD_KERBEROS_REALM
# kinit domain_user_name@AD_KERBEROS_REALMCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将文件输出到您添加到本地 CUPS 打印服务器的打印机:
lp -d example_printer file
# lp -d example_printer fileCopy to Clipboard Copied! Toggle word wrap Toggle overflow
10.10. 使用 cups-browsed 从远程打印服务器在本地集成打印机 复制链接链接已复制到粘贴板!
cups-browsed 服务使用 DNS 服务发现(DNS-SD)和 CUPS 浏览来使本地 CUPS 服务中自动提供的全部共享远程打印机或过滤的共享远程打印机的子集。
例如,管理员可以在工作站上使用此功能,以使只有来自可信打印服务器的打印机能在应用程序的打印对话框中可用。如果打印服务器共享大量打印机,也可以将 cups-browsed 配置为按某些标准过滤浏览的打印机,以减少列出的打印机的数量。
如果应用程序中的打印对话框使用其它机制(如 DNS-SD)来列出远程打印机,则 cups-browsed 没有影响。cups-browsed 服务也不会阻止用户手动访问未列出的打印机。
先决条件
- CUPS 服务在本地主机上已配置。
存在一个远程 CUPS 打印服务器,且以下条件适用于这个服务器:
- 服务器侦听可从客户端访问的接口。
-
/etc/cups/cups.conf文件中服务器<Location />指令中的Allow from参数允许从客户端的 IP 地址访问。 - 服务器共享打印机。
- 防火墙规则允许从客户端访问服务器上的 CUPS 端口。
流程
编辑
/etc/cups/cups-browsed.conf文件,并进行以下更改:为您要轮询的每个远程 CUPS 服务器添加
BrowsePoll参数:BrowsePoll remote_cups_server.example.com BrowsePoll 192.0.2.100:1631
BrowsePoll remote_cups_server.example.com BrowsePoll 192.0.2.100:1631Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果远程 CUPS 服务器侦听与 631 不同的端口,请将
:<port>附加到主机名或 IP 地址。可选:配置过滤器来限制哪些打印机在本地 CUPS 服务中显示。例如,要过滤名称包含
sales_的队列,请添加:BrowseFilter name sales_
BrowseFilter name sales_Copy to Clipboard Copied! Toggle word wrap Toggle overflow 您可以根据不同的字段名称、对筛选取反,匹配确切的值来过滤。详情请查看您系统上
cups-browsed.conf (5)手册页中的参数描述和示例。可选:更改轮询间隔和超时来限制浏览周期的数量:
BrowseInterval 1200 BrowseTimeout 6000
BrowseInterval 1200 BrowseTimeout 6000Copy to Clipboard Copied! Toggle word wrap Toggle overflow 按相同比例增加
BrowseInterval和BrowseTimeout,以避免打印机从浏览列表中消失的情况。这意味着,将BrowseInterval的值乘以 5 或更大的整数,并将这个结果值用于BrowseTimeout。默认情况下,
cups-browsed每 60 秒轮询一次远程服务器,超时为 300 秒。但是,在有许多队列的打印服务器上,这些默认值可能会消耗很多资源。
启用并启动
cups-browsed服务:systemctl enable --now cups-browsed
# systemctl enable --now cups-browsedCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
列出可用的打印机:
lpstat -v
# lpstat -v device for Demo-printer: implicitclass://Demo-printer/ ...Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果打印机的输出包含
implicitclass,则cups-browsed服务管理 CUPS 中的打印机。
10.11. 访问 systemd 日志中的 CUPS 日志 复制链接链接已复制到粘贴板!
默认情况下,CUPS 将日志消息存储在 systemd 日志中。这包括:
- 错误消息
- 访问日志条目
- 页面日志条目
先决条件
流程
显示日志条目:
要显示所有日志条目,请输入:
journalctl -u cups
# journalctl -u cupsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 要显示特定打印作业的日志条目,请输入:
journalctl -u cups JID=<print_job_id>
# journalctl -u cups JID=<print_job_id>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要显示特定时间段内的日志条目,请输入:
journalectl -u cups --since=<YYYY-MM-DD> --until=<YYYY-MM-DD>
# journalectl -u cups --since=<YYYY-MM-DD> --until=<YYYY-MM-DD>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将
YYYY替换为年,将MM替换为月,将DD替换为天。
10.12. 将 CUPS 配置为把日志存储在文件中而不是 systemd 日志中 复制链接链接已复制到粘贴板!
默认情况下,CUPS 将日志消息存储在 systemd 日志中。或者,您可以将 CUPS 配置为将日志消息存储在文件中。
先决条件
流程
编辑
/etc/cups/cups-files.conf文件,并将AccessLog、ErrorLog和PageLog参数设置为您要存储这些日志文件的路径:AccessLog /var/log/cups/access_log ErrorLog /var/log/cups/error_log PageLog /var/log/cups/page_log
AccessLog /var/log/cups/access_log ErrorLog /var/log/cups/error_log PageLog /var/log/cups/page_logCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您将 CUPS 配置为将日志存储在
/var/log/cups/以外的目录中,请在该目录上设置cupsd_log_tSELinux 上下文,例如:semanage fcontext -a -t cupsd_log_t "/var/log/printing(/.*)?" restorecon -Rv /var/log/printing/
# semanage fcontext -a -t cupsd_log_t "/var/log/printing(/.*)?" # restorecon -Rv /var/log/printing/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重启
cups服务:systemctl restart cups
# systemctl restart cupsCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
显示日志文件:
cat /var/log/cups/access_log cat /var/log/cups/error_log cat /var/log/cups/page_log
# cat /var/log/cups/access_log # cat /var/log/cups/error_log # cat /var/log/cups/page_logCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您将 CUPS 配置为将日志存储在
/var/log/cups/以外的目录中,请验证日志目录上的 SELinux 上下文是否为cupsd_log_t:ls -ldZ /var/log/printing/
# ls -ldZ /var/log/printing/ drwxr-xr-x. 2 lp sys unconfined_u:object_r:cupsd_log_t:s0 6 Jun 20 15:55 /var/log/printing/Copy to Clipboard Copied! Toggle word wrap Toggle overflow
10.13. 设置高可用性 CUPS 打印服务器环境 复制链接链接已复制到粘贴板!
如果您的客户端需要在不中断的情况下访问打印机,您可以在多个主机上设置 CUPS,并使用打印队列浏览功能来提供高可用性。然后,打印客户端自动配置由不同打印服务器共享的打印队列。如果客户端将打印作业发送到其本地打印队列,则客户端上的 CUPS 会将作业路由到处理作业并将其发送到打印机的一个打印服务器。
流程
在两个或多个服务器上设置 CUPS:
- 安装和配置 CUPS。
- 启用 TLS 加密。
使用 lpadmin 工具 或 Web 接口 将打印队列添加到所有 CUPS 实例中。如果使用 Web 界面,请确保在添加打印机时选择 Share this printer 选项。
lpadmin工具默认启用此设置。重要对于高可用性场景,一个打印服务器上的每个队列都需要一个在其他服务器上具有完全相同的队列名称的队列。您可以使用
lpstat -e命令显示每个服务器上的队列名称。可选:您可以在每台服务器上配置队列,来引用不同的打印机。
在打印客户端上:
编辑
/etc/cups/cups-browsed.conf文件,并为每个 CUPS 打印服务器添加BrowsePoll指令:BrowsePoll print_server_1.example.com:631 BrowsePoll print_server_2.example.com:631
BrowsePoll print_server_1.example.com:631 BrowsePoll print_server_2.example.com:631Copy to Clipboard Copied! Toggle word wrap Toggle overflow 启用并启动
cups和cups-browsed服务:systemctl enable --now cups cups-browsed
# systemctl enable --now cups cups-browsedCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
显示客户端上可用的打印机:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 示例输出显示 Demo-printer 队列使用
implicitclass后端。因此,cups-browsed将此队列的打印作业路由到此客户端上BrowsePoll指令中指定的主机。
10.14. 访问 CUPS 文档 复制链接链接已复制到粘贴板!
CUPS 提供对安装在 CUPS 服务器上的服务文档的基于浏览器的访问。本文档包括:
- 管理文档,如用于命令行打印机管理和记帐
- 手册页
- 编程文档,如管理 API
- 参考
- Specifications
先决条件
- CUPS 已安装并运行。
- 您要使用的客户端的 IP 地址有访问 Web 界面的权限。
流程
-
使用浏览器,并访问
http://<hostname_or_ip_address>:631/help/。 -
展开
Online Help Documents中的条目,然后选择您要阅读的文档。