<?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>Le mpg-blog &#187; unix-user</title>
	<atom:link href="http://weblog.elzevir.fr/par-tag/unix-user/feed/" rel="self" type="application/rss+xml" />
	<link>http://weblog.elzevir.fr</link>
	<description>LaTeX et autres geekeries</description>
	<lastBuildDate>Thu, 08 Jul 2010 09:56:40 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>ssh_config(5)</title>
		<link>http://weblog.elzevir.fr/2009/02/ssh_config5/</link>
		<comments>http://weblog.elzevir.fr/2009/02/ssh_config5/#comments</comments>
		<pubDate>Sat, 07 Feb 2009 22:07:34 +0000</pubDate>
		<dc:creator>mpg</dc:creator>
				<category><![CDATA[Informatique générale]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[unix-user]]></category>

		<guid isPermaLink="false">http://weblog.elzevir.fr/2009/02/ssh_config5/</guid>
		<description><![CDATA[Le précédent billet évoquait très brièvement l&#8217;existence du fichier
~/.ssh/config et la possibilité de s&#8217;en servir pour faire des trucs
intéressants. Voyons donc quelques options intéressantes de ce fichier,
intéressant étant défini comme « que j&#8217;utilise »&#8230; 

Structure générale du fichier

Commençons par le commencement, c&#8217;est un fichier texte contenant sur chaque
ligne le nom d&#8217;une option et sa valeur. [...]]]></description>
			<content:encoded><![CDATA[<p>Le précédent billet évoquait très brièvement l&#8217;existence du fichier
<code>~/.ssh/config</code> et la possibilité de s&#8217;en servir pour faire des trucs
intéressants. Voyons donc quelques options intéressantes de ce fichier,
intéressant étant défini comme « que j&#8217;utilise »&#8230; <span id="more-43"></span></p>

<h2>Structure générale du fichier</h2>

<p>Commençons par le commencement, c&#8217;est un fichier texte contenant sur chaque
ligne le nom d&#8217;une option et sa valeur. Le fichier est séparés en blocs
commençant par l&#8217;option <code>Host</code>, les directives de chaque bloc ne s&#8217;appliquant
qu&#8217;aux hôtes qui correspondent au motif indiqué. Par exemple</p>

<pre><code>Host *.math.utah.edu
User g-pdm
</code></pre>

<p>dit qu&#8217;à chaque fois que je me connecte à un hôte du domaine <code>math.utah.edu</code>,
mon nom d&#8217;utilisateur est <code>g-pdm</code>. En clair, les deux lignes suivantes
deviennent équivalentes :</p>

<pre><code>$ scp foo sunset.math.utah.edu:
$ scp foo g-pdm@sunset.math.utah.edu:
</code></pre>

<p>Comme on le voit, les options de <code>ssh-config</code> sont  utilisée par tous les outils
de la suite, et pas seulement par la commande <code>ssh</code>.</p>

<h2>Alias</h2>

<p>Précisons que <code>Host</code> se réfère au nom d&#8217;hôte que vous saisissez sur la ligne de
commande, qui peut être différent du nom d&#8217;hôte réel, lequel se spécifie alors
avec <code>HostName</code>. Par exemple, la section suivante n&#8217;a d&#8217;autre but que de
raccourcir mes lignes de commandes en ne tapant que le nom d&#8217;hôte au lieu du nom
pleinement qualifié. (C&#8217;est de la flemme, oui, et alors ?)</p>

<pre><code>Host thue
HostName thue.elzevir.fr
</code></pre>

<p>C&#8217;est aussi pratique pour les hôtes qui n&#8217;ont pas d&#8217;adresse IP publique. Par
exemple j&#8217;ai chez moi une machine principale, et parfois mon laptop qui tourne
et auquel je peux vouloir accéder depuis la fac. Pour cela, j&#8217;utilise les
fonction NAT de ma « libreboîte » (qui porte assez mal son nom, mais passons),
mais c&#8217;est pénible de devoir préciser à chaque fois le numéro de port. L&#8217;entrée
suivant concernait mon ancien laptop (paix à son âme) :</p>

<pre><code>Host siegel
HostName elzevir.fr
Port 12622
HostKeyAlias siegel.elzevir.fr
ForwardAgent yes
</code></pre>

<p>La directive <code>Port</code> se passe sans doute de commentaires, mais si on utilise
qu&#8217;elle, on a vite des problèmes. En effet, l&#8217;hôte en question a la même adresse
que <code>thue</code>, mais une clé publique de serveur SSH différente. Ceci provoque des
avertissements à chaque fois, car le client vérifie que la clé présentée par le
serveur coïncide avec celle enregistrée dans le fichier <code>known_hosts</code>. On peut
désactiver cette vérification, mais ça ne me paraît pas très prudent. Une bonne
solution est fournie par <code>HostKeyAlias</code>, qui permet de donner un nom arbitraire
(et donc unique si on le veut) à l&#8217;entrée de cet hôte dans <code>known_hosts</code>.</p>

<p>Au passage, une directive que j&#8217;aime bien est <code>HashKnownHosts no</code> : c&#8217;est la
valeur par défaut en général, mais dans Debian, c&#8217;est à <code>yes</code>. L&#8217;idée du <code>yes</code>
est que les entrées de <code>known_hosts</code> fournissent à un éventuel intrus des
informations. L&#8217;idée du <code>no</code>, c&#8217;est d&#8217;une part que vous pouvez lire le fichier
et donc le maintenir (effacer les vieilles entrées inutiles, par exemple), et
d&#8217;autre part que ça peut être une source d&#8217;info utile (ça m&#8217;a bien dépanné le
jour où les DNS de mon FAI étaient en rade, d&#8217;avoir des IP d&#8217;hôtes auxquels je
pouvais me connecter, par exemple).</p>

<p>Toujours en passant, j&#8217;ai un peu menti à la fin du dernier billet : en fait,
<code>ForwardAgent</code> vaut <code>no</code> par défaut, et je le passe à <code>yes</code> individuellement par
hôte.</p>

<h2>Tunnels</h2>

<p>La dernière directive que j&#8217;utilise est <code>LocalForward</code>, qui est l&#8217;équivalent de
l&#8217;option <code>-L</code> en ligne de commande. C&#8217;est utile pour les tunnels qu&#8217;on établi
souvent. Par exemple, pour me connecter à la fac, je dois passer par un sas :
les serveurs internes ne sont pas accessibles directement de l&#8217;intérieur. C&#8217;est
embêtant, mais on a plusieurs stratégies pour simplifier la chose. L&#8217;une passe
par l&#8217;utilisation de <code>ProxyCommand</code> : je ne pratique pas, je n&#8217;en dirai donc
rien. Celle que j&#8217;utilise est la suivante.</p>

<pre><code>Host galois2
HostName 127.0.0.1
Port 1033

Host tunnels
HostName sas.math.jussieu.fr
LocalForward 1033 galois2.math.jussieu.fr:22
</code></pre>

<p>J&#8217;établis d&#8217;abord une redirection du port local 1033 vers le port 22 de la
machine à laquelle je veux me connecter via le sas. Cette opération est à
effectuer seulement une fois quand j&#8217;ouvre ma session (je fais ça en même temps
que <code>ssh-add</code> via un alias shell) avec la ligne de commande <code>ssh -Nf tunnels</code>
(<code>-N</code> dit de ne pas exécuter de commande distante (on veut juste rediriger les
ports en fait) et <code>-f</code> de tourner en arrière-plan). Ensuite, je peux me
connecter directement à <code>galois2</code> en tapant juste <code>ssh galois2</code>.</p>

<h2>Ligne de commande</h2>

<p>Oui, le titre du billet est <code>ssh_config(5)</code> et pas <code>ssh(1)</code> ni <code>scp(1)</code>, mais
bon, voyons quand même trois options pratiques en ligne de commande. Le première
est <code>-o</code> qui permet de spécifier sur la ligne de commande toute option
disponible dans le fichier de configuration.</p>

<p>Une autre option que j&#8217;aime, spécifique à <code>scp</code>, est <code>-l</code> pour limiter la bande
passante utilisée (pratique pour un téléchargement non urgent en tâche de fond,
un cron de sauvegarde, etc.)</p>

<p>Enfin, une spécifique à <code>ssh</code> est <code>-t</code>, qui permet de forcer l&#8217;attribution d&#8217;un
<code>tty</code> sur la machine distante, même quand on spécifie une commande distante.
Exemple : je veux me connecter sur <code>thue</code>, mon serveur de fichiers, relié à ma
chaîne hifi, pour y lancer <code>mocp</code>, un lecteur de musique en console. Essayons
naïvement.</p>

<pre><code>mpg@roth:~% ssh thue mocp
Error opening terminal: unknown.
</code></pre>

<p>L&#8217;option <code>-t</code> est faite précisément pour ça. Je l&#8217;utilise aussi pour me
connecter à la fac en choisissant mon shell (on n&#8217;a pas le droit de changer son
shell de login) : <code>ssh -t galois1 'zsh -l'</code> et hop !</p>
]]></content:encoded>
			<wfw:commentRss>http://weblog.elzevir.fr/2009/02/ssh_config5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Petit hack de ssh-agent</title>
		<link>http://weblog.elzevir.fr/2009/01/petit-hack-de-ssh-agent/</link>
		<comments>http://weblog.elzevir.fr/2009/01/petit-hack-de-ssh-agent/#comments</comments>
		<pubDate>Tue, 13 Jan 2009 22:23:14 +0000</pubDate>
		<dc:creator>mpg</dc:creator>
				<category><![CDATA[Informatique générale]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[unix-user]]></category>

		<guid isPermaLink="false">http://weblog.elzevir.fr/2009/01/petit-hack-de-ssh-agent/</guid>
		<description><![CDATA[Si vous êtes un utilisateur régulier de ssh et que vous ne connaissez pas
encore ssh-agent, ruez-vous sur sa documentation. En deux mots, ses
principales fonctionnalités sont :


Garder en cache une copie déchiffrée de votre clé privée ssh, pour vous
éviter d&#8217;avoir à saisir constamment la passphrase.
Permettre de voyager facilement entre différentes machines : les demandes
d&#8217;authentification sont retransmises [...]]]></description>
			<content:encoded><![CDATA[<p>Si vous êtes un utilisateur régulier de <code>ssh</code> et que vous ne connaissez pas
encore <code>ssh-agent</code>, ruez-vous sur sa documentation. En deux mots, ses
principales fonctionnalités sont :</p>

<ol>
<li>Garder en cache une copie déchiffrée de votre clé privée ssh, pour vous
éviter d&#8217;avoir à saisir constamment la <em>passphrase</em>.</li>
<li>Permettre de voyager facilement entre différentes machines : les demandes
d&#8217;authentification sont retransmises à la machine initiale.</li>
</ol>

<p>Mon propos ici n&#8217;est pas de faire un guide de l&#8217;usage normal de <code>ssh-agent</code> mais
plutôt de montrer comment le détourner légèrement.<span id="more-41"></span> L&#8217;usage prévu est que
les processus fils de <code>ssh-agent</code> ou du <em>shell</em> où il a été lancé aient dans
leur environnement une variable <code>SSH_AUTH_SOCK</code> pointant vers un <em>socket</em> Unix
permettant de communiquer avec l&#8217;agent.</p>

<p>Il n&#8217;y a pas longtemps, j&#8217;ai voulu utiliser une connexion ssh dans le contexte
d&#8217;un <em>hook</em> post-commit de Subversion. Il s&#8217;agit par exemple de pages web que je
tiens sous contrôle de version, et dont je souhaite qu&#8217;à chaque <em>commit</em> elles
soient mises à jour sur le serveur web (auquel j&#8217;ai accès par ssh). Ça tombe
bien, je me connecte à mon serveur SVN par la méthode <code>ssh+svn://</code>, et en
principe j&#8217;ai toujours un <code>ssh-agent</code> qui tourne sur la machine de départ.
Problème, les <em>hooks</em> SVN démarrent avec un environnement essentiellement vide.</p>

<p>Il faut donc essayer de retrouver soi-même les informations de <code>ssh-agent</code>. Ce
n&#8217;est pas très difficile, en fait l&#8217;accès au <em>socket</em> n&#8217;est protégé que par les
permissions au niveau du système de fichiers. Les quelques lignes de Perl
suivantes trouvent un <em>socket</em> <code>ssh-agent</code> actif s&#8217;il y en a un et positionnent
la variable <code>SSH_AUTH_SOCK</code> pour permettre son utilisation facile par les fils
du processus courant.</p>


<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">sub</span> hack_ssh_agent <span style="color: #009900;">&#123;</span>
    <span style="color: #000066;">return</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$ENV</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'SSH_AUTH_SOCK'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
    <span style="color: #0000ff;">$success</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">opendir</span> TMP<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;/tmp&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">for</span> <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$dir</span> <span style="color: #009900;">&#40;</span><span style="color: #000066;">grep</span> <span style="color: #009900;">&#40;</span><span style="color: #009966; font-style: italic;">/ssh-/</span><span style="color: #339933;">,</span> <span style="color: #000066;">readdir</span> TMP<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">opendir</span> TEST<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;/tmp/$dir&quot;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$agent</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #000066;">grep</span> <span style="color: #009900;">&#40;</span><span style="color: #009966; font-style: italic;">/^agent/</span><span style="color: #339933;">,</span> <span style="color: #000066;">readdir</span> <span style="color: #009900;">&#40;</span>TEST<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000066;">closedir</span> <span style="color: #009900;">&#40;</span>TEST<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #0000ff;">$ENV</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'SSH_AUTH_SOCK'</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;/tmp/$dir/$agent&quot;</span><span style="color: #339933;">;</span>
        <span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;Trying /tmp/$dir/$agent<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
        <span style="color: #0000ff;">$success</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #000066;">system</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;ssh localhost true&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">last</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$success</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000066;">closedir</span> TMP<span style="color: #339933;">;</span>
    <span style="color: #000066;">die</span> <span style="color: #ff0000;">&quot;Pas moyen de trouver un ssh-agent.<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #b1b100;">unless</span> <span style="color: #0000ff;">$success</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>


<p>Outre l&#8217;utilisation présentée, à savoir récupérer les informations permettant de
se connecter à un <code>ssh-agent</code> depuis un processus qui n&#8217;en est pas un
descendant, je pense que ces quelques lignes de code ont un intérêt pédagogique.
Elles montrent qu&#8217;il est très facile pour <code>root</code> de récupérer les <code>ssh-agent</code> de
tous les utilisateurs s&#8217;il le désire. (Notons quand même que ça ne lui donne pas
accès à la clé déchiffrée de façon permanente, non plus : c&#8217;est déjà ça.)</p>

<p>En soi, ce n&#8217;est pas un grand problème de sécurité : si on a pas confiance en
<code>root</code>, on est de toutes façons déjà dans&#8230; les problèmes jusqu&#8217;au cou. Par
contre, j&#8217;ai un compte sur la machine d&#8217;un ami en qui j&#8217;ai en général toute
confiance mais qui est souvent très blagueur en matière informatique. J&#8217;ai donc
pris soin d&#8217;insérer <code>ForwardAgent no</code> dans mon <code>~/.ssh/config</code> concernant sa
machine.</p>
]]></content:encoded>
			<wfw:commentRss>http://weblog.elzevir.fr/2009/01/petit-hack-de-ssh-agent/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
