On peut utiliser l'annuaire de Windows (Active Directory) pour authentifier les utilisateurs de l'interface web de Nagios — qui en sont aussi les contacts — depuis l'hôte Linux hébergeant Nagios. Pour cela deux méthodes sont possibles : LDAP et Kerberos.
A noter que les méthodes d'authentification que je décris ci-après sont valables pour n'importe quelle application web sous Apache. D'autre part, les mots de passe transitent en clair sur le réseau. Tant qu'on reste sur le LAN...
Mon environnement pour cette configuration est une Fedora Core 5, Apache 2.2.2 et Nagios 2.7, Active Directory sous Windows 2000.
Supposons que :
- ton domaine Active Directory s'appelle ton_domaine.com,
- un contrôleur de ce domaine s'appelle ton_dc.ton_domaine.com, et l'autre ton_autre_dc.ton_domaine.com (tu en as bien au moins deux, non ?),
- l'hôte hébergeant Nagios s'appelle ton_hote_nagios.ton_domaine.com.
LDAP
D'après mes tests, cette méthode est trop lente sur un Active Directory bien rempli. Toutefois, la configuration est la suivante.
Créer un utilisateur dans Active Directory, qui sera dédié à l'accès LDAP depuis Apache. Appelons-le ton_user, et plaçons-le dans l'OU ton_OU.
Dans la configuration générale d'Apache (httpd.conf), ajouter :
LoadModule authz_ldap_module modules/mod_authz_ldap.so
Dans le répertoire à protéger (pour Nagios, /usr/local/nagios/sbin où sont stockés les scripts CGI), créer un fichier .htaccess contenant :
AuthType Basic
# What the users will see as a "title" of the login prompt:
AuthName "Domain Credentials Required"
# use plain LDAP authentication:
AuthzLDAPMethod ldap
# FQDN resolvable hostname (or IP) of the Windows
# AD domain controller:
AuthzLDAPServer ton_DC.ton_domaine.com
# Distinguished Name (DN) of the user that mod_authz_ldap should
# bind to the LDAP server as when searching for the domain user
# provided by the web client (Active Directory does not allow
# anonymous binds). Note, the cn attribute corresponds to the
# "Display Name" field of a user's account in the Active Directory
# Users and Computers tool, not their login username:
AuthzLDAPBindDN "cn=ton_user,OU=ton_OU,dc=ton_domaine,dc=com"
# the BindDN user's password:
AuthzLDAPBindPassword "SECRET"
# LDAP Attribute where the user's domain login username is stored in:
AuthzLDAPUserKey sAMAccountName
# Base DN to begin searching for users from in the LDAP:
AuthzLDAPUserBase "dc=ton_domaine,dc=com"
# Search in sub-containers below the UserBase DN if
# necessary (most likely):
AuthzLDAPUserScope subtree
# Require the username and password provided to be a valid
# user in the AD:
require valid-user
En rouge, les champs à remplacer pour ta configuration.
Note : un seul DC est référencé ici, c'est un peu léger pour la sûreté de fonctionnement.
Kerberos
La référence ayant servi de base à cet article est dans le support Microsoft, à l'article "Providing Active Directory authentication via Kerberos protocol in Apache".
Dans la configuration générale d'Apache (httpd.conf), ajouter :
LoadModule auth_kerb_module modules/mod_auth_kerb.so
Dans la répertoire de la configuration d'Apache (généralement /etc/httpd/conf), créer un fichier "keytab" (cette étape est-elle indispensable ? J'ai l'impression que le keytab ne sert à rien si l'option KrbVerifyKDC est à off) :
HTTP/ton_hote_nagios.ton_domaine.com@TON_DOMAINE.COM
Dans le fichier de configuration de Kerberos /etc/krb5.conf :
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log
[libdefaults]
ticket_lifetime = 24000
default_realm = TON_DOMAINE.COM
dns_lookup_realm = false
dns_lookup_kdc = false
[realms]
TON_DOMAINE.COM = {
kdc = ton_dc.ton_domaine.com:88
kdc = ton_autre_dc.ton_domaine.com:88
}
[domain_realm]
.ton_domaine.com = TON_DOMAINE.COM
ton_domaine.com = TON_DOMAINE.COM
[appdefaults]
pam = {
debug = false
ticket_lifetime = 36000
renew_lifetime = 36000
forwardable = true
krb4_convert = false
}
En rouge, les valeurs à remplacer par celles de ton environnement.
Tu peux vérifier le bon fonctionnement de l'authentification Kerberos en passant quelques commandes :
> kinit toi@TON_DOMAINE.COM
Kerberos doit te demander ton mot de passe. Vérifie ensuite que le ticket Kerberos t'a bien été alloué :
> klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: toi@TON_DOMAINE.COM
Valid starting Expires Service principal
01/31/07 15:46:41 01/31/07 22:26:41 krbtgt/TON_DOMAINE.COM@TON_DOMAINE.COM
Kerberos 4 ticket cache: /tmp/tkt0
klist: You have no tickets cached
Enfin, fais le ménage en détruisant le ticket qui vient de t'être alloué :
> kdestroy
Dans le répertoire à protéger (pour Nagios, /usr/local/nagios/sbin où sont stockés les scripts CGI), créer un fichier .htaccess :
AuthName "Kerberos"
AuthType Kerberos
Krb5Keytab /etc/httpd/conf/keytab
KrbAuthRealm TON_DOMAINE.COM
KrbMethodNegotiate off
KrbSaveCredentials off
KrbVerifyKDC off
Require valid-user
Particularité de Kerberos : Apache va récupérer le nom de l'utilisateur sous la forme user@REALM (toi@TON_DOMAINE.COM, le nom de domaine étant en majuscules). Cela implique de définir les noms des contacts sous cette forme dans la configuration de Nagios.
Pour que tout cela soit pris en compte, relance Apache et Nagios.
Authentification transparente
Jean-Baptiste Marin propose une méthode d'authentification Kerberos transparente (sans resaisie du login / mot de passe). Voir le forum pour les détails.