Archive for septembre, 2010

Avant-propos

Cet article a pour but de mettre en place une redirection de certains des dossiers du profil des utilisateurs (comma par exemple « Mes Documents ») vers un partage SAMBA, sans utiliser de synchronisation avec le serveur à la fermeture de session.
Nous nous limitons ici aux dossiers « Mes Documents » et « Application Data ». En effet, ce sont ces deux dossiers qui sont le plus problématique lors de l’ouverture de la session des utilisateurs, leur taille pouvant être relativement conséquente. Le but de cette procédure est d’éviter la synchronisation de ces données à l’ouverture et à la fermeture de la session utilisateur afin d’optimiser le temps de chargement du profil.

Paramétrage SAMBA

On considère que SAMBA est configuré correctement et est fonctionnel. On suppose entre autre qu’il est paramétré de manière à servir les profils et les répertoire personnels des utilisateurs.

Préparation du serveur

Connectez-vous sur le serveur SAMBA partageant les profils et placez-vous dans le répertoire de l’utilisateur que vous souhaitez migrer. On appellera par la suite data le répertoire personnel de l’utilisateur et winprofile le répertoire contenant son profil. On considère de plus que vos partages SAMBA pour les profils sont situés dans /data/home-profiles/login.
Recopiez les deux dossiers que nous souhaitons déplacer :

sudo cp -rp /data/homes-profiles/login/winprofile/{Mes Documents,Application Data} data/homes-profiles/login/data

Les données sont désormais correctement accessibles.

Préparation du poste client

La configuration du poste s’effectue en 2 temps : une partie en tant qu’administrateur du poste afin d’interdire la fonctionnalité des fichiers disponibles hors connexion, l’autre partie – en utilisateur non privilégie – pour modifier la ruche de l’utilisateur.

Session administrateur

Ouvrez une session avec un utilisateur disposant des privilèges d’administrateur. Ouvrez alors l’éditeur de politique de groupe <code>gpedit.msc</code>. Dans la partie Configuration Utilisateur -> Modèles d’administration -> Réseau -> Fichiers hors connexion, activez le paramètre « Ne pas rendre automatiquement les dossiers redirigés disponibles … ». Dans la partie Configuration Utilisateur -> Modèles d’administration -> Système -> Profils utilisateur, activez le paramètre « Exclure des répertoires dans les profils itinérants » et positionnez la liste des dossiers à exclure comme ceci :

	Application Data;Mes Documents;Local Settings;Temporary Internet Files;History;Temp

Désactiver les fichiers hors connexion depuis l’explorateur de fichier : Outils -> Options, puis dans l’onglet « Fichiers hors connexion », décochez la cas « Autoriser l’utilisation de fichiers hors connexion ».
Fermez alors la session.

Session utilisateur

Nous vous conseillons d’effectuer une copie de sauvegarde des dossiers Mes Documents et Application Data avant d’effectuer ce qui va suivre.

Ouvrez une session avec l’utilisateur que vous souhaitez modifier. Ouvrez l’éditeur de registre regedit pour modifier la ruche locale de l’utilisateur. Recherchez la clé [HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionExplorerUser Shell Folders]. Modifiez les entrées AppData et Personal pour leur donner les valeurs respectives suivantes :

  • \serveur_sambaloginApplication Data
  • \serveur_sambaloginMes Documents

Fermez la session de l’utilisateur. Les 2 dossiers sont supprimés du profil sur le serveur. Vous pouvez le constater avec la commande ls /data/homes-profiles/login/winprofile. Ouvrez de nouveau la session et assurez-vous que Mes Documents pointent effectivement au bon endroit. Supprimez le dossier Application Data encore présent localement dans le profil et lancer une application qui stocke ses paramètres dans ce dossier (Thunderbird par exemple). Si tout fonctionne, la migration a réussi et vous accédez nativement via SAMBA à vos deux dossiers.

Liens

  • Documentation officielle SAMBA

Avant-propos

Cet article a pour but de mettre en place une journalisation par utilisateur dans le cadre de l’utilisation d’une machine de développement web multi-utilisateur. Chacun des développeurs dispose d’un accès à la machine et d’un espace personnel dans lequel il effectue ses développements. Le serveur apache2 est configuré de en utilisant un seul vhost gérant un sous-domaine par développeur. Dans la suite, nous considérerons que ce domaine est domain.tld.
On ne s’intéresse qu’au cas d’un serveur web ne servant pas de page en HTTPS. Cependant, la configuration et la méthode sont strictement identiques. Le script d’écriture des logs tient d’ailleurs compte de ce cas.

Paramétrage DNS

On suppose que votre serveur DNS est configuré correctement pour faire correspondre domain.tld à l’adresse IP du serveur WEB. Notez ici que si vous serveur dispose de plusieurs adresses, nous ne nous intéressons qu’au cas d’une adresse IP unique ; des adaptations seront donc peut-être à apporter si vous avez plusieurs adresses sur la machine.
On suppose également que le serveur est configuré de sorte que n’importe quel nom de la forme user.domain.tld pointe également sur l’adresse IP du serveur.

Paramètrage des comptes utilisateurs

Les fichiers journaux seront stockés dans le répertoire /home/login/log. Ce paramètre est configurable dans le fichier de configuration du script.
La première étape consiste donc à créer ce répertoire pour chacun de vos utilisateurs :

	# mkdir /home/{login1,login2,...,loginN}/log

Le script d’écriture sera lancé sous l’identité sous laquelle sont lancés les fils apache2 : l’information est récupérée grâce aux paramètres fournis dans /etc/apache2/envvars.

Notez que le script nécessite peut-être des adaptations si vous n’êtes pas dans un environnement «debian standard». Si tel est le cas, adapatez la fonction get_apache_user du script décrit plus loin.

On suppose désormais que votre serveur apache tourne sous l’identité www-data. Adaptez les droits des répertoires que vous venez de créer :

	# chown www-data: /home/{login1,login2,...,loginN}/log
	# chmod 775 /home/{login1,login2,...,loginN}/log

Il est possible que vos utilisateurs n’aient pas les droits de lecture sur les fichiers qui seront créés. Si tel est le cas, je vous conseille d’utiliser les ACL :

	# setfacl -m default:group:devel:rx /home/{login1,login2,...,loginN}/log

devel est le groupe dont font partie vos développeurs.

Installation du script

On suppose que votre machine dispose d’une version fonctionnelle de Perl (le contraire serait étonnant, mais bon ;)) Créez le fichier /usr/local/bin/apache_log.pl avec le contenu suivant :

	#!/usr/bin/perl

	use strict;
	use warnings;
	use Carp;

	my $apache_log_dir  = "/var/log/apache2";
	my $apache_conf_file= "/etc/apache2/envvars";

	my $user_log_prefix = "/home";
	my $user_log_dir    = "log";

	my $uid             = 0;
	my $gid             = 0;

	my $user            = "root";
	my $group           = "root";

	# Read the user name from apache configuration.
	# Must be adapted if you do not run apache2 in a standard
	# debian environment.
	sub get_apache_user() {
	    open(APACHE2, $apache_conf_file);
	    my @conf = ;
	    close(APACHE2);

	    my @userLine  = grep(/APACHE_RUN_USER/, @conf);
	    my @groupLine = grep(/APACHE_RUN_GROUP/, @conf);

	    ( $user       = $userLine[0]  ) =~ s/.*APACHE_RUN_USER=(.*)n$/$1/;
	    ( $group      = $groupLine[0] ) =~ s/.*APACHE_RUN_GROUP=(.*)n$/$1/;

	    return ( $user, $group );
	}

	# Change the UID and the GID of the current process to those of apache
	# children.
	sub change_process_identity() {
	    get_apache_user();
	    get_idents();

	    if ( $uid != 0 ) {
		$> = $uid;
	    }

	    if ( $gid != 0 ) {
		$) = $gid;
	    }

	    return;
	}

	# Get the uid and gid of the given user and group
	sub get_idents() {
	    my @uidInfos = getpwnam($user);
	    my @gidInfos = getgrnam($group);

	    if ( @uidInfos || @gidInfos ) {
		$uid = $uidInfos[2];
		$gid = $gidInfos[2];
	    }
	}

	# change the process identity
	my $process = change_process_identity();

	while ( my $line =  ) {
		my @splitted_line = split(/ /, $line);
		my $srvname       = $splitted_line[0];
		my $port          = $splitted_line[1];

		( my $user        = $srvname ) =~ s/(.*).devel.*/$1/;
		my $proto         = ( $port =~ "443" ) ? "ssl_" : "";
		( my $logline     = $line ) =~ s/^$srvname $port //;

		my $filename      = "/home/" . $user . "/log/" . $proto . "apache.log";
		if ( $srvname eq $user ) {
		        $filename = "/var/log/apache2/devel_". $proto . "access.log";
		}

		open(LOG, '>>', $filename);
		print LOG $logline;
		close(LOG);
	}

	exit 0;

Vous pouvez également télécharger ce script ici. Pensez à lui donner les droits d’exécution et à changer le propriétaire en l’utilisateur qui lance apache (dans notre cas, www-data) :

	# chmod ug+x /usr/local/bin/apache_log.pl
	# chown www-data: /usr/local/bin/apache_log.pl

Paramétrage apache

Arrêtez votre serveur apache :

	# /etc/init.d/apache2 stop

Éditez le fichier de configuration de votre vhost gérant le domaine domain.tld (ou bien créez le ;)) :

	<VirtualHost *:80>
		ServerName      domain.tld
		ServerAlias     *.domain.tld
		ServerAdmin     webmaster

		# Le DocumentRoot par défaut
		DocumentRoot /var/www

		# On spécifie un documentroot différent par utilisateur
		VirtualDocumentRoot /home/%1/www

		<Directory /home/*>
		        Options FollowSymLinks MultiViews
		        AllowOverride All
		        Order allow,deny
		        Allow from all
		</Directory>

		# Possible values include: debug, info, notice, warn, error, crit,
		# alert, emerg.
		ErrorLog /var/log/apache2/domain_error.log
		LogLevel warn

		# Format log on 'combined log' definition (see apache2.conf)
		LogFormat "%V %p %h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" domain
		CustomLog "|/usr/local/bin/apache_log.pl" domain
	</VirtualHost>
Notez que vous pouvez procéder d’une manière similaire pour la directive ErrorLog.

Redémarrez alors votre serveur :

	# /etc/init.d/apache2 start

Surveillez les éventuels messages d’erreur :

	# tail -f /var/log/apache2/error.log /var/log/apache2/domain_error.log

Si aucune erreur n’apparaît, c’est que tout fonctionne 😉 Vous devriez voir apparaître les fichiers de journalisation dans les répertoires des utilisateurs dès leur premier accès à leur espace personnel.

Liens

Bienvenue à toutes et à tous !

Pensez à revenir régulièrement, le contenu sera mis à jour d’ici peu 😉