去年,microsoft.sql.server Ansible 角色引入到红帽企业 Linux(RHEL)中。随着 RHEL 8.8 和 9.2 的发布,该角色收到了更新,其中包含多项新功能:
- 使用 Active Directory 服务器配置 SQL Server 的身份验证。
- 扩展了 Always On 可用性组的管理功能,支持配置异步可用性副本,并支持配置 read-scale 的 Always On 集群。
- 在 RHEL 8 和 RHEL 9 上配置和管理 SQL Server 2022。
本文将介绍与 Active Directory(AD)的集成,并指导您完成整个过程:
- 确保您满足为 SQL Server 配置 AD 身份验证的要求
- 准备 Ansible 清单文件
- 了解必须设置的变量,并使用该角色来准备 Ansible Playbook 文件,以使用 Active Directory 自动配置身份验证
- 运行该角色
- 完成配置
- 检查身份验证是否按预期工作
前提条件
在开始之前,您必须确保满足该角色的前提条件。
- 您必须有一个正在运行的 Active Directory 服务器,并可由 RHEL 计算机访问。有关前提条件的概述,请参阅 Microsoft 文档:将 Linux 主机上的 SQL Server 加入 Active Directory 域。如果您在满足前提条件方面遇到问题,请参阅 Active Directory 故障排查。
- 确保 DNS 查询正常工作。您必须能够从 RHEL 计算机上,通过 Active Directory 服务器的 IP 地址及其 DNS 短名称和完整名称,成功对 Active Directory 服务器进行 ping 操作。
- 确保反向 DNS 查询正常工作。对 Active Directory 服务器的 IP 地址执行
nslookup
命令时,必须确保能解析到正确的 DNS 名称,而且 DNS 名称也能反向解析到正确的 IP 地址。 - 确保您具有适当的 Active Directory 用户的访问权限和凭据,要有权在域中创建账户和服务主体名称(SPN)。
准备 Ansible 清单
清单中只允许包含您要为 Active Directory 身份验证配置的 RHEL 服务器。本示例使用清单文件 inventory.yml
,其包含单个 RHEL 节点 rhel-sql-server.example.com
:
$ cat inventory.yml
---
all:
hosts:
rhel-sql-server.example.com
使用该角色
接下来,您需要一个 Playbook 来配置 Active Directory 身份验证。最简单易行的做法是先查看示例 Playbook,根据需要调整变量和参数,然后将其用作您自己的 Playbook 的基础。
请注意,该角色需要使用变量来设置一些密码。本文中的示例以明文提供这些变量,但在生产环境中,您必须使用 Ansible vault 对密码加密。
示例 Playbook
以下是保存为 playbook.yml
的 Playbook 示例。它使用 Active Directory 配置身份验证:
---
- name: Configure with AD server authentication
hosts: all
vars:
# General variables
mssql_accept_microsoft_odbc_driver_17_for_sql_server_eula: true
mssql_accept_microsoft_cli_utilities_for_sql_server_eula: true
mssql_accept_microsoft_sql_server_standard_eula: true
mssql_version: 2022
mssql_password: "p@55w0rD"
mssql_edition: Evaluation
mssql_manage_firewall: true
# AD Integration required variables
mssql_ad_configure: true
mssql_ad_sql_user_name: sqluser
mssql_ad_sql_password: "p@55w0rD1"
ad_integration_realm: domain.com
ad_integration_user: Administrator
ad_integration_password: Secret123
# AD Integration optional variables
mssql_ad_sql_user_dn: "CN=sqluser,CN=Users,DC=DOMAIN,DC=COM"
mssql_ad_netbios_name: domain
示例 Playbook 中的变量分为三个部分:常规变量、必需变量和可选变量。
常规变量
接受最终用户许可协议(EULA)的变量必须设置为 true
,以确认您同意 mssql-server
软件包的条款。其中包括:
mssql_accept_microsoft_odbc_driver_17_for_sql_server_eula
mssql_accept_microsoft_cli_utilities_for_sql_server_eula
mssql_accept_microsoft_sql_server_standard_eula
其他变量:
mssql_version
用于定义您要管理的 SQL Server 的版本(2017、2019 或 2022)。mssql_password
用于设置sa
用户的密码mssql_edition
用于定义要为 SQL Server 配置的版本mssql_manage_firewall
用于启用防火墙并打开所需的端口。这是一个可选变量。仅当您希望该角色为您管理防火墙时,才使用该变量。
关于 AD 集成的必需变量
以下变量是必需的:
mssql_ad_configure
:是否配置 Active Directory 身份验证。mssql_ad_sql_user_name
:要在 Active Directory 服务器中创建并启用 SQL Server 身份验证的用户的名称。该角色使用 adutil,要求为创建的用户赋予以特权用户身份访问该角色的权限。mssql_ad_sql_password
:所创建的用户的密码。ad_integration_realm
:Active Directory 域名称。ad_integration_user
:Active Directory 中特权用户的用户名。此用户必须已存在于域中。ad_integration_password
:用户的密码。
关于 AD 集成的可选变量
以下变量是可选的:
mssql_ad_sql_user_dn
:如果您的 AD 服务器将用户账户存储在自定义组织单元(OU)中,而不是默认的 Users OU 中,则必须设置此变量。默认情况下,该角色会基于为变量mssql_ad_sql_user_name
和ad_integration_realm
提供的值来构建专有名称,并使用Users
OU(例如:CN=sqluser,CN=Users,DC=DOMAIN,DC=COM
)。您可以通过提供专有名称来覆盖它。mssql_ad_netbios_name
:当 AD 服务器的 NetBIOS 域名不等于您通过ad_integration_realm
变量提供的域名的第一个子域时,您必须设置此变量(例如:您设置了ad_integration_realm
为domain.contoso.com
,但您的 NetBIOS 域名不是domain
)。这个值用于在 SQL Server 中创建{{ mssql_ad_netbios_name }}\{ad_integration_user }}
登录名。
运行 Ansible 角色
在确保满足所有前提条件并且准备好 Ansible 清单和 Playbook 后,就可以运行 playbook 了。
$ ansible-playbook -i inventory.yml playbook.yml
将域用户添加到 SQL Server
在用户可以登录之前,您必须先将用户添加到 SQL Server。为此,请为每个 AD 域用户运行以下 T-SQL 命令:
CREATE LOGIN \[<domain>**<username>*\] FROM WINDOWS;
启用其他加密类型
在执行该角色以配置 Active Directory 身份验证后,您必须将 AES128 和 AES256 Kerberos 加密类型添加到 Active Directory 中使用 mssql_ad_sql_user_name
变量定义的用户。您可以使用 Active Directory Web UI 或 PowerShell 来执行此操作。
Web UI
打开 AD 服务器的 Web UI 并登录。
- 导航到 Tools > Active Directory Users and Computers > [domain] > Users > [sqluser] > Account
- 在 Account options 列表中,选择 This account supports Kerberos AES 128 bit encryption 和 This account supports Kerberos AES 256 bit encryption
- 单击 Apply
PowerShell
在 PowerShell 中,使用 Set-ADUser
命令,将 <sqluser>
替换为您设置成 mssql_ad_sql_user_name
变量的用户名:
Set-ADUser -Identity <sqluser> -KerberosEncryptionType AES128,AES256
验证 Active Directory 身份验证
您已执行该角色来配置 AD 服务器身份验证,并且已将所需的加密类型添加到 <sqluser>
用户,现在您可以使用以下方法之一进行身份验证:
- Windows 或 RHEL:Azure Data Studio(ADS)
- Windows:SQL Server Management Studio(SSMS)
- RHEL:Linux 终端
Azure Data Studio(ADS)
如果您尚未安装 ADS,请按照 Microsoft 的文档下载并安装 Azure Data Studio。
安装后,启动 ADS。
- 单击 Create a connection
- 从 Authentication type 列表中,选择 Windows Authentication
- 填写其他字段,然后单击 Connect
您现在可以使用 SQL Server 了。
SQL Server Management Studio(SSMS)
首先,登录 Windows(使用您要用于登录 SQL Server 的用户),然后启动 SSMS。
- 在 Connect to Server 窗格中,从 Server type 列表中选择 Database Engine
- 在 Server name 字段中,输入运行了该角色的 RHEL 实例的完全限定域名(FQDN)
- 从 Authentication 列表中,选择 Windows Authentication,然后填写以下字段:
- Server type:Database Engine
- Server name:输入您的服务器名称
- Authentication:Windows Authentication
- 单击 Connect
Linux 终端
若要使用 Linux 终端来检查身份验证,请使用该角色创建的用户以 SSH 方式登录服务器。
$ ssh -l <sqluser>@<domain.com> <client.domain.com>
为您要进行身份验证的 Active Directory 用户获取 Kerberos 工单:
$ kinit <AD_user_name>@<DOMAIN.COM>
使用 sqlcmd
登录 SQL Server,然后执行相应操作,例如运行查询来获取当前用户:
/opt/mssql-tools/bin/sqlcmd -S.-Q 'SELECT SYSTEM_USER'
结论
microsoft.sql.server 角色可以帮助您自动与 Active Directory 集成,以进行用户身份验证。该角色使用 redhat.rhel_system_roles.ad_integration 角色连接到 Active Directory,并使用 redhat.rhel_system_roles.firewall 角色配置防火墙,而且以一致的方式执行此操作。红帽提供了更多系统角色来管理 RHEL 上的不同服务和工具。如果您有兴趣实现工作流自动化,请查看可用 RHEL 系统角色的列表,并阅读关于该主题的文档或相关的博客文章。有大量资源可供参考!
如果您想了解 microsoft.sql.server 角色还能为您提供哪些帮助,请查看官方文档。
关于作者
Sergei Petrosian is a technical writer at Red Hat working on Satellite and Foreman documentation.
产品
工具
试用购买与出售
沟通
关于红帽
我们是世界领先的企业开源解决方案供应商,提供包括 Linux、云、容器和 Kubernetes。我们致力于提供经过安全强化的解决方案,从核心数据中心到网络边缘,让企业能够更轻松地跨平台和环境运营。