|
| 1 | +--- |
| 2 | +title: Configurando GMSA Para Pods e Contêineres Windows |
| 3 | +content_type: task |
| 4 | +weight: 20 |
| 5 | +--- |
| 6 | + |
| 7 | +<!-- overview --> |
| 8 | + |
| 9 | +{{< feature-state for_k8s_version="v1.18" state="stable" >}} |
| 10 | + |
| 11 | +Esta página mostra como configurar [Contas de serviço gerenciadas em grupo](https://docs.microsoft.com/pt-br/windows-server/security/group-managed-service-accounts/group-managed-service-accounts-overview) (GMSA) |
| 12 | +para Pods e contêineres que vão executar em nós Windows. Contas de serviço gerenciadas em grupo |
| 13 | +são um tipo específico de conta do Active Directory que provê gerenciamento automático |
| 14 | +de senhas, gerenciamento simplificado de *service principal name* (SPN), e a habilidade |
| 15 | +de delegar o gerenciamento a outros administradores através de múltiplos servidores. |
| 16 | + |
| 17 | +No Kubernetes, especificações de credenciais GMSA são configuradas dentro do escopo |
| 18 | +do cluster Kubernetes como recursos personalizados. Os Pods Windows, assim como contêineres |
| 19 | +individuais dentro de um Pod, podem ser configurados para usar as funções GMSA |
| 20 | +baseadas em domínio (exemplo: autenticação Kerberos) quando interagirem com outros |
| 21 | +serviços Windows. |
| 22 | + |
| 23 | +## {{% heading "prerequisites" %}} |
| 24 | + |
| 25 | +Você precisa ter um cluster Kubernetes, e a ferramenta de linha de comando `kubectl` |
| 26 | +precisa estar configurada para comunicar-se com seu cluster. |
| 27 | +O cluster deve possuir nós de carga de trabalho Windows. |
| 28 | +Esta seção cobre o conjunto inicial de passos requeridos para cada cluster: |
| 29 | + |
| 30 | +### Instale o CRD GMSACredentialSpec |
| 31 | + |
| 32 | +Uma [CustomResourceDefinition](/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/) (CRD) para a especificação de recursos de credencial GMSA precisa ser configurada no cluster, para definir o tipo de recurso do cliente `GMSACredentialSpec`. Faça o download do [YAML](https://github.com/kubernetes-sigs/windows-gmsa/blob/master/admission-webhook/deploy/gmsa-crd.yml) do CRD de GMSA |
| 33 | +e salve como gmsa-crd.yaml. |
| 34 | +A seguir, instale o CRD com `kubectl apply -f gmsa-crd.yaml`. |
| 35 | + |
| 36 | +### Instale webhooks para validar usuários GMSA |
| 37 | + |
| 38 | +Dois webhooks precisam ser configurados no cluster Kubernetes para popular e validar |
| 39 | +as referências de especificação de credenciais GMSA no nível do Pod ou contêiner: |
| 40 | + |
| 41 | +1. Um webhook de mutação que expanda as referências para as GMSAs, |
| 42 | +(por nome a partir de uma especificação de Pod) em uma especificação de credencial completa |
| 43 | +em formato JSON dentro da especificação do Pod. |
| 44 | + |
| 45 | +1. Um webhook de validação garante que todas as referências para GMSAs estão |
| 46 | +autorizadas a serem usadas pela conta de serviço do Pod. |
| 47 | + |
| 48 | +A instalação dos webhooks acima e dos objetos associados requer as etapas abaixo: |
| 49 | + |
| 50 | +1. Crie um par de chaves de certificado (que será usado para permitir que o |
| 51 | +contêiner do webhook se comunique com o cluster) |
| 52 | + |
| 53 | +1. Instale um Secret com o certificado acima. |
| 54 | + |
| 55 | +1. Crie um Deployment para a lógica principal do webhook. |
| 56 | + |
| 57 | +1. Crie as configurações de webhook de validação e de mutação, referentes ao Deployment. |
| 58 | + |
| 59 | +Um [script](https://github.com/kubernetes-sigs/windows-gmsa/blob/master/admission-webhook/deploy/deploy-gmsa-webhook.sh) |
| 60 | +pode ser usado para implantar e configurar os webhooks GMSA e objetos associados |
| 61 | +mencionados acima. O script pode ser executado com a opção ```--dry-run=server``` |
| 62 | +para possibilitar que você possa revisar as alterações antes que sejam aplicadas |
| 63 | +no seu cluster. |
| 64 | + |
| 65 | +O [template YAML](https://github.com/kubernetes-sigs/windows-gmsa/blob/master/admission-webhook/deploy/gmsa-webhook.yml.tpl) |
| 66 | +usado pelo script também pode ser usado para implantar os webhooks e objetos |
| 67 | +associados manualmente (com as substituições apropriadas para os parâmetros). |
| 68 | + |
| 69 | +<!-- steps --> |
| 70 | + |
| 71 | +## Configurar GMSAs e nós Windows em Active Directory |
| 72 | + |
| 73 | +Antes que os Pods no Kubernetes possam ser configurados para usar GMSAs, as GMSAs apropriadas precisam ser provisionadas no Active Directory como descrito na |
| 74 | +[documentação de GMSA do Windows](https://docs.microsoft.com/pt-br/windows-server/security/group-managed-service-accounts/getting-started-with-group-managed-service-accounts#BKMK_Step1). |
| 75 | +Nós de carga de trabalho Windows (que são parte do cluster Kubernetes) precisam ser configurados no |
| 76 | +Active Directory para acessar as credenciais secretas associadas com a GMSA apropriada, |
| 77 | +como descrito na [documentação de GMSA do Windows](https://docs.microsoft.com/pt-br/windows-server/security/group-managed-service-accounts/getting-started-with-group-managed-service-accounts#to-add-member-hosts-using-the-set-adserviceaccount-cmdlet). |
| 78 | + |
| 79 | +## Crie recursos de especificação de GMSA |
| 80 | + |
| 81 | +Com o CRD GMSACredentialSpec instalado (como descrito anteriormente), |
| 82 | +recursos customizados contendo recursos de especificação de credenciais GMSA podem |
| 83 | +ser configurados. A especificação de credencial GMSA não contém dados secretos nem |
| 84 | +sensíveis. É informação que o agente de execução de contêiner pode usar para descrever a apropriada |
| 85 | +GMSA de um contêiner para o Windows. Especificações de credenciais GMSA podem |
| 86 | +ser geradas em formato YAML com o utilitário [PowerShell script](https://github.com/kubernetes-sigs/windows-gmsa/tree/master/scripts/GenerateCredentialSpecResource.ps1). |
| 87 | + |
| 88 | +A seguir são os passos para gerar a especificação de credencial GMSA YAML |
| 89 | +manualmente, em formato JSON e então convertê-la para YAML: |
| 90 | + |
| 91 | +1. Importar o [módulo `CredentialSpec`](https://github.com/MicrosoftDocs/Virtualization-Documentation/blob/live/windows-server-container-tools/ServiceAccounts/CredentialSpec.psm1): |
| 92 | +`ipmo CredentialSpec.psm1` |
| 93 | + |
| 94 | +1. Crie a especificação da credencial em formato JSON usando `New-CredentialSpec`. |
| 95 | +Para criar a especificação da credencial GMSA nomeada WebApp1, |
| 96 | +execute `New-CredentialSpec -Name WebApp1 -AccountName WebApp1 -Domain $(Get-ADDomain -Current LocalComputer)` |
| 97 | + |
| 98 | +1. Use `Get-CredentialSpec` para mostrar o caminho do arquivo JSON. |
| 99 | + |
| 100 | +1. Converta o arquivo `credspec` de JSON para o formato YAML e aplique os campos |
| 101 | +de cabeçalho necessários `apiVersion`, `kind`, `metadata` e `credspec` para transformá-lo em |
| 102 | +uma instância do recurso customizado GMSACredentialSpec que pode ser configurado no Kubernetes. |
| 103 | + |
| 104 | +A configuração YAML a seguir descreve as especificações de credencial GMSA nomeada |
| 105 | +`gmsa-WebApp1`: |
| 106 | + |
| 107 | +```yaml |
| 108 | +apiVersion: windows.k8s.io/v1 |
| 109 | +kind: GMSACredentialSpec |
| 110 | +metadata: |
| 111 | + name: gmsa-WebApp1 #Este é um nome arbitrário, mas será usado como referência |
| 112 | +credspec: |
| 113 | + ActiveDirectoryConfig: |
| 114 | + GroupManagedServiceAccounts: |
| 115 | + - Name: WebApp1 #Nome de usuário da conta GMSA |
| 116 | + Scope: CONTOSO #Nome de Domínio NETBIOS |
| 117 | + - Name: WebApp1 #Nome de usuário da conta GMSA |
| 118 | + Scope: contoso.com #Nome de domínio DNS |
| 119 | + CmsPlugins: |
| 120 | + - ActiveDirectory |
| 121 | + DomainJoinConfig: |
| 122 | + DnsName: contoso.com #Nome de domínio DNS |
| 123 | + DnsTreeName: contoso.com #Nome de domínio DNS raiz |
| 124 | + Guid: 244818ae-87ac-4fcd-92ec-e79e5252348a #GUID |
| 125 | + MachineAccountName: WebApp1 #Nome de usuário da conta GMSA |
| 126 | + NetBiosName: CONTOSO #Nome de domínio NETBIOS |
| 127 | + Sid: S-1-5-21-2126449477-2524075714-3094792973 #SID da GMSA |
| 128 | +``` |
| 129 | +
|
| 130 | +O recurso de especificação de credencial acima deve ser salvo como |
| 131 | +`gmsa-Webapp1-credspec.yaml` e aplicado no cluster usando: |
| 132 | +`kubectl apply -f gmsa-Webapp1-credspec.yml` |
| 133 | + |
| 134 | +## Configure um ClusterRole para habilitar RBAC nas especificações de credenciais GMSA específicas |
| 135 | + |
| 136 | +Uma ClusterRole precisa ser definida para cada recurso de especificação |
| 137 | +de credencial GMSA. Isto autoriza o verbo `use` em um recurso GMSA específico |
| 138 | +por um sujeito, geralmente uma conta de serviço. O exemplo a seguir mostra |
| 139 | +um ClusterRole que autoriza o uso de credencial `gmsa-WebApp1` |
| 140 | +acima. Salve o arquivo como gmsa-webapp1-role.yaml e aplique |
| 141 | +usando `kubectl apply -f gmsa-webapp1-role.yaml` |
| 142 | + |
| 143 | +```yaml |
| 144 | +#Criando um Role para ler o credspec |
| 145 | +apiVersion: rbac.authorization.k8s.io/v1 |
| 146 | +kind: ClusterRole |
| 147 | +metadata: |
| 148 | + name: webapp1-role |
| 149 | +rules: |
| 150 | +- apiGroups: ["windows.k8s.io"] |
| 151 | + resources: ["gmsacredentialspecs"] |
| 152 | + verbs: ["use"] |
| 153 | + resourceNames: ["gmsa-WebApp1"] |
| 154 | +``` |
| 155 | + |
| 156 | +## Atribua o Role às contas de serviço para usar especificações de credencial GMSA específicas |
| 157 | + |
| 158 | +Uma conta de serviço (com a qual os Pods virão configurados), precisa ser vinculada |
| 159 | +ao ClusterRole criado acima. Isto autoriza a conta de serviço a usar a especificação apropriada |
| 160 | +de recurso de credencial GMSA. O trecho a seguir mostra a conta de serviço padrão vinculada ao ClusterRole `webapp1-role`, para usar a especificação |
| 161 | +de recurso de credencial `gmsa-WebApp1` criada acima. |
| 162 | + |
| 163 | +```yaml |
| 164 | +apiVersion: rbac.authorization.k8s.io/v1 |
| 165 | +kind: RoleBinding |
| 166 | +metadata: |
| 167 | + name: allow-default-svc-account-read-on-gmsa-WebApp1 |
| 168 | + namespace: default |
| 169 | +subjects: |
| 170 | +- kind: ServiceAccount |
| 171 | + name: default |
| 172 | + namespace: default |
| 173 | +roleRef: |
| 174 | + kind: ClusterRole |
| 175 | + name: webapp1-role |
| 176 | + apiGroup: rbac.authorization.k8s.io |
| 177 | +``` |
| 178 | + |
| 179 | +## Configure a especificação de recurso de credencial GMSA em uma especificação de Pod |
| 180 | + |
| 181 | +O campo `securityContext.windowsOptions.gmsaCredentialSpecName` do Pod, é usado de referência para recursos customizados, em especificações |
| 182 | +de certificado GMSA apropriadas em especificações do Pod. |
| 183 | +Isto configura todos contêineres do Pod para usar GMSA. |
| 184 | +Uma amostra da anotação populada para referir-se a `gmsa-WebApp1`: |
| 185 | + |
| 186 | +```yaml |
| 187 | +apiVersion: apps/v1 |
| 188 | +kind: Deployment |
| 189 | +metadata: |
| 190 | + labels: |
| 191 | + run: with-creds |
| 192 | + name: with-creds |
| 193 | + namespace: default |
| 194 | +spec: |
| 195 | + replicas: 1 |
| 196 | + selector: |
| 197 | + matchLabels: |
| 198 | + run: with-creds |
| 199 | + template: |
| 200 | + metadata: |
| 201 | + labels: |
| 202 | + run: with-creds |
| 203 | + spec: |
| 204 | + securityContext: |
| 205 | + windowsOptions: |
| 206 | + gmsaCredentialSpecName: gmsa-webapp1 |
| 207 | + containers: |
| 208 | + - image: mcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2019 |
| 209 | + imagePullPolicy: Always |
| 210 | + name: iis |
| 211 | + nodeSelector: |
| 212 | + kubernetes.io/os: windows |
| 213 | +``` |
| 214 | + |
| 215 | +Contêineres individuais em uma especificação de Pod podem também indicar |
| 216 | +a credencial GMSA apropriada, usando o campo `securityContext.windowsOptions.gmsaCredentialSpecName` por contêiner. Por exemplo: |
| 217 | + |
| 218 | +```yaml |
| 219 | +apiVersion: apps/v1 |
| 220 | +kind: Deployment |
| 221 | +metadata: |
| 222 | + labels: |
| 223 | + run: with-creds |
| 224 | + name: with-creds |
| 225 | + namespace: default |
| 226 | +spec: |
| 227 | + replicas: 1 |
| 228 | + selector: |
| 229 | + matchLabels: |
| 230 | + run: with-creds |
| 231 | + template: |
| 232 | + metadata: |
| 233 | + labels: |
| 234 | + run: with-creds |
| 235 | + spec: |
| 236 | + containers: |
| 237 | + - image: mcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2019 |
| 238 | + imagePullPolicy: Always |
| 239 | + name: iis |
| 240 | + securityContext: |
| 241 | + windowsOptions: |
| 242 | + gmsaCredentialSpecName: gmsa-Webapp1 |
| 243 | + nodeSelector: |
| 244 | + kubernetes.io/os: windows |
| 245 | +``` |
| 246 | + |
| 247 | +Assim que as especificações do Pod com os campos GMSA preenchidos |
| 248 | +(como descrito acima) são aplicadas em um cluster, ocorre a seguinte sequência de eventos: |
| 249 | + |
| 250 | +1. O webhook de mutação resolve e expande todas as referências aos recursos de |
| 251 | +especificações de credenciais GMSA para o conteúdo das especificações de credenciais GMSA. |
| 252 | + |
| 253 | +1. O webhook de validação garante que a conta de serviço associada ao Pod, seja autorizada |
| 254 | +para o verbo `use` na especificação GMSA especificada. |
| 255 | + |
| 256 | +1. O agente de execução de contêiner configura cada contêiner do Windows com a especificação |
| 257 | +de credencial GMSA especificada, para que o contêiner possa assumir a identidade |
| 258 | +do GMSA no Active Directory, e tenha acesso aos serviços no domínio usando essa identidade. |
| 259 | + |
| 260 | +## Autenticando para compartilhamentos de rede usando `hostname` ou FQDN |
| 261 | + |
| 262 | +Se você estiver enfrentando problemas ao se conectar aos compartilhamentos SMB |
| 263 | +de Pods usando o hostname ou o FQDN, mas conseguindo acessar os compartilhamentos |
| 264 | +por meio de seu endereço IPv4, verifique se a chave do registro a seguir |
| 265 | +está definida nos nós Windows. |
| 266 | + |
| 267 | +```cmd |
| 268 | +reg add "HKLM\SYSTEM\CurrentControlSet\Services\hns\State" /v EnableCompartmentNamespace /t REG_DWORD /d 1 |
| 269 | +``` |
| 270 | + |
| 271 | +Os Pods em execução precisarão ser recriados para pegar as mudanças de comportamento. |
| 272 | +Mais informações sobre como essa chave de registro é usada podem ser encontradas [aqui](https://github.com/microsoft/hcsshim/blob/885f896c5a8548ca36c88c4b87fd2208c8d16543/internal/uvm/create.go#L74-L83) |
| 273 | + |
| 274 | +## Solução de problemas |
| 275 | + |
| 276 | +Se você estiver tendo dificuldades para fazer com que o GMSA funcione em seu ambiente, |
| 277 | +existem algumas etapas de solução de problemas que você pode tentar. |
| 278 | + |
| 279 | +Primeiro, verifique se a especificação de credencial foi passada para o Pod. Para fazer isso, |
| 280 | +você precisará rodar `kubectl exec` em um de seus Pods e verificar |
| 281 | +a saída do comando `nltest.exe /parentdomain`. |
| 282 | + |
| 283 | +No exemplo abaixo, o Pod não recebeu a especificação de credencial corretamente: |
| 284 | + |
| 285 | +```PowerShell |
| 286 | +kubectl exec -it iis-auth-7776966999-n5nzr powershell.exe |
| 287 | +``` |
| 288 | + |
| 289 | +`nltest.exe /parentdomain` resulta no seguinte erro: |
| 290 | + |
| 291 | +```output |
| 292 | +Getting parent domain failed: Status = 1722 0x6ba RPC_S_SERVER_UNAVAILABLE |
| 293 | +``` |
| 294 | + |
| 295 | +Se o seu Pod obteve a especificação de credencial corretamente, o próximo passo é |
| 296 | +verificar a comunicação com o domínio. Primeiro, de dentro do seu Pod, |
| 297 | +execute rapidamente um `nslookup` para encontrar a raiz do seu domínio. |
| 298 | + |
| 299 | +Isso vai nos dizer 3 coisas: |
| 300 | + |
| 301 | +1. O Pod pode chegar ao DC |
| 302 | +1. O DC pode chegar ao Pod |
| 303 | +1. O DNS está funcionando corretamente. |
| 304 | + |
| 305 | +Se o DNS e o teste de comunicação passarem, em seguida, |
| 306 | +você precisará verificar se o Pod estabeleceu um canal de comunicação segura |
| 307 | +com o domínio. Para fazer isso, novamente, em seu Pod |
| 308 | +execute o comando `nltest.exe /query`. |
| 309 | + |
| 310 | +```PowerShell |
| 311 | +nltest.exe /query |
| 312 | +``` |
| 313 | + |
| 314 | +Resulta na seguinte saída: |
| 315 | + |
| 316 | +```output |
| 317 | +I_NetLogonControl failed: Status = 1722 0x6ba RPC_S_SERVER_UNAVAILABLE |
| 318 | +``` |
| 319 | + |
| 320 | +Isso nos diz que, por algum motivo, o Pod não conseguiu se logar no domínio |
| 321 | +usando a conta definida na especificação de credencial. Você pode tentar reparar |
| 322 | +o canal seguro executando o seguinte: |
| 323 | + |
| 324 | +```PowerShell |
| 325 | +nltest /sc_reset:domain.example |
| 326 | +``` |
| 327 | + |
| 328 | +Se o comando for bem sucedido, você verá uma saída semelhante a esta: |
| 329 | + |
| 330 | +```output |
| 331 | +Flags: 30 HAS_IP HAS_TIMESERV |
| 332 | +Trusted DC Name \\dc10.domain.example |
| 333 | +Trusted DC Connection Status Status = 0 0x0 NERR_Success |
| 334 | +The command completed successfully |
| 335 | +``` |
| 336 | + |
| 337 | +Se o excerto acima corrigir o erro, você poderá automatizar a etapa adicionando |
| 338 | +o seguinte `lifecycle hook` à sua especificação de Pod. Se não corrigiu o erro, você |
| 339 | +precisará examinar sua especificação de credencial novamente e confirmar que ela está correta e completa. |
| 340 | + |
| 341 | +```yaml |
| 342 | + image: registry.domain.example/iis-auth:1809v1 |
| 343 | + lifecycle: |
| 344 | + postStart: |
| 345 | + exec: |
| 346 | + command: ["powershell.exe","-command","do { Restart-Service -Name netlogon } while ( $($Result = (nltest.exe /query); if ($Result -like '*0x0 NERR_Success*') {return $true} else {return $false}) -eq $false)"] |
| 347 | + imagePullPolicy: IfNotPresent |
| 348 | +``` |
| 349 | + |
| 350 | +Se você adicionar a seção `lifecycle`, mostrada acima à sua especificação de Pod, |
| 351 | +o Pod irá executar os comandos listados para reiniciar o serviço `netlogon` |
| 352 | +até que o comando `nltest.exe /query` execute sem erro. |
0 commit comments