前不久给公司搭测试环境,其中涉及到了某组件在容器中使用 kerberos 身份验证连接 SQL Server 数据库的问题。
Windows 容器本身并不能加入域,但可以通过 gMSA 运行容器使容器进程拥有 gMSA 的身份,这样一来只需要在 SQL Server 里添加此 gMSA 的 login 就可以达成目的。注意必须使用 gMSA,普通 MSA 帐号在容器中使用会出问题。
第一次创建 gMSA 帐号前,需要先创建 KDS(Key Distribute Service)根密钥(如已创建,可忽略此步骤):
Add-KDSRootKey –EffectiveImmediately
然后,你需要等待漫长的 10 个小时,完成密钥的复制……好吧,如果是做实验,可以如此省略这 10 个小时:
Add-KdsRootKey –EffectiveTime ((get-date).addhours(-10))
创建 gMSA:
New-ADServiceAccount -Name Service1 -DNSHostName service1.contoso.com -PrincipalsAllowedToRetrieveManagedPassword [ComputerName1$, ComputerName2$...] -KerberosEncryptionType RC4, AES128, AES256
其中 -DNSHostName 只是一个 group 的名字,不需要把它加入到你的 DNS 中。 -PrincipalsAllowedToRetrieveManagedPassword 则是 host 你的容器的服务器名,注意 AD 上计算机名也是一个帐户,所以后边要加“$”。
下一步,要在容器的 host 上安装 gMSA
1 // 安装 AD 的 PowerShell Module 2 Install-WindowsFeature RSAT-AD-PowerShell 3 4 // 安装 gMSA 5 Install-ADServiceAccount Service1 6 7 // 测试 8 Test-ADServiceAccount Service1 9 10 // 显示 “True” 测试通过
接下来,要在容器中使用 gMSA,需要为 docker 创建 CredentialSpec,我们需要 Virtualization-Documentation 中的 CredentialSpec.psm1,它在 Virtualization-Documentation/windows-server-container-tools/ServiceAccounts 中,你可以选择把整个项目 clone 下来,或者新建名为 CredentialSpec.psm1 的文本文件,然后将文件内容粘进去。然后,执行以下 PS 命令:
1 Import-Module ./CredentialSpec.psm1 2 New-CredentialSpec -Name Service1 -AccountName Service1
接下来,可以运行容器了:
docker run -it --security-opt "credentialspec=file://Service1.json" microsoft/windowsservercore nltest /parentdomain
输出你的 AD 名称,说明运行成功。