Affichage des articles dont le libellé est webdav. Afficher tous les articles
Affichage des articles dont le libellé est webdav. Afficher tous les articles

jeudi 13 juin 2013

Administration d'un serveur SVN à l'aide de SVN

Ma vie trépidante d'administrateur m'a amené dernièrement à mettre en place un serveur SVN en place (en utilisant le module Apache couplé avec authentification LDAP) et surtout l'isolement de ce serveur dans une bulle derrière des firewalls.

D'un côté c'est vrai que c'est bien la sécurité et tout ça, mais de l'autre, à chaque fois que j'ai envi de modifier un truc sur mon serveur, je suis un peu obligé de me connecter via un VPN + tunnel SSH. Comme chacun sait, je suis un gros feignant et c'est pas par gaîté de coeur que je m'y connecte. C'est donc assez naturellement que je me suis dit : et si j'utilisais un repository SVN pour faire mon administration ? Diabolique non ? De plus je gagnais instantanément un suivi de qui modifié quoi sur mon serveur SVN. Très pratique pour savoir qui taper en cas de problème.

Création du repos adminsvn

La première étape a été de créer un repository sur mon serveur qui allait me servir à ça. Pour cela, rien de plus simple, on crée un repository SVN :
$ svnadmin create /var/svn/adminsvn
On crée ensuite un trunk pour faire jolie ainsi qu'un sous-répertoire admin :
$ svn mkdir --parent file:///var/svn/adminsvn/trunk/admin -m "Création d'un trunk/admin"
Nous allons maintenant alimenter le fichier /etc/httpd/svn.d/droits-svn.conf afin de protéger le repository d'administration :
[groups]
admins_svn = yannig,cnorris

[/]
* = rw

[adminsvn:/]
# Personne ne peut lire le contenu de ce repository
* =
# Par contre, les admins SVN ont le droit de tout faire
@admins_svn = rw
Alimentons maintenant nos utilisateurs dans le fichier svn.passwd :
$ htpasswd -nb yannig mdpdeyannig > /etc/httpd/svn.d/svn.passwd
$ htpasswd -nb cnorris chucknorrisnapasbesoindemdp >> /etc/httpd/svn.d/svn.passwd
Ajoutons maintenant ces fichiers dans le repository avec la commande suivante :
$ svn add svn.passwd droits-svn.conf

Mise en place du mécanisme de post commit

Procédons maintenant à un checkout de ce repository SVN dans un coin de notre serveur (en tant qu'utilisateur apache ou www-data selon que vous soyez sous RH ou Debian like) :
$ svn co file:///var/svn/adminsvn/trunk/admin /etc/httpd/svn.d
Nous allons maintenant mettre en place un mécanisme de mise à jour de ce checkout. Rendez-vous dans le répertoire /var/svn/adminsvn/hooks et créons un fichier shell post-commit avec la commande suivante :
echo "svn up /etc/httpd/svn.d" > post-commit
chmod +x post-commit
Comme vous pouvez le voir, le script n'est pas super complexe.

Si vous n'avez pas utiliser le bon utilisateur pour faire le checkout, vous pouvez modifier les droits avec la commandes suivantes :
chown -R apache:apache /etc/httpd/svn.d

Déclaration d'un ensemble de repository dans apache

Déclarons maintenant la racine contenant le repository dans apache en créant le fichier /etc/httpd/conf.d/svn.conf avec le contenu suivant :
<Location /svn>
  DAV svn
  SVNParentPath /var/svn/
  SVNListParentPath On

  Options +Indexes
  AuthType Basic
  AuthName "SVN"

  # Gestion authentification
  AuthBasicProvider file
  AuthzSVNAccessFile /etc/httpd/svn.d/droits-svn.conf
  AuthUserFile /etc/httpd/svn.d/svn.passwd
  Require valid-user
</Location>
Un arrêt/relance de l'ami Apache et nous voilà prêt pour la suite.

NB : Il est bien sûr évidant que vous devez disposer de l'extension mod_dav_svn. Sous RHEL, vous devrez lancer la commande yum suivante pour procéder à l'installation :
yum install mod_dav_svn
Sous Debian, ce module s'appelle libapache2-svn. Vous devrez dans ce cas utiliser la commande suivante :
apt-get install libapache2-svn

Test de notre mécanisme

Cette partie est plus simple puisqu'elle va consister à faire des commits dans notre repository. Pour se faire, vous devez donc vous munir d'un client SVN. En tant que vieux barbu, je fais ça en ligne de commande depuis mon poste Linux :
svn co --username yannig http://monserveursvn/svn/adminsvn/trunk ~/adminsvn
Éditons maintenant votre fichier droits-svn.conf de la manière qu'il nous plaira et lançons le commit :
$ svn diff
Index: changelog.txt
===================================================================
--- droits-svn.conf       (revision 1)
+++ droits-svn.conf       (working copy)
@@ -1,3 +1,4 @@
-admins_svn = yannig,cnorris
+admins_svn = yannig,cnorris,nobody

[/]
* = rw

$ svn ci -m "Ajout de l'utilisateur nobody."
Sending        droits-svn.conf
Transmitting file data .
Committed revision 2.
Allons maintenant faire un tour sur notre serveur pour vérifier que le fichier droits-svn.conf a bien été mis à jour :
$ grep nobody /etc/httpd/svn.d/droits-svn.conf
admins_svn = yannig,cnorris,nobody
La modification a bien été prise en compte. Le mécanisme fonctionne bien comme prévu !

jeudi 31 janvier 2013

Utilisation de webdav en ligne de commande

Depuis quelques temps, j'ai comme projet de faire un serveur de publication. Ce dernier doit héberger des sources et autres RPM mais malheureusement, il n'est pas accessible en SSH et nous devrons passer par du WebDAV (en https).

Voici donc en quelques lignes comment le mettre en oeuvre sur un serveur apache sous RedHat Enterprise/Centos 6.

Configuration du serveur apache

Premier point, nous allons créer un nouveau point webdav pour notre serveur. Pour se faire, rien de bien compliquer, il faut créer un fichier /etc/httpd/conf.d/test-webdav.conf avec le contenu suivant :
Alias /test-webdav /var/www/webdav

<Directory "/var/www/webdav">
  Dav On
  Options Indexes
  AllowOverride None
  Order allow,deny
  Allow from all
</Directory>
Bien penser à alimenter notre fichier de mot de passe (/mon/fichier/htpasswd) à l'aide de l'outil htpasswd. Par la suite, nous utiliserons un utilisateur webdav_access avec xxx comme mot de passe.

Créons maintenant notre répertoire et attribuons les droits à l'utilisateur apache (ou www-data dans le cas d'une debian) :
mkdir /var/www/webdav
chown apache:apache /var/www/webdav
Un arrêt relance de notre serveur apache et tout est prêt pour la suite. Pour s'assurer que nous n'avons rien oublier, nous pouvons essayer d'y accéder à l'aide de curl :
curl -u webdav_access:xxx http://localhost/test-webdav/

Voyons maintenant la suite du programme


Maintenant que notre nouveau contexte fonctionne, nous allons essayer d'uploader un fichier à l'aide de curl. Pour se faire, il faut utiliser l'option -T suivi du fichier à uploader. Ci-dessous un exemple :
curl -u webdav_access:xxx -T welcome.html \
     http://localhost/test-webdav/
Le serveur devrait vous renvoyer une réponse en HTML vous indiquant la réussite de l'opération sous la forme du message suivant :
Resource /test-webdav/welcome.html has been created.
C'est bien beau mais on voudrait également gérer des sous répertoires. Il faut dans ce cas utiliser l'option -X MKCOL. Ci-dessous un exemple :
curl -u webdav_access:xxx -X MKCOL \
     http://localhost/test-webdav/new_dir
Le message suivant devrait vous indiquer que ça s'est bien passé :
Collection /test-webdav/new_dir has been created.
Reste ensuite à rajouter un fichier dans ce répertoire :
curl -u webdav_access:xxx -T welcome.html \
     http://localhost/test-webdav/new_dir/

Utilisation en point de montage

Nous avons vu les possibilités de notre serveur. Sachez qu'il est également possible de monter un serveur webdav sur un serveur Linux. Ci-dessous un exemple de montage de notre point de partage :
mount -t davfs http://localhost/test-webdav/ /mnt
Please enter the username to authenticate with server
http://localhost/test-webdav/ or hit enter for none.
  Username:webdav_access
Please enter the password to authenticate user  with server
http://localhost/test-webdav/ or hit enter for none.
  Password:xxx
Rendons nous maintenant sur le point de montage /mnt et faisons quelques tests.
  • Lister le contenu du répertoire :
# cd /mnt/
# ls
lost+found  new_dir  test_webdav.txt  un  welcome.html
  • Supprimer un répertoire :
rmdir new_dir
  • Copier un fichier :
cp /etc/hosts /mnt/
Bref, vous l'aurez compris, tout ceci se comporte comme un FS normal.