在CentOS6上使用Ansible对Windows进行Kerberos认证时,出现了”plaintext: 401 Unauthorized. basic auth failed”错误

首先

由于在CentOS6上的Ansible上尝试使用Active Directory用户连接到Windows2012Server时遇到”plaintext: 401 Unauthorized. basic auth failed”错误,我遇到了困难。因此,我决定在此文章中备忘录中包含该问题。

关于本文,可能会在某处重写,因为它变得冗长且有些混乱。

事件

在CentOS6上按照Windows Support的官方网站所述进行Kerberos相关的配置,并执行与Windows2012Server连接的playbook时,出现了”plaintext: 401 Unauthorized. basic auth failed”的错误提示。连接时使用的是密码认证而不是Kerberos认证,导致连接失败(401错误)。

# WinRM 及び Kerberos関連のモジュール等をインストール

pip install "pywinrm>=0.1.1"

# Installing python-kerberos dependencies
yum -y install python-devel krb5-devel krb5-libs krb5-workstation

# Installing python-kerberos
pip install kerberos

# Configuring Kerberos
# /etc/krb5.conf を自環境の値に変更
[realms]

 MY.DOMAIN.COM = {
  kdc = domain-controller1.my.domain.com
  kdc = domain-controller2.my.domain.com
 }
[domain_realm]
    .my.domain.com = MY.DOMAIN.COM


# Testing a kerberos connection
kinit -C user@MY.DOMAIN.COM
klist

# Inbentoryhost
[windows]
winserver1.example.com
winserver2.example.com

[windows:vars]
ansible_user=Administrator@
ansible_password=SecretPasswordGoesHere
ansible_port=5985
ansible_connection=winrm
ansible_winrm_server_cert_validation=ignore

造成这种情况的原因

    • CentOS6では、Kerberos認証モジュールが動作していませんでした。

具体的にはCentOS6のPython Ver.2.6ではpipでインストールしたKerberosのモジュールがうまく動作していない(import等に失敗)ことが分かりました。

应对措施

可以通过以下的方法将Python的版本升级到2.7.x,并执行pip install kerberos命令。

    1. 将Ansible主机从CentOS6(Python版本2.6)更改为CentOS7(Python版本2.7.5)。

在CentOS7上按照官方网站的Windows支持指南进行了设置,Kerberos身份验证顺利进行。

在CentOS6上使用pyenv将Python版本更改为2.7.8以上(注意1)。

在CentOS6上单独安装了2.7系列的Python,但由于与pip等的依赖关系,无法正确运行包括Ansible在内的内容,所以使用了pyenv。
注意1:最初安装了与CentOS7相同版本的2.7.5,但发现Ansible所需的paramiko(Python模块)无法在pyenv的此版本中安装,因此安装了2.7.8。

我在这里写了关于安装和配置pyenv的Ansible playbook的Qiita文章,供参考。

给我增加一点

以下是/etc/krb5.conf和库存文件的设置示例

将klist结果中的“Default principal:”与两个文件合并是关键。
特别是对.LOCAL等进行大小写区分。

以下是关于kinit、/etc/krb5.conf和清单文件设置的示例。

[root@AnsibleSV krbs_test]# kinit foo@MYDOMAIN.local
Password for foo@MYDOMAIN.local:
kinit: KDC reply did not match expectations while getting initial credentials
[root@AnsibleSV krbs_test]# kinit -C foo@MYDOMAIN.local
Password for foo@MYDOMAIN.local:
[root@AnsibleSV krbs_test]# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: foo@MYDOMAIN.LOCAL

Valid starting     Expires            Service principal
06/01/16 17:30:17  06/02/16 03:30:18  krbtgt/MYDOMAIN.LOCAL@MYDOMAIN.LOCAL
        renew until 06/08/16 17:30:17
[root@AnsibleSV krbs_test]# cat /etc/krb5.conf
[logging]
 default = FILE:/var/log/krb5libs.log
 kdc = FILE:/var/log/krb5kdc.log
 admin_server = FILE:/var/log/kadmind.log

[libdefaults]
 default_realm = MYDOMAIN.LOCAL
 dns_lookup_realm = false
 dns_lookup_kdc = false
 ticket_lifetime = 24h
 renew_lifetime = 7d
 forwardable = true

[realms]
 MYDOMAIN.LOCAL = {
  kdc = 192.168.200.1
  admin_server = 192.168.200.1
 }

[domain_realm]
 .mydomain.local = MYDOMAIN.LOCAL
 mydomain.local = MYDOMAIN.LOCAL
[root@AnsibleSV krbs_test]# cat krbs_host
[win]
win01.MYDOMAIN.LOCAL
win02.MYDOMAIN.LOCAL

[win:vars]
ansible_user=foo@MYDOMAIN.LOCAL
ansible_password=SecretPassword
ansible_port=5985
ansible_connection=winrm
ansible_winrm_transport=kerberos
ansible_winrm_server_cert_validation=ignore

故障排除步骤

    python kerberosモジュールが動作するか試す一例としては、Ansible Serverへコマンドライン上で以下コマンドの結果としてなにもエラーがでなければ、おそらくインストールはうまくいっているので、krb5.confやインベントリファイルの設定の問題の可能性が高いです。

以下是错误的示例。

# python
Python 2.6.6 (r266:84292, Jul 23 2015, 15:22:56)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-11)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import kerberos
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: /usr/lib64/python2.6/site-packages/kerberos.so: undefined symbol: PyCapsule_CheckExact
>>>
# Ctrl + d でpythonを終了

补充说明,以下是在上述错误状态下执行pip list或pip freeze的结果。

# pip list | grep kerberos
DEPRECATION: Python 2.6 is no longer supported by the Python core team, please upgrade your Python. A future version of pip will drop support for Python 2.6
kerberos (1.2.4)
# pip freeze | grep kerberos
DEPRECATION: Python 2.6 is no longer supported by the Python core team, please upgrade your Python. A future version of pip will drop support for Python 2.6
kerberos==1.2.4

kinit -C user@MY.DOMAIN.COM やklistでAnsibleServerとWindows間でKerberos認証ができるか確認します。Ansible/pythonとの切り分け。

なお、チケットには有効期限(krb5.confのticket_lifetimeで設定 また、klist結果のExpiresで確認可能)があるので注意。有効期限が切れた場合は、再度チケットを発行。

デフォルトでは、接続ユーザー名に@が入っている場合、kerberos認証を試し、エラーの場合、パスワード認証を行うようです。エラー内容がパスワード認証のままの場合は、インベントリファイルにansible_winrm_transport=kerberosを追加して、明示的にkerberos認証のみで接続を試みるとエラーメッセージがkerberos認証のもに変わるのでメッセージに沿った対応(python kerberosモジュールのインストール問題かkrb5.confやインベントリファイルの設定の問題かどうかがわかります)をします。

请参考

环境

サーバ種別種類ver.Ansible Server1OSCentOS 6.7
Ansibleansible 2.0.2.0 yum install
PythonPython 2.6.6 → pyenv 2.7.8

pip 8.1.2 (python 2.6) → pip 8.1.2 (python 2.7.8)Ansible Server2OSCentOS 7
Ansibleepel yum install
Python2.7.5

pip 8.1.2 (python 2.7.5)Ansible ClientOSWindows2012
OSWindows2012R2

当运行结果发生错误时

测试用游戏手册

[root@AnsibleSV krbs_test]# cat krbs_test.yml
---
- hosts: win
  gather_facts: no
  vars:
    CMD:
      - cmd: CMD /c "dir"
  tasks:
    - name: "CMD TEST"
      raw:  "{{ item.cmd }}"
      register: CMD_RESULT
      with_items: '{{ CMD }}'

    - name: "debug: output CMD results"
      debug: var=CMD_RESULT.results

“明文:401 未经授权。基本身份验证失败”错误

ansible_winrm_transport = kerberos not specified, Python Ver.2.6

[root@AnsibleSV krbs_test]# ansible-playbook -i krbs_host krbs_test.yml

PLAY [win] *********************************************************************

TASK [CMD TEST] ****************************************************************
fatal: [win01.MYDOMAIN.LOCAL]: FAILED! => {"failed": true, "msg": "plaintext: 401 Unauthorized. basic auth failed"}
fatal: [win02.MYDOMAIN.LOCAL]: FAILED! => {"failed": true, "msg": "plaintext: 401 Unauthorized. basic auth failed"}

NO MORE HOSTS LEFT *************************************************************
        to retry, use: --limit @krbs_test.retry

PLAY RECAP *********************************************************************
win01.MYDOMAIN.LOCAL        : ok=0    changed=0    unreachable=0    failed=1
win02.MYDOMAIN.LOCAL        : ok=0    changed=0    unreachable=0    failed=1

[root@AnsibleSV krbs_test]#

“Kerberos:Python 的 Kerberos 库未安装”错误。

在存货文件中添加ansible_winrm_transport=kerberos,
明确输出kerberos认证错误消息。

[root@AnsibleSV krbs_test]# ansible-playbook -i krbs_host krbs_test.yml

PLAY [win] *********************************************************************

TASK [CMD TEST] ****************************************************************
fatal: [win02.MYDOMAIN.LOCAL]: FAILED! => {"failed": true, "msg": "kerberos: the python kerberos library is not installed"}
fatal: [win01.MYDOMAIN.LOCAL]: FAILED! => {"failed": true, "msg": "kerberos: the python kerberos library is not installed"}

NO MORE HOSTS LEFT *************************************************************
        to retry, use: --limit @krbs_test.retry

PLAY RECAP *********************************************************************
win01.MYDOMAIN.LOCAL        : ok=0    changed=0    unreachable=0    failed=1
win02.MYDOMAIN.LOCAL        : ok=0    changed=0    unreachable=0    failed=1

[root@AnsibleSV krbs_test]# 
广告
将在 10 秒后关闭
bannerAds