部署 Active Directory 资源林

本系列文章将指导您使用托管式 Microsoft AD 在 Google Cloud 上部署 Active Directory 资源林。您将了解如何:

  • 设置一个共享 VPC,使您可以从多个项目访问托管式 Microsoft AD,并使用林信任将托管式 Microsoft AD 连接到本地 Active Directory。
  • 配置防火墙规则,以防止未经授权的来源访问 Active Directory。
  • 在单个区域中部署托管式 Microsoft AD,并将其连接到现有的共享 VPC。
  • 创建一个管理虚拟机并将其加入网域。
  • 使用委派管理员连接到托管式 Microsoft AD。

架构概览

要允许来自多个项目的虚拟机使用 Active Directory,您需要一个共享 VPC 和三个单独的子网:

  • 托管式 Microsoft AD 子网:由托管式 Microsoft AD 用于运行网域控制器。
  • 管理子网:包含专门用于管理 Active Directory 的机器。
  • 资源子网:包含 Active Directory 成员服务器(例如应用或数据库服务器)。每个资源子网限定在一个区域。在本指南中,您将仅创建一个资源子网,但是如果您打算跨多个区域部署服务器,则可以在以后添加其他资源子网。

部署概览

为了降低安全风险,您将部署一个具有内部 RFC 1918 IP 地址且没有互联网访问权限的管理虚拟机。您将使用 IAP TCP 隧道来登录虚拟机实例。

您将遵循分别为管理和服务器使用单独项目的最佳做法,创建两个单独的项目:

  • VPC 宿主项目:包含共享 VPC 配置以及托管式 Microsoft AD。
  • 管理项目:专门用于管理 Active Directory。您将在此项目中创建一个管理虚拟机,并使用它来配置 Active Directory。

准备工作

本教程使用共享 VPC,这需要用到 Google Cloud 组织。如果您没有组织,请先创建一个。此外,某些设置活动要求管理角色。在继续之前,请确保您已被授予以下 IAM 角色。

本文假定您使用的是安装了 Google Cloud CLI 的 Windows 机器。如果您使用的是其他操作系统,则需要调整一些步骤。

最后,请在开始之前收集以下信息:

  • VPC 宿主项目管理项目的项目名称。这两个项目将在部署中发挥核心作用,因此请选择易于识别的名称并遵循您企业的命名规则
  • 要在其中创建 VPC 宿主项目管理项目文件夹。如果您还没有合适的文件夹,请考虑为跨职能的资源和服务(例如 Active Directory)创建一个单独的子文件夹
  • 用于新 Active Directory 林的林根网域的 DNS 域名。
  • 在其中部署资源的初始区域。请注意,您只能在某些区域部署托管式 Microsoft AD(这不会影响您的网域的一般可用性,网域在您的 VPC 所在的所有区域中都可用)。如果不确定哪个区域最适合您的需求,请参阅选择区域时的最佳做法。您可以在稍后将部署扩展到其他区域。
  • 要创建的共享 VPC 的名称。由于 VPC 将在多个项目中共享,请确保选择一个易于识别的名称。
  • 以下子网的子网范围:

    • 托管式 Microsoft AD 子网:大小必须至少为 /24。
    • 管理子网:需要容纳所有管理服务器。建议使用大小为 /28 或更大的子网范围。
    • 资源子网:规划此子网的大小,使其可以容纳您计划在初始区域中部署的所有服务器。

    确保您的子网不与任何本地子网重叠,并留出足够的增长空间。

费用

本教程使用 Google Cloud 的收费组件,包括 Compute EngineCloud DNSGoogle Cloud Observability。使用价格计算器来计算完成本教程的费用。确保包括特定于您的部署的任何其他资源。

设置 VPC 网络

创建 VPC 宿主项目

VPC 宿主项目用于创建共享 VPC 并管理与网络相关的配置,例如子网、防火墙规则和路由。

  1. 在 Google Cloud 控制台中,打开管理资源页面。

    打开“管理资源”页面

  2. 在左上角的组织下拉列表中,选择您的组织。

  3. 点击创建项目,然后输入以下设置:

    1. 项目名称:您选择作为项目名称的 ID。
    2. 结算账号:您的结算账号。
    3. 位置:要在其中创建项目的文件夹。
  4. 点击创建

防止项目被意外删除

删除项目会同时删除其中部署的所有代管式 Microsoft AD 网域。除了使用 IAM 政策限制对项目的访问权限外,您还应防止项目被意外删除

  1. Google Cloud 控制台中,打开 Cloud Shell。Cloud Shell 可用于访问 Google Cloud 控制台中的命令行,并还包含管理 Google Cloud 所需的 Google Cloud CLI 和其他工具。 Cloud Shell 可能需要几分钟才能完成预配。
    激活 Cloud Shell

  2. 初始化变量以包含组织名称和 VPC 宿主项目的项目 ID:

    ORG_NAME=[ORG-NAME] \
    VPCHOST_PROJECT_ID=[PROJECT-ID]
    

    [ORG-NAME] 替换为您的组织名称,并将 [PROJECT-ID] 替换为 VPC 宿主项目的 ID。例如:

    ORG_NAME=example.com
    VPCHOST_PROJECT_ID=ad-host-123
    
  3. 运行以下命令以查找组织 ID,将 ORG-NAME 替换为组织的名称(例如 example.com):

    ORG_ID=$(gcloud organizations list \
      --filter="DISPLAY_NAME=$ORG_NAME" \
      --format=value\(ID\)) && \
    echo "ID of $ORG_NAME is $ORG_ID"
    
  4. 对组织实施 compute.restrictXpnProjectLienRemoval 政策:

    gcloud resource-manager org-policies enable-enforce \
      --organization $ORG_ID compute.restrictXpnProjectLienRemoval
    

删除默认 VPC

Compute Engine 会在您创建的每个项目中创建一个 default VPC。此 VPC 以自动模式进行配置,这意味着系统为每个区域预先分配一个子网并自动分配子网范围。

如果您计划将 VPC 连接到本地网络,则 Compute Engine 在自动模式下使用的预定义 IP 范围不太可能满足您的需求;它们可能会与现有 IP 范围重叠,或者大小不足。您应该删除默认 VPC,然后将其替换为自定义模式 VPC。

  1. 返回到现有的 Cloud Shell 会话。

  2. 在 VPC 宿主项目中启用 Compute Engine API:

    gcloud services enable compute.googleapis.com --project=$VPCHOST_PROJECT_ID
    
  3. 删除与 default VPC 相关的所有防火墙规则:

    gcloud compute firewall-rules list \
      --filter="network=default" \
      --project=$VPCHOST_PROJECT_ID \
      --format=value\(name\) | \
    xargs gcloud compute firewall-rules delete \
      --project=$VPCHOST_PROJECT_ID
    
  4. 删除默认 VPC:

    gcloud compute networks delete default --project=$VPCHOST_PROJECT_ID
    

创建共享 VPC 和子网

删除 default VPC 后,您现在可以创建自定义 VPC(稍后将其转换为共享 VPC)。

  1. 返回到现有的 Cloud Shell 会话。

  2. 为 VPC 名称、初始区域和子网范围创建变量:

    SHAREDVPC_NAME=[NAME] \
    SUBNET_REGION=[REGION] \
    SUBNET_RANGE_MANAGEMENT=[MANAGEMENT-RANGE] \
    SUBNET_RANGE_RESOURCES=[RESOURCES-RANGE] \
    SUBNET_RANGE_MANAGEDAD=[MANAGED-AD-RANGE] \
    SUBNET_RANGE_ONPREMAD=[ONPREM-AD-RANGE]
    

    将占位符变量进行如下替换:

    • [NAME] 替换为名称,例如 ad-network-env-test.
    • [REGION] 替换为要在其中部署 Active Directory 网域控制器的区域。您可以随时扩展 VPC 和网域以覆盖其他区域。
    • [MANAGEMENT-RANGE] 替换为管理子网的子网范围。
    • [RESOURCES-RANGE] 替换为资源子网的子网范围。
    • [MANAGED-AD-RANGE] 替换为托管式 Microsoft AD 子网的子网范围。
    • [ONPREM-AD-RANGE] 替换为 本地 AD 子网的子网范围。

    例如:

    SHAREDVPC_NAME=ad-network \
    SUBNET_REGION=us-central1 \
    SUBNET_RANGE_MANAGEMENT=10.0.0.0/24 \
    SUBNET_RANGE_RESOURCES=10.0.1.0/24 \
    SUBNET_RANGE_MANAGEDAD=10.0.2.0/24 \
    SUBNET_RANGE_ONPREMAD=192.168.0.0/24
    
  3. 令 VPC 宿主项目托管共享 VPC:

    gcloud compute shared-vpc enable $VPCHOST_PROJECT_ID
    
  4. 创建一个新的自定义模式 VPC 网络

    gcloud compute networks create $SHAREDVPC_NAME \
        --subnet-mode=custom \
        --project=$VPCHOST_PROJECT_ID
    
  5. 创建管理子网和资源子网,并启用专用 Google 访问通道,以便可以激活 Windows,而无需授予虚拟机直接的互联网访问权限。

    gcloud compute networks subnets create $SUBNET_REGION-management \
      --network=$SHAREDVPC_NAME \
      --range=$SUBNET_RANGE_MANAGEMENT \
      --region=$SUBNET_REGION \
      --enable-private-ip-google-access \
      --project=$VPCHOST_PROJECT_ID && \
    gcloud compute networks subnets create $SUBNET_REGION-resources \
      --network=$SHAREDVPC_NAME \
      --range=$SUBNET_RANGE_RESOURCES \
      --region=$SUBNET_REGION \
      --enable-private-ip-google-access \
      --project=$VPCHOST_PROJECT_ID
    

保护共享 VPC

现在,VPC 宿主项目包含一个有两个子网的共享 VPC。通过将服务项目连接到此共享 VPC,可以使共享 VPC 用于多个项目。

您应该按子网授予访问权限,而不是授予服务项目成员使用共享 VPC 的所有子网的权限。

出于安全原因,应仅允许一小部分管理人员访问管理子网。这样可以确保子网仅用于管理 Active Directory。您可以对资源子网应用更宽松的访问权限控制。

创建防火墙规则

在部署 Active Directory 之前,您需要创建防火墙规则以允许您对其进行管理和使用。

  1. 返回到现有的 Cloud Shell 会话。

  2. 对入站流量启用防火墙日志记录,以便记录所有失败的访问尝试:

    gcloud compute firewall-rules create deny-ingress-from-all \
        --direction=INGRESS \
        --action=deny \
        --rules=tcp:0-65535,udp:0-65535 \
        --enable-logging \
        --source-ranges=0.0.0.0/0 \
        --network=$SHAREDVPC_NAME \
        --project=$VPCHOST_PROJECT_ID \
        --priority 65000
    
  3. 您将使用部署在管理子网中的专用管理服务器来管理 Active Directory。由于此服务器将不使用外部 IP 地址部署,因此您需要使用 IAP TCP 转发连接到该服务器。

    创建以下防火墙规则以允许来自 IAP 的 RDP 入站流量:

    gcloud compute firewall-rules create allow-rdp-ingress-from-iap \
      --direction=INGRESS \
      --action=allow \
      --rules=tcp:3389 \
      --enable-logging \
      --source-ranges=35.235.240.0/20 \
      --network=$SHAREDVPC_NAME \
      --project=$VPCHOST_PROJECT_ID \
      --priority 10000
    

现在,您的共享 VPC 可用于部署托管式 Microsoft AD。

部署 Active Directory

托管式 Microsoft AD 处理 Active Directory 网域控制器的预配和维护。网域控制器上部署了以下角色:

  • Active Directory 网域服务
  • DNS

网域控制器部署在您的项目外部,不会在项目中显示为虚拟机实例。为了使您可以使用域控制器,在您部署托管式 Microsoft AD 时,系统会将以下更改应用于您的项目:

  • 向您的 VPC 添加 VPC 对等互连。这会将您的 VPC 连接到包含网域控制器的服务 VPC。
  • 在项目中创建 Cloud DNS 专用 DNS 对等互连地区。它将与您的 Active Directory 网域匹配的 DNS 查询转发到作为托管式 Microsoft AD 的一部分运行的 DNS 服务。

由于您使用的是共享 VPC,因此需要在 VPC 宿主项目中部署托管式 Microsoft AD,以便使所有服务项目均可使用 Active Directory。

创建 Active Directory 林和网域

请按照以下步骤在本指南上一部分中创建的 VPC 宿主项目中部署托管式 Microsoft AD:

  1. 在 Google Cloud 控制台中,返回到 Cloud Shell。

  2. 初始化变量以包含要创建的新 Active Directory 林的林根域名。有关选择名称的指导,请参阅 Microsoft 命名约定

    AD_DNS_DOMAIN=[AD-DNS-NAME]
    

    例如:

    AD_DNS_DOMAIN=cloud.example.com
    
  3. 在 VPC 宿主项目中启用 Cloud DNS

    gcloud services enable dns.googleapis.com --project $VPCHOST_PROJECT_ID
    
  4. 在 VPC 宿主项目中启用托管式 Microsoft AD API:

    gcloud services enable managedidentities.googleapis.com --project $VPCHOST_PROJECT_ID
    
  5. 预配网域控制器并创建一个新的林:

    gcloud active-directory domains create $AD_DNS_DOMAIN \
      --admin-name=SetupAdmin \
      --reserved-ip-range=$SUBNET_RANGE_MANAGEDAD \
      --region=$SUBNET_REGION \
      --authorized-networks=projects/$VPCHOST_PROJECT_ID/global/networks/$SHAREDVPC_NAME \
      --project=$VPCHOST_PROJECT_ID
    

    等待 15 到 20 分钟以便命令完成。

  6. 上一条命令为您创建了一个名为 SetupAdmin@[AD_DNS_DOMAIN] 的初始 Active Directory 用户。该用户具有委派管理员权限,您可以使用它来完成新 Active Directory 林的配置。

    要显示该用户的凭据,请运行以下命令。您需要确认在屏幕上显示密码是安全的。

    gcloud active-directory domains reset-admin-password $AD_DNS_DOMAIN \
      --project=$VPCHOST_PROJECT_ID
    

    复制密码;您稍后会用到它。

    VPC 宿主项目的项目所有者和项目编辑者可以随时重置密码。

创建管理项目

由托管式 Microsoft AD 创建的 Active Directory 林和林根网域现在可正常工作,并且您具有第一个用户 (SetupAdmin) 来执行进一步配置。但是,由于不能使用 RDP 直接访问托管式 Microsoft AD 网域控制器,因此必须使用管理虚拟机来处理所有配置。

您将在专门用于 Active Directory 管理的项目中创建此虚拟机实例,然后将虚拟机实例连接到共享 VPC 的管理子网。

加入网域后,您可以使用远程服务器管理工具组策略管理控制台和 PowerShell 来管理 Active Directory 和与 Active Directory 相关的资源。

要创建管理项目,请执行以下操作:

  1. 在 Google Cloud 控制台中,打开管理资源页面。

    打开“管理资源”页面

  2. 在左上角的组织下拉列表中,选择您的组织。
  3. 点击创建项目并完成以下字段:
    1. 项目名称:您选择作为项目名称的 ID。
    2. 结算账号:您的结算账号。如果您有权访问多个结算账号,请查看每个结算账号的内部政策并选择合适的账号。
    3. 位置:要在其中创建项目的文件夹。
  4. 点击创建

管理项目将包含用于管理 Active Directory 的虚拟机实例。在分层管理模型中,这意味着来自层级 0 的高权限用户将登录到这些虚拟机实例。

这些实例很容易成为攻击者的目标;它们提供了捕获密码、密码哈希或 Kerberos 令牌的机会。并且由于这些凭据具有对 Active Directory 的管理员权限,因此它们可能被用来入侵网域。

对管理项目中虚拟机实例的处理方式应与特权访问工作站相同。这意味着:

  • 应只允许一小部分管理人员登录这些实例(无论是通过 RDP 还是其他方式)。
  • 应基于最小权限原则来授予对管理项目的访问权限。应只允许少量用户查看和访问 Google Cloud 项目中的资源。

查看控制资源访问权限的最佳实践,详细了解如何保护 Google Cloud 项目。

使用共享 VPC 而不是默认 VPC

管理项目当前具有自己的 default VPC。由于您将改为使用共享 VPC,因此可以删除此 VPC。

  1. 在 Google Cloud 控制台中,返回到 Cloud Shell。

  2. 初始化变量以包含管理项目的项目 ID(将 [MANAGEMENT_PROJECT_ID] 替换为刚创建的管理项目的项目 ID):

    MANAGEMENT_PROJECT_ID=[MANAGEMENT_PROJECT_ID]
    
  3. 在 VPC 宿主项目中启用 Compute Engine API:

    gcloud services enable compute.googleapis.com \
      --project=$MANAGEMENT_PROJECT_ID
    
  4. 删除与 default VPC 相关的所有防火墙规则:

    gcloud compute firewall-rules list \
      --filter="network=default" \
      --project=$MANAGEMENT_PROJECT_ID \
      --format=value\(name\) | \
    xargs gcloud compute firewall-rules delete \
        --project=$MANAGEMENT_PROJECT_ID
    
  5. 删除 default VPC:

    gcloud compute networks delete default --project=$MANAGEMENT_PROJECT_ID
    
  6. 将管理项目与共享 VPC 相关联:

    gcloud compute shared-vpc associated-projects add $MANAGEMENT_PROJECT_ID \
      --host-project=$VPCHOST_PROJECT_ID
    

管理项目现在是服务项目,您可以从管理项目使用共享 VPC。

连接到 Active Directory

现在,您可以创建第一个管理虚拟机实例并将其加入 Active Directory。您可以使用此虚拟机来配置 Active Directory 林和林根网域。

创建管理虚拟机

要创建管理虚拟机实例,请按照下列步骤操作:

  1. 在 Google Cloud 控制台中,返回到 Cloud Shell。
  2. 使用预安装的远程服务器管理工具 (RSAT)、DNS 服务器管理工具和组策略管理控制台 (GPMC),创建一个运行 Windows Server 2019 的新虚拟机实例。

    由于您将使用 IAP TCP 转发来访问机器,因此无需为该实例分配外部 IP 地址

    gcloud compute instances create admin-01 \
      --image-family=windows-2019 \
      --image-project=windows-cloud \
      --machine-type=n1-standard-2 \
      --no-address \
      --zone=$SUBNET_REGION-a \
      --subnet=projects/$VPCHOST_PROJECT_ID/regions/$SUBNET_REGION/subnetworks/$SUBNET_REGION-management \
      --project=$MANAGEMENT_PROJECT_ID \
      --metadata="sysprep-specialize-script-ps1=Install-WindowsFeature -Name RSAT-AD-Tools;Install-WindowsFeature -Name GPMC;Install-WindowsFeature -Name RSAT-DNS-Server"
    
  3. 运行以下命令以观察启动过程。

    gcloud compute instances tail-serial-port-output admin-01 \
      --zone=$SUBNET_REGION-a \
      --project=$MANAGEMENT_PROJECT_ID
    
  4. 等待大约 4 分钟,直到您看到输出 Instance setup finished,然后按 Ctrl+C。虚拟机实例现在可以使用了。

  5. 在实例上创建本地 SAM 用户 LocalAdmin

    gcloud compute reset-windows-password admin-01 \
      --user=LocalAdmin \
      --project=$MANAGEMENT_PROJECT_ID \
      --zone=$SUBNET_REGION-a \
      --quiet
    

    复制密码;您稍后会用到它。

将管理虚拟机加入网域

现在,您可以登录到管理虚拟机并将其加入 Active Directory。

  1. 在本地 Windows 工作站上,打开命令提示符 (cmd)。

  2. 如果这是您第一次在本地工作站上使用 gcloud,请确保首先进行身份验证

  3. 运行以下命令以建立从本地工作站到 admin-01 虚拟机的 IAP TCP 隧道,将 [MANAGEMENT_PROJECT_ID] 替换为管理项目的 ID。

    gcloud compute start-iap-tunnel admin-01 3389 ^
      --local-host-port=localhost:13389 ^
      --project=[MANAGEMENT_PROJECT_ID]
    

    等待以下输出出现

    Listening on port [13389]`
    

    隧道现在可以使用了。

  4. 打开 Windows 远程桌面连接客户端 (mstsc.exe)。

  5. 点击显示选项

  6. 输入以下值:

    1. 计算机localhost:13389
    2. 用户名localhost\LocalAdmin
  7. 点击连接

  8. 输入您的凭据对话框中,粘贴您先前为本地 LocalAdmin 用户生成的密码。然后点击确定

  9. 由于您尚未为管理虚拟机设置 RDP 证书,此时将显示一条警告消息,表示无法验证远程计算机的身份。点击忽略此警告。

  10. 现在,您应该看到 admin-01 虚拟机的 Windows Server 桌面。

  11. 右键点击开始按钮(或者按 Win+X),然后点击命令提示符(管理员)

  12. 点击以确认升级权限提示。

  13. 在提升权限的命令提示符中,通过运行 powershell 启动一个 PowerShell 会话。

  14. 运行以下命令以开始加入网域。

    Add-Computer -DomainName [AD-DNS-NAME]
    

    [AD-DNS-NAME] 替换为林根网域的 DNS 名称。

  15. Windows PowerShell 凭据请求对话框中,输入以下值:

    1. 用户名SetupAdmin
    2. 密码:输入在部署托管式 Microsoft AD 时为 SetupAdmin 创建的密码。不要使用本地 LocalAdmin 用户的密码。
  16. 运行 Restart-Computer 重新启动计算机。等待大约一分钟,以便虚拟机重新启动。

启动 Active Directory 用户和计算机

管理虚拟机现在是您的 Active Directory 网域的成员。您可以使用它来管理 Active Directory:

  1. 在本地 Windows 工作站上,打开 Windows 远程桌面连接客户端 (mstsc.exe)。
  2. 点击显示选项
  3. 输入以下值:
    1. 计算机localhost:13389
    2. 用户名SetupAdmin@[AD-DNS-NAME]。将 [AD-DNS-NAME] 替换为林根网域的 DNS 名称。
  4. 点击连接
  5. 输入您的凭据对话框中,粘贴您先前为 SetupAdmin 用户生成的密码。然后点击确定
  6. 由于您尚未为管理虚拟机设置 RDP 证书,此时将显示一条警告消息,表示无法验证远程计算机的身份。点击忽略此警告。
  7. 现在,您应该看到 admin-01 虚拟机的 Windows Server 桌面。
  8. 右键点击开始按钮(或者按 Win+X),然后选择运行
  9. 输入 dsa.msc 并点击确定

现在您应该看到 Active Directory 用户和计算机

AD 用户

恭喜!您已连接到托管式 Microsoft AD 网域!

清理

如果您不打算将来使用本教程中的资源,请清理它们,以避免产生费用。

删除 Active Directory 林和网域

  1. 在 Google Cloud 控制台中,打开 Cloud Shell。

  2. 运行以下命令以删除 Active Directory 林和网域,将 [AD_DNS_DOMAIN] 替换为用于托管式 Microsoft AD 网域的 DNS 域名,并将 [VPCHOST_PROJECT_ID] 替换为 VPC 宿主项目的 ID:

    gcloud active-directory domains delete [AD_DNS_DOMAIN] \
      --project=[VPCHOST_PROJECT_ID]
    

删除管理项目

  1. 在 Google Cloud 控制台中,前往项目页面。

    打开“项目”页面

  2. 在项目列表中,选择管理项目,然后点击删除
  3. 在对话框中,输入项目 ID,然后点击关停以删除项目。

删除 VPC 宿主项目

  1. 在 Google Cloud 控制台中,前往项目页面。

    打开“项目”页面

  2. 在项目列表中,选择 VPC 宿主项目,然后点击删除
  3. 在对话框中,输入项目 ID,然后点击关停以删除项目。

后续步骤