Table des matières

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)

Patch pour OpenUpload 0.4.2

Patch pour OpenUpload 0.4.2

openupload-0.4.2-httpldap.patch
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:

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:

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/