将 Linux 主机上的 SQL Server 加入 Active Directory 域

适用于:SQL Server - Linux

本文提供了有关如何将 SQL Server Linux 主机加入 Active Directory 域的常规指导。 有两种方法:使用内置 SSSD 包或使用第三方 Active Directory 提供程序。 第三方域加入产品的示例包括 PowerBroker 标识服务 (PBIS)One IdentityCentrify。 本指南涵盖用于检查 Active Directory 配置的步骤。 但本指南不提供在使用第三方实用程序时如何将计算机加入域的相关说明。

先决条件

在配置 Active Directory 身份验证之前,需要先在自己的网络上设置 Active Directory 域控制器 (Windows)。 然后将自己的 Linux 主机上的 SQL Server 加入 Active Directory 域。

本文中所述的示例步骤仅用于指导,请参考 Ubuntu 16.04、Red Hat Enterprise Linux (RHEL) 7.x 和 SUSE Linux Enterprise Server (SLES) 12 操作系统。 根据你整体环境的配置和操作系统版本,实际步骤可能略有不同。 例如,Ubuntu 18.04 使用 netplan,而 Red Hat Enterprise Linux (RHEL) 8.x 使用 nmcli 等工具来管理和配置网络。 建议让你环境的系统和域管理员进行特定的工具、配置、自定义以及所需的任何故障排除。

注意

有关使用最新版本的 Ubuntu、RHEL 或 SLES 配置 Active Directory 的信息,请参阅教程:使用 adutil 为 Linux 上的 SQL Server 配置 Active Directory 身份验证

反向 DNS (rDNS)

将运行 Windows Server 的计算机设置为域控制器时,可能不会默认获得 rDNS 区域。 请确保将运行 SQL Server 的 Linux 计算机的域控制器和 IP 地址都存在适用的 rDNS 区域。

还请确保存在一个 PTR 记录指向域控制器。

检查与域控制器的连接

检查你能否通过域的短名称和完全限定的名称连接域控制器,且你能否使用域控制器的主机名实现连接。 域控制器的 IP 也应解析为域控制器的 FQDN:

ping contoso
ping contoso.com
ping dc1.contoso.com
nslookup <IP address of dc1.contoso.com>

提示

本教程分别使用 contoso.com 和 CONTOSO.COM 作为示例域和领域名contoso.comCONTOSO.COM。 它还使用 DC1.CONTOSO.COM 作为域控制器的完全限定的域名示例DC1.CONTOSO.COM。 需要使用自己的值替换这些名称。

如果其中任何一个名称未能通过检查,请更新域搜索列表。 以下部分分别提供有关 Ubuntu、Red Hat Enterprise Linux (RHEL) 和 SUSE Linux Enterprise Server (SLES) 的说明。

Ubuntu 16.04

  1. 编辑“/etc/network/interfaces”文件,以使 Active Directory 域出现在域搜索列表中/etc/network/interfaces

    # The primary network interface
    auto eth0
    iface eth0 inet dhcp
    dns-nameservers <Domain controller IP address>
    dns-search <Active Directory domain name>
    

    注意

    不同计算机的网络接口 eth0 可能略有不同。 若要找出正在使用的接口,请运行“ifconfig”。 然后复制具有 IP 地址且传输和接收了字节的接口。

  2. 编辑此文件后,重启网络服务:

    sudo ifdown eth0 && sudo ifup eth0
    
  3. 下一步,检查“/etc/resolv.conf”文件是否包含类似以下示例的行/etc/resolv.conf

    search contoso.com com
    nameserver <Domain controller IP address>
    

Ubuntu 18.04

  1. 编辑 [sudo vi /etc/netplan/******.yaml] 文件,使 Active Directory 域出现在域搜索列表中:

    network:
      ethernets:
        eth0:
                dhcp4: true
    
                dhcp6: true
                nameservers:
                        addresses: [<Domain controller IP address>]
                        search: [<Active Directory domain name>]
      version: 2
    

    注意

    不同计算机的网络接口 eth0 可能略有不同。 若要找出正在使用的接口,请运行“ifconfig”。 然后复制具有 IP 地址且传输和接收了字节的接口。

  2. 编辑此文件后,重启网络服务:

    sudo netplan apply
    
  3. 下一步,检查 /etc/resolv.conf 文件是否包含类似以下示例的行:

    search contoso.com com
    nameserver <Domain controller IP address>
    

RHEL 7.x

  1. 编辑 /etc/sysconfig/network-scripts/ifcfg-eth0 文件,以使 Active Directory 域出现在域搜索列表中。 或根据需要编辑其他的接口配置文件:

    PEERDNS=no
    DNS1=<Domain controller IP address>
    DOMAIN="contoso.com com"
    
  2. 编辑此文件后,重启网络服务:

    sudo systemctl restart network
    
  3. 现在检查“/etc/resolv.conf”文件是否包含类似以下示例的行/etc/resolv.conf

    search contoso.com com
    nameserver <Domain controller IP address>
    
  4. 如果仍无法对域控制器进行 ping 操作,请查找域控制器的完全限定的域名和 IP 地址。 例如,域名为 DC1.CONTOSO.COM。 在 /etc/hosts 中添加以下条目:

    <IP address> DC1.CONTOSO.COM CONTOSO.COM CONTOSO
    

SLES 12

  1. 编辑 /etc/sysconfig/network/config 文件,以使域控制器 IP 用于 DNS 查询,且 Active Directory 域出现在域搜索列表中:

    NETCONFIG_DNS_STATIC_SEARCHLIST=""
    NETCONFIG_DNS_STATIC_SERVERS="<Domain controller IP address>"
    
  2. 编辑此文件后,重启网络服务:

    sudo systemctl restart network
    
  3. 下一步,检查“/etc/resolv.conf”文件是否包含类似以下示例的行/etc/resolv.conf

    search contoso.com com
    nameserver <Domain controller IP address>
    

加入 Active Directory 域

验证完基本配置和与域控制器的连接性后,可以通过两个选项将 SQL Server Linux 主机与 Active Directory 域控制器联接:

选项 1:使用 SSSD 包加入 Active Directory 域

此方法使用 realmd 和 sssd 包将 SQL Server 主机加入到 Active Directory 域。

注意

这是将 Linux 主机加入 Active Directory 域控制器的首选方法。

下面的步骤用于将 SQL Server 主机加入 Active Directory 域:

  1. 使用 realmd 将主机加入 Active Directory 域。 需要先使用 Linux 分发的包管理器在 SQL Server 主机上安装 realmd 和 Kerberos 客户端包

    RHEL:

    sudo yum install realmd krb5-workstation
    

    SLES 12:

    这些步骤特定于 SLES 12。

    sudo zypper addrepo https://download.opensuse.org/repositories/network/SLE_12/network.repo
    sudo zypper refresh
    sudo zypper install realmd krb5-client sssd-ad
    

    Ubuntu 16.04:

    sudo apt-get install realmd krb5-user software-properties-common python-software-properties packagekit
    

    Ubuntu 18.04:

    sudo apt-get install realmd krb5-user software-properties-common python3-software-properties packagekit
    sudo apt-get install adcli libpam-sss libnss-sss sssd sssd-tools
    
  2. 安装 Kerberos 客户端包时,如果系统提示输入领域名,请以大写形式输入自己的域名。

  3. 确认自己的 DNS 配置正确后,请通过运行以下命令加入域。 必须使用在 Active Directory 中具有足够权限的 Active Directory 帐户进行身份验证,才能将新计算机加入域。 此命令在 Active Directory 中创建新的计算机帐户,创建 /etc/krb5.keytab 主机密钥表文件,在 /etc/sssd/sssd.conf 中配置域,并更新 /etc/krb5.conf

    由于 realmd 出现问题,请先将计算机主机名设置为 FQDN,而不是设置为计算机名称。 否则,realmd 可能不会为计算机创建某些必需 SPN,而且 DNS 条目也不会自动更新,即使你的域控制器支持动态 DNS 更新也是如此。

    sudo hostname <old hostname>.contoso.com
    

    运行上述命令后,/etc/hostname 文件应包含 <old hostname>.contoso.com。

    sudo realm join contoso.com -U 'user@CONTOSO.COM' -v
    

    应会显示一条消息:Successfully enrolled machine in realm

    下表列出了可能会收到的一些错误消息以及解决建议:

    错误消息 建议
    Necessary packages are not installed 请先使用 Linux 分发的包管理器安装这些包,然后再次运行领域加入命令。
    Insufficient permissions to join the domain 请与域管理员核实自己是否拥有足够的权限将 Linux 计算机加入自己的域。
    KDC reply did not match expectations 你可能没有为用户指定正确的领域名。 领域名区分大小写(通常为大写),可使用命令领域发现 contoso.com 进行标识。

    SQL Server 使用 SSSD 和 NSS 将用户帐户和组映射到安全标识符 (SID)。 若要成功创建 Active Directory 登录名,必须为 SQL Server 配置 SSSD 并运行它。 “realmd”通常会在加入域时自动执行此操作,但在某些情况下,你必须单独执行此操作

    有关详细信息,请参阅如何手动配置 SSSD配置 NSS 以使用 SSSD

  4. 请确认自己现在是否可以从域中收集有关用户的信息,及是否可以该用户的身份获取 Kerberos 工单。 下面的示例使用 idkinitklist 命令执行此操作。

    id user@contoso.com
    
    uid=1348601103(user@contoso.com) gid=1348600513(domain group@contoso.com) groups=1348600513(domain group@contoso.com)
    
    kinit user@CONTOSO.COM
    
    Password for user@CONTOSO.COM:
    
    klist
    Ticket cache: FILE:/tmp/krb5cc_1000
    Default principal: user@CONTOSO.COM
    

    注意

    如果 id user\@contoso.com 返回 No such user,请通过运行命令 sudo systemctl status sssd 确保 SSSD 服务成功启动。 如果服务运行且仍显示该错误,请尝试为 SSSD 启用详细日志记录。 有关详细信息,请参阅 Red Hat 文档:对 SSSD 进行故障排除

    如果 kinit user\@CONTOSO.COM 返回 KDC reply didn't match expectations while getting initial credentials,请确保用大写字母指定领域。

有关详细信息,请参阅 Red Hat 文档:发现和加入标识域

选项 2:使用第三方 OpenLDAP 提供程序实用工具

可以使用 PBISVASCentrify 等第三方实用程序。 本文不提供每个实用程序的相关步骤。 需先使用其中某个实用程序将 SQL Server 的 Linux 主机加入域,然后才能继续操作。

SQL Server 不使用第三方集成器的代码或任何与 Active Directory 相关的查询的库。 SQL Server 始终在此设置中直接使用 OpenLDAP 库调用查询 Active Directory。 第三方集成器仅用于将 Linux 主机加入 Active Directory 域,SQL Server 不与这些实用程序直接通信。

重要

请查看配合使用 Active Directory 身份验证与 Linux 上的 SQL Server 一文“其他配置选项”部分中关于使用 mssql-conf network.disablesssd 配置选项的建议。

验证是否已正确配置 /etc/krb5.conf。 对于大多数第三方 Active Directory 提供程序,此配置是自动完成的。 但是,请检查“/etc/krb5.conf”的以下值,以防止将来出现任何问题/etc/krb5.conf

[libdefaults]
default_realm = CONTOSO.COM

[realms]
CONTOSO.COM = {
}

[domain_realm]
contoso.com = CONTOSO.COM
.contoso.com = CONTOSO.COM

检查反向 DNS 是否已正确配置

以下命令应返回运行 SQL Server 的主机的完全限定的域名 (FQDN)。 例如 SqlHost.contoso.com

host <IP address of SQL Server host>

此命令的输出应类似于 <reversed IP address>.in-addr.arpa domain name pointer SqlHost.contoso.com。 如果此命令未返回主机的 FQDN,或者 FQDN 不正确,请将 Linux 主机上的 SQL Server 的反向 DNS 条目添加到 DNS 服务器。

后续步骤

本文介绍了如何使用 Active Directory 身份验证在 Linux 主机上配置 SQL Server。 要配置 Linux 上的 SQL Server 以使其支持 Active Directory 帐户,请按照以下说明进行操作。