More secure than `not-at-all` mass Virtual Hosting with
Transcription
More secure than `not-at-all` mass Virtual Hosting with
More secure than 'not-at-all' mass Virtual Hosting with apache 26 juin 2009 - VVT 2009 Geoffroy Desvernay Un site pour chacun Contexte: donner accès à chacun (personnels, enseignants, chercheurs, élèves, associations, services, congrès, …) la possibilité de gérer son site web. Préoccupations usuelles de l'ASR (et du RSSI…): ➢Eviter ➢Ne pas déployer 1 serveur/utilisateur… ➢Eviter ➢Ne les usurpations/vols de données (ex: mots de passe) l'usine à gaz si on ne la maîtrise pas entièrement pas devoir passer trop de temps pour les MAJ, etc. ➢Savoir évaluer/limiter la charge de chaque site (CPU, réseau, RAM, …) Geoffroy Desvernay VVT 2009 Notre cahier des charges: ➢Proposer une 'jolie' URL du type: http://prenom.nom.perso.univ.fr (comme à l'ESIL...) ➢Donner accès aux languages 'CGI' les plus courants (php/perl/python/sh/…) ➢Ne pas trop brider (pour éviter d'avoir à gérer des exceptions, et/ou maintenir un autre système d'hébergement, entre autres) ➢Ne pas trop multiplier les machines (physiques ET virtuelles) → gagner du temps pour les inévitables MAJ de sécurité php… http://dgeo.perso.ec-m.fr/vvt2009/ Le (vieux) problème du « mutualisé » « attaque »: mechant@machine$ cat ~gentil/html/conf.php <?php // informations confidentielles ! // memo: penser à ne pas les donner $conf['db_user']='mylogin'; $conf['db_pass']='mYp455w0rd'; $conf['db_db']='mybase'; ?> Vulnerabitité: umask 022 root@machine$ ls -al ~gentil/html/conf.php -rwxr-xr-x 1 gentil eleves 164 25 jui 14:48 conf.php « solution »: root@machine$ chown :80 /home/*/html root@machine$ chmod 2750 /home/*/html http://dgeo.perso.ec-m.fr/vvt2009/ Le vieux problème du « mutualisé » Attaque II: system('cp -r ../../voisin/html ~/htmlduvoisin'); Ou encore… fopen('../../voisin/html/db.inc.php'); disable_functions = show_source, system, shell_exec, passthru, phpinfo, popen, proc_open, exec, eval, parse_ini_file, fopen, … Et pour le perl/shell/python/c/… ? Attaque III: <pre><?php require('../../voisin/html/db.inc.php'); ?></pre> open_basedir = /home/luietpasunautre → un fichier php.ini par utilisateur ? Et les modules pear ? Et les autres langages ? Et les liens symboliques ? Des solutions existent… metuxmpm: basé sur 'perchild', supporte les threads (pas comme mod_php…) ● mpm-peruser: performant, un process/utilisateur lancé par le « multiplexeur » au besoin, mais dernière mise à jour en 2007 (apache 2.2.3) et rien depuis... le logiciel parfait ? ● mpm-itk: moins performant, mais maintenu. ● mod_vhost-ldap: permet de déplacer la config des vhosts dans un serveur LDAP. (schema spécifique) – pas de support pour mpm-itk ● mod_vhs: permet de définir des virtualhosts depuis des requêtes SQL/ LDAP + usage des mod_ldap et/ou mod_dbd d'apache (cache compris) ● suexec: livré en standard avec apache, peu souple. ● Notre choix: deux solutions différentes ➢1 serveur 'perso' pour tous avec proxy/rewrite+suexec/CGI → performance peu cruciale → seule méthode stable sans aucune (re)configuration manuelle ➢1 serveur 'administratif' avec mod-itk + script 'ldap2apache_jail.pl' Sites 'institutionnels' ➢1 serveur 'guests' avec mod-itk + ldap2apache_jail.pl La création d'un site web « non perso » passe donc par: → 1 compte LDAP → 1 enregistrement DNS ( <= .centrale-marseille.fr) → le script tourne la nuit (ou manuel si urgence) La création d'un site 'perso': → comptes LDAP standards '&(eduPersonAffiliation=member)' → script nocturne 'mails2login.pl' http://dgeo.perso.ec-m.fr/vvt2009/ Serveur 'persos': little picture GET /vvt2009 HTTP/1.1 Host: geoffroy.desvernay.perso.ec-m.fr HTTP/1.x 302 OK Location: http://geoffroy.desvernay.perso.ec-m.fr/vvt2009/ mod_proxy (+mod_security?) ProxyPass (RewriteRule [P]) ProxyPassReverse http://perso.ec-m.fr/~${LOGIN} interpolate GET /~dgeo/vvt2009 HTTP/1.1 Host: perso.ec-m.fr HTTP/1.x 302 OK Location: http://perso.ec-m.fr/~dgeo/vvt2009/ Suexec +userdir Script: suexec/CGI Statique: HTTP/1.x 200 OK http://dgeo.perso.ec-m.fr/vvt2009/ Le proxy ➢On peut utiliser mod_security sur ce 'frontal' ➢Ça n'est qu'un proxy (pas de contenu, ou seulement du statique: erreurs, etc.) ➢On peut «cacher» le vrai serveur, transformer/filtrer certaines pages d'erreur, etc. ➢On peut activer/desactiver des sites avec la RewriteMap RewriteMap mails2login txt:/etc/apache22/mail2uid.map RewriteCond %{SERVER_NAME} ^[-a-z\.0-9]+\.perso\.ec-m\.fr$ [NC] RewriteRule ^(.+) ${lowercase:%{SERVER_NAME}}$1 [C] RewriteRule ^([-a-z\.0-9]+)\.perso[^/]*/(.*)$ http://perso.ecm.fr/~${mails2login:$1}/$2 [L,P,E=LOGIN:${mails2login:$1}] http://dgeo.perso.ec-m.fr/vvt2009/ suexec+php: patch ou binfmt-support suexec+CGI: #!/usr/bin/perl OK… Pour php: ➢Linux: chmod +x + binfmt-support: (debian): update-binfmts --install PHP /usr/bin/php5-cgi --extension php; ➢Autres: Patch suexec + + + if (strnstr(cmd, ".php",-4)) { execl("/usr/local/bin/php-wrapper", "php-wrapper", cmd, NULL); } else { execv(cmd, &argv[3]); Ce patch présuppose l'existence d'un exécutable (script par exemple) 'php-wrapper' qui permettra d'introduire une certaine souplesse dans l'appel du binaire php (autorise 128M de ram pour untel, placer une directive 'open_basedir' personnalisée, … http://dgeo.perso.ec-m.fr/vvt2009/ Avantages/Inconvénients de la « solution » suexec ➢Suexec supporte mod_userdir nativement ➢Le problème des URL's est réglé par mod_rewrite (comme mass virtual hosting par "La firme"), plus mod_proxy. => qui a dit lourd? ➢configuration « une fois pour toutes » ➢Filtrage des sites 'actifs' via une RewriteMap ➢Droits sur les fichiers: - Les scripts doivent être protégés - les fichiers statiques (html, css, images, etc.) doivent rester lisibles par tous… - l'utilisateur moyen ne sait pas utiliser chmod… ➢suexec et php: binfmt-support ou patch ➢Performance de PHP/CGI => fastcgi ? http://dgeo.perso.ec-m.fr/vvt2009/ Pour les sites non 'perso': mpm-itk Le serveur entier emprunte l'identité de l'utilisateur, ce qui simplifie la gestion (droits sur les fichiers, accounting, …) On peut gérer plus finement la priorité des uns et des autres, et utiliser les limites du système (limits.conf, login.conf, etc.) Inconvénient: un fichier de conf par utilisateur... => Les configs sont générées par le script ldap2apache.pl => idéal pour des comptes/sites type services (rh, cri, …) => installation/configuration beaucoup plus simple http://dgeo.perso.ec-m.fr/vvt2009/ Gestion des logs… ➢Syslog vers un serveur central (syslog-ng) pour statistiques, traces et analyses httpd.conf: CustomLog "|/usr/bin/logger -h syslog.nettest.egim -p local3.info" syslog-ng.conf: template www_log_template { template("$MSG\n"); template-escape(no); }; destination www_persos { file("/var/log/www/persos.log" template(www_log_template));}; log { source(servint); filter(fh_perso); filter(f_local3); filter(f_is_info); destination(www_persos); }; ➢Awstats (et autres) sur ce serveur, permettant un accès aux statistiques par chacun. → le script ldap2apache.pl génère également des configs awstats, sur le serveur syslog. → awstats génère des pages html statiques la nuit, et met ses bases à jour toutes les 1/2h http://dgeo.perso.ec-m.fr/vvt2009/ L'avenir… mod_vhs+mpm-itk Un patch existe pour mod_vhs 1.0.32 ( pour l'instant dans la liste [email protected] ) Prévu pour la v1.1 (1.2?) de mod_vhs. La solution idéale pour alléger les 'perso' ? Des questions ? …Bon appétit ! http://dgeo.perso.ec-m.fr/vvt2009/