OwnCloud 5 et Shibboleth

Friday, June 14, 2013

Salut, c’est encore Gamb qui revient vous saouler avec ownCloud ! Eh oui, une nouvelle version est sortie, c’est l’occasion pour mettre à jour la doc : compléter certains points et revoir complètement d’autres, en particulier l’authentification via une fédération d’identité. Retour à mes premiers amours : Shibboleth !!

Introduction

La communauté OC est en pleine effervescence et produit donc beaucoup. Il y a des nouvelles applications qui sortent tous les jours mais le core lui aussi évolue. On va s’intéresser à l’installation d’ownCloud en version 5 qui apporte une refonte graphique de son interface web et l’apparition de quelques fonctionnalités comme la corbeille ! Une partie de l’article sera dédiée à l’authentification mais cette fois en s’appuyant sur la techno Shibboleth, bien plus utilisée dans le monde de l’ESR que SimpleSamlPhp.

Configuration du système

On installe un Linux, par exemple un Scientific Linux 6.3 64bits :P Pour le moment, on ne va pas déployer d’infrastructure complexe car la population ciblée est constituée d’une centaine d’utilisateurs maximum.

On va installer tous les paquets nécessaires pour ownCloud d’un coup :

yum install httpd php php-mysql php-xml php-gd php-mbstring

A noter, les paquets pour Shibboleth ne sont pas installés en même temps, simplement car Shibb a sa propre doc.

Partitionnement

Bon ici, rien de bien sioux, on va juste ajouter une partition dédiée aux données des utilisateurs. On crée un volume dédié dans notre LVM et on le monte sur /<nom_lv>. Voici les commandes :

lvcreate -L <taille_lv>G -n <nom_lv> <nom_vg>
mkfs.ext4 /dev/mapper/<nom_vg>-<nom_lv>
mkdir /<nom_lv>

On édite le fstab pour monter le nouveau volume au démarrage :

vim /etc/fstab
/dev/mapper/<nom_vg>-<nom_lv>   /<nom_lv>                    ext4    defaults        1 2

On va le monter à la main pour poursuivre l’installation et créer un répertoire pour OC :

mount /dev/mapper/<nom_vg>-<nom_lv>   /<nom_lv>
mkdir /<nom_lv>/owncloud
chown apache:apache /<nom_lv> -R
chmod 750 /<nom_lv>/owncloud

Iptables et SELinux

On désactive SELinux, c’est la solution de facilité certes mais j’ai perdu tellement de temps à chercher pourquoi une conf ne marchait pas, que je veux plus en entendre parler :D Donc, dans un shell :

vim /etc/sysconfig/selinux
SELINUX=disabled
/usr/sbin/setenforce 0

Puis, on va ouvrir les ports 80 et 443 dans iptables :

vim /etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
service iptables restart

Installation MySQLd en local

Si vous n’avez pas de MySQLd mutualisé, il va falloir installer un serveur local :

yum install mysql-server
chkconfig mysqld on
service mysqld start
/usr/bin/mysqladmin -u root password '<admin_pass>'

Ensuite, il est préférable de créer un utilisateur MySQL dédié ainsi qu’une base du même nom où il a les droits :

mysqladmin -u root -p create <oc-db_name>
mysql -u root -p mysql
GRANT ALL ON <oc-db_name>.* TO <oc-db_name>@'' IDENTIFIED BY '<oc-db_password>';
FLUSH PRIVILEGES;
quit

Configuration de NTP

Shibboleth est sensible aux différences de temps entre le SP et l’IDP, il est nécessaire de configurer une sycnhro de temps :

yum install ntpdate
crontab -e
0  0  * * *      ntpdate europe.pool.ntp.org

Configuration Sendmail

OwnCloud peut être amené à envoyer des mails, par exemple pour les partages de fichiers avec l’extérieur. Pour faire fonctionner l’envoi de mail avec sendmail, il faut configurer … postfix, ah ah ah. On édite le fichier de configuration :

vim /etc/postfix/main.cf

Et on renseigne deux paramètres :

mydomain = <mon_domaine>
relayhost = smtp.<mon_domaine>

Puis, on démarre postifx :

chkconfig postfix on
service postfix start

Configuration Apache

Je vais passer rapidement sur cette partie car j’utilise ma convention perso :D L’article “Tout sur le name-based virtual host !” décrit tous ces aspects et vous trouverez un outil de génération de conf qui s’appuie sur cette “convention”. Dans la partie concernant Shibboleth, vous trouverez la conf Apache qui va bien.

Si vous êtes derrière un reverse proxy, il faut veiller à définir la directive ProxyPreserveHost sur On car ownCloud utilise ce nom pour construire ses URL. On reviendra sur les reverse proxy en fin d’article.

Configuration PHP

On ne va pas tuner PHP ou Apache pour absorber plus de connexion, cela servirait si la cible était plus grande (> 500 users). On va juste augmenter la taille des uploads à 2Go, au dessus on ne peut pas simplement à moins de recompiler PHP … On édite le fichier php.ini et on modifie les lignes suivantes :

vim /etc/php.ini
max_execution_time = 3600
max_input_time = 3600
memory_limit = 1024M
post_max_size = 2100M
upload_max_filesize = 2048M

On vérifie que la partition /tmp a au moins 2Go d’espace libre, sinon créer un dossier temporaire dans notre partition /<nom_lv> et modifier la variable upload_tmp_dir dans php.ini. Puis on redémarre Apache :

service httpd configtest
service httpd restart

Installation de ownCloud

Une fois tous ces pré-requis effectués, l’installation de OC en tant que telle est très légère :

cd /tmp/
wget http://download.owncloud.org/community/owncloud-5.0.6.tar.bz2
tar xjf owncloud-5.0.6.tar.bz2
mv owncloud /var/www/
chown apache:apache /var/www/owncloud -R

Puis, on se dépêche de se rendre avec son navigateur web libre sur la racine de notre ownCloud :
https://<mon_owncloud>.<mon_domaine>/

Intégration fédération d’identité

Malheureusement, l’app user_saml ne fonctionne pas avec OC5 et simpleSamlPhp n’est pas le logiciel utilisé habituellement dans la fédération Education-Recherche. Contrairement à notre doc concernant ownCloud 4, nous allons ici nous appuyer sur la techno Shibboleth pour s’authentifier via notre fédération d’identité. L’utilisation de la brique SP Shibboleth apporte deux autres avantages :

  • La brique SP peut être sur un reverse proxy et ownCloud sur un serveur final. Alors que SimpleSamlPhp doit être accessible (include php) par ownCloud.
  • On peut choisir de faire cohabiter l’auth interne + fédération ou imposer la fédération, simplement en changeant de conf Apache.

Installation de la brique service provider Shibboleth

On ne va pas entrer dans les détails de l’installation de cette partie car elle est totalement indépendante de OC et surtout il y a déjà une doc d’installation du Service Provider Shibboleth.

Installation de l’app user_servervars

On récupère le dossier user_servervars que l’on va placer dans le répertoire apps/ d’ownCloud :

cd /var/www/owncloud/apps/
wget http://ftp.espci.fr/pub/ownCloud/user_servervars.zip
unzip user_servervars.zip
rm user_servervars.zip
chown apache:apache user_servervars -R

On édite le fichier user_servervars/settings.php et on commente la ligne :

// define('SERVERVARS_RO_BINDING', true);

Enfin, via l’interface web, on active l’application “Login with server’s variables”.

Configuration de l’authentification

On va se concentrer sur deux configurations, une imposant l’authentification fédé et une autre permettant de déclencher l’auth quand on le souhaite. Il y a un peu de conf à faire coté Apache et aussi un peu coté panneau admin d’OC.

La première configuration, laisse passer les utilisateurs non authentifiés fédé mais l’auth peut être déclenchée quand on veut. Les utilisateurs pourront donc s’authentifier avec les comptes locaux mais on pourra aussi authentifier des utilisateurs externes et leur créer un compte OC. Cette solution est très flexible et conviendra dans une majorité de situations.

Dans la conf de votre vhost Apache il y a très peu de changement par rapport à une auth SSO classique, on passe la directive requireSession à 0 :

DocumentRoot /var/www/owncloud
<Directory />
        Order allow,deny
        Allow from all

        # Auth Shibb
        AuthType shibboleth
        ShibRequestSetting requireSession 0
        ShibRequestSetting applicationId <oc-shibb_id>
        Require shibboleth

        ShibUseHeaders On
</Directory>

Remplacer <oc-shibb_id> par le nom du SP dans le fichier shibboleth2.xml.

Et dans le panel d’admin de l’application user_servervars :

L’URL pour le login à cette forme :
https://<mon_owncloud>.<mon_domaine>/Shibboleth.sso/Login?target=https://<mon_owncloud>.<mon_domaine>/?app=user_servervars

Et celle pour le logout :
https://<mon_owncloud>.<mon_domaine>/Shibboleth.sso/Logout

Enfin, il faut mapper les attributs renvoyés par l’IdP sur des attributs internes à ownCloud. Ici un exemple derrière un RP, à vous de l’adapter :

Note : Il y a actuellement un bug avec les checkbox qui refusent de se cocher, cela vient sûrement de chrome ?!?! Il faut aller modifier dans la table oc_appconfig et mettre servervars_autocreate et servervars_update_user_data à 1 :

UPDATE `<oc-db_name>`.`oc_appconfig` SET `configvalue` = '1' WHERE `oc_appconfig`.`appid` = 'user_servervars' AND `oc_appconfig`.`configkey` = 'servervars_autocreate' ;
UPDATE `<oc-db_name>`.`oc_appconfig` SET `configvalue` = '1' WHERE `oc_appconfig`.`appid` = 'user_servervars' AND `oc_appconfig`.`configkey` = 'servervars_update_user_data' ;

Il faudra modifier le template de la page d’accueil d’OC pour y ajouter le lien déclenchant l’authentification fédération pointant sur :
https://<mon_owncloud>.<mon_domaine>/?app=user_servervars

Autre cas d’utilisation, on utilise que des comptes externes, OC ne faisant plus d’auth à proprement parler. L’utilisateur est directement redirigé vers l’auth avant même de voir la page d’accueil OC. Dans ce cas, pas de comptes locaux OC. La conf est la même que précédemment, on va juste forcer l’authentification Shibboleth à la racine du site OC et redirigé cette racine vers l’app user_servervars. Il faudra penser à déshibbolétiser la partie remote.php pour les accès hors interface web.

La nouvelle conf Apache :

DocumentRoot /var/www/owncloud
<Directory />
        Order allow,deny
        Allow from all

        RewriteEngine On
        RewriteRule ^/$ /index.php?app=user_servervars [L,R]

        # Auth Shibb
        AuthType shibboleth
        ShibRequestSetting requireSession 1
        ShibRequestSetting applicationId <oc-shibb_id>
        Require valid-user

        ShibUseHeaders On
</Directory>

<Location /remote.php>
        Order allow,deny
        Allow from all
        Satisfy Any
</Location>

Je vous conseille vivement la première méthode d’authentification qui est la plus flexible.

Rescue d’une instance de test

Très souvent, on se retrouve avec un OC totalement inutilisable car une appli est buguée et fait buguer le reste du site … Comment repartir simplement et rapidement ?

  • Premièrement, on se connecte via phpMyAdmin à la base OC et on supprime toutes les bases.
  • On édite ensuite le fichier de conf OC config/config.php et on place la variable installed à false.
  • Enfin, on va sur la racine de OC avec navigateur web et on reconfigure la connexion à la base.

Reverse proxy et ownCloud

Si vous êtes derrière un reverse proxy ou une passerelle qui NAT les requêtes, vous allez sûrement rencontrer des latences pour le chargement de certaines pages, en particulier le panel d’admin. En fait, OC teste des trucs et donc doit pouvoir résoudre son propre nom. On édite le fichier hosts et on ajoute le nom d’hôte de notre OC :

vim /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 <mon_owncloud>.<mon_domaine>

Si votre reverse proxy ne préserve pas le nom d’hôte initial (ProxyPreserveHost), il est possible de le définir de façon statique :
http://doc.owncloud.org/server/5.0/admin_manual/configuration/configuration_reverseproxy.html

Si votre brique SP Shibb est sur un reverse proxy, il faut propager les variables serveurs jusqu’au serveur final (celui où est installé OC). On ajoute alors la directive ShibUseHeaders à l’endroit où on fait l’authentification, typiquement dans un “”. De l’autre coté, sur le serveur final, on retrouve nos variables serveurs mais maintenant préfixé avec HTTP_.

Et pour finir cette partie reverse proxy, voici la conf Apache qui va bien pour mettre en œuvre tout ce qui a été vu dans cet article :

        <VirtualHost *:443>
                ServerName <mon_owncloud>.<mon_domaine>
                ServerAdmin <mon_owncloud>@<mon_domaine>

                ProxyPreserveHost On
                ProxyTimeout 300
                SSLProxyEngine On
                # Pas de proxy pour la partie SSO
                ProxyPass /Shibboleth.sso !

                ProxyPass / https://<ip_interne_ownCloud>:443/
                ProxyPassReverse / https://<ip_interne_ownCloud>:443/

                <Location />
                        Order allow,deny
                        Allow from all

                        # Auth Shibb
                        AuthType shibboleth
                        ShibRequestSetting requireSession 0
                        ShibRequestSetting applicationId default
                        Require shibboleth
                        ShibUseHeaders On
                </Location>

                SSLEngine On
                SSLCertificateFile /etc/httpd/conf/ssl/<mon_owncloud>.<mon_domaine>.crt
                SSLCertificateKeyFile /etc/httpd/conf/ssl/<mon_owncloud>.<mon_domaine>.key
                SSLCertificateChainFile /etc/httpd/conf/ssl/cachain.crt

                CustomLog /var/log/httpd/owncloud-access.log combined
                ErrorLog /var/log/httpd/owncloud-error.log
                LogLevel warn
        </VirtualHost>

TODO : Tester le timeout proxy vs le temps d’upload php.

Conclusion

Cette version 5 d’ownCloud ne révolutionne pas l’outil mais renforce les bases. On peut sereinement se lancer dans un prod pour un petit périmètre entre 100 et 200 utilisateurs , avec une architecture simple (1 serveur physique ou des VMs mais sans load balancing). Ce n’est pas l’espace disque qui bloquera en premier, ownCloud est peu gourmand en IO. Par contre, attendez vous à voir votre Apache a genoux… Peut être verrons nous, dans un prochain article, une architecture taillée pour un nombre d’utilisateurs plus élevé ? Pourquoi pas :-)

Références

ArticleGeekcollaboratifdropboxfédération d identitéidentity federationoc5owncloudowncloud v5reverse proxysamlservice providershibbolethuser_servervars
Le contenu de ce site est sous licence Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)

Gamb

DIY

Brassin 1 : Fermentation, refermentation ... dégustation !!!!

Haute dispo de prolo - épisode 1 : Load balancer Piranha