Notes d'installation Single Sign-On (SSO) avec authentic2-auth-kerberos

# Avant-propos
Cette note d'installation se focalise sur le déploiement d'un SSO Kerberos vers le fournisseur d'identité

# Descriptif de l'architecture

Le serveur d'annuaire est une Active Directory sur Windows Server 2012 R2 (ici virtualisé à l'aide de l'outil Oracle VirtualBox).
Dans le cadre du déploiement en local, la machine Windows Server héberge aussi un DNS.
Le domaine géré par la machine est `entrouvert.local`.
Le *hostname* de la machine Windows Server est `WIN-4HOASL41N0M.entrouvert.local`.
La *locale* du serveur est `en_us`.

Le déploiement ayant lieu en réseau local (fonctionnalité *Host-only adapter* de VirtualBox), l'adresse IP du serveur est 192.168.56.101.
L'adresse IP du serveur fournisseur d'identité est 192.168.56.1.

Le fournisseur d'identité est authentic2, avec installation du module d'authentification Kerberos (`authentic2-auth-kerberos`), s'exécutant machine Debian 9 testing.


# Configuration du serveur Active Directory

Dans le cadre du déploiement en local, le royaume (*realm*) Kerberos défini est `ENTROUVERT.LOCAL`.
En supposant que la base d'utilisateurs est déjà présente dans l'AD, il faut néanmoins créer un compte correspondant au fournisseur de service.
*Tools* -> *AD Users and Computers* -> *Managed Service Accounts* -> Clic droit *New...* -> *User* -> *User logon name : a2idp* (avec le suffixe `@ENTROUVERT.LOCAL`)

# Configuration DNS
## Configuration du serveur de nom de domaine
Le DNS utilisé ici est celui de la machine Windows Serveur.

Afin que le SSO aboutisse, il est nécessaire d'ajouter un A record correspondant au nom d'hôte (*hostname*) du fournisseur d'identité.
Le host utilisé ici est `phyhost.entrouvert.local`.

L'ajout du *A record* s'effectue comme ci-dessous :
Dans l'interface *Server Manager* :
*Tools* -> *DNS* -> onglet WIN-4HOASL41N0M.entrouvert.local -> *Forward Lookup Zone* -> entrouvert.local -> Clic droit "*New Host (A or AAAA)...*" -> *Name : phyhost*, *IP Address : 192.168.56.1*

## Configuration du client
Ajout de l'IP du DNS soit à l'aide de l'outil `NetworkManager` de configuration des connexions `nm-connexion-editor`, soit directement dans `/etc/resolf.conf` par ajout d'une entrée `nameserver 192.168.56.101`.


# Configuration Kerberos
## Côté serveur
Dans l'invite de commande PowerShell, il faut définir un *service principal name* à l'aide de la commande `setspn` :
```
setspn -S HTTP/phyhost.entrouvert.local a2idp
```
(N.B : l'option -S remplace l'option -A obsolète, cette dernière ne vérifiant pas la présence de doublons dans la liste des *service principals*).

Le service principal est alors associé au compte de service *a2idp2* créé plus haut.

L'étape suivante est la génération d'un *keytab* associé au service principal :
```
ktpass -princ HTTP/phyhost.entrouvert.local@ENTROUVERT.LOCAL -mapuser a2idp@ENTROUVERT.LOCAL -crypto ALL -ptype KRB5_NT_PRINCIPAL -pass <mot de passe du compte de service a2idp> -out c:\idp.keytab
```

Explication des options :
* `princ` : nom du service principal Kerberos
* `user ` : nom du compte de service dans la base AD
* `crypto` : algos de chiffrements utilisés. L'option `ALL` autorise le chiffrement pour toutes les algos supportés par le serveur (DES-CBC-CRC, DES-CBC-MD5, RC4-HMAC-NT, AES256-SHA1 et AES128-SHA1)
* `ptype` : type de principal Kerberos pour lequel la *keytab* est générée.
* `out` : emplacement de la `keytab`

# Configuration du navigateur Web
Côté client, le navigateur doit être configuré pour accepter les challenges `WWW-Authenticate` en provenance de l'IDP.
La configuration est donnée ici pour un client Mozilla Firefox 45 :
`about:config` dans la barre de navigation -> `network.negotiate-auth.allow-non-fqdn` à `true` (en particulier dans le cas où le non de domaine n'est pas un FQDN), et `network.negotiate-auth.trusted-uris` à phyhost.entrouvert.local`

# Installation et configuration authentic
Outre le code de base du fournisseur d'identité authentic, le support Kerberos dans cette brique logicielle est pris en charge par l'application authentic2-auth-kerberos.
Il suffit de cloner les sources de authentic2-auth-kerberos et de l'installer dans le même virtualenv que l'application de base authentic.

Il faut aussi renseigner l'emplacement de la copie du keytab généré sur l'AD, ainsi que le royaume Kerberos par défaut.
Ces deux options doivent être définies dans la configuration à l'aide des variables KRB5_KTNAME, et KRB5_NT_PRINCIPAL
```
KRB5_KTNAME = '/etc/krb5.keytab`
A2_AUTH_KERBEROS_REALM = 'ENTROUVERT.LOCAL'
A2_AUTH_KERBEROS_CREATE_USER = True
```
