Configura Active Directory para las VM a fin de que se unan automáticamente a un dominio


En este instructivo, se muestra cómo configurar Active Directory y Compute Engine para que las instancias de máquinas virtuales (VM) de Windows puedan unirse de forma automática a un dominio de Active Directory.

La automatización del proceso de unión de las VM de Windows a Active Directory te ayuda a simplificar el proceso de aprovisionamiento de servidores de Windows. Este enfoque también te permite aprovechar el ajuste de escala automático sin perder los beneficios de usar Active Directory para administrar el acceso y la configuración.

Este instructivo está dirigido a los administradores de sistemas; y se da por sentado que estás familiarizado con las herramientas de redes de Active Directory y Google Cloud.

La configuración que crees en este instructivo puede ser la base del trabajo adicional que realizas con los servidores de Windows en Google Cloud. Por ejemplo, cuando termines este instructivo, puedes implementar aplicaciones ASP.NET con la autenticación de Windows en contenedores de Windows.

Si estás utilizando Managed Microsoft AD y no necesitas una limpieza automática de cuentas de computadora inactivas, considera unir las VMs de Windows mediante la característica de unión automatizada de dominios. Para obtener más información, consulta Une una VM de Windows de forma automática a un dominio.

Objetivos

  • Implementar una aplicación de Cloud Run que permita que las instancias de VM de los proyectos seleccionados se unan automáticamente a tu dominio de Active Directory
  • Crear un trabajo de Cloud Scheduler que analice periódicamente tu dominio de Active Directory para detectar cuentas de computadora inactivas y eliminarlas
  • Probar la configuración mediante la creación de un grupo de instancias administrado (MIG) con ajuste de escala automático de instancias de VM unidas al dominio

Costos

En este documento, usarás los siguientes componentes facturables de Google Cloud:

Las instrucciones de este documento están diseñadas para que el uso de los recursos se mantenga dentro de los límites del nivel Siempre gratuito de Google Cloud. Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios. Es posible que los usuarios nuevos de Google Cloud califiquen para obtener una prueba gratuita.

Antes de comenzar

En este instructivo, se asume que ya implementaste Active Directory en Google Cloud mediante el Servicio administrado para Microsoft Active Directory (Microsoft AD administrado) o mediante la implementación controladores de dominio autoadministrados en Google Cloud.

Para completar este instructivo, asegúrate de tener lo siguiente:

  • Acceso de administrador al dominio de Active Directory, incluida la capacidad de crear usuarios, grupos y unidades organizacionales (UO)
  • Un rango de IP de /28 CIDR sin usar en la VPC en la que se implementan los controladores de dominio de Active Directory. Debes usar este rango de IP para configurar el Acceso a VPC sin servidores
  • Una subred en la que se implementan las instancias de Windows La subred se debe configurar para usar el Acceso privado a Google.

Si usas un controlador de dominio autoadministrado, también necesitarás lo siguiente:

Implementa este enfoque

En un entorno local, puedes usar los archivos de respuesta (unattend.xml) y la personalización de JoinDomain para unir de forma automática computadoras nuevas a un dominio. Aunque puedes usar el mismo proceso en Google Cloud, este enfoque tiene varias limitaciones:

  • Para usar un archivo unattend.xml personalizado, debes mantener una imagen de Compute Engine personalizada. Mantener una imagen personalizada al día mediante las actualizaciones de Windows requiere un mantenimiento continuo o un trabajo inicial para configurar la automatización. A menos que necesites mantener una imagen personalizada por otros motivos, puede que este esfuerzo adicional no se justifique.
  • Usar la personalización de JoinDomain vincula una imagen con un solo dominio de Active Directory, ya que el nombre del dominio debe especificarse en unattend.xml. Si mantienes varios dominios o bosques de Active Directory (por ejemplo, para entornos de prueba y producción independientes), es posible que debas mantener varias imágenes personalizadas en cada dominio.
  • Para unir una computadora de Windows a un dominio, se requieren credenciales de usuario que tengan permisos a fin de crear un objeto de computadora en el directorio. Si usas la personalización de JoinDomain en unattend.xml, debes incorporar estas credenciales como texto simple en unattend.xml. Estas credenciales incorporadas pueden convertir la imagen en un objetivo potencial para los atacantes. Si bien puedes controlar el acceso a la imagen mediante la configuración de permisos de administración de identidades y accesos (IAM) adecuados, la administración de acceso a una imagen personalizada agrega complejidad innecesaria.

En el enfoque que se adopta en este instructivo, no se usan archivos de respuesta y, por lo tanto, no se requieren imágenes con preparación especial. En su lugar, usas el siguiente scriptlet sysprep specialize cuando creas una instancia de VM:

iex((New-Object System.Net.WebClient).DownloadString('https://[DOMAIN]'))

El scriptlet sysprep specialize inicia un proceso que se ilustra en el siguiente diagrama.

Proceso que inicia el scriptlet sysprep-specialize.

El proceso funciona de la siguiente manera:

  1. Después de crear una instancia de VM, Windows se inicia por primera vez. Como parte del pase de configuración especializado, Windows ejecuta el scriptlet sysprep specialize. El scriptlet specialize invoca la app de Cloud Run de register-computer y descarga una secuencia de comandos de PowerShell que controla el proceso de unión de dominios.
  2. Windows invoca la secuencia de comandos de PowerShell que se descargó.
  3. La secuencia de comandos de PowerShell llama al servidor de metadatos para obtener un token de ID que identifica la instancia de VM de forma segura.
  4. La secuencia de comandos vuelve a llamar a la app register-computer y pasa el token de ID para autenticarse.
  5. La app valida el token de ID y extrae el nombre, la zona y el ID del proyecto de Google Cloud de la instancia de VM.
  6. La app verifica que el dominio de Active Directory esté configurado para permitir que las instancias de VM del proyecto determinado se unan al dominio. Para completar esta verificación, la app localiza a un controlador de dominio de Active Directory y se conecta a él para buscar una unidad organizacional (UO) cuyo nombre coincida con el ID del proyecto de Google Cloud del token de ID. Si se encuentra una UO que coincide, las instancias de VM del proyecto están autorizadas a unirse al dominio de Active Directory en la UO determinada.
  7. La app verifica que el proyecto de Google Cloud esté configurado para permitir que las instancias de VM se unan a Active Directory. Para completar esta verificación, la app verifica si puede acceder a la instancia de VM con la API de Compute Engine.
  8. Si todas las verificaciones se aprueban de forma correcta, la app prepara por adelantado una cuenta de computadora en Active Directory. La aplicación guarda el nombre, la zona y el ID de la instancia de VM como atributos en el objeto de cuenta de computadora para que pueda asociarse con la instancia de VM.
  9. Mediante el protocolo de establecimiento de contraseñas de Kerberos, la app asigna una contraseña aleatoria a la cuenta de computadora.
  10. El nombre y la contraseña de la computadora se devuelven a la instancia de Windows a través de un canal protegido por TLS.
  11. Con la cuenta de computadora preparada por adelantado, la secuencia de comandos de PowerShell une la computadora al dominio.
  12. Una vez que se completa la fase de configuración de specialize, la máquina se reinicia.

En el resto de este instructivo, se explican los pasos necesarios para configurar la unión automatizada a dominios.

Prepara el dominio de Active Directory

Primero, prepara tu dominio de Active Directory. Para completar este paso, necesitas una máquina que tenga acceso de administrador al dominio de Active Directory.

Limita quién puede unir computadoras al dominio (opcional)

Se recomienda que restrinjas quién puede unir computadoras al dominio. De forma predeterminada, la configuración del objeto de directiva de grupo (GPO) para la directiva predeterminada de controladores de dominio otorga el derecho de usuario de Add workstations to domain a todos los usuarios autenticados. Cualquier usuario con ese derecho de usuario puede unir computadoras al dominio. Debido a que automatizas el proceso de unión de computadoras al dominio de Active Directory, otorgar este nivel de acceso de forma universal es un riesgo de seguridad innecesario.

Para limitar quién puede unir computadoras al dominio de Active Directory, cambia la configuración predeterminada del GPO de la directiva predeterminada de controladores de dominio:

  1. Mediante un cliente de RDP, accede a una máquina que tenga acceso de administrador al dominio de Active Directory.
  2. Abre la Consola de administración de directivas de grupo (GPMC).
  3. Ir a Bosque > Dominios > domain-name > Group Policy Objects, en el que domain-name es el nombre de tu dominio de Active Directory.
  4. Haz clic con el botón derecho en Directiva predeterminada de controlador de dominio y haz clic en Editar.
  5. En la consola del Editor de administración de directivas de grupo, ve a Configuración del equipo > Directivas > Configuración de Windows > Configuración de seguridad > Directivas locales > Asignación de derechos de usuario.
  6. Haz doble clic en Agregar estaciones de trabajo al dominio.
  7. En Propiedades, quita Usuarios autenticados de la lista.
  8. Para permitir que los administradores se unan al dominio de forma manual (opcional), haz clic en Agregar usuario o grupo y agrega un grupo administrativo a la lista.
  9. Haz clic en Aceptar.

Ahora puedes cerrar la consola del editor de administración de políticas de grupo y la GPMC.

Inicializa una estructura de directorios

Ahora crearás una UO que funcione como un contenedor para todas las UO específicas del proyecto:

  1. Mediante un cliente de RDP, accede a una máquina que tenga acceso de administrador al dominio de Active Directory.
  2. Abre una sesión elevada de PowerShell.
  3. Cree una nueva unidad organizacional:

    $ParentOrgUnitPath = (Get-ADDomain).ComputersContainer
    $ProjectsOrgUnitPath = New-ADOrganizationalUnit `
      -Name 'Projects' `
      -Path $ParentOrgUnitPath `
      -PassThru
    

Crea una cuenta de usuario de Active Directory

Para acceder a Active Directory y preparar por adelantado las cuentas de computadora, la app register-computer necesita una cuenta de usuario de Active Directory:

  1. Crea una cuenta de usuario de Active Directory llamada register-computer, asígnale una contraseña aleatoria y colócala en la UO Projects:

    # Generate a random password
    $Password = [Guid]::NewGuid().ToString()+"-"+[Guid]::NewGuid().ToString()
    
    # Create user
    $UpnSuffix = (Get-ADDomain).DNSRoot
    $RegisterComputerUser = New-ADUser `
        -Name "register-computer Cloud Run app" `
        -GivenName "Register" `
        -Surname "Computer" `
        -Path $ProjectsOrgUnitPath `
        -SamAccountName "register-computer" `
        -UserPrincipalName "register-computer@$UpnSuffix" `
        -AccountPassword (ConvertTo-SecureString "$Password" -AsPlainText -Force) `
        -PasswordNeverExpires $True `
        -Enabled $True `
        -PassThru
    
  2. Otorga a la cuenta register-computer el conjunto mínimo de permisos necesarios para administrar grupos y cuentas de computadora en las UO secundarias y la UO Projects:

    $AcesForContainerAndDescendents = @(
        "CCDC;Computer",               # Create/delete computers
        "CCDC;Group"                   # Create/delete users
    )
    
    $AcesForDescendents = @(
        "LC;;Computer" ,               # List child objects
        "RC;;Computer" ,               # Read security information
        "WD;;Computer" ,               # Change security information
        "WP;;Computer" ,               # Write properties
        "RP;;Computer" ,               # Read properties
        "CA;Reset Password;Computer",  # ...
        "CA;Change Password;Computer", # ...
        "WS;Validated write to service principal name;Computer",
        "WS;Validated write to DNS host name;Computer",
    
        "LC;;Group",                   # List child objects
        "RC;;Group",                   # Read security information
        "WD;;Group",                   # Change security information
        "WP;;Group",                   # Write properties
        "RP;;Group"                    # Read properties
    )
    
    $AcesForContainerAndDescendents | % { dsacls.exe $ProjectsOrgUnitPath /G "${RegisterComputerUser}:${_}" /I:T | Out-Null }
    $AcesForDescendents | % { dsacls.exe $ProjectsOrgUnitPath /G "${RegisterComputerUser}:${_}" /I:S | Out-Null }
    

    Este comando puede tardar unos minutos en completarse.

  3. Revela la ruta de acceso de la UO Projects y la contraseña generada de la cuenta de usuario register-computer de Active Directory. Anota los valores porque los necesitarás más adelante.

    Write-Host "Password: $Password"
    Write-Host "Projects OU: $ProjectsOrgUnitPath"
    

Prepara el proyecto de Google Cloud

Ahora configura tu proyecto de dominio:

  • Si usas Microsoft AD administrado, el proyecto de tu dominio es el proyecto en el que implementaste Microsoft AD administrado.
  • Si usas Active Directory autoadministrado, el proyecto de tu dominio es el que ejecuta los controladores de dominio de Active Directory. En el caso de una VPC compartida, este proyecto debe ser el mismo que el proyecto host de VPC.

Puedes usar este proyecto de dominio para hacer lo siguiente:

  • Crea un secreto de Secret Manager que contenga la contraseña de la cuenta de usuario register-computer de Active Directory.
  • Implementa el Acceso a VPC sin servidores para permitir que Cloud Run acceda a Active Directory
  • Implementa la app de register-computer.
  • Configurar Cloud Scheduler para que active la limpieza de las cuentas de computadora inactivas

Te recomendamos que otorgues acceso al proyecto de dominio con el privilegio mínimo necesario.

Crea un secreto de Secret Manager

  1. En la consola de Google Cloud, abre Cloud Shell.

    Abra Cloud Shell

  2. Inicia PowerShell:

    pwsh
    
  3. Inicializa la siguiente variable y reemplaza domain-project-id por el ID de tu proyecto de dominio:

    $DomainProjectId = "domain-project-id"
    
  4. Configura el proyecto del dominio como el proyecto predeterminado:

    & gcloud config set project $DomainProjectId
    
  5. Habilita la API de Secret Manager:

    & gcloud services enable secretmanager.googleapis.com
    
  6. Ingresa la contraseña de la cuenta de usuario register-computer de Active Directory y almacénala en un secreto de Secret Manager:

    $RegisterComputerCredential = (Get-Credential -Credential 'register-computer')
    
    $TempFile = New-TemporaryFile
    Set-Content $TempFile $($RegisterComputerCredential.GetNetworkCredential().Password) -NoNewLine
    
    & gcloud secrets create ad-password --data-file $TempFile
    
    Remove-Item $TempFile
    

Implementa el Acceso a VPC sin servidores

La app register-computer necesita comunicarse con tus controladores de dominio de Active Directory. Para permitir que Cloud Run acceda a los recursos en una VPC, ahora configura el Acceso a VPC sin servidores:

  1. Inicializa las siguientes variables:

    $VpcName = "vpc-name"
    $ServerlessRegion = "serverless-region"
    $ServerlessIpRange = "serverless-ip-range"
    

    Reemplaza lo siguiente:

    • vpc-name: Es el nombre de la red de VPC que contiene los controladores de dominio de Active Directory.
    • serverless-region: Es la región en la que se implementará la función de Cloud Run. Elige una región que admita Cloud Run y Acceso a VPC sin servidores. La región no tiene que ser la misma que aquella en la que planeas implementar instancias de VM.

    • serverless-ip-range: El Acceso a VPC sin servidores la usa para habilitar la comunicación entre Cloud Run y los recursos de la VPC. Se establece en un rango de IP de /28 CIDR no reservado. No debe superponerse con ninguna subred existente en la red de VPC.

  2. Habilita las API de Acceso a VPC sin servidores:

    & gcloud services enable vpcaccess.googleapis.com
    
  3. Implementa el Acceso a VPC sin servidores:

    & gcloud compute networks vpc-access connectors create serverless-connector `
        --network $VpcName `
        --region $ServerlessRegion `
        --range $ServerlessIpRange
    

Otorga acceso a Kerberos y LDAP

Aunque el Acceso a VPC sin servidores permite que Cloud Runs acceda a recursos de la VPC, la conectividad a los extremos de Kerberos y LDAP de los controladores de dominio aún está sujeta a reglas de firewall.

Debes crear una regla de firewall que permita que los recursos sin servidores accedan a los controladores de dominio mediante los siguientes protocolos: LDAP (TCP/389), LDAPS (TCP/636), Kerberos (UDP/88, TCP/88) o cambio de contraseña de Kerberos (UDP/464, TCP/464). Puedes aplicar la regla según una etiqueta de red que hayas asignado a los controladores de dominio, o bien puedes aplicarla mediante una cuenta de servicio.

  • Para aplicar la regla de firewall, ejecuta uno de los siguientes comandos en Cloud Shell:

    Por etiqueta de red

    & gcloud compute firewall-rules create allow-adkrb-from-serverless-to-dc `
        --direction INGRESS `
        --action allow `
        --rules udp:88,tcp:88,tcp:389,tcp:636,udp:464,tcp:464 `
        --source-ranges $ServerlessIpRange `
        --target-tags dc-tag `
        --network $VpcName `
        --project vpc-project-id `
        --priority 10000
    

    Reemplaza los siguientes elementos:

    • dc-tag: Es la etiqueta de red asignada a las VM del controlador de dominio.
    • vpc-project-id: Es el ID del proyecto en el que está definida la VPC. Si usas una VPC compartida, usa el proyecto host de VPC; de lo contrario, usa el ID del proyecto del dominio.

    Por cuenta de servicio

    & gcloud compute firewall-rules create allow-adkrb-from-serverless-to-dc `
        --direction INGRESS `
        --action allow `
        --rules udp:88,tcp:88,tcp:389,tcp:636,udp:464,tcp:464 `
        --source-ranges $ServerlessIpRange `
        --target-service-accounts dc-sa `
        --network $VpcName `
        --project vpc-project-id `
        --priority 10000
    

    Reemplaza los siguientes elementos:

    • dc-sa: Es la dirección de correo electrónico de la cuenta de servicio que usan las VM del controlador de dominio.
    • vpc-project-id: Es el ID del proyecto en el que está definida la VPC. Si usas una VPC compartida, usa el proyecto host de VPC; de lo contrario, usa el ID del proyecto del dominio.

Implementa la app de Cloud Run

Ahora configura Cloud Build para implementar la app register-computer en Cloud Run:

  1. En Cloud Shell, clona el repositorio de GitHub:

    & git clone https://github.com/GoogleCloudPlatform/gce-automated-ad-join.git
    cd gce-automated-ad-join/ad-joining
    
  2. Inicializa las siguientes variables:

    $AdDomain = "dns-domain-name"
    $AdNetbiosDomain = "netbios-domain-name"
    $ProjectsOrgUnitPath = "projects-ou-distinguished-name"
    

    Reemplaza los siguientes elementos:

    • dns-domain-name: Es el nombre de dominio de DNS del dominio de Active Directory.
    • netbios-domain-name: Es el nombre de NetBIOS del dominio de Active Directory.
    • projects-ou-distinguished-name: Es el nombre distinguido de la UO Projects.
  3. Habilita las API de Cloud Run y Cloud Build.

    & gcloud services enable run.googleapis.com cloudbuild.googleapis.com
    
  4. Crea una cuenta de servicio register-computer-app para la aplicación de Cloud Run:

    & gcloud iam service-accounts create register-computer-app `
      --display-name="register computer Cloud Run app"
    
  5. Permite que la cuenta de servicio de Cloud Run lea el secreto que contiene la contraseña de Active Directory:

    & gcloud secrets add-iam-policy-binding ad-password `
      --member "serviceAccount:register-computer-app@$DomainProjectId.iam.gserviceaccount.com" `
      --role "roles/secretmanager.secretAccessor"
    
  6. Otorga a Cloud Build los permisos necesarios para implementar en Cloud Run:

    $DomainProjectNumber = (gcloud projects describe $DomainProjectId --format='value(projectNumber)')
    & gcloud iam service-accounts add-iam-policy-binding register-computer-app@$DomainProjectId.iam.gserviceaccount.com `
      --member "serviceAccount:$DomainProjectNumber@cloudbuild.gserviceaccount.com" `
      --role "roles/iam.serviceAccountUser"
    
    & gcloud projects add-iam-policy-binding $DomainProjectId `
      --member "serviceAccount:$DomainProjectNumber@cloudbuild.gserviceaccount.com" `
      --role roles/run.admin
    
  7. Usa el archivo cloudbuild.yaml como una plantilla para crear una configuración de compilación de Cloud Run personalizada que coincida con tu entorno:

    $Build = (Get-Content cloudbuild.yaml)
    $Build = $Build.Replace('__SERVERLESS_REGION__', "$ServerlessRegion")
    $Build = $Build.Replace('__PROJECTS_DN__', "$ProjectsOrgUnitPath")
    $Build = $Build.Replace('__AD_DOMAIN__', "$AdDomain")
    $Build = $Build.Replace('__AD_NETBIOS_DOMAIN__', "$AdNetbiosDomain")
    $Build = $Build.Replace('__SERVICE_ACCOUNT_EMAIL__', "register-computer-app@$DomainProjectId.iam.gserviceaccount.com")
    $Build | Set-Content .\cloudbuild.hydrated.yaml
    
  8. Compila la app y, luego, impleméntala en Cloud Run:

    & gcloud builds submit . `
      --config cloudbuild.hydrated.yaml `
      --substitutions _IMAGE_TAG=$(git rev-parse --short HEAD)
    

    La implementación puede tomar unos minutos en completarse.

  9. Determina la URL de la aplicación de Cloud Run:

    $RegisterUrl = (gcloud run services describe register-computer `
      --platform managed `
      --region $ServerlessRegion `
      --format=value`(status.url`))
    Write-Host $RegisterUrl
    

    Anota la URL. La necesitarás cuando crees una instancia de VM que se deba unir a Active Directory.

  10. Invoca la app de Cloud Run para verificar que la implementación funcionó:

    Invoke-RestMethod $RegisterUrl
    

    Se muestra una secuencia de comandos de PowerShell. La VM ejecuta esta secuencia de comandos durante la fase de specialize que la une al dominio.

Habilita un proyecto para la unión automática de dominios

La app de register-computer no permite que las instancias de VM se unan a un dominio de Active Directory, a menos que el proyecto de VM esté habilitado para la unión automática a dominios. Esta medida de seguridad ayuda a evitar que las VM que están conectadas a proyectos no autorizados accedan al dominio.

A fin de habilitar un proyecto para la unión automática a dominios, haz lo siguiente:

  • Crea una UO en Active Directory cuyo nombre coincida con el ID de tu proyecto de Google Cloud.
  • Otorga a la app de register-computer acceso al proyecto de Google Cloud.

Primero, crea la UO:

  1. Mediante un cliente de RDP, accede a una máquina que tenga acceso de administrador al dominio de Active Directory.
  2. En el complemento de Usuarios y computadoras de Active Directory de MMC, ve a la UO Projects.
  3. Haz clic con el botón derecho en la UO y selecciona Nuevo > Unidad organizacional.
  4. En el cuadro de diálogo Objeto nuevo, ingresa el ID del proyecto de Google Cloud en el que se implementarán las VM.
  5. Haz clic en Aceptar.

A continuación, otórgale a la app de register-computer acceso al proyecto de Google Cloud:

  1. En Cloud Shell, inicia PowerShell:

    pwsh
    
  2. Inicializa las siguientes variables:

    $ProjectId = "project-id"
    $DomainProjectId = "domain-project-id"
    

    Reemplazar

    • project-id con el ID del proyecto de Google Cloud en el que se implementarán tus VM
    • domain-project-id con el ID de tu proyecto de dominio
  3. Otorga a la cuenta de servicio register-computer-app la función Compute Viewer en el proyecto:

    & gcloud projects add-iam-policy-binding $ProjectId `
        --member "serviceAccount:register-computer-app@$DomainProjectId.iam.gserviceaccount.com" `
        --role "roles/compute.viewer"
    

El proyecto ahora está listo para admitir la unión automática a dominios.

Prueba la unión a dominios

Ahora puedes verificar que la configuración funcione correctamente:

  • Crea una sola instancia de VM que se una automáticamente al dominio de Active Directory
  • Crea un grupo de instancias administrado de instancias de VM que se unan automáticamente al dominio de Active Directory

Crea una instancia de VM única y únete a ella

Crea una instancia de VM que se una automáticamente al dominio de Active Directory:

  1. Regresa a la sesión de PowerShell en Cloud Shell y, luego, inicializa las siguientes variables:

    $Region = "vpc-region-to-deploy-vm"
    $Zone = "zone-to-deploy-vm"
    $Subnet = "vpc-subnet-to-deploy-vm"
    $ServerlessRegion = "serverless-region"
    

    Reemplaza lo siguiente:

    • vpc-region-to-deploy-vm: Es la región en la que se implementará la instancia de VM.
    • vpc-subnet-to-deploy-vm: Es la subred en la que se implementará la instancia de VM.
    • zone-to-deploy-vm: Es la zona en la que se implementará la instancia de VM.
    • serverless-region: la región en la que implementaste la app de Cloud Run.
  2. Configura el proyecto y la zona predeterminados:

    & gcloud config set project $ProjectId
    & gcloud config set compute/zone $Zone
    
  3. Busca nuevamente la URL de la aplicación de Cloud Run:

    $RegisterUrl = (gcloud run services describe register-computer `
      --platform managed `
      --region $ServerlessRegion `
      --format value`(status.url`) `
      --project $DomainProjectId)
    
  4. Crea una instancia mediante el scriptlet specialize que hace que la VM se una al dominio:

    VPC compartida

    $VpchostProjectId = (gcloud compute shared-vpc get-host-project $ProjectId --format=value`(name`))
    & gcloud compute instances create join-01 `
        --image-family windows-2019-core `
        --image-project windows-cloud `
        --machine-type n1-standard-2 `
        --no-address `
        --subnet projects/$VpchostProjectId/regions/$Region/subnetworks/$Subnet `
        --metadata "sysprep-specialize-script-ps1=iex((New-Object System.Net.WebClient).DownloadString('$RegisterUrl'))"
    

    VPC independiente

    & gcloud compute instances create join-01 `
        --image-family=windows-2019-core `
        --image-project=windows-cloud `
        --machine-type=n1-standard-2 `
        --no-address `
        --subnet $Subnet `
        --metadata "sysprep-specialize-script-ps1=iex((New-Object System.Net.WebClient).DownloadString('$RegisterUrl'))"
    

    Si deseas usar un nombre de host personalizado, agrega un parámetro --hostname al comando.

    Si usas una versión de Windows Server anterior a Windows Server 2019, TLS 1.2 podría inhabilitarse de forma predeterminada, lo que puede provocar que falle el scriptlet especializado. Para habilitar TLS 1.2, usa el siguiente scriptlet:

    [Net.ServicePointManager]::SecurityProtocol=[Net.SecurityProtocolType]::Tls12;iex((New-Object System.Net.WebClient).DownloadString('$RegisterUrl'))
    
  5. Supervisa el proceso de inicio:

    & gcloud compute instances tail-serial-port-output join-01
    

    Después de aproximadamente un minuto, la máquina se unirá al dominio de Active Directory. El resultado es similar a este:

    Domain           : corp.example.com
    DomainController : dc-01.corp.example.com.
    OrgUnitPath      : OU=test-project-123,OU=Projects,DC=corp,DC=example,DC=com
    
    WARNING: The changes will take effect after you restart the computer
    
    Computer successfully joined to domain
    

    Para dejar de observar el proceso de inicio, presiona CTRL+C.

Verifica que una VM esté unida a Active Directory

  1. Mediante un cliente de RDP, accede a una máquina que tenga acceso de administrador al dominio de Active Directory.
  2. Abre el complemento Usuarios y computadoras de Active Directory de MMC.
  3. En el menú, asegúrate de que la opción Ver > Funciones avanzadas esté habilitada.
  4. Ve a la UO que tiene el nombre del ID del proyecto de Google Cloud en el que creaste una instancia de VM.
  5. Haz doble clic en la cuenta join-01.
  6. En el cuadro de diálogo Propiedades, haz clic en la pestaña Editor de atributos.

    La cuenta de computadora está anotada con atributos LDAP adicionales. Estos atributos te permiten realizar un seguimiento de la asociación entre el objeto de computadora y la instancia de Compute Engine.

    Verifica que la lista contenga los siguientes atributos y valores de LDAP.

    Atributo de LDAP Valor
    msDS-cloudExtensionAttribute1 ID del proyecto de Google Cloud
    msDS-cloudExtensionAttribute2 Zona de Compute Engine
    msDS-cloudExtensionAttribute3 Nombre de la instancia de Compute Engine

    Los atributos msDS-cloudExtensionAttribute son atributos de uso general, y no los usa Active Directory.

Diagnostica errores

Si tu instancia de VM no pudo unirse al dominio, verifica el registro de la aplicación register-computer:

  1. En la consola de Google Cloud, ve a Cloud Run.

    Ir a Cloud Run

  2. Haz clic en la app de register-computer.

  3. En el menú, haz clic en Registros.

Borra la instancia

Una vez que verifiques que la instancia de VM se unió al dominio de Active Directory, bórrala.

  • Borra la instancia:

    & gcloud compute instances delete join-01 --quiet
    

Crea un grupo de instancias administrado y únelo al dominio

También puedes verificar que las instancias de un MIG puedan unirse de forma automática al dominio.

  1. Para crear una plantilla de instancias, pasa la secuencia de comandos de specialize que hace que la VM se una al dominio:

    VPC compartida

    $VpchostProjectId = (gcloud compute shared-vpc get-host-project $ProjectId --format=value`(name`))
    & gcloud compute instance-templates create ad-2019core-n1-std-2 `
        --image-family windows-2019-core `
        --image-project windows-cloud `
        --no-address `
        --machine-type n1-standard-2 `
        --subnet projects/$VpchostProjectId/regions/$Region/subnetworks/$Subnet `
        --metadata "sysprep-specialize-script-ps1=iex((New-Object System.Net.WebClient).DownloadString('$RegisterUrl'))"
    

    VPC independiente

    & gcloud compute instance-templates create ad-2019core-n1-std-2 `
        --image-family windows-2019-core `
        --image-project windows-cloud `
        --no-address `
        --machine-type n1-standard-2 `
        --subnet projects/$ProjectId/regions/$Region/subnetworks/$Subnet `
        --metadata "sysprep-specialize-script-ps1=iex((New-Object System.Net.WebClient).DownloadString('$RegisterUrl'))"
    
  2. Crea un grupo de instancias administrado que use la plantilla de instancias:

    & gcloud compute instance-groups managed create group-01 `
        --template ad-2019core-n1-std-2 `
        --size=3
    

Espera unos minutos y utiliza el complemento de Usuarios y computadoras de Active Directory de MMC para verificar que se hayan creado cuatro objetos nuevos en Active Directory:

  • 3 cuentas de computadora que corresponden a las 3 instancias de VM del grupo de instancias administrado.
  • 1 grupo llamado group-01 que contiene las 3 cuentas de computadora. Si planeas usar cuentas de servicio administrado grupales (gMSA), puedes usar este grupo para otorgar acceso al gMSA.

Una vez que verifiques que las instancias de VM de los MIG pueden unirse al dominio de Active Directory, sigue estos pasos para borrar el grupo administrado y la plantilla de instancias:

  1. En Cloud Shell, borra el grupo de instancias:

    & gcloud compute instance-groups managed delete group-01 --quiet
    
  2. Borra la plantilla de instancias:

    & gcloud compute instance-templates delete ad-2019core-n1-std-2 --quiet
    

Programa la limpieza de las cuentas de computadora inactivas

Automatizar el proceso de unión de computadoras al dominio reduce el esfuerzo de configurar servidores nuevos y te permite usar servidores unidos al dominio en grupos de instancias administrados. Sin embargo, con el tiempo, las cuentas de computadora inactivas pueden acumularse en el dominio.

A fin de evitar esta acumulación, te recomendamos que configures la app de register-computer para analizar de forma periódica el dominio de Active Directory con el fin de buscar y quitar cuentas inactivas de forma automática.

La app de register-computer puede usar los atributos msDS-cloudExtensionAttribute de las cuentas de computadora para identificar qué cuentas de computadora están inactivas. Estos atributos contienen el proyecto, la zona y el nombre de la instancia de VM correspondiente en Compute Engine. Para cada cuenta de computadora, la app puede verificar si la instancia de VM correspondiente aún está disponible. Si no es así, la cuenta de computadora se considera inactiva y se quita.

Para activar la limpieza de cuentas de computadora, debes invocar el extremo /cleanup de la app de Cloud Run. Para evitar que usuarios no autorizados activen una limpieza, esta solicitud se debe autenticar mediante la cuenta de servicio register-computer-app.

Configura Cloud Scheduler

En los siguientes pasos, se muestra cómo configurar Cloud Scheduler junto con Pub/Sub para activar de forma automática una limpieza cada 24 horas:

  1. En Cloud Shell, habilita la API de Cloud Scheduler en el proyecto del dominio:

    & gcloud services enable cloudscheduler.googleapis.com
    
  2. Configura AppEngineLocation en una ubicación de App Engine válida en la que deseas implementar Cloud Scheduler:

    $AppEngineLocation = "location"
    

    Reemplaza location por la región de App Engine que seleccionaste para los recursos de VPC, por ejemplo, us-central. Si esa región no está disponible como ubicación de App Engine, elige una ubicación que esté geográficamente cerca de ti. Para obtener más información, consulta Regiones y zonas.

  3. Inicializa App Engine:

    & gcloud app create --region $AppEngineLocation --project $DomainProjectId
    
  4. Crea un trabajo de Cloud Scheduler:

    & gcloud scheduler jobs create http cleanup-computer-accounts `
        --schedule "every 24 hours" `
        --uri "$RegisterUrl/cleanup" `
        --oidc-service-account-email register-computer-app@$DomainProjectId.iam.gserviceaccount.com `
        --oidc-token-audience "$RegisterUrl/" `
        --project $DomainProjectId
    

    Este trabajo llama a la app de register-computer una vez cada 24 horas y usa la cuenta de servicio register-computer-app para la autenticación.

Activa una limpieza

Para verificar la configuración de limpieza de cuentas de computadoras inactivas, puedes activar de forma manual el trabajo de Cloud Scheduler.

  1. En la consola de Google Cloud ve a Cloud Scheduler.

    Ir a Cloud Scheduler

  2. En el trabajo cleanup-computer-accounts que creaste, haz clic en Ejecutar ahora.

    Después de unos segundos, en la columna Resultado, se muestra Finalizado, lo que indica que la limpieza se completó de forma correcta. Si la columna de resultados no se actualiza de manera automática en unos segundos, haz clic en el botón Actualizar.

Para obtener más detalles sobre qué cuentas se quitaron, consulta los registros de la app de register-computer.

  1. En la consola de Google Cloud, ve a Cloud Run.

    Ir a Cloud Run

  2. Haz clic en la app de register-computer.

  3. En el menú, haz clic en Registros.

    Las entradas de registro indican que las cuentas de computadora de las instancias de VM que usaste para probar la unión a dominios se identificaron como inactivas y se quitaron.

Limpia

Si usas este instructivo como modelo de referencia para otros instructivos, lee los otros instructivos para saber cuándo ejecutar los pasos de limpieza de este instructivo.

Si no deseas conservar la configuración de Google Cloud que se usó en este instructivo, puedes revertirla mediante los siguientes pasos:

  1. En Cloud Shell, borra el trabajo de Cloud Scheduler:

    & gcloud scheduler jobs delete cleanup-computer-accounts `
      --project $DomainProjectId
    
  2. Borra la app de Cloud Run:

    & gcloud run services delete register-computer `
      --platform managed `
      --project $DomainProjectId `
      --region $ServerlessRegion
    
  3. Borra el secreto de Secret Manager:

    gcloud secrets delete ad-password --project $DomainProjectId
    
  4. Borra la regla de firewall para el acceso de LDAP y Kerberos:

    gcloud compute firewall-rules delete allow-adkrb-from-serverless-to-dc --project=vpc-project-id
    

    Reemplaza vpc-project-id por el ID del proyecto en el que está definida la VPC. Si usas una VPC compartida, usa el proyecto host de VPC; de lo contrario, usa el ID del proyecto del dominio.

  5. Borra el Acceso a VPC sin servidores:

    gcloud compute networks vpc-access connectors delete serverless-connector --region $ServerlessRegion --quiet
    

Revierte los cambios de Active Directory

  1. Mediante un cliente de RDP, accede a una máquina que tenga acceso de administrador al dominio de Active Directory.
  2. En el complemento de Usuarios y computadoras de Active Directory de MMC, ve a la UO Projects.
  3. Borra la cuenta de usuario register-computer de Active Directory.
  4. Borra la UO que creaste para probar la unión automatizada de dominios.

¿Qué sigue?