Création d’un portail fédérateur avec serveur CAS grâce à Scribe

J'ai eu l'idée de créer un portail national globale pour la Nouvelle-Calédonie, l'idée étant de fédérer l'ensemble des applications sur un système unique d'authentification qui puissent permettre à tous, parents, élèves, personnel administratif de s'y connecter et de pouvoir lancer des applications locales comme nationales en SSO. Le résultat est visible sur : https://portail.ac-noumea.nc

J’ai eu l’idée de créer un portail national globale pour la Nouvelle-Calédonie, l’idée étant de fédérer l’ensemble des applications sur un système unique d’authentification qui puissent permettre à tous, parents, élèves, personnel administratif de s’y connecter et de pouvoir lancer des applications locales comme nationales en SSO. Le résultat est visible sur : https://portail.ac-noumea.nc

Migration vers EOLE 2.4

  • Créez un nouveau fichier /etc/apt/apt.conf.d/02eolecache (si vous avez un serveur apt-cacher) :
Acquire::http::Proxy "http://apt-cache.ac-acad.fr:3142";
  • J’ai du modifier le script Maj-Auto script (ligne 291 après wget) :
if [ $? -ne 0 ]; then

au lieu de :

if [ $? = 0 ]; then
  • J’ai copié tous les nouveaux fichiers d’archives pour la nouvelle version (2.4) dans /var/cache/apt/archives
  • J’ai supprimé /etc/apt/preferences.d/eole (apt-pinning)
  • J’ai créé un nouvel apt pinning pour lucid :
Package: php5 php5-cli php5-common php5-curl php5-gd php5-intl php5-ldap 
php5-mcrypt php5-mysql php5-readline php5-sqlite php5-xmlrpc php-pear 
libapache2-mod-php5	
Pin: release a=lucid
Pin-Priority: 1001

N’oubliez pas de supprimer les anciennes versions dans sources.list, par exemple :

rm /etc/apt/sources.list.d/eole-2.4.list
apt-get dist-upgrade
Maj-Auto -E

Plus d’informations sur la documentation officielle

  • Désactiver : owncloud, moodle, jabberd (dans services), etherpad et ethercalc via gen_config
reconfigure
reboot
apt-eole remove librpc-xml-perl
a2dismod auth_cas
a2dissite ethercalc
a2dissite etherpad
rm /etc/apt/preferences.d/lucid
apt-get update
apt-eole remove eole-ethercalc ethercalc-apps eole-etherpad etherpad-apps

N’oubliez pas de récupérer tous les nouveaux fichiers d’archives et de les copier dans /var/cache/apt/archives !

N’oubliez pas de vérifier que la modification du script Maj-Auto script est toujours en place !

Vous devrez supprimer les fichiers /etc/apt/apt.conf.d/02aptdefaut car ils contiennent des références à l’ancienne version :

APT::Default-Release "lucid"
/usr/share/eole/Upgrade-Auto -d
reboot
Maj-Auto
gen_config

La configuration a correctement été chargée depuis un fichier en version 2.3 devrait s’afficher, vérifiez les valeurs et sauvegarder.

Important ! Si nécessaire, n’oubliez pas de modifier le web_url dans les applications Web (si vous souhaitez mettre à jour ou modifier l’URL final du portail).

  • Désactivez sympa dans gen_config (cela pourrait causer un bug dans l’instance)
mkdir /var/run/network

Doit contenir :

eth0=eth0
lo=lo
instance
## Gestion du SID ##
run-parts: executing /usr/share/eole/posttemplate/02-annuaire instance
Voulez-vous regénérer l'annuaire LDAP ? oui

Installation d’envole

Les informations se trouvent dans la documentation officielle

apt-eole install eole-posh eole-bergamote eole-calendrier eole-dokuwiki eole-envole-connecteur eole-eportail eole-ethercalc eole-fengoffice eole-grr eole-jappix eole-limesurvey eole-mahara eole-infosquota eole-mindmaps eole-opensondage eole-piwigo eole-pydio eole-sap eole-spipeva eole-taskfreak eole-webcalendar eole-wordpress eole-esb-glpi

Un nouvel onglet « Envole » va apparaitre avec « Applications Web » dans :

gen_config

La liste des applications Web disponibles se trouvent dans la documentation officielle

A vérifier : etherpad ne doit pas être activéil y a un bug avec reconfigure !

N’oubliez pas d’activer CAS pour GLPI, la configuration se fait en indiquant le FQDN complet du serveur CAS sur le port 8443 :
Accueil → Configuration → Authentification → Autres méthodes d'authentification

  • Importation des utilisateurs LDAP (professeurs et agents administratifs) depuis un export AAF

TODO : MAJ automatique depuis un serveur zephir

import AAF

Connectez-vous à l’EAD et faites un import AAF avec tous les enseignants et agents administratifs de l’académie.

Synchronisation automatique des mots de passe

Notre DWE (Digital Work Environment) est utilisé pour globaliser / centraliser nos applications Web et nos applications locales à l’usage de nos enseignants et des agents administratifs de toute l’académie. Nous l’appelons aussi un PIA (Portail Intranet Académique).

J’ai donc configuré 2 annuaires : le LDAP academique et le LDAP intégré à la solution EOLE.

Notre annuaire LDAP académique (comme la plupart des autres académies) était pollué par de nombreux comptes inutilisés ou obsolètes au point qu’il ne reflète plus la réalité des enseignants et des agents administratifs réellement en activité.

L’un de mes objectifs était de « rationaliser » tous nos comptes utilisateurs en créant les comptes qui sont réellement encore utilisés dans le LDAP local. Je le charge automatiquement avec une exportation AAF (Annuaire Académique Fédérateur) et, ensuite, vous pouvez ajouter progressivement de nouveaux utilisateurs. Mais, je suis obligé d’activer l’accès au compte du LDAP principal (le LDAP académique) parce qu’il reste l’annuaire officiel de l’académie.

C’est pourquoi j’ai fait une petite modification sur l’authentification SSO. J’ai créé un « ticket » afin de prendre en compte ce changement : https://dev-eole.ac-dijon.fr/issues/12521

dataproxy.py dans /usr/lib/python2.7/dist-packages/eolesso/dataproxy.py :

@@ -37,6 +37,8 @@
 from eoleldaptor import eoleldapproxy
 from twisted.python import log, failure
 from util import get_replication_branches
+from scribe.eoleldap import Ldap
+from scribe.linker import _user_factory
 import os, socket
 class LDAPProxy:
@@ -117,6 +119,7 @@
             self.search_branches[host] = search_branches
             self.ldap_infos[host] = ldap_infos
             self.otp_config[host] = login_otp
+            #log.msg("Eole proxy %s" % eole_proxy)
         if nb_branches > 1:
             self.use_branches = True
@@ -221,15 +224,28 @@
     def callb_auth(self, result_auth, user_id, passwd, search_branch, servers):
         success, user_data = result_auth
-        # vérification du résultat de l'authentification sur le serveur précédent
-        if success == False:
-            # echec de l'authentification  sur ce serveur
-            if len(servers) > 0:
-                # test sur le serveur suivant
-                return self.authenticate(user_id, passwd, search_branch, servers)
-            else:
-                # on a essayé sur tous les serveurs
-                return False, {}
+
+        if success == True and "localhost" not in servers:
+            #log.msg("MAJ pwd vers localhost")
+            #recupere de ead2 backend/actions/scribe/userpwd.py
+            try:
+                conn = Ldap()
+                conn.connect()
+                ldapuser = _user_factory(user_id, conn.connexion)
+                ldapuser.c_mod_password(user_id, passwd)
+                conn.close()
+            except:
+                pass
+
+        # echec de l'authentification  sur ce serveur
+        if len(servers) > 0:
+            # test sur le serveur suivant
+            return self.authenticate(user_id, passwd, search_branch, servers)
+
+        if success == False :
+            # on a essayé sur tous les serveurs
+            return False, {}
+
         # on supprime certains champs (mot de passe)
         for user_attr in self.ignored_attrs:
             if user_attr in user_data:

Quand la modification est faite, redémarrez le service :

service eole-sso restart

Bug avec les bases de données déjà existantes (depuis 2.3)

Lorsque la mise à niveau est effectuée, les comptes utilisateurs d’origine n’ont pas accès aux bases de données. Pour résoudre ce problème, vous devrez :

  • Modifier le mot de passe root avec la commande mysql_pwd.py
  • Vous connecter sur phpmyadmin
  • Allez dans l’onglet « Privileges »
  • Refaites un par un chaque compte utilisateur en cliquant sur « changer les privilèges »
  • Sélectionnez « Créer un nouvel utilisateur avec les mêmes privilèges et… supprimer l’ancien, puis rafraîchir les privilèges sur le serveur ».
reconfigure

Divers

régénération du certificat SSL

  • Régénération du certificat avec modification des noms alternatifs (adresse IP + DNS complet) :
reconfigure
rm /etc/ssl/certs/eole.crt
/usr/share/creole/gen_certif.py -f

PHP5

Pour utiliser les frameworks PHP5, il vous faut au moins une version 5.4 de php !

Il y a beaucoup de conflits avec d’autres paquets eole, donc le seul moyen est d’essayer de les installer « à la main »… Liste des paquets PHP 5 ici

wget package_address.deb
dpkg -iphp5* php5-cli* php5-common* php5-curl* php5-gd* php5-intl* php5-ldap* php5-mcrypt* php5-mysql* php5-readline* php5-sqlite* php5-xmlrpc* php-pear* libapache2-mod-php5*

Forcer la modification d’une variable en lecture seule (attention…)

Si vous voulez forcer la modification d’une variable en lecture seule (https://dev-eole.ac-dijon.fr/issues/7343), modifier le fichier setting.py (/usr/lib/python2.7/dist-packages/tiramisu)

if 'frozen' in properties:
properties.remove('frozen')

Then :

python
from eolegenconfig import lib
a=lib.get_config('web_url')
a.creole.applications_web.web_url=u'nouvelurl.ac-acad.fr'
reconfigure

Patch pour Roundcube

Sous EOLE, roundcube est utilisé pour se connecter à la solution de messagerie locale du serveur. Mais, à l’intérieur d’une académie, le serveur de messagerie est généralement constitué de solutions propriétaires externes packagées (comme Oracle convergence).

Ainsi, le protocole IMAP ou POP n’est pas « cassifié » (une solution serait d’installer PAM-CAS mais cela semble compliqué avec le serveur de convergence).

Vous devrez donc modifier la configuration du webmail EOLE (roundcube) afin de vous connecter à la solution de messagerie académique. Nous pourrions aussi mettre à jour le dictionnaire gen_config pour prendre en compte les paramètres spécifiques de la solution de messagerie académique. Le problème principal est que nous avons perdu l’authentification CAS, en soit il faudrait repenser totalement la solution de courrier académique globale.

roundcube-main.inc.php.patch :

// Adresse IP en dur
-$rcmail_config['default_host'] = '%%adresse_ip_mail';
+$rcmail_config['default_host'] = 'tls://mail.ac-acad.fr';
// 0 - disabled, 1 - username and host only, 2 - username, host, password -$rcmail_config['login_autocomplete'] = 0; +$rcmail_config['login_autocomplete'] = 2;

// Possible values: sameorigin|deny. Set to false in order to disable sending them -$rcmail_config['x_frame_options'] = 'sameorigin'; +$rcmail_config['x_frame_options'] = false;
// 0 - Do not expand threads // 1 - Expand all threads automatically // 2 - Expand only threads with unread messages -$rcmail_config['autoexpand_threads'] = 0; +$rcmail_config['autoexpand_threads'] = 2;

roundcube-config.inc.php.patch :

// Adresse IP en dur
-$config['default_host'] = '%%adresse_imap';
+$config['default_host'] = 'tls://mail.ac-acad.fr';

// List of active plugins (in plugins/ directory)
-%if %%activer_sso != 'non'
-$rcmail_config['plugins'] = array('cas_authentication');
-%else
 $rcmail_config['plugins'] = array();
-%end if

Problèmes divers

Erreur :
Des erreurs ont été rencontrées pendant l'exécution :
apt-show-versions
libapache2-mod-rpaf
E: Sub-process /usr/bin/dpkg returned an error code (1)

Solution :

a2dismod auth_cas
a2dissite ethercalc
a2dissite etherpad
Erreur :
Les paquets suivants contiennent des dépendances non satisfaites :
libwww-perl: Casse: librpc-xml-perl (< 0.74-2) mais 0.72-1 devra être installé
E: Erreur, pkgProblemResolver::Resolve a généré des ruptures, ce qui a pu être causé par les paquets devant être gardés en l'état.

Solution :

apt-eole install upstart-job
apt-eole install xserver-xorg-coreapt-eole install exim4-config apt-eole install exim4-base reboot Upgrade-Auto --download
Impossible de récupérer http://eole.ac-dijon.fr/eole/pool/main/e/eole-ead/...  Taille incohérente
Impossible de récupérer http://eole.ac-dijon.fr/eole/pool/main/e/eole-ead/...  Taille incohérente
Impossible de récupérer http://eole.ac-dijon.fr/eole/pool/main/e/eole-ead/...  Taille incohérente

On peut forcer la récupération via wget :

wget http://eole.ac-dijon.fr/eole/pool/main/e/eole-ead/...

Suppression paquets php5 non officiels :

apt-eole remove php5
php5-cli php5-common php5-curl php5-gd php5-intl php5-ldap php5-mcrypt
php5-mysql php5-readline php5-sqlite php5-xmlrpc php-pear libapache2-mod-php5

Debug connexion SSO

Dans /var/log/posh/eolecas.log

Ne pas oublier d’activer le mode debug dans /usr/share/php/configCAS/cas.inc.php with __CAS_DEBUG set to true

A l’intérieur de __construct, vous trouverez une URL avec « validate service », vous pouvez la tester via curl « https://address/serviceValidate » afin de voir ce que le serveur SSO renvoie.
Pour tester sous curl sans validation du certificat, utilisez l’option « -k ».

APT PINNING

Vous pouvez vouloir mettre à niveau différents paquets provenant de différentes sources. Mais si vous ne voulez pas tout casser, vous devez penser à mettre en place l’apt pinning.

Exemple (non concluant) pour créer un fichier de préférences pour php5 dans /etc/apt/preferences.d/ (la première règle désactive tous les paquets du ppa, la seconde active ceux qui nous concernent) :

Package: *
Pin: release o=LP-PPA-ondrej-php5
Pin-Priority: 400

Package: php5 php5-cli php5-common php5-curl php5-gd php5-intl php5-ldap php5-mcrypt php5-mysql php5-readline php5-sqlite php5-xmlrpc php-pear libapache2-mod-php5
Pin: release o=LP-PPA-ondrej-php5
Pin-Priority: 500