为SQL Server Always On可用性组配置托管服务帐户
本文是该系列SQL Server始终在可用性组6 日的文章。 它涵盖了SQL Services的组管理服务帐户(gMSA)的配置。
介绍
DBA使用服务帐户来运行各种SQL服务。 通常,对于单独的服务器SQL Services,我们应该使用单独的服务帐户。
- 您应该运行权限最少SQL服务
- 您应该使用复杂的密码并将其存储在安全的地方
- 它的密码永远不会过期
- 您还应该根据组织的安全策略定期更改密码。
如果维护大量SQL Server,则可能会认为更改和维护这些服务器的密码是一项繁琐的任务。 使用SQL Server配置管理器更改服务帐户密码后,还需要重新启动SQL Services。 对于具有高事务性的应用程序来说,要使其停机也可能是一项艰巨的任务。
在这些情况下,我们可以利用组托管服务帐户(gMSA)。 让我们在随后的部分中进行探讨。
先决条件
-
您应该按照文章系列( 带有SQL Server Always On可用性组在Windows Server 2016上安装SQL Server 2019)并配置以下内容
- 虚拟机充当域控制器和活动目录
- 安装了SQL Server 2019的三个SQL节点
- 您应该在同步模式下为这三个节点配置SQL Server Always On可用性组
安装了活动目录模块的Windows PowerShell。 我们将其安装为活动目录配置的一部分
托管服务帐户概述
在活动目录配置中,我们有两种托管服务帐户。
- 独立托管服务帐户(SMSA)提供自动密码管理功能。 简而言之,用户不管理这些用户的凭据。 它会根据活动目录策略自动更改密码并与服务同步。 我们可以对一个服务器使用独立的托管服务帐户
- 组托管服务帐户(gMSA)扩展了SMSA的功能。 您可以将gMSA用于多台服务器。 我们定义一个AD组,并为所有可以使用指定gMSA凭据的所需服务器提供权限
总而言之,使用gMSA作为SQL Services的服务帐户可获得以下好处。
- 自动密码管理
- 管理员不需要将密码存储在密码库中
- 它使用非常复杂的密码(120个字符),并且管理员也不知道。 它也避免了在不知不觉中传播密码的风险
- SPN自动注册
- 您可以在多个服务器和服务中使用它们
- 您可以在独立服务器或在故障转移群集服务之上运行的服务(例如Windows服务,应用程序池,计划任务)上使用gMSA
让我们开始为SQL Server Always On可用性组配置组托管服务帐户(GMSA)。
为SQL服务配置gMSA
我们可以为Windows Server 2012或更高版本配置和使用gMSA服务帐户。 在本文中,我们将使用Windows Server 2016。
步骤1:为gMSA创建安全组
获取活动目录服务器的RDP并使用DSA.MSC命令启动活动目录(AD)。

右键单击域名,然后选择“新建”->“组”。 根据您的要求或命名约定指定组名。

单击“确定”,它将创建AD组。 打开该组并输入描述。 它可以帮助您有效地识别安全组及其用途。

单击成员。 在成员中,添加故障转移群集节点。 我在SQL Server Always On可用性组中配置了SQLNode1,SQLNode2和SQLNode3虚拟机。

步骤2:配置**分发服务(KDS)
组托管服务帐户需要使用AD PowerShell模块进行**分发服务(KDS)。 它使用Add-KdsRootkey PowerShell cmdlet。 所有AD域控制器之间的完全同步需要10个小时。
出于演示目的,您可以使用-EffectiveImmediately参数,也可以指定过去的时间戳。
在活动目录VM(在本例中为vditest3.mydemosql.com)上打开Windows PowerShell,然后运行以下命令。
1 |
Add - KdsRootKey - EffectiveTime ( ( Get - Date ) . AddHours ( - 10 ) ) |
它返回一个GUID,如下所示。

您还可以使用Get-KdsRootKey验证**,以验证KDS**是否存在于活动目录中。
1 |
Get - KdsRootKey |
您将获得值,生效日期,域控制器和GUID。
步骤3:建立新的群组管理服务帐户
在此步骤中,我们使用New-ADServiceAccount PowerShell cmdlet创建一个新的gMSA帐户。
它使用以下参数。
- 名称:指定gMSA服务帐户名称
- DNSHostName:输入服务帐户的FQDN。 就我而言,FQDN是gMSAsqlservice.mydemosql.com
- PrincipalsAllowedToRetrieveManagedPassword:指定我们在步骤1:为gMSA创建安全组中创建的AD组名称。
1
2
|
New - ADServiceAccount - name gMSAsqlservice - DNSHostName gMSAsqlservice . mydemosql . com - PrincipalsAllowedToRetrieveManagedPassword SQLServer
|

您还必须允许gMSA帐户在SQL Server中注册其服务主体名称(SPN)以进行Kerberos身份验证。
1 |
dsacls ( Get - ADServiceAccount - Identity gMSAsqlservice ) . DistinguishedName / G "SELF:RPWP;servicePrincipalName"
|
它为您提供以下输出。

您可以检查帐户属性,例如加密类型和SAM帐户名。 默认情况下,它使用RC4,AES128和AES256加密。 您可以注意到该帐户名在帐户名中使用$后缀。
1 |
Get - ADServiceAccount gmsasqlservice - Properties * | FL DNSHostName , KerberosEncryptionType , SamAccountName
|
步骤4:为目标服务器启用AD Windows功能
我们需要在目标服务器中执行这些步骤。 将RDP带到目标服务器, 然后在Windows功能中启用AD DS和AD LDS工具 。

单击下一步,然后确认功能部件安装。 在描述框中,您可以注意到它还在目标服务器上安装了Windows PowerShell的Active Directory模块。

单击“ 安装”以启用AD功能及其对目标节点的依赖性。

您也可以在Windows故障转移群集中的其余服务器上执行此步骤。
步骤5:在目标节点上为SQL Server Always On可用性组安装组托管服务帐户
一旦目标节点上的AD PowerShell cmdlet可用,我们需要安装gMSA服务帐户。 它使用Install-ADServiceAccount cmdlet。
1 |
Install - ADServiceAccount gMSAsqlservice
|

它不返回任何输出。 您可以使用另一个cmdlet Test-ADServiceAccount来验证组托管服务帐户的状态。 如果gMSA有效且可以使用,则返回true。
1 |
Test - ADServiceAccount gMSAsqlservice
|

您可以使用Get-ADServiceAccount cmdlet检查上次重置托管服务帐户的密码。
1 |
Get - ADServiceAccount gMSAsqlservice - Property PasswordLastSet |

步骤6:将gMSA配置为运行SQL Services
现在,我们准备在SQL Services中使用gMSA帐户。 打开SQL Server配置管理器,然后转到服务。
现在,在活动目录服务帐户对象中搜索gMSA帐户。 您也可以将帐户名指定为[mydemosql \ gmsasqlservice $]。 它不会给您密码提示。
您可能会注意到我们没有该用户的密码。 也不需要配置在组托管服务帐户下运行的服务。

单击确定,然后重新启动SQL Services。 您可以看到SQL Service在[mydemosql \ gmsasqlservice $]安全上下文下运行。

它成功注册了Kerberos身份验证的服务主体名称(SPN),并在错误日志中记录了一个条目,如下所示。
- [MSSQLSvc / SQLNode1.MyDemoSQL.Com:INST1]
- [MSSQLSvc / SQLNode1.MyDemoSQL.Com:I433]

同样,更改SQL Server Always On可用性组SQLNode2和SQLNode3中的服务帐户,然后启动SQL服务。
1
2
3
4
5
|
SELECT @ @ Servername AS server ,
status_desc ,
service_account
FROM sys . dm_server_services
WHERE status_desc = 'Running'
|

-
将这些帐户添加到所有SQL实例中,并为[MyDemoSQL \ gMSsqlservices $]帐户提供数据库镜像终结点。 如果该帐户没有端点的权限,则在“ SQL Server始终可用”组中将看不到数据库,并且您将获得断开连接状态。
12ALTER AUTHORIZATIONON ENDPOINT :: mirroring_endpoint TO [ MyDemoSQL \ gMSsqlservice $ ] ;
您可以保留一段时间,然后会看到一个健康的AG仪表板。 在下面的屏幕快照中,我们看到[SQLShackDemo]数据库处于同步状态,而没有任何数据丢失。

结论
在本文中,我们探讨了SQL Server Always On可用性组的组托管服务帐户(gMSA)。 它会自动管理SQL Service帐户并更改它们,而无需重新启动SQL Services。 它还消除了密码被黑客入侵或滥用以连接到SQL的风险。 您也可以使用此gMSA帐户配置Windows任务计划程序。
目录
在担任大客户的高级顾问DBA并获得MCSA SQL 2012认证的同时,他喜欢在各种博客上分享知识。
可以通过[email protected]与他联系。
查看Rajendra Gupta的所有帖子
- 为SQL Server Always On可用性组配置托管服务帐户 -2020年7月24日
- 将新节点添加到现有SQL Server Always On可用性组中 -2020年7月23日
- Visual Studio Code(VS Code)与Git Source Control的集成 -2020年7月22日