Apache SSO over AD

Pré-requis

  • Une installation fraiche d'Ubuntu 14.04
  • Une entrée directe et inverse dans votre DNS d'un Virtual Host (ex: test.domain.tld)
  • Un environnement Active Directory fonctionnel
    • Un utilisateur avec le nom équivalent au Virtual Host que l'on souhaite déployer (ex: utilisateur test pour le vhost test.domain.tld)
    • Un poste et un utilisateur membres du domaine

Préparation

Active Directory

  • Depuis un DC, créer un utilisateur un utilisateur avec le nom équivalent au Virtual Host que l'on souhaite déployer (ex: utilisateur test pour le VHost test.domain.tld)
  • Lancer une console MSDOS :
ktpass -princ HTTP/test.domain.tld@DOMAIN.TLD -mapuser test@DOMAIN.TLD -crypto RC4-HMAC-NT -ptype KRB5_NT_PRINCIPAL -pass MotDePasse -out c:test.keytab
  • Une fois créé, transférer le fichier sur le serveur Web, ex : /home/user.

Serveur Web

  • Avant de se lancer dans les installations, s'assurer que le serveur Web est bien paramétrée et référencée dans le DNS :
root@test:/home/user# hostname
test.domain.tld
  • Tester la recherche directe :
nslookup test
Server:         192.168.0.1
Address:        192.168.0.2#53

Name:   test.domain.tld
Address: 192.168.0.10
  • La recherche inversée
nslookup 192.168.0.10
Server:         192.168.0.1
Address:        192.168.0.2#53

10.0.168.192.in-addr.arpa      name = test.domain.tld.
  • Vérifier la résolution DNS :
cat /etc/resolv.conf
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 192.168.0.1
nameserver 192.168.0.2
search domain.tld

Installation

Winbind, Samba, Kerberos

  • On lance l'installation des paquets :
apt-get install libnss-winbind libpam-winbind ntp krb5-user samba smbclient winbind -y

Fichiers de configuration

nsswitch.conf

mv /etc/nsswitch.conf{,.ori}

cat >> /etc/nsswitch.conf << EOF
passwd:         compat winbind file
group:          compat winbind file
shadow:         compat winbind file

hosts:          files dns
networks:       files

protocols:      db files
services:       db files
ethers:         db files
rpc:            db files

netgroup:       nis
EOF

krb5.conf

mv /etc/krb5.conf{,.ori}

cat >> /etc/krb5.conf << EOF
[libdefaults]
ticket_lifetime = 24h
default_realm = DOMAIN.TLD
forwardable = true

[realms]
DOMAIN.TLD = {
kdc = 192.168.0.100
kdc = 192.168.0.110
default_domain = DOMAIN.TLD
}

[domain_realm]
.domain.tld = DOMAIN.TLD
domain.tld = DOMAIN.TLD

[kdc]
profile = /etc/krb5kdc/kdc.conf

[appdefaults]
pam = {
debug = false
ticket_lifetime = 36000
renew_lifetime = 36000
forwardable = true
krb4_convert = false
}

[logging]
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmin.log
default = FILE:/var/log/krb5lib.log
EOF

smb.conf

mv /etc/samba/smb.conf{,.ori}

cat >> /etc/samba/smb.conf << EOF
[global]
workgroup = DOMAIN
server string = Samba Server Version %v
security = ads
realm = DOMAIN.TLD
domain master = no
local master = no
preferred master = no
socket options = TCP_NODELAY IPTOS_LOWDELAY SO_RCVBUF=131072 SO_SNDBUF=131072
use sendfile = true
# read raw = yes # Should provide a performance increase but currently untested, YMMV
# write raw = yes # Should provide a performance increase but currently untested, YMMV

idmap config * : backend = tdb
idmap config * : range = 100000-299999
idmap config DOMAIN : backend = rid
idmap config DOMAIN : range = 10000-99999
winbind separator = +
winbind enum users = yes
winbind enum groups = yes
winbind use default domain = yes
winbind nested groups = yes
winbind refresh tickets = yes
template homedir = /home/%D/%U
template shell = /bin/bash

client use spnego = yes
client ntlmv2 auth = yes
encrypt passwords = yes
restrict anonymous = 2
log file = /var/log/samba/log.%m
max log size = 50
EOF

Mise au domaine

Tests préalables

  • Avant d'inscrire le serveur Web dans le domaine, s'assurer que la configuration Kerberos est fonctionnelle :
kinit ad_user@DOMAIN.TLD
Password for ad_user@DOMAIN.TLD:
  • On valide l'obtention du ticket :
root@test:/home/user# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: ad_user@DOMAIN.TLD

Valid starting       Expires              Service principal
02/10/2015 10:46:18  02/10/2015 20:46:18  krbtgt/DOMAIN.TLD@DOMAIN.TLD
        renew until 03/10/2015 10:46:15
  • Si la commande klist renvoie un ticket, on peut alors intégrer la machine au domaine :
net ads join -U Administrateur
Enter Administrateur's password:
Using short domain name -- DOMAIN
Joined 'TEST' to dns domain 'domain.tld'
DNS Update for test.domain.tld failed: ERROR_DNS_GSS_ERROR
DNS update failed: NT_STATUS_UNSUCCESSFUL
  • Les deux messages liés à la mise à jour DNS ne sont pas bloquant et une fois intégré au domaine il faut redémarrer.

Vérifications

  • Vérifier que les méthodes d'authentification sont bien enregsitrées :
pam-auth-update

[*] Unix authentication
[*] Winbind NT/Active Directory authentication
[*] Mount volumes for user
[*] Register user sessions in the systemd control group hierarchy
[*] Inheritable Capabilities Management
  • Vérifier que winbind renvoi bien les utilisateurs et groupes depuis Active Direcory :
wbinfo -u && wbinfo -g
  • Idem avec la commande getent :
getent passwd | more && getent group | more

Apache

  • Installation d'Apache2, MySQL et PHP :
apt-get update; apt-get upgrade -y; apt-get install apache2 apache2-utils openssl openssl-blacklist openssl-blacklist-extra mysql-server php5 libapache2-mod-php5 php5-mysql
  • Ajouter les paquets suivants :
apt-get install apache2-mpm-prefork libapache2-mod-auth-kerb

VHost

  • On crée le fichier de configuration en référence à notre Virtual Host :
vi /etc/apache2/sites-available/test.conf

<VirtualHost 192.168.0.10:80>

        ServerName      test
        Redirect        / https://test
        ErrorLog        /var/log/apache2/test.log
        CustomLog       /var/log/apache2/test.log combined

</VirtualHost>

<VirtualHost 192.168.0.10:443>

        ServerName test
        DocumentRoot /var/www/test

        SSLEngine on
        SSLCertificateFile /etc/apache2/test.crt
        SSLCertificateKeyFile /etc/apache2/test.key

        ErrorLog        /var/log/apache2/test.log
        CustomLog       /var/log/apache2/test.log combined

<Directory /var/www/test>

        Options         Indexes FollowSymLinks MultiViews
        AllowOverride   none
        Order           allow,deny
        allow from      all

        AuthType                Kerberos
        AuthName                "Kerberos Login"
        KrbMethodNegotiate      On
        KrbMethodK5Passwd       On
        KrbAuthRealms           DOMAIN.TLD
        Krb5KeyTab              /etc/apache2/HTTP-test.keytab
        require                 valid-user

</Directory>
</VirtualHost>

Keytab

  • Copier le fichier HTTP-test.keytab et poser les droits pour l'utilisateur www-data :
mv /home/user/HTTP-test.keytab /etc/apache2/
chown www-data:www-data /etc/apache2/HTTP-test.keytab

Certificat

  • On génère un certificat auto-signé :
openssl req -x509 -nodes -days 3650 -newkey rsa:1024 -out /etc/apache2/test.crt -keyout /etc/apache2/test.key

<note important>L'option Common Name doit reprendre le nom du VHost déclaré dans le DNS, ex test.domain.tld devient test </note>

Country Name (2 letter code) [AU]: TS
State or Province Name (full name) [Some-State]: test_land
Locality Name (eg, city) []: test_city
Organization Name (eg, company) [Internet Widgits Pty Ltd]: domain.tld
Organizational Unit Name (eg, section) []: domain.tld
Common Name (e.g. server FQDN or YOUR name) []: test
Email Address []: webmaster@domain.tld
  • Activer les modules Apache et le site :
a2enmod {authnz_ldap,ssl}
a2ensite test.conf
service apache2 restart

Paramétrage du navigateur

Depuis Firefox

about:config
network.negotiate-auth.trusted-uris http://,https://
network.negotiate-auth.delegation-uris http://,https://

Depuis IE

FIXME

Validation

  • Pour valider le bon fonctionnement, créer un fichier index.php dans le répertoire racine du site :
vi /var/www/test/index.php

&lt;?php
echo &quot;&lt;h2&gt;Kerberos Auth&lt;/h2&gt;&quot;;
echo &quot;Auth type: &quot; . $_SERVER[&#039;AUTH_TYPE&#039;] . &quot;&lt;br /&gt;&quot;;
echo &quot;Remote user: &quot; . $_SERVER[&#039;REMOTE_USER&#039;] . &quot;&lt;br /&gt;&quot;; ?&gt;
Kerberos Auth
Auth type: Basic
Remote user: toto@DOMAIN.TLD

Services Web

GLPI

        &lt;Files &quot;plugin_fusioninventory.communication.php&quot;&gt;
          Satisfy Any
          Options FollowSymLinks
        &lt;/Files&gt;

Nagios

Dokuwiki

Sources