当前位置: 首页 > 知识库问答 >
问题:

Ansible for Windows:WinRM HTTPS安装程序

葛骏
2023-03-14

我有一些Ansible剧本,我想和一些Windows主机对抗。我遵循了各种Ansible指南来设置WinRM,它们工作得很好,但默认设置非常不安全,我想要更适合生产的东西。然而,关于如何做到这一点的说明却少得令人难以置信。到目前为止,我已经做了以下工作:

在我的Windows盒子上:

  1. 使用提供的配置RemotingForAnsible.ps1脚本启用WinRM
  2. 将目标机器配置为在HTTPS/5986上使用有效证书,而不是上述脚本生成的自签名证书
  3. 在WinRM中的目标机器上启用了Kerberos和CredSSP身份验证方法。我的一些角色步骤需要CredSSP可靠地工作。

到目前为止一切都很好,窗户的一面似乎很好。然而,事实证明,Ansible连接是一场噩梦。尽管添加了HTTPS证书,但我不知道如何让Ansible信任目标上的HTTPS证书。在我的Centos 7“push box”上,我做了以下工作:

  1. 使用pywinrm、requests_kerberos和requests_credssp模块安装Anable和pip
  2. 将我的CA证书添加到 /etc/pki/tls/certs和 /etc/pki/ca-cert
  3. 将我的库存设置为以下:

ansible_用户=ADMINISTRATOR@DOMAIN.COM

ansible_password=密码1

ansible_port=5986

ansible_连接=winrm

ansible\u winrm\u方案=https

/#ansible\u winrm\u server\u cert\u validation=忽略

ansible\u winrm\u传输=credssp

打开认证验证后,连接失败,出现以下错误:

fatal: [host.domain.com]: 
UNREACHABLE! => {
"changed": false, 
"msg": "credssp: HTTPSConnectionPool(host='host.domain.com', port=5986): Max retries exceeded with url: /wsman (Caused by SSLError(SSLError(\"bad handshake: Error([('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')],)\",),))", 
"unreachable": true}

在cert验证关闭的情况下,它可以正常工作。

所以我的问题是:如何让安塞布尔信任我的CA证书?

共有3个答案

阎晗日
2023-03-14

这对我有用...

https://dodgydudes.se/validate-ca-certificate-in-ansible-connecting-with-winrm/

ansible_winrm_ca_trust_path: /etc/ssl/certs#TLS 1.2

ansible\u winrm\u传输:ntlm

白越
2023-03-14

在ansible control主机上运行此操作:

python -c "import ssl; print(ssl.get_default_verify_paths())"

这样,您将看到python希望在哪里找到证书

确保CA信任证书是pem编码的

华宪
2023-03-14

这并不简单。问题是有三个不同的群体不想玩:

  1. Anable:不想对OpenSSL或Windows详细信息负责
  2. OpenSSL:不想被用作认证机构
  3. 微软:不希望您使用Windows工具以外的任何东西

首先,您需要3组OpenSSL证书/密钥:自签名证书授权中心(CA)、服务器winRM HTTPS和目标用户。

CA证书/密钥没有什么神奇之处;它可以通过以下方式生成:

openssl req -new -out caroot.req -keyout caroot.key -days 730 ...
openssl x509 -req -in caroot.req -extensions v3_ca -signkey caroot.key -out cacert.pem -days 730

这些OpenSSL命令还有很多其他选项,它们可能(或不)在您的特定环境中工作。这是“不想对OpenSSL负责”的例子之一。

其次,您需要WinRM HTTPS证书/密钥。首先,您必须生成服务器证书。生成证书的关键细节是证书上的“公共名称”属性必须与目标主机名匹配,就像任何HTTPS证书一样。

openssl req -new -out server.req -keyout server.key -days 730 -nodes ...

现在,棘手的部分来了。您不能只是按原样签名密钥;签名过程必须向证书添加几个附加属性,否则它将无法工作。创建一个文本文件,我称之为“attributes.txt”,如下两行:

subjectAltName=DNS:hostname.mycompany.com,DNS:hostname
extendedKeyUsage=serverAuth

第一行“subjectAltName”是必需的,否则Python/OpenSSL客户端将拒绝该密钥。您需要将正确的值替换为目标主机名。Windows需要第二行,否则Windows不会将其用于HTTPS服务器。

现在用前面生成的CA对密钥进行签名:

openssl x509 -req -in server.req -out server.pem -days 730 -CA caroot.pem -CAkey caroot.key -extfile attributes.txt

另一个小问题是:除非将密钥和证书组合到PKCS#12文件中,否则Windows不会导入服务器密钥。这可以通过以下命令完成,该命令创建一个没有密码的PKCS#12文件:

openssl pkcs12 -export -password pass: -inkey server.key -in server.pem -out windows.pfx

这将生成一个文件“窗口”。我们稍后需要pfx。

无聊了吗?

接下来,我们需要另一个密钥/证书来进行用户登录。这是假设我们将在系统上使用本地用户,而不是域用户。(这需要您自己。)生成密钥与服务器密钥几乎相同,只是“共同名称”属性(CN)必须与目标用户名匹配。(在以后的使用中,我将称我们的用户为“anable”)。

openssl req -new -out winlogin.req -keyout winlogin.key -days 730

这个私钥将是登录密钥,类似于SSH私钥。接下来,我们必须签署请求。与服务器密钥一样,我们需要添加一些扩展属性,否则它将不起作用。我们的“attributes.txt”文件必须包含以下行:

subjectAltName=otherName:1.3.6.1.4.1.311.20.2.3;UTF8:ansible@localhost
extendedKeyUsage=clientAuth

“altNames”中的古怪标识符是一些专有的Microsoft东西,它必须包含“username@localhost”。正如我之前提到的,我使用的是本地用户“anable”。扩展的KeyUsage属性是必需的,否则Windows将不允许将密钥用于用户身份验证。最后,我们签署证书:

openssl x509 -req -in winlogin.req -out winlogin.pem -days 730 -CA caroot.pem -CAkey caroot.key -extfile attributes.txt

正如你们所知,我开始在这里感到不安了。我们就快到了。最后,将CA证书(caroot.pem)、服务器PKCS#12证书/密钥(windows.pfx)和用户证书(winlogin.pem)复制到目标windows系统的某处。从同一目录运行以下PowerShell脚本。它将创建本地ansible用户,并将所有SSL工件导入其适当的目标位置。抱歉,如果这不是商业质量代码。这也为ansible用户提供了一个硬编码密码,但这与此无关,可以自由更改。如果这确实成功运行,并且您经受住了冲击,那么可以从Windows服务器中删除文件工件(PFX和PEM文件)。

还要注意,该脚本在末尾添加了防火墙规则。当然,这需要根据您的环境进行适当修改。

# master script to enable winRM via HTTPS and allow certificate-based 
# authentication

# add the local 'ansible' user
$username = "ansible"
$password = ConvertTo-SecureString -string "Ans!b123" -AsPlainText -Force
New-LocalUser -Name $username -AccountNeverExpires -Description "Ansible Remote Management" -Password $password
Add-LocalGroupMember -Member "ansible" -Group "Administrators"
$credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $username, $password

# import the Ansible root CA; certlm should show this in the 
# 'Trusted Root Certification Authorities' folder
$caroot = Import-Certificate -FilePath ".\caroot.pem" -CertStoreLocation "Cert:\LocalMachine\Root"

# import the user cert; certlm should show this in the 'Trusted People' folder
$userkey = Import-Certificate -FilePath ".\winlogin.pem" -CertStoreLocation "Cert:\LocalMachine\TrustedPeople"
New-Item -Path WSMan:\localhost\ClientCertificate -subject "ansible@localhost" -URI "*" -Issuer $caroot.Thumbprint -Credential $credential -Force

# import the server certs - should appear in 'Personal' folder. The PFX file
# must contain both the cert and private key
$srvcert = Get-ChildItem -Path ".\windows.pfx" | Import-PFXCertificate -CertStoreLocation "Cert:\LocalMachine\MY" -Exportable

# Now create the winRM instance
$selector_set = @{Address= "*" Transport = "HTTPS" }

$value_set =  @{CertificateThumbprint = $srvcert.Thumbprint}

New-WSManInstance -ResourceURI "winrm/config/Listener" -SelectorSet $selector_set -ValueSet $value_set
Set-Item -Path WSMan:\localhost\Service\Auth\Certificate -value $true

# add a firewall rule
New-NetFirewallRule -DisplayName "Ansible WinRM" -Direction Inbound -Protocol "TCP" -LocalPort "5986" -Action Allow -RemoteAddress @("192.16.2.3")

好的,现在Windows已经完成,我们应该为Ansible做好准备。在清单中,您需要以下变量才能应用于Windows系统:

ansible_port: 5986
ansible_connection: winrm
ansible_winrm_ca_trust_path: /path/to/caroot.pem
ansible_winrm_transport: certficate
ansible_winrm_cert_pem: /path/to/winlogin.pem
ansible_winrm_cert_key_pem: /path/to/winlogin.key

此时,Ansible应该使用HTTPS和证书身份验证连接到Windows服务器。我希望我完成了所有步骤,这是我不久前设置的。

 类似资料:
  • 含安装程序的源码但不包含lerx v2的源码。 安装说明:     1.本安装程序是用Java自行开发的,已自带java环境。自动侦测msvcr71.dll。     2.测试环境:全新安装的Windows 2003 Server、XP、Windows 7(未安装任何软件)。     3.安装程序将安装及自动配置 Java环境、MySQL Server 5.0、Tomcat及Lerx V2。   

  • 一、安装 请按照您的操作系统的步骤进行操作。 1、苹果系统 在macOS上安装mitmproxy的推荐方法是使用Homebrew: brew install mitmproxy 或者,您可以在mitmproxy.org上下载独立的二进制文件。 2、Linux 在Linux上安装mitmproxy推荐的方法是下载的独立二进制代码mitmproxy.org。 一些Linux发行版通过其本机软件包存储库

  • 本文向大家介绍Python安装图文教程 Pycharm安装教程,包括了Python安装图文教程 Pycharm安装教程的使用技巧和注意事项,需要的朋友参考一下 本教程为大家分享了Pycharm及Python安装的详细步骤,供大家参考,具体内容如下 第一步:安装python 1 首先进入网站下载:点击打开链接,进入之后如下图,选择图中红色圈中区域进行下载 2 双击exe文件进行安装,如下图,并按照圈

  • 我下载了Visual Studio Ultimate CTP 6的完整ISO。安装程序达到了90%左右,通过进度条进行测量,然后就卡在那里了。Superfetch、反恶意软件保护和其他后台进程的活动频繁,但进度条仍然死气沉沉。最终,后台任务活动在20分钟后消退,但进度条仍不动。 便宜的技巧:打开一个记事本窗口,并将其左边缘定位,使其完美地标记进度条的当前位置。如果进度条在大约一个小时内没有移动过记

  • 问题内容: 我正在尝试在Ubuntu PC上使用composer安装laravel安装程序,但是在安装过程中出现此错误。您的要求无法解决为一组可安装的软件包。 出现错误,然后我使用此注释: 问题答案: 它说它需要 zip扩展名 laravel / installer v1.4.0需要ext-zip ........ 安装与已安装的php版本相对应的版本:

  • 我有Inno安装程序(在我之前写的),它提取了一组VSTO文件并开始安装VSTO MS Office插件。它有一个问题,当将VSTO文件提取到临时文件夹并启动时,它会立即显示完成按钮。如果用户单击它,临时文件将被删除,并在中开始实际安装VSTO插件,然后导致“文件未找到”错误。我应该解决这个问题(理想情况下,只有当它生成的完成执行时,Inno安装程序中的完成按钮才会出现)。 VSTO包本身(“应用

  • 现在如果我用这个命令 它将创建一个具有最新版本(如5.2)的laravel项目,但是如果我想安装一个特定的版本(如5.1版),该怎么办? 更新::我正在寻找laravel安装程序命令,是否有任何选项/参数用于特定版本的安装?

  • 在命令提示符下通过pip installer for Python3.7安装pandas时,我反复遇到以下错误 我已经通过管理员运行了该命令,但它没有运行。