<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Trucs Libres &#187; SFTP</title>
	<atom:link href="http://fr.positon.org/tag/sftp/feed" rel="self" type="application/rss+xml" />
	<link>http://fr.positon.org</link>
	<description></description>
	<lastBuildDate>Tue, 23 Feb 2016 20:01:11 +0000</lastBuildDate>
	<language>fr-FR</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.7.1</generator>
	<item>
		<title>Une solution au problème umask : inotify pour forcer les droits</title>
		<link>http://fr.positon.org/une-solution-au-probleme-umask-inotify-pour-forcer-les-droits</link>
		<comments>http://fr.positon.org/une-solution-au-probleme-umask-inotify-pour-forcer-les-droits#comments</comments>
		<pubDate>Thu, 21 Oct 2010 23:29:00 +0000</pubDate>
		<dc:creator><![CDATA[dooblem]]></dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[inotify]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[SFTP]]></category>
		<category><![CDATA[umask]]></category>

		<guid isPermaLink="false">http://positon.org:81/?p=102</guid>
		<description><![CDATA[Trouver une bonne solution au problème du partage des fichiers entre utilisateurs Linux est un cauchemar. Si elle convient il y a la solution de l&#8217;UID unique. Tous les clients accèdent aux fichiers avec le même UID utilisateur. Seulement on ne sais pas qui fait quoi. Et les utilisateurs ne peuvent pas gérer finement leurs [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Trouver une bonne solution au problème du partage des fichiers entre utilisateurs Linux est un cauchemar.</p>
<p>Si elle convient il y a la solution de l&#8217;UID unique. Tous les clients accèdent aux fichiers avec le même UID utilisateur. Seulement on ne sais pas qui fait quoi. Et les utilisateurs ne peuvent pas gérer finement leurs droits.</p>
<p>Problème : le <a href="http://en.wikipedia.org/wiki/Umask">umask</a> par défaut est TOUJOURS 0022, ce qui fait que tout fichier créé aura les droits <code>rw– r–– r––</code>. Seul le propriétaire peut écrire et personne d&#8217;autre.<br />
Pour partager les fichier, un groupe doit aussi pouvoir écrire.</p>
<p>On peut changer ce umask. Pour la ligne de commande, ça se passe dans les fichiers <code>.bashrc</code> ou <code>.profile</code>, ou dans <code>/etc/profile</code> pour tous les utilisateurs. Pour un partage <a href="http://en.wikipedia.org/wiki/SSH_file_transfer_protocol">SFTP</a>, on s&#8217;en sort avec <a href="http://jeff.robbins.ws/articles/setting-the-umask-for-sftp-transactions">un bricolage</a>. Pour le serveur Apache, on s&#8217;en sort avec le fichier <code>/etc/apache2/envvars</code> sous Debian.</p>
<p>Si le partage de fichier se fait via un seul service, c&#8217;est simple de changer le umask, sinon, c&#8217;est compliqué. Et même en changeant tous les umask de tous les services, tout n&#8217;est pas parfait : par exemple, <a href="http://live.gnome.org/Nautilus">Nautilus</a> via SFTP n&#8217;en fait qu&#8217;à sa tête. Certains clients posent le fichiers et font un chmod derrière : l&#8217;enfer. Il y a aussi la puissance des <a href="http://www.suse.de/~agruen/acl/linux-acls/online/">ACL POSIX</a> qui permettent de forcer les droits. Mais là encore, certains clients vous poserons problème.</p>
<p>Enfin, on ne souhaite pas forcément que tous les fichiers soient posés avec l&#8217;écriture pour le groupe. On peut souhaiter une meilleure granularité.</p>
<p>D&#8217;expérience, j&#8217;ai abandonné l&#8217;idée du correctif à la source pour me tourner vers un bricolage agissant APRÈS la création du fichier.<br />
La solution la plus simple est bien sûr la tâche cron, qui toutes les X minutes fait un <code>chmod -R g+w</code> sur un dossier. Déjà la solution n&#8217;est pas immédiate car désynchronisée de la création de fichiers, et elle rajoute une (très) petite charge supplémentaire à votre système.</p>
<p>Je propose une solution à base d&#8217;<a href="http://en.wikipedia.org/wiki/Inotify">inotify</a>, qui force les droits dès qu&#8217;un fichier est créé :</p>
<pre>
aptitude install inotify-tools
</pre>
<p><strong>Et la commande magique :</strong></p>
<pre>
inotifywait -mrq -e CREATE --format %w%f /tmp/mytest/ | while read FILE; do chmod g=u &quot;$FILE&quot;; done
</pre>
<p><strong>MAJ 2010-10-30</strong><br />
Pour gérer les espaces en fin de fichiers, et les antislashs :</p>
<pre>
inotifywait -mrq -e CREATE --format %w%f /tmp/mytest/ | while IFS= read -r FILE; do chmod g=u &quot;$FILE&quot;; done
</pre>
<p>Merci à vitoreiji (voir commentaires)</p>
<p>La commande <code>inotifywait</code> écoute les événements du dossier <code>/tmp/mytest</code>. Dès qu&#8217;un fichier est créé, il est affiché sur la sortie standard. Chaque ligne-fichier est ensuite lue par la boucle <code>while</code> et les droits sont changés. Le <code>g=u</code> donne au groupe les mêmes droits que l&#8217;utilisateur (avec <code>g+w</code>, si l&#8217;utilisateur pose un fichier <code>rw– ––– –––</code>, les droits deviendraient <code>rw– –w– –––</code>).</p>
<p>Vous pouvez maintenant tester la création/copie de fichiers/dossiers. Même un <code>mkdir -p a/b/c/d/e</code> doit fonctionner.</p>
<p>Pour terminer, on ajoutera tout cela dans un script de démarrage :</p>
<pre>
vi /usr/local/bin/inotifywait.sh &amp;&amp; chmod +x /usr/local/bin/inotifywait.sh
#!/bin/sh
# Take the directory name as argument

inotifywait -mrq -e CREATE --format %w%f &quot;$1&quot; | while read FILE
do
	chmod g=u &quot;$FILE&quot;
done
</pre>
<pre>
vi /etc/init.d/inotifywait.sh &amp;&amp; chmod +x /etc/init.d/inotifywait.sh
#! /bin/sh

case &quot;$1&quot; in
  start|&quot;&quot;)

	rm -f /tmp/inotifywait.log
	/usr/local/bin/inotifywait.sh /path/to/dir/ &gt;/tmp/inotifywait.log 2&gt;&amp;1 &amp;
	
	;;
  restart|reload|force-reload)
	echo &quot;Error: argument '$1' not supported&quot; &gt;&amp;2
	exit 3
	;;
  stop)
	# killall inotifywait ???
	;;
  *)
	echo &quot;Usage: inotifywait.sh [start|stop]&quot; &gt;&amp;2
	exit 3
	;;
esac

:
</pre>
<p>(sous Debian)</p>
<pre>
update-rc.d inotifywait.sh defaults
</pre>
<p>Note : un inconvénient : il y a une limite sur le nombre de fichier surveillés, voir l&#8217;option <code>-r</code> dans <code>man inotifywait</code>.</p>
<p>Et enfin la touche finale qui est utile pour que les fichiers créés conservent le groupe du dossier parent : le <a href="http://en.wikipedia.org/wiki/Setuid">bit setgid</a> au groupe pour tous les dossiers.</p>
<pre>
find /path/to/dir -type d -exec chmod g+s {} \;
</pre>
<p><ins>Liens</ins> :</p>
<ul>
<li><code>man inotifywait</code></li>
<li><a href="http://github.com/rvoicilas/inotify-tools/wiki">inotify-tools</a></li>
<li><a href="http://en.wikipedia.org/wiki/Inotify" title="http://en.wikipedia.org/wiki/Inotify">http://en.wikipedia.org/wiki/Inotify</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://fr.positon.org/une-solution-au-probleme-umask-inotify-pour-forcer-les-droits/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>SFTP chroot + rsync</title>
		<link>http://fr.positon.org/sftp-chroot-rsync</link>
		<comments>http://fr.positon.org/sftp-chroot-rsync#comments</comments>
		<pubDate>Fri, 09 Oct 2009 16:12:00 +0000</pubDate>
		<dc:creator><![CDATA[dooblem]]></dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[chroot]]></category>
		<category><![CDATA[rsync]]></category>
		<category><![CDATA[SFTP]]></category>
		<category><![CDATA[SSH]]></category>

		<guid isPermaLink="false">http://positon.org:81/?p=62</guid>
		<description><![CDATA[On le trouve partout. Voici comment créer des partages sftp en chroot. Dans le fichier /etc/ssh/sshd_config : # on utilise le sftp interne d'openssh # car la commande /usr/lib/openssh/sftp-server ne sera pas disponible dans le chroot Subsystem sftp internal-sftp Match group sftp ChrootDirectory %h X11Forwarding no AllowTcpForwarding no ForceCommand internal-sftp MAJ 17/06/2010 : Attention à [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>On le trouve partout. Voici comment créer des partages sftp en chroot.</p>
<p>Dans le fichier <code>/etc/ssh/sshd_config</code> :</p>
<pre>
# on utilise le sftp interne d'openssh
# car la commande /usr/lib/openssh/sftp-server ne sera pas disponible dans le chroot
Subsystem sftp internal-sftp

Match group sftp
        ChrootDirectory %h
        X11Forwarding no
        AllowTcpForwarding no
        ForceCommand internal-sftp
</pre>
<p><strong>MAJ 17/06/2010 :</strong> Attention à la syntaxe ! Les commentaires doivent commencer en début de ligne uniquement, et il ne doit pas y avoir d&#8217;espace en fin de la ligne <code>ForceCommand internal-sftp</code>.</p>
<p>Il suffit ensuite de créer des utilisateurs appartenant au groupe sftp, et le tour est joué.<br />
On teste par :</p>
<pre>
sftp user@myserver.com
</pre>
<p><strong>Problème si on veut utiliser la commande rsync pour transférer des fichiers</strong>, car la commande rsync n&#8217;est pas disponible dans le chroot.</p>
<p>En premier lieu, on autorise d&#8217;autres commandes que &#8220;internal-sftp&#8221; en commentant la ligne :</p>
<pre>
#ForceCommand internal-sftp
</pre>
<p>Ensuite, on crée l&#8217;arborescence suivante dans le dossier chroot :</p>
<pre>
bin/
bin/bash
bin/rsync
lib/
lib/libncurses.so.5
lib/ld-linux.so.2
lib/libacl.so.1
lib/libpopt.so.0
lib/libattr.so.1
lib/i686
lib/i686/cmov
lib/i686/cmov/libdl.so.2
lib/i686/cmov/libc.so.6
</pre>
<p>Il s&#8217;agit des commandes <code>bash</code> et <code>rsync</code>, ainsi que toutes leurs librairies (que l&#8217;on peut obtenir à l&#8217;aide de la commande <code>ldd</code>)</p>
<p>Note : l&#8217;utilisateur doit avoir <code>/bin/bash</code> comme shell par défaut.</p>
<p>Note 2 : le dossier du chroot doit appartenir à root, bien que ça soit le dossier de l&#8217;utilisateur. Pour permettre à l&#8217;utilisateur d&#8217;écrire dedans, il faut créer un sous dossier où il a les droit. C&#8217;est une contrainte importante, mais nécessaire à la sécurité d&#8217;un chroot, vous dirons les programmeurs d&#8217;OpenSSH.</p>
<p><ins>Références</ins> :</p>
<ul>
<li><code>man sshd_config</code></li>
<li><a href="http://www.debian-administration.org/articles/590" title="http://www.debian-administration.org/articles/590">http://www.debian-administration.org/articles/590</a></li>
<li><a href="http://www.howtoforge.org/chrooted-ssh-sftp-tutorial-debian-lenny" title="http://www.howtoforge.org/chrooted-ssh-sftp-tutorial-debian-lenny">http://www.howtoforge.org/chrooted-ssh-sftp-tutorial-debian-lenny</a></li>
<li><a href="http://www.fuschlberger.net/programs/ssh-scp-sftp-chroot-jail/" title="http://www.fuschlberger.net/programs/ssh-scp-sftp-chroot-jail/">http://www.fuschlberger.net/programs/ssh-scp-sftp-chroot-jail/</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://fr.positon.org/sftp-chroot-rsync/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
