Université de Poitiers Institut Universitaire de Technologie de Châtellerault Département Réseaux et Télécommunications

Licence professionnelle Métiers des Réseaux Informatiques et Télécommunications Spécialité Administration des Réseaux Multimédia

RAPPORT D’INSTALLATION

Présenté par : Baptiste MOINE

Promotion 2016-2017

Apprenti au Centre Hospitalier Henri LABORIT

Sujet du rapport : Projet CAS – Installation de CAS Server v5

Sauf mention contraire, ce rapport est mis à disposition selon les termes de la licence https://creativecommons.org/licenses/by-nc-sa/4.0/ TABLE DES MATIÈRES Table des matières...... 1 Note...... 2 Introduction...... 3 Tickets...... 3 Échanges HTTP...... 4 Architecture...... 5 Préparation du système...... 6 Configuration du nom d’hôte...... 6 Configuration de OpenSSH-Server...... 7 Installation des dépendances...... 9 (en automatique)...... 9 Apache Tomcat (en manuel)...... 11 JRE (« Runtime Environment ») et JDK (« Java Development Kit »)...... 19 Apache Maven...... 20 Installation de CAS...... 22 Application et adaptation du modèle Maven...... 22 Compilation de CAS...... 38 Ajout d’un frontal avec Apache HTTP...... 41 Installation...... 41 Fichiers de configuration d’Apache HTTP...... 42 Configuration...... 44 Tests...... 54 Création d’un environnement de test pour l’authentification sans multifacteur...... 57 Installation d’Active Directory sous Windows Server 2016...... 58 Configuration du service DNS...... 62 Configuration de l’annuaire...... 63 Génération d’un keytab...... 66 Installation de Kerberos sur le serveur CAS...... 67 Mise à jour du chemin d’authentification de CAS...... 71 Ajout de miletrie.lan au registre de services...... 73 Intégration d’un ordinateur client au domaine miletrie.lan...... 74 Configuration du navigateur pour autoriser SPNEGO...... 74 Déploiement d’une application de test basée sur phpCAS...... 75 Test de l’authentification Kerberos sur Appli1...... 84 Analyse protocolaire...... 84

Baptiste MOINE 1 Installation de CAS Server v5 NOTE Les informations suivantes ne sont pas nécessairement représentatives d’une installation ou configuration optimale et ne s’appliquent que dans un contexte défini, ainsi, il est primordial de comprendre le fonctionnement de chacune de ces configurations et de procéder le cas échéant à une adaptation / extension de ces dernières afin d’être cohérent avec l’environnement dans lequel cette installation est faite. Pour des raisons de confidentialité relatives à l’éthique et au secret professionnel, certaines informations ont potentiellement été extraites / falsifiées.

Baptiste MOINE 2 Installation de CAS Server v5 INTRODUCTION CAS (pour « Central Authentication Service ») est, comme l’indique son nom, un serveur d’authentification centralisé basé sur la technologie SSO (« Single Sign-On ») orienté vers les applications WEB. Cette solution est mature et a été déployée dans de nombreuses universités américaines. Tickets Pour fonctionner, CAS est basé sur différents tickets (ou « cookies ») et s’appuie principalement sur le protocole HTTP pour l’échange de ces derniers. TGC (« Ticket-Granting Cookie ») ou TGT (« Ticket Granting Ticket ») Le TGC se présente sous la forme d’un cookie de session HTTP, il permet au client (p. ex., navigateur WEB) d’indiquer à CAS ou à l’application, l’identifiant de session associée à notre authentification, si le client ne supporte pas l’ajout de cookie, l’authentification sera exigée à chaque appel au serveur CAS. Ce cookie joue un rôle crucial dans le mécanisme d’authentification unifiée, c’est pourquoi il peut être sujet à des tentatives de vol (« magic cookie theft ») lors d’une attaque par détournement de session (« Session Hijacking »). Une attaque par Session Hijacking est souvent issue de l’exploitation d’une vulnérabilité de type XSS (« Cross-Site Scripting ») permettant à un attaquant de procéder à l’utilisation détournée d’une API (« Application Programming Interface » ou interface de programmation) côté client afin, par exemple, d’exécuter du code JavaScript et dérober une copie du magic cookie. Des attaques telles que le MitM (« Man in the Middle ») permettant l’analyse de paquets ne nous étant pas nécessairement destinés (« sniffing »). Pour faire face aux attaques de type Session Hijacking, ce cookie est écrit en RAM et expire à la fermeture du navigateur WEB, utilise le drapeau (« flag ») HTTPOnly pour empêcher l’accès par les API côté client (p. ex., JavaScript) ainsi que le Secure Flag indiquant au navigateur d’utiliser une communication HTTPS pour l’échange de ce cookie avec l’application. ST (« Service Ticket ») Le ST est un ticket à usage unique généré par le serveur CAS et permettant l’authentification du client sur une application WEB. Il est échangé entre le client et l’application WEB l’application par l’intermédiaire d’une requête HTTP GET, l’application récupère ensuite l’identifiant associé à ce client en envoyant ce ticket au serveur CAS. PT (« Proxy Ticket ») Le PT est un ticket utilisé comme un ST par l’application WEB, mais permet l’authentification de l’utilisateur sur un service auquel il n’a pas d’accès direct. L’authentification est alors déléguée (principe du proxy) au serveur CAS qui est alors capable de supporter l’utilisation de mécanismes supplémentaires (p. ex., autorisation, attributs). PGT (« Proxy Granting Ticket ») Le PGT est envoyé par le serveur CAS au proxy CAS, il permet au serveur proxy de demander au serveur CAS la génération d’un PT pour l’authentification sur une application WEB.

Baptiste MOINE 3 Installation de CAS Server v5 Échanges HTTP

1. La requête initiale du client WEB à l’application nécessitant une authentification est redirigée vers l’URL login du serveur CAS avec une URL de retour (serviceid ou « callback ») en paramètre du GET ;

2. Le serveur CAS procède à l’authentification du client en utilisant le mécanisme local d’authentification puis redirige le client vers l’application d’origine en utilisant le serviceid en utilisant le mécanisme de redirection HTTP, le TGC est alors enregistré par le client HTTP (s’il est accepté) ;

3. L’application WEB reçoit le ST lors de la redirection du client en paramètre de la requête GET ;

4. L’application établit une communication HTTP directe avec le serveur CAS et envoie son URL et le ST envoyé par le client. Le serveur CAS valide le ticket et le marque comme expiré après avoir retourné l’UID (« User IDentificator ») du client. L’authentification de l’utilisateur sur l’application WEB est valide jusqu’à l’expiration du TGC. En mode proxy, si le ST est validé, le serveur retourne un identifiant de PGT (PGT-id) en complément.

Baptiste MOINE 4 Installation de CAS Server v5 ARCHITECTURE La majeure partie des implémentations de CAS dispose au minimum : • D’un client HTTP (p. ex., navigateur WEB) ; • D’une application WEB (basée sur HTTP) exigeant une authentification, comprenant l’éventuel backend de l’application (p. ex., base de données, cache, etc.) ; • D’un serveur d’authentification centralisé (CAS) ; • D’une base de données ou services dédiés à l’authentification (e.g. Kerberos, LDAP, Active Directory).

Baptiste MOINE 5 Installation de CAS Server v5 PRÉPARATION DU SYSTÈME Configuration du nom d’hôte Mise à jour du nom d’hôte associé au système :

# export HOSTNAME=cas # export DOMAIN=miletrie.lan # cat </etc/hostname ${HOSTNAME} EOF # cat </etc/hosts # IPv4 127.0.0.1 localhost 127.0.1.1 ${HOSTNAME}.${DOMAIN} ${HOSTNAME}

# IPv6 ::1 ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters

EOF # hostname ${HOSTNAME} # hostname -b ${HOSTNAME} # domainname ${HOSTNAME}.${DOMAIN} # domainname -b ${HOSTNAME}.${DOMAIN} # hostnamectl set-hostname ${HOSTNAME} # sysctl kernel.hostname # systemctl restart networking.service || /etc/init.d/networking restart

Baptiste MOINE 6 Installation de CAS Server v5 Configuration de OpenSSH-Server Arrêt du service SSH pour préparer sa configuration :

# /etc/init.d/ssh stop || systemctl stop ssh.service

Génération d’un nouveau jeu de clé publique et privée pour le serveur :

# rm /etc/ssh/ssh_host_*key* # ssh-keygen -N '' -t ed25519 -f /etc/ssh/ssh_host_ed25519_key

Génération d’un nouveau jeu de clés EdDSA (Edwards-curve Digital Signature Algorithm) et RSA (Rivest-Shamir-Addleman) pour l’authentification par clé privée (depuis le client) :

# mkdir ~/.ssh/ # cd ~/.ssh/ # ssh-keygen -t ed25519 -f ~/.ssh/[email protected]_ed25519 # ssh-keygen -t rsa -b 4096 -f ~/.ssh/[email protected]_rsa

FACULTATIF : Création d’un jeu de clés EdDSA et RSA résistant aux attaques de type bruteforce, cette étape est recommandée, mais dans la mesure où elle contraint à l’utilisation d’un client SSH supportant le processus cryptographique de dérivation de clé (« key derivation function » ou KDF), il sera nécessaire d’apprécier les enjeux relatifs à l’utilisation d’un tel jeu de clé, notamment en termes de portabilité et rétrocompatibilité :

# ssh-keygen -t ed25519 -o -a 100 -f ~/.ssh/[email protected]_ed25519 # ssh-keygen -t rsa -b 4096 -o -a 100 -f ~/.ssh/[email protected]_rsa

Affichage des clés publiques (depuis le client) :

# cat ~/.ssh/[email protected]_{ed25519,rsa}.pub

Baptiste MOINE 7 Installation de CAS Server v5 Mise à jour des clés publiques pour l’utilisateur « user » (depuis le serveur) :

# mkdir /home/user/.ssh/ # cd /home/user/.ssh/ # cat <<-'EOF' >/home/user/.ssh/authorized_keys EOF # chown -R user:user /home/user/.ssh/ # chmod 0500 /home/user/.ssh/ # chmod 0400 /home/user/.ssh/authorized_keys

Redémarrage du service OpenSSH (depuis le serveur) :

# /etc/init.d/ssh start || systemctl start ssh.service

Suppression des clés publiques (depuis le client) :

# chmod -R 0700 ~/.ssh && rm ~/.ssh/[email protected]_{ed25519,rsa}.pub

Configuration de l’authentification client (depuis le client) :

# cat <>~/.ssh/config Host cas Hostname [email protected] User user IdentityFile ~/.ssh/[email protected]_ed25519 IdentityFile ~/.ssh/[email protected]_rsa EOF # touch ~/.ssh/known_hosts # chmod 0500 ~/.ssh # chmod 0700 ~/.ssh/known_hosts # chmod 0400 ~/.ssh/[email protected]_ed25519 # chmod 0400 ~/.ssh/[email protected]_rsa # chmod 0400 ~/.ssh/config

Test et validation de l’authentification par clé publique (depuis le client) :

# ssh cas

Baptiste MOINE 8 Installation de CAS Server v5 INSTALLATION DES DÉPENDANCES CAS est un composant Java, c’est-à-dire un ensemble de servlets ou classes Java permettant la création de données dynamiques au sein d’un service HTTP. Il est donc à déployer sur un backend d’application WEB Java, également appelé conteneur. Apache Tomcat (en automatique) Important : La version 5 de CAS ne semble pas compatible avec la version stable distribuée par Debian, il est donc conseillé de procéder à une installation manuelle d’Apache Tomcat. Apache Tomcat est un service HTTP à part entière, mais également un conteneur WEB supportant les servlets et JSP (« JavaServer Pages »), par l’intermédiaire d’une compilation (via l’outil Jasper) des JSP en servlets. Apache Tomcat est généralement utilisé en tant que module (ou greffon) à un autre service HTTP plus généraliste (e.g. Apache HTTP Server, IIS, Nginx). Ainsi, le service HTTP traite les requêtes HTTP de façon « classiques » (p. ex. HTML, PHP) et délègue le traitement des requêtes relevant d’une application WEB Java (p. ex. JSP, servlets) à Apache Tomcat en utilisant le module mod_jk. Installation Recherche de la dernière version stable d’Apache Tomcat :

# apt-cache policy ^tomcat[0-9]+$

La dernière version majeure d’Apache Tomcat, au moment de la recherche, est la version 8. Parmi les différentes versions listées, des suffixes « bpo8 » sont utilisés pour indiquer qu’il s’agit d’une version rétroportée, c’est-à-dire une version du paquet ayant été recompilé depuis la branche testing ou unstable. Les autres versions sont des versions stables et disposent de mises à jour en fonction de la branche du référentiel de Debian Jessie. Installation de la dernière version stable d’Apache Tomcat et Apache Tomcat Native :

# apt-get install libtomcat8-java=8.0.14-1+deb8u2 tomcat8=8.0.14-1+deb8u2 tomcat8-common=8.0.14-1+deb8u2 libtcnative-1

Note : Depuis la publication de la CVE-2016-1240 le 30/09/2016, il est conseillé de passer en deb8u3 et supérieur.

Baptiste MOINE 9 Installation de CAS Server v5 Configuration La configuration d’Apache Tomcat ayant déjà été étudiée par l’équipe du DSIO du Centre Hospitalier Henri Laborit, il a été convenu de la réutiliser comme base à d’éventuelles modifications. Téléchargement des configurations du CHHL pour Apache Tomcat :

# cd /tmp/ # curl --insecure --silent --location --header "PRIVATE-TOKEN: " --url "https://gitlab/cas/tomcat8-conf/repository/archive.tar.gz?ref=master" >tomcat8-conf.tar.gz # tar xvzf tomcat8-conf.tar.gz

Analyse des modifications :

# git diff {/etc/tomcat8,tomcat8-conf-master-*}/

Application des configurations :

# tar xvzf tomcat8-conf.tar.gz --directory /etc/tomcat8/ # mv /etc/tomcat8/tomcat8-conf-master-*/{.,}* /etc/tomcat8/ # rmdir /etc/tomcat8/tomcat8-conf-master-*/ # systemctl reload-or-try-restart tomcat8.service

Baptiste MOINE 10 Installation de CAS Server v5 Apache Tomcat (en manuel) Installation Téléchargement d’Apache Tomcat depuis les serveurs d’Apache :

# export TOMCAT8_VERSION=8.5.6 # cd /opt/ # wget http://apache.mirrors.ovh.net/ftp.apache.org/dist/tomcat/tomcat-8/v$ {TOMCAT8_VERSION}/bin/apache-tomcat-${TOMCAT8_VERSION}.tar.gz # tar xvzf apache-tomcat-${TOMCAT8_VERSION}.tar.gz # pushd apache-tomcat-${TOMCAT8_VERSION}/

Baptiste MOINE 11 Installation de CAS Server v5 Configuration Ajout de variables d’environnement contextuelles pour Apache Tomcat :

# cat <<-'EOF' >/etc/default/tomcat8 # Utilisateur et groupe de Tomcat8 export TOMCAT8_USER="tomcat8" export TOMCAT8_GROUP="tomcat8"

# Version de Tomcat8 export TOMCAT8_VERSION=8.5.6

# Répertoire contenant les fichiers configuration, les applications et les binaires de Tomcat8 export CATALINA_HOME=/opt/apache-tomcat-${TOMCAT8_VERSION} export CATALINA_BASE=${CATALINA_HOME}

# Fichier contenant le PID de Tomcat8 export CATALINA_PID=/var/run/tomcat8.pid

# Répertoire temporaire pour Tomcat8 export CATALINA_TMPDIR=/tmp/tomcat8-tmp/

EOF # chmod 644 /etc/default/tomcat8 # cat <<-'EOF' >>~/.bash_profile source /etc/default/tomcat8

EOF # source ~/.bash_profile

Baptiste MOINE 12 Installation de CAS Server v5 Création d’un script pour la gestion du service Apache Tomcat :

# cat <<-'EOF' >/etc/init.d/tomcat8 #!/usr/bin/env bash # # Written by Baptiste MOINE # ### BEGIN INIT INFO # Provides: tomcat8 # Required-Start: $local_fs $remote_fs $network # Required-Stop: $local_fs $remote_fs $network # Should-Start: $named # Should-Stop: $named # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Apache Tomcat 8 # Description: Apache Tomcat 8 servlet engine ### END INIT INFO

DEFAULT=/etc/default/tomcat8

## Vérification du contexte d'exécution if [ `id -u` -ne 0 ]; then echo "root privileges are required to run this script" exit 1 fi

## Configurations par défaut # Utilisateur et groupe de Tomcat8 TOMCAT8_USER="tomcat8" TOMCAT8_GROUP="tomcat8"

# Version de Tomcat8 TOMCAT8_VERSION=8.5.6

# Répertoire contenant les fichiers configuration, les applications et les binaires de Tomcat8 CATALINA_HOME=/opt/apache-tomcat-${TOMCAT8_VERSION} CATALINA_BASE=${CATALINA_HOME}

Baptiste MOINE 13 Installation de CAS Server v5 # Fichier contenant le PID de Tomcat8 CATALINA_PID=/var/run/tomcat8.pid

# Répertoire temporaire pour Tomcat8 CATALINA_TMPDIR=/tmp/tomcat8-tmp/

## Chargement des configurations if [ -f "${DEFAULT}" ]; then . "${DEFAULT}" fi

## Gestion du service Tomcat8 function tomcat-start { install -o ${TOMCAT8_USER} -g ${TOMCAT8_GROUP} -d ${CATALINA_TMPDIR} && start-stop-daemon --start -b -u "${TOMCAT8_USER}" -g "${TOMCAT8_GROUP}" -c "${TOMCAT8_USER}" -d "${CATALINA_TMPDIR}" -m -p "${CATALINA_PID}" -x /bin/bash -- -c "/usr/bin/authbind --deep /bin/bash -c '${CATALINA_HOME}/bin/catalina.sh run'" }

function tomcat-stop { [ -f ${CATALINA_PID} -a -s ${CATALINA_PID} ] && [ -e /proc/$(cat $ {CATALINA_PID}) ] && start-stop-daemon --stop -u "${TOMCAT8_USER}" -g "$ {TOMCAT8_GROUP}" -c "${TOMCAT8_USER}" -d "${CATALINA_TMPDIR}" -p "$ {CATALINA_PID}" && install -o ${TOMCAT8_USER} -g adm -m 644 /dev/null ${CATALINA_PID} && rm -rf ${CATALINA_TMPDIR} }

function tomcat-restart { tomcat-stop tomcat-start }

function tomcat-status { [ -f ${CATALINA_PID} -a -s ${CATALINA_PID} ] && [ -e /proc/$(cat $ {CATALINA_PID}) ] && printf "Running\n$(ps -p $(cat ${CATALINA_PID}))\n" || printf "Stopped\n" }

Baptiste MOINE 14 Installation de CAS Server v5 ## Annonce les arguments d'entrée utilisables function usage { printf "Usage: ${0} {start|stop|restart|status}\n" }

## Gestion des arguments d'entrée case "${1}" in start) tomcat-start ;; stop) tomcat-stop ;; restart) tomcat-restart ;; status) tomcat-status ;; *) usage ;; esac

exit 0

EOF # chmod 755 /etc/init.d/tomcat8

Activation du service et création des liens symboliques dans les runlevels associés :

# update-rc.d tomcat8 defaults # update-rc.d tomcat8 enable

Baptiste MOINE 15 Installation de CAS Server v5 Création du service dans systemd :

# cat <<-'EOF' >/lib/systemd/system/tomcat8.service [Unit] Description=Apache Tomcat 8 After=network.target

[Service] Type=forking RemainAfterExit=no ExecStart=/etc/init.d/tomcat8 start ExecStop=/etc/init.d/tomcat8 stop

[Install] WantedBy=multi-user.target

EOF # chmod 644 /lib/systemd/system/tomcat8.service # systemctl daemon-reload

Baptiste MOINE 16 Installation de CAS Server v5 Création de l’utilisateur tomcat8 et de son groupe :

# groupadd --system "${TOMCAT8_GROUP}" # useradd --system --home-dir ${CATALINA_HOME} --no-create-home --gid "$ {TOMCAT8_GROUP}" --shell /bin/false "${TOMCAT8_USER}"

Création du répertoire de journalisation et de cache pour Apache Tomcat :

# install -m 750 -o ${TOMCAT8_USER} -g adm -d /var/{cache,log}/${TOMCAT8_USER}/

Activation du cache dans la configuration d’Apache Tomcat :

# sed -i 's#\(\)#\n \n \n\1#' ./conf/context.xml

Création d’une nouvelle arborescence pour contenir les fichiers de configuration d’Apache Tomcat :

# install -m 755 -o root -g root -d /etc/tomcat8/ # install -m 770 -o root -g ${TOMCAT8_GROUP} -d /etc/tomcat8/Catalina/ {,localhost/}

Copie de la configuration de Tomcat dans la nouvelle arborescence :

# install -m 640 -o root -g ${TOMCAT8_GROUP} ./conf/* /etc/tomcat8/

Déplacement des configurations et des fichiers temporaires :

# rm -rf ${CATALINA_HOME}/{conf,temp,logs,work} # ln -s /etc/tomcat8/ ${CATALINA_HOME}/conf # ln -s ${CATALINA_TMPDIR} ${CATALINA_HOME}/temp # ln -s /var/log/${TOMCAT8_USER}/ ${CATALINA_HOME}/logs # ln -s /var/cache/${TOMCAT8_USER}/ ${CATALINA_HOME}/work

Définition du propriétaire de l’arborescence d’Apache Tomcat à l’utilisateur tomcat8 :

# chown -Rh ${TOMCAT8_USER}:${TOMCAT8_GROUP} ${CATALINA_HOME}

Baptiste MOINE 17 Installation de CAS Server v5 Démarrage d’Apache Tomcat en mode daemon :

# install -o ${TOMCAT8_USER} -g adm -m 644 /dev/null ${CATALINA_PID} # rm -rf ${CATALINA_TMPDIR} # install -o ${TOMCAT8_USER} -g ${TOMCAT8_GROUP} -d ${CATALINA_TMPDIR} # systemctl start tomcat8.service

Vérification et validation du fonctionnement d’Apache Tomcat :

# systemctl status tomcat8.service # curl --silent --include --location --header "User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0" --url "http://cas:8080/" | head -n1 HTTP/1.1 200

Baptiste MOINE 18 Installation de CAS Server v5 JRE (« Java Runtime Environment ») et JDK (« Java Development Kit ») Installation Recherche de la dernière version stable de Java :

# apt-cache policy ^openjdk-[0-9]+

La dernière version majeure de Java, au moment de la recherche, est la version 1.7, cependant pour des raisons de performance et de compatibilité avec CAS v5, l’installation de la version rétroportée du Java en version 1.8 est recommandée. Installation de la dernière version de Java :

# apt-get install openjdk-8-jre=8u102-b14.1-1~bpo8+1 openjdk-8-jdk=8u102-b14.1- 1~bpo8+1

Vérification de l’installation de Java 1.8 :

# java -version

Si la version retournée est inférieure à la version 1.8, il faut désinstaller les anciennes versions déjà installées, par exemple :

# apt-get remove openjdk-7-jre openjdk-7-jre-headless openjdk-7-jdk openjdk-7- jdk-headless

Nouvelle vérification de l’installation de Java 1.8 :

# java -version

Configuration du proxy

# cat <<-'EOF' >>~/.bash_profile JAVA_FLAGS="-Dhttp.proxyHost=172.18.4.1 -Dhttp.proxyPort=8080"

export JAVA_FLAGS

EOF # source ~/.bash_profile

Baptiste MOINE 19 Installation de CAS Server v5 Apache Maven Apache Maven est un moteur de production Java. Comparable à GNU Make, il fournit une aide à la compilation par la création de fichier de description détaillée (au format XML) comprenant notamment le processus de compilation, de résolution des dépendances avec des modules externes, la gestion du versioning, les tests, etc. Ce fichier de description est appelé POM (pour « Project Object Model »). Installation Deux versions sont développées en parallèle, la version 2 et 3, cependant les prochaines releases devraient se baser sur la version 3, il est donc préférable d’installer cette version, de plus ne s’agissant pas d’un service réseau, l’installation d’une version rétroportée en version 3 ne devrait poser aucun problème si les dépendances sont installables. Installation de la dernière version de Maven 3.3.9 :

# wget http://apache.mirrors.ovh.net/ftp.apache.org/dist/maven/maven- 3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz # tar xvzf apache-maven-3.3.9-bin.tar.gz --directory /opt/ # cd apache-maven-3.3.9/

Définition du JAVA_HOME (facultatif) et ajout de Maven au PATH :

# cat <<-'EOF' >>/etc/default/tomcat8 # Répertoire d’accès à Java JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 EOF # cat <<-'EOF' >>~/.bash_profile export PATH=/opt/apache-maven-3.3.9/bin:$PATH EOF # source ~/.bash_profile

Vérification et validation de l’installation de Maven 3 :

# mvn -v Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11- 10T17:41:47+01:00) Maven home: /opt/apache-maven-3.3.9 Java version: 1.8.0_102, vendor: Oracle Corporation Java home: /usr/lib/jvm/java-8-openjdk-amd64/jre Default locale: fr_FR, platform encoding: UTF-8 OS name: "linux", version: "3.16.0-4-amd64", arch: "amd64", family: "unix"

Baptiste MOINE 20 Installation de CAS Server v5 Configuration du proxy Sauvegarde des fichiers de configurations globaux et création d’une configuration personnalisée pour l’utilisateur :

# cp /opt/apache-maven-3.3.9/conf/settings.xml{,.bak} # cp /opt/apache-maven-3.3.9/conf/settings.xml ~/.m2/settings.xml

Duplication du bloc de balise « proxy » à l’intérieur du bloc « proxies » :

# sed -i -e ':a;N;$!ba;s/\(\)\(.*\)\(<\/proxies>\)/\1\2\2\3/;' ~/.m2/settings.xml

Application ou suppression de paramètres en fonction du protocole de connexion (p. ex., HTTP, HTTPS) :

# sed -i -e '//,/<\/proxies>/{ /\s\{4\}-->/d; # Suppression de la fermeture du bloc de commentaire s/\(\s\{4\}|$\)/\1-->/; # Fermeture du bloc de commentaire s/\(\).*\(<\/active>\)/\1true\2/; # Le proxy est actif /.*<\/username>/d; # Pas de nom d’utilisateur (exploitation de la plage IP), suppression de la propriété /.*<\/password>/d; # Pas de mot de passe (exploitation de la plage IP), suppression de la propriété s/\(\).*\(<\/host>\)/\1172.18.4.1\2/; # Hôte du service proxy s/\(\).*\(<\/port>\)/\18080\2/; # Port d’écoute du service proxy s/\(\).*\(<\/nonProxyHosts>\)/\1*.miletrie.chl|dev|dev.ch- poitiers.fr\2/; # Liste blanche du proxy

0~2s/\(\).*\(<\/id>\)/\1webcache_http\2/; # Identifiant du proxy HTTP 0~2s/\(\).*\(<\/protocol>\)/\1http\2/; # Protocole du proxy HTTP

1~2s/\(\).*\(<\/id>\)/\1webcache_https\2/; # Identifiant du proxy HTTPS 1~2s/\(\).*\(<\/protocol>\)/\1https\2/; # Protocole du proxy HTTPS }' ~/.m2/settings.xml

Baptiste MOINE 21 Installation de CAS Server v5 INSTALLATION DE CAS CAS étant développé en Java, son déploiement au sein du conteneur de servlets Catalina nécessite la création d’une archive WEB spécifique à cette application (on parle d’archive WAR). Afin de créer cette archive, la communauté de développeur autour du projet CAS, met à disposition des modèles (templates) d’abstraction (overlay), tels que Apache Maven, permettant la compilation et la création de l’archive WAR du projet. S’agissant de modèles, il sera nécessaire de procéder à leur adaptation pour l’appliquer à notre contexte. Application et adaptation du modèle Maven Téléchargement de l’overlay Maven pour CAS :

# cd /opt/ # git clone https://github.com/apereo/cas-overlay-template.git cas-server-5 # pushd cas-server-5/

Baptiste MOINE 22 Installation de CAS Server v5 Création d’un fork Créer un fork d’un référentiel (Git, SVN ou Mercurial) consiste à faire une copie de ce référentiel (c.-à-d. clone), en conservant un lien vers le référentiel d’origine (remote origin) appelé upstream dans le cadre d’un fork, mais en appliquant les mises à jour sur un second référentiel qui nous est propre appelé origin.

Illustration 1: Fork d’un référentiel Git

Création d’un référentiel Git, ici une instance GitLab interne au CHL sera utilisée, mais il est possible d’utiliser n’importe quel gestionnaire de référentiel Git (e.g. GitLab, Atlassian BitBucket, IBM BlueMix DevOps Services, GitHub). Modification des dépôts sur le clone local :

# git remote rename origin upstream # git remote add origin https://[email protected]/MB082668/cas- server-5.git

Vérification des dépôts :

# git remote -v

Baptiste MOINE 23 Installation de CAS Server v5 Configuration globale de Git :

# cat <<-'EOF' >~/.gitconfig [user] name = Baptiste MOINE email = [email protected]

#[http] # proxy = http://172.18.4.1:8080

EOF

Suppression des fichiers inutilisés (binaires d’Apache Maven et le README qui ne correspond pas à notre projet) :

# rm -rf README.md mvnw.bat mvnw maven/

Création d’un nouveau commit et envoi des modifications sur le dépôt fork :

# git add README.md mvnw.bat mvnw maven/ # git commit --message "Suppression des fichiers inutilisés" # git push --set-upstream origin master

Baptiste MOINE 24 Installation de CAS Server v5 pom.xml Tel qu’expliqué dans la section dédiée à l’installation de Apache Maven, ce moteur de production est comparable à GNU Make et se base sur un fichier de description (au format XML) appelé POM (pour « Project Object Model ») et permettant de fournir une description avancée du projet et des phases de mise en service comprenant notamment le processus de compilation, de résolution des dépendances avec des modules externes, la gestion du versioning, les tests, etc. Ce fichier respecte généralement la structure suivante : • Description du projet Apache Maven POM en donnant son espace de nom (XMLNS), l’accès à son schéma (XSD) et son instance (XSI) XML :

• Description des métadonnées du projet (p. ex., nom, version, identifiant de groupe et d’artefact) :

4.0.0 fr.chpoitiers cas-server-5 war 0.0.1-SNAPSHOT Serveur cas personnalisé pour le CHL

Baptiste MOINE 25 Installation de CAS Server v5 • Description des propriétés du projet : Il s’agit simplement de données variables exploitables dans n’importe quelles autre section du fichier de description. Pour exemple, en voici un extrait :

org.apache.maven.plugins 3.5.1

com.rimerosolutions.maven.plugins 0.1.5

Baptiste MOINE 26 Installation de CAS Server v5 • Déclaration des modules nécessaires à la phase de construction (build) du projet. Pour exemple, en voici un extrait :

${maven.compiler.plugin.groupId} maven-compiler-plugin ${maven.compiler.plugin.version} ${java.source.version} ${java.target.version}

${maven.wrapper.plugin.groupId} wrapper-maven-plugin ${maven.wrapper.plugin.version} cas

• Description des dépendances (p. ex., version, phase concernée, identifiant de groupe et d’artefact) :

${cas.groupId} cas-server-support-json-service-registry ${cas.version} runtime

Baptiste MOINE 27 Installation de CAS Server v5 • Description des dépôts fournissant les modules et dépendances nécessaires :

sonatype-releases https://oss.sonatype.org/content/repositories/releases/ false true

Une fois l’ensemble des sections de configuration du projet complétées, on en profite pour créer un nouveau commit et pousser les modifications sur le dépôt fork :

# git add pom.xml # git commit --message "Mise à jour du fichier pom.xml" # git push --set-upstream origin master

Baptiste MOINE 28 Installation de CAS Server v5 Fichiers de configuration En complément du modèle Maven, Apereo fournit dans ce modèle d’abstraction, une configuration de base pour CAS et le moteur de journalisation. Comme expliqué dans la section « configuration » du README (voir README.md#configuration), les configurations fournies dans le répertoire etc, sont à placer, par défaut, dans le répertoire /etc/cas. Jetty Le module Jetty est utilisé pour un déploiement rapide des applications WEB, il est capable d’analyser périodiquement le projet afin de rechercher des mises à jour et procéder à leur déploiement. Ceci étant principalement conçu par les développeurs opérationnels (DevOps), nous pouvons nous passer de ce module :

# rm -rf ./etc/jetty

De plus, avant de soumettre les modifications au référentiel, il peut être intéressant de pouvoir distinguer les fichiers de configuration produits par le CHL, des fichiers de configuration par défaut. Pour cela, les fichiers de configurations seront placés dans le répertoire /etc/chl/cas5/ :

# mkdir -p ./etc/chl/cas5/ # mv ./etc/!(chl) -t ./etc/chl/cas5/

Création d’un nouveau commit et envoi des modifications sur le dépôt fork :

# git add ./etc # git commit --message "Déplacement des fichiers de configuration et suppression de Jetty" # git push --set-upstream origin master

Baptiste MOINE 29 Installation de CAS Server v5 log4j CAS fournit un service de journalisation appelé log4j qui enregistre l’ensemble des informations relatives aux événements importants tels qu’une authentification réussie ou échouée. Ce moteur de journalisation est personnalisable afin d’enregistrer des informations supplémentaires. Le fichier de configuration associé au service de journalisation est par défaut le fichier /etc/log4j2.xml et respecte généralement la structure suivante : • Définition de la structure XML et de ses propriétés :

• Description des propriétés du service de journalisation (voir Configuration de log4j et Configuration de l’intervalle de rafraîchissement), par exemple, on utilisera le moteur de journalisation de CAS afin un intervalle de rafraîchissement des événements toutes les 10 secondes :

...

Baptiste MOINE 30 Installation de CAS Server v5 • Description des flux de sortie (appenders) (p. ex., console, fichier, format d’affichage, taille maximale, politique d’écrasement), par exemple, pour pouvoir enregistrer des événements dans un fichier cas.log ou les afficher directement en console (stdout) (voir Configuration des flux de sortie et Configuration de log4j avec syslog) :

Baptiste MOINE 31 Installation de CAS Server v5 • Description des flux d’entrée (synchronicité du flux, module associé, niveau de gravité, l’additivité des flux, le flux de sortie associé) (voir Configuration des flux d’entrée), par exemple :

Une fois l’ensemble des sections de configuration du projet complétées, il sera nécessaire de faire une copie de ce fichier dans les ressources de l’application afin de permettre à Apache Tomcat de journaliser les événements avant le chargement de Spring :

# cp ./{etc/chl/cas5,src/main/resources}/log4j2.xml

Création d’un nouveau commit et envoi des modifications sur le dépôt fork :

# git add ./{etc/chl/cas5,src/main/resources}/log4j2.xml # git commit --message "Mise à jour du fichier log4j2.xml" # git push --set-upstream origin master

Baptiste MOINE 32 Installation de CAS Server v5 CAS Afin de configurer CAS, le modèle d’abstraction fournit un fichier de configuration cas.properties de type Property Resource Bundles (PRB) au format « dead.beef = foobar » (voir Properties files). Tel qu’expliqué dans la documentation de CAS en section « Configuration Properties », ce modèle est conçu comme un guide et ne doit en aucun cas être suivi aveuglément, il est au contraire préférable d’être sélectif sur le choix des propriétés saisies dans ce fichier de configuration. À titre d’exemple, en voici un extrait (la description du fichier complet serait trop longue pour figurer dans ce rapport) :

# Nom complet du serveur cas.server.name=http://cas.miletrie.lan:8080

# Chemin complet d'accès à CAS cas.server.prefix=${cas.server.name}/cas

# Répertoire contenant le registre des services (fichiers de description au format JSON) cas.serviceRegistry.config.location=file:///etc/chl/cas5/services

# Chemin d'accès à la configuration de log4j logging.config=file:/etc/chl/cas5/log4j2.xml

Une fois la configuration de CAS effectuée, on en profite pour déplacer ce fichier dans un répertoire plus approprié :

# mkdir ./etc/chl/cas5/config # mv ./etc/chl/cas5/{,config/}cas.properties

Il ne reste plus qu’à créer un nouveau commit et pousser les modifications sur le dépôt fork :

# git add ./etc/chl/cas5/{,config/}cas.properties # git commit --message "Déplacement et mise à jour du fichier cas.properties" # git push --set-upstream origin master

Baptiste MOINE 33 Installation de CAS Server v5 Registre de service Le registre de service définit l’ensemble des services sur lesquels CAS pourra nous authentifier. Tels qu’expliqué dans la documentation de CAS (voir JSON Service Management), les services sont définis sous la forme de fichiers, exploitant un formatage basé sur du JSON, dans le répertoire /etc/chl/cas5/services. Ces fichiers doivent respecter la convention de nommage suivante :

-.json

Par exemple :

# mkdir ./etc/chl/cas5/services # cat <<-'EOF' >./etc/chl/cas5/services/miletrie-1000.json { /* Tous les services HTTP/HTTPS du domaine miletrie.chl */ "@class" : "org.apereo.cas.services.RegexRegisteredService" "serviceId" : ^https?://.*\.miletrie\.chl/.* "name" : "miletrie" "id" : 1000 }

EOF # cat <<-'EOF' >./etc/chl/cas5/services/ch-poitiers-1001.json { /* Tous les services HTTP/HTTPS du domaine ch-poitiers.fr */ "@class" : "org.apereo.cas.services.RegexRegisteredService" "serviceId" : ^https?://(.*\.)?ch-poitiers\.fr/.* "name" : "ch-poitiers" "id" : 1001 }

EOF

Baptiste MOINE 34 Installation de CAS Server v5 Création d’un nouveau commit et envoi des modifications sur le dépôt fork :

# git add ./etc/chl/cas5/services/{miletrie-1000,ch-poitiers-1001}.json # git commit --message "Ajout des services de miletrie.chl et ch-poitiers.fr" # git push --set-upstream origin master

Baptiste MOINE 35 Installation de CAS Server v5 Bootstrap Tel qu’expliqué dans la documentation de CAS en section « Configuration Storage », afin de charger l’ensemble des fichiers de configurations, CAS doit procéder à la lecture d’un fichier de configuration décrivant les propriétés contextuelles relatives à l’amorçage du projet, on appelle ce type de fichier un fichier Bootstrap. Ce fichier, de type Property Resource Bundles (PRB), n’est pas fourni dans le modèle d’abstraction et doit être créé manuellement. Dans notre cas, la configuration minimale requise pour l’amorçage de CAS est la description du chemin d’accès aux fichiers de configuration du service CAS :

# mkdir ./src/main/resources/ # cat <<-'EOF' >./src/main/resources/bootstrap.properties ## # Configuration de Spring Cloud Bus # # Nom de l'application spring.application.name=cas

# L'échec de connexion au serveur est fatale spring.cloud.config.fail-fast=true

# Chargement des fichiers de configuration en local spring.profiles.active=native spring.cloud.config.server.bootstrap=true spring.cloud.config.server.prefix=/configserver

# Fichier de configuration local spring.cloud.config.server.native.searchLocations=file:/etc/chl/cas5/config

EOF

Création d’un nouveau commit et envoi des modifications sur le dépôt fork :

# git add ./src/main/resources/bootstrap.properties # git commit --message "Création du fichier bootstrap.properties" # git push --set-upstream origin master

Baptiste MOINE 36 Installation de CAS Server v5 propertyFileConfigurer.xml Modification du chemin d’accès au fichier de configuration cas.properties :

# sed -i 's#\(^\s*$\)#\1file:/etc/chl/cas5/config/cas.properties\2#' ./src/main/webapp/WEB- INF/spring-configuration/propertyFileConfigurer.xml

Création d’un nouveau commit et envoi des modifications sur le dépôt fork :

# git add ./src/main/webapp/WEB-INF/spring- configuration/propertyFileConfigurer.xml # git commit --message "Mise à jour du chemin d'accès à la configuration de CAS" # git push --set-upstream origin master

Baptiste MOINE 37 Installation de CAS Server v5 Compilation de CAS La configuration des services et du modèle d’abstraction étant faite, il ne reste plus qu’à lancer la compilation du projet :

# mvn clean package -e

Si la compilation réussie, une archive ZIP avec l’extension « .war » (« ARchive ») devrait avoir été créée dans le répertoire « target » du projet :

[INFO] Building war: /opt/cas-server-5/target/cas.war [INFO] ------[INFO] BUILD SUCCESS [INFO] ------

Ajout de l’archive dans Apache Tomcat :

# cp /opt/cas-server-5/target/cas.war ${CATALINA_HOME}/webapps/cas.war

Copie des fichiers de configuration de CAS :

# install -m 755 -o root -g root -d /etc/chl/ # install -m 750 -o ${TOMCAT8_USER} -g ${TOMCAT8_GROUP} -d /etc/chl/cas5/ # install -m 640 -o ${TOMCAT8_USER} -g ${TOMCAT8_GROUP} {.,}/etc/chl/cas5/log4j2.xml # cp -R {.,}/etc/chl/cas5/config/ # cp -R {.,}/etc/chl/cas5/services/ # chmod -R 640 /etc/chl/cas5/{config,services}/ # chown -R ${TOMCAT8_USER}:${TOMCAT8_GROUP} /etc/chl/cas5/{config,services}/ # chmod 750 /etc/chl/cas5/{config,services}/

Baptiste MOINE 38 Installation de CAS Server v5 Redémarrage d’Apache Tomcat pour le déploiement de CAS par Catalina en arrière-plan et affichage du journal d’événement complet de Catalina et en suivant les modifications du descripteur de fichier :

# systemctl restart tomcat8.service # tail -F -n +1 ${CATALINA_HOME}/logs/catalina.$(date +%Y-%m-%d).log

Si des erreurs relatives à l’écriture de journaux d’événements sont remontées, procéder à la mise à jour des droits sur le répertoire contenant ces fichiers et redémarrer à nouveau le service Apache Tomcat :

# rm -rf ${CATALINA_HOME}/logs /var/log/${TOMCAT8_USER}/ # install -m 750 -o ${TOMCAT8_USER} -g adm -d /var/log/${TOMCAT8_USER}/ # ln -s /var/log/${TOMCAT8_USER}/ ${CATALINA_HOME}/logs # systemctl restart tomcat8.service

Baptiste MOINE 39 Installation de CAS Server v5 Par la suite et pour la durée du projet uniquement, afin de simplifier les éventuels déploiements à répétition de CAS, il est possible de créer une fonction pour le déploiement rapide de CAS :

# cat <<-'EOF' >>~/.bash_profile # Déploiement rapide de CAS function cas-deploy { rm -rf /etc/chl/cas5/ /opt/cas-server-5/target/ $ {CATALINA_HOME}/webapps/cas* ${CATALINA_HOME}/{logs,work} /var/{cache,log}/$ {TOMCAT8_USER}/; install -m 750 -o ${TOMCAT8_USER} -g adm -d /var/{cache,log}/$ {TOMCAT8_USER}/; ln -s /var/log/${TOMCAT8_USER}/ ${CATALINA_HOME}/logs; ln -s /var/cache/${TOMCAT8_USER}/ ${CATALINA_HOME}/work; systemctl restart tomcat8.service && pushd /opt/cas-server-5/ && mvn clean package -e && cp /opt/cas-server-5/target/cas.war ${CATALINA_HOME}/webapps/ && install -m 755 -o root -g root -d /etc/chl/ && install -m 750 -o ${TOMCAT8_USER} -g ${TOMCAT8_GROUP} -d /etc/chl/cas5/ && install -m 640 -o ${TOMCAT8_USER} -g ${TOMCAT8_GROUP} {.,}/etc/chl/cas5/log4j2.xml && cp -R {.,}/etc/chl/cas5/config/ && cp -R {.,}/etc/chl/cas5/services/ && chmod -R 640 /etc/chl/cas5/{config,services}/ && chown -R ${TOMCAT8_USER}:${TOMCAT8_GROUP} /etc/chl/cas5/{config,services}/ && chmod 750 /etc/chl/cas5/{config,services}/ && systemctl restart tomcat8.service && popd }

EOF

Note : Comme décrit dans les premières instructions de la fonction, la suppression des journaux et des caches est faite afin de ne pas encombrer le support de stockage dû à une conservation superflue des journaux d’événements de CAS pendant la réalisation du PoC.

Baptiste MOINE 40 Installation de CAS Server v5 AJOUT D’UN FRONTAL AVEC APACHE HTTP Afin d’agir comme un pare-feu, l’ajout d’un service Apache en frontal permettra non seulement de traiter l’ensemble des requêtes adressées (ou non) à Apache Tomcat, de les filtrer, gérer les autorisations, la journalisation des accès, mais surtout, rendre accessible le service d’authentification sur le port 80/tcp et forcer l’utilisation d’une communication sécurisée exploitant le protocole HTTPS sur le port 443/tcp au moyen du mécanisme HTTP Strict Transport Security (HSTS). Installation Recherche de la dernière version stable d’Apache HTTP :

# apt-cache policy ^apache2+$

La dernière version majeure d’Apache HTTP, au moment de la recherche, est la version 2.4. Parmi les différentes versions listées, des suffixes « bpo8 » sont utilisés pour indiquer qu’il s’agit d’une version rétroportée, c’est-à-dire une version du paquet ayant été recompilé depuis la branche testing ou unstable. Les autres versions sont des versions stables et disposent de mises à jour en fonction de la branche du référentiel de Debian Jessie. Installation de la dernière version stable d’Apache HTTP :

# apt-get install apache2=2.4.10-10+deb8u7 libapache2-mod-jk=1:1.2.37-4+deb8u1

Baptiste MOINE 41 Installation de CAS Server v5 Fichiers de configuration d’Apache HTTP La structure des fichiers de configuration d’Apache HTTP est composée comme suit :

/etc/apache2/ ├─── apache2.conf ├─── conf-available/ │ ├─── charset.conf │ ├─── javascript-common.conf │ ├─── localized-error-pages.conf │ ├─── other-vhosts-access-log.conf │ ├─── security.conf │ └─── serve-cgi-bin.conf ├─── conf-enabled/ ├─── envvars ├─── magic ├─── mods-available/ ├─── mods-enabled/ ├─── ports.conf ├─── sites-available/ │ ├─── 000-default.conf │ └─── default-ssl.conf └─── sites-enabled/ apache2.conf Il s’agit du fichier principal pour la configuration du service HTTP. La plupart des configurations peuvent être faites directement dans ce fichier, mais il est recommandé d’utiliser des fichiers séparés. Ce fichier est le premier à être lu et procède à l’inclusion récursive des autres fichiers de configuration. conf-available/ Ce répertoire contient des fichiers spécifiques à différents aspects de la configuration d’Apache HTTP. Par exemple, on retrouve le fichier security.conf qui permet de définir l’ensemble des paramètres de configurations permettant la sécurisation du service HTTP. conf-enabled/ Ce répertoire contient les fichiers de configuration activés, c’est-à-dire qu’ils vont être inclus dans la configuration effective du service HTTP. Ces fichiers sont sous la forme de liens symboliques et pointent vers le fichier associé dans le répertoire conf-available. Ces liens peuvent être créés manuellement ou en utilisant les commandes a2enconf ou a2disconf. envvars Ce fichier est utilisé afin de spécifier les différentes variables contextuelles d’environnement à exporter.

Baptiste MOINE 42 Installation de CAS Server v5 magic Ce fichier décrit la configuration du module mod_mime_magic utilisé pour déterminer le type MIME d’un fichier. Tout comme la commande UNIX file, le module se base sur l’analyse des premiers octets du fichier pour déterminer le magic number et d’autres informations permettant de savoir quel est le type de contenu du fichier. Par exemple :

0 string #!/bin/sh application/x-shellscript

Cette règle indique que : • À partir du tout premier octet (1 indiquerait que l’on commence à partir du deuxième) ; • On recherche une chaîne de caractère ; • Dont le contenu correspond à « #!/bin/sh » ; • Si ce type de contenu est trouvé, alors le type MIME correspondant est « application/x-shellscript ». mods-available/ Ce répertoire contient des fichiers spécifiques à la configuration et le chargement de modules d’Apache HTTP. Par exemple, on retrouve le fichier proxy_ajp.load qui permet de demander le chargement du module AJP. mods-enabled/ Ce répertoire contient les fichiers de configuration des modules activés. Ces fichiers sont sous la forme de liens symboliques et pointent vers le fichier associé dans le répertoire mods-available. Ces liens peuvent être créés manuellement ou en utilisant les commandes a2enmod ou a2dismod. ports.conf Ce fichier est utilisé afin de spécifier les ports sur lesquels les hôtes virtuels (vhosts) vont écouter. sites-available/ Ce répertoire contient les fichiers de configuration des hôtes virtuels (vhosts) permettant de décrire les différentes applications WEB. sites-enabled/ Ce répertoire contient les fichiers de configuration des vhosts activés. Ces fichiers sont sous la forme de liens symboliques et pointent vers le fichier associé dans le répertoire sites-available. Ces liens peuvent être créés manuellement ou en utilisant les commandes a2ensite ou a2dissite.

Baptiste MOINE 43 Installation de CAS Server v5 Configuration Hardening d’Apache HTTP Modules Désactivation du module d’indexation, utilisé pour lister le contenu d’un répertoire :

# a2dismod autoindex

Désactivation du module de statut du service, utilisé pour des besoins statistiques ou de monitoring :

# a2dismod status

Activation du module headers, utilisé pour modifier les en-têtes des requêtes et des réponses HTTP :

# a2enmod headers

Baptiste MOINE 44 Installation de CAS Server v5 security.conf Désactivation de l’affichage de la version du service sur les pages d’erreur :

# sed -i 's@\(^ServerTokens\).*@\1 Prod@' /etc/apache2/conf- available/security.conf

Désactivation de l’affichage de la version dans l’en-tête HTTP « Server » :

# sed -i '{s@\(^ServerSignature\)@#\1@;s@^#\(ServerSignature Off\)@\1@}' /etc/apache2/conf-available/security.conf

Désactivation de la méthode HTTP TRACE, utilisée afin de vérifier l’activité du service. Ce type de requête présente un vecteur d’attaque important lors d’attaque de type XSS. Ainsi, une requête HTTP exploitant cette méthode recevra en réponse le code « 405 Method not Allowed » :

# sed -i '{s@\(^TraceEnable\)@#\1@;s@^#\(TraceEnable Off\)@\1@}' /etc/apache2/conf-available/security.conf

Cette méthode retourne le contenu d’une requête envoyée au service HTTP. Par exemple :

# cat <<-'EOF' | nc cas.miletrie.lan 80 TRACE / HTTP/1.0 Host: cas.miletrie.lan User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3 Connection: keep-alive Cache-Control: max-age=0 Cookie: PHPSESSID=SESSIONCOOKIESETFROMPHP

EOF

Baptiste MOINE 45 Installation de CAS Server v5 La réponse du serveur HTTP sera :

HTTP/1.1 200 OK Date: Tue, 08 Nov 2016 16:16:50 GMT Server: Apache/2.4.10 (Debian) Connection: close Content-Type: message/http

TRACE / HTTP/1.0 Host: cas.miletrie.lan User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3 Connection: keep-alive Cache-Control: max-age=0 Cookie: PHPSESSID=SESSIONCOOKIESETFROMPHP

Protection contre les attaques par clickjacking en interdisant l’insertion d’une page fournie par le service HTTP, dans un cadre d’insertion (frame) :

# sed -i 's@#\(Header set X-Frame-Options: "sameorigin"\).*@\1@' /etc/apache2/conf-available/security.conf

Baptiste MOINE 46 Installation de CAS Server v5 Redémarrage d’Apache HTTP et vérification du service :

# systemctl restart apache2.service # cat <<-'EOF' | nc cas.miletrie.lan 80 TRACE / HTTP/1.0 Host: cas.miletrie.lan User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate Connection: keep-alive Cache-Control: max-age=0 Cookie: PHPSESSID=SESSIONCOOKIESETFROMPHP

EOF

La réponse du service HTTP est à présent :

HTTP/1.1 405 Method Not Allowed Date: Tue, 08 Nov 2016 16:18:35 GMT Server: Apache Allow: Content-Length: 223 Keep-Alive: timeout=5, max=100 Connection: Keep-Alive Content-Type: text/html; charset=iso-8859-1

405 Method Not Allowed

Method Not Allowed

The requested method TRACE is not allowed for the URL /.

Baptiste MOINE 47 Installation de CAS Server v5 Configuration du module JK

# sed -i '{ s@\(workers\.tomcat_home=\).*@\1'${CATALINA_HOME}'@; # Chemin d'accès à Tomcat s@\(workers\.java_home=\).*@\1'${JAVA_HOME}'@; # Chemin d'accès à Java s@\(worker\.list=\).*@\1cas@; # Modification du nom de worker en cas /worker\.list/,/worker\.loadbalancer/{ # Tâches entre la liste des workers et la configuration du load balancer /worker\.list/b; # Ne remplace pas la première ligne /worker\.loadbalancer/b; # Ne remplace pas la dernière ligne s@\(worker\.\)[^\.]*\(.*\)@\1cas\2@ # Remplace le nom du worker } s@\(worker\.cas.port=\).*@\18009@; # Port JDC Tomcat s@\(worker\.cas.host=\).*@\1localhost@; s@\(worker\.cas.type=\).*@\1ajp13@ }' /etc/libapache2-mod-jk/workers.properties

Baptiste MOINE 48 Installation de CAS Server v5 Création des vhosts pour Apache Tomcat HTTP Activation du module rewrite :

# a2enmod rewrite

Création d’un vhost en écoute sur le port 80/tcp pour rediriger vers le port 443/tcp :

# cat <<-'EOF' >/etc/apache2/sites-available/http.conf ### # Configuration du service # ServerName cas.miletrie.lan ServerAdmin [email protected]

### # Redirection sur HTTPS et sur le vhost CAS # RewriteEngine On RewriteCond %{HTTPS} off RewriteRule (.*) https://cas.miletrie.lan%{REQUEST_URI}

EOF

Baptiste MOINE 49 Installation de CAS Server v5 HTTPS Activation du module ssl :

# a2enmod ssl

Création d’une clé privée pour la signature du certificat :

# mkdir ~/.ssl/ # pushd ~/.ssl/ # openssl genrsa -aes256 -out server.key 4096

Création d’une Certificate Signing Request (CSR) contenant une signature du serveur ainsi que des informations publiques (c.-à-d. Pays, Nom (CN), localisation) :

# openssl req -new -key server.key -out cas.miletrie.lan.csr

Information du certificat Valeur

Nom court du pays FR

Nom complet du pays France

Ville Poitiers

Nom de l’organisation Centre Hospitalier Henri Laborit

Unité de l’organisation DSIO

Nom du service (FQDN) cas.miletrie.lan

Adresse e-mail [email protected] Signature du certificat :

# openssl x509 -req -days 365 -in cas.miletrie.lan.csr -signkey server.key -out cas.miletrie.lan.crt

Copie du certificat dans le répertoire prévu à cet effet :

# install -m 755 -o root -g root -d /etc/ssl/certs/ # install -m 710 -o root -g ssl-cert -d /etc/ssl/private/ # install -m 644 -o root -g root {.,/etc/ssl/certs}/cas.miletrie.lan.crt # install -m 640 -o root -g ssl-cert {.,/etc/ssl/private}/server.key

Baptiste MOINE 50 Installation de CAS Server v5 Suppression des anciens certificats et du répertoire « .ssl/ » :

# rm /etc/ssl/certs/ssl-cert-snakeoil.pem /etc/ssl/private/ssl-cert- snakeoil.key # popd # rm -rf ~/.ssl/

Préparation du HTTP Public Key Pinning (HPKP) :

# openssl x509 -noout -in /etc/ssl/certs/cas.miletrie.lan.crt -pubkey | \ openssl asn1parse -noout -inform pem -out public.key; \ openssl dgst -sha256 -binary public.key | \ openssl enc -base64; \ rm public.key

Création d’un vhost en écoute sur le port 443/tcp pour la communication AJP avec Tomcat :

# cat <<-'EOF' >/etc/apache2/sites-available/https.conf ### # Configuration du service # ServerName cas.miletrie.lan ServerAdmin [email protected]

### # Journalisation # ErrorLog ${APACHE_LOG_DIR}/cas.error.log CustomLog ${APACHE_LOG_DIR}/cas.access.log combined ### # Activation du module SSL # SSLEngine on SSLProtocol ALL -SSLv2 -SSLv3 SSLHonorCipherOrder On SSLCipherSuite ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+A ES:!aNULL:!MD5:!DSS

Baptiste MOINE 51 Installation de CAS Server v5 SSLCertificateFile /etc/ssl/certs/cas.miletrie.lan.crt SSLCertificateKeyFile /etc/ssl/private/server.key SSLVerifyClient none

# HSTS pour 1 an sur tous les sous-domaines Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" env=HTTPS

# HPKP pour 60 jours Header set Public-Key-Pins "pin- sha256=\"EY5YKJpjOwmV9asoRLNT/ROAFmGBVk5uEz7xziU7rRA=\"; max-age=5184000" env=HTTPS

### # CAS # # Force la redirection de la racine (uniquement !) sur /cas RedirectMatch 301 ^/$ /cas

# Monte cas sur l'URL /cas via AJP JkMount /cas cas JkMount /cas/* cas

EOF

Désactivation du vhost par défaut et activation des nouveaux :

# a2dissite 000-default # a2ensite http https

Configuration de Tomcat Afin de rendre le montage du module JK, il est nécessaire d’activer le connecteur AJP sur Tomcat, pour cela, vérifier en dé-commentant, si besoin, la directive suivante :

Baptiste MOINE 52 Installation de CAS Server v5 Configuration de CAS Modification du nom de serveur de CAS :

# sed -i 's#\(cas.server.name=\).*#\1cas.miletrie.lan:8080#' ./etc/chl/cas5/config/cas.properties # sed -i 's#\(cas.server.prefix=\).*#\1${cas.server.name}/cas#' ./etc/chl/cas5/config/cas.properties # sed -i 's#\(cas.host.name=\).*#\1cas.miletrie.lan#' ./etc/chl/cas5/config/cas.properties

Note : L’URL d’accès à l’application CAS sera dorénavant http://cas.miletrie.lan/cas, la redondance du terme « cas » sera supprimée en production en remplaçant le nom du serveur par « id ». Création d’un nouveau commit et envoi des modifications sur le dépôt fork :

# git add ./etc/chl/cas5/config/cas.properties # git commit --message "Mise à jour du port d'écoute de CAS et du nom d'hôte" # git push --set-upstream origin master

Baptiste MOINE 53 Installation de CAS Server v5 Tests Redémarrage d’Apache HTTP et redéploiement de CAS :

# systemctl restart apache2.service # cas-deploy

Remarque : L’utilisation d’une clé SSL/TLS protégée par une passphrase nécessite un déverrouillage, ainsi, si elle est définie, lors du redémarrage du service HTTP, il sera demandé la saisie de la passphrase. Afin de vérifier l’état de fonctionnement des deux vhosts, nous allons préparer une requête sur l’adresse http://cas/ qui devrait rediriger en plusieurs étapes vers l’adresse https://cas.miletrie.lan/cas/login :

# curl --insecure --silent --include --location --head --header "User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0" --url "http://cas/"

• La première réponse indique que les mécanismes de HSTS (ajout de l’en-tête « Strict-Transport-Security »), HPKP (ajout de l’en-tête « Public-Key-Pins ») et la redirection vers HTTPS (Code 302 Found) sont fonctionnels :

HTTP/1.1 302 Found Date: Tue, 08 Nov 2016 16:19:45 GMT Server: Apache Location: https://cas.miletrie.lan/ Content-Type: text/html; charset=iso-8859-1

• La deuxième réponse correspond effectivement à la redirection effectuée par la directive permettant de rediriger sur « /cas » (Code 301 Moved Permanently) :

HTTP/1.1 301 Moved Permanently Date: Tue, 08 Nov 2016 16:19:45 GMT Server: Apache Location: https://cas.miletrie.lan/cas Content-Type: text/html; charset=iso-8859-1

Baptiste MOINE 54 Installation de CAS Server v5 • La troisième réponse correspond à une redirection sur « /cas/ » :

HTTP/1.1 302 302 Date: Tue, 08 Nov 2016 16:19:45 GMT Server: Apache Location: /cas/ X-Frame-Options: sameorigin Strict-Transport-Security: max-age=31536000; includeSubDomains; preload Public-Key-Pins: pin-sha256="+F1qAHf9QaHi2oBAcua8N2OcNoys6fZEp319xiR+89s="; max-age=5184000

• La quatrième réponse indique une redirection vers « /cas/login » issue de l’application CAS dont l’accès se fait par AJP vers le service Tomcat (ajout d’un en- tête « X-Application-Context »). Cette réponse permet de valider le fonctionnement du lien AJP, du service Tomcat et de l’application CAS :

HTTP/1.1 302 302 Date: Tue, 08 Nov 2016 16:19:45 GMT Server: Apache X-Application-Context: cas:native:8443 Location: /cas/login Content-Language: fr-FR X-Frame-Options: sameorigin Strict-Transport-Security: max-age=31536000; includeSubDomains; preload Public-Key-Pins: pin-sha256="+F1qAHf9QaHi2oBAcua8N2OcNoys6fZEp319xiR+89s="; max-age=5184000

Baptiste MOINE 55 Installation de CAS Server v5 • Enfin la dernière réponse correspond à la page d’authentification de CAS, distinguable grâce à l’en-tête « Content-Type » indiquant qu’il s’agit d’une page HTML (« text/html ») :

HTTP/1.1 200 200 Date: Tue, 08 Nov 2016 16:19:45 GMT Server: Apache X-Application-Context: cas:native:8443 Cache-Control: no-store Content-Language: fr-FR Content-Length: 8699 Vary: Accept-Encoding X-Frame-Options: sameorigin Strict-Transport-Security: max-age=31536000; includeSubDomains; preload Public-Key-Pins: pin-sha256="+F1qAHf9QaHi2oBAcua8N2OcNoys6fZEp319xiR+89s="; max-age=5184000 Content-Type: text/html;charset=UTF-8

Baptiste MOINE 56 Installation de CAS Server v5 CRÉATION D’UN ENVIRONNEMENT DE TEST POUR L’AUTHENTIFICATION SANS MULTIFACTEUR Suite à l’installation de notre service d’authentification centralisé, il peut être intéressant de valider son fonctionnement en utilisant, par exemple, le protocole Kerberos pour l’authentification des clients sur le portail et développer une application simple pour prendre en charge l’authentification du client par l’intermédiaire de CAS en s’appuyant sur le mécanisme SPNEGO (protocole négociant au choix une authentification avec NTLM ou Kerberos). Pour mettre en place cet environnement de test, il sera nécessaire de : • Installer et configurer un service d’annuaire permettant de contenir notre base d’utilisateurs, ici nous avons fait le choix d’Active Directory, mais l’utilisation d’OpenLDAP est tout à fait envisageable ; • Installer et configurer un service Kerberos comprenant plusieurs services, notamment : ◦ Un service de distribution de clés (KDC pour « Key Distribution Center ») ; ◦ Un service d’authentification (AS pour « Authentication Service ») ; ◦ Un service d’attribution de tickets (TGS pour « Ticket-Granting Service »). • Mettre à jour le flux d’authentification (« Login Webflow ») associé à CAS afin de supporter la négociation de tickets Kerberos ; • Intégrer un ordinateur client au domaine ; • Déployer une application de test basée sur phpCAS (par exemple).

Baptiste MOINE 57 Installation de CAS Server v5 Installation d’Active Directory sous Windows Server 2016 Pour commencer l’installation du service d’annuaire Active Directory, il est préférable (mais pas nécessaire !) de procéder à l’installation de Windows Server en mode « Expérience Utilisateur », ceci permettant de bénéficier des outils d’administration graphique et d’un environnement plus accessible pour l’administration, à noter que ce type d’installation nécessitera de plus de ressources physiques (et virtuelles s’il s’agit d’un environnement virtualisé) qu’une installation simple avec un accès console. Préparation du système Configuration du nom d’hôte

> netdom renamecomputer $env:computername /Newname "SRV-DC1" > netsh interface ip set address "Ethernet" static 172.16.57.146 255.255.0.0 172.16.10.1 > netsh interface ip add dns "Ethernet" 172.16.10.32 index=1 > netsh interface ip add dns "Ethernet" 172.16.10.33 index=2 > shutdown -r -t 00 -c "Modification du nom d'hôte et de la configuration IPv4"

Installation des services de domaine Active Directory et des outils d’administration Ayant besoin d’un service d’authentification basé sur Kerberos 5, l’installation du service AD LDS (« Active Directory Lightweight Directory Service ») ne serait pas suffisante, il est donc nécessaire d’installer les services AD DS (« Active Directory Directory Service ») embarquant entre autre le service Kerberos (source : https://social.technet.microsoft.com/Forums/en-US/db8d16d7-c959-47d3-bee0- a7b0f36a2c75/kerberos-service-not-running-on-ad-lds-server?forum=winserverDS). Les services de domaine Active Directory (AD DS) stockent des informations sur les utilisateurs, les ordinateurs et les périphériques sur le réseau. Ils permettent également aux administrateurs de gérer ces informations de façon sécurisée et facilitent le partage des ressources et la collaboration entre les utilisateurs. L’installation des services de domaine Active Directory utilise le Gestionnaire de serveur et Windows PowerShell, comme tous les autres rôles et fonctionnalités dans Windows Server 2012. À noter que l’assistant graphique dans le « Gestionnaire de serveur » ou le module « ServerManager » pour Windows PowerShell sont à la fois exploitables en local, mais également à distance. S’agissant d’une évolution majeure dans la gestion des services de Windows Server, un maximum de processus de déploiement Windows PowerShell seront effectués et décrit dans la suite de ce guide.

Baptiste MOINE 58 Installation de CAS Server v5 Quelques règles de bonnes pratique : • Afin de veiller à la disponibilité des services de domaine Active Directory et assurer une continuité de services aux utilisateurs en cas de panne du serveur, l’installation d’un minimum de deux contrôleurs de domaine par domaine est conseillée par Microsoft ; • Les services AD DS nécessitant qu’un serveur DNS soit installé sur le réseau et accessible en écriture par les services d’annuaire Active Directory, une réplication de celui-ci sera également conseillée. Dans notre cas, l’installation d’un unique serveur sera amplement nécessaire puisqu’il ne s’agit que d’un environnement de test qui sera de toute manière retravaillé pour être mis en production.

> [string[]]$InstallFeatures = @() > $InstallFeatures += "AD-Domain-Services" > $InstallFeatures += "RSAT-ADDS-Tools" > $InstallFeatures += "RSAT-AD-AdminCenter" > $InstallFeatures += "RSAT-ADLDS" > $InstallFeatures += "RSAT-AD-PowerShell" > $InstallFeatures += "RSAT-AD-Tools" > $InstallFeatures += "RSAT-ADDS" > Add-WindowsFeature $InstallFeatures

Ajout d’une nouvelle forêt « miletrie.lan » Pour les tests et afin de ne pas perturber l’environnement de production, la création d’une nouvelle forêt « miletrie.lan » sera effectuée.

> Import-Module ADDSDeployment > Install-ADDSForest -CreateDnsDelegation:$false -DatabasePath "D:\NTDS" -DomainMode "Win2012R2" -DomainName "miletrie.lan" -DomainNetbiosName "MILETRIE" -ForestMode "Win2012R2" -InstallDns:$true -LogPath "D:\Logs" -NoRebootOnCompletion:$false -SafeModeAdministratorPassword $(Read-Host -Prompt "Mot de passe de restauration des services d'annuaire (DSRM)" -AsSecureString | ConvertTo-SecureString -AsPlainText -Force) -SysvolPath "D:\SYSVOL" -Confirm -Verbose

Ici, la question de créer une délégation de zone DNS ne se pose pas puisqu’il s’agit de la zone racine.

Baptiste MOINE 59 Installation de CAS Server v5 La dernière commande devrait retourner ce type de message :

Créez une forêt Active Directory avec le nom « miletrie.lan ». Configurez ce serveur en tant que premier contrôleur de domaine Active Directory d’une nouvelle forêt. Le nouveau nom de domaine est « miletrie.lan ». C’est aussi le nom de la nouvelle forêt. Nom NetBIOS du domaine : MILETRIE Niveau fonctionnel de la forêt : Windows Server 2012 R2 Niveau fonctionnel du domaine : Windows Server 2012 R2 Options supplémentaires : • Catalogue global : Oui • Serveur DNS : Oui • Créer une délégation DNS : Non Dossier de la base de données : D:\NTDS Dossier des fichiers journaux : D:\Logs Dossier SYSVOL : D:\SYSVOL Le service Serveur DNS sera configuré sur cet ordinateur. Cet ordinateur sera configuré pour utiliser ce serveur DNS en tant que serveur DNS préféré. Le mot de passe du nouvel administrateur de domaine sera le même que celui de l’administrateur local de cet ordinateur.

Baptiste MOINE 60 Installation de CAS Server v5 Vérification des services réseau Afin de vérifier que chacun des services souhaités est effectivement installé et fonctionnel, il est possible de vérifier les ports d’écoute du serveur et croiser ces informations avec les processus et services en cours d’exécution :

> netstat -ano | findstr "LISTENING" > tasklist /SVC

Le croisement de ces informations nous permet de déduire cette liste :

Protocole Adresse locale Adresse État Description distante

TCP 127.0.0.1:53 0.0.0.0:0 LISTENING Domain Name Service

TCP 172.16.57.146:53 0.0.0.0:0 LISTENING Domain Name Service

TCP 172.16.57.146:13 0.0.0.0:0 LISTENING NETBIOS Session Service 9

TCP 0.0.0.0:88 0.0.0.0:0 LISTENING Kerberos

TCP 0.0.0.0:135 0.0.0.0:0 LISTENING DCE endpoint resolution

TCP 0.0.0.0:389 0.0.0.0:0 LISTENING Lightweight Directory Access Protocol

TCP 0.0.0.0:445 0.0.0.0:0 LISTENING Microsoft CIFS

TCP 0.0.0.0:464 0.0.0.0:0 LISTENING Kerberos (v5)

TCP 0.0.0.0:593 0.0.0.0:0 LISTENING Remote Procedure Call

TCP 0.0.0.0:636 0.0.0.0:0 LISTENING LDAP over TLS/SSL

TCP 0.0.0.0:3268 0.0.0.0:0 LISTENING Microsoft Global Catalog

TCP 0.0.0.0:3269 0.0.0.0:0 LISTENING Microsoft Global Catalog over SSL

TCP 0.0.0.0:5985 0.0.0.0:0 LISTENING Windows Remote Management Service

TCP 0.0.0.0:9389 0.0.0.0:0 LISTENING Active Directory Web Services

TCP 0.0.0.0:47001 0.0.0.0:0 LISTENING Windows Remote Management Service Le service DNS, LDAP et Kerberos sont donc bien exécutés.

Baptiste MOINE 61 Installation de CAS Server v5 Configuration du service DNS Validation du fonctionnement du service DNS et liste des RR actuels Les RR correspondent à un enregistrement dans la zone DNS, ils peuvent être de différents types dont la liste complète est référencée par l’IANA (http://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml) :

> Import-Module DnsServer > Get-DnsServerResourceRecord -ZoneName "miletrie.lan" -RRType "SRV" > Get-DnsServerResourceRecord -ZoneName "miletrie.lan" -Name "SRV-DC1" -RRType "A"

Ajout d’enregistrements sur le service DNS Ici, nous allons ajouter un enregistrement (RR de type « A ») associé au serveur CAS et au serveur d’application de test (on l’appellera « Appli1 ») :

> Add-DnsServerResourceRecordA -Name "cas" -ZoneName "miletrie.lan" -AllowUpdateAny -IPv4Address "172.16.57.144" -TimeToLive 01:00:00 > Add-DnsServerResourceRecordA -Name "appli1" -ZoneName "miletrie.lan" -AllowUpdateAny -IPv4Address "172.16.57.148" -TimeToLive 01:00:00

Baptiste MOINE 62 Installation de CAS Server v5 Configuration de l’annuaire Création d’unités d’organisation Plusieurs unités d’organisation seront créés afin de faciliter la maintenance de l’annuaire :

> New-ADOrganizationalUnit -Name "Utilisateurs" -Path "DC=miletrie,DC=lan" > New-ADOrganizationalUnit -Name "Personnel CHL" -Path "OU=Utilisateurs,DC=miletrie,DC=lan" > New-ADOrganizationalUnit -Name "Applications" -Path "OU=Utilisateurs,DC=miletrie,DC=lan"

L’arborescence de l’annuaire sera donc tel que :

miletrie.lan ├─── Computers # Ordinateurs du domaine ├─── Domain Controllers # Contrôleurs du domaine └─── Utilisateurs # Utilisateurs du domaine ├─── Applications # Comptes de services du domaine └─── Personnel CHL # Comptes d’utilisateurs du domaine

Ajout d’un utilisateur bmoine à l’annuaire avec support pour le chiffrement AES128 et AES256 Chaque utilisateur possède des attributs qui sont décrits en fonction d’un schéma associé à l’annuaire. L’attribut « msDC-SupportedEncryptionTypes » permet de définir les algorithmes de chiffrement supportés, pour cela, il suffit d’additionner les bits correspondant et de donner cette valeur à cet attribut. Les bits correspondant sont tels que :

Algorithmes Valeur hexadécimale

DES-CBC-CRC 0x01

DES-CBC-MD5 0x02

RC4-HMAC 0x04

AES128-CTS-HMAC-SHA1-96 0x08

AES256-CTS-HMAC-SHA1-96 0x10 Ici, nous allons restreindre l’utilisation du chiffrement aux seuls algorithmes AES128 et AES256, donc : 0x08 + 0x10 = 0x18 (1 * 16^1) + (8 * 16^0) = 16 + 8 = 24

Baptiste MOINE 63 Installation de CAS Server v5 S’agissant d’un nouvel utilisateur, il est possible de spécifier les algorithmes à utiliser directement en texte clair lors de sa création :

> New-ADUser "bmoine" -GivenName "Baptiste" -Surname "MOINE" -DisplayName "Baptiste MOINE" -UserPrincipalName "[email protected]" -AccountPassword $ (Read-Host -Prompt "Mot de passe de pour l'utilisateur bmoine" -AsSecureString) -ChangePasswordAtLogon $False -Enabled $True -Path "OU=Personnel CHL,OU=Utilisateurs,DC=miletrie,DC=lan" -KerberosEncryptionType "AES128, AES256"

Vérification des algorithmes utilisés Afin de simplifier la vérification sur l’ensemble des utilisateurs, le script suivant permet de sortir un tableau listant les algorithmes utilisables associés à chacun des utilisateurs de l’annuaire :

> $Users = Get-ADUser -Filter * -SearchBase "OU=Personnel CHL,OU=Utilisateurs,DC=miletrie,DC=lan" -Properties "msDS- SupportedEncryptionTypes" > ForEach ($User in $Users) { $EncryptionAlgorithm = New-Object System.Collections.Specialized.OrderedDictionary @{ "DES-CBC-CRC"=0x01; "DES-CBC-MD5"=0x02; "RC4-HMAC"=0x04; "AES128-CTS-HMAC-SHA1-96"=0x08; "AES256-CTS-HMAC-SHA1-96"=0x10 }.GetEnumerator()| ForEach-Object { $EncryptionAlgorithm.Add($_.Name, @("Non","Oui")[(($User."msDS- SupportedEncryptionTypes") -bor $_.Value) -eq ($User."msDS- SupportedEncryptionTypes")]) } Write-Host "Utilisateur $($User.UserPrincipalName) :" Write-Host "$($EncryptionAlgorithm.GetEnumerator() | Sort-Object Name -Descending | Format-Table @{Expression={$_.Name};Label="Algorithme de chiffrement"},@{Expression={$_.Value};Label="Supporté par l'utilisateur"} | Out-String)" }

Baptiste MOINE 64 Installation de CAS Server v5 Par exemple, pour l’utilisateur bmoine, le tableau retourné est le suivant :

Algorithme de chiffrement Supporté par l’utilisateur

RC4-HMAC Non

DES-CBC-MD5 Non

DES-CBC-CRC Non

AES256-CTS-HMAC-SHA1-96 Oui

AES128-CTS-HMAC-SHA1-96 Oui Ajout de l’utilisateur bmoine au groupe « Opérateurs de compte » pour permettre l’intégration de postes au domaine :

> ADD-ADGroupMember "Opérateurs de compte" –members "bmoine"

Création d’un compte de service pour CAS

> New-ADUser "cas" -DisplayName "CAS Server Principle Name" -UserPrincipalName "[email protected]" -AccountPassword $(Read-Host -Prompt "Mot de passe de pour l'utilisateur cas" -AsSecureString) -ChangePasswordAtLogon $False -Enabled $True -Path "OU=Applications,OU=Utilisateurs,DC=miletrie,DC=lan" -KerberosEncryptionType "AES128, AES256"

Baptiste MOINE 65 Installation de CAS Server v5 Génération d’un keytab L’outil ktpass permet à un administrateur de configurer un service Kerberos différent de Windows Server comme un security principal dans Windows Server en générant un keytab Kerberos contenant un ou plusieurs secrets partagés (« shared secret key ») entre le serveur Kerberos et le service. Dans un premier temps, nous allons créer un keytab, contenant une clé partagée pour chacun des protocoles de chiffrement :

> ktpass /out cas.keytab /princ HTTP/[email protected] /pass +rndPass /mapuser [email protected] /ptype KRB5_NT_PRINCIPAL /crypto All

Ici, le mot de passe est utilisé uniquement comme un nonce permettant de générer les clés en améliorant l’entropie et n’est pas utilisé pour chiffrer ce keytab. L’option « /mapuser » permet d’indiquer le compte de service associé à ce service, on parle de SPN (« Service Principal Name »). Ses attributs seront mis à jour en conséquence.

Baptiste MOINE 66 Installation de CAS Server v5 Installation de Kerberos sur le serveur CAS Installation de Kerberos

# debconf-set-selections <<< "krb5-config krb5-config/default_realm string MILETRIE.LAN" # debconf-set-selections <<< "krb5-config krb5-config/kerberos_servers string srv-dc1.miletrie.lan" # debconf-set-selections <<< "krb5-config krb5-config/admin_server string srv- dc1.miletrie.lan" # apt-get -fy install krb5-user

Copie du keytab sur le serveur CAS

# install -o root -g tomcat8 -m 750 -d /opt/cas-server-5/etc/chl/cas5/kerberos/ # install -o root -g tomcat8 -m 640 {,/opt/cas-server- 5/etc/chl/cas5/kerberos/}cas.keytab

Modification du keytab pour ne garder que AES128 et AES256

# ktutil ktutil> read_kt /opt/cas-server-5/etc/chl/cas5/kerberos/cas.keytab ktutil> list -t -k -e ktutil> delete_entry 1 ktutil> delete_entry 1 ktutil> delete_entry 1 ktutil> write_kt /opt/cas-server-5/etc/chl/cas5/kerberos/cas.keytab.new ktutil> exit # mv /opt/cas-server-5/etc/chl/cas5/kerberos/cas.keytab{.new,}

Baptiste MOINE 67 Installation de CAS Server v5 Afin de prendre en compte l’ajout de ce keytab dans le déploiement de CAS, le script de déploiement rapide sera mis à jour dans ~/.bash_profile tel que :

function cas-deploy { rm -rf /etc/chl/cas5/ /opt/cas-server-5/target/ $ {CATALINA_HOME}/webapps/cas* ${CATALINA_HOME}/{logs,work} /var/{cache,log}/$ {TOMCAT8_USER}/; install -m 750 -o ${TOMCAT8_USER} -g adm -d /var/{cache,log}/$ {TOMCAT8_USER}/; ln -s /var/log/${TOMCAT8_USER}/ ${CATALINA_HOME}/logs; ln -s /var/cache/${TOMCAT8_USER}/ ${CATALINA_HOME}/work; systemctl restart tomcat8.service && pushd /opt/cas-server-5/ && mvn clean package -e && cp /opt/cas-server-5/target/cas.war ${CATALINA_HOME}/webapps/ && install -m 755 -o root -g root -d /etc/chl/ && install -m 750 -o ${TOMCAT8_USER} -g ${TOMCAT8_GROUP} -d /etc/chl/cas5/ && install -m 640 -o ${TOMCAT8_USER} -g ${TOMCAT8_GROUP} {.,}/etc/chl/cas5/log4j2.xml && cp -R {.,}/etc/chl/cas5/config/ && cp -R {.,}/etc/chl/cas5/services/ && cp -R {.,}/etc/chl/cas5/kerberos/ && chown -R ${TOMCAT8_USER}:${TOMCAT8_GROUP} /etc/chl/cas5/{config,services}/ && chown -R root:${TOMCAT8_GROUP} /etc/chl/cas5/kerberos/ && chmod -R 640 /etc/chl/cas5/{config,kerberos,services}/ && chmod 750 /etc/chl/cas5/{config,kerberos,services}/ && systemctl restart tomcat8.service && popd }

Baptiste MOINE 68 Installation de CAS Server v5 Configuration de Kerberos

# cat <<-'EOF' >/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 = MILETRIE.LAN ticket_lifetime = 24000 default_keytab_name = /etc/chl/cas5/kerberos/cas.keytab dns_lookup_realm = false dns_lookup_kdc = false forwardable = yes default_tkt_enctypes = aes256-cts des3-cbc-sha1 arcfour-hmac des-cbc-md5 des-cbc-crc default_tgs_enctypes = aes256-cts des3-cbc-sha1 arcfour-hmac des-cbc-md5 des-cbc-crc

[realms] MILETRIE.LAN = { kdc = srv-dc1.miletrie.lan admin_server = srv-dc1.miletrie.lan default_domain = MILETRIE.LAN }

[domain_realm] .miletrie.lan = MILETRIE.LAN miletrie.lan = MILETRIE.LAN

EOF

Baptiste MOINE 69 Installation de CAS Server v5 Test d’authentification Suppression des précédents tickets (optionnel) :

# kdestroy

Liste des clés dans le keytab :

# klist -k

Authentification avec le keytab :

# kinit -k HTTP/[email protected]

Liste des tickets :

# klist # Ticket cache: FILE:/tmp/krb5cc_0 # Default principal: HTTP/[email protected] # # Valid starting Expires Service principal # 12/28/16 10:49:00 12/28/16 17:29:00 krbtgt/[email protected]

Récupération d’un nouveau TGT pour l’utilisateur bmoine :

# kinit -V -p bmoine

Liste des tickets

# klist # Ticket cache: FILE:/tmp/krb5cc_0 # Default principal: [email protected] # # Valid starting Expires Service principal # 12/28/16 10:49:00 12/28/16 17:29:00 krbtgt/[email protected]

Baptiste MOINE 70 Installation de CAS Server v5 Mise à jour du chemin d’authentification de CAS Tout d’abord il faut vérifier que le fichier de provisioning Maven (pom.xml) dispose bien des instructions nécessaires à installer les dépendances nécessaires au fonctionnement de SPNEGO :

... ... org.apereo.cas 5.1.0-SNAPSHOT ... ... ${cas.groupId} cas-server-support-spnego ${cas.version} compile

${cas.groupId} cas-server-support-spnego-webflow ${cas.version} runtime ... ...

Baptiste MOINE 71 Installation de CAS Server v5 Ensuite, il est nécessaire de configurer CAS (cas.properties) afin qu’il soit correctement associé en tant que client Kerberos auprès de Windows Server en utilisant la configuration locale du client Kerberos (voir https://apereo.github.io/cas/5.0.x/installation/Configuration- Properties.html), à titre d’exemple, voici un extrait de la configuration :

# cat <<-'EOF' >>./etc/chl/cas5/config/cas.properties ## # Configuration pour l'authentification SPNEGO avec Kerberos et JCIFS # cas.authn.spnego.kerberosConf=/etc/krb5.conf cas.authn.spnego.jcifsServicePrincipal=HTTP/[email protected] cas.authn.spnego.kerberosKdc=172.16.57.146 cas.authn.spnego.ipsToCheckPattern=172.16.+ cas.authn.spnego.kerberosRealm=MILETRIE.LAN

EOF

Remarque : Pour créer les différentes clés de chiffrement et de signature des TGC et du WEBFlow (cas.webflow.encryption.key, cas.webflow.signing.key, cas.tgc.encryption.key et cas.tgc.signing.key), il est préférable de les générer manuellement :

# pushd /opt/ # git clone https://github.com/mitreid-connect/json-web-key-generator # pushd json-web-key-generator/ # mvn package # for (( i=1; i<=2; ++i )); do java -jar target/json-web-key-generator-0.4- SNAPSHOT-jar-with-dependencies.jar -s 512 -t oct -S -o /tmp/webflow.json; done # for (( i=1; i<=2; ++i )); do java -jar target/json-web-key-generator-0.4- SNAPSHOT-jar-with-dependencies.jar -s 512 -t oct -S -o /tmp/tgc.json; done # cat /tmp/{webflow,tgc}.json # popd # popd

Enfin, il suffit de créer un fichier « login-webflow.xml » contenant nos différentes actions, transitions, vues et décisions telles que décrites sur le Wiki d’Apereo (voir https://apereo.github.io/cas/5.0.x/installation/Webflow-Customization.html). Création d’un nouveau commit et envoi des modifications sur le dépôt fork :

# git add . # git commit --message "Mise en place de SPNEGO" # git push --set-upstream origin master

Baptiste MOINE 72 Installation de CAS Server v5 Ajout de miletrie.lan au registre de services

# cat <<-'EOF' >./etc/chl/cas5/services/miletrie-1002.json { /* Tous les services HTTP/HTTPS du domaine miletrie.lan */ "@class" : "org.apereo.cas.services.RegexRegisteredService" "serviceId" : ^https?://.*\.miletrie\.lan/.* "name" : "miletrie-lan" "id" : 1002 }

EOF

Création d’un nouveau commit et envoi des modifications sur le dépôt fork :

# git add . # git commit --message "Ajout de miletrie.lan au registre de services" # git push --set-upstream origin master

Déploiement de CAS :

# cas-deploy

Baptiste MOINE 73 Installation de CAS Server v5 Intégration d’un ordinateur client au domaine miletrie.lan Pour tester l’authentification Kerberos sur Appli1, il est nécessaire d’être client Kerberos du serveur Kerberos placé sur le contrôleur de domaine, pour cela, il est nécessaire d’intégrer l’ordinateur au domaine miletrie.lan. Intégration du poste au domaine, ici, l’ordinateur client fonctionne sous Microsoft Windows 7 et se nomme « Win7-PC » :

# netdom join Win7-PC /domain:miletrie.lan /userd:bmoine /passwordd:hdP$X7YdhNoE7wqodFowhEK2zfPQBj!f # shutdown -r -t 00 -c "Intégration du poste au domaine miletrie.lan"

Configuration du navigateur pour autoriser SPNEGO Firefox Dans la barre d’adresse du navigateur, saisir « about:config » et modifier la propriété « network.negotiate-auth.trusted-uris » en lui donnant pour valeur « cas.miletrie.lan ».

Illustration 2: about:config - Trusted URIs

Internet Explorer Dans les Options Internet (Win+R « inetcpl.cpl ») : • Dans l’onglet « Avancé », dans les paramètres de « Sécurité », vérifier que l’option « Activer l’authentification Windows intégrée » est cochée ; • Dans l’onglet « Sécurité », dans les « Sites » de la zone « Intranet local » (bouton « Avancé »), ajouter « https://cas.miletrie.lan ».

Illustration 3: Options Internet - Activation de l'authentification Windows intégrée

Baptiste MOINE 74 Installation de CAS Server v5 Déploiement d’une application de test basée sur phpCAS Pour déployer cette application de test, nous allons nous baser sur une nouvelle installation de Debian Jessie qui sera dédiée à la fourniture de l’application de test sur HTTP. Préparation du système Configuration de l’accès réseau Configuration des contrôleurs d’interfaces réseau et de la résolution de noms DNS :

# export HOSTNAME=appli1 # export DOMAIN=miletrie.lan # cat <<-EOF >/etc/network/interfaces # Loopback NIC auto lo iface lo inet loopback

# Ethernet NIC auto eth0 allow-hotplug eth0 iface eth0 inet static address 172.16.57.148 netmask 255.255.0.0 gateway 172.16.10.1 dns-search ${DOMAIN} dns-nameservers 172.16.57.146 172.16.10.32 172.16.10.33

EOF # ifdown eth0 && ifup eth0

Régénération du fichier /etc/resolv.conf :

# resolvconf -u || /etc/init.d/networking restart

Baptiste MOINE 75 Installation de CAS Server v5 Configuration du nom d’hôte Mise à jour du nom d’hôte associé au système :

# cat </etc/hostname ${HOSTNAME} EOF # cat </etc/hosts # IPv4 127.0.0.1 localhost 127.0.1.1 ${HOSTNAME}.${DOMAIN} ${HOSTNAME}

# IPv6 ::1 ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters

EOF # hostname ${HOSTNAME} # hostname -b ${HOSTNAME} # domainname ${HOSTNAME}.${DOMAIN} # domainname -b ${HOSTNAME}.${DOMAIN} # hostnamectl set-hostname ${HOSTNAME} # sysctl kernel.hostname # systemctl restart networking.service || /etc/init.d/networking restart

Baptiste MOINE 76 Installation de CAS Server v5 Installation du service HTTP avec PHP Mise à niveau des paquets et du noyau système :

# apt-get update # apt-get -fy upgrade && apt-get -fy dist-upgrade

Installation des services :

# apt-get -fy install nginx spawn-fcgi php5-fpm php5-cli php5-json php5-curl

Arrêt des services :

# systemctl stop php5-fpm.service # systemctl stop nginx.service

Configuration de nginx Sauvegarde et configuration de nginx :

# cp /etc/nginx/nginx.conf{,.bak} # cat <<-'EOF' >/etc/nginx/nginx.conf user www-data; worker_processes auto; worker_rlimit_nofile 2000;

pid /var/run/nginx.pid;

events { worker_connections 1024; use epoll; multi_accept on; }

http { open_file_cache max=2000 inactive=20s; open_file_cache_valid 30s; open_file_cache_min_uses 2; open_file_cache_errors on;

Baptiste MOINE 77 Installation de CAS Server v5 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';

access_log /var/log/nginx/access.log main; error_log /var/log/nginx/error.log warn;

sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048;

reset_timedout_connection on; client_body_timeout 10; send_timeout 2;

gzip on; gzip_disable "MSIE [1-6]\.(?!.*SV1)"; gzip_comp_level 2; gzip_min_length 1000; gzip_proxied expired no-cache no-store private auth; gzip_types text/plain application/x-javascript text/xml text/css application/xml;

server_tokens off; server_names_hash_bucket_size 2048;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE ssl_prefer_server_ciphers on;

include /etc/nginx/mime.types; default_type application/octet-stream; charset UTF-8; include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; } EOF

Baptiste MOINE 78 Installation de CAS Server v5 Création d’un nouveau vhost pour appli1.miletrie.lan

# cat <<-'EOF' >/etc/nginx/sites-available/appli1 upstream phpfcgi { # server :9000; server unix:/var/run/php5-fpm.sock; }

server { listen 80; listen [::]:80; server_name appli1.miletrie.lan;

## # Index # index index.php index.html index.htm;

## # Journalisation # access_log /var/log/nginx/appli1/access.log; error_log /var/log/nginx/appli1/error.log;

## # Racine # root /usr/share/nginx/webroot/appli1;

### # Location # location / { try_files $uri $uri/ =404; }

location ~ \.php$ { try_files $uri =404; fastcgi_index index.php;

Baptiste MOINE 79 Installation de CAS Server v5 fastcgi_intercept_errors on; fastcgi_pass phpfcgi; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include /etc/nginx/fastcgi_params; }

location ~* \.(ico|css|js|gif|jpe?g|png)$ { expires max; log_not_found off; access_log off; add_header Pragma public; add_header Cache-Control "public, must-revalidate, proxy- revalidate"; }

location ~ /\.ht { deny all; }

error_page 404 /404.html; # error_page 500 502 503 504 /50x.html;

location = /404.html { root /usr/share/nginx/static/; }

location = /50x.html { root /usr/share/nginx/static/; }

}

EOF

Baptiste MOINE 80 Installation de CAS Server v5 Suppression du vhost « default » :

# rm /etc/nginx/sites-enabled/default

Activation du vhost « appli1 » :

# ln -s /etc/nginx/sites-available/appli1 /etc/nginx/sites-enabled/appli1

Création de l’arborescence du vhost :

# install -m 755 -o root -g adm -d /var/log/nginx/appli1/ # touch /var/log/nginx/appli1/{access,error}.log # chmod 640 /var/log/nginx/appli1/{access,error}.log # chown www-data:adm /var/log/nginx/appli1/{access,error}.log # install -m 755 -o root -g root -d /usr/share/nginx/{webroot,static}/

Clone de l’application de test depuis mon référentiel GitLab :

# pushd /usr/share/nginx/webroot/ # git clone https://gitlab.com/Creased/php-cas-demo.git appli1

Clone de phpCAS en version 1.3 stable :

# git clone -b 1.3-stable https://github.com/Jasig/phpCAS.git /usr/share/nginx/webroot/appli1/vendor/phpCAS

Baptiste MOINE 81 Installation de CAS Server v5 Ajout de pages statiques pour les erreurs (404 et 50x) :

# cat <<-'EOF' >/usr/share/nginx/static/404.html 404 Not Found

404 Not Found

Sorry, the page you are looking for could not be found.
The page may no longer exist or have moved to a new location.

Faithfully yours, nginx.

EOF # cat <<-'EOF' >/usr/share/nginx/static/50x.html Error

An error occurred.

Baptiste MOINE 82 Installation de CAS Server v5

Sorry, the page you are looking for is currently unavailable.
Please try again later.

If you are the system administrator of this resource then you should check the error log for details.

Faithfully yours, nginx.

EOF

Redémarrage des services :

# systemctl restart php5-fpm.service # systemctl restart nginx.service

Baptiste MOINE 83 Installation de CAS Server v5 Test de l’authentification Kerberos sur Appli1 Depuis le client WIN7-PC, ouvrir le navigateur Firefox et saisir l’adresse d’Appli1 dans la barre d’adresse (p. ex., http://appli1.miletrie.lan/). Si tout se passe bien, l’application devrait procéder à la redirection vers CAS, authentifier notre utilisateur automatiquement en utilisant Kerberos et afficher retourner son contenu en indiquant un message de bienvenue (voir Illustration 4).

Illustration 4: Appli1 - Bonjour bmoine

Analyse protocolaire Si on procède à une capture des paquets envoyés aux différents services lors d’un accès non authentifié à Appli1, on peut décrire un diagramme de flux tel que :

Baptiste MOINE 84 Installation de CAS Server v5 Illustration 5: Diagramme de flux pour l'accès à une application « CASifiée »

Baptiste MOINE 85 Installation de CAS Server v5