5 votes

Transférer l'authentification Kerberos sur Ansible

J'ai une machine de contrôle ansible (host-A) qui doit communiquer avec host-C, une machine Windows qui n'a pas d'utilisateurs locaux (c'est un Active Directory).

L'hôte-A n'a pas d'accès réseau à l'hôte-C, mais la communication est possible en utilisant l'hôte-B.

host-B c'est une machine linux.

L'hôte-A accède à l'hôte-B par ssh.

Suite à cette article J'ai créé un serveur nginx pour acheminer le trafic de WinRM sur hôte-B

server {
    listen 5986 default ssl;
    server_name localhost;

    ssl_certificate  ssl/nginx.crt;
    ssl_certificate_key ssl/nginx.key;

    location /host-c {
        proxy_pass https://host-c-address:5986/wsman;
    }
}

Mon inventaire ansible pour host-C c'est comme :

[windows]
host-c ansible_host=host-b ansible_winrm_path=host-c

Et group_vars pour Windows est :

ansible_user: myuser
ansible_pass: andmypass
ansible_port: 5986
ansible_connection: winrm
ansible_winrm_realm: HOSTCDOMAIN.LOCAL
ansible_winrm_scheme: https
ansible_winrm_transport: kerberos
ansible_winrm_server_cert_validation: ignore

Les choses que j'ai testées jusqu'à présent

1 Test sans Kerberos

J'ai changé cette ligne : ansible_winrm_transport: ssl

Ce n'est pas possible car l'hôte-c ne peut pas avoir d'utilisateurs locaux.

fatal: [host-c]: FAILED! => {"failed": true, "msg": "ssl: 401 Unauthorized."}

2 Créez un NAT pour acheminer le port kerberos 88 vers l'hôte C.

Avec cela, je pourrais authentifier mon utilisateur en utilisant le client Kerberos, mais pas dans ansible.

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 = HOSTCDOMAIN.LOCAL
 dns_lookup_realm = false
 dns_lookup_kdc = false
 ticket_lifetime = 24h
 renew_lifetime = 7d
 forwardable = false

[realms]
 HOSTCDOMAIN.LOCAL = {
  kdc = host-b
 }

[domain_realm]
 .hostcdomain.local = HOSTCDOMAIN.LOCAL

Utilisation du kerberos local

# kinit myuser@HOSTCDOMAIN.LOCAL
Password for myuser@HOSTCDOMAIN.LOCAL:

# klist

Ticket cache: FILE:/tmp/krb5cc_0
Default principal: myuser@HOSTCDOMAIN.LOCAL

Valid starting       Expires              Service principal
03/12/2016 20:23:35  03/13/2016 06:23:35  krbtgt/HOSTCDOMAIN.LOCAL@HOSTCDOMAIN.LOCAL
    renew until 03/19/2016 20:23:31

Test Ansible avec ansible_winrm_transport: kerberos

e# ansible-playbook test_win.yml -vvv
Using /etc/ansible/ansible.cfg as config file
1 plays in test_win.yml

PLAY [Ping windows] ************************************************************

TASK [ping] ********************************************************************
task path: /etc/ansible/test_win.yml:5
<host-b> ESTABLISH WINRM CONNECTION FOR USER: myuser on PORT 5986 TO host-b
fatal: [host-c]: FAILED! => {"failed": true, "msg": "kerberos: (('Unspecified GSS failure.  Minor code may provide more information', 851968), ('Server not found in Kerberos database', -1765328377))"} 

Quelqu'un peut-il m'aider à trouver un moyen de surmonter ce problème ? Je pense qu'il me manque quelque chose.

Il est possible pour l'hôte-a d'utiliser l'hôte-b pour s'authentifier sur l'hôte-c ?

1voto

Joshua K Points 166

Avez-vous essayé d'utiliser délégué_à ? à hôte-B ? Si oui, quel a été le résultat ?

delegate_to : hôte-B

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X