Ansible Certificate认证

Ansible Certificate认证

Ansible在对Windows主机控制时,不同于Linux主机通过SSH协议进行密码和秘钥认证,在对Windows主机进行控制时最常见的使用Windows用户名和密码通过NTLM进行认证,但是在需求环境中,当平台将Windows主机分配给用户之后,会出现用户自行修改密码的情况。

为了避免这种情况,可以通过Certificate证书认证,在《Ansible官方文档》中提供了以下五种认证方式

202305311017355.png

此文档只描述通过Certificate进行认证。

需要注意的是Certificate并不能通过域用户进行认证,如果通过域用户可使用NTLM或者Kerberos进行认证。

环境要求

Windows主机
-- Powershell >= 3.0
-- .NET >= 4.0
-- 激活WinRM服务

Ansible主机
-- 安装Ansible
-- 安装pywinrm模块

开启WinRM基于证书认证

Set-Item -Path WSMan:\localhost\Service\Auth\Certificate -Value $true

创建本地用户账户

相关的ps1脚本可以使用Windows PowerShell ISE进行编辑运行

使用基于证书认证的WinRM,需要将证书映射到本地用户上,可以直接映射到本地用户上,但是需求环境每个主机本地用户是不经相同,所以最好是创建一个特定的用户用于Ansible管理。

以下脚本可以创建一个名为ansibleuser的本地用户账户,并设置其密码为An@passw0rd,始终处于活跃状态密码不过期。

$UserAccountName = 'ansibleuser'
$UserAccountPassword = (ConvertTo-SecureString -String 'An@passw0rd' -AsPlainText -Force)
if (-not (Get-LocalUser -Name $UserAccountName -ErrorAction Ignore)) {
    $newUserParams = @{
        Name                 = $UserAccountName
        AccountNeverExpires  = $true
        PasswordNeverExpires = $true
        Password             = $UserAccountPassword
    }
    $null = New-LocalUser @newUserParams
}

创建证书

创建证书可以通过以下两种方式进行生成
1、在使用Openssl进行生成
2、在PowerShell使用New-SelfSignedCertificate进行生成

Openssl生成证书

在一台安装了Openssl的Linux主机上创建以下Shell脚本

## This is the public key generated from the Ansible server using:
cat > openssl.conf << EOL
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:ansibletestuser@localhost
EOL
export OPENSSL_CONF=openssl.conf
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -out cert.pem -outform PEM -keyout cert_key.pem -subj "/CN=ansibleuser" -extensions v3_req_client
rm openssl.conf 

然后执行此脚本,在脚本所在目录会生成一对公/密钥(cert_key.pem/cert.pem)

New-SelfSignedCertificate生成证书

$username = "ansibleuser"
$output_path = "C:\temp"

# Instead of generating a file, the cert will be added to the personal
# LocalComputer folder in the certificate store
$cert = New-SelfSignedCertificate -Type Custom `
    -Subject "CN=$username" `
    -TextExtension @("2.5.29.37={text}1.3.6.1.5.5.7.3.2","2.5.29.17={text}upn=$username@localhost") `
    -KeyUsage DigitalSignature,KeyEncipherment `
    -KeyAlgorithm RSA `
    -KeyLength 2048

# Export the public key
$pem_output = @()
$pem_output += "-----BEGIN CERTIFICATE-----"
$pem_output += [System.Convert]::ToBase64String($cert.RawData) -replace ".{64}", "$&`n"
$pem_output += "-----END CERTIFICATE-----"
[System.IO.File]::WriteAllLines("$output_path\cert.pem", $pem_output)

# Export the private key in a PFX file
[System.IO.File]::WriteAllBytes("$output_path\cert.pfx", $cert.Export("Pfx"))

会在C:\temp下生成秘钥对,但是生成的秘钥是pfx格式的,所以需要Anisble在使用的时候需要通过Openssl使用以下命令进行转化为.pem,其中passin/passout为创建证书时使用密码,但是以上脚本中为加密,所以密码为空。

openssl pkcs12 -in cert.pfx -nocerts -nodes -out cert_key.pem -passin pass: -passout pass:

导入证书

生成证书之后[若是使用Openssl生成,将其公钥上传到Windows的C盘],需要使用以下命令将其证书导入到受信任的根证书颁发机构和受信任的人证书存储区

$pubKeyFilePath = 'C:\cert.pem'

$null = Import-Certificate -FilePath $pubKeyFilePath -CertStoreLocation 'Cert:\LocalMachine\Root'
$null = Import-Certificate -FilePath $pubKeyFilePath -CertStoreLocation 'Cert:\LocalMachine\TrustedPeople'

创建服务器证书

使用以下命令将创建自签证书存储到LocalMachine\My

$hostname = hostname
$serverCert = New-SelfSignedCertificate -DnsName $hostName -CertStoreLocation 'Cert:\LocalMachine\My'

证书映射本地用户

将证书映射到本地用户,是为了确保当Ansible通过证书连接到windows主机时,它将以本地用户身份执行所有指令,这样可以使用Ansible连接windows进行执行命令是都是通过ansibleuser用户进行操作

$credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $UserAccountName, $UserAccountPassword

$ansibleCert = Get-ChildItem -Path 'Cert:\LocalMachine\Root' | Where-Object {$_.Subject -eq 'CN=ansibleuser'}

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

设置LocalAccountTokenFilterPolicy

LocalAccountTokenFilterPolicy是用于控制过滤本地管理员组中所有本地用户的远程连接访问令牌的策略。当此参数设置为1时,则策略允许使用明文凭据或密码哈希,从本地管理员组的任何成员获得高完整性访问令牌的远程连接。

$newItemParams = @{
    Path         = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System'
    Name         = 'LocalAccountTokenFilterPolicy'
    Value        = 1
    PropertyType = 'DWORD'
    Force        = $true
}
$null = New-ItemProperty @newItemParams

将本地用户账户加入到管理员组

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

至此全部的配置完成,在Ansible的hosts文件中配置以下内容,测试是否可正常使用

ansible_connection: winrm
ansible_winrm_cert_pem: /path/to/certificate/public/cert.pem
ansible_winrm_cert_key_pem: /path/to/certificate/private/cert_key.pem
ansible_winrm_transport: certificate
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容