搜索

部署不同类型的服务器

download PDF
Red Hat Enterprise Linux 8

设置和配置 Web 服务器及反向代理、网络文件服务、数据库服务器、邮件传输代理和打印机

Red Hat Customer Content Services

摘要

在 Red Hat Enterprise Linux 8 中配置并运行 Apache HTTP web 服务器或 NGINX web 服务器。配置和使用网络文件服务,如 Samba 或 NFS。安装 MariaDB、MySQL 或 PostgreSQL 数据库服务器,配置它,备份和迁移您的数据。部署和配置 Postfix 邮件传输代理。使用 CUPS 服务器配置打印。

对红帽文档提供反馈

我们感谢您对我们文档的反馈。让我们了解如何改进它。

通过 Jira 提交反馈(需要帐户)

  1. 登录到 Jira 网站。
  2. 单击顶部导航栏中的 Create
  3. Summary 字段中输入描述性标题。
  4. Description 字段中输入您对改进的建议。包括文档相关部分的链接。
  5. 点对话框底部的 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.service man page。
  • 新的 httpd-init.service 替换 %post 脚本 来创建自签名的 mod_ssl 密钥对。
  • mod_md 软件包现在支持使用自动证书管理环境(ACME)协议进行自动 TLS 证书置备和续订(用于 Let 的加密等证书提供商)。
  • Apache HTTP 服务器 现在支持直接从 PKCS#11 模块的硬件安全令牌加载 TLS 证书和私钥。现在,mod_ssl 配置可以使用 PKCS#11 URL 来标识 TLS 私钥,(可选)以及 SSLCertificateKeyFileSSLCertificateFile 指令中的 TLS 证书。
  • 现在,支持 /etc/httpd/conf/httpd.conf 文件中的 ListenFree 指令。

    Listen 指令类似,listenFree 也提供有关服务器侦听的 IP 地址、端口或 IP 地址和端口组合的信息。但是,使用 ListenFree 时,默认启用 IP_FREEBIND 套接字选项。因此,允许 httpd 绑定到非本地 IP 地址或尚不存在的 IP 地址。这允许 httpd 侦听套接字,无需在 httpd 尝试绑定到底层网络接口或指定的动态 IP 地址处于在线状态。

    请注意,ListenFree 指令目前仅在 RHEL 8 中可用。

    有关 ListenFree 的详情,请查看下表:

    表 1.1. ListenFree 指令的语法、状态和模块
    语法状态模块

    ListenFree [IP-address:]portnumber [protocol]

    MPM

    event、worker、prefork、mpm_winnt、mpm_netware、mpmt_os2

其他显著变化包括:

  • 删除了以下模块:

  • 在 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
Syntax OK

1.4. Apache 配置文件

默认情况下,httpd 在启动后读取配置文件。您可以在下表中查看配置文件的位置列表。

表 1.2. httpd 服务配置文件
路径描述

/etc/httpd/conf/httpd.conf

主配置文件。

/etc/httpd/conf.d/

主配置文件中包含的配置文件的辅助目录。

/etc/httpd/conf.modules.d/

用于载入 Red Hat Enterprise Linux 中打包动态模块的配置文件的辅助目录。在默认配置中,首先会处理这些配置文件。

虽然默认配置适用于大多数情况,但您也可以使用其他配置选项。要让任何更改生效,请首先重启 web 服务器。

要检查配置中的可能错误,在 shell 提示符后输入以下内容:

# apachectl configtest
Syntax OK

要更方便地从错误中恢复,请在编辑前复制原始文件。

1.5. 管理 httpd 服务

本节描述了如何启动、停止和重新启动 httpd 服务。

先决条件

  • 已安装 Apache HTTP 服务器。

流程

  • 要启动 httpd 服务,请输入:

    # systemctl start httpd
  • 要停止 httpd 服务,请输入:

    # systemctl stop httpd
  • 要重启 httpd 服务,请输入:

    # systemctl restart httpd

1.6. 设置单实例 Apache HTTP 服务器

您可以设置单实例 Apache HTTP 服务器来提供静态 HTML 内容。

如果 Web 服务器应该为与服务器关联的所有域提供相同的内容,请按照以下流程操作。如果要为不同的域提供不同的内容,请设置基于名称的虚拟主机。详情请参阅 配置 Apache 基于名称的虚拟主机

流程

  1. 安装 httpd 软件包:

    # yum install httpd
  2. 如果使用 firewalld,请在本地防火墙中打开 TCP 端口 80

    # firewall-cmd --permanent --add-port=80/tcp
    # firewall-cmd --reload
  3. 启用并启动 httpd 服务:

    # systemctl enable --now httpd
  4. 可选:将 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.htmlindex.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.comexample.net 域建立虚拟主机。两个虚拟主机都提供静态 HTML 内容。

先决条件

  • 客户端和 Web 服务器将 example.comexample.net 域解析为 Web 服务器的 IP 地址。

    请注意,您必须手动将这些条目添加到 DNS 服务器中。

流程

  1. 安装 httpd 软件包:

    # yum install httpd
  2. 编辑 /etc/httpd/conf/httpd.conf 文件:

    1. example.com 域添加以下虚拟主机配置:

      <VirtualHost *:80>
          DocumentRoot "/var/www/example.com/"
          ServerName example.com
          CustomLog /var/log/httpd/example.com_access.log combined
          ErrorLog /var/log/httpd/example.com_error.log
      </VirtualHost>

      这些设置配置以下内容:

      • <VirtualHost *:80> 指令中的所有设置都是针对这个虚拟主机的。
      • DocumentRoot 设置虚拟主机的 Web 内容的路径。
      • ServerName 设置此虚拟主机为其提供内容服务的域。

        要设置多个域,请在配置中添加 ServerAlias 参数,并在此参数中指定用空格分开的额外域。

      • CustomLog 设置虚拟主机的访问日志的路径。
      • ErrorLog 设置虚拟主机错误日志的路径。

        注意

        Apache 还将配置中找到的第一个虚拟主机用于与ServerNameServer Alias参数中设置的任何域不匹配的请求。这还包括发送到服务器 IP 地址的请求。

  3. example.net 域添加类似的虚拟主机配置:

    <VirtualHost *:80>
        DocumentRoot "/var/www/example.net/"
        ServerName example.net
        CustomLog /var/log/httpd/example.net_access.log combined
        ErrorLog /var/log/httpd/example.net_error.log
    </VirtualHost>
  4. 为两个虚拟主机创建文档根目录:

    # mkdir /var/www/example.com/
    # mkdir /var/www/example.net/
  5. 如果您在 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/

    这些命令在/srv/example.com//srv/ example.net/ 目录中设置 httpd_sys_content_t上下文。

    请注意,您必须安装 policycoreutils-python-utils 软件包才能运行restorecon 命令。

  6. 如果使用 firewalld,请在本地防火墙中打开端口 80

    # firewall-cmd --permanent --add-port=80/tcp
    # firewall-cmd --reload
  7. 启用并启动 httpd 服务:

    # systemctl enable --now httpd

验证

  1. 在每个虚拟主机的文档 root 中创建不同的示例文件:

    # echo "vHost example.com" > /var/www/example.com/index.html
    # echo "vHost example.net" > /var/www/example.net/index.html
  2. 使用浏览器并连接到 http://example.comWeb 服务器显示example.com虚拟主机中的示例文件。
  3. 使用浏览器并连接到 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 模块。

先决条件

  • httpdgssproxy 软件包已经安装。
  • Apache Web 服务器已设置,并且 httpd 服务在运行。

1.8.1. 在 IdM 环境中设置 GSS-Proxy

这个流程描述了如何设置 GSS-Proxy ,以便在 Apache HTTP Web 服务器中执行 Kerberos 身份验证。

流程

  1. 通过创建服务主体来启用对 HTTP/<SERVER_NAME>@realm 主体的keytab文件的访问:

    # ipa service-add HTTP/<SERVER_NAME>
  2. 检索存储在/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)

    此步骤将权限设置为 400,因此只有 root 用户有权访问 keytab 文件。apache 用户无法访问。

  3. 使用以下内容创建 /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
  4. 重启并启用 gssproxy 服务:

    # systemctl restart gssproxy.service
    # systemctl enable gssproxy.service

其它资源

  • 系统上的 gssproxy (8) 手册页
  • 系统上的 gssproxy-mech (8) 手册页
  • 您系统上的 gssproxy.conf (5) 手册页

1.8.2. 为 Apache HTTP Web 服务器共享的目录配置 Kerberos 身份验证

这个过程描述了如何为 /var/www/html/private/ 目录配置 Kerberos 身份验证。

先决条件

  • gssproxy 服务已配置并在运行。

流程

  1. 配置 mod_auth_gssapi模块来保护 /var/www/html/private/目录:

    <Location /var/www/html/private>
      AuthType GSSAPI
      AuthName "GSSAPI Login"
      Require valid-user
    </Location>
  2. 创建系统单元配置置入文件:

    # systemctl edit httpd.service
  3. 在系统置入文件中添加以下参数:

    [Service]
    Environment=GSS_USE_PROXY=1
  4. 重新载入systemd配置:

    # systemctl daemon-reload
  5. 重启httpd服务:

    # systemctl restart httpd.service

验证

  1. 获取Kerberos ticket:

    # kinit
  2. 在浏览器中打开到受保护目录的URL。

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 地址。

流程

  1. 安装 mod_ssl 软件包:

    # yum install mod_ssl
  2. 编辑/etc/httpd/conf.d/ssl.conf文件,并将以下设置添加到 <VirtualHost _default_:443>指令中:

    1. 设置服务器名称:

      ServerName example.com
    重要

    服务器名称必须与证书的 Common Name字段中设置的条目匹配。

    1. 可选:如果证书在 Subject Alt Names (SAN)字段中包含额外的主机名,您可以 配置mod_ssl来为这些主机名提供 TLS 加密。要配置此功能,请添加具有对应名称的ServerAliases参数:

      ServerAlias www.example.com server.example.com
    2. 设置到私钥、服务器证书和 CA 证书的路径:

      SSLCertificateKeyFile "/etc/pki/tls/private/example.com.key"
      SSLCertificateFile "/etc/pki/tls/certs/example.com.crt"
      SSLCACertificateFile "/etc/pki/tls/certs/ca.crt"
  3. 出于安全考虑,配置成只有 root 用户才可以访问私钥文件:

    # chown root:root /etc/pki/tls/private/example.com.key
    # chmod 600 /etc/pki/tls/private/example.com.key
    警告

    如果私钥被设置为可以被未授权的用户访问,则需要撤销证书,然后再创建一个新私钥并请求一个新证书。否则,TLS 连接就不再安全。

  4. 如果您使用 firewalld,在本地防火墙中打开端口 443

    # firewall-cmd --permanent --add-port=443/tcp
    # firewall-cmd --reload
  5. 重启httpd服务:

    # systemctl restart httpd
    注意

    如果您使用密码来保护私钥文件,则必须在每次 httpd服务启动时都输入此密码。

验证

  • 使用浏览器并连接到https://example.com

1.9.2. 在 Apache HTTP 服务器中设置支持的 TLS 协议版本

默认情况下,RHEL 上的 Apache HTTP 服务器使用系统范围的加密策略来定义安全默认值,这些值也与最新的浏览器兼容。例如,DEFAULT策略定义了在 apache 中只启用 TLSv1.2TLSv1.3协议版本。

您可以手动配置 Apache HTTP 服务器支持哪个 TLS 协议版本。如果您的环境只需要启用特定的 TLS 协议版本,请按照以下步骤操作,例如:

  • 如果您的环境要求客户端也可以使用弱 TLS1 (TLSv1.0)或TLS1.1协议。
  • 如果你想将 Apache 配置为只支持TLSv1.2TLSv1.3协议。

先决条件

流程

  1. 编辑 /etc/httpd/conf/httpd.conf 文件,并将以下设置添加到您要为其设置 TLS 协议版本的<VirtualHost>指令中。例如,只启用TLSv1.3协议:

    SSLProtocol -All TLSv1.3
  2. 重启httpd服务:

    # systemctl restart httpd

验证

  1. 使用以下命令来验证服务器是否支持TLSv1.3:

    # openssl s_client -connect example.com:443 -tls1_3
  2. 使用以下命令来验证服务器是否不支持TLSv1.2

    # openssl s_client -connect example.com:443 -tls1_2

    如果服务器不支持该协议,命令会返回一个错误:

    140111600609088:error:1409442E:SSL routines:ssl3_read_bytes:tlsv1 alert protocol version:ssl/record/rec_layer_s3.c:1543:SSL alert number 70
  3. 可选:重复用于其他 TLS 协议版本的命令。

其它资源

1.9.3. 在 Apache HTTP 服务器中设置支持的密码

默认情况下,Apache HTTP 服务器使用定义安全默认值的系统范围的加密策略,这些值也与最新的浏览器兼容。有关系统范围加密允许的密码列表,请查看/etc/crypto-policies/back-ends/openssl.config 文件。

您可以手动配置 Apache HTTP 服务器支持哪些密码。如果您的环境需要特定的加密系统,请按照以下步骤操作。

先决条件

流程

  1. 编辑/etc/httpd/conf/httpd.conf文件,并将SSLCipherSuite参数添加到您要为其设置 TLS 密码的<VirtualHost>指令中:

    SSLCipherSuite "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH:!SHA1:!SHA256"

    这个示例只启用 EECDH+AESGCMEDH+AESGCMAES256+EECDHAES256+EDH密码,并禁用所有使用SHA1SHA256消息身份验证码(MAC)的密码。

  2. 重启httpd服务:

    # systemctl restart httpd

验证

  1. 显示 Apache HTTP 服务器支持的密码列表:

    1. 安装nmap软件包:

      # yum install nmap
    2. 使用nmap工具来显示支持的加密:

      # nmap --script ssl-enum-ciphers -p 443 example.com
      ...
      PORT    STATE SERVICE
      443/tcp open  https
      | ssl-enum-ciphers:
      |   TLSv1.2:
      |     ciphers:
      |       TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (ecdh_x25519) - A
      |       TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 (dh 2048) - A
      |       TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 (ecdh_x25519) - A
      ...

其它资源

1.10. 配置 TLS 客户端证书身份验证

客户端证书身份验证可让管理员只允许使用证书进行身份验证的用户访问 web 服务器上的资源。您可以在 /var/www/html/Example/ 目录中配置客户端证书身份验证。

如果 Apache HTTP 服务器使用 TLS 1.3 协议,某些客户端将需要额外的配置。例如,在 Firefox 中,将about:config菜单中的security.tls.enable_post_handshake_auth参数设置为true。详情请查看 Red Hat Enterprise Linux 8中的传输层安全版本1.3

先决条件

流程

  1. 编辑/etc/httpd/conf/httpd.conf文件,并将以下设置添加到你要为其配置客户端验证的<VirtualHost>指令中:

    <Directory "/var/www/html/Example/">
      SSLVerifyClient require
    </Directory>

    SSLVerifyClient require设置定义了服务器必须成功验证客户端证书,然后客户端才能访问/var/www/html/Example/目录中的内容。

  2. 重启httpd服务:

    # systemctl restart httpd

验证

  1. 使用curl工具在没有客户端身份验证的情况下访问https://example.com/Example/URL:

    $ curl https://example.com/Example/
    curl: (56) OpenSSL SSL_read: error:1409445C:SSL routines:ssl3_read_bytes:tlsv13 alert certificate required, errno 0

    这个错误表示 web 服务器需要客户端证书验证。

  2. 将客户端私钥和证书以及 CA 证书传递给curl以便使用客户端身份验证来访问相同的URL:

    $ curl --cacert ca.crt --key client.key --cert client.crt https://example.com/Example/

    如果请求成功,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_securitymod_security_crs 软件包。mod_security_crs 软件包为 ModSecurity 基于 Web 的应用程序防火墙(WAF)模块提供核心规则集(CRS)。

流程

  1. 安装 mod_securitymod_security_crshttpd 软件包:

    # yum install -y mod_security mod_security_crs httpd
  2. 启动 httpd 服务器:

    # systemctl restart httpd

验证

  1. 验证 Apache HTTP 服务器上是否启用了 ModSecurity 基于 web 的应用程序防火墙:

    # httpd -M | grep security
     security2_module (shared)
  2. 检查 /etc/httpd/modsecurity.d/activated_rules/ 目录是否包含由 mod_security_crs 提供的规则:

    # ls /etc/httpd/modsecurity.d/activated_rules/
    ...
    REQUEST-921-PROTOCOL-ATTACK.conf
    REQUEST-930-APPLICATION-ATTACK-LFI.conf
    ...

1.11.2. 向 ModSecurity 中添加自定义规则

如果 ModSecurity 核心规则集(CRS)中包含的规则不能适合您的场景,如果您想要阻止其他可能的攻击,则可以将自定义规则添加到 ModSecurity 基于 web 的应用防火墙使用的规则集中。以下示例演示了添加一条简单的规则。有关创建更复杂的规则,请参阅 ModSecurity Wiki 网站上的参考手册。

先决条件

  • ModSecurity for Apache 已安装并启用。

流程

  1. 在您选择的文本编辑器中打开 /etc/httpd/conf.d/mod_security.conf 文件,例如:

    # vi /etc/httpd/conf.d/mod_security.conf
  2. 在以 SecRuleEngine On 开头的行后添加以下示例规则:

    SecRule ARGS:data "@contains evil" "deny,status:403,msg:'param data contains evil data',id:1"

    如果 data 参数包含 evil 字符串,则前面的规则禁止用户使用资源。

  3. 保存更改,退出编辑器。
  4. 重启 httpd 服务器:

    # systemctl restart httpd

验证

  1. 创建一个 test.html 页面:

    # echo "mod_security test" > /var/www/html/test.html
  2. 重启 httpd 服务器:

    # systemctl restart httpd
  3. 请求 test.html ,而在 HTTP 请求的 GET 变量没有恶意数据:

    $ curl http://localhost/test.html?data=good
    
    mod_security test
  4. 请求 test.html ,而在 HTTP 请求的 GET 变量中带有恶意数据:

    $ curl localhost/test.html?data=xxxevilxxx
    
    <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
    <html><head>
    <title>403 Forbidden</title>
    </head><body>
    <h1>Forbidden</h1>
    <p>You do not have permission to access this resource.</p>
    </body></html>
  5. 检查 /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"]

其它资源

1.12. 安装 Apache HTTP 服务器手册

您可以安装 Apache HTTP 服务器手册。手册提供了详细信息,例如:

  • 配置参数和指令
  • 性能调整
  • 身份验证设置
  • 模块
  • 内容缓存
  • 安全提示
  • 配置 TLS 加密

安装后,您可以使用 Web 浏览器显示手册。

先决条件

  • Apache HTTP 服务器已安装并运行。

流程

  1. 安装httpd-manual软件包:

    # yum install httpd-manual
  2. 可选:默认情况下,所有连接到 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>
  3. 重启httpd服务:

    # systemctl restart httpd

验证

  1. 要显示 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 软件包。

流程

  1. /etc/httpd/conf.modules.d/ 目录中的配置文件中搜索模块名称:

    # grep mod_ssl.so /etc/httpd/conf.modules.d/*
  2. 编辑在其中找到了模块名称的配置文件,然后取消对模块的 LoadModule 指令的注释:

    LoadModule ssl_module modules/mod_ssl.so
  3. 如果没有找到模块,例如,因为 RHEL 软件包没有提供该模块,请创建一个配置文件,如 /etc/httpd/conf.modules.d/30-example.conf

    LoadModule ssl_module modules/<custom_module>.so
  4. 重启httpd服务:

    # systemctl restart httpd

1.13.2. 编译自定义 Apache 模块

您可以创建自己的模块,并使用 httpd-devel 软件包帮助构建,该软件包包含 include 文件、头文件以及编译模块所需的 APache eXtenSion (pxs)工具。

先决条件

  • 您已安装了 httpd-devel 软件包。

流程

  • 使用以下命令构建自定义模块:

    # apxs -i -a -c module_name.c

验证

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 数据库中。

流程

  1. 列出 NSS 数据库中的证书:

    # certutil -d /etc/httpd/alias/ -L
    Certificate Nickname           Trust Attributes
                                   SSL,S/MIME,JAR/XPI
    
    Example CA                     C,,
    Example Server Certificate     u,u,u

    在下一步中需要证书的别名。

  2. 要提取私钥,您必须临时将密钥导出到一个 PKCS #12 文件:

    1. 使用与私钥关联的证书的别名,将密钥导出到一个 PKCS #12 文件:

      # 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 SUCCESSFUL

      请注意,您必须在 PKCS #12 文件中设置一个密码。下一步需要这个密码。

    2. 从 PKCS #12 文件中导出私钥:

      # openssl pkcs12 -in /etc/pki/tls/private/export.p12 -out /etc/pki/tls/private/server.key -nocerts -nodes
      Enter Import Password: password
      MAC verified OK
    3. 删除临时 PKCS #12 文件:

      # rm /etc/pki/tls/private/export.p12
  3. /etc/pki/tls/private/server.key设置权限,以确保只有root用户才可以访问该文件:

    # chown root:root /etc/pki/tls/private/server.key
    # chmod 0600 /etc/pki/tls/private/server.key
  4. 使用 NSS 数据库中的服务器证书的别名导出 CA 证书:

    # certutil -d /etc/httpd/alias/ -L -n "Example Server Certificate" -a -o /etc/pki/tls/certs/server.crt
  5. /etc/pki/tls/certs/server.crt设置权限,以确保只有root用户才可以访问该文件:

    # chown root:root /etc/pki/tls/certs/server.crt
    # chmod 0600 /etc/pki/tls/certs/server.crt
  6. 使用 NSS 数据库中 CA 证书的别名导出 CA 证书:

    # certutil -d /etc/httpd/alias/ -L -n "Example CA" -a -o /etc/pki/tls/certs/ca.crt
  7. 按照 在 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

其它资源

  • certutil (1), pk12util (1), 和 pkcs12 (1ssl) man page

1.15. 其它资源

第 2 章 设置和配置 NGINX

NGINX 是一个高性能和模块化的服务器,可作为:

  • Web 服务器
  • 反向代理服务器
  • 负载均衡器

这部分论述了如何在这些场景中使用 NGINX。

2.1. 安装并准备 NGINX

红帽使用 Application Streams 来提供不同的 NGINX 版本。您可以执行以下操作:

  • 选择流并安装 NGINX
  • 在防火墙中打开所需端口
  • 启用并启动nginx服务

使用默认配置,NGINX 作为 Web 服务器在端口80上运行,并提供/usr/share/nginx/html/目录中的内容。

先决条件

  • 已安装了 RHEL 8。
  • 主机订阅了红帽客户门户网站。
  • firewalld 服务已启用并已启动

流程

  1. 显示可用的 NGINX 模块流:

    # yum module list nginx
    Red Hat Enterprise Linux 8 for x86_64 - AppStream (RPMs)
    Name        Stream        Profiles        Summary
    nginx       1.14 [d]      common [d]      nginx webserver
    nginx       1.16          common [d]      nginx webserver
    ...
    
    Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled
  2. 如果要安装与默认流不同的流,请选择相关的流:

    # yum module enable nginx:stream_version
  3. 安装nginx软件包:

    # yum install nginx
  4. 打开 NGINX 应该在其防火墙中提供其服务的端口。例如,要在firewalld中为HTTP(端口 80)和 HTTPS(端口 443)开放默认端口,请输入:

    # firewall-cmd --permanent --add-port={80/tcp,443/tcp}
    # firewall-cmd --reload
  5. 设置nginx服务在系统启动时自动启动:

    # systemctl enable nginx
  6. 可选:启动 nginx 服务:

    # systemctl start nginx

    如果您不想使用默认配置,请跳过这一步,并在启动该服务前相应地配置 NGINX。

重要

PHP 模块需要特定的 NGINX 版本。使用不兼容的版本可能会导致升级到较新的 NGNIX 流时导致冲突。使用 PHP 7.2 流和 NGNIX 1.24 流时,您可以在安装 NGINX 前启用较新的 PHP 流 7.4 来解决此问题。

验证

  1. 使用yum工具来验证是否已安装了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-rpms
  2. 确保在 firewalld 中打开了 NGINX 需要的端口:

    # firewall-cmd --list-ports
    80/tcp 443/tcp
  3. 验证nginx服务是否已启用:

    # systemctl is-enabled nginx
    enabled

其它资源

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.comexample.net 域解析为 Web 服务器的 IP 地址。

    请注意,您必须手动将这些条目添加到 DNS 服务器中。

流程

  1. 编辑/etc/nginx/nginx.conf文件:

    1. 默认情况下,/etc/nginx/nginx.conf文件已包含catch-all配置。如果您已从配置中删除了这部分,请将以下server块重新添加到/etc/nginx/nginx.conf文件中的http块中:

      server {
          listen       80 default_server;
          listen       [::]:80 default_server;
          server_name  _;
          root         /usr/share/nginx/html;
      }

      这些设置配置以下内容:

      • listen指令定义服务监听的 IP 地址和端口。在本例中,NGINX 监听所有 IPv4 和 IPv6 地址的80端口 。default_server参数表示,NGINX 使用此server块作为匹配 IP 地址和端口的请求的默认值。
      • server_name参数定义此server块所负责的主机名。将server_name设置为_,会将NGINX配置为接受这个server块的任何主机名。
      • root指令设置此server块的 Web 内容的路径。
    2. 将类似于example.com域的server块添加到 http块中:

      server {
          server_name  example.com;
          root         /var/www/example.com/;
          access_log   /var/log/nginx/example.com/access.log;
          error_log    /var/log/nginx/example.com/error.log;
      }
      • access_log指令为此域定义一个单独的访问日志文件。
      • error_log指令为此域定义单独的错误日志文件。
    3. 将类似于 example.com 域的一个 server 块添加到 http 块中:

      server {
          server_name  example.net;
          root         /var/www/example.net/;
          access_log   /var/log/nginx/example.net/access.log;
          error_log    /var/log/nginx/example.net/error.log;
      }
  2. 为这两个域创建根目录:

    # mkdir -p /var/www/example.com/
    # mkdir -p /var/www/example.net/
  3. 在两个根目录中设置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/

    这些命令在/var/www/example.com//var/www/example.net/目录中设置httpd_sys_content_t上下文。

    请注意,您必须安装 policycoreutils-python-utils软件包才能运行restorecon命令。

  4. 为这两个域创建日志目录:

    # mkdir /var/log/nginx/example.com/
    # mkdir /var/log/nginx/example.net/
  5. 重启nginx服务:

    # systemctl restart nginx

验证

  1. 在每个虚拟主机的文档 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
  2. 使用浏览器并连接到 http://example.comWeb 服务器显示/var/www/example.com/index.html文件中的示例内容。
  3. 使用浏览器并连接到 http://example.netWeb 服务器显示/var/www/example.net/index.html文件中的示例内容。
  4. 使用浏览器连接到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

流程

  1. 编辑 /etc/nginx/nginx.conf文件,并将以下server块添加到配置中的http块中:

    server {
        listen              443 ssl;
        server_name         example.com;
        root                /usr/share/nginx/html;
        ssl_certificate     /etc/pki/tls/certs/example.com.crt;
        ssl_certificate_key /etc/pki/tls/private/example.com.key;
    }
  2. 出于安全考虑,配置成只有 root 用户才可以访问私钥文件:

    # chown root:root /etc/pki/tls/private/example.com.key
    # chmod 600 /etc/pki/tls/private/example.com.key
    警告

    如果私钥被设置为可以被未授权的用户访问,则需要撤销证书,然后再创建一个新私钥并请求一个新证书。否则,TLS 连接就不再安全。

  3. 重启nginx服务:

    # systemctl restart nginx

验证

  • 使用浏览器连接到https://example.com

2.4. 将 NGINX 配置为 HTTP 流量的反向代理

您可以将 NGINX web 服务器配置为作为 HTTP 流量的反向代理。例如,您可以使用此功能将请求转发到远程服务器上的特定子目录。从客户端的角度来看,客户端从它所访问的主机加载内容。但是 NGINX 会从远程服务器加载实际内容并将其转发给客户端。

这个流程解释了如何将流向web 服务器上的/example目录的流量转发到URLhttps://example.com

先决条件

  • NGINX 已安装,如 安装和准备 NGINX 中所述。
  • 可选:反向代理上启用了 TLS 加密。

流程

  1. 编辑/etc/nginx/nginx.conf文件,并将以下设置添加到提供反向代理的server块中:

    location /example {
        proxy_pass https://example.com;
    }

    location块定义了 NGINX 将/example目录中的所有请求传给https://example.com

  2. httpd_can_network_connectSELinux 布尔值参数设置为1,以便将 SELinux 设置为允许 NGINX 转发流量:

    # setsebool -P httpd_can_network_connect 1
  3. 重启nginx服务:

    # systemctl restart nginx

验证

  • 使用浏览器连接到 http://host_name/example,就会显示https://example.com的内容。

2.5. 将 NGINX 配置为 HTTP 负载均衡器

您可以使用 NGINX 反向代理功能进行负载均衡流量。这个步骤描述了如何将 NGINX 配置为 HTTP 负载均衡器。它会根据服务器上的活跃连接的数量,将请求发送到不同服务器(发送到活跃连接数量最小的服务器)。如果两个服务器都不可用,这个过程还定义了第三个主机用于回退。

先决条件

流程

  1. 编辑/etc/nginx/nginx.conf文件并添加以下设置:

    http {
        upstream backend {
            least_conn;
            server server1.example.com;
            server server2.example.com;
            server server3.example.com backup;
        }
    
        server {
            location / {
                proxy_pass http://backend;
            }
        }
    }

    在名为backend的主机组中的least_conn指令定义了 NGINX 将请求发送到server1.example.comserver2.example.com,具体取决于哪个主机具有最少的活动连接数。NGINX 仅在其他两个主机不可用时使用server3.example.com作为备份。

    proxy_pass指令设置为http://backend 时,NGINX 充当反向代理,并使用backend主机组根据该组的设置分发请求。

    您还可以指定其他方法,而不是least_conn负载均衡方法:

    • 不指定方法,使用轮询的方式在服务器间平均分发请求。
    • ip_hash根据从 IPv4 地址的前三个八位字节或客户端的整个 IPv6 地址计算的哈希值将来自一个客户端地址的请求发送到同一台服务器。
    • hash,根据用户定义的密钥(可以是字符串、变量或两者的组合)来确定服务器。用consistent参数来进行配置,NGINX可根据用户定义的哈希密钥值向所有的服务器分发请求。
    • random将请求发送到随机挑选的服务器。
  2. 重启nginx服务:

    # systemctl restart nginx

2.6. 其它资源

第 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 需要 winbinddsmb systemd服务启动并停止smbd守护进程。

要使用smbd服务,请安装samba软件包。

nmbd

此服务通过 IPv4 协议使用 NetBIOS 提供主机名和 IP 解析。除了名字解析之外,nmbd服务还支持浏览 SMB 网络来查找域、工作组、主机、文件共享和打印机。为此,服务可将此信息直接报告给广播客户端,或者将其转发到本地或主浏览器。nmb systemd服务启动并停止nmbd守护进程。

请注意,现代 SMB 网络使用 DNS 来解析客户端和 IP 地址。对于 Kerberos,需要一个可工作的 DNS 设置。

要使用nmbd服务,请安装 samba软件包。

winbindd

该服务为名字服务交换机(NSS)提供了一个接口,以便使用本地系统上的 AD 或 NT4 域用户和组。例如,这使域用户能够对在 Samba 服务器上托管的服务或其他本地服务进行身份验证。winbind systemd服务启动并停止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 域成员服务器

其它资源

  • 您系统的 smb.conf (5) 手册页中的 security 参数

3.1.3. Samba 服务和 Samba 客户端工具加载并重新载入其配置的情况

下面描述了 Samba 服务和工具加载并重新载入其配置:

  • Samba 服务在以下情况下重新载入其配置:

    • 每 3 分钟自动进行
    • 在手动请求时,例如运行smbcontrol all reload-config 命令。
  • Samba 客户端实用程序仅在启动时读取其配置。

请注意,某些参数(如security )需要重启smb服务才能生效,而重新载入不足以生效。

其它资源

  • 系统上的 smb.conf (5) 手册页中的 如何应用配置更改 部分
  • 您系统上的 smbd (8)nmbd (8)winbindd (8) 手册页

3.1.4. 以安全的方式编辑 Samba 配置

Samba 服务每 3 分钟自动重新载入其配置。要防止服务在您使用 testparm 工具验证配置前重新载入更改,您可以以安全的方式编辑 Samba 配置。

先决条件

  • 已安装 Samba。

流程

  1. 创建/etc/samba/smb.conf文件的副本:

    # cp /etc/samba/smb.conf /etc/samba/samba.conf.copy
  2. 编辑复制的文件,并进行必要的更改。
  3. 验证/etc/samba/samba.conf.copy文件中的配置:

    # testparm -s /etc/samba/samba.conf.copy

    如果testparm报告错误,请修复这些错误,然后再次运行该命令。

  4. 使用新配置覆盖/etc/samba/smb.conf文件:

    # mv /etc/samba/samba.conf.copy /etc/samba/smb.conf
  5. 等待 Samba 服务自动重新载入其配置或手动重新载入配置:

    # smbcontrol all reload-config

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文件。

流程

  1. root用户身份运行testparm工具:

    # testparm
    Load smb config files from /etc/samba/smb.conf
    rlimit_max: increasing rlimit_max (1024) to minimum Windows limit (16384)
    Unknown parameter encountered: "log levell"
    Processing section "[example_share]"
    Loaded services file OK.
    ERROR: The idmap range for the domain * (tdb) overlaps with the range of DOMAIN (ad)!
    
    Server role: ROLE_DOMAIN_MEMBER
    
    Press enter to see a dump of your service definitions
    
    # Global parameters
    [global]
    	...
    
    [example_share]
    	...

    前面的示例输出会报告不存在的参数以及不正确的 ID 映射配置。

  2. 如果testparm报告了配置中不正确的参数、值或其他错误,请修复问题并再次运行该工具。

3.3. 将 Samba 设置为独立服务器

您可以将 Samba 设置为不是域成员的服务器。在此安装模式中,Samb身份验证到本地数据库,而不是中央DC。另外,您可以启用客户机访问,允许用户在没有身份验证的情况下连接到一个或多个服务。

3.3.1. 为独立服务器设置服务器配置

您可以为 Samba 独立服务器设置服务器配置。

流程

  1. 安装samba软件包:

    # yum install samba
  2. 编辑/etc/samba/smb.conf文件并设置以下参数:

    [global]
    	workgroup = Example-WG
    	netbios name = Server
    	security = user
    
    	log file = /var/log/samba/%m.log
    	log level = 1

    此配置在Example-learning工作组里定义了一个名为Server的独立服务器。此外,此配置启用了最小级别(1)的日志记录,日志文件将存储在/var/log/samba/目录中。Samba 将把 日志文件 参数中的%m 宏扩展到连接客户端的 NetBIOS 名称。这可为每个客户端启用独立的日志文件。

  3. 可选:配置文件或打印机共享。请参阅:

  4. 验证/etc/samba/smb.conf文件:

    # testparm
  5. 如果您设置了需要身份验证的共享,请创建用户帐户。

    详情请参阅 创建和启用本地用户帐户

  6. 打开所需的端口并使用firewall-cmd工具重新载入防火墙配置:

    # firewall-cmd --permanent --add-service=samba
    # firewall-cmd --reload
  7. 启用并启动smb服务:

    # systemctl enable --now smb

其它资源

  • 在您的系统中的 smb.conf (5) 手册页

3.3.2. 创建并启用本地用户帐户

要让用户在连接到共享时进行身份验证,您必须在 Samba 主机上的操作系统和 Samba 数据库中创建帐户。Samba 要求操作系统帐户验证文件系统对象上的访问控制列表(ACL)和 Samba 帐户,来验证连接用户的身份。

如果您使用了passdb backend = tdbsam 默认设置,Samba 会将用户帐户存储在/var/lib/samba/private/passdb.tdb数据库中。

您可以创建一个名为 example 的本地 Samba 用户。

先决条件

  • Samba 已安装并配置为独立服务器。

流程

  1. 创建操作系统帐户:

    # useradd -M -s /sbin/nologin example

    此命令添加了example帐户,而不创建主目录如果帐户仅用于对 Samba 进行身份验证,请将/sbin/nologin命令指定为 shell,以防止帐户在本地登录。

  2. 为操作系统帐户设置密码以启用它:

    # passwd example
    Enter new UNIX password: password
    Retype new UNIX password: password
    passwd: password updated successfully

    Samba 不会使用操作系统帐户中的密码集进行身份验证。然而,您需要设置密码才能启用帐户。如果一个帐户被禁用,当这个用户连接时,Samba 会拒绝访问。

  3. 将用户添加到 Samba 数据库,并为帐户设置密码:

    # smbpasswd -a example
    New SMB password: password
    Retype new SMB password: password
    Added user example.

    当使用此帐户连接到 Samba 共享时,使用此密码进行验证。

  4. 启用 Samba 帐户:

    # smbpasswd -e example
    Enabled user example.

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 映射后端。最常用的后端是:

后端使用案例

tdb

*仅限默认域

ad

仅限 AD 域

rid

AD 和 NT4 域

autorid

AD、NT4 和 * 默认域

3.4.1. 规划 Samba ID 范围

无论您在 AD 中是否存储了 Linux UID 和 GID,还是将 Samba 配置为生成它们,每个域配置都需要一个唯一的 ID 范围,其不得与任何其他域重叠。

警告

如果您设置了重叠 ID 范围,Samba 无法正常工作。

例 3.1. 唯一的 ID 范围

以下显示了默认(*)、AD-DOMTRUST-DOM域的非重叠 ID 映射范围。

[global]
...
idmap config * : backend = tdb
idmap config * : range = 10000-999999

idmap config AD-DOM:backend = rid
idmap config AD-DOM:range = 2000000-2999999

idmap config TRUST-DOM:backend = rid
idmap config TRUST-DOM:range = 4000000-4999999
重要

每个域只能分配一个范围。因此,在域范围之间有足够的空间。这可让您在域扩展后扩展范围。

如果您稍后给某个域分配了一个不同的范围,那么之前由这些用户和组创建的文件和目录的所有权将会丢失。

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

详情请查看 使用 TDB ID 映射后端

autorid

当您将默认域配置为使用autorid后端时,为域添加额外的 ID 映射配置是可选的。

例如,在/etc/samba/smb.conf文件中的[global]部分中设置以下内容:

idmap config * : backend = autorid
idmap config * : range = 10000-999999

详情请查看 使用 autorid ID 映射后端

3.4.3. 使用 tdb ID 映射后端

winbindd服务默认使用可写的tdb ID 映射后端来存储安全标识符(SID)、UID 以及 GID 映射表。这包括本地用户、组和内置主体。

仅将此后端用于*默认域。例如:

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 映射后端: tdbdeleteautorid

后端从 AD 读取以下属性:

AD 属性名称对象类型映射到

sAMAccountName

用户和组群

用户和组名称,取决于对象

uidNumber

用户

用户 ID(UID)

gidNumber

组 ID(GID)

loginShell [a]

用户

用户 shell 的路径

unixHomeDirectory [a]

用户

用户主目录的路径

primaryGroupID [b]

用户

主组群 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 文件中。

流程

  1. 编辑 /etc/samba/smb.conf 文件中的 [global] 部分:

    1. 如果默认域(*)不存在,请为其添加 ID 映射配置。例如:

      idmap config * : backend = tdb
      idmap config * : range = 10000-999999
    2. 为 AD 域启用 ad ID 映射后端:

      idmap config DOMAIN : backend = ad
    3. 设置分配给 AD 域中用户和组的 ID 范围。例如:

      idmap config DOMAIN : range = 2000000-2999999
      重要

      范围不得与这个服务器上的任何其他域配置重叠。此外,范围必须足够大,以便包含将来分配的所有 ID。详情请查看 规划 Samba ID 范围

    4. 当从AD读取属性时,使用RFC 2307模式来设置 Samba:

      idmap config DOMAIN : schema_mode = rfc2307
    5. 要让 Samba 从对应的 AD 属性读取登录 shell 和用户主目录的路径,请设置:

      idmap config DOMAIN : unix_nss_info = yes

      或者,您可以设置适用于所有用户的统一的域范围的主目录路径和登录 shell。例如:

      template shell = /bin/bash
      template homedir = /home/%U
    6. 默认情况下,Samba 使用用户对象的 primaryGroupID 属性作为 Linux 上用户的主组。或者,您可以将 Samba 配置为使用gidNumber属性中设置的值:

      idmap config DOMAIN : unix_primary_group = yes
  2. 验证/etc/samba/smb.conf文件:

    # testparm
  3. 重新载入 Samba 配置:

    # smbcontrol all reload-config

其它资源

  • * 默认域
  • 您系统上的 smb.conf (5)idmap_ad (8) 手册页
  • 系统上的 smb.conf (5) 手册页中的 VARIABLE SUBSTITUTIONS 部分

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 文件中。

流程

  1. 编辑 /etc/samba/smb.conf 文件中的 [global] 部分:

    1. 如果默认域(*)不存在,请为其添加 ID 映射配置。例如:

      idmap config * : backend = tdb
      idmap config * : range = 10000-999999
    2. 为域启用ridID映射后端:

      idmap config DOMAIN : backend = rid
    3. 设置一个足够大的范围,以包括将来将要分配的所有RID。例如:

      idmap config DOMAIN : range = 2000000-2999999

      Samba 会忽略此域中其RID不在范围内的用户和组。

      重要

      范围不得与这个服务器上的任何其他域配置重叠。此外,范围必须足够大,以便包含将来分配的所有 ID。详情请查看 规划 Samba ID 范围

    4. 设置分配给所有映射用户的 shell 和主目录路径。例如:

      template shell = /bin/bash
      template homedir = /home/%U
  2. 验证/etc/samba/smb.conf文件:

    # testparm
  3. 重新载入 Samba 配置:

    # smbcontrol all reload-config

其它资源

  • * 默认域
  • 系统上的 smb.conf (5) 手册页中的 VARIABLE SUBSTITUTIONS 部分
  • RID 中本地 ID 的计算,请查看系统中的 idmap_rid (8) 手册页

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 文件中。

流程

  1. 编辑 /etc/samba/smb.conf 文件中的 [global] 部分:

    1. * 默认域启用autoridID映射后端:

      idmap config * : backend = autorid
    2. 设置一个足够大的范围来为所有现有和将来的对象分配 ID。例如:

      idmap config * : range = 10000-999999

      Samba 忽略在此域中计算 ID 不在范围范围内的用户和组。

      警告

      设置范围并开始使用 Samba 后,您只能增加范围的上限。对范围的任何其他变化都可能会导致分配新的 ID,从而会丢失文件的所有者信息。

    3. 可选:设置范围大小。例如:

      idmap config * : rangesize = 200000

      Samba 会为每个域的对象分配这个连续的ID号,直到 idmap config * : range参数中设置的范围内的所有ID分配完。

      注意

      如果设置了 rangesize,则需要相应地调整范围。范围必须是 rangesize 的倍数。

    4. 设置分配给所有映射用户的 shell 和主目录路径。例如:

      template shell = /bin/bash
      template homedir = /home/%U
    5. 可选:为域添加额外的 ID 映射配置。如果没有针对单个域的配置,Samba 则使用之前配置的 * 默认域中的 autorid 后端设置来计算 ID。

      重要

      范围不得与这个服务器上的任何其他域配置重叠。此外,范围必须足够大,以便包含将来分配的所有 ID。详情请查看 规划 Samba ID 范围

  2. 验证/etc/samba/smb.conf文件:

    # testparm
  3. 重新载入 Samba 配置:

    # smbcontrol all reload-config

其它资源

  • 系统上的 idmap_autorid (8) 手册页中的 THE MAPPING FORMULAS 部分
  • 系统上的 idmap_autorid (8) 手册页中的 rangesize 参数描述
  • 系统上的 smb.conf (5) 手册页中的 VARIABLE SUBSTITUTIONS 部分

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。

流程

  1. 如果您的 AD 需要弃用的 RC4 加密类型进行 Kerberos 验证,请在 RHEL 中启用对这些密码的支持:

    # update-crypto-policies --set DEFAULT:AD-SUPPORT
  2. 安装以下软件包:

    # yum install realmd oddjob-mkhomedir oddjob samba-winbind-clients \
           samba-winbind samba-common-tools samba-winbind-krb5-locator krb5-workstation
  3. 要在域成员中共享目录或打印机,请安装samba 软件包:

    # yum install samba
  4. 备份现有的/etc/samba/smb.conf Samba 配置文件:

    # mv /etc/samba/smb.conf /etc/samba/smb.conf.bak
  5. 加入域。例如,要加入名为ad.example.com的域:

    # realm join --membership-software=samba --client-software=winbind ad.example.com

    使用上面的命令,realm工具会自动:

    • ad.example.com域中的成员创建/etc/samba/smb.conf文件
    • 将用于用户和组查找的winbind模块添加到/etc/nsswitch.conf文件中
    • 更新/etc/pam.d/目录中的可插拔验证模块(PAM)配置文件
    • 启动winbind服务,并使服务在系统引导时启动
  6. 可选:在 /etc/samba/smb.conf 文件中设置替代 ID 映射后端或自定义 ID 映射设置。详情请参阅 了解和配置 Samba ID 映射
  7. 验证winbind服务是否运行:

    # systemctl status winbind
    ...
       Active: active (running) since Tue 2018-11-06 19:10:40 CET; 15s ago
    重要

    要启用 Samba 来查询域用户和组信息,必须在启动smb之前运行winbind服务。

  8. 如果您安装了samba软件包来共享目录和打印机,请启用并启动smb服务:

    # systemctl enable --now smb
  9. 如果您要向 Active Directory 验证本地登录,请启用 winbind_krb5_localauth 插件。请参阅 对 MIT Kerberos 使用本地授权插件

验证

  1. 显示 AD 用户的详情,如 AD 域中的 AD 管理员帐户:

    # getent passwd "AD\administrator"
    AD\administrator:*:10000:10000::/home/administrator@AD:/bin/bash
  2. 查询 AD 域中的域用户组成员:

    # getent group "AD\Domain Users"
        AD\domain users:x:10000:user1,user2
  3. 可选:在设置文件和目录权限时,验证您是否可以使用域用户和组。例如,将/srv/samba/example.txt文件的所有者设置为AD\administrator,组设置为AD\Domain Users

    # chown "AD\administrator":"AD\Domain Users" /srv/samba/example.txt
  4. 验证 Kerberos 验证是否如预期正常工作:

    1. 对于 AD 域成员,为administrator@AD.EXAMPLE.COM主体获取一个ticket:

      # kinit administrator@AD.EXAMPLE.COM
    2. 显示缓存的 Kerberos ticket:

      # klist
      Ticket cache: KCM:0
      Default principal: administrator@AD.EXAMPLE.COM
      
      Valid starting       Expires              Service principal
      01.11.2018 10:00:00  01.11.2018 20:00:00  krbtgt/AD.EXAMPLE.COM@AD.EXAMPLE.COM
              renew until 08.11.2018 05:00:00
  5. 显示可用域:

    # wbinfo --all-domains
    BUILTIN
    SAMBA-SERVER
    AD

其它资源

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
}

其它资源

  • 您系统上的 winbind_krb5_localauth (8) 手册页。

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 提供的共享和打印机服务,请确保 AES 加密类型在 AD 中启用了。如需更多信息,请参阅使用 GPO 在 Active Directory 中启用 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 服务。

流程

  1. 安装所需的软件包:

    [root@ipaserver ~]# yum install ipa-server-trust-ad samba-client
  2. 以 IdM 管理用户身份进行身份验证:

    [root@ipaserver ~]# kinit admin
  3. 运行ipa-adtrust-install工具:

    [root@ipaserver ~]# ipa-adtrust-install

    如果 IdM 安装了集成的 DNS 服务器,则会自动创建 DNS 服务记录。

    如果您安装的IdM没有集成 DNS 服务器,ipa-adtrust-install会打印一个服务记录列表,您必须手动将其添加到DNS后才能继续操作。

  4. 该脚本会提示您/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
  5. 该脚本提示您配置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
  6. 提示时,输入 IdM 域的 NetBIOS 名称,或者按 Enter 接受推荐的名称:

    Trust is configured but no NetBIOS domain name found, setting it now.
    Enter the NetBIOS name for the IPA domain.
    Only up to 15 uppercase ASCII letters, digits and dashes are allowed.
    Example: EXAMPLE.
    
    NetBIOS domain name [IDM]:
  7. 系统会提示您运行 SID 生成任务,以便为任何现有用户创建 SID:

    Do you want to run the ipa-sidgen task? [no]: yes

    这是一个资源密集型任务,因此如果您有大量的用户,您可以在其他时间运行此任务。

  8. 可选:默认情况下,对于 Windows Server 2008 及更高版本,动态 RPC 端口范围定义为 49152-65535。如果您需要为您的环境定义不同的动态 RPC 端口范围,请将 Samba 配置为使用不同的端口,并在防火墙设置中开放这些端口。以下示例将端口范围设置为55000-65000

    [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-permanent
  9. 重启ipa服务:

    [root@ipaserver ~]# ipactl restart
  10. 使用smbclient工具来验证 Samba 是否响应 IdM 端的 Kerberos 身份验证:

    [root@ipaserver ~]# smbclient -L ipaserver.idm.example.com -U user_name --use-kerberos=required
    lp_load_ex: changing to config backend registry
        Sharename       Type      Comment
        ---------       ----      -------
        IPC$            IPC       IPC Service (Samba 4.15.2)
    ...

3.6.2. 在 IdM 客户端中安装和配置 Samba 服务器

您可以在已在 IdM 域中注册的客户端上安装和配置 Samba。

先决条件

流程

  1. 安装ipa-client-samba软件包:

    [root@idm_client]# yum install ipa-client-samba
  2. 使用ipa-client-samba工具准备客户端并创建初始 Samba 配置:

    [root@idm_client]# ipa-client-samba
    Searching for IPA server...
    IPA server: DNS discovery
    Chosen IPA master: idm_server.idm.example.com
    SMB principal to be created: cifs/idm_client.idm.example.com@IDM.EXAMPLE.COM
    NetBIOS name to be used: IDM_CLIENT
    Discovered domains to use:
    
     Domain name: idm.example.com
    NetBIOS name: IDM
             SID: S-1-5-21-525930803-952335037-206501584
        ID range: 212000000 - 212199999
    
     Domain name: ad.example.com
    NetBIOS name: AD
             SID: None
        ID range: 1918400000 - 1918599999
    
    Continue to configure the system with these values? [no]: yes
    Samba domain member is configured. Please check configuration at /etc/samba/smb.conf and start smb and winbind services
  3. 默认情况下,ipa-client-samba会自动将[homes]部分添加到/etc/samba/smb.conf文件中,该文件在用户连接时动态共享用户的主目录。如果用户在这个服务器上没有主目录,或者您不想共享主目录,请从/etc/samba/smb.conf中删除以下行:

    [homes]
        read only = no
  4. 共享目录和打印机。详情请查看:

  5. 在本地防火墙中打开 Samba 客户端所需的端口:

    [root@idm_client]# firewall-cmd --permanent --add-service=samba-client
    [root@idm_client]# firewall-cmd --reload
  6. 启用并启动smbwinbind服务:

    [root@idm_client]# systemctl enable --now smb winbind

验证

在已安装了 samba-client 软件包的不同 IdM 域成员上运行以下验证步骤:

  • 使用 Kerberos 身份验证列出 Samba 服务器中的共享:

    $ smbclient -L idm_client.idm.example.com -U user_name --use-kerberos=required
    lp_load_ex: changing to config backend registry
    
        Sharename       Type      Comment
        ---------       ----      -------
        example         Disk
        IPC$            IPC       IPC Service (Samba 4.15.2)
    ...

其它资源

  • 您系统上的 ipa-client-samba (1) 手册页

3.6.3. 如果 IdM 信任新域,请手动添加 ID 映射配置

Samba 需要一个 ID 映射配置,用户可从该域访问资源。在 IdM 客户端上运行的现有 Samba 服务器上,在管理员向 Active Directory(AD)域添加了新的信任后,您必须手动添加 ID 映射配置。

先决条件

  • 您在 IdM 客户端中配置了 Samba。之后,IdM 增加了一个新的信任。
  • 在可信 AD 域中必须禁用 Kerberos 的 DES 和 RC4 加密类型。为了安全起见,RHEL 8 不支持这些弱加密类型。

流程

  1. 使用主机的 keytab 进行身份验证:

    [root@idm_client]# kinit -k
  2. 使用ipa idrange-find命令来显示新域的基本 ID 和 ID 范围大小。例如,以下命令显示了ad.example.com域的值:

    [root@idm_client]# ipa idrange-find --name="AD.EXAMPLE.COM_id_range" --raw
    ---------------
    1 range matched
    ---------------
      cn: AD.EXAMPLE.COM_id_range
      ipabaseid: 1918400000
      ipaidrangesize: 200000
      ipabaserid: 0
      ipanttrusteddomainsid: S-1-5-21-968346183-862388825-1738313271
      iparangetype: ipa-ad-trust
    ----------------------------
    Number of entries returned 1
    ----------------------------

    在后续步骤中,您需要ipabaseidipaidrangesize属性的值。

  3. 要计算可用最高的 ID,请使用以下公式:

    maximum_range = ipabaseid + ipaidrangesize - 1

    使用上一步中的值,ad.example.com域的最大可用 ID 是1918599999(1918400000 + 200000 - 1)。

  4. 编辑/etc/samba/smb.conf文件,并将域的 ID 映射配置添加到[global]部分:

    idmap config AD : range = 1918400000 - 1918599999
    idmap config AD : backend = sss

    ipabaseid属性的值指定为最小值,将上一步中的计算值指定为该范围的最大值。

  5. 重启smbwinbind服务:

    [root@idm_client]# systemctl restart smb winbind

验证

  • 使用 Kerberos 身份验证列出 Samba 服务器中的共享:

    $ smbclient -L idm_client.idm.example.com -U user_name --use-kerberos=required
    lp_load_ex: changing to config backend registry
    
        Sharename       Type      Comment
        ---------       ----      -------
        example         Disk
        IPC$            IPC       IPC Service (Samba 4.15.2)
    ...

3.6.4. 其它资源

3.7. 设置使用 POSIX ACL 的 Samba 文件共享

作为 Linux 服务,Samba 支持与 POSIX ACL 的共享。它们允许您使用诸如chmod等工具在 Samba 服务器上本地管理权限。如果共享是存储在支持扩展属性的文件系统中,您可以使用多个用户和组定义 ACL。

注意

如果您需要使用精细的 Windows ACL,请参阅 设置使用 Windows ACL 的共享

这个部分的内容基于 Samba Wiki 中发布的 Setting up a Share Using POSIX ACLs 文档。许可证: CC BY 4.0。作者和贡献者:请参阅 Wiki 页面上的历史选项卡。

3.7.1. 添加使用 POSIX ACL 的共享

您可以创建一个名为 example 的共享,它提供 /srv/samba/example/ 目录的内容,并使用 POSIX ACL。

先决条件

Samba 采用以下模式之一设置:

流程

  1. 如果不存在,请创建文件夹。例如:

    # mkdir -p /srv/samba/example/
  2. 如果您在enforcing模式下运行 SELinux,请在目录中设置samba_share_t上下文:

    # semanage fcontext -a -t samba_share_t "/srv/samba/example(/.*)?"
    # restorecon -Rv /srv/samba/example/
  3. 在目录中设置文件系统 ACL。详情请查看:

  4. 将示例共享添加到/etc/samba/smb.conf文件中。例如,添加启用了共享的写操作:

    [example]
    	path = /srv/samba/example/
    	read only = no
    注意

    无论文件系统 ACL 是什么;如果您没有设置read only = no,Samba 会以只读模式共享该目录。

  5. 验证/etc/samba/smb.conf文件:

    # testparm
  6. 打开所需的端口,并使用firewall-cmd工具重新加载防火墙配置:

    # firewall-cmd --permanent --add-service=samba
    # firewall-cmd --reload
  7. 重启 smb 服务:

    # systemctl restart smb

3.7.2. 在使用 POSIX ACL 的 Samba 共享中设置标准 Linux ACL

Linux 中的标准 ACL 支持为一个所有者、一个组和所有其他未定义用户设置权限。您可以使用chownchgrpchmod工具来更新 ACL。如果需要精确控制,请使用更复杂的 POSIX ACL,请参阅

在使用 POSIX ACL 的 Samba 共享上设置扩展 ACL

以下步骤将/srv/samba/example/目录的所有者设置为root用户,将读写权限赋予Domain Users 组,并拒绝所有其他用户的访问。

先决条件

  • 存在要设置 ACL 的 Samba 共享。

流程

# chown root:"Domain Users" /srv/samba/example/
# chmod 2770 /srv/samba/example/

注意

对目录启用 set-group-ID(SGID)位会自动对目录组的所有新文件和子目录设置默认组,而不是通常的行为,将其设置为创建新目录条目的用户的主组。

其它资源

  • 您系统上的 chown (1)chmod (1) 手册页

3.7.3. 在使用 POSIX ACL 的 Samba 共享中设置扩展的 ACL

如果文件系统中保存了共享目录的支持扩展 ACL,您可以使用它们设置复杂的权限。扩展 ACL 可以包含多个用户和组群的权限。

扩展 POSIX ACL 可让您使用多个用户和组配置复杂的 ACL。但是,您只能设置以下权限:

  • 无权限
  • 读权限
  • 写权限
  • 全控制

如果您需要更细粒度的 Windows 权限,如 创建文件夹 / 追加数据,请将共享配置为使用 Windows ACL。请参阅 设置使用 Windows ACL 的共享

以下流程演示了如何在共享中启用扩展 ACL。另外,它还包含有关设置扩展 ACL 的示例。

先决条件

  • 存在要设置 ACL 的 Samba 共享。

流程

  1. /etc/samba/smb.conf文件中的共享部分启用以下参数,以启用扩展 ACL 的 ACL 继承:

    inherit acls = yes

    详情请查看 smb.conf(5)手册页中的参数描述。

  2. 重启 smb 服务:

    # systemctl restart smb
  3. 在目录中设置 ACL。例如:

    例 3.2. 设置扩展 ACL

    以下步骤为Domain Admins组设置读、写和执行权限,为Domain Users组设置读和执行权限,并拒绝其他人对/srv/samba/example/目录的访问:

    1. 为主用户帐户组禁用自动授予权限:

      # setfacl -m group::--- /srv/samba/example/
      # setfacl -m default:group::--- /srv/samba/example/

      目录的主组还被映射到动态CREATOR GROUP主体。当您对Samba 共享使用扩展 POSIX ACL 时,主体会被自动添加,您无法将其删除。

    2. 设置目录中的权限:

      1. Domain Admins组赋予读、写和执行权限:

        # setfacl -m group:"DOMAIN\Domain Admins":rwx /srv/samba/example/
      2. Domain Users组赋予读和执行权限:

        # setfacl -m group:"DOMAIN\Domain Users":r-x /srv/samba/example/
      3. other ACL条目设置权限,以拒绝与其他 ACL 条目不匹配的用户的访问:

        # setfacl -R -m other::--- /srv/samba/example/

      这些设置只适用于这个目录。在 Windows 中,这些 ACL 映射到仅此文件夹模式。

    3. 要使上一步中设置的权限被在此目录中创建的新文件系统对象继承,请执行以下操作:

      # setfacl -m default:group:"DOMAIN\Domain Admins":rwx /srv/samba/example/
      # setfacl -m default:group:"DOMAIN\Domain Users":r-x /srv/samba/example/
      # setfacl -m default:other::--- /srv/samba/example/

      使用这些设置,现在将主体的仅此文件夹模式设置为此文件夹、子文件夹和文件模式。

    Samba 将流程中设置的权限映射到以下 Windows ACL:

    主体权限适用于

    domain\DomainAdmins

    全控制

    这个文件夹、子文件夹和文件

    Domain\Domain Users

    读和执行

    这个文件夹、子文件夹和文件

    每个人 [a]

    这个文件夹、子文件夹和文件

    所有者Unix 用户\所有者[b]

    全控制

    只限于这个文件夹

    primary_group (Unix 用户\primary_group) [c]

    只限于这个文件夹

    创建者所有者 [d] [e]

    全控制

    只适用于子文件夹和文件

    创建者组 [e] [f]

    只适用于子文件夹和文件

    [a] Samba从othe ACL 条目映射此主体的权限。
    [b] Samba 将目录的所有者映射到此条目。
    [c] Samba 将目录的主组群映射到这个条目。
    [d] 在新文件系统对象中,创建者会自动继承这个主体的权限。
    [e] 在使用 POSIX ACL 的共享中不支持从 ACL 配置或删除这些主体。
    [f] 在新文件系统对象中,创建器的主组群自动继承这个主体的权限。

3.8. 对使用 POSIX ACL 的共享设置权限

另外,要限制或赋予对 Samba 共享的访问权限,您可以在/etc/samba/smb.conf文件的共享部分设置某些参数。

注意

如果用户、组或主机能够访问共享,则进行基于共享的权限管理。这些设置不会影响文件系统 ACL。

使用基于共享的设置来限制对共享的访问,例如拒绝特定主机的访问。

先决条件

  • 与 POSIX ACL 的共享已被设置。

3.8.1. 配置基于用户和组群的共享访问权限

基于用户和组的访问控制,使您能够赋予或拒绝特定用户和组对共享的访问权限。

先决条件

  • 已存在您要设置用户或组群访问的 Samba 共享。

流程

  1. 例如,要在 用户帐户 访问时允许 Domain Users 组的所有成员访问共享,请在共享的配置中添加以下参数:

    valid users = +DOMAIN\"Domain Users"
    invalid users = DOMAIN\user

    invalid users 参数的优先级高于valid users 参数。例如,如果 user帐户是 Domain Users 组的成员,则在使用上例时会拒绝此帐户的访问。

  2. 重新载入 Samba 配置:

    # smbcontrol all reload-config

其它资源

  • 在您的系统中的 smb.conf (5) 手册页

3.8.2. 配置基于主机的共享访问权限

基于主机的访问控制允许您根据客户端的主机名、IP 地址或 IP 范围授予或拒绝对共享的访问。

以下流程解释了如何启用 127.0.0.1 IP 地址、192.0.2.0/24 IP 范围,以及client1.example.com 主机来访问共享,另外拒绝了对 client2.example.com 主机的访问:

先决条件

  • 已存在您要设置基于主机的访问的 Samba 共享。

流程

  1. /etc/samba/smb.conf 文件的共享配置中添加以下参数:

    hosts allow = 127.0.0.1 192.0.2.0/24 client1.example.com
    hosts deny = client2.example.com

    hosts deny 参数的优先级高于 hosts allow。例如,如果 client1.example.com 解析为 hosts allow 参数中列出的 IP 地址,那么此主机的访问将被拒绝。

  2. 重新载入 Samba 配置:

    # smbcontrol all reload-config

其它资源

  • 在您的系统中的 smb.conf (5) 手册页

3.9. 设置使用 Windows ACL 的共享

Samba 支持在共享和文件系统对象中设置 Windows ACL。这可让您:

  • 使用精细 Windows ACL
  • 使用 Windows 管理共享权限和文件系统 ACL

或者,您可以将共享配置为使用 POSIX ACL。详情请参阅 设置使用 POSIX ACL 的 Samba 文件共享

这个部分的内容基于 Samba Wiki 中发布的 Setting up a Share Using Windows ACLs 文档。许可证: CC BY 4.0。作者和贡献者:请参阅 Wiki 页面上的历史选项卡。

3.9.1. 授予 SeDiskOperatorPrivilege 特权

只有被赋予了 SeDiskOperatorPrivilege 特权的用户和组才能对使用了 Windows ACL 的共享配置权限。

流程

  1. 例如,要对 DOMAIN\Domain Admins 组赋予 SeDiskOperatorPrivilege 特权:

    # net rpc rights grant "DOMAIN\Domain Admins" SeDiskOperatorPrivilege -U "DOMAIN\administrator"
    Enter DOMAIN\administrator's password:
    Successfully granted rights.
    注意

    在域环境中,对域组赋予 SeDiskOperatorPrivilege。这可让您通过更新用户的组成员资格来集中管理特权。

  2. 列出所有被赋予了 SeDiskOperatorPrivilege 的用户和组:

    # net rpc rights list privileges SeDiskOperatorPrivilege -U "DOMAIN\administrator"
    Enter administrator's password:
    SeDiskOperatorPrivilege:
      BUILTIN\Administrators
      DOMAIN\Domain Admins

3.9.2. 启用 Windows ACL 支持

要配置支持 Windows ACL 的共享,您必须在 Samba 中启用此功能。

先决条件

  • 在 Samba 服务器中配置了一个用户共享。

流程

  1. 要全局启用所有共享,请在 /etc/samba/smb.conf 文件的 [global] 部分添加以下设置:

    vfs objects = acl_xattr
    map acl inherit = yes
    store dos attributes = yes

    或者,您可以通过将相同的参数添加到共享部分来启用对单个共享的 Windows ACL 支持。

  2. 重启 smb 服务:

    # systemctl restart smb

3.9.3. 添加使用 Windows ACL 的共享

您可以创建一个名为 example 的共享,其共享 /srv/samba/example/ 目录的内容,并使用 Windows ACL。

流程

  1. 如果不存在,请创建文件夹。例如:

    # mkdir -p /srv/samba/example/
  2. 如果您在enforcing模式下运行 SELinux,请在目录中设置samba_share_t上下文:

    # semanage fcontext -a -t samba_share_t "/srv/samba/example(/.)?"*
    # restorecon -Rv /srv/samba/example/
  3. 将示例共享添加到/etc/samba/smb.conf文件中。例如,添加启用了共享的写操作:

    [example]
    	path = /srv/samba/example/
    	read only = no
    注意

    无论文件系统 ACL 是什么;如果您没有设置read only = no,Samba 会以只读模式共享该目录。

  4. 如果您没有在[global] 部分中对所有共享启用 Windows ACL 支持,那么请在 [example] 部分中添加以下参数来为这个共享启用此特性:

    vfs objects = acl_xattr
    map acl inherit = yes
    store dos attributes = yes
  5. 验证/etc/samba/smb.conf文件:

    # testparm
  6. 打开所需的端口,并使用firewall-cmd工具重新加载防火墙配置:

    # firewall-cmd --permanent --add-service=samba
    # firewall-cmd --reload
  7. 重启 smb 服务:

    # systemctl restart smb

3.9.4. 管理使用 Windows ACL 的共享的共享权限和文件系统 ACL

要在使用 Windows ACL 的 Samba 共享上管理共享权限和文件系统 ACL,请使用 Windows 应用程序,如 计算机管理。详情请查看 Windows 文档。或者,使用 smbcacls 工具来管理 ACL。

注意

要从 Windows 修改文件系统权限,您必须使用赋予了 SeDiskOperatorPrivilege 特权的帐户。

3.10. 使用 smbcacls 在 SMB 共享中管理 ACL

smbcacls 工具可以列出、设置和删除存储在 SMB 共享中的文件和目录的 ACL。您可以使用 smbcacls 来管理文件系统 ACL:

  • 在使用高级 Windows ACL 或 POSIX ACL 的本地或远程 Samba 服务器中
  • 在 Red Hat Enterprise Linux 上,远程管理在 Windows 上托管的共享的 ACL

3.10.1. 访问控制条目

文件系统对象的每个 ACL 条目都包含以下格式的访问控制条目(ACE):

security_principal:access_right/inheritance_information/permissions

例 3.3. 访问控制条目

如果 AD\Domain Users 组对Windows 上的此文件夹、子文件夹和文件拥有修改权限,那么ACL 将包含以下 ACE:

AD\Domain Users:ALLOWED/OI|CI/CHANGE

ACE 包含以下部分:

安全主体
安全主体是 ACL 中权限的用户、组群或 SID。
访问权利
定义是否赋予或拒绝了对对象的访问权限。该值可以是 ALLOWEDDENIED
继承信息

存在以下值:

表 3.1. 继承设置
描述映射到

OI

对象实例

这个文件夹和文件

CI

容器继承

这个文件夹和子文件夹

IO

只继承

ACE 不适用于当前文件或目录

ID

继承

ACE 从父目录中继承

另外,这些值可以合并如下:

表 3.2. 继承设置组合
值组合映射到 Windows 应用于 设置

OI|CI

这个文件夹、子文件夹和文件

OI|CI|IO

只适用于子文件夹和文件

CI|IO

只使用子文件夹

OI|IO

仅限文件

权限

这个值可以是代表一个或多个 Windows 权限的十六进制值,也可以是一个 smbcacls 别名:

  • 代表一个或多个 Windows 权限的十六进制值。

    下表以十六进制格式显示了高级 Windows 权限及其对应的值:

    表 3.3. 十六进制格式的Windows权限及其相应的smbcacls值
    Windows 权限十六进制值

    全控制

    0x001F01FF

    遍历文件夹 / 执行文件

    0x00100020

    列出文件夹 / 读数据

    0x00100001

    读取属性

    0x00100080

    读取扩展属性

    0x00100008

    创建文件 / 写数据

    0x00100002

    创建文件夹/附加数据

    0x00100004

    写入属性

    0x00100100

    写扩展属性

    0x00100010

    删除子文件夹和文件

    0x00100040

    删除

    0x00110000

    读取权限

    0x00120000

    更改权限

    0x00140000

    获取所有权

    0x00180000

    可以使用位 OR 操作将多个权限组合为一个十六进制值。详情请参阅 ACE 掩码计算

  • smbcacls 别名。下表显示了可用的别名:

    表 3.4. 现有 smbcacls 别名及其对应的 Windows 权限
    smbcacls 别名映射至 Windows 权限

    R

    READ

    读和执行

    W

    特殊:

    • 创建文件 / 写数据
    • 创建文件夹/附加数据
    • 写入属性
    • 写扩展属性
    • 读取权限

    D

    删除

    P

    更改权限

    O

    获取所有权

    X

    遍历 / 执行

    CHANGE

    修改

    FULL

    全控制

    注意

    设置权限时,您可以组合单例别名。例如,您可以设置 RD 来应用 Windows 权限 删除。但是,您既不能组合多个非字母别名,也无法组合别名和十六进制值。

3.10.2. 使用 smbcacls 显示 ACL

要显示 SMB 共享的 ACL,请使用 smbcacls 工具。如果您运行不带任何操作参数的 smbcacls,如 --add,那么工具会显示文件系统对象的 ACL。

流程

例如,列出 //server/example 共享的根目录的 ACL:

# smbcacls //server/example / -U "DOMAIN\administrator"
Enter DOMAIN\administrator's password:
REVISION:1
CONTROL:SR|PD|DI|DP
OWNER:AD\Administrators
GROUP:AD\Domain Users
ACL:AD\Administrator:ALLOWED/OI|CI/FULL
ACL:AD\Domain Users:ALLOWED/OI|CI/CHANGE
ACL:AD\Domain Guests:ALLOWED/OI|CI/0x00100021

命令的输出会显示:

  • REVISION :安全描述符的内部 Windows NT ACL 修订版
  • CONTROL :安全描述符控制
  • OWNER :安全描述符所有者的名称或 SID
  • GROUP :安全描述符组的名称或 SID
  • ACL 条目.详情请参阅 访问控制条目

3.10.3. ACE 掩码计算

在大多数情况下,当添加或更新 ACE 时,您可以使用 现有 smbcacls 别名及其相应的 Windows 权限 中列出的 smbcacls 别名。

但是,如果您要设置 Windows 权限及其相应的 smbcacls 值(十六进制格式) 中列出的高级 Windows 权限,则您必须使用逐位 OR 操作来计算正确的值。您可以使用以下 shell 命令计算值:

# echo $(printf '0x%X' $(( hex_value_1 | hex_value_2 | ... )))

例 3.4. 计算 ACE 掩码

您需要设置以下权限:

  • 遍历文件夹/执行文件(0x00100020)
  • 列出文件夹/读数据(0x00100001)
  • 读属性(0x00100080)

要计算上面权限的十六进制值,请输入:

# echo $(printf '0x%X' $(( 0x00100020 | 0x00100001 | 0x00100080 )))
0x1000A1

设置或更新 ACE 时使用返回的值。

3.10.4. 使用 smbcacls 添加、更新和删除 ACL

根据您传递给 smbcacls 工具的参数,您可以添加、更新和删除文件或目录的 ACL。

添加 ACL

要对 //server/example 共享的根添加ACL,该共享将此文件夹、子文件夹和文件CHANGE 权限赋予 AD\Domain Users 组:

# smbcacls //server/example / -U "DOMAIN\administrator --add ACL:"AD\Domain Users":ALLOWED/OI|CI/CHANGE
更新 ACL

更新 ACL 与添加新的 ACL 类似。您可以使用 --modify 参数和现有的安全主体来覆盖 ACL,以便更新 ACL。如果 smbcacls 在 ACL 列表中找到了安全主体,那么工具会更新这些权限。否则,命令会失败并报错:

ACL for SID principal_name not found

例如,要更新 AD\Domain Users 组的权限,并将其设置为对 此文件夹、子文件夹和文件READ权限,请执行以下操作:

# smbcacls //server/example / -U "DOMAIN\administrator --modify ACL:"AD\Domain Users":ALLOWED/OI|CI/READ
删除 ACL

要删除 ACL,请将带有确切ACL的 --delete 参数传递给 smbcacls 工具。例如:

# smbcacls //server/example / -U "DOMAIN\administrator --delete ACL:"AD\Domain Users":ALLOWED/OI|CI/READ

3.11. 允许用户在 Samba 服务器上共享目录

在 Samba 服务器上,你可以配置用户共享目录,而无需root权限。

3.11.1. 启用用户共享功能

在用户可以共享目录之前,管理员必须在 Samba 中启用用户共享。

例如,仅允许本地 example 组的成员创建用户共享:

流程

  1. 如果本地 example 组不存在,请创建它:

    # groupadd example
  2. 为 Samba 准备目录以存储用户共享定义并正确设置其权限。例如:

    1. 创建目录:

      # mkdir -p /var/lib/samba/usershares/
    2. example 组设置写权限:

      # chgrp example /var/lib/samba/usershares/
      # chmod 1770 /var/lib/samba/usershares/
    3. 设置粘性位以防止用户重命名或删除此目录中其他用户存储的文件。
  3. 编辑 /etc/samba/smb.conf 文件,并将以下内容添加到 [global] 部分:

    1. 设置您配置用来存储用户共享定义的目录的路径。例如:

      usershare path = /var/lib/samba/usershares/
    2. 设置允许在这个服务器上创建多少个用户共享 Samba。例如:

      usershare max shares = 100

      如果您对 usershare max shares 参数使用默认值 0,则用户共享将被禁用。

    3. 可选:设置绝对目录路径列表。例如,要配置 Samba 只允许共享 /data /srv 目录的子目录,请设置:

      usershare prefix allow list = /data /srv

    有关您可以设置的更多用户共享相关参数的列表,请参阅您系统的 smb.conf (5) 手册页中的 USERSHARES 部分。

  4. 验证/etc/samba/smb.conf文件:

    # testparm
  5. 重新载入 Samba 配置:

    # smbcontrol all reload-config

    用户现在可以创建用户共享。

3.11.2. 添加用户共享

在 Samba 中启用了用户共享功能后,用户可以通过运行 net usershare add 命令在 Samba 服务器上共享目录,而无需 root 权限。

net usershare add 命令的说明:

net usershare add share_name path [[ comment ] | [ ACL ]] [ guest_ok=y|n ]

重要

如果在创建用户共享时设置了 ACL,您必须在 ACL 之前指定comment参数。要设置空的comment,请在双引号中使用空字符串。

请注意,如果管理员在 /etc/samba/smb.conf 文件的 [global] 部分中设置了 usershare allow guests = yes,用户只能对用户共享启用 guest访问。

例 3.5. 添加用户共享

用户想要在 Samba 服务器上共享 /srv/samba/ 目录。该共享应命名为 example,未设置任何comment ,应该可以被 guest 用户访问。此外,对 AD\Domain Users 组的共享权限应设置为可完全访问,对其他用户设置为读权限。要添加此共享,请以用户身份运行:

$ net usershare add example /srv/samba/ "" "AD\Domain Users":F,Everyone:R guest_ok=yes

3.11.3. 更新用户共享的设置

要更新用户共享的设置,请使用具有相同共享名称和新设置的 net usershare add 命令覆盖共享。请参阅 添加用户共享

3.11.4. 显示现有用户共享的信息

用户可以在 Samba 服务器上输入 net usershare info 命令,来显示用户共享及其设置。

先决条件

  • 在 Samba 服务器中配置了一个用户共享。

流程

  1. 显示任意用户创建的所有用户共享:

    $ net usershare info -l
    [share_1]
    path=/srv/samba/
    comment=
    usershare_acl=Everyone:R,host_name\user:F,
    guest_ok=y
    ...

    若要只列出运行命令的用户所创建的共享,请省略 -l 参数。

  2. 若要只显示关于特定共享的信息,请将共享名称或通配符传给命令。例如,显示名称以 share_ 开头的共享的信息:

    $ net usershare info -l share_* 

3.11.5. 列出用户共享

如果您想只列出可用的用户共享,而不列出它们的设置,请使用 net usershare list 命令。

先决条件

  • 在 Samba 服务器中配置了一个用户共享。

流程

  1. 列出任意用户创建的共享:

    $ net usershare list -l
    share_1
    share_2
    ...

    若要只列出运行命令的用户所创建的共享,请省略 -l 参数。

  2. 若要只列出特定的共享,请将共享名称或通配符传给命令。例如,只列出名称以 share_ 开头的共享 :

    $ net usershare list -l share_* 

3.11.6. 删除用户共享

要删除用户共享,请以创建共享的用户身份或以 root 用户身份,使用net usershare delete 命令。

先决条件

  • 在 Samba 服务器中配置了一个用户共享。

流程

$ net usershare delete share_name

3.12. 配置共享以允许不进行身份验证的访问

在某些情况下,您想要共享一个用户无需身份验证即可连接到的目录。若要对此进行配置,请对共享启用guest访问。

警告

不需要身份验证的共享可能会造成安全隐患。

3.12.1. 启用对共享的客户机访问

如果对共享启用了 guest 访问,Samba 会将guest连接映射到guest account参数中设置的操作系统帐户。如果至少满足以下条件之一,Guest用户就可以访问此共享上的文件:

  • 该帐户在文件系统 ACL 中列出
  • other 用户的 POSIX 权限允许这样做

例 3.6. 客户端共享权限

如果您将 Samba 配置为将guest帐户映射到 nobody (这是默认值),那么以下示例中的 ACL:

  • 允许 guest 用户读 file1.txt
  • 允许 guest 用户读和修改 file2.txt
  • 防止 guest 用户读或修改 file3.txt
-rw-r--r--. 1 root       root      1024 1. Sep 10:00 file1.txt
-rw-r-----. 1 nobody     root      1024 1. Sep 10:00 file2.txt
-rw-r-----. 1 root       root      1024 1. Sep 10:00 file3.txt

流程

  1. 编辑 /etc/samba/smb.conf 文件:

    1. 如果这是您在这个服务器上设置的第一个客户机共享:

      1. [global] 部分中设置map to guest = Bad User

        [global]
                ...
                map to guest = Bad User

        使用这个设置,Samba 将拒绝使用错误密码的登录尝试,除非用户名不存在。如果指定的用户名不存在,并且对共享启用了 guest 访问,那么 Samba 会将连接视为guest登录。

      2. 默认情况下,Samba 将 guest 帐户映射到 Red Hat Enterprise Linux 上的 nobody 帐户。另外,您也可以设置另外一个帐户。例如:

        [global]
                ...
                guest account = user_name

        此参数中设置的帐户必须在 Samba 服务器中本地存在。出于安全考虑,红帽建议使用没有分配有效 shell 的帐户。

    2. [example] 共享部分中添加 guest ok = yes 设置:

      [example]
              ...
              guest ok = yes
  2. 验证/etc/samba/smb.conf文件:

    # testparm
  3. 重新载入 Samba 配置:

    # smbcontrol all reload-config

3.13. 为 macOS 客户端配置 Samba

fruit 虚拟文件系统(VFS)Samba 模块提供了与 Apple 服务器消息块(SMB)客户端增强了的兼容性。

3.13.1. 优化 Samba 配置,以便为 macOS 客户端提供文件共享

fruit 模块提供了 Samba 与 macOS 客户端的增强的兼容性。您可以为托管在 Samba 服务器上的所有共享配置模块,来为 macOS 客户端优化文件共享。

注意

全局启用 fruit 模块。当客户端建立到服务器的第一个连接时,使用 macOS 的客户端会协商服务器消息块版本 2 (SMB2) Apple (AAPL)协议扩展。如果客户端第一次连接到未启用 AAPL 扩展的共享,那么客户端不会对服务器的任何共享使用扩展。

先决条件

  • Samba 配置为文件服务器。

流程

  1. 编辑 /etc/samba/smb.conf 文件,并在 [global] 部分启用 fruitstreams_xattr VFS 模块:

    vfs objects = fruit streams_xattr
    重要

    在启用 streams_xattr 之前,您必须启用 fruit模块。fruit 模块使用备用数据流(ADS)。因此,您也必须启用 streams_xattr 模块。

  2. 可选: 要在共享上提供 macOS Time Machine 支持,请在 /etc/samba/smb.conf 文件中的共享配置中添加以下设置:

    fruit:time machine = yes
  3. 验证/etc/samba/smb.conf文件:

    # testparm
  4. 重新载入 Samba 配置:

    # smbcontrol all reload-config

其它资源

3.14. 使用 smbclient 实用程序访问 SMB 共享

smbclient 工具可让您访问 SMB 服务器中的文件共享,类似于命令行 FTP 客户端。例如,您可以使用它来向共享上传文件和从共享下载文件。

先决条件

  • samba-client 软件包已安装。

3.14.1. smbclient 互动模式如何工作

例如,使用 DOMAIN\user 帐户对在 server 上托管的example共享进行身份验证:

# smbclient -U "DOMAIN\user" //server/example
Enter domain\user's password:
Try "help" to get a list of possible commands.
smb: \>

smbclient 成功连接到共享后,工具进入互动模式并显示以下提示:

smb: \>

要在互动 shell 中显示所有可用命令,请输入:

smb: \> help

要显示特定命令的帮助信息,请输入:

smb: \> help command_name

其它资源

  • 系统中的 smbclient (1) 手册页

3.14.2. 在互动模式中使用 smbclient

如果您使用不带 -c 参数的 smbclient,那么工具将进入交互模式。下面的步骤演示了如何连接到 SMB 共享并从子目录中下载文件。

流程

  1. 连接到共享:

    # smbclient -U "DOMAIN\user_name" //server_name/share_name
  2. 进到 /example/ 目录:

    smb: \> d /example/
  3. 列出目录中的文件:

    smb: \example\> ls
      .                    D         0  Thu Nov 1 10:00:00 2018
      ..                   D         0  Thu Nov 1 10:00:00 2018
      example.txt          N   1048576  Thu Nov 1 10:00:00 2018
    
             9950208 blocks of size 1024. 8247144 blocks available
  4. 下载 example.txt 文件:

    smb: \example\> get example.txt
    getting file \directory\subdirectory\example.txt of size 1048576 as example.txt (511975,0 KiloBytes/sec) (average 170666,7 KiloBytes/sec)
  5. 从共享断开:

    smb: \example\> exit

3.14.3. 在脚本模式中使用 smbclient

如果将 -c 参数传给 smbclient,那么你可对远程 SMB 共享自动执行命令。这可让您在脚本中使用 smbclient

下面的步骤演示了如何连接到 SMB 共享并从子目录中下载文件。

流程

  • 使用以下命令连接到共享,进到 example 目录,下载 example.txt 文件:
# smbclient -U DOMAIN\user_name //server_name/share_name -c "cd /example/ ; get example.txt ; exit"

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)中提供的文档。

流程

  1. 编辑 /etc/samba/smb.conf 文件:

    1. 添加 [printers] 部分,以在 Samba 中启用打印后端:

      [printers]
              comment = All Printers
              path = /var/tmp/
              printable = yes
              create mask = 0600
      重要

      [printers] 共享名称是写死的,不能更改。

    2. 如果 CUPS 服务器运行在不同的主机或端口,请在 [printers] 部分中指定设置:

      cups server = printserver.example.com:631
    3. 如果您有许多打印机,将空闲秒数设置为高于连接到 CUPS 的打印机数。例如,如果您有 100 台打印机,请在 [global] 部分中设置:

      rpcd_spoolss:idle_seconds = 200

      如果这个设置在您的环境中没有缩放,请在 [global] 部分中增加 rpcd_spools worker 的数量:

      rpcd_spoolss:num_workers = 10

      默认情况下,rpcd_spools 启动 5 个 worker。

  2. 验证/etc/samba/smb.conf文件:

    # testparm
  3. 打开所需的端口,并使用firewall-cmd工具重新加载防火墙配置:

    # firewall-cmd --permanent --add-service=samba
    # firewall-cmd --reload
  4. 重启 smb 服务:

    # systemctl restart smb

    重启服务后,Samba 会自动共享在 CUPS 后端中配置的所有打印机。如果想要仅手动共享特定打印机,请参阅 手动共享特定的打印机

验证

  • 提交打印作业。例如,要打印 PDF 文件,请输入:

    # smbclient -Uuser //sambaserver.example.com/printer_name -c "print example.pdf"

3.15.2. 手动共享特定的打印机

如果您将 Samba 配置为打印服务器,默认情况下,Samba 会共享在 CUPS 后端中配置的所有打印机。以下流程解释了如何只共享特定的打印机。

先决条件

  • Samba 被设置为打印服务器

流程

  1. 编辑 /etc/samba/smb.conf 文件:

    1. [global] 部分中,通过以下设置禁用自动打印机共享:

      load printers = no
    2. 为您要共享的每个打印机添加一段。例如,要在 Samba 中将 CUPS 后端中名为 example 的打印机共享为 Example-Printer,请添加以下部分:

      [Example-Printer]
              path = /var/tmp/
              printable = yes
              printer name = example

      您不需要为每个打印机单独设置 spool 目录。您可以在打印机的path 参数中设置与您在 [printers] 部分中设置的完全相同的 spool 目录。

  2. 验证/etc/samba/smb.conf文件:

    # testparm
  3. 重新载入 Samba 配置:

    # smbcontrol all reload-config

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 主机上本地安装驱动程序。在某些情况下,安装程序会在设置运行期间将单个文件提取到操作系统的临时文件夹中。使用驱动程序文件上传:

    1. 启动安装程序。
    2. 将临时文件夹中的文件复制到新位置。
    3. 取消安装。

请您的打印机厂商提供支持上传到打印服务器的驱动程序。

为客户端提供 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。

流程

  1. 例如,要对 printadmin 组赋予 SePrintOperatorPrivilege 特权:

    # net rpc rights grant "printadmin" SePrintOperatorPrivilege -U "DOMAIN\administrator"
    Enter DOMAIN\administrator's password:
    Successfully granted rights.
    注意

    在域环境中,将 SePrintOperatorPrivilege 赋予域组。这可让您通过更新用户的组成员资格来集中管理特权。

  2. 列出所有被赋予了 SePrintOperatorPrivilege 的用户和组:

    # net rpc rights list privileges SePrintOperatorPrivilege -U "DOMAIN\administrator"
    Enter administrator's password:
    SePrintOperatorPrivilege:
      BUILTIN\Administrators
      DOMAIN\printadmin

3.16.3. 设置 print$ 共享

Windows 操作系统从打印服务器上名为 print$ 的共享中下载打印机驱动程序。这个共享名称在 Windows 中硬编码,无法更改。

以下流程解释了如何将 /var/lib/samba/drivers/ 目录共享为print$,并使本地 printadmin 组成员能够上传打印机驱动程序。

流程

  1. /etc/samba/smb.conf 文件中添加 [print$] 部分:

    [print$]
            path = /var/lib/samba/drivers/
            read only = no
            write list = @printadmin
            force group = @printadmin
            create mask = 0664
            directory mask = 2775

    使用这些设置:

    • 只有 printadmin 组成员才能将打印机驱动程序上传到共享。
    • 新创建的文件和目录的组将被设为 printadmin
    • 新文件的权限将被设置为 664
    • 新目录的权限将被设置为 2775
  2. 要只为所有打印机上传 64 位驱动程序,请在 /etc/samba/smb.conf 文件的 [global] 部分包含此设置:

    spoolss: architecture = Windows x64

    如果没有这个设置,Windows 只显示您上传的至少 32 位版本的驱动程序。

  3. 验证/etc/samba/smb.conf文件:

    # testparm
  4. 重新载入 Samba 配置

    # smbcontrol all reload-config
  5. 如果 printadmin 组不存在,就创建它:

    # groupadd printadmin
  6. SePrintOperatorPrivilege 特权赋予 printadmin 组。

    # net rpc rights grant "printadmin" SePrintOperatorPrivilege -U "DOMAIN\administrator"
    Enter DOMAIN\administrator's password:
    Successfully granted rights.
  7. 如果您在enforcing模式下运行 SELinux,请在目录中设置samba_share_t上下文:

    # semanage fcontext -a -t samba_share_t "/var/lib/samba/drivers(/.*)?"
    
    # restorecon -Rv /var/lib/samba/drivers/
  8. /var/lib/samba/drivers/ 目录设置权限:

    • 如果使用 POSIX ACL,请设置:

      # chgrp -R "printadmin" /var/lib/samba/drivers/
      # chmod -R 2775 /var/lib/samba/drivers/
    • 如果使用 Windows ACL,请设置:

      主体权限适用于

      创建者所有者

      全控制

      只适用于子文件夹和文件

      通过身份验证的用户

      读和执行、列出目录内容、读

      这个文件夹、子文件夹和文件

      printadmin

      全控制

      这个文件夹、子文件夹和文件

      有关在 Windows 上设置 ACL 的详情,请查看 Windows 文档。

3.16.4. 创建 GPO 以启用客户端信任 Samba 打印服务器

出于安全考虑,最近的 Windows 操作系统会阻止客户端从不受信任的服务器下载非包感知的打印机驱动程序。如果您的打印服务器是 AD 中的成员,您可以在域中创建一个组策略对象(GPO)来信任 Samba 服务器。

先决条件

  • Samba 打印服务器是 AD 域的成员。
  • 您用来创建 GPO 的 Windows 计算机必须安装有 Windows 远程服务器管理工具(RSAT)。详情请查看 Windows 文档。

流程

  1. 使用允许编辑组策略的帐户(如 AD 域 Administrator 用户)登录到 Windows 计算机。
  2. 打开 组策略管理控制台
  3. 右键单击 AD 域并选择 创建此域中的 GPO,并链接到此处

    Samba 创建新的 GPO
  4. 为 GPO 输入一个名称,如 Legacy Printer Driver Policy ,并点击 OK。新的 GPO 将在域条目下显示。
  5. 右键单击新创建的 GPO,然后选择 编辑 以打开 组策略管理编辑器
  6. 进入 Computer ConfigurationPoliciesAdministrative TemplatesPrinters

    Samba 选择打印机 GPO 组
  7. 在窗口的右侧,双击 指向和打印限制 来编辑策略:

    1. 启用策略并设置以下选项:

      1. 选择 用户只能指向并打印到这些服务器,再将 Samba 打印服务器的完全限定域名(FQDN)输入到此选项旁边的字段。
      2. 安全提示 下的两个复选框中,选择 不显示警告 或 高程提示

        Samba GPO 点和打印
    2. 点击确定。
  8. 双击 包指向和打印 - 已批准的服务器 来编辑策略:

    1. 启用策略并单击 显示 按钮。
    2. 输入 Samba 打印服务器的 FQDN。

      Samba GPO 批准的服务器
    3. 单击 OK,关闭 显示内容 和策略的属性窗口。
  9. 关闭 组策略管理编辑器
  10. 关闭 组策略管理控制台

在 Windows 域成员应用了组策略后,用户连接到打印机时会自动从 Samba 服务器下载打印机驱动程序。

其它资源

  • 对于使用组策略,请参阅 Windows 文档。

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 仅在 Active Directory(AD)或使用AES密码进行Kerberos身份验证的红帽身份管理(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 模式支持的模式运行。

流程

  1. 在 RHEL 中启用 FIPS 模式:

    # fips-mode-setup --enable
  2. 重启服务器:

    # reboot
  3. 使用 testparm 工具来验证配置:

    # testparm -s

    如果命令显示任何错误或不兼容,请修复它们以确保 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 参数使用默认值。

流程

  1. /etc/samba/smb.conf 文件的 [global] 部分中删除 server max protocol 参数。
  2. 重新载入 Samba 配置

    # smbcontrol all reload-config

3.18.2. 与包含大量文件的目录调整共享

Linux 支持区分大小写的文件名。因此,在搜索或访问文件时,Samba需要针对大小写文件名来扫描目录。您可以将共享配置为只以小写或大写来创建新文件,这可以提高性能。

先决条件

  • Samba 配置为文件服务器

流程

  1. 将共享上的所有文件重命名为小写。

    注意

    使用这个过程中的设置,名称不为小写的文件将不再显示。

  2. 在共享部分中设置以下参数:

    case sensitive = true
    default case = lower
    preserve case = no
    short preserve case = no

    有关参数的详情,请查看您系统的 smb.conf (5) 手册页中的描述。

  3. 验证/etc/samba/smb.conf文件:

    # testparm
  4. 重新载入 Samba 配置:

    # smbcontrol all reload-config

应用了这些设置后,此共享上所有新创建的文件的名称都使用小写。由于这些设置,Samba 不再需要针对大小写来扫描目录,这样可以提高性能。

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。

流程

  1. 编辑 /etc/samba/smb.conf 文件,添加 server min protocol 参数,并将参数设置为服务器应支持的最小 SMB 协议版本。例如,要将 SMB 协议的最小版本设置为 SMB3,请添加:

    server min protocol = SMB3
  2. 重启 smb 服务:

    # systemctl restart smb

其它资源

  • 在您的系统中的 smb.conf (5) 手册页

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 工具自动更新所有涉及的配置文件。

流程

  1. 使用以下设置手动创建 /etc/samba/smb.conf 文件:

    • 对于 AD 域成员:

      [global]
      workgroup = domain_name
      security = ads
      passdb backend = tdbsam
      realm = AD_REALM
    • 对于 NT4 域成员:

      [global]
      workgroup = domain_name
      security = user
      passdb backend = tdbsam
  2. * 默认域和要加入到 /etc/samba/smb.conf 文件中 [global] 部分的域添加 ID 映射配置。
  3. 验证/etc/samba/smb.conf文件:

    # testparm
  4. 以域管理员身份加入域:

    • 加入 AD 域:

      # net ads join -U "DOMAIN\administrator"
    • 要加入 NT4 域:

      # net rpc join -U "DOMAIN\administrator"
  5. winbind 源追加到 /etc/nsswitch.conf 文件中的 passwdgroup 数据库条目中:

    passwd:     files winbind
    group:      files winbind
  6. 启用并启动 winbind 服务:

    # systemctl enable --now winbind
  7. 可选:使用 authselect 工具配置 PAM。

    详情请查看您系统中的 authselect (8) 手册页。

  8. 可选: 对于 AD 环境,配置 Kerberos 客户端。

    详情请查看您的 Kerberos 客户端文档。

3.20.2. 使用 net rpc right 命令

在 Windows 中,您可以为帐户和组分配特权来执行特殊操作,如对共享设置 ACL 或上传打印机驱动程序。在 Samba 服务器上,您可以使用 net rpc permissions 命令来管理特权。

列出您可以设置的权限

若要列出所有可用的特权及其所有者,可使用 net rpc permissions list 命令。例如:

# net rpc rights list -U "DOMAIN\administrator"
Enter DOMAIN\administrator's password:
     SeMachineAccountPrivilege  Add machines to domain
      SeTakeOwnershipPrivilege  Take ownership of files or other objects
             SeBackupPrivilege  Back up files and directories
            SeRestorePrivilege  Restore files and directories
     SeRemoteShutdownPrivilege  Force shutdown from a remote system
      SePrintOperatorPrivilege  Manage printers
           SeAddUsersPrivilege  Add users and groups to the domain
       SeDiskOperatorPrivilege  Manage disk shares
           SeSecurityPrivilege  System security
授予权限

若要为帐户或组赋予特权,可使用 net rpc rights grant 命令。

例如,将SePrintOperatorPrivilege 特权赋予 DOMAIN\printadmin 组 :

# 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"
Enter DOMAIN\administrator's password:
Successfully revoked rights.

3.20.3. 使用 net rpc share 命令

net rpc share 命令提供了在本地或远程 Samba 或 Windows 服务器上列出、添加和删除共享的功能。

列出共享

若要列出 SMB 服务器上的共享,请使用 net rpc share list 命令。(可选)将 -S server_name 参数传给命令,以列出远程服务器的共享。例如:

# net rpc share list -U "DOMAIN\administrator" -S server_name
Enter DOMAIN\administrator's password:
IPC$
share_1
share_2
...
注意

/etc/samba/smb.conf 文件中设置了 browseable = no 的、托管在 Samba 服务器上的共享不会显示在输出中。

添加共享

net rpc share add 命令允许您向 SMB 服务器添加共享。

例如,要在共享 C:\example\ 目录的远程 Windows 服务器中添加一个名为 example 的共享:

# net rpc share add example="C:\example" -U "DOMAIN\administrator" -S server_name
注意

在指定 Windows 目录名称时,您必须省略路径中的结尾反斜杠。

使用命令在 Samba 服务器中添加共享:

  • -U 参数中指定的用户必须拥有在目标服务器上赋予了 SeDiskOperatorPrivilege 的特权。
  • 您必须编写一个脚本,其在 /etc/samba/smb.conf 文件中添加共享部分,并重新加载 Samba 。该脚本必须在 /etc/samba/smb.conf[global] 部分中的 add share command 参数中设置。详情请查看您系统的 smb.conf (5) 手册页中的 add share command 描述。
删除共享

net rpc share delete 命令允许您从 SMB 服务器中删除共享。

例如,要从远程 Windows 服务器中删除名为 example 的共享:

# net rpc share delete example -U "DOMAIN\administrator" -S server_name

使用命令从 Samba 服务器中删除共享:

  • -U 参数中指定的用户必须被赋予了 SeDiskOperatorPrivilege 特权。
  • 您必须编写一个脚本,其从 /etc/samba/smb.conf 文件中删除共享的部分,并重新加载 Samba 。该脚本必须在 /etc/samba/smb.conf[global] 部分中的 delete share command 参数中设置。详情请查看您系统的 smb.conf (5) 手册页中的 delete share command 描述。

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"

列出 NT4 域中的所有用户:

# net rpc user -U "DOMAIN\administrator"
在域中添加用户帐户

在 Samba 域成员中,您可以使用 net user add 命令将用户帐户添加到域。

例如,将 user 账户添加到域:

  1. 添加帐户:

    # net user add user password -U "DOMAIN\administrator"
    User user added
  2. 可选: 使用远程过程调用(RPC) shell 来启用 AD DC 或 NT4 PDC 上的帐户。例如:

    # net rpc shell -U DOMAIN\administrator -S DC_or_PDC_name
    Talking to domain DOMAIN (S-1-5-21-1424831554-512457234-5642315751)
    
    net rpc> user edit disabled user: no
    Set user's disabled flag from [yes] to [no]
    
    net rpc> exit
从域中删除用户帐户

对于 Samba 域成员,您可以使用 net user delete 命令从域中删除用户帐户。

例如,从域中删除 user 账户:

# 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"'
    Enter DOMAIN\administrators password:
    Successfully set printer_name to driver driver_name.
  • 检索有关 SMB 服务器的信息。

    例 3.8. 列出所有文件共享和共享的打印机

    # rpcclient server_name -U "DOMAIN\administrator" -c 'netshareenum'
    Enter DOMAIN\administrators password:
    netname: Example_Share
    	remark:
    	path:   C:\srv\samba\example_share\
    	password:
    netname: Example_Printer
    	remark:
    	path:   C:\var\spool\samba\
    	password:
  • 使用安全帐户管理器远程(SAMR)协议来执行操作。

    例 3.9. 在 SMB 服务器中列出用户

    # rpcclient server_name -U "DOMAIN\administrator" -c 'enumdomusers'
    Enter DOMAIN\administrators password:
    user:[user1] rid:[0x3e8]
    user:[user2] rid:[0x3e9]

    如果您针对独立服务器或域成员运行命令,它将列出本地数据库中的用户。针对 AD DC 或 NT4 PDC 运行命令列出域用户。

其它资源

  • 您系统上的 rpcclient (1) 手册页

3.20.6. 使用 samba-regedit 应用程序

某些设置(如打印机配置)存储在 Samba 服务器上的注册表中。您可以使用基于 ncurses 的 samba-regedit 应用程序来编辑 Samba 服务器的注册表。

samba regedit

先决条件

  • samba-client 软件包已安装。

流程

要启动应用程序,请输入:

# samba-regedit

使用以下键:

  • 上键和下键:在注册表树和值中进行导航。
  • Enter:打开关键字或编辑值。
  • 选项卡 :在 KeyValue 窗格间切换。
  • Ctrl+C:关闭应用程序。

3.20.7. 使用 smbcontrol 工具

smbcontrol 工具允许您向 smbdnmbdwinbindd 或 所有这些服务发送命令消息。这些控制消息指示服务重新载入其配置。

先决条件

  • samba-common-tools 软件包已安装。

流程

  • 通过将 reload-config 消息类型发送到 所有 目的地,来重新载入 smbdnmbdwinbindd 服务的配置:
# smbcontrol all reload-config

其它资源

  • 系统中的 smbcontrol (1) 手册页

3.20.8. 使用 smbpasswd 工具

smbpasswd 工具管理本地 Samba 数据库中的用户帐户和密码。

先决条件

  • samba-common-tools 软件包已安装。

流程

  1. 如果您以用户身份运行命令,smbpasswd 将修改运行命令的用户的 Samba 密码。例如:

    [user@server ~]$ smbpasswd
    New SMB password: password
    Retype new SMB password: password
  2. 如果以 root 用户身份运行 smbpasswd,例如,您可以使用该工具来:

    • 创建一个新用户:

      [root@server ~]# smbpasswd -a user_name
      New SMB password: password
      Retype new SMB password: password
      Added user user_name.
      注意

      在将用户添加到 Samba 数据库之前,您必须先在本地操作系统中创建帐户。请参阅配置基本系统设置指南中的 从命令行添加新用户 部分。

    • 启用 Samba 用户:

      [root@server ~]# smbpasswd -e user_name
      Enabled user user_name.
    • 禁用 Samba 用户:

      [root@server ~]# smbpasswd -x user_name
      Disabled user user_name
    • 删除用户:

      [root@server ~]# smbpasswd -x user_name
      Deleted user user_name.

其它资源

  • 您系统上的 smbpasswd (8) 手册页

3.20.9. 使用 smbstatus 工具

smbstatus 工具报告,关于:

  • 每个 smbd 守护进程的每个 PID 到 Samba 服务器的连接。此报告包括用户名、主组群、SMB 协议版本、加密和签名信息。
  • 每个 Samba 共享的连接。此报告包括 smbd 守护进程的 PID、连接机器的 IP、连接建立的时间戳、加密和签名信息。
  • 锁定文件列表。报告条目包括更多详情,如 Opportunistic lock(oplock)类型

先决条件

  • samba 软件包已安装。
  • smbd 服务在运行。

流程

# smbstatus

Samba version 4.15.2
PID  Username              Group                Machine                            Protocol Version  Encryption  Signing
....-------------------------------------------------------------------------------------------------------------------------
963  DOMAIN\administrator  DOMAIN\domain users  client-pc  (ipv4:192.0.2.1:57786)  SMB3_02           -           AES-128-CMAC

Service  pid  Machine    Connected at                  Encryption  Signing:
....---------------------------------------------------------------------------
example  969  192.0.2.1  Thu Nov  1 10:00:00 2018 CEST  -           AES-128-CMAC

Locked files:
Pid  Uid    DenyMode   Access    R/W     Oplock      SharePath           Name      Time
....--------------------------------------------------------------------------------------------------------
969  10000  DENY_WRITE 0x120089  RDONLY  LEASE(RWH)  /srv/samba/example  file.txt  Thu Nov  1 10:00:00 2018

其它资源

  • 系统上的 smbstatus (1) 手册页

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 (1) 手册页

3.20.11. 使用 wbinfo 工具

wbinfo 工具查询并返回 winbindd 服务创建和使用的信息。

先决条件

  • samba-winbind-clients 软件包已安装。

流程

例如,您可以使用 wbinfo 来:

  • 列出域用户:

    # wbinfo -u
    AD\administrator
    AD\guest
    ...
  • 列出域组:

    # wbinfo -g
    AD\domain computers
    AD\domain admins
    AD\domain users
    ...
  • 显示用户的 SID:

    # wbinfo --name-to-sid="AD\administrator"
    S-1-5-21-1762709870-351891212-3141221786-500 SID_USER (1)
  • 显示域和信任的信息:

    # wbinfo --trusted-domains --verbose
    Domain Name   DNS Domain            Trust Type  Transitive  In   Out
    BUILTIN                             None        Yes         Yes  Yes
    server                              None        Yes         Yes  Yes
    DOMAIN1       domain1.example.com   None        Yes         Yes  Yes
    DOMAIN2       domain2.example.com   External    No          Yes  Yes

其它资源

  • 系统中的 wbinfo (1) 手册页

3.21. 其它资源

第 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 软件包。

其它资源

  • 您系统的 named (8) 手册页中的 Red Hat SELinux BIND security profile 部分

4.2. BIND 管理员参考手册

bind 软件包中包括的综合 BIND 管理员参考手册

  • 配置示例
  • 有关高级功能的文档
  • 配置参考
  • 安全考虑

要在安装了 bind 软件包的主机上显示 BIND Administrator Reference Manual,请在浏览器中打开 /usr/share/doc/bind/Bv9ARM.html 文件。

4.3. 将 BIND 配置为缓存 DNS 服务器

默认情况下,BIND DNS 服务器解析和缓存成功并失败的查找。随后,服务会从其缓存中应答相同记录的请求。这可显著提高 DNS 查找速度。

先决条件

  • 服务器的 IP 地址是静态的。

流程

  1. 安装 bindbind-utils 软件包:

    # yum install bind bind-utils

    这些软件包提供 BIND 9.11。如果您需要 BIND 9.16,请安装 bind9.16bind9.16-utils 软件包。

  2. 如果要在 change-root 环境中运行 BIND,请安装 bind-chroot 软件包:

    # yum install bind-chroot

    请注意,在 SELinux 处于 enforcing 模式(默认设置)的主机上运行 BIND 更为安全。

  3. 编辑 /etc/named.conf 文件,并在 options 语句中进行以下更改:

    1. 更新 listen-onlisten-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; };
    2. 更新 allow-query 语句,以配置哪些 IP 地址和范围客户端可以查询此 DNS 服务器:

      allow-query { localhost; 192.0.2.0/24; 2001:db8:1::/64; };
    3. 添加 allow-recursion 语句,以定义 BIND 接受递归查询的 IP 地址和范围:

      allow-recursion { localhost; 192.0.2.0/24; 2001:db8:1::/64; };
      警告

      不要在服务器的公共 IP 地址中递归。否则,服务器可能会成为大规模 DNS 扩大攻击的一部分。

    4. 默认情况下,BIND 通过将从根服务器递归查询到权威 DNS 服务器来解析查询。或者,您可以将 BIND 配置为将查询转发到其他 DNS 服务器,比如您的供应商之一。在这种情况下,添加一个带有 BIND 应该转发查询的 DNS 服务器的 IP 地址列表的 forwarders 语句:

      forwarders { 198.51.100.1; 203.0.113.5; };

      作为回退行为,如果转发器服务器没有响应,BIND 会以递归方式解析查询。要禁用此行为,请添加 forward only; 语句。

  4. 验证 /etc/named.conf 文件的语法:

    # named-checkconf

    如果命令没有显示输出,则语法为正确的。

  5. 更新 firewalld 规则,以允许传入的 DNS 流量:

    # firewall-cmd --permanent --add-service=dns
    # firewall-cmd --reload
  6. 启动并启用 BIND:

    # systemctl enable --now named

    如果要在 change-root 环境中运行 BIND,请使用 systemctl enable --now named-chroot 命令启用并启动该服务。

验证

  1. 使用新设置 DNS 服务器解析域:

    # dig @localhost www.example.org
    ...
    www.example.org.    86400    IN    A    198.51.100.34
    
    ;; Query time: 917 msec
    ...

    本例假定 BIND 在同一主机上运行并响应 localhost 接口上的查询。

    在第一次查询记录后,BIND 会将条目添加到其缓存中。

  2. 重复前面的查询:

    # dig @localhost www.example.org
    ...
    www.example.org.    85332    IN    A    198.51.100.34
    
    ;; Query time: 1 msec
    ...

    由于对条目进行了缓存,进一步对相同记录的请求会非常快,直到条目过期为止。

后续步骤

  • 配置网络中的客户端来使用此 DNS 服务器。如果 DHCP 服务器向客户端提供 DNS 服务器设置,请相应地更新 DHCP 服务器的配置。

其它资源

4.4. 在 BIND DNS 服务器中配置日志记录

默认 /etc/named.conf 文件中的配置(如 bind 软件包提供)使用 default_debug 通道,并将消息记录到 /var/named/data/named.run 文件中。default_debug 频道仅在服务器的 debug 级别为零时记录条目。

使用不同的频道和类别,您可以将 BIND 配置为将具有定义的严重性的不同事件写入单独的文件。

先决条件

  • 已配置了 BIND,例如作为缓存名称服务器。
  • namednamed-chroot 服务正在运行。

流程

  1. 编辑 /etc/named.conf 文件,并将 categorychannel 添加到 logging 语句中,例如:

    logging {
        ...
    
        category notify { zone_transfer_log; };
        category xfer-in { zone_transfer_log; };
        category xfer-out { zone_transfer_log; };
        channel zone_transfer_log {
            file "/var/named/log/transfer.log" versions 10 size 50m;
            print-time yes;
            print-category yes;
            print-severity yes;
            severity info;
         };
    
         ...
    };

    使用这个示例配置,BIND 会记录与区域传送相关的消息,到 /var/named/log/transfer.log。BIND 创建最多 10 个日志文件版本,如果它们达到 50 MB 的最大大小,则轮转它们。

    category 定义了 BIND 向哪些频道发送类别信息。

    channel 定义了日志消息的目的地,包括版本数量、最大文件大小以及 BIND 应记录到频道的严重性等级。其他设置(如启用日志的时间戳、类别和严重性)是可选的,但可用于调试目的。

  2. 如果不存在,创建日志目录,并为 named 用户授予对这个目录的写权限:

    # mkdir /var/named/log/
    # chown named:named /var/named/log/
    # chmod 700 /var/named/log/
  3. 验证 /etc/named.conf 文件的语法:

    # named-checkconf

    如果命令没有显示输出,则语法为正确的。

  4. 重启 BIND:

    # systemctl restart named

    如果在 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

其它资源

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,例如作为缓存名称服务器。
  • namednamed-chroot 服务正在运行。

流程

  1. 编辑 /etc/named.conf 文件并进行以下更改:

    1. acl 语句添加到文件中。例如,要为 127.0.0.1192.0.2.0/242001: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; };
    2. 在支持它们的声明中使用 ACL 的别名,例如:

      allow-query { internal-networks; dmz-networks; };
      allow-recursion { internal-networks; };
  2. 验证 /etc/named.conf 文件的语法:

    # named-checkconf

    如果命令没有显示输出,则语法为正确的。

  3. 重新载入 BIND:

    # systemctl reload named

    如果在 change-root 环境中运行 BIND,请使用 systemctl reload named-chroot 命令来重新加载该服务。

验证

  • 执行操作,以触发使用配置的 ACL 的功能。例如,此流程中的 ACL 只允许来自定义的 IP 地址的递归查询。在这种情况下,在不属于 ACL 定义的主机上输入以下命令来尝试解析外部域:

    # dig +short @192.0.2.1 www.example.com

    如果命令没有返回任何输出,BIND 拒绝访问,且 ACL 可以正常工作。有关客户端的详细输出,请使用不带 +short 选项的命令:

    # dig @192.0.2.1 www.example.com
    ...
    ;; WARNING: recursion requested but not available
    ...

其它资源

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

为提高可读性,管理员通常将区域文件中的记录分成多行,其中包含以分号(;)开头的注释。请注意,如果您分割 SOA 记录,圆括号将记录保留在一起:

@ IN SOA ns1.example.com. hostmaster.example.com. (
                          2022070601 ; serial number
                          1d         ; refresh period
                          3h         ; retry period
                          3d         ; expire time
                          3h )       ; minimum TTL
重要

请注意完全限定域名 (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 小时。

其它资源

  • RFC 1035: 域名 - 实现和规格
  • RFC 1034 :域名 - 概念和功能
  • RFC 2308 :DNS 查询 (DNS 缓存) 的 Negative 缓存

4.6.2. 在 BIND 主服务器上设置转发区

转发区域将名称映射到 IP 地址和其他信息。例如,如果您负责域 example.com,您可以在 BIND 中设置转发区来解析名称,如 www.example.com

先决条件

  • 已配置了 BIND,例如作为缓存名称服务器。
  • namednamed-chroot 服务正在运行。

流程

  1. /etc/named.conf 文件中添加区定义:

    zone "example.com" {
        type master;
        file "example.com.zone";
        allow-query { any; };
        allow-transfer { none; };
    };

    这些设置定义:

    • 此服务器作为 example.com 区域的主服务器 (类型 master)。
    • /var/named/example.com.zone 文件是区域文件。如果您设置了相对路径,如本例中所示,这个路径相对于您在 options 语句中的目录中创建的 directory 相对。
    • 任何主机都可以查询此区域。另外,还可指定 IP 范围或 BIND 访问控制列表 (ACL) 别名来限制访问。
    • 没有主机可以传输区域。仅在设置次要服务器并且仅为次要服务器的 IP 地址时才允许区域传送。
  2. 验证 /etc/named.conf 文件的语法:

    # named-checkconf

    如果命令没有显示输出,则语法为正确的。

  3. 使用以下内容创建 /var/named/example.com.zone 文件:

    $TTL 8h
    @ IN SOA ns1.example.com. hostmaster.example.com. (
                              2022070601 ; serial number
                              1d         ; refresh period
                              3h         ; retry period
                              3d         ; expire time
                              3h )       ; minimum TTL
    
                      IN NS   ns1.example.com.
                      IN MX   10 mail.example.com.
    
    www               IN A    192.0.2.30
    www               IN AAAA 2001:db8:1::30
    ns1               IN A    192.0.2.1
    ns1               IN AAAA 2001:db8:1::1
    mail              IN A    192.0.2.20
    mail              IN AAAA 2001:db8:1::20

    这个区域文件:

    • 将资源记录的默认生存时间 (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.comns1.example.com
  4. 在区域文件上设置安全权限,仅允许 named 组读取它:

    # chown root:named /var/named/example.com.zone
    # chmod 640 /var/named/example.com.zone
  5. 验证 /var/named/example.com.zone 文件的语法:

    # named-checkzone example.com /var/named/example.com.zone
    zone example.com/IN: loaded serial 2022070601
    OK
  6. 重新载入 BIND:

    # systemctl reload named

    如果在 change-root 环境中运行 BIND,请使用 systemctl reload named-chroot 命令来重新加载该服务。

验证

  • example.com 区域查询不同的记录,并验证输出是否与您在区域文件中配置的记录匹配:

    # dig +short @localhost AAAA www.example.com
    2001:db8:1::30
    
    # dig +short @localhost NS example.com
    ns1.example.com.
    
    # dig +short @localhost A ns1.example.com
    192.0.2.1

    本例假定 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,例如作为缓存名称服务器。
  • namednamed-chroot 服务正在运行。

流程

  1. /etc/named.conf 文件中添加区定义:

    zone "2.0.192.in-addr.arpa" {
        type master;
        file "2.0.192.in-addr.arpa.zone";
        allow-query { any; };
        allow-transfer { none; };
    };

    这些设置定义:

    • 此服务器作为 2.0.192.in-addr.arpa 反向区域的主服务器(type master)。
    • /var/named/2.0.192.in-addr.arpa.zone 文件是区域文件。如果您设置了相对路径,如本例中所示,这个路径相对于您在 options 语句中的目录中创建的 directory 相对。
    • 任何主机都可以查询此区域。另外,还可指定 IP 范围或 BIND 访问控制列表 (ACL) 别名来限制访问。
    • 没有主机可以传输区域。仅在设置次要服务器并且仅为次要服务器的 IP 地址时才允许区域传送。
  2. 验证 /etc/named.conf 文件的语法:

    # named-checkconf

    如果命令没有显示输出,则语法为正确的。

  3. 使用以下内容创建 /var/named/2.0.192.in-addr.arpa.zone 文件:

    $TTL 8h
    @ IN SOA ns1.example.com. hostmaster.example.com. (
                              2022070601 ; serial number
                              1d         ; refresh period
                              3h         ; retry period
                              3d         ; expire time
                              3h )       ; minimum TTL
    
                      IN NS   ns1.example.com.
    
    1                 IN PTR  ns1.example.com.
    30                IN PTR  www.example.com.

    这个区域文件:

    • 将资源记录的默认生存时间 (TTL) 值设置为 8 小时。如果没有时间后缀(例如没有使用 h 指定小时),BIND 会将该值解析为秒。
    • 包含所需的 SOA 资源记录,以及有关该区域的详细信息。
    • ns1.example.com 设置为此反向区域的权威 DNS 服务器。要正常工作,区域需要至少一个域名服务器 (NS) 记录。但是,若要与 RFC 1912 兼容,您需要至少有两个域名服务器。
    • 设置 192.0.2.1192.0.2.30 地址的指针(PTR)记录。
  4. 在区域文件上设置安全权限,仅允许 named 组读取它:

    # chown root:named /var/named/2.0.192.in-addr.arpa.zone
    # chmod 640 /var/named/2.0.192.in-addr.arpa.zone
  5. 验证 /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
    OK
  6. 重新载入 BIND:

    # systemctl reload named

    如果在 change-root 环境中运行 BIND,请使用 systemctl reload named-chroot 命令来重新加载该服务。

验证

  • 从反向区查询不同的记录,并验证输出是否与您在区域文件中配置的记录匹配:

    # dig +short @localhost -x 192.0.2.1
    ns1.example.com.
    
    # dig +short @localhost -x 192.0.2.30
    www.example.com.

    本例假定 BIND 在同一主机上运行并响应 localhost 接口上的查询。

4.6.4. 更新 BIND 区文件

在某些情况下,例如,如果服务器的 IP 地址有变化,您必须更新区域文件。如果多个 DNS 服务器负责某个区,则仅在主服务器中执行这个步骤。存储区域副本的其他 DNS 服务器将通过区域传送接收更新。

先决条件

  • zone 被配置。
  • namednamed-chroot 服务正在运行。

流程

  1. 可选:识别 /etc/named.conf 文件中的区文件的路径:

    options {
        ...
        directory       "/var/named";
    }
    
    zone "example.com" {
        ...
        file "example.com.zone";
    };

    您可以在区域定义的 file 指令中找到到区域文件的路径。相对路径相对于 options 语句中的 directory 设置的相对路径。

  2. 编辑区域文件:

    1. 进行必要的更改。
    2. 在 SOA 记录中递增序列号。

      重要

      如果序列号等于或低于先前值,次要服务器不会更新其区域的副本。

  3. 验证区文件的语法:

    # named-checkzone example.com /var/named/example.com.zone
    zone example.com/IN: loaded serial 2022062802
    OK
  4. 重新载入 BIND:

    # systemctl reload named

    如果在 change-root 环境中运行 BIND,请使用 systemctl reload named-chroot 命令来重新加载该服务。

验证

  • 查询您添加、修改或删除的记录,例如:

    # dig +short @localhost A ns2.example.com
    192.0.2.2

    本例假定 BIND 在同一主机上运行并响应 localhost 接口上的查询。

4.6.5. 使用自动密钥生成和区维护功能进行 DNSSEC 区域签名

您可以使用域名系统安全扩展 (DNSSEC) 为区域签名,以确保身份验证和数据完整性。此类区域包含额外的资源记录。客户端可以使用它们来验证区域信息的真实性。

如果您为区启用 DNSSEC 策略功能,BIND 会自动执行以下操作:

  • 创建密钥
  • 为区域签名
  • 维护区域,包括重新签名并定期替换密钥。
重要

要启用外部 DNS 服务器以验证区的真实性,您必须在父区中添加该区域的公钥。请联系您的域供应商或 registry,以了解更多有关如何完成此操作的详细信息。

此流程使用 BIND 中的内置 default DNSSEC 策略。这个策略使用单一 ECDSAP256SHA 密钥签名。另外,还可创建自己的策略来使用自定义密钥、算法和计时。

先决条件

  • 已安装 BIND 9.16 或更高版本。要满足此要求,请安装 bind9.16 软件包,而不是 bind
  • 配置您要启用 DNSSEC 的区域。
  • namednamed-chroot 服务正在运行。
  • 服务器可将时间与时间服务器同步。对于 DNSSEC 验证,系统时间准确非常重要。

流程

  1. 编辑 /etc/named.conf 文件,并将 dnssec-policy default; 添加到您要启用 DNSSEC 的区域:

    zone "example.com" {
        ...
        dnssec-policy default;
    };
  2. 重新载入 BIND:

    # systemctl reload named

    如果在 change-root 环境中运行 BIND,请使用 systemctl reload named-chroot 命令来重新加载该服务。

  3. BIND 将公钥存储在 /var/named/K<zone_name>.+<algorithm>+<key_ID>.key 文件中。使用此文件显示区的公钥,格式为父区所需的格式:

    • DS 记录格式:

      # dnssec-dsfromkey /var/named/Kexample.com.+013+61141.key
      example.com. IN DS 61141 13 2 3E184188CF6D2521EDFDC3F07CFEE8D0195AACBD85E68BAE0620F638B4B1B027
    • DNSKEY 格式:

      # grep DNSKEY /var/named/Kexample.com.+013+61141.key
      example.com. 3600 IN DNSKEY 257 3 13 sjzT3jNEp120aSO4mPEHHSkReHUf7AABNnT8hNRTzD5cKMQSjDJin2I3 5CaKVcWO1pm+HltxUEt+X9dfp8OZkg==
  4. 请求将区域的公钥添加到父区。请联系您的域供应商或 registry,以了解更多有关如何完成此操作的详细信息。

验证

  1. 从启用了 DNSSEC 签名的区域查询您自己的 DNS 服务器:

    # 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==

    本例假定 BIND 在同一主机上运行并响应 localhost 接口上的查询。

  2. 在将公钥添加到父区并传播到其他服务器后,验证服务器是否将查询上的身份验证数据(ad)标记设置为已签名区域:

    #  dig @localhost example.com +dnssec
    ...
    ;; flags: qr rd ra ad; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
    ...

4.7. 在 BIND DNS 服务器中配置区传输

区域传送可确保所有具有区域副本的 DNS 服务器均使用最新数据。

先决条件

  • 在未来的主服务器中,已配置要设置区域传送的区域。
  • 在未来的次要服务器上,已配置 BIND,例如作为缓存名称服务器。
  • 在两个服务器上,namednamed-chroot 服务正在运行。

流程

  1. 在现有主服务器中:

    1. 创建一个共享密钥,并将其附加到 /etc/named.conf 文件中:

      # tsig-keygen example-transfer-key | tee -a /etc/named.conf
      key "example-transfer-key" {
              algorithm hmac-sha256;
              secret "q7ANbnyliDMuvWgnKOxMLi313JGcTZB5ydMW5CyUGXQ=";
      };

      这个命令显示 tsig-keygen 命令的输出,并自动将其附加到 /etc/named.conf 中。

      稍后,在次要服务器上,您还需要命令的输出。

    2. 编辑 /etc/named.conf 文件中的区定义:

      1. allow-transfer 语句中,定义服务器必须提供 example-transfer-key 语句中指定的密钥来传输区:

        zone "example.com" {
            ...
            allow-transfer { key example-transfer-key; };
        };

        另外,在 allow-transfer 语句中使用 BIND 访问控制列表 (ACL) 别名。

      2. 默认情况下,在更新区域后,BIND 会通知所有在区中有名称服务器 (NS) 记录的域名服务器。如果您不计划为二级服务器添加 NS 记录,您可以配置 BIND 通知这个服务器。为此,请将这个次要服务器的 IP 地址添加 also-notify 声明到区:

        zone "example.com" {
            ...
            also-notify { 192.0.2.2; 2001:db8:1::2; };
        };
    3. 验证 /etc/named.conf 文件的语法:

      # named-checkconf

      如果命令没有显示输出,则语法为正确的。

    4. 重新载入 BIND:

      # systemctl reload named

      如果在 change-root 环境中运行 BIND,请使用 systemctl reload named-chroot 命令来重新加载该服务。

  2. 在未来的次要服务器中:

    1. 按如下方式编辑 /etc/named.conf 文件:

      1. 添加与主服务器相同的密钥定义:

        key "example-transfer-key" {
                algorithm hmac-sha256;
                secret "q7ANbnyliDMuvWgnKOxMLi313JGcTZB5ydMW5CyUGXQ=";
        };
      2. /etc/named.conf 文件中添加区定义:

        zone "example.com" {
            type slave;
            file "slaves/example.com.zone";
            allow-query { any; };
            allow-transfer { none; };
            masters {
              192.0.2.1 key example-transfer-key;
              2001:db8:1::1 key example-transfer-key;
            };
        };

        这些设置状态:

        • 此服务器是 example.com 区域的次要服务器 (type slave)。
        • /var/named/slaves/example.com.zone 文件是区域文件。如果您设置了相对路径,如本例中所示,这个路径相对于您在 options 语句中的目录中创建的 directory 相对。要隔离此服务器从属的区域文件,您可以将它们存储在 /var/named/slaves/ 目录中。
        • 任何主机都可以查询此区域。另外,还可指定 IP 范围或 ACL 别名来限制访问。
        • 没有主机可以从该服务器传输区域。
        • 此区域的主服务器的 IP 地址是 192.0.2.12001:db8:1::2。或者,您可以指定 ACL 别名。此次要服务器将使用名为 example-transfer-key 的键向主服务器进行身份验证。
    2. 验证 /etc/named.conf 文件的语法:

      # named-checkconf
    3. 重新载入 BIND:

      # systemctl reload named

      如果在 change-root 环境中运行 BIND,请使用 systemctl reload named-chroot 命令来重新加载该服务。

  3. 可选:修改主服务器上的区域文件,并为新的次要服务器添加一个 NS 记录。

验证

在次要服务器中:

  1. 显示 named 服务的 systemd 日志条目:

    # journalctl -u named
    ...
    Jul 06 15:08:51 ns2.example.com named[2024]: zone example.com/IN: Transfer started.
    Jul 06 15:08:51 ns2.example.com named[2024]: transfer of 'example.com/IN' from 192.0.2.1#53: connected using 192.0.2.2#45803
    Jul 06 15:08:51 ns2.example.com named[2024]: zone example.com/IN: transferred serial 2022070101
    Jul 06 15:08:51 ns2.example.com named[2024]: transfer of 'example.com/IN' from 192.0.2.1#53: Transfer status: success
    Jul 06 15:08:51 ns2.example.com named[2024]: transfer of 'example.com/IN' from 192.0.2.1#53: Transfer completed: 1 messages, 29 records, 2002 bytes, 0.003 secs (667333 bytes/sec)

    如果在 change-root 环境中运行 BIND,请使用 journalctl -u named-chroot 命令显示日志条目。

  2. 验证 BIND 创建了区域文件:

    # ls -l /var/named/slaves/
    total 4
    -rw-r--r--. 1 named named 2736 Jul  6 15:08 example.com.zone

    请注意,默认情况下,次要服务器以二进制原始格式存储区域文件。

  3. 从次要服务器查询传输的区的记录:

    # dig +short @192.0.2.2 AAAA www.example.com
    2001:db8:1::30

    本例假定您在此流程中设置的次要服务器侦听 IP 地址 192.0.2.2

4.8. 在 BIND 中配置响应策略区以覆盖 DNS 记录

使用 DNS 块和过滤,管理员可以重写 DNS 响应来阻止对某些域或主机的访问。在 BIND 中,响应策略区域 (RPZ) 提供此功能。您可以为受阻条目配置不同的操作,如返回 NXDOMAIN 错误或不响应查询。

如果您的环境中有多个 DNS 服务器,请使用此流程在主服务器上配置 RPZ,稍后配置区传输以在您的次要服务器上提供 RPZ。

先决条件

  • 已配置了 BIND,例如作为缓存名称服务器。
  • namednamed-chroot 服务正在运行。

流程

  1. 编辑 /etc/named.conf 文件并进行以下更改:

    1. options 语句中添加 response-policy 定义:

      options {
          ...
      
          response-policy {
              zone "rpz.local";
          };
      
          ...
      }

      您可以在 response-policyzone 语句中为 RPZ 设置自定义名称。但是,在下一步中,您必须在区定义中使用相同的名称。

    2. 为您在上一步中设置的 RPZ 添加 zone 定义:

      zone "rpz.local" {
          type master;
          file "rpz.local";
          allow-query { localhost; 192.0.2.0/24; 2001:db8:1::/64; };
          allow-transfer { none; };
      };

      这些设置状态:

      • 此服务器是名为 rpz.local 的 RPZ 的主服务器 (type master)。
      • /var/named/rpz.local 文件是区域文件。如果您设置了相对路径,如本例中所示,这个路径相对于您在 options 语句中的目录中创建的 directory 相对。
      • allow-query 中定义的任何主机都可以查询此 RPZ。另外,还可指定 IP 范围或 BIND 访问控制列表 (ACL) 别名来限制访问。
      • 没有主机可以传输区域。仅在设置次要服务器并且仅为次要服务器的 IP 地址时才允许区域传送。
  2. 验证 /etc/named.conf 文件的语法:

    # named-checkconf

    如果命令没有显示输出,则语法为正确的。

  3. 使用以下内容创建 /var/named/rpz.local 文件,例如:

    $TTL 10m
    @ IN SOA ns1.example.com. hostmaster.example.com. (
                              2022070601 ; serial number
                              1h         ; refresh period
                              1m         ; retry period
                              3d         ; expire time
                              1m )       ; minimum TTL
    
                     IN NS    ns1.example.com.
    
    example.org      IN CNAME .
    *.example.org    IN CNAME .
    example.net      IN CNAME rpz-drop.
    *.example.net    IN CNAME rpz-drop.

    这个区域文件:

    • 将资源记录的默认生存时间 (TTL) 值设置为 10 分钟。如果没有时间后缀(例如没有使用 h 指定小时),BIND 会将该值解析为秒。
    • 包含所需的 SOA 资源记录,以及有关该区域的详细信息。
    • ns1.example.com 设置为此区域的权威 DNS 服务器。要正常工作,区域需要至少一个域名服务器 (NS) 记录。但是,若要与 RFC 1912 兼容,您需要至少有两个域名服务器。
    • 将查询的 NXDOMAIN 错误返回给该域中的 example.org 和主机。
    • 将查询丢弃至此域中的 example.net 和主机。

    有关操作和示例的完整列表,请参阅 IETF 草案:DNS 响应策略区域(RPZ)

  4. 验证 /var/named/rpz.local 文件的语法:

    # named-checkzone rpz.local /var/named/rpz.local
    zone rpz.local/IN: loaded serial 2022070601
    OK
  5. 重新载入 BIND:

    # systemctl reload named

    如果在 change-root 环境中运行 BIND,请使用 systemctl reload named-chroot 命令来重新加载该服务。

验证

  1. 尝试解析 example.org 中的主机,该主机在 RPZ 中配置,以返回 NXDOMAIN 错误:

    # dig @localhost www.example.org
    ...
    ;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 30286
    ...

    本例假定 BIND 在同一主机上运行并响应 localhost 接口上的查询。

  2. 尝试解析 example.net 域中的主机,该域在 RPZ 中配置以丢弃查询:

    # dig @localhost www.example.net
    ...
    ;; connection timed out; no servers could be reached
    ...

4.9. 从 RHEL 7 绑定到 RHEL 8

要将 BIND 从 RHEL 7 迁移到 RHEL 8,您需要通过以下方法调整绑定配置:

  • 删除 dnssec-lookaside auto 配置选项。
  • 默认情况下,BIND 将侦听任何配置的 IPv6 地址,因为 listen-on-v6 配置选项的默认值已从 none 改为 any
  • 当允许更新其区域时,多个区域无法共享相同的区域文件。如果您需要在多个区定义中使用相同的文件,请确保 allow-updates 只使用任何。不要使用非空的 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 格式已被修改,以包含客户端对象的内存地址。它有助于调试。
  • nameddig 工具现在默认发送 DNS COOKIE (RFC 7873),这可能会破坏限制性防火墙或入侵检测系统。您可以使用 send-cookie 配置选项更改此行为。
  • dig 工具可以以文本格式显示 扩展 DNS 错误 (EDE、RFC 8914)。

4.10. 使用 dnstap 记录 DNS 查询

作为网络管理员,您可以记录域名系统(DNS)详情来分析 DNS 流量模式、监控 DNS 服务器性能,并对 DNS 问题进行故障排除。如果您希望有一个高级方法来监控和记录传入名称查询的详细信息,请使用 dnstap 接口记录从 named 服务发送的消息。您可以捕获并记录 DNS 查询,来收集有关网站或 IP 地址的信息。

先决条件

  • bind-9.11.26-2 软件包或更新版本已安装。
警告

如果您已安装并运行了 BIND 版本,添加新版本的 BIND 将覆盖现有的版本。

流程

  1. 通过编辑 options 块中的 /etc/named.conf 文件来启用 dnstap 和目标文件:

    options
    {
    # ...
    dnstap { all; }; # Configure filter
    dnstap-output file "/var/named/data/dnstap.bin";
    # ...
    };
    # end of options
  2. 要指定您要记录的 DNS 流量类型,请将 dnstap 过滤器添加到 /etc/named.conf 文件中的 dnstap 块中。您可以使用以下过滤器:

    • auth - 权威区域响应或回答。
    • client - 内部客户端查询或回答。
    • forwarder - 转发的查询或来自它的响应。
    • resolver - 迭代的解析查询或响应。
    • update - 动态区域更新请求。
    • all - 以上选项中的任何一个。
    • queryresponse - 如果您没有指定 queryresponse 关键字,则 dnstap 两个都记录。

      注意

      dnstap 过滤器包含多个由 ; 分隔的定义,dnstap {} 块的语法如下:dnstap{(all | auth | client | forwarder | resolver | update)[(query | response)]; …​ };

  3. 要应用您的更改,请重启 named 服务:

    # systemctl restart named.service
  4. 为活跃日志配置定期回滚

    在以下示例中,cron 调度程序每天运行一次用户编辑的脚本的内容。值为 3roll 选项指定 dnstap 最多可以创建三个备份日志文件。值 3 覆盖 dnstap-output 变量的 version 参数,并将备份日志文件数限制为三个。此外,二进制日志文件被移到另一个目录并被重命名,并且永远不会达到 .2 后缀,即使三个备份文件已存在。如果根据大小限制自动回滚二进制日志足够了,则您可以跳过这一步。

    Example:
    
    sudoedit /etc/cron.daily/dnstap
    
    #!/bin/sh
    rndc dnstap -roll 3
    mv /var/named/data/dnstap.bin.1 /var/log/named/dnstap/dnstap-$(date -I).bin
    
    # use dnstap-read to analyze saved logs
    sudo chmod a+x /etc/cron.daily/dnstap
  5. 使用 dnstap-read 工具以人类可读的格式处理和分析日志:

    在以下示例中,dnstap-read 工具以 YAML 文件格式打印输出。

    Example:
    
    dnstap-read -y [file-name]

第 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 进行国际化。

  • 文件处理类型

    通过易失性文件句柄,服务器可以调整文件系统更改,并使客户端能够根据需要进行调整,而无需永久文件句柄。

  • 属性类型

    file 属性结构包括 required, recommended, 和 named 属性,各自提供不同的目的。从 NFSv3 派生的必要属性对于区分文件类型至关重要,而推荐的属性(如 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 选项控制此行为。

其它资源

  • 您系统上的 exports (5) 手册页

5.5. NFS 服务器所需的服务

Red Hat Enterprise Linux (RHEL)使用内核模块和用户空间进程的组合来提供 NFS 文件共享:

表 5.1. NFS 服务器所需的服务
服务名称NFS 版本描述

nfsd

3, 4

为共享 NFS 文件系统请求的 NFS 内核模块。

rpcbind

3

这个过程接受本地远程过程调用(RPC)服务的端口保留,使其可用或公告,允许对应的远程 RPC 服务访问它们。rpcbind 服务响应请求并设置到指定的 RPC 服务的连接。

rpc.mountd

3, 4

此服务处理来自 NFSv3 客户端的 MOUNT 请求,而 NFSv4 服务器则使用此服务的内部功能。

它检查请求的 NFS 共享是否当前由 NFS 服务器导出,并且允许客户端访问它。

rpc.nfsd

3, 4

这个过程公告服务器定义的显式 NFS 版本和协议。它与内核合作来满足 NFS 客户端的动态需求,例如在每次连接 NFS 客户端时提供服务器线程。

nfs-server 服务启动此过程。

lockd

3

这个内核模块实现 Network Lock Manager (NLM)协议,它允许客户端锁定服务器上的文件。当 NFS 服务器运行时,RHEL 会自动加载该模块。

rpc.rquotad

3, 4

此服务为远程用户提供用户配额信息。

rpc.idmapd

4

这个过程提供 NFSv4 客户端和服务器上上一次调用,它会在 NFSv4 名称(以 'user@domain'的形式为 )和本地用户和组 ID 之间进行映射。

gssproxy

3, 4

此服务代表 rpc.nfsd 处理 krb5 身份验证。

nfsdcld

4

此服务提供 NFSv4 客户端跟踪守护进程,可防止服务器在网络分区与服务器重启结合使用时授予锁定回收。

rpc.statd

3

此服务在本地主机重启时向其他 NFSv3 客户端提供通知,并在远程 NFSv3 主机重启时向内核提供。

其它资源

  • rpcbind (8), rpc.mountd (8), rpc.nfsd (8), rpc.statd (8), rpc.rquotad (8), rpc.idmapd (8), gssproxy (8), nfsdcld (8), rpc.statd (8) man page

5.6. /etc/exports 配置文件

/etc/exports 文件控制服务器导出哪些目录。每行包含一个导出点、允许挂载该目录的客户端列表,以及每个客户端的选项:

<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)

在第一行中,服务器只允许 client.example.com 在读写模式下挂载 /projects 目录,而其他主机都不能挂载该共享。但是,由于第二行中的 client.example.com (rw) 之间的空间,服务器将目录导出到只读模式(默认设置),但所有其他主机都可以以读写模式挂载共享。

NFS 服务器为每个导出的目录使用以下默认设置:

表 5.2. /etc/exports 中条目的默认选项
默认设置描述

ro

以只读模式导出目录。

sync

在将之前请求所做的更改写入磁盘之前,NFS 服务器不会回复请求。

wdelay

如果服务器怀疑另一个写入请求待处理,则服务器延迟写入磁盘。

root_squash

防止客户端上的 root 用户对导出的目录具有 root 权限。启用 root_squash 后,NFS 服务器将访问权限从 root 映射到用户 nobody

5.7. 配置只使用 NFSv4 的服务器

如果您的网络中没有任何 NFSv3 客户端,您可以将 NFS 服务器配置为只支持 NFSv4 或特定的次版本。在服务器上仅使用 NFSv4 可减少对网络打开的端口数量。

流程

  1. 安装 nfs-utils 软件包:

    # dnf install nfs-utils
  2. 编辑 /etc/nfs.conf 文件并进行以下更改:

    1. [nfsd] 部分中禁用 vers3 参数来禁用 NFSv3:

      [nfsd]
      vers3=n
    2. 可选: 如果您只需要特定的 NFSv4 次版本,请取消所有 vers4.<minor_version&gt; 参数的注释,并相应地设置它们,例如:

      [nfsd]
      vers3=n
      # vers4=y
      vers4.0=n
      vers4.1=n
      vers4.2=y

      使用这个配置,服务器仅提供 NFS 版本 4.2。

      重要

      如果您只需要特定的 NFSv4 次版本,则只为次版本设置参数。不要取消注释 vers4 参数,以避免无法预测的次版本激活或停用次版本。默认情况下,vers4 参数启用或禁用所有 NFSv4 次要版本。但是,如果您将 vers4 与其他 vers 参数一起设置,则此行为会改变。

  3. 禁用所有与 NFSv3 相关的服务:

    # systemctl mask --now rpc-statd.service rpcbind.service rpcbind.socket
  4. rpc.mountd 守护进程配置为不侦听 NFSv3 挂载请求。使用以下内容创建 /etc/systemd/system/nfs-mountd.service.d/v4only.conf 文件:

    [Service]
    ExecStart=
    ExecStart=/usr/sbin/rpc.mountd --no-tcp --no-udp
  5. 重新载入 systemd 管理器配置并重启 nfs-mountd 服务:

    # systemctl daemon-reload
    # systemctl restart nfs-mountd
  6. 可选:创建一个您要共享的目录,例如:

    # mkdir -p /nfs/projects/

    如果要共享现有目录,请跳过这一步。

  7. /nfs/projects/ 目录中设置所需的权限:

    # chmod 2770 /nfs/projects/
    # chgrp users /nfs/projects/

    这些命令为 /nfs/projects/ 目录中的 用户组 设置写入权限,并确保在此目录中创建的新条目上自动设置同一组。

  8. 为每个您要共享的目录添加导出点到 /etc/exports 文件:

    /nfs/projects/     192.0.2.0/24(rw) 2001:db8::/32(rw)

    此条目共享 /nfs/projects/ 目录,并可访问对 192.0.2.0/242001:db8::/32 子网中客户端的读写访问权限。

  9. firewalld 中打开相关端口:

    # firewall-cmd --permanent --add-service nfs
    # firewall-cmd --reload
  10. 启用并启动 NFS 服务器:

    # systemctl enable --now nfs-server

验证

  • 在服务器上,验证服务器是否只提供您配置的 NFS 版本:

    # cat /proc/fs/nfsd/versions
    -3 +4 -4.0 -4.1 +4.2
  • 在客户端中执行以下步骤:

    1. 安装 nfs-utils 软件包:

      # dnf install nfs-utils
    2. 挂载导出的 NFS 共享:

      # mount server.example.com:/nfs/projects/ /mnt/
    3. 作为作为 users 组的成员的用户,在 /mnt/ 中创建文件:

      # touch /mnt/file
    4. 列出目录以验证该文件是否已创建:

      # ls -l /mnt/
      total 0
      -rw-r--r--. 1 demo users 0 Jan 16 14:18 file

5.8. 使用可选 NFSv4 配置 NFSv3 服务器

在仍然使用 NFSv3 客户端的网络中,将服务器配置为使用 NFSv3 协议提供共享。如果您的网络中也具有较新的客户端,也可以启用 NFSv4。默认情况下,Red Hat Enterprise Linux NFS 客户端使用服务器提供的最新 NFS 版本。

流程

  1. 安装 nfs-utils 软件包:

    # dnf install nfs-utils
  2. 可选:默认启用 NFSv3 和 NFSv4。如果您不需要 NFSv4 或只使用特定的次版本,请取消所有 vers4.<minor_version> 参数的注释,并相应地设置它们:

    [nfsd]
    # vers3=y
    # vers4=y
    vers4.0=n
    vers4.1=n
    vers4.2=y

    使用这个配置,服务器仅提供 NFS 版本 3 和 4.2。

    重要

    如果您只需要特定的 NFSv4 次版本,则只为次版本设置参数。不要取消注释 vers4 参数,以避免无法预测的次版本激活或停用次版本。默认情况下,vers4 参数启用或禁用所有 NFSv4 次要版本。但是,如果您将 vers4 与其他 vers 参数一起设置,则此行为会改变。

  3. 默认情况下,NFSv3 RPC 服务使用随机端口。要启用防火墙配置,请在 /etc/nfs.conf 文件中配置固定端口号:

    1. [lockd] 部分中,为 nlockmgr RPC 服务设置固定端口号,例如:

      [lockd]
      port=5555

      使用这个设置时,服务会自动将这个端口号用于 UDP 和 TCP 协议。

    2. [statd] 部分中,为 rpc.statd 服务设置固定端口号,例如:

      [statd]
      port=6666

      使用这个设置时,服务会自动将这个端口号用于 UDP 和 TCP 协议。

  4. 可选:创建一个您要共享的目录,例如:

    # mkdir -p /nfs/projects/

    如果要共享现有目录,请跳过这一步。

  5. /nfs/projects/ 目录中设置所需的权限:

    # chmod 2770 /nfs/projects/
    # chgrp users /nfs/projects/

    这些命令为 /nfs/projects/ 目录中的 用户组 设置写入权限,并确保在此目录中创建的新条目上自动设置同一组。

  6. 为每个您要共享的目录添加导出点到 /etc/exports 文件:

    /nfs/projects/     192.0.2.0/24(rw) 2001:db8::/32(rw)

    此条目共享 /nfs/projects/ 目录,并可访问对 192.0.2.0/242001:db8::/32 子网中客户端的读写访问权限。

  7. 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
  8. 启用并启动 NFS 服务器:

    # systemctl enable --now rpc-statd nfs-server

验证

  • 在服务器上,验证服务器是否只提供您配置的 NFS 版本:

    # cat /proc/fs/nfsd/versions
    +3 +4 -4.0 -4.1 +4.2
  • 在客户端中执行以下步骤:

    1. 安装 nfs-utils 软件包:

      # dnf install nfs-utils
    2. 挂载导出的 NFS 共享:

      # mount -o vers=<version> server.example.com:/nfs/projects/ /mnt/
    3. 验证共享是否已使用指定的 NFS 版本挂载:

      # mount | grep "/mnt"
      server.example.com:/nfs/projects/ on /mnt type nfs (rw,relatime,vers=3,...
    4. 作为作为 users 组的成员的用户,在 /mnt/ 中创建文件:

      # touch /mnt/file
    5. 列出目录以验证该文件是否已创建:

      # ls -l /mnt/
      total 0
      -rw-r--r--. 1 demo users 0 Jan 16 14:18 file

5.9. 在 NFS 服务器中启用配额支持

如果要限制用户或组群可以存储的数据量,您可以在文件系统中配置配额。在 NFS 服务器上,rpc-rquotad 服务确保配额也应用于 NFS 客户端上的用户。

先决条件

  • NFS 服务器正在运行并配置了。
  • 配额已在 extXFS 文件系统上配置。

流程

  1. 验证您导出的目录中是否启用了配额:

    • 对于 ext 文件系统,请输入:

      # 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 off
    • 对于 XFS 文件系统,请输入:

      # findmnt /nfs/projects
      TARGET    	SOURCE	FSTYPE OPTIONS
      /nfs/projects /dev/sdb1 xfs	rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,usrquota,grpquota
  2. 安装 quota-rpc 软件包:

    # dnf install quota-rpc
  3. 可选:默认情况下,配额 RPC 服务在端口 875 上运行。如果要在不同的端口上运行该服务,请将 -p <port_number> 附加到 /etc/sysconfig/rpc-rquotad 文件中的 RPCRQUOTADOPTS 变量中:

    RPCRQUOTADOPTS="-p __<port_number>__"
  4. 可选: 默认情况下,远程主机只能读取配额。要允许客户端设置配额,请将 -S 选项附加到 /etc/sysconfig/rpc-rquotad 文件中的 RPCRQUOTADOPTS 变量中:

    RPCRQUOTADOPTS="-S"
  5. firewalld 中打开端口:

    # firewall-cmd --permanent --add-port=875/udp
    # firewall-cmd --reload
  6. 启用并启动 rpc-rquotad 服务:

    # systemctl enable --now rpc-rquotad

验证

  1. 在客户端中:

    1. 挂载导出的共享:

      # mount server.example.com:/nfs/projects/ /mnt/
    2. 显示配额。命令取决于导出的目录的文件系统。例如:

      • 要显示所有挂载的 ext 文件系统上的特定用户的配额,请输入:

        # 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         0
      • 要在 XFS 文件系统中显示用户和组群配额,请输入:

        # xfs_quota -x -c "report -h" /mnt/
        User quota on /nfs/projects (/dev/vdb1)
                    Blocks
        User ID     Used     Soft     Hard     Warn/Grace
        ---------- ---------------------------------
        root        0        0        0        00 [------]
        demo        0        100M     200M     00 [------]

其它资源

  • 系统上的 quota (1)xfs_quota (8) 手册页

5.10. 在 NFS 服务器中启用 RDMA 的 NFS

远程直接内存访问(RDMA)是一种协议,它允许客户端系统将数据直接从存储服务器的内存传输到其自身的内存。这提高了存储吞吐量,降低服务器和客户端之间的数据传输延迟,并减少两端的 CPU 负载。如果 NFS 服务器和客户端都通过 RDMA 连接,客户端可以使用 NFSoRDMA 来挂载导出的目录。

先决条件

  • NFS 服务正在运行并配置了
  • 在服务器中安装 InfiniBand 或 RDMA over Converged Ethernet (RoCE)设备。
  • IP over InfiniBand (IPoIB)在服务器上被配置,InfiniBand 设备分配了一个 IP 地址。

流程

  1. 安装 rdma-core 软件包:

    # dnf install rdma-core
  2. 如果已经安装了软件包,请验证 /etc/rdma/modules/rdma.conf 文件中的 xprtrdmasvcrdma 模块是否已取消注释:

    # NFS over RDMA client support
    xprtrdma
    # NFS over RDMA server support
    svcrdma
  3. 可选:默认情况下,通过 RDMA 的 NFS 使用端口 20049。如果要使用其他端口,请在 /etc/nfs.conf 文件的 [nfsd] 部分中设置 rdma-port 设置:

    rdma-port=<port>
  4. firewalld 中打开 NFSoRDMA 端口:

    # firewall-cmd --permanent --add-port={20049/tcp,20049/udp}
    # firewall-cmd --reload

    如果您设置了与 20049 不同的端口,请调整端口号。

  5. 重启 nfs-server 服务:

    # systemctl restart nfs-server

验证

  1. 在带有 InfiniBand 硬件的客户端中执行以下步骤:

    1. 安装以下软件包:

      # dnf install nfs-utils rdma-core
    2. 通过 RDMA 挂载导出的 NFS 共享:

      # mount -o rdma server.example.com:/nfs/projects/ /mnt/

      如果您设置了默认端口号(20049),请将 port = <port_number> 传给命令:

      # mount -o rdma,port=<port_number> server.example.com:/nfs/projects/ /mnt/
    3. 验证共享是否已使用 rdma 选项挂载:

      # mount | grep "/mnt"
      server.example.com:/nfs/projects/ on /mnt type nfs (...,proto=rdma,...)

5.11. 在 Red Hat Identity Management 域中使用 Kerberos 设置 NFS 服务器

如果您使用 Red Hat Identity Management (IdM),您可以将 NFS 服务器加入到 IdM 域中。这可让您集中管理用户和组,并使用 Kerberos 进行身份验证、完整性保护和流量加密。

先决条件

  • NFS 服务器已在 Red Hat Identity Management (IdM)域中 注册
  • NFS 服务器正在运行并配置了。

流程

  1. 以 IdM 管理员身份获取 kerberos 票据:

    # kinit admin
  2. 创建 nfs/<FQDN&gt; 服务主体:

    # ipa service-add nfs/nfs_server.idm.example.com
  3. 从 IdM 检索 nfs 服务主体,并将其存储在 /etc/krb5.keytab 文件中:

    # ipa-getkeytab -s idm_server.idm.example.com -p nfs/nfs_server.idm.example.com -k /etc/krb5.keytab
  4. 可选:显示 /etc/krb5.keytab 文件中的主体:

    # klist -k /etc/krb5.keytab
    Keytab name: FILE:/etc/krb5.keytab
    KVNO Principal
    ---- --------------------------------------------------------------------------
       1 nfs/nfs_server.idm.example.com@IDM.EXAMPLE.COM
       1 nfs/nfs_server.idm.example.com@IDM.EXAMPLE.COM
       1 nfs/nfs_server.idm.example.com@IDM.EXAMPLE.COM
       1 nfs/nfs_server.idm.example.com@IDM.EXAMPLE.COM
       7 host/nfs_server.idm.example.com@IDM.EXAMPLE.COM
       7 host/nfs_server.idm.example.com@IDM.EXAMPLE.COM
       7 host/nfs_server.idm.example.com@IDM.EXAMPLE.COM
       7 host/nfs_server.idm.example.com@IDM.EXAMPLE.COM

    默认情况下,当您将主机加入到 IdM 域时,IdM 客户端会将主机主体添加到 /etc/krb5.keytab 文件中。如果缺少主机主体,请使用 ipa-getkeytab -s idm_server.idm.example.com -p host/nfs_server.idm.example.com -k /etc/krb5.keytab 命令添加它。

  5. 使用 ipa-client-automount 工具来配置 IdM ID 的映射:

    #  ipa-client-automount
    Searching for IPA server...
    IPA server: DNS discovery
    Location: default
    Continue to configure the system with these values? [no]: yes
    Configured /etc/idmapd.conf
    Restarting sssd, waiting for it to become available.
    Started autofs
  6. 更新 /etc/exports 文件,并将 Kerberos 安全方法添加到客户端选项。例如:

    /nfs/projects/      	192.0.2.0/24(rw,sec=krb5i)

    如果您希望客户端可以从多个安全方法中选择,请使用冒号指定它们:

    /nfs/projects/      	192.0.2.0/24(rw,sec=krb5:krb5i:krb5p)
  7. 重新载入导出的文件系统:

    # exportfs -r

第 6 章 配置 Squid 缓存代理服务器

Squid 是一个代理服务器,可缓存内容以减少带宽并更快地加载 Web 页面。本章论述了如何将 Squid 设置为 HTTP、HTTPS 和 FTP 协议的代理,以及验证和限制访问。

6.1. 将 Squid 设置为没有身份验证的缓存代理

您可以将 Squid 配置为没有身份验证的缓存代理。此流程会根据 IP 范围限制对代理的访问。

先决条件

  • 流程假设 /etc/squid/squid.conf 文件是由 squid 软件包提供的。如果您在之前编辑了这个文件,请删除该文件并重新安装该软件包。

流程

  1. 安装 squid 软件包:

    # yum install squid
  2. 编辑 /etc/squid/squid.conf 文件:

    1. 调整 localnet 访问控制列表(ACL)以匹配应该允许使用代理的 IP 范围:

      acl localnet src 192.0.2.0/24
      acl localnet 2001:db8:1::/64

      默认情况下,/etc/squid/squid.conf 文件包含 http_access allow localnet 规则,该规则允许使用 localnet ACL 中指定的所有 IP 范围的代理。请注意,您必须在 http_access allow localnet 规则前指定所有 localnet ACL。

      重要

      删除所有与您的环境不匹配的现有 acl localnet 条目。

    2. 以下 ACL 存在于默认配置中,并将 443 定义为使用 HTTPS 协议的端口:

      acl SSL_ports port 443

      如果用户也可以在其它端口上使用 HTTPS 协议,请为每个端口添加 ACL:

      acl SSL_ports port port_number
    3. 更新 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

      默认情况下,配置包含 http_access deny !Safe_ports 规则,该规则定义禁止对定义在 Safe_ports ACL 中端口的访问。

    4. cache_dir 参数中配置缓存类型、缓存目录的路径、缓存大小以及特定于其它缓存类型的设置:

      cache_dir ufs /var/spool/squid 10000 16 256

      有了这些设置:

      • squid 使用 ufs 缓存类型。
      • Squid 将其缓存存储在 /var/spool/squid/ 目录中。
      • 缓存增长到 10000 MB。
      • Squid 在 /var/spool/squid/ 目录中创建 16 level-1 子目录。
      • Squid 在每个 level-1 目录中创建 256 个子目录。

        如果您没有设置 cache_dir 指令,Squid 会在内存中存储缓存。

  3. 如果您在 cache_dir 参数中设置了与 /var/spool/squid/ 不同的缓存目录:

    1. 创建缓存目录:

      # mkdir -p path_to_cache_directory
    2. 配置缓存目录的权限:

      # chown squid:squid path_to_cache_directory
    3. 如果您在 enforcing 模式下运行 SELinux,请为缓存目录设置 squid_cache_t 上下文:

      # semanage fcontext -a -t squid_cache_t "path_to_cache_directory(/.*)?"
      # restorecon -Rv path_to_cache_directory

      如果系统上没有 semanage 工具,请安装 policycoreutils-python-utils 软件包。

  4. 在防火墙中打开 3128 端口:

    # firewall-cmd --permanent --add-port=3128/tcp
    # firewall-cmd --reload
  5. 启用并启动 squid 服务:

    # systemctl enable --now squid

验证

要验证代理是否正常工作,请使用 curl 工具下载网页:

# 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 会以此用户的身份绑定到该目录以验证身份验证。

流程

  1. 安装 squid 软件包:

    # yum install squid
  2. 编辑 /etc/squid/squid.conf 文件:

    1. 要配置 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

      下面描述了在上面示例中传给 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。
    2. 添加以下 ACL 和规则来配置 Squid 只允许经过身份验证的用户使用代理:

      acl ldap-auth proxy_auth REQUIRED
      http_access allow ldap-auth
      重要

      http_access deny 所有规则前指定这些设置。

    3. 删除以下规则以禁止绕过 localnet ACL 中指定的 IP 范围的代理身份验证:

      http_access allow localnet
    4. 以下 ACL 存在于默认配置中,并将 443 定义为使用 HTTPS 协议的端口:

      acl SSL_ports port 443

      如果用户也可以在其它端口上使用 HTTPS 协议,请为每个端口添加 ACL:

      acl SSL_ports port port_number
    5. 更新 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

      默认情况下,配置包含 http_access deny !Safe_ports 规则,该规则定义拒绝访问 Safe_ports ACL 中未定义的端口。

    6. cache_dir 参数中配置缓存类型、缓存目录的路径、缓存大小以及特定于其它缓存类型的设置:

      cache_dir ufs /var/spool/squid 10000 16 256

      有了这些设置:

      • squid 使用 ufs 缓存类型。
      • Squid 将其缓存存储在 /var/spool/squid/ 目录中。
      • 缓存增长到 10000 MB。
      • Squid 在 /var/spool/squid/ 目录中创建 16 level-1 子目录。
      • Squid 在每个 level-1 目录中创建 256 个子目录。

        如果您没有设置 cache_dir 指令,Squid 会在内存中存储缓存。

  3. 如果您在 cache_dir 参数中设置了与 /var/spool/squid/ 不同的缓存目录:

    1. 创建缓存目录:

      # mkdir -p path_to_cache_directory
    2. 配置缓存目录的权限:

      # chown squid:squid path_to_cache_directory
    3. 如果您在 enforcing 模式下运行 SELinux,请为缓存目录设置 squid_cache_t 上下文:

      # semanage fcontext -a -t squid_cache_t "path_to_cache_directory(/.*)?"
      # restorecon -Rv path_to_cache_directory

      如果系统上没有 semanage 工具,请安装 policycoreutils-python-utils 软件包。

  4. 将 LDAP 服务用户的密码存储在 /etc/squid/ldap_password 文件中,并为该文件设置合适的权限:

    # echo "password" > /etc/squid/ldap_password
    # chown root:squid /etc/squid/ldap_password
    # chmod 640 /etc/squid/ldap_password
  5. 在防火墙中打开 3128 端口:

    # firewall-cmd --permanent --add-port=3128/tcp
    # firewall-cmd --reload
  6. 启用并启动 squid 服务:

    # systemctl enable --now squid

验证

要验证代理是否正常工作,请使用 curl 工具下载网页:

# curl -O -L "https://www.redhat.com/index.html" -x "user_name:password@proxy.example.com:3128"

如果 curl 没有显示任何错误,并且 index.html 文件已下载到当前目录中,则代理工作正常。

故障排除步骤

验证 helper 工具是否正常工作:

  1. 使用您在 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
  2. 输入一个有效的用户名和密码,然后按 Enter 键:

    user_name password

    如果 helper 工具返回 OK,则身份验证成功。

6.3. 将 Squid 设置为带有 kerberos 身份验证的缓存代理

您可以将 Squid 配置为使用 Kerberos 将用户验证到活动目录 (AD)的缓存代理。此流程配置仅经过身份验证的用户可以使用代理。

先决条件

  • 流程假设 /etc/squid/squid.conf 文件是由 squid 软件包提供的。如果您在之前编辑了这个文件,请删除该文件并重新安装该软件包。

流程

  1. 安装以下软件包:

    # yum install squid krb5-workstation
  2. 以 AD 域管理员身份进行身份验证:

    # kinit administrator@AD.EXAMPLE.COM
  3. 为 Squid 创建 keytab,并将其存储在 /etc/squid/HTTP.keytab 文件中:

    # export KRB5_KTNAME=FILE:/etc/squid/HTTP.keytab
    # net ads keytab CREATE -U administrator
  4. 向 keytab 添加 HTTP 服务主体:

    # net ads keytab ADD HTTP -U administrator
  5. 将 keytab 文件的拥有者设为 squid 用户:

    # chown squid /etc/squid/HTTP.keytab
  6. 可选:验证 keytab 文件包含代理服务器的完全限定域名(FQDN)的 HTTP 服务主体:

    # klist -k /etc/squid/HTTP.keytab
    Keytab name: FILE:/etc/squid/HTTP.keytab
    KVNO Principal
    ---- ---------------------------------------------------
    ...
       2 HTTP/proxy.ad.example.com@AD.EXAMPLE.COM
    ...
  7. 编辑 /etc/squid/squid.conf 文件:

    1. 要配置 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

      下面描述了在上例中传给 negotiate_kerberos_auth 帮助工具的参数:

      • -k file 设置 keytab 文件的路径。请注意,squid 用户必须拥有这个文件的读取权限。
      • -s HTTP/host_name@kerberos_realm 设置 Squid 使用的 Kerberos 主体。

        另外,您可以通过将以下一个或多个参数传给帮助工具来启用日志:

      • -i 记录信息,如验证用户。
      • -d 启用调试日志记录。

        Squid 将帮助工具中的调试信息记录到 /var/log/squid/cache.log 文件。

    2. 添加以下 ACL 和规则来配置 Squid 只允许经过身份验证的用户使用代理:

      acl kerb-auth proxy_auth REQUIRED
      http_access allow kerb-auth
      重要

      http_access deny all 规则前指定这些设置。

    3. 删除以下规则以禁止绕过 localnet ACL 中指定的 IP 范围的代理身份验证:

      http_access allow localnet
    4. 以下 ACL 存在于默认配置中,并将 443 定义为使用 HTTPS 协议的端口:

      acl SSL_ports port 443

      如果用户也可以在其它端口上使用 HTTPS 协议,请为每个端口添加 ACL:

      acl SSL_ports port port_number
    5. 更新 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

      默认情况下,配置包含 http_access deny !Safe_ports 规则,该规则定义禁止对定义在 Safe_ports ACL 中端口的访问。

    6. cache_dir 参数中配置缓存类型、缓存目录的路径、缓存大小以及特定于其它缓存类型的设置:

      cache_dir ufs /var/spool/squid 10000 16 256

      有了这些设置:

      • squid 使用 ufs 缓存类型。
      • Squid 将其缓存存储在 /var/spool/squid/ 目录中。
      • 缓存增长到 10000 MB。
      • Squid 在 /var/spool/squid/ 目录中创建 16 level-1 子目录。
      • Squid 在每个 level-1 目录中创建 256 个子目录。

        如果您没有设置 cache_dir 指令,Squid 会在内存中存储缓存。

  8. 如果您在 cache_dir 参数中设置了与 /var/spool/squid/ 不同的缓存目录:

    1. 创建缓存目录:

      # mkdir -p path_to_cache_directory
    2. 配置缓存目录的权限:

      # chown squid:squid path_to_cache_directory
    3. 如果您在 enforcing 模式下运行 SELinux,请为缓存目录设置 squid_cache_t 上下文:

      # semanage fcontext -a -t squid_cache_t "path_to_cache_directory(/.*)?"
      # restorecon -Rv path_to_cache_directory

      如果系统上没有 semanage 工具,请安装 policycoreutils-python-utils 软件包。

  9. 在防火墙中打开 3128 端口:

    # firewall-cmd --permanent --add-port=3128/tcp
    # firewall-cmd --reload
  10. 启用并启动 squid 服务:

    # systemctl enable --now squid

验证

要验证代理是否正常工作,请使用 curl 工具下载网页:

# curl -O -L "https://www.redhat.com/index.html" --proxy-negotiate -u : -x "proxy.ad.example.com:3128"

如果 curl 没有显示任何错误,并且当前目录中存在 index.html 文件,则代理工作正常。

故障排除步骤

手动测试 Kerberos 身份验证:

  1. 为 AD 帐户获取 Kerberos ticket:

    # kinit user@AD.EXAMPLE.COM
  2. 可选:显示 ticket:

    # klist
  3. 使用 negotiate_kerberos_auth_test 工具测试身份验证:

    # /usr/lib64/squid/negotiate_kerberos_auth_test proxy.ad.example.com

    如果助手工具返回令牌,则身份验证成功:

    Token: YIIFtAYGKwYBBQUCoIIFqDC...

6.4. 在 Squid 中配置域拒绝列表

通常,管理员想要阻止对特定域的访问。这部分论述了如何在 Squid 中配置域拒绝列表。

先决条件

  • squid 被配置,用户可以使用代理。

流程

  1. 编辑 /etc/squid/squid.conf 文件,并添加以下设置:

    acl domain_deny_list dstdomain "/etc/squid/domain_deny_list.txt"
    http_access deny all domain_deny_list
    重要

    在允许访问用户或客户端的第一个 http_access allow 语句前添加这些条目。

  2. 创建 /etc/squid/domain_deny_list.txt 文件,并添加您要阻止的域。例如,要阻止对 example.com(包括子域)以及对 example.net 的访问,请添加:

    .example.com
    example.net
    重要

    如果您引用了 squid 配置中的 /etc/squid/domain_deny_list.txt 文件,则该文件不能为空。如果文件为空,Squid 无法启动。

  3. 重启 squid 服务:

    # systemctl restart squid

6.5. 将 Squid 服务配置为监听特定端口或 IP 地址

默认情况下,Squid 代理服务侦听所有网络接口上的 3128 端口。您可以更改端口,并将 Squid 配置为监听特定的 IP 地址。

先决条件

  • squid 软件包已安装。

流程

  1. 编辑 /etc/squid/squid.conf 文件:

    • 要设置 Squid 服务侦听的端口,请在 http_port 参数中设置端口号。例如,要将端口设为 8080,请设置:

      http_port 8080
    • 要配置 Squid 服务侦听的 IP 地址,请在 http_port 参数中设置 IP 地址和端口号。例如,若要配置 Squid 仅侦听192.0.2.1 IP 地址的端口 3128 ,请设置:

      http_port 192.0.2.1:3128

      向配置文件中添加多个 http_port 参数,以配置 Squid 侦听多个端口和 IP 地址:

      http_port 192.0.2.1:3128
      http_port 192.0.2.1:8080
  2. 如果您配置了 Squid 使用不同的端口作为默认值(3128):

    1. 在防火墙中打开端口:

      # firewall-cmd --permanent --add-port=port_number/tcp
      # firewall-cmd --reload
    2. 如果您在 enforcing 模式下运行 SELinux,请将端口分配给 squid_port_t 端口类型定义:

      # semanage port -a -t squid_port_t -p tcp port_number

      如果系统上没有 semanage 工具,请安装 policycoreutils-python-utils 软件包。

  3. 重启 squid 服务:

    # systemctl restart squid

6.6. 其它资源

  • 配置参数 usr/share/doc/squid-<version>/squid.conf.documented

第 7 章 数据库服务器

7.1. 介绍

数据库服务器是一种提供数据库管理系统(DBMS)功能的服务。DBMS 为数据库管理提供工具,并与最终用户、应用程序和数据库进行交互。

Red Hat Enterprise Linux 8 提供以下数据库管理系统:

  • MariaDB 10.3
  • MariaDB 10.5 - 从 RHEL 8.4 开始提供
  • MariaDB 10.11 - available since 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 - available since RHEL 8.10
注意

按照设计,无法并行安装同一模块的多个版本(stream)。因此,您必须从 mariadb 模块中只选择一个可用流。您可以在容器中使用不同版本的 MariaDB 数据库服务器,请参阅 在容器中运行多个 MariaDB 版本

由于 RPM 软件包有冲突,MariaDBMySQL 数据库服务器无法在 RHEL 8 中并行安装。您可以在容器中并行使用 MariaDBMySQL 数据库服务器,请参阅 在容器中运行多个 MySQL 和 MariaDB 版本

要安装 MariaDB,请使用以下流程:

流程

  1. 通过从 mariadb 模块选择流(版本),并指定 server 配置文件来安装 MariaDB 服务器软件包。例如:

    # yum module install mariadb:10.3/server
  2. 启动 mariadb 服务:

    # systemctl start mariadb.service
  3. 启用 mariadb 服务,使其在引导时启动:

    # systemctl enable mariadb.service
  4. 推荐的 MariaDB 10.3: 要在安装 MariaDB 时提高安全性,请运行以下命令:

    $ mysql_secure_installation

    此命令启动一个完全交互的脚本,该脚本会提示过程中的每一步。该脚本可让您通过以下方法提高安全性:

    • 为 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.1.1. 在容器中运行多个 MariaDB 版本

要在同一主机上运行不同版本的 MariaDB,请在容器中运行它们,因为您无法并行安装同一模块的多个版本(streams)。

先决条件

  • container-tools 模块已安装。

流程

  1. 使用您的红帽客户门户网站帐户向 registry.redhat.io registry 进行身份验证:

    # podman login registry.redhat.io

    如果您已登录到容器 registry,请跳过这一步。

  2. 在容器中运行 MariaDB 10.3

    $ podman run -d --name <container_name> -e MYSQL_ROOT_PASSWORD=<mariadb_root_password> -p <host_port_1>:3306 rhel8/mariadb-103

    有关使用此容器镜像的更多信息,请参阅 红帽生态系统目录

  3. 在容器中运行 MariaDB 10.5

    $ podman run -d --name <container_name> -e MYSQL_ROOT_PASSWORD=<mariadb_root_password> -p <host_port_2>:3306 rhel8/mariadb-105

    有关使用此容器镜像的更多信息,请参阅 红帽生态系统目录

  4. 在容器中运行 MariaDB 10.11

    $ podman run -d --name <container_name> -e MYSQL_ROOT_PASSWORD=<mariadb_root_password> -p <host_port_3>:3306 rhel8/mariadb-1011

    有关使用此容器镜像的更多信息,请参阅 红帽生态系统目录

    注意

    两个数据库服务器的容器名称和主机端口必须有所不同。

  5. 要确保客户端可以访问网络中的数据库服务器,请在防火墙中打开主机端口:

    # firewall-cmd --permanent --add-port={<host_port_1>/tcp,<host_port_2>/tcp,<host_port_3>/tcp...}
    # firewall-cmd --reload

验证

  1. 显示正在运行的容器信息:

    $ podman ps
  2. 连接到数据库服务器,并以 root 用户身份登录:

    # mysql -u root -p -h localhost -P <host_port> --protocol tcp

7.2.2. 配置 MariaDB

要为联网配置 MariaDB 服务器,请使用以下流程:

流程

  1. 编辑/etc/my.cnf.d/mariadb-server.cnf文件的[mysqld]部分。您可以设置以下配置指令:

    • bind-address - 是服务器监听的地址。可能的选项有:

      • 主机名
      • IPv4 地址
      • IPv6 地址
    • skip-networking - 控制服务器是否监听 TCP/IP 连接。可能的值有:

      • 0 - 监听所有客户端
      • 1 - 只监听本地客户端
    • port - MariaDB 监听 TCP/IP 连接的端口。
  2. 重启 mariadb 服务:

    # systemctl restart mariadb.service

7.2.3. 在 MariaDB 服务器上设置 TLS 加密

默认情况下,MariaDB 使用未加密的连接。对于安全连接,在 MariaDB 服务器上启用 TLS 支持,并将您的客户端配置为建立加密连接。

7.2.3.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 文档。

流程

  1. 将 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/
  2. 设置 CA 和服务器证书的权限,使 MariaDB 服务器能够读取文件:

    # chmod 644 /etc/pki/tls/certs/server.example.com.crt.pem /etc/pki/tls/certs/ca.crt.pem

    由于证书是建立安全连接前通信的一部分,因此任何客户端都可以在不需要身份验证的情况下检索它们。因此,您不需要对 CA 和服务器证书文件设置严格的权限。

  3. 将服务器的私钥存储在 /etc/pki/tls/private/ 目录中:

    # mv <path>/server.example.com.key.pem /etc/pki/tls/private/
  4. 对服务器的私钥设置安全权限:

    # chmod 640 /etc/pki/tls/private/server.example.com.key.pem
    # chgrp mysql /etc/pki/tls/private/server.example.com.key.pem

    如果未授权的用户可以访问私钥,因此到 MariaDB 服务器的连接不再是安全的。

  5. 恢复 SELinux 上下文:

    #  restorecon -Rv /etc/pki/tls/
7.2.3.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)字段与服务器的主机名匹配。

流程

  1. 创建 /etc/my.cnf.d/mariadb-server-tls.cnf 文件:

    1. 添加以下内容来配置到私钥、服务器和 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
    2. 如果您有一个证书撤销列表(CRL),则将 MariaDB 服务器配置为使用它:

      ssl_crl = /etc/pki/tls/certs/example.crl.pem
    3. 可选:如果您运行 MariaDB 10.5.2 或更高版本,那么您可以拒绝未加密的连接尝试。要启用此功能,请附加:

      require_secure_transport = on
    4. 可选:如果您运行 MariaDB 10.4.6 或更高版本,那么您可以设置服务器应该支持的 TLS 版本。例如,要支持 TLS 1.2 和 TLS 1.3,请附加:

      tls_version = TLSv1.2,TLSv1.3

      默认情况下,服务器支持 TLS 1.1、TLS 1.2 和 TLS 1.3。

  2. 重启 mariadb 服务:

    # systemctl restart mariadb

验证

要简化故障排除,请在将本地客户端配置为使用 TLS 加密之前在 MariaDB 服务器上执行以下步骤:

  1. 验证 MariaDB 现在是否启用了 TLS 加密:

    # mysql -u root -p -e "SHOW GLOBAL VARIABLES LIKE 'have_ssl';"
    +---------------+-----------------+
    | Variable_name | Value           |
    +---------------+-----------------+
    | have_ssl      | YES             |
    +---------------+-----------------+

    如果 have_ssl 变量设置为 yes,则启用 TLS 加密。

  2. 如果您将 MariaDB 服务配置为只支持特定的 TLS 版本,则显示 tls_version 变量:

    # mysql -u root -p -e "SHOW GLOBAL VARIABLES LIKE 'tls_version';"
    +---------------+-----------------+
    | Variable_name | Value           |
    +---------------+-----------------+
    | tls_version   | TLSv1.2,TLSv1.3 |
    +---------------+-----------------+
7.2.3.3. 对特定的用户帐户需要 TLS 加密连接

可以访问敏感数据的用户应始终使用 TLS 加密连接,以避免通过网络发送未加密的数据。

如果您无法在服务器上配置所有连接都需要安全传输(require_secure_transport = on),请将单个用户帐户配置为需要 TLS 加密。

先决条件

  • MariaDB 服务器启用了 TLS 支持。
  • 您配置为需要安全传输的用户已存在。
  • 客户端信任签发服务器证书的 CA 证书。

流程

  1. 以管理员用户身份连接到 MariaDB 服务器:

    # mysql -u root -p -h server.example.com

    如果您的管理用户没有远程访问服务器的权限,请在 MariaDB 服务器上执行命令,并连接到 localhost

  2. 使用 REQUIRE SSL 子句强制用户必须使用 TLS 加密连接进行连接:

    MariaDB [(none)]> ALTER USER 'example'@'%' REQUIRE SSL;

验证

  1. 使用 TLS 加密,以 example 用户身份连接到服务器:

    # mysql -u example -p -h server.example.com --ssl
    ...
    MariaDB [(none)]>

    如果没有显示错误,且您可以访问交互式 MariaDB 控制台,则与 TLS 的连接成功。

  2. 尝试以禁用 TLS 的 example 用户身份进行连接:

    # mysql -u example -p -h server.example.com --skip-ssl
    ERROR 1045 (28000): Access denied for user 'example'@'server.example.com' (using password: YES)

    服务器拒绝登录尝试,因为此用户需要 TLS,但禁用了(--skip-ssl)。

7.2.4. 在 MariaDB 客户端中全局启用 TLS 加密

如果您的 MariaDB 服务器支持 TLS 加密,请将客户端配置为仅建立安全连接,并验证服务器证书。这个流程描述了如何为服务器上的所有用户启用 TLS 支持。

7.2.4.1. 将 MariaDB 客户端配置为默认使用 TLS 加密

在 RHEL 上,您可以全局配置 MariaDB 客户端使用 TLS 加密,并验证服务器证书中的通用名称(CN)与用户连接的主机名匹配。这可防止中间人攻击。

先决条件

  • MariaDB 服务器启用了 TLS 支持。
  • 如果 RHEL 不信任发布服务器证书的证书颁发机构(CA),则 CA 证书已被复制到客户端。

流程

  1. 如果 RHEL 不信任发布服务器证书的 CA:

    1. 将 CA 证书复制到 /etc/pki/ca-trust/source/anchors/ 目录中:

      # cp <path>/ca.crt.pem /etc/pki/ca-trust/source/anchors/
    2. 设置允许所有用户读取 CA 证书文件的权限:

      # chmod 644 /etc/pki/ca-trust/source/anchors/ca.crt.pem
    3. 重建 CA 信任数据库:

      # update-ca-trust
  2. 使用以下内容创建 /etc/my.cnf.d/mariadb-client-tls.cnf 文件:

    [client-mariadb]
    ssl
    ssl-verify-server-cert

    这些设置定义 MariaDB 客户端使用 TLS 加密(ssl),并且客户端将主机名与服务器证书中的 CN(ssl-verify-server-cert)进行比较。

验证

  • 使用主机名连接到服务器,并显示服务器的状态:

    # mysql -u root -p -h server.example.com -e status
    ...
    SSL:        Cipher in use is TLS_AES_256_GCM_SHA384

    如果 SSL 条目中包含 Cipher in use is…​,则连接是加密的。

    请注意,您在这个命令中使用的用户具有远程身份验证的权限。

    如果您连接的主机名与服务器的 TLS 证书中的主机名不匹配,则 ssl-verify-server-cert 参数会导致连接失败。例如,如果您连接到 localhost

    # mysql -u root -p -h localhost -e status
    ERROR 2026 (HY000): SSL connection error: Validation of SSL server certificate failed

其它资源

  • 系统上的 mysql (1) 手册页中的-- ssl* 参数描述。

7.2.5. 备份 MariaDB 数据

在 Red Hat Enterprise Linux 8 中从 MariaDB 数据库备份数据主要有两种方法:

  • 逻辑备份
  • 物理备份

逻辑备份 由恢复数据所需的 SQL 语句组成。这种类型的备份以纯文本文件的形式导出信息和记录。

与物理备份相比,逻辑备份的主要优势在于可移植性和灵活性。数据可以在其他硬件配置上恢复,MariaDB 版本或数据库管理系统(DBMS)上恢复,这些系统无法进行物理备份。

请注意,如果 mariadb.service 正在运行,则可以执行逻辑备份。逻辑备份不包括日志和配置文件。

物理备份由保存内容的文件和目录副本组成。

与逻辑备份相比,物理备份具有以下优点:

  • 输出更为紧凑。
  • 备份的大小会较小。
  • 备份和恢复速度更快。
  • 备份包括日志和配置文件。

请注意,当 mariadb.service 没有运行或者数据库中的所有表都被锁定以防止备份期间更改时,必须执行物理备份。

您可以使用以下一种 MariaDB 备份方法,来从 MariaDB 数据库备份数据:

  • 使用 mysqldump 的逻辑备份
  • 使用 Mariabackup 工具的物理在线备份
  • 文件系统备份
  • 作为备份解决方案复制
7.2.5.1. 使用 mysqldump 执行逻辑备份

mysqldump 客户端是一种备份实用程序,可用于转储数据库或数据库集合,用于备份或传输到其他数据库服务器。mysqldump 的输出通常包含 SQL 语句,用于重新创建服务器表结构、给它填充数据或两者兼而有之。mysqldump 也可以以其他格式生成文件,包括 XML 和分隔的文本格式,如 CSV。

要执行 mysqldump 备份,您可以使用以下一种选项:

  • 备份一个或多个所选的数据库
  • 备份所有数据库
  • 从一个数据库备份表子集

流程

  • 要转储单个数据库,请运行:

    # mysqldump [options] --databases db_name > backup-file.sql
  • 要一次转储多个数据库,请运行:

    # mysqldump [options] --databases db_name1 [db_name2 …​] > backup-file.sql
  • 要转储所有数据库,请运行:

    # mysqldump [options] --all-databases > backup-file.sql
  • 要将一个或多个转储的完整数据库加载回服务器,请运行:

    # mysql < backup-file.sql
  • 要将数据库加载到远程 MariaDB 服务器,请运行:

    # mysql --host=remote_host < backup-file.sql
  • 要转储一个数据库中的表的子集,请在 mysqldump 命令的末尾添加所选表的列表:

    # mysqldump [options] db_name [tbl_name …​​] > backup-file.sql
  • 要载入从一个数据库转储的表的子集,请运行:

    # mysql db_name < backup-file.sql
    注意

    此时,db_name 数据库必须存在。

  • 要查看 mysqldump 支持的选项列表,请运行:

    $ mysqldump --help

其它资源

  • 有关使用 mysqldump 进行逻辑备份的更多信息,请参阅 MariaDB 文档
7.2.5.2. 使用 Mariabackup 工具执行物理在线备份

mariabackup 是一个基于 Percona XtraBackup 技术的工具,能够执行 InnoDB、Aria 和 MyISAM 表的物理在线备份。这个工具是由 AppStream 存储库中的 mariadb-backup 软件包提供的。

mariabackup 支持对 MariaDB 服务器的全备份功能,其中包括加密和压缩的数据。

先决条件

  • mariadb-backup 软件包已在系统中安装:

    # yum install mariadb-backup
  • 您必须为 Mariabackup 提供要在其下运行备份的用户的凭证。您可以在命令行中或通过配置文件来提供凭证。
  • Mariabackup 的用户必须具有 RELOADLOCK TABLESREPLICATION CLIENT 特权。

要使用 Mariabackup 创建数据库备份,请使用以下流程:

流程

  • 要在在命令行上提供凭证的同时创建备份,请运行:

    $ mariabackup --backup --target-dir <backup_directory> --user <backup_user> --password <backup_passwd>

    target-dir 选项定义存储备份文件的目录。如果要执行全备份,目标目录必是空或者不存在。

    userpassword 选项允许您配置用户名和密码。

  • 要使用配置文件中设置的凭证创建备份:

    1. /etc/my.cnf.d/ 目录中创建配置文件,例如 /etc/my.cnf.d/mariabackup.cnf
    2. 将以下行添加到新文件的 [xtrabackup][mysqld] 部分中:

      [xtrabackup]
      user=myuser
      password=mypassword
    3. 执行备份:

      $ mariabackup --backup --target-dir <backup_directory>
7.2.5.3. 使用 Mariabackup 工具恢复数据

备份完成后,您可以使用 mariabackup 命令及以下一个选项来从备份中恢复数据:

  • --copy-back 允许您保存原始的备份文件。
  • --move-back 将备份文件移到数据目录中,并删除原始的备份文件。

要使用 Mariabackup 工具来恢复数据,请使用以下流程:

先决条件

  • 验证 mariadb 服务是否没有运行:

    # systemctl stop mariadb.service
  • 验证数据目录是否为空。
  • Mariabackup 的用户必须具有 RELOADLOCK TABLESREPLICATION CLIENT 特权。

流程

  1. 运行 mariabackup 命令:

    • 要恢复数据并保留原始备份文件,请使用 --copy-back 选项:

      $ mariabackup --copy-back --target-dir=/var/mariadb/backup/
    • 要恢复数据并删除原始备份文件,请使用 --move-back 选项:

      $ mariabackup --move-back --target-dir=/var/mariadb/backup/
  2. 修复文件权限。

    恢复数据库时,Mariabackup 会保留备份的文件和目录特权。但是,Mariabackup 以恢复数据库的用户和组的身份将文件写入磁盘。恢复备份后,您可能需要调整数据目录的所有者,以匹配 MariaDB 服务器的用户和组,通常两者都为 mysql

    例如,要递归地将文件的所有权改为 mysql 用户和组:

    # chown -R mysql:mysql /var/lib/mysql/
  3. 启动 mariadb 服务:

    # systemctl start mariadb.service
7.2.5.4. 执行文件系统备份

要创建 MariaDB 数据文件的文件系统备份,请将 MariaDB 数据目录的内容复制到您的备份位置。

要同时备份当前的配置或日志文件,请使用以下流程的可选步骤:

流程

  1. 停止 mariadb 服务:

    # systemctl stop mariadb.service
  2. 将数据文件复制到所需位置:

    # cp -r /var/lib/mysql /backup-location
  3. 可选:将配置文件复制到所需位置:

    # cp -r /etc/my.cnf /etc/my.cnf.d /backup-location/configuration
  4. 可选:将日志文件复制到所需位置:

    # cp /var/log/mariadb/* /backup-location/logs
  5. 启动 mariadb 服务:

    # systemctl start mariadb.service
  6. 将备份位置的备份数据加载到 /var/lib/mysql 目录时,请确保 mysql:mysql/var/lib/mysql 中所有数据的所有者:

    # chown -R mysql:mysql /var/lib/mysql
7.2.5.5. 作为备份解决方案复制

复制是源服务器的一个替代的备份解决方案。如果源服务器复制到副本服务器,备份可以在副本上运行,而不会对源造成任何影响。当您关闭副本,并从副本备份数据时,源仍然可以运行。

警告

复制本身并不是一个足够的备份解决方案。复制可以防止源服务器出现硬件故障,但它不能确保防止数据的丢失。建议您将对副本的任何其他备份解决方案与此方法一起使用。

7.2.6. 迁移到 MariaDB 10.3

RHEL 7 包含了 MariaDB 5.5,其作为来自 MySQL 数据库系列的服务器的默认实现。MariaDB 数据库服务器的后续版本可作为 RHEL 7 的软件集合提供。RHEL 8 提供 MariaDB 10.3MariaDB 10.5MariaDB 10.11MySQL 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.6.1. RHEL 7 和 RHEL 8 版本的 MariaDB 之间的显著区别

MariaDB 5.5MariaDB 10.3 之间的最重要的变化是:

  • MariaDB Galera 集群 是同步的多源集群,自 10.1 起就是 MariaDB 的标准部分。
  • 默认情况下不再启用 ARCHIVE 存储引擎,插件需要特别启用。
  • 默认情况下不再启用 BLACKHOLE 存储引擎,插件需要特别启用。
  • InnoDB 而不是 XtraDB 被用作默认存储引擎,后者用于 MariaDB 10.1 及更早的版本。

    如需了解更多详细信息,请参阅 MariaDB 10.2 为什么使用 InnoDB 而不是 XtraDB?

  • 新的 mariadb-connector-c 软件包为 MySQL 和 MariaDB 提供通用客户端库。这个程序库可用于 MySQLMariaDB 数据库服务器的任何版本。因此,用户可以将应用程序的一个构建连接到 Red Hat Enterprise Linux 8 发布的任何 MySQL 和 MariaDB 服务器。

要从 MariaDB 5.5 迁移到 MariaDB 10.3,您需要执行多个 配置更改

7.2.6.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 5.5 迁移到 MariaDB 10.3,但您必须执行上述迁移文档中描述的不同部分所需的所有配置变化。

7.2.6.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 数据库中的所有数据。

流程

  1. 确保 RHEL 8 系统上安装了 mariadb-server 软件包:

    # yum install mariadb-server
  2. 确保 mariadb 服务在复制数据时没有在源和目标系统上运行:

    # systemctl stop mariadb.service
  3. 将源位置的数据复制到 RHEL 8 目标系统上的 /var/lib/mysql/ 目录。
  4. 对目标系统上复制的文件设置适当的权限和 SELinux 上下文:

    # restorecon -vr /var/lib/mysql
  5. 在目标系统中启动 MariaDB 服务器:

    # systemctl start mariadb.service
  6. 运行 mysql_upgrade 命令来检查和修复内部表:

    $ mysql_upgrade
  7. 升级完成后,验证 /etc/my.cnf.d/ 目录中的所有配置文件是否只包含 MariaDB 10.3 的有效选项。
重要

有一些与原位升级相关的风险和已知问题。例如,一些查询可能无法正常工作,或者它们以与升级前不同的顺序运行。有关这些风险和问题的更多信息,以及有关原位升级的通用信息,请参阅 MariaDB 10.3 发行注记

7.2.7. 从 MariaDB 10.3 升级到 MariaDB 10.5

这部分描述了在 RHEL 8 上从 MariaDB 10.3 迁移到 MariaDB 10.5

7.2.7.1. MariaDB 10.3 和 MariaDB 10.5 之间的显著区别

MariaDB 10.3MariaDB 10.5 之间的显著变化包括:

  • MariaDB 现在默认使用 unix_socket 身份验证插件。该插件允许用户在通过本地 UNIX 套接字文件连接到 MariaDB 时使用操作系统凭证。
  • MariaDB 添加了名为 binary、mysql* 符号链接,指向 mariadb114 二进制文件。例如,mysqladminmysqlaccessmysqlshow 分别指向 mariadb-adminmariadb-accessmariadb-show 二进制代码。
  • SUPER 特权已被分成几个特权,以更好地与每个用户角色保持一致。因此,某些语句已更改了所需的权限。
  • 在并行 复制中,slave_parallel_mode 现在被默认设置为 静态
  • InnoDB 存储引擎 中,以下变量的默认值已发生变化:innodb_adaptive_hash_index 变为 OFFinnodb_checksum_algorithm 变为 full_crc32
  • MariaDB 现在使用用于管理 MariaDB 命令历史记录(the .mysql_history 文件)的底层软件的 libedit 实施,而不是之前使用的 readline 库。此更改会影响直接使用 .mysql_history 文件的用户。注意 .mysql_history 是一个由 MariaDBMySQL 应用管理的文件,用户不应直接使用该文件。人类可读的外表是巧合。

    注意

    要提高安全性,您可以考虑不维护历史记录文件。禁用记录命令历史记录:

    1. 删除 .mysql_history 文件(如果存在的话)。
    2. 使用以下任一方法:

      • MYSQL_HISTFILE 变量设置为 /dev/null,并将此设置包含在您的任何 shell 启动文件中。
      • .mysql_history 文件更改为指向 /dev/null 的符号链接:

        $ ln -s /dev/null $HOME/.mysql_history

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.7.2. 从 MariaDB 10.3 的 RHEL 8 版本升级到 MariaDB 10.5

此流程描述了使用 yummariadb-upgrade工具从 mariadb:10.3 模块流升级到 mariadb:10.5 模块流。

mariadb-upgrade 实用程序由 mariadb-server-utils 子软件包提供,该子软件包作为 mariadb-server 软件包的依赖项安装。

先决条件

  • 在执行升级前,备份存储在 MariaDB 数据库中的所有数据。

流程

  1. 停止 MariaDB 服务器:

    # systemctl stop mariadb.service
  2. 执行以下命令,以确定您的系统是否已准备好切换到更新的流:

    # yum distro-sync

    这个命令必须以以下信息结束:Nothing to doComplete!如需更多信息,请参阅 切换到更新的流

  3. 重置系统上的 mariadb 模块:

    # yum module reset mariadb
  4. 启用新的 mariadb:10.5 模块流:

    # yum module enable mariadb:10.5
  5. 同步安装的软件包以在流间进行更改:

    # yum distro-sync

    这将更新所有已安装的 MariaDB 软件包。

  6. 调整配置,以便位于 /etc/my.cnf.d/ 中的选项文件只包含对 MariaDB 10.5 有效的选项。详情请参阅 MariaDB 10.4MariaDB 10.5 的上游文档。
  7. 启动 MariaDB 服务器。

    • 在升级独立运行的数据库时:

      # systemctl start mariadb.service
    • 在升级 Galera 集群节点时:

      # galera_new_cluster

      mariadb 服务将自动启动。

  8. 执行 mariadb-upgrade 工具来检查和修复内部表。

    • 在升级独立运行的数据库时:

      # mariadb-upgrade
    • 在升级 Galera 集群节点时:

      # mariadb-upgrade --skip-write-binlog
重要

有一些与原位升级相关的风险和已知问题。例如,一些查询可能无法正常工作,或者它们以与升级前不同的顺序运行。有关这些风险和问题的更多信息,以及有关原位升级的通用信息,请参阅 MariaDB 10.5 发行注记

7.2.8. 从 MariaDB 10.5 升级到 MariaDB 10.11

这部分论述了在 RHEL 8 中从 MariaDB 10.5 迁移到 MariaDB 10.11。

7.2.8.1. MariaDB 10.5 和 MariaDB 10.11 之间的显著区别

MariaDB 10.5MariaDB 10.11 之间的显著变化包括:

  • 新的 sys_schema 功能是视图、功能和程序的集合,用于提供有关数据库使用情况的信息。
  • CREATE TABLE,ALTER TABLE,RENAME TABLE,DROP TABLE,DROP DATABASE, 和相关的数据定义语言(DDL)语句现在是原子的。语句必须完全完成,否则更改会被恢复。请注意,当使用 DROP TABLE 删除多个表时,只有每个单个丢弃是原子的,而不是表的完整列表。
  • 提供了一个新的 GRANT …​ TO PUBLIC 特权。
  • SUPERREAD ONLY ADMIN 权限现在分开。
  • 现在,您可以在新的 UUID 数据库数据类型中存储通用唯一标识符。
  • MariaDB 现在支持安全套接字层(SSL)协议版本 3。
  • MariaDB 服务器现在需要正确配置 SSL 才能启动。在以前的版本中,MariaDB 静默禁用 SSL,并在 SSL 配置错误时使用不安全连接。
  • MariaDB 现在支持通过 natural_sort_key () 函数的自然排序顺序。
  • 新的 SFORMAT 功能现在可用于任意文本格式。
  • utf8 字符集(和相关 collations)现在默认是 utf8mb3 的别名。
  • MariaDB 支持 Unicode Collation Algorithm (UCA) 14 联合。
  • MariaDBsystemd 套接字激活文件现在包括在 /usr/share/ 目录中。请注意,与上游相反,它们不是 RHEL 中默认配置的一部分。
  • 错误消息现在包含 MariaDB 字符串而不是 MySQL
  • 错误消息现在包括在中文语言中。
  • 默认的 logrotate 文件已更改。在迁移到 MariaDB 10.11 前检查您的配置。
  • 对于 MariaDBMySQL 客户端,命令行中指定的连接属性(如 --port=3306)现在强制客户端和服务器间的协议通信类型,如 tcp套接字管道 或内存。在以前的版本中,如果通过 UNIX 套接字连接的 MariaDB 客户端,则指定的端口会被忽略。
7.2.8.2. 从 RHEL 8 的 MariaDB 10.5 版本升级到 MariaDB 10.11

此流程描述了使用 yummariadb-upgrade 工具从 mariadb:10.5 模块流升级到 mariadb:10.11 模块流。

mariadb-upgrade 实用程序由 mariadb-server-utils 子软件包提供,该子软件包作为 mariadb-server 软件包的依赖项安装。

先决条件

  • 在执行升级前,备份存储在 MariaDB 数据库中的所有数据。

流程

  1. 停止 MariaDB 服务器:

    # systemctl stop mariadb.service
  2. 执行以下命令,以确定您的系统是否已准备好切换到更新的流:

    # yum distro-sync

    这个命令必须以以下信息结束:Nothing to doComplete!如需更多信息,请参阅 切换到更新的流

  3. 重置系统上的 mariadb 模块:

    # yum module reset mariadb
  4. 启用新的 mariadb:10.11 模块流:

    # yum module enable mariadb:10.11
  5. 同步安装的软件包以在流间进行更改:

    # yum distro-sync

    这将更新所有已安装的 MariaDB 软件包。

  6. 调整配置,以便位于 /etc/my.cnf.d/ 中的选项文件只包含对 MariaDB 10.11 有效的选项。详情请查看 MariaDB 10.6MariaDB 10.11 的上游文档。
  7. 启动 MariaDB 服务器。

    • 在升级独立运行的数据库时:

      # systemctl start mariadb.service
    • 在升级 Galera 集群节点时:

      # galera_new_cluster

      mariadb 服务将自动启动。

  8. 执行 mariadb-upgrade 工具来检查和修复内部表。

    • 在升级独立运行的数据库时:

      # mariadb-upgrade
    • 在升级 Galera 集群节点时:

      # mariadb-upgrade --skip-write-binlog
重要

有一些与原位升级相关的风险和已知问题。例如,一些查询可能无法正常工作,或者它们以与升级前不同的顺序运行。有关这些风险和问题的更多信息,以及有关原位升级的常规信息,请参阅 MariaDB 10.11 发行注记

7.2.9. 使用 Galera 复制 MariaDB

这部分描述了如何在 Red Hat Enterprise Linux 8 上使用 Galera 解决方案复制 MariaDB 数据库。

7.2.9.1. MariaDB Galera 集群介绍

Galera 复制是基于同步多源 MariaDB Galera集群 的创建,该群集由多个 MariaDB 服务器组成。与传统的主/副本设置(副本通常是只读的)不同,MariaDB Galera 群集中的节点都是可写的。

Galera 复制和 MariaDB 数据库之间的接口由写集复制 API(wsrep API) 定义的。

MariaDB Galera 集群 的主要特性是 :

  • 同步复制
  • 主动-主动多源拓扑
  • 对任何集群节点的读和写
  • 自动成员资格控制,故障节点从集群中删除
  • 自动节点加入
  • 行一级的并行复制
  • 直接客户端连接:用户可以登录到集群节点,并在复制运行时直接使用这些节点

同步复制意味着服务器在提交时复制事务,方法是将与事务关联的写入集合广播到集群中的每个节点。客户端(用户应用程序)直接连接到数据库管理系统(DBMS),可以体验类似于原生 MariaDB 的行为。

同步复制保证集群中一个节点上的更改会同时在集群中的其他节点上发生。

因此,与异步复制相比,同步复制具有以下优势:

  • 在特定集群节点间传播更改没有延迟
  • 所有集群节点始终一致
  • 如果其中一个集群节点崩溃,则不会丢失最新的更改
  • 所有集群节点上的事务都会并行执行
  • 整个集群的因果关系
7.2.9.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.3MariaDB 10.5MariaDB 10.11 分别包含 garbd systemd 服务的红帽版本,以及 /usr/lib/systemd/system/garbd.service/usr/sbin/garbd-wrapper 文件中的 galera 软件包的 wrapper 脚本。从 RHEL 8.6 开始,与 RHEL 一起分发的 MariaDB 还提供这些文件的上游版本(位于 /usr/share/doc/galera/garb-systemd/usr/share/doc/galera/garbd.service )。
7.2.9.3. 部署 MariaDB Galera 集群

先决条件

  • 通过从 mariadb 模块选择流(版本),并指定 galera 配置文件来安装 MariaDB Galera 集群 软件包。例如:

    # yum module install mariadb:10.3/galera

    因此,会安装以下软件包:

    • mariadb-server-galera
    • mariadb-server
    • galera

      mariadb-server-galera 软件包将 mariadb-servergalera 软件包作为其依赖项。

      有关需要安装哪些软件包来构建 MariaDB Galera 集群 的更多信息,请参阅 构建 MariaDB 集群的组件

  • 在系统首次添加到集群前,必须更新 MariaDB 服务器复制配置。

    默认配置在 /etc/my.cnf.d/galera.cnf 文件中。

    在部署 MariaDB Galera 集群 之前,请将所有节点上的 /etc/my.cnf.d/galera.cnf 文件中的 wsrep_cluster_address 选项设置为以以下字符串开头:

    gcomm://
    • 对于初始节点,可以将 wsrep_cluster_address 设置为空列表:

      wsrep_cluster_address="gcomm://"
    • 对于所有其他节点,将 wsrep_cluster_address 设置为包含已属于正在运行的集群的一部分的任何节点的地址。例如:

      wsrep_cluster_address="gcomm://10.0.0.10"

      有关如何设置 Galera 集群地址的更多信息,请参阅 Galera 集群地址

流程

  1. 通过在该节点上运行以下 wrapper 来引导新集群的第一个节点:

    # galera_new_cluster

    这个打包程序确保 MariaDB 服务器守护进程(mysqld)使用 --wsrep-new-cluster 选项运行。此选项提供了没有要连接的现有群集的信息。因此,节点会创建一个新的 UUID 来识别新集群。

    注意

    mariadb 服务支持 systemd 方法来与多个 MariaDB 服务器进程进行交互。因此,在有多个 MariaDB 服务器运行的情况下,您可以通过将实例名称指定为后缀来引导特定的实例:

    # galera_new_cluster mariadb@node1
  2. 在每个节点上运行以下命令将其他节点连接到集群:

    # systemctl start mariadb

    因此,节点连接到集群,并将自己与集群的状态同步。

7.2.9.4. 在 MariaDB Galera 集群中添加新节点

要在 MariaDB Galera 集群 中添加新节点,请使用以下步骤。

请注意,您也可以使用此流程重新连接已存在的节点。

流程

  • 在特定节点上,在 /etc/my.cnf.d/galera.cnf 配置文件的 [mariadb] 部分的 wsrep_cluster_address 选项中为一个或多个现有群集成员提供一个地址:

    [mariadb]
    wsrep_cluster_address="gcomm://192.168.0.1"

    当新节点连接到现有群集节点中的一个时,就可以看到集群中的所有节点。

    但是,最好在 wsrep_cluster_address 中列出集群的所有节点。

    因此,任何节点都可以通过连接到任何其他群集节点来加入群集,即使一个或多个群集节点停机了也没关系。当所有成员就成员资格达成一致时,集群的状态将会改变。如果新节点的状态与集群状态不同,新节点需要请求增加状态转移(IST)或状态快照传输(SST),来确保与其他节点保持一致。

7.2.9.5. 重启 MariaDB Galera 集群

如果您同时关闭所有节点,需要停止集群,运行的集群不再存在。但是,集群的数据仍然存在。

要重启集群,请引导第一个节点,如 配置 MariaDB Galera 集群 中所述。

警告

如果集群没有启动,并且第一个节点上的 mysqld 只是通过 systemctl start mariadb 命令来启动的,那么节点会尝试连接到 /etc/my.cnf.d/galera.cnf 文件 wsrep_cluster_address 选项中列出的至少一个节点。如果当前没有节点运行,那么重启失败。

7.2.10. 开发 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 软件包冲突,MySQLMariaDB 数据库服务器无法在 RHEL 8 中并行安装。您可以在容器中并行使用 MySQLMariaDB 数据库服务器,请参阅 在容器中运行多个 MySQL 和 MariaDB 版本

要安装 MySQL,请使用以下流程。

流程

  1. mysql 模块中选择 8.0 流(版本),并指定 服务器 配置文件来安装 MySQL 服务器软件包:

    # yum module install mysql:8.0/server
  2. 启动 mysqld 服务:

    # systemctl start mysqld.service
  3. 在引导时启用 mysqld 服务:

    # systemctl enable mysqld.service
  4. 建议:要在安装 MySQL 时提高安全性,请运行以下命令:

    $ mysql_secure_installation

    此命令启动一个完全交互的脚本,该脚本会提示过程中的每一步。该脚本可让您通过以下方法提高安全性:

    • 为 root 帐户设置密码
    • 删除匿名用户
    • 禁止远程 root 登录(在本地主机之外)
7.3.1.1. 在容器中运行多个 MySQL 和 MariaDB 版本

要在同一个主机上运行 MySQLMariaDB,请在容器中运行它们,因为您无法因为 RPM 软件包冲突而并行安装这些数据库服务器。

此流程包括 MySQL 8.0MariaDB 10.5 作为示例,但您可以使用红帽生态系统目录中提供的任何 MySQLMariaDB 容器版本。

先决条件

  • container-tools 模块已安装。

流程

  1. 使用您的红帽客户门户网站帐户向 registry.redhat.io registry 进行身份验证:

    # podman login registry.redhat.io

    如果您已登录到容器 registry,请跳过这一步。

  2. 在容器中运行 MySQL 8.0

    $ podman run -d --name <container_name> -e MYSQL_ROOT_PASSWORD=<mysql_root_password> -p <host_port_1>:3306 rhel8/mysql-80

    有关使用此容器镜像的更多信息,请参阅 红帽生态系统目录

  3. 在容器中运行 MariaDB 10.5

    $ podman run -d --name <container_name> -e MYSQL_ROOT_PASSWORD=<mariadb_root_password> -p <host_port_2>:3306 rhel8/mariadb-105

    有关使用此容器镜像的更多信息,请参阅 红帽生态系统目录

  4. 在容器中运行 MariaDB 10.11

    $ podman run -d --name <container_name> -e MYSQL_ROOT_PASSWORD=<mariadb_root_password> -p <host_port_3>:3306 rhel8/mariadb-1011

    有关使用此容器镜像的更多信息,请参阅 红帽生态系统目录

    注意

    两个数据库服务器的容器名称和主机端口必须有所不同。

  5. 要确保客户端可以访问网络中的数据库服务器,请在防火墙中打开主机端口:

    # firewall-cmd --permanent --add-port={<host_port>/tcp,<host_port>/tcp,...}
    # firewall-cmd --reload

验证

  1. 显示正在运行的容器信息:

    $ podman ps
  2. 连接到数据库服务器,并以 root 用户身份登录:

    # mysql -u root -p -h localhost -P <host_port> --protocol tcp

7.3.2. 配置 MySQL

要为网络配置 MySQL 服务器,请使用以下流程。

流程

  1. 编辑 /etc/my.cnf.d/mysql-server.cnf 文件的 [mysqld] 部分。您可以设置以下配置指令:

    • bind-address - 是服务器监听的地址。可能的选项有:

      • 主机名
      • IPv4 地址
      • IPv6 地址
    • skip-networking - 控制服务器是否监听 TCP/IP 连接。可能的值有:

      • 0 - 监听所有客户端
      • 1 - 只监听本地客户端
    • 端口 - MySQL 侦听 TCP/IP 连接的端口。
  2. 重启 mysqld 服务:

    # systemctl restart mysqld.service

7.3.3. 在 MySQL 服务器上设置 TLS 加密

默认情况下,MySQL 使用未加密的连接。对于安全连接,请在 MySQL 服务器上启用 TLS 支持,并将您的客户端配置为建立加密连接。

7.3.3.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 文档。

流程

  1. 将 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/
  2. 在 CA 和服务器证书上设置权限,以使 MySQL 服务器能够读取文件:

    # chmod 644 /etc/pki/tls/certs/server.example.com.crt.pem /etc/pki/tls/certs/ca.crt.pem

    由于证书是建立安全连接前通信的一部分,因此任何客户端都可以在不需要身份验证的情况下检索它们。因此,您不需要对 CA 和服务器证书文件设置严格的权限。

  3. 将服务器的私钥存储在 /etc/pki/tls/private/ 目录中:

    # mv <path>/server.example.com.key.pem /etc/pki/tls/private/
  4. 对服务器的私钥设置安全权限:

    # chmod 640 /etc/pki/tls/private/server.example.com.key.pem
    # chgrp mysql /etc/pki/tls/private/server.example.com.key.pem

    如果未授权的用户可以访问私钥,则到 MySQL 服务器的连接不再是安全的。

  5. 恢复 SELinux 上下文:

    # restorecon -Rv /etc/pki/tls/
7.3.3.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)字段与服务器的主机名相匹配。

流程

  1. 创建 /etc/my.cnf.d/mysql-server-tls.cnf 文件:

    1. 添加以下内容来配置到私钥、服务器和 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
    2. 如果您有证书撤销列表(CRL),请配置 MySQL 服务器来使用它:

      ssl_crl = /etc/pki/tls/certs/example.crl.pem
    3. 可选:拒绝没有加密的连接尝试。要启用此功能,请附加:

      require_secure_transport = on
    4. 可选:设置服务器应支持的 TLS 版本。例如,要支持 TLS 1.2 和 TLS 1.3,请附加:

      tls_version = TLSv1.2,TLSv1.3

      默认情况下,服务器支持 TLS 1.1、TLS 1.2 和 TLS 1.3。

  2. 重启 mysqld 服务:

    # systemctl restart mysqld

验证

要简化故障排除,请在将本地客户端配置为使用 TLS 加密前在 MySQL 服务器上执行以下步骤:

  1. 验证 MySQL 现在是否启用了 TLS 加密:

    # mysql -u root -p -h <MySQL_server_hostname> -e "SHOW session status LIKE 'Ssl_cipher';"
    +---------------+------------------------+
    | Variable_name | Value                  |
    +---------------+------------------------+
    | Ssl_cipher    | TLS_AES_256_GCM_SHA384 |
    +---------------+------------------------+
  2. 如果您将 MySQL 服务器配置为只支持特定的 TLS 版本,请显示 tls_version 变量:

    # mysql -u root -p -e "SHOW GLOBAL VARIABLES LIKE 'tls_version';"
    +---------------+-----------------+
    | Variable_name | Value           |
    +---------------+-----------------+
    | tls_version   | TLSv1.2,TLSv1.3 |
    +---------------+-----------------+
  3. 验证服务器是否使用正确的 CA 证书、服务器证书和私钥文件:

    # mysql -u root -e "SHOW GLOBAL VARIABLES WHERE Variable_name REGEXP '^ssl_ca|^ssl_cert|^ssl_key';"
    +-----------------+-------------------------------------------------+
    | Variable_name   | Value                                           |
    +-----------------+-------------------------------------------------+
    | ssl_ca          | /etc/pki/tls/certs/ca.crt.pem                   |
    | ssl_capath      |                                                 |
    | ssl_cert        | /etc/pki/tls/certs/server.example.com.crt.pem   |
    | ssl_key         | /etc/pki/tls/private/server.example.com.key.pem |
    +-----------------+-------------------------------------------------+
7.3.3.3. 对特定的用户帐户需要 TLS 加密连接

可以访问敏感数据的用户应始终使用 TLS 加密连接,以避免通过网络发送未加密的数据。

如果您无法在服务器上配置所有连接都需要安全传输(require_secure_transport = on),请将单个用户帐户配置为需要 TLS 加密。

先决条件

  • MySQL 服务器启用了 TLS 支持。
  • 您配置为需要安全传输的用户已存在。
  • CA 证书存储在客户端上。

流程

  1. 以管理用户身份连接到 MySQL 服务器:

    # mysql -u root -p -h server.example.com

    如果您的管理用户没有远程访问服务器的权限,请在 MySQL 服务器上执行命令,并连接到 localhost

  2. 使用 REQUIRE SSL 子句强制用户必须使用 TLS 加密连接进行连接:

    MySQL [(none)]> ALTER USER 'example'@'%' REQUIRE SSL;

验证

  1. 使用 TLS 加密,以 example 用户身份连接到服务器:

    # mysql -u example -p -h server.example.com
    ...
    MySQL [(none)]>

    如果没有显示错误,且您可以访问交互式 MySQL 控制台,则与 TLS 的连接成功。

    默认情况下,如果服务器提供了,客户端会自动使用 TLS 加密。因此,--ssl-ca=ca.crt.pem--ssl-mode=VERIFY_IDENTITY 选项不是必需的,但可以提高安全性,使用这些选项,客户端可以验证服务器的身份。

  2. 尝试以禁用 TLS 的 example 用户身份进行连接:

    # 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)

    服务器拒绝登录尝试,因为此用户需要 TLS,但禁用了(--ssl-mode=DISABLED)。

7.3.4. 在 MySQL 客户端中使用 CA 证书验证全局启用 TLS 加密

如果您的 MySQL 服务器支持 TLS 加密,请将您的客户端配置为仅建立安全连接,并验证服务器证书。这个流程描述了如何为服务器上的所有用户启用 TLS 支持。

7.3.4.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

    这些设置定义 MySQL 客户端使用 TLS 加密,并且客户端将主机名与服务器证书中的 CN 进行比较(ssl-mode=VERIFY_IDENTITY)。另外,它还指定到 CA 证书的路径(ssl-ca)。

验证

  • 使用主机名连接到服务器,并显示服务器的状态:

    # mysql -u root -p -h server.example.com -e status
    ...
    SSL:        Cipher in use is TLS_AES_256_GCM_SHA384

    如果 SSL 条目中包含 Cipher in use is…​,则连接是加密的。

    请注意,您在这个命令中使用的用户具有远程身份验证的权限。

    如果您连接的主机名与服务器的 TLS 证书中的主机名不匹配,则 ssl-mode=VERIFY_IDENTITY 参数会导致连接失败。例如,如果您连接到 localhost

    # mysql -u root -p -h localhost -e status
    ERROR 2026 (HY000): SSL connection error: error:0A000086:SSL routines::certificate verify failed

其它资源

  • 系统上的 mysql (1) 手册页中的-- ssl* 参数描述。

7.3.5. 备份 MySQL 数据

在 Red Hat Enterprise Linux 8 中,备份 MySQL 数据库数据有两个主要方法:

  • 逻辑备份
  • 物理备份

逻辑备份 由恢复数据所需的 SQL 语句组成。这种类型的备份以纯文本文件的形式导出信息和记录。

与物理备份相比,逻辑备份的主要优势在于可移植性和灵活性。数据可以在其他硬件配置、MySQL 版本或数据库管理系统(DBMS)上恢复,而这些数据无法进行物理备份。

请注意,如果 mysqld.service 正在运行,也可以执行逻辑备份。逻辑备份不包括日志和配置文件。

物理备份由保存内容的文件和目录副本组成。

与逻辑备份相比,物理备份具有以下优点:

  • 输出更为紧凑。
  • 备份的大小会较小。
  • 备份和恢复速度更快。
  • 备份包括日志和配置文件。

请注意,当 mysqld.service 没有运行或数据库中的所有表被锁住时,才能执行物理备份,以防在备份过程中数据有更改。

您可以使用以下 MySQL 备份方法之一从 MySQL 数据库备份数据:

  • 使用 mysqldump 的逻辑备份
  • 文件系统备份
  • 作为备份解决方案复制
7.3.5.1. 使用 mysqldump 执行逻辑备份

mysqldump 客户端是一种备份实用程序,可用于转储数据库或数据库集合,用于备份或传输到其他数据库服务器。mysqldump 的输出通常包含 SQL 语句,用于重新创建服务器表结构、给它填充数据或两者兼而有之。mysqldump 也可以以其他格式生成文件,包括 XML 和分隔的文本格式,如 CSV。

要执行 mysqldump 备份,您可以使用以下一种选项:

  • 备份一个或多个所选的数据库
  • 备份所有数据库
  • 从一个数据库备份表子集

流程

  • 要转储单个数据库,请运行:

    # mysqldump [options] --databases db_name > backup-file.sql
  • 要一次转储多个数据库,请运行:

    # mysqldump [options] --databases db_name1 [db_name2 ...] > backup-file.sql
  • 要转储所有数据库,请运行:

    # mysqldump [options] --all-databases > backup-file.sql
  • 要将一个或多个转储的完整数据库加载回服务器,请运行:

    # mysql < backup-file.sql
  • 要将数据库加载到远程 MySQL 服务器,请运行:

    # mysql --host=remote_host < backup-file.sql
  • 要从一个数据库中转储表的字面子集,请在 mysqldump 命令末尾添加所选表的列表:

    # mysqldump [options] db_name [tbl_name ...​] > backup-file.sql
  • 要加载从一个数据库转储的表的字面子集,请运行:

    # mysql db_name < backup-file.sql
    注意

    此时,db_name 数据库必须存在。

  • 要查看 mysqldump 支持的选项列表,请运行:

    $ mysqldump --help
7.3.5.2. 执行文件系统备份

要创建 MySQL 数据文件的文件系统备份,请将 MySQL 数据目录的内容复制到您的备份位置。

要同时备份当前的配置或日志文件,请使用以下流程的可选步骤:

流程

  1. 停止 mysqld 服务:

    # systemctl stop mysqld.service
  2. 将数据文件复制到所需位置:

    # cp -r /var/lib/mysql /backup-location
  3. 可选:将配置文件复制到所需位置:

    # cp -r /etc/my.cnf /etc/my.cnf.d /backup-location/configuration
  4. 可选:将日志文件复制到所需位置:

    # cp /var/log/mysql/* /backup-location/logs
  5. 启动 mysqld 服务:

    # systemctl start mysqld.service
  6. 将备份位置的备份数据加载到 /var/lib/mysql 目录时,请确保 mysql:mysql/var/lib/mysql 中所有数据的所有者:

    # chown -R mysql:mysql /var/lib/mysql
7.3.5.3. 作为备份解决方案复制

复制是源服务器的一个替代的备份解决方案。如果源服务器复制到副本服务器,备份可以在副本上运行,而不会对源造成任何影响。当您关闭副本,并从副本备份数据时,源仍然可以运行。

有关如何复制 MySQL 数据库的说明,请参阅 复制 MySQL

警告

复制本身并不是一个足够的备份解决方案。复制可以防止源服务器出现硬件故障,但它不能确保防止数据的丢失。建议您将对副本的任何其他备份解决方案与此方法一起使用。

其它资源

7.3.6. 迁移到 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.0MariaDB 10.3MariaDB 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 数据库中的所有数据。

流程

  1. 确定在 RHEL 8 系统上安装了 mysql-server 软件包:

    # yum install mysql-server
  2. 确保在复制数据时 mysqld 服务不在源或目标系统上运行:

    # systemctl stop mysqld.service
  3. 将 RHEL 7 源系统上 /var/opt/rh/rh-mysql80/lib/mysql/ 目录中的数据复制到 RHEL 8 目标系统上的 /var/lib/mysql/ 目录中。
  4. 对目标系统上复制的文件设置适当的权限和 SELinux 上下文:

    # restorecon -vr /var/lib/mysql
  5. 确保 mysql:mysql/var/lib/mysql 目录中所有数据的所有者:

    # chown -R mysql:mysql /var/lib/mysql
  6. 在目标系统上启动 MySQL 服务器:

    # systemctl start mysqld.service

    注意:在 MySQL 的早期版本中,需要 mysql_upgrade 命令来检查和修复内部表。现在,当您启动服务器时会自动完成此操作。

7.3.7. 复制 MySQL

MySQL 为复制提供各种配置选项,范围从基本到高级。这部分描述了使用全局事务标识符(GTID)在新安装的 MySQL 服务器上在 MySQL 中进行复制的一种基于事务的方法。使用 GTID 简化了事务识别和一致性验证。

要在 MySQL 中设置复制,您必须:

重要

如果要使用现有的 MySQL 服务器进行复制,您必须首先同步数据。如需更多信息,请参阅 上游文档

7.3.7.1. 配置 MySQL 源服务器

您可以设置 MySQL 源服务器所需的配置选项,来正确运行并复制数据库服务器上所做的所有更改。

先决条件

  • 源服务器已安装。

流程

  1. 包括 /etc/my.cnf.d/mysql-server.cnf 文件中 [mysqld] 部分下的以下选项:

    • bind-address=source_ip_adress

      从副本到源的连接需要这个选项。

    • server-id=id

      id 必须是唯一的。

    • 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_ignore_db=db_name

      使用此选项从复制中排除特定的数据库。

  2. 重启 mysqld 服务:

    # systemctl restart mysqld.service
7.3.7.2. 配置 MySQL 副本服务器

您可以设置 MySQL 副本服务器所需的配置选项,以确保成功复制。

先决条件

  • 副本服务器已安装。

流程

  1. 包括 /etc/my.cnf.d/mysql-server.cnf 文件中 [mysqld] 部分下的以下选项:

    • server-id=id

      id 必须是唯一的。

    • 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_ignore_db=db_name

      使用此选项从复制中排除特定的数据库。

  2. 重启 mysqld 服务:

    # systemctl restart mysqld.service
7.3.7.3. 在 MySQL 源服务器上创建复制用户

您必须创建一个复制用户,并授予这个用户所需的复制流量的权限。此流程演示了如何创建具有适当权限的复制用户。仅在源服务器上执行这些步骤。

先决条件

流程

  1. 创建复制用户:

    mysql> CREATE USER 'replication_user'@'replica_server_ip' IDENTIFIED WITH mysql_native_password BY 'password';
  2. 授予用户复制权限:

    mysql> GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'replica_server_ip';