Voici la marche à suivre pour protéger l'application OpenUpload via LemonLDAP, et ainsi profiter du SSO.

Méthode générique

Patcher OpenUpload

La première étape est d'appliquer le patch suivant sur les source d'OpenUpload (patch intégré au rpm disponible sur notre dépôt)

diff -Nur -x '*.orig' -x '*.rej' openupload-0.4.2/lib/main.inc.php mezzanine_patched_openupload-0.4.2/lib/main.inc.php --- openupload-0.4.2/lib/main.inc.php 2010-11-20 11:39:47.000000000 +0100 +++ mezzanine_patched_openupload-0.4.2/lib/main.inc.php 2011-03-18 09:11:21.000000000 +0100 @@ -485,8 +485,14 @@ $this->db->free(); exit(0); } else { - /* save the requested url */ - redirect('?action=login'); + /* Check if HTTP auth is used */ + if (($this->config['auth']=='httpldap') && + isset($_SERVER{$this->config['httpldap']['login']})) { + $this->user->authenticate(); + } else { + /* save the requested url */ + redirect('?action=login'); + } } } if ($_SERVER['QUERY_STRING']!='') diff -Nur -x '*.orig' -x '*.rej' openupload-0.4.2/lib/modules/auth/httpldap.inc.php mezzanine_patched_openupload-0.4.2/lib/modules/auth/httpldap.inc.php --- openupload-0.4.2/lib/modules/auth/httpldap.inc.php 1970-01-01 01:00:00.000000000 +0100 +++ mezzanine_patched_openupload-0.4.2/lib/modules/auth/httpldap.inc.php 2011-03-18 09:18:49.000000000 +0100 @@ -0,0 +1,31 @@ +<?php + +require_once("ldap.inc.php"); +class httpldapAuth extends ldapAuth { + + function httpldapAuth() { + } + + function init() { + $this->config = app()->config['ldap']; + $this->http = app()->config['httpldap']; + $this->ufield = isset($this->config['uid'])?$this->config['uid']:'uid'; + $this->gfield = isset($this->config['gid'])?$this->config['gid']:'gid'; + + /* Which field contains the user login ? */ + $this->http['login'] = isset($this->http['login'])?$this->http['login']:'HTTP_AUTH_USER'; + + /* cannot add or edit users for now */ + $this->features = array('useradmin' => 'no', 'groupadmin' => 'no'); + } + + function authenticate($login,$password) { + $result = false; + if ($_SERVER{$this->http['login']} == $login) + $result = true; + return $result; + } + +} +?> + diff -Nur -x '*.orig' -x '*.rej' openupload-0.4.2/lib/user.inc.php mezzanine_patched_openupload-0.4.2/lib/user.inc.php --- openupload-0.4.2/lib/user.inc.php 2010-11-20 11:39:47.000000000 +0100 +++ mezzanine_patched_openupload-0.4.2/lib/user.inc.php 2011-03-18 09:11:21.000000000 +0100 @@ -69,7 +69,12 @@ return true; // if it's logging in save user and pwd - if (isset($_POST['username'])) { + if ((app()->config['auth']=='httpldap') && + isset($_SERVER{app()->config['httpldap']['login']})) { + $username = $_SERVER{app()->config['httpldap']['login']}; + $password = $_SERVER{app()->config['httpldap']['login']}; + } + elseif (isset($_POST['username'])) { $username = $_POST['username']; $password = $_POST['pwd']; } @@ -94,4 +99,4 @@ } } -?> \ Pas de fin de ligne à la fin du fichier. +?> diff -Nur -x '*.orig' -x '*.rej' openupload-0.4.2/www/config.inc.php.example mezzanine_patched_openupload-0.4.2/www/config.inc.php.example --- openupload-0.4.2/www/config.inc.php.example 2011-03-18 09:19:02.000000000 +0100 +++ mezzanine_patched_openupload-0.4.2/www/config.inc.php.example 2011-03-18 09:11:21.000000000 +0100 @@ -44,6 +44,14 @@ # $CONFIG['auth'] = 'ldap'; $CONFIG['auth'] = 'default'; +/************************************************************ + * HTTP/LDAP detail configuration options * + ************************************************************/ + +# $CONFIG['auth'] = 'httpldap'; +/* This is the field which contains user login */ +# $CONFIG['httpldap']['login'] = 'HTTP_AUTH_USER'; + /* TRANSLATION MODULE */ #$CONFIG['translator']='none';

Activer l'authentification Apache

Le patch ci-dessus ajoute le support de l'authentification apache, ainsi qu'un nouveau plugin pour l'authentification (qui utilise l'authentification apache pour valider les login, et un annuaire LDAP pour récupérer les informations des utilisateurs et des groupes). Il faut activer ce plugin en éditant le fichier de conf www/config/inc.php

$CONFIG['auth'] = 'httpldap'; # Which variable contains user login ? $CONFIG['httpldap']['login'] = 'HTTP_AUTH_USER'; # LDAP configuration, same as the standard ldap plugin [...]

Configurer un virtualhost sur apache

Pour simplifier les règles dans LemonLDAP, il est conseillé de désactiver les alias sur le domaine primaire pour OpenUpload (comme pour toutes les applications protégées par LemonLDAP). Il faut donc éditer /etc/httpd/conf.d/openupload.conf (ou équivalent), supprimer la ligne

Alias /openupload /usr/share/openupload/www

, et créer un virtualhost dont la racine (DocumentRoot) est /usr/share/openupload/www. Par exemple:

<Directory /usr/share/openupload/www>
Options None
Options +Includes
AllowOverride Options
AddType application/x-httpd-php .php
php_admin_value open_basedir /usr/share/openupload:/var/lib/openupload
php_admin_flag file_uploads on
php_admin_flag magic_quotes Off
php_admin_flag magic_quotes_gpc Off
php_admin_value upload_max_filesize 800M
php_admin_value post_max_size 800M
php_admin_value memory_limit 800M
php_admin_value max_execution_time 0
php_admin_value upload_tmp_dir /var/lib/openupload/tmp
php_admin_value session.save_path /var/lib/openupload/tmp
order deny,allow
deny from all
allow from all
#allow from 127.0.0.1
</Directory>
# Hote virtuel OpenUpload
<VirtualHost 0.0.0.0:80>
ServerName upload.domain.tld
DocumentRoot /usr/share/openupload/www
RewriteEngine on
RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK)
RewriteRule .* - [F]
RewriteRule ^/(.*|$) https://%{HTTP_HOST}/$1 [L,R]
</VirtualHost>
<VirtualHost 0.0.0.0:443>
ServerName upload.domain.tld
DocumentRoot /usr/share/openupload/www
PerlHeaderParserHandler My::Package
ErrorDocument 403 http://auth.domain.tld/?lmError=403
ErrorDocument 500 http://auth.domain.tld/?lmError=500
SSLEngine on
RewriteEngine on
RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK)
RewriteRule .* - [F]
</VirtualHost>

Sur SME/iPasserelle

Sur SME/iPasserelle, les réglages sont plus simple, puisque les patches sont intégrés au rpms. Il suffit de lancer ces commandes, après avoir installé le paquet smeserver-openupload:

db configuration setprop openupload Authentication LemonLDAP AliasOnPrimary disabled db domains set upload.$(db configuration get DomainName) domain Content Primary DocumentRoot /usr/share/openupload/www Description 'OpenUpload' LemonLDAP enabled Nameservers internet TemplatePath WebAppVirtualHost signal-event domain-create upload.$(db configuration get DomainName) mkdir -p /etc/e-smith/templates-custom/usr/share/openupload/www/config.inc.php cat <<'EOF' > /etc/e-smith/templates-custom/usr/share/openupload/www/config.inc.php/10paths $CONFIG['WWW_SERVER'] = 'http://upload.{"$DomainName";}'; $CONFIG['WWW_ROOT'] = ''; $CONFIG['INSTALL_ROOT'] = '/usr/share/openupload/'; $CONFIG['DATA_PATH'] = '/var/lib/openupload'; EOF signal-event webapps-update

Déclarer le virtualhost dans LemonLDAP

Sur la console d'administration de LemonLDAP, il faut déclarer ce nouveau virtualhost (dans l'exemple ci-dessus: upload.domain.tld), et créer des règles. Plusieurs types de règles sont possible en fonction de ce que vous cherchez à faire

Règles pour accès totalement privé

Si vous voulez qu'OpenUpload soit totalement fermé, et que seules les personnes authentifiées puissent télécharger et envoyer des fichier, alors une seule règle suffit:

default

Commentaire:

Expression: default

Règle: accept

logout

Commentaire: 01logout

Expression: ^/(?i)(index\.php)?\?(.*)?a(ction)?=logout

Règle: logout_app

La première règle autorisera l'accès à quiconque a une session valide sur LemponLDAP. Il est bien entendu possible de modifier cette règle, par exemple: $groups =~ /\bupload\b/ n'autoriserait que les membres du groupe upload. La seconde règle interceptera les demande de déconnexion pour renvoyer les utilisateurs authentifiés sur le portail.

Règles pour un accès public

Si vous voulez maintenir l'accès aux téléchargements publique, tout en autorisant uniquement les utilisateurs authentifiés à uploader, il faut plus de règles:

Protection contre des requêtes contenant deux actions:

Commentaire: 01deny_double_action

Expression: (a|action)=.*(a|action)=.*

Règle: deny

Autoriser les téléchargements et les suppressions:

Commentaire: 10unprotect_dl

Expression: (a|action)=[dgr]

Règle: unprotect

Autoriser l'accès aux templates

Commentaire: 12unprotect_templates

Expression: ^/templates/

Règle: unprotect

Autoriser l'accès au captcha

Commentaire: 13unprotect_captcha

Expression: ^/plugins/captcha\.php

Règle: unprotect

Autoriser l'accès à l'index (nécessaire pour le téléchargement)

Commentaire: 14unprotect_index

Expression: ^/index\.php$

Règle: unprotect

Interception du lien de logout

Commentaire: 20logout

Expression: (a|action)=logout

Règle: logout_app

Redirection du login

Commentaire: 21login

Expression: (a|action)=login

Règle: logout_app http://upload.domain.tld

Défaut:

Expression: default

Règle: $groups =~ \bopenupload\b/ placez ici la règle que vous voulez pour l'accès à l'application)

Ces règles permettrons aux utilisateurs externes de télécharger les fichiers sans s'authentifier, et n'autorisera que les membres du groupes openupload à se loguer pour envoyer des ficheirs. Dans cet exemple, l'application est accessible sur l'URL http://upload.domain.tld/