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/