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
}
创建服务器自签名证书
创建一个自签名的服务器证书,并将其存储在本地计算机的证书存储中。生成的证书将与主机名关联,这对于在进行安全通信(如 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
端口是否为开启状态
添加防火墙策略,开启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
配置 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