Voici la marche à suivre pour protéger l'application [[http://openupload.sourceforge.net|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 [[http://repo.firewall-services.com/|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 @@
+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:
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
# Hote virtuel OpenUpload
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]
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]
====== 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 fichiers. Dans cet exemple, l'application est accessible sur l'URL http://upload.domain.tld/