首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WinRM HTTPS设置

WinRM HTTPS设置
EN

Stack Overflow用户
提问于 2017-11-24 14:18:47
回答 2查看 10K关注 0票数 1

我有一些可操作的剧本,我想在Windows主机上运行。我遵循了各种关于设置WinRM的Ansible指南,它们工作得很好,但是默认的设置非常不安全,我想要更多的产品。然而,关于如何做到这一点的说明却是极其稀少的。到目前为止,我已经完成了以下工作:

在我的视窗盒上:

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

到目前为止,Windows端似乎运行良好。然而,让Ansible连接却是一场噩梦。尽管添加了HTTPS证书,但我还是想不出如何让Ansible信任目标上的HTTPS证书。在我的Centos 7‘推框’上,我做了以下工作:

  1. 使用pywinrm、requests_kerberos和requests_credssp模块安装Ansible和pip
  2. 将我的CA证书添加到/etc/pki/tls/certs和/etc/pki/ca-cert中。
  3. 将我的清单设置为:

ansible_user=ADMINISTRATOR@DOMAIN.COM ansible_password=Password1 ansible_port=5986 ansible_connection=winrm ansible_winrm_scheme=https /#ansible_winrm_server_cert_validation=ignore ansible_winrm_transport=credssp

当证书验证打开时,连接失败,出现以下错误:

代码语言:javascript
复制
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}

在关闭证书验证之后,它可以正常工作。

那么,我的问题是:如何让Ansible信任我的CA证书?

EN

回答 2

Stack Overflow用户

发布于 2020-12-16 05:47:48

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

  1. Ansible:不想对OpenSSL或Windows的详细信息负责
  2. OpenSSL:不想被用作认证权威
  3. 微软:不想让你只使用Windows工具

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

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

代码语言:javascript
复制
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证书一样。

代码语言:javascript
复制
openssl req -new -out server.req -keyout server.key -days 730 -nodes ...

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

代码语言:javascript
复制
subjectAltName=DNS:hostname.mycompany.com,DNS:hostname
extendedKeyUsage=serverAuth

第一行“subjectAltName”是必需的,否则Python/OpenSSL客户端将拒绝密钥。您需要用适当的值替换目标主机名。第二行是Windows所必需的,否则Windows将不像HTTPS服务器那样使用这一行。

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

代码语言:javascript
复制
openssl x509 -req -in server.req -out server.pem -days 730 -CA caroot.pem -CAkey caroot.key -extfile attributes.txt

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

代码语言:javascript
复制
openssl pkcs12 -export -password pass: -inkey server.key -in server.pem -out windows.pfx

这将生成一个文件'windows.pfx‘,这是我们以后需要的。

无聊了吗?

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

代码语言:javascript
复制
openssl req -new -out winlogin.req -keyout winlogin.key -days 730

这个私钥将是登录密钥,类似于SSH私钥。接下来,我们必须在req上签字。与服务器键一样,我们需要添加一些扩展属性,否则它将无法工作。我们的“attributes.txt”文件必须包含以下行:

代码语言:javascript
复制
subjectAltName=otherName:1.3.6.1.4.1.311.20.2.3;UTF8:ansible@localhost
extendedKeyUsage=clientAuth

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

代码语言:javascript
复制
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用户提供了一个硬编码密码,但这是不相关的,可以自由更改。如果这实际上运行成功,并且您经受住了冲击,文件工件( PFX和PEM文件)可以从Windows服务器中删除。

还请注意,此脚本在末尾添加了防火墙规则。当然,这必须针对您的环境进行适当的修改。

代码语言:javascript
复制
# 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系统:

代码语言:javascript
复制
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服务器。我希望我完成了所有的步骤,这是我在不久前设置的。

票数 5
EN

Stack Overflow用户

发布于 2020-01-21 15:35:27

这对我有用..。

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

ansible_winrm_ca_trust_path: /etc/ssl/certs #TLS 1.2

ansible_winrm_transport: ntlm

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47475154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档