在 Parameter Store 中创建 SecureString 参数并将节点加入域(PowerShell)
本演练演示了如何使用 AWS Systems Manager SecureString
参数和 Run Command 将 Windows Server 节点加入域。演练中使用了典型的域参数,如域名和域用户名。这些值作为未加密的字符串值传递。域密码使用 AWS 托管式密钥加密,并作为加密字符串传递。
先决条件
本演练假定您已在与 Amazon VPC 关联的 DHCP 选项集中指定域名和 DNS 服务器 IP 地址。有关更多信息,请参阅 Amazon VPC 用户指南中的使用 DHCP 选项集。
创建 SecureString
参数并将节点加入到域
-
使用 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
参数的值。不会加密参数名称、描述和其他属性。 -
将以下 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 Guide 和 Amazon CloudWatch Logs User Guide。
-
-
编辑附加到节点的 IAM 角色并添加以下策略。此策略授予节点调用
kms:Decrypt
和ssm: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
" ] } ] } -
复制以下 JSON 文本并粘贴到文本编辑器中,并将文件保存为以下位置中的
JoinInstanceToDomain.json
:c:\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 }" ] } } ] }
-
在 Tools for Windows PowerShell 中运行以下命令来创建新 SSM 文档。
$json = Get-Content C:\temp\JoinInstanceToDomain | Out-String New-SSMDocument -Name JoinInstanceToDomain -Content $json -DocumentType Command
-
在 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.