Upload
others
View
5
Download
0
Embed Size (px)
Citation preview
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
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 licencehttps://creativecommons.org/licenses/by-nc-sa/4.0/
RAPPORT D’INSTALLATION
TABLE DES MATIÈRES
Table des matières.................................................................................................................1Note........................................................................................................................................2Introduction.............................................................................................................................3 Tickets................................................................................................................................3 Échanges HTTP.................................................................................................................4Architecture............................................................................................................................5Préparation du système.........................................................................................................6 Configuration du nom d’hôte..............................................................................................6 Configuration de OpenSSH-Server...................................................................................7Installation des dépendances................................................................................................9 Apache Tomcat (en automatique)......................................................................................9 Apache Tomcat (en manuel)............................................................................................11 JRE (« Java Runtime Environment ») et JDK (« Java Development Kit »).....................19 Apache Maven.................................................................................................................20Installation de CAS...............................................................................................................22 Application et adaptation du modèle Maven....................................................................22 Compilation de CAS.........................................................................................................38Ajout d’un frontal avec Apache HTTP..................................................................................41 Installation........................................................................................................................41 Fichiers de configuration d’Apache HTTP.......................................................................42 Configuration....................................................................................................................44 Tests.................................................................................................................................54Cré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 installationou configuration optimale et ne s’appliquent que dans un contexte défini, ainsi, il estprimordial de comprendre le fonctionnement de chacune de ces configurations et deprocéder le cas échéant à une adaptation / extension de ces dernières afin d’être cohérentavec 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 serveurd’authentification centralisé basé sur la technologie SSO (« Single Sign-On ») orienté versles applications WEB. Cette solution est mature et a été déployée dans de nombreusesuniversités américaines.
Tickets
Pour fonctionner, CAS est basé sur différents tickets (ou « cookies ») et s’appuieprincipalement 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 seraexigée à chaque appel au serveur CAS. Ce cookie joue un rôle crucial dans le mécanismed’authentification unifiée, c’est pourquoi il peut être sujet à des tentatives de vol (« magiccookie 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’utilisationdétournée d’une API (« Application Programming Interface » ou interface deprogrammation) côté client afin, par exemple, d’exécuter du code JavaScript et déroberune 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 etexpire à la fermeture du navigateur WEB, utilise le drapeau (« flag ») HTTPOnly pourempêcher l’accès par les API côté client (p. ex., JavaScript) ainsi que le Secure Flagindiquant au navigateur d’utiliser une communication HTTPS pour l’échange de ce cookieavec l’application.
ST (« Service Ticket »)
Le ST est un ticket à usage unique généré par le serveur CAS et permettantl’authentification du client sur une application WEB. Il est échangé entre le client etl’application WEB l’application par l’intermédiaire d’une requête HTTP GET, l’applicationré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 permetl’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 alorscapable 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 dedemander au serveur CAS la génération d’un PT pour l’authentification sur une applicationWEB.
Baptiste MOINE 3 Installation de CAS Server v5
Échanges HTTP
1. La requête initiale du client WEB à l’application nécessitant une authentification estredirigé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 locald’authentification puis redirige le client vers l’application d’origine en utilisant leserviceid 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 larequête GET ;
4. L’application établit une communication HTTP directe avec le serveur CAS etenvoie son URL et le ST envoyé par le client. Le serveur CAS valide le ticket et lemarque 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’expirationdu TGC.
En mode proxy, si le ST est validé, le serveur retourne un identifiant de PGT (PGT-id) encomplé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 <<EOF >/etc/hostname
${HOSTNAME}
EOF
# cat <<EOF >/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 </dev/null
# ssh-keygen -N '' -t rsa -b 4096 -f /etc/ssh/ssh_host_rsa_key </dev/null
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 typebruteforce, 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
<contenu de [email protected]_ed25519.pub>
<contenu de [email protected]_rsa.pub>
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 <<EOF >>~/.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 Javapermettant 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 stabledistribuée par Debian, il est donc conseillé de procéder à une installation manuelled’Apache Tomcat.
Apache Tomcat est un service HTTP à part entière, mais également un conteneur WEBsupportant les servlets et JSP (« JavaServer Pages »), par l’intermédiaire d’unecompilation (via l’outil Jasper) des JSP en servlets.
Apache Tomcat est généralement utilisé en tant que module (ou greffon) à un autreservice HTTP plus généraliste (e.g. Apache HTTP Server, IIS, Nginx). Ainsi, le serviceHTTP traite les requêtes HTTP de façon « classiques » (p. ex. HTML, PHP) et délègue letraitement 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 version8.
Parmi les différentes versions listées, des suffixes « bpo8 » sont utilisés pour indiquer qu’ils’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 etdisposent 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 passeren 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 CentreHospitalier Henri Laborit, il a été convenu de la réutiliser comme base à d’éventuellesmodifications.
Téléchargement des configurations du CHHL pour Apache Tomcat :
# cd /tmp/
# curl --insecure --silent --location --header "PRIVATE-TOKEN: <TOKEN-AUTH>" --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 <[email protected]>
#
### 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#\(</Context>\)#\n <!-- Allow caching -->\n <Resources cachingAllowed="true" cacheMaxSize="100000" />\n\1#' ./conf/context.xml
Création d’une nouvelle arborescence pour contenir les fichiers de configuration d’ApacheTomcat :
# 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 DevelopmentKit »)
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’installationde 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 anciennesversions 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 uneaide à 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 avecdes modules externes, la gestion du versioning, les tests, etc. Ce fichier de description estappelé POM (pour « Project Object Model »).
Installation
Deux versions sont développées en parallèle, la version 2 et 3, cependant les prochainesreleases 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 enversion 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 configurationpersonnalisé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>\)\(.*\)\(<\/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>/,/<\/proxies>/{
/\s\{4\}-->/d; # Suppression de la fermeture du bloc de commentaire
s/\(\s\{4\}|$\)/\1-->/; # Fermeture du bloc de commentaire
s/\(<active>\).*\(<\/active>\)/\1true\2/; # Le proxy est actif
/<username>.*<\/username>/d; # Pas de nom d’utilisateur (exploitation de la plage IP), suppression de la propriété
/<password>.*<\/password>/d; # Pas de mot de passe (exploitation de la plage IP), suppression de la propriété
s/\(<host>\).*\(<\/host>\)/\1172.18.4.1\2/; # Hôte du service proxy
s/\(<port>\).*\(<\/port>\)/\18080\2/; # Port d’écoute du service proxy
s/\(<nonProxyHosts>\).*\(<\/nonProxyHosts>\)/\1*.miletrie.chl|dev|dev.ch-poitiers.fr\2/; # Liste blanche du proxy
0~2s/\(<id>\).*\(<\/id>\)/\1webcache_http\2/; # Identifiant du proxy HTTP
0~2s/\(<protocol>\).*\(<\/protocol>\)/\1http\2/; # Protocole du proxy HTTP
1~2s/\(<id>\).*\(<\/id>\)/\1webcache_https\2/; # Identifiant du proxy HTTPS
1~2s/\(<protocol>\).*\(<\/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 Catalinanécessite la création d’une archive WEB spécifique à cette application (on parle d’archiveWAR).
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 ceré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 unsecond référentiel qui nous est propre appelé origin.
Création d’un référentiel Git, ici une instance GitLab interne au CHL sera utilisée, mais ilest possible d’utiliser n’importe quel gestionnaire de référentiel Git (e.g. GitLab, AtlassianBitBucket, 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
Illustration 1: Fork d’un référentiel Git
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 necorrespond 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 deproduction est comparable à GNU Make et se base sur un fichier de description (au formatXML) appelé POM (pour « Project Object Model ») et permettant de fournir une descriptionavancée du projet et des phases de mise en service comprenant notamment le processusde compilation, de résolution des dépendances avec des modules externes, la gestion duversioning, 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 :
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd ">
• Description des métadonnées du projet (p. ex., nom, version, identifiant de groupeet d’artefact) :
<!-- Meta-données du projet -->
<modelVersion>4.0.0</modelVersion>
<groupId>fr.chpoitiers</groupId>
<artifactId>cas-server-5</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>Serveur cas personnalisé pour le CHL</name>
Baptiste MOINE 25 Installation de CAS Server v5
• Description des propriétés du projet : Il s’agit simplement de données variablesexploitables dans n’importe quelles autre section du fichier de description. Pourexemple, en voici un extrait :
<properties>
<!-- Compilateur Java -->
<maven.compiler.plugin.groupId>
org.apache.maven.plugins
</maven.compiler.plugin.groupId>
<maven.compiler.plugin.version>3.5.1</maven.compiler.plugin.version>
<maven.wrapper.plugin.groupId>
com.rimerosolutions.maven.plugins
</maven.wrapper.plugin.groupId>
<maven.wrapper.plugin.version>0.1.5</maven.wrapper.plugin.version>
</properties>
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 :
<build>
<plugins>
<!-- Compilateur Java -->
<plugin>
<groupId>${maven.compiler.plugin.groupId}</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven.compiler.plugin.version}</version>
<configuration>
<source>${java.source.version}</source>
<target>${java.target.version}</target>
</configuration>
</plugin>
<plugin>
<groupId>${maven.wrapper.plugin.groupId}</groupId>
<artifactId>wrapper-maven-plugin</artifactId>
<version>${maven.wrapper.plugin.version}</version>
</plugin>
</plugins>
<finalName>cas</finalName>
</build>
• Description des dépendances (p. ex., version, phase concernée, identifiant degroupe et d’artefact) :
<dependencies>
<!-- Registre des services au format JSON -->
<dependency>
<groupId>${cas.groupId}</groupId>
<artifactId>cas-server-support-json-service-registry</artifactId>
<version>${cas.version}</version>
<scope>runtime</scope>
</dependency>
</dependencies>
Baptiste MOINE 27 Installation de CAS Server v5
• Description des dépôts fournissant les modules et dépendances nécessaires :
<!-- Dépôts -->
<repositories>
<repository>
<id>sonatype-releases</id>
<url>https://oss.sonatype.org/content/repositories/releases/</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
Une fois l’ensemble des sections de configuration du projet complétées, on en profite pourcré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, uneconfiguration de base pour CAS et le moteur de journalisation. Comme expliqué dans lasection « configuration » du README (voir README.md#configuration), lesconfigurations fournies dans le répertoire etc, sont à placer, par défaut, dans lerépertoire /etc/cas.
Jetty
Le module Jetty est utilisé pour un déploiement rapide des applications WEB, il estcapable d’analyser périodiquement le projet afin de rechercher des mises à jour etprocéder à leur déploiement. Ceci étant principalement conçu par les développeursopé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 depouvoir distinguer les fichiers de configuration produits par le CHL, des fichiers deconfiguration par défaut. Pour cela, les fichiers de configurations seront placés dans leré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 desinformations relatives aux événements importants tels qu’une authentification réussie ouéchouée. Ce moteur de journalisation est personnalisable afin d’enregistrer desinformations 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 :
<?xml version="1.0" encoding="UTF-8" ?>
• Description des propriétés du service de journalisation (voir Configuration de log4jet Configuration de l’intervalle de rafraîchissement), par exemple, on utilisera lemoteur de journalisation de CAS afin un intervalle de rafraîchissement desévénements toutes les 10 secondes :
<Configuration monitorInterval="10" packages="org.apereo.cas.logging">
...
</Configuration>
Baptiste MOINE 30 Installation de CAS Server v5
• Description des flux de sortie (appenders) (p. ex., console, fichier, formatd’affichage, taille maximale, politique d’écrasement), par exemple, pour pouvoirenregistrer des événements dans un fichier cas.log ou les afficher directement enconsole (stdout) (voir Configuration des flux de sortie et Configuration de log4j avecsyslog) :
<Appenders>
<!-- Console -->
<Console name="console" target="SYSTEM_OUT">
<PatternLayout pattern="%d %p [%c] - <%m>%n"/>
</Console>
<!-- Fichier ne dépassant pas 10MB -->
<RollingFile name="file" fileName="${sys:catalina.base}/logs/cas.log" append="true" filePattern="${sys:catalina.base}/logs/cas-%d{yyyy-MM-dd-HH}-%i.log">
<PatternLayout pattern="%d %p [%c] - %m%n"/>
<Policies>
<OnStartupTriggeringPolicy />
<SizeBasedTriggeringPolicy size="10 MB"/>
<TimeBasedTriggeringPolicy />
</Policies>
</RollingFile>
<!-- Alias des flux de sortie pour CAS -->
<CasAppender name="casFile">
<AppenderRef ref="file" />
</CasAppender>
<CasAppender name="casConsole">
<AppenderRef ref="console" />
</CasAppender>
</Appenders>
Baptiste MOINE 31 Installation de CAS Server v5
• Description des flux d’entrée (synchronicité du flux, module associé, niveau degravité, l’additivité des flux, le flux de sortie associé) (voir Configuration des fluxd’entrée), par exemple :
<Loggers>
<!-- Conteneur de servlets, Catalina en mode asynchrone -->
<AsyncLogger name="org.apache.catalina" level="debug" additivity="false">
<AppenderRef ref="casConsole"/>
<AppenderRef ref="casFile"/>
</AsyncLogger>
<!-- Service de journalisation en mode asynchrone -->
<AsyncRoot level="info">
<AppenderRef ref="casConsole"/>
</AsyncRoot>
<Loggers>
Une fois l’ensemble des sections de configuration du projet complétées, il sera nécessairede 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 configurationcas.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 », cemodèle est conçu comme un guide et ne doit en aucun cas être suivi aveuglément, il estau contraire préférable d’être sélectif sur le choix des propriétés saisies dans ce fichier deconfiguration.
À titre d’exemple, en voici un extrait (la description du fichier complet serait trop longuepour 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 unré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ôtfork :
# 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 nousauthentifier.
Tels qu’expliqué dans la documentation de CAS (voir JSON Service Management), lesservices 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 :
<nom de service>-<id de service>.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 », afinde charger l’ensemble des fichiers de configurations, CAS doit procéder à la lecture d’unfichier de configuration décrivant les propriétés contextuelles relatives à l’amorçage duprojet, on appelle ce type de fichier un fichier Bootstrap.
Ce fichier, de type Property Resource Bundles (PRB), n’est pas fourni dans le modèled’abstraction et doit être créé manuellement.
Dans notre cas, la configuration minimale requise pour l’amorçage de CAS est ladescription 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*<util:properties id="casProperties" location="\)[^"]*\(" \/>$\)#\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 » (« WEB ApplicationARchive ») 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-planet affichage du journal d’événement complet de Catalina et en suivant les modifications dudescripteur 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 leservice 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 éventuelsdéploiements à répétition de CAS, il est possible de créer une fonction pour ledé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 desjournaux 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éalisationdu 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 nonseulement de traiter l’ensemble des requêtes adressées (ou non) à Apache Tomcat, de lesfiltrer, gérer les autorisations, la journalisation des accès, mais surtout, rendre accessiblele service d’authentification sur le port 80/tcp et forcer l’utilisation d’une communicationsécurisée exploitant le protocole HTTPS sur le port 443/tcp au moyen du mécanismeHTTP 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 version2.4.
Parmi les différentes versions listées, des suffixes « bpo8 » sont utilisés pour indiquer qu’ils’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 etdisposent 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 desconfigurations 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’inclusionrécursive des autres fichiers de configuration.
conf-available/
Ce répertoire contient des fichiers spécifiques à différents aspects de la configurationd’Apache HTTP. Par exemple, on retrouve le fichier security.conf qui permet de définirl’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 êtreinclus 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 enutilisant les commandes a2enconf ou a2disconf.
envvars
Ce fichier est utilisé afin de spécifier les différentes variables contextuellesd’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 letype MIME d’un fichier. Tout comme la commande UNIX file, le module se base surl’analyse des premiers octets du fichier pour déterminer le magic number et d’autresinformations 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 dudeuxiè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 demodules d’Apache HTTP. Par exemple, on retrouve le fichier proxy_ajp.load qui permet dedemander 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 enutilisant 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) permettantde 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 enutilisant 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 demonitoring :
# 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. Cetype 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 notAllowed » :
# 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 fourniepar 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
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>405 Method Not Allowed</title>
</head><body>
<h1>Method Not Allowed</h1>
<p>The requested method TRACE is not allowed for the URL /.</p>
</body></html>
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 workerset 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
<VirtualHost _default_:80>
###
# Configuration du service
#
ServerName cas.miletrie.lan
ServerAdmin [email protected]
###
# Redirection sur HTTPS et sur le vhost CAS
#
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://cas.miletrie.lan%{REQUEST_URI}
</IfModule>
</VirtualHost>
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 serveurainsi 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 -outcas.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 avecTomcat :
# cat <<-'EOF' >/etc/apache2/sites-available/https.conf
<IfModule mod_ssl.c>
<VirtualHost _default_:443>
###
# 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+AES:!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
<IfModule jk_module>
JkMount /cas cas
JkMount /cas/* cas
</IfModule>
</VirtualHost>
</IfModule>
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 surTomcat, pour cela, vérifier en dé-commentant, si besoin, la directive suivante :
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
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, laredondance du terme « cas » sera supprimée en production en remplaçant le nom duserveur 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 undéverrouillage, ainsi, si elle est définie, lors du redémarrage du service HTTP, il serademandé la saisie de la passphrase.
Afin de vérifier l’état de fonctionnement des deux vhosts, nous allons préparer une requêtesur l’adresse http://cas/ qui devrait rediriger en plusieurs étapes vers l’adressehttps://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 laredirection 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 ladirective 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 del’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 fonctionnementdu 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 pageHTML (« 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 devalider son fonctionnement en utilisant, par exemple, le protocole Kerberos pourl’authentification des clients sur le portail et développer une application simple pourprendre en charge l’authentification du client par l’intermédiaire de CAS en s’appuyant surle mécanisme SPNEGO (protocole négociant au choix une authentification avec NTLM ouKerberos).
Pour mettre en place cet environnement de test, il sera nécessaire de :
• Installer et configurer un service d’annuaire permettant de contenir notre based’utilisateurs, ici nous avons fait le choix d’Active Directory, mais l’utilisationd’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 desupporter 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 (maispas nécessaire !) de procéder à l’installation de Windows Server en mode « ExpérienceUtilisateur », ceci permettant de bénéficier des outils d’administration graphique et d’unenvironnement plus accessible pour l’administration, à noter que ce type d’installationnécessitera de plus de ressources physiques (et virtuelles s’il s’agit d’un environnementvirtualisé) 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 serviceAD LDS (« Active Directory Lightweight Directory Service ») ne serait pas suffisante, il estdonc 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 lesutilisateurs, les ordinateurs et les périphériques sur le réseau. Ils permettent égalementaux administrateurs de gérer ces informations de façon sécurisée et facilitent le partagedes ressources et la collaboration entre les utilisateurs.
L’installation des services de domaine Active Directory utilise le Gestionnaire de serveur etWindows PowerShell, comme tous les autres rôles et fonctionnalités dans WindowsServer 2012. À noter que l’assistant graphique dans le « Gestionnaire de serveur » ou lemodule « 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, unmaximum de processus de déploiement Windows PowerShell seront effectués et décritdans 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 assurerune continuité de services aux utilisateurs en cas de panne du serveur, l’installationd’un minimum de deux contrôleurs de domaine par domaine est conseillée parMicrosoft ;
• Les services AD DS nécessitant qu’un serveur DNS soit installé sur le réseau etaccessible en écriture par les services d’annuaire Active Directory, une réplicationde celui-ci sera également conseillée.
Dans notre cas, l’installation d’un unique serveur sera amplement nécessaire puisqu’il nes’agit que d’un environnement de test qui sera de toute manière retravaillé pour être misen 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’unenouvelle 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 lazone racine.
Baptiste MOINE 59 Installation de CAS Server v5
La dernière commande devrait retourner ce type de message :
Baptiste MOINE 60 Installation de CAS Server v5
Créez une forêt Active Directory avec le nom « miletrie.lan ».
Configurez ce serveur en tant que premier contrôleur de domaine ActiveDirectory d’une nouvelle forêt.
Le nouveau nom de domaine est « miletrie.lan ». C’est aussi le nom de lanouvelle 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 serveurDNS préféré.
Le mot de passe du nouvel administrateur de domaine sera le même que celuide l’administrateur local de cet ordinateur.
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 lesprocessus 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 Adressedistante
État Description
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:139
0.0.0.0:0 LISTENING NETBIOS Session Service
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 dediffé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 etau 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 lesalgorithmes de chiffrement supportés, pour cela, il suffit d’additionner les bitscorrespondant 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 etAES256, 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 à utiliserdirectement 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 desortir un tableau listant les algorithmes utilisables associés à chacun des utilisateurs del’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 permettrel’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 deWindows Server comme un security principal dans Windows Server en générant unkeytab Kerberos contenant un ou plusieurs secrets partagés (« shared secret key ») entrele serveur Kerberos et le service.
Dans un premier temps, nous allons créer un keytab, contenant une clé partagée pourchacun 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 lesclé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, onparle de SPN (« Service Principal Name »). Ses attributs seront mis à jour enconsé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 dedé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 biendes instructions nécessaires à installer les dépendances nécessaires au fonctionnementde SPNEGO :
<?xml version="1.0" encoding="UTF-8"?>
<project ...>
...
<properties>
...
<!-- Version de CAS -->
<cas.groupId>org.apereo.cas</cas.groupId>
<cas.version>5.1.0-SNAPSHOT</cas.version>
...
</properties>
<dependencies>
...
<!-- Authentification -->
<!-- SPNEGO pour Kerberos -->
<dependency>
<groupId>${cas.groupId}</groupId>
<artifactId>cas-server-support-spnego</artifactId>
<version>${cas.version}</version>
<scope>compile</scope>
</dependency>
<!-- Webflow pour SPNEGO (https://apereo.github.io/cas/5.0.x/installation/SPNEGO-Authentication.html) -->
<dependency>
<groupId>${cas.groupId}</groupId>
<artifactId>cas-server-support-spnego-webflow</artifactId>
<version>${cas.version}</version>
<scope>runtime</scope>
</dependency>
...
</dependencies>
...
</project>
Baptiste MOINE 71 Installation de CAS Server v5
Ensuite, il est nécessaire de configurer CAS (cas.properties) afin qu’il soit correctementassocié en tant que client Kerberos auprès de Windows Server en utilisant la configurationlocale 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 duWEBFlow (cas.webflow.encryption.key, cas.webflow.signing.key, cas.tgc.encryption.key etcas.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 (voirhttps://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 Kerberosdu serveur Kerberos placé sur le contrôleur de domaine, pour cela, il est nécessaired’intégrer l’ordinateur au domaine miletrie.lan.
Intégration du poste au domaine, ici, l’ordinateur client fonctionne sous Microsoft Windows7 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 ».
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 ».
Baptiste MOINE 74 Installation de CAS Server v5
Illustration 3: Options Internet - Activation de l'authentification Windowsintégrée
Illustration 2: about:config - Trusted URIs
Déploiement d’une application de test basée sur phpCAS
Pour déployer cette application de test, nous allons nous baser sur une nouvelleinstallation de Debian Jessie qui sera dédiée à la fourniture de l’application de test surHTTP.
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 <<EOF >/etc/hostname
${HOSTNAME}
EOF
# cat <<EOF >/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 php: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
<!DOCTYPE html>
<html>
<head>
<title>404 Not Found</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>404 Not Found</h1>
<p>Sorry, the page you are looking for could not be found.<br/>
The page may no longer exist or have moved to a new location.</p>
<p><em>Faithfully yours, nginx.</em></p>
</body>
</html>
EOF
# cat <<-'EOF' >/usr/share/nginx/static/50x.html
<!DOCTYPE html>
<html>
<head>
<title>Error</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>An error occurred.</h1>
Baptiste MOINE 82 Installation de CAS Server v5
<p>Sorry, the page you are looking for is currently unavailable.<br/>
Please try again later.</p>
<p>If you are the system administrator of this resource then you shouldcheck
the <a href="http://nginx.org/r/error_log">error log</a> for details.</p>
<p><em>Faithfully yours, nginx.</em></p>
</body>
</html>
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 labarre d’adresse (p. ex., http://appli1.miletrie.lan/). Si tout se passe bien, l’applicationdevrait procéder à la redirection vers CAS, authentifier notre utilisateur automatiquementen utilisant Kerberos et afficher retourner son contenu en indiquant un message debienvenue (voir Illustration 4).
Analyse protocolaire
Si on procède à une capture des paquets envoyés aux différents services lors d’un accèsnon authentifié à Appli1, on peut décrire un diagramme de flux tel que :
Baptiste MOINE 84 Installation de CAS Server v5
Illustration 4: Appli1 - Bonjour bmoine
Baptiste MOINE 85 Installation de CAS Server v5
Illustration 5: Diagramme de flux pour l'accès à une application « CASifiée »