前不久给公司搭测试环境,其中涉及到了某组件在容器中使用 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 名称,说明运行成功。

posted on 2017-10-29 12:08  莱特  阅读(1324)  评论(0编辑  收藏  举报