在 Parameter Store 中创建 SecureString 参数并将节点加入域(PowerShell) - AWS Systems Manager

在 Parameter Store 中创建 SecureString 参数并将节点加入域(PowerShell)

本演练演示了如何使用 AWS Systems Manager SecureString 参数和 Run Command 将 Windows Server 节点加入域。演练中使用了典型的域参数,如域名和域用户名。这些值作为未加密的字符串值传递。域密码使用 AWS 托管式密钥加密,并作为加密字符串传递。

先决条件

本演练假定您已在与 Amazon VPC 关联的 DHCP 选项集中指定域名和 DNS 服务器 IP 地址。有关更多信息,请参阅 Amazon VPC 用户指南中的使用 DHCP 选项集

创建 SecureString 参数并将节点加入到域
  1. 使用 AWS Tools for Windows PowerShell 将参数输入到系统中。

    在以下示例中,将每个用户输入占位符替换为您自己的信息。

    Write-SSMParameter -Name "domainName" -Value "DOMAIN-NAME" -Type String Write-SSMParameter -Name "domainJoinUserName" -Value "DOMAIN\USERNAME" -Type String Write-SSMParameter -Name "domainJoinPassword" -Value "PASSWORD" -Type SecureString
    重要

    只会加密 SecureString 参数的。不会加密参数名称、描述和其他属性。

  2. 将以下 AWS Identity and Access Management (IAM) 策略附加到节点的 IAM 角色权限:

    • AmazonSSMManagedInstanceCore – 必需。此 AWS 托管式策略允许托管式节点使用 Systems Manager 服务核心功能。

    • AmazonSSMDirectoryServiceAccess – 必需。此 AWS 托管式策略允许 SSM Agent 代表您访问 AWS Directory Service,以处理托管式节点加入域的请求。

    • 用于 S3 存储桶访问的自定义策略 – 必需。SSM Agent 位于您的节点上并执行 Systems Manager 任务,它需要访问 Amazon 拥有的特定 Amazon Simple Storage Service(Amazon S3)存储桶。在您创建的自定义 S3 存储桶策略中,您还会提供对您自己的 S3 存储桶的访问权限,这是执行 Systems Manager 操作所必需的。

      示例:您可以将 Run Command 命令或 Session Manager 会话输出写入到一个 S3 存储桶中,以后将使用该输出进行审核或故障排除。您将访问脚本或自定义补丁基准列表存储在一个 S3 存储桶中,并在运行命令或应用补丁基准时引用该脚本或列表。

      有关为 Amazon S3 存储桶访问创建自定义策略的信息,请参阅为实例配置文件创建自定义 S3 存储桶策略

      注意

      在 S3 存储桶中保存输出日志数据是可选功能,但如果您决定使用该功能,建议在开始执行 Systems Manager 配置过程时对其进行设置。有关更多信息,请参阅 Amazon Simple Storage Service 用户指南中的创建存储桶

    • CloudWatchAgentServerPolicy – 可选。此 AWS 托管式策略允许您在托管式节点上运行 CloudWatch 代理。通过使用此策略,可以读取节点上的信息并将其写入 Amazon CloudWatch。只有在使用 Amazon EventBridge 或 CloudWatch Logs 等服务时,实例配置文件才需要使用该策略。

      注意

      使用 CloudWatch 和 Eventbridge 功能是可选的,但如果您决定使用这些功能,建议您在开始执行 Systems Manager 配置过程时设置这些功能。有关更多信息,请参阅 Amazon EventBridge User GuideAmazon CloudWatch Logs User Guide

  3. 编辑附加到节点的 IAM 角色并添加以下策略。此策略授予节点调用 kms:Decryptssm:CreateDocument API 的权限。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kms:Decrypt", "ssm:CreateDocument" ], "Resource": [ "arn:aws:kms:region:account-id:key/kms-key-id" ] } ] }
  4. 复制以下 JSON 文本并粘贴到文本编辑器中,并将文件保存为以下位置中的 JoinInstanceToDomain.jsonc:\temp\JoinInstanceToDomain.json

    { "schemaVersion": "2.2", "description": "Run a PowerShell script to securely join a Windows Server instance to a domain", "mainSteps": [ { "action": "aws:runPowerShellScript", "name": "runPowerShellWithSecureString", "precondition": { "StringEquals": [ "platformType", "Windows" ] }, "inputs": { "runCommand": [ "$domain = (Get-SSMParameterValue -Name domainName).Parameters[0].Value", "if ((gwmi Win32_ComputerSystem).domain -eq $domain){write-host \"Computer is part of $domain, exiting\"; exit 0}", "$username = (Get-SSMParameterValue -Name domainJoinUserName).Parameters[0].Value", "$password = (Get-SSMParameterValue -Name domainJoinPassword -WithDecryption $True).Parameters[0].Value | ConvertTo-SecureString -asPlainText -Force", "$credential = New-Object System.Management.Automation.PSCredential($username,$password)", "Add-Computer -DomainName $domain -Credential $credential -ErrorAction SilentlyContinue -ErrorVariable domainjoinerror", "if($?){Write-Host \"Instance joined to domain successfully. Restarting\"; exit 3010}else{Write-Host \"Instance failed to join domain with error:\" $domainjoinerror; exit 1 }" ] } } ] }
  5. 在 Tools for Windows PowerShell 中运行以下命令来创建新 SSM 文档。

    $json = Get-Content C:\temp\JoinInstanceToDomain | Out-String New-SSMDocument -Name JoinInstanceToDomain -Content $json -DocumentType Command
  6. 在 Tools for Windows PowerShell 中运行以下节点,将节点加入到域中。

    Send-SSMCommand -InstanceId instance-id -DocumentName JoinInstanceToDomain

    如果此命令成功,系统将返回类似以下内容的信息。

    WARNING: The changes will take effect after you restart the computer EC2ABCD-EXAMPLE.
    Domain join succeeded, restarting
    Computer is part of example.local, exiting

    如果此命令失败,系统将返回类似以下内容的信息。

    Failed to join domain with error:
    Computer 'EC2ABCD-EXAMPLE' failed to join domain 'example.local'
    from its current workgroup 'WORKGROUP' with following error message:
    The specified domain either does not exist or could not be contacted.