05 – 如何用Ansible证书连接Windows Server

Ansible作为一个高效的自动化工具,能够简化应用程序的配置和管理。相较于传统的用户名和密码认证,证书认证具有多个优势。首先,证书可以提供更高的安全性,防止凭证被暴露或盗用。其次,证书的管理更为灵活,可以通过公钥基础设施(PKI)进行集中管理和更新,从而减少人工错误和安全风险。此外,使用证书能够支持双向认证,确保通信双方的身份,从而进一步增强连接的安全性。

在本文中,我们将逐步介绍如何通过证书连接并管理Windows Server。你将了解整个方案的结构,包括准备工作、证书生成、Windows Server配置、Ansible inventory设置以及连接测试等重要知识点。通过这些步骤,您将能够在实现自动化管理的同时,确保环境的安全性与合规性。

定义证书配置信息

为生成的证书提供了详细的信息,包括主题、扩展密钥用法和备用名称。

distinguished_name = req_distinguished_name
[req_distinguished_name]
[v3_req_client]
extendedKeyUsage = clientAuth
subjectAltName = otherName:1.3.6.1.4.1.311.20.2.3;UTF8:ansiblerunner@localhost

代码解释:
otherName:1.3.6.1.4.1.311.20.2.3;UTF8:ansiblerunner@localhost 这行定义了主题备用名称(Subject Alternative Name, SAN),这是一个扩展,用于提供额外的身份验证信息。在这里,使用了 otherName 类型,OID 为 1.3.6.1.4.1.311.20.2.3,值为 ansiblerunner@localhost。这通常用于指定与主证书主题不同的身份验证信息。

创建证书

通过这个脚本用于生成 Ansible 连接 Windows 的客户端证书和私钥。运行该脚本后,我们将获得两个文件:client_cert.pem 和 client_key.pem,它们分别是客户端证书和私钥。在后续步骤中,我们可以使用这些文件配置 Ansible 以实现安全连接。

openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -out client_cert.pem -outform PEM -keyout client_key.pem -subj "/CN=ansiblerunner" -extensions v3_req_client

代码解释:(内容可以根据实际场景进行调整)

  • • -days 3650: 证书的有效期设置为 3650 天(约 10 年)。
  • • -newkey rsa:2048: 创建一个新的 RSA 密钥,密钥长度为 2048 位。
  • • -out client_cert.pem: 指定生成的证书文件名为 client_cert.pem
  • • -outform PEM: 指定输出格式为 PEM。
  • • -keyout client_key.pem: 指定生成的私钥文件名为 client_key.pem
  • • -subj "/CN=ansiblerunner": 设置证书的主题,CN(Common Name)字段指定为 ansiblerunner

将证书导入到Windows Server中

$pubKeyFilePath = '..ansible_serverclient_cert.pem'
$null = Import-Certificate -FilePath $pubKeyFilePath -CertStoreLocation 'Cert:LocalMachineRoot'
$null = Import-Certificate -FilePath $pubKeyFilePath -CertStoreLocation 'Cert:LocalMachineTrustedPeople'

验证证书是否导入完成

打开 mmc 后点击 文件 点击 添加/删除管理单元 点击 证书,完成添加。检查证书是否导入完成。

位置1:受信任的根证书颁发机构

受信任的根证书颁发机构
受信任的根证书颁发机构

位置2:受信任人

受信任人
受信任人

检查并启用WinRM

这段脚本的目的是确保 WinRM 服务已启动并配置为自动启动,同时确保 PowerShell 远程功能已启用。这对于使用 Ansible 通过 WinRM 连接 Windows 系统至关重要,确保可以安全、远程地管理目标主机。

Set-Service -Name "WinRM" -StartupType Automatic
Start-Service -Name "WinRM"

if (-not (Get-PSSessionConfiguration) -or (-not (Get-ChildItem WSMan:localhostListener))) {
    Enable-PSRemoting -SkipNetworkProfileCheck -Force
}
WinRM服务
WinRM服务

创建服务器自签名证书

创建一个自签名的服务器证书,并将其存储在本地计算机的证书存储中。生成的证书将与主机名关联,这对于在进行安全通信(如 SSL/TLS)时验证主机身份非常重要。

$hostname = hostname

$serverCert = New-SelfSignedCertificate -DnsName $hostname -CertStoreLocation 'Cert:LocalMachineMy'

验证自签名证书是否创建完成

自签名证书
自签名证书

创建ansible使用的账号

此脚本创建并配置 Ansible 用户,使其能够通过 WinRM 安全地连接到 Windows 系统。它生成随机密码、设置用户权限、配置注册表以允许 UAC 下的访问,并将证书映射到用户。通过运行此脚本,用户可以确保 Ansible 与 Windows 系统之间的安全连接和管理。

Add-Type -AssemblyName 'System.Web'

$minChar = 10 
$maxChar = 16
$len = Get-Random -Minimum $minChar -Maximum $maxChar
$symbols = 6
$password = [System.Web.Security.Membership]::GeneratePassword($len, $symbols)

$ansibleRunnerUsername = 'ansiblerunner'
$ansibleRunnerPassword = (ConvertTo-SecureString -String $password -AsPlainText -Force)
if (-not (Get-LocalUser -Name $ansibleRunnerUsername -ErrorAction Ignore)) {
    $newUserParams = @{
        Name                 = $ansibleRunnerUsername
        AccountNeverExpires  = $true
        PasswordNeverExpires = $true
        Password             = $ansibleRunnerPassword
    }
    $null = New-LocalUser @newUserParams
}

Get-LocalUser -Name $ansibleRunnerUsername | Add-LocalGroupMember -Group 'Administrators'

$newItemParams = @{
    Path         = 'HKLM:SOFTWAREMicrosoftWindowsCurrentVersionPoliciesSystem'
    Name         = 'LocalAccountTokenFilterPolicy'
    Value        = 1
    PropertyType = 'DWORD'
    Force        = $true
}
$null = New-ItemProperty @newItemParams

$credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $ansibleRunnerUsername, $ansibleRunnerPassword

$ansibleCert = Get-ChildItem -Path 'Cert:LocalMachineRoot' | Where-Object {$_.Subject -eq 'CN=ansiblerunner'}

$params = @{
    Path = 'WSMan:localhostClientCertificate'
    Subject = "$ansibleRunnerUsername@localhost"
    URI = '*'
    Issuer = $ansibleCert.Thumbprint
  Credential = $credential
    Force = $true
}
New-Item @params

开启WinRM HTTPS监听

此脚本的作用是重新配置 WinRM 的 HTTPS 监听器,确保系统能够使用证书进行安全连接。通过删除现有监听器并创建一个新的监听器,我们可以确保配置是最新的,且能有效使用安全证书进行身份验证。


$hostname = hostname

$serverCert = Get-ChildItem -Path Cert:LocalMachineMy | Where-Object {$_.DnsNameList -contains $hostname} 

$httpsListeners = Get-ChildItem -Path WSMan:localhostListener | where-object { $_.Keys -match 'Transport=HTTPS' }

if ($httpsListeners){
    $selectorset = @{
        Address = "*"
        Transport = "HTTPS"
    }
    Remove-WSManInstance -ResourceURI 'winrm/config/Listener' -SelectorSet $selectorset
}

$newWsmanParams = @{
    ResourceUri = 'winrm/config/Listener'
    SelectorSet = @{ Transport = "HTTPS"; Address = "*" }
    ValueSet    = @{ Hostname = $hostName; CertificateThumbprint = $serverCert.Thumbprint }

}
$null = New-WSManInstance @newWsmanParams

winrm set WinRM/Config/Client/Auth '@{Basic="false";Digest="false";Kerberos="false";Negotiate="true";Certificate="true";CredSSP="false"}'

Set-Item -Path WSMan:localhostServiceAuthCertificate -Value $true

检查WinRM监听器配置

在powershell命令中输入winrm enumerate winrm/config/listener 命令,将列出当前 WinRM 监听器的配置。执行此命令后,系统会显示所有已配置的 WinRM 监听器,包括其地址、传输类型、主机名和证书指纹等信息。确认监听器5986端口是否为开启状态

WinRM监听器配置
WinRM监听器配置

添加防火墙策略,开启5986端口

此脚本确保 WinRM 的 HTTPS 端口 5986 在 Windows 防火墙中开放,允许外部计算机通过 HTTPS 协议进行远程管理。

$ruleDisplayName = 'Windows Remote Management (HTTPS-In)'
if (-not (Get-NetFirewallRule -DisplayName $ruleDisplayName -ErrorAction Ignore)) {
     $newRuleParams = @{
         DisplayName   = $ruleDisplayName
         Direction     = 'Inbound'
         LocalPort     = 5986
         RemoteAddress = 'Any'
         Protocol      = 'TCP'
         Action        = 'Allow'
         Enabled       = 'True'
         Group         = 'Windows Remote Management'
     }
     $null = New-NetFirewallRule @newRuleParams
 }

验证ansible是否可以通过证书连接Windows Server

5986端口检查

nc -vz 192.168.31.35 5986
验证5986端口
验证5986端口

配置 inventory.ini文件

[windows]
WINSRV2022-01 ansible_host=192.168.31.35

[windows:vars]
ansible_user=ansiblerunner
ansible_connection=winrm
ansible_winrm_scheme=https
ansible_port=5986
ansible_winrm_transport=certificate
ansible_winrm_cert_pem=/root/ansible_server/client_cert.pem
ansible_winrm_cert_key_pem=/root/ansible_server/client_key.pem
ansible_winrm_server_cert_validation=ignore

执行ansible测试

输入命令,并检查输出结果。如看到下面图片中的内容,那么我们就完成了今天的操作。

ansible -i in.ini windows -m win_ping
连接成功
连接成功

此文章为原创文章,作者:胖哥叨逼叨,如若转载,请与我联系并注明出处:https://www.pangshare.com/3128.htm

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 2024年10月25日 下午10:18
下一篇 2024年10月30日 下午5:35

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注