Another Home Page Blog - sshhttps://blog.anotherhomepage.org/2018-04-23T09:30:00+02:00CentOS 7 : installation vraiment minimale - errata2018-04-23T09:30:00+02:002018-04-23T09:30:00+02:00Nils Ratuszniktag:blog.anotherhomepage.org,2018-04-23:/post/2018/04/23/centos-7-installation-vraiment-minimale-errata/<p><img alt="""" src="https://blog.anotherhomepage.org/public/2018/samebutdifferent.jpg">Dans un billet précédent, j'avais réalisé une <a href="/post/centos-7-installation-vraiment-minimale">installation vraiment minimale de CentOS 7</a>. Si globalement le cahier des charges était respecté, je me suis heurté à quelques petites déconvenues, je me suis donc dit qu'un billet sous forme d'errata ne serait pas de trop.</p>
<h3>SELinux</h3>
<p>Bon, d'accord, SELinux est probablement …</p><p><img alt="""" src="https://blog.anotherhomepage.org/public/2018/samebutdifferent.jpg">Dans un billet précédent, j'avais réalisé une <a href="/post/centos-7-installation-vraiment-minimale">installation vraiment minimale de CentOS 7</a>. Si globalement le cahier des charges était respecté, je me suis heurté à quelques petites déconvenues, je me suis donc dit qu'un billet sous forme d'errata ne serait pas de trop.</p>
<h3>SELinux</h3>
<p>Bon, d'accord, SELinux est probablement l'un des composants de CentOS, Fedora et RHEL le plus détesté (ou est-ce systemd ?), car nombreux sont encore les tutoriaux qui commencent par demander de désactiver celui-ci (à tort). Bref, si comme moi vous vous attendez à ce que votre système minimaliste soit paramétré en "Enforcing" (après tout c'est marqué dans le kickstart), pas de chance. Tapez 20 fois la commande <code>setenforce Enforcing</code> si vous voulez, la réponse sera la même : non.</p>
<p>Pourquoi ? Parce que votre serviteur, en allant tailler dans les paquets à la tronçonneuse, s'est débarrassé des politiques SELinux. Sans politique, cela fonctionne moins bien. Comment on les obtient ? En installant deux paquets : <code>selinux-policy</code> et <code>selinux-policy-targeted</code>. N'envisagez pas un seul instant de n'installer que le premier : le système se bloquera au démarrage.</p>
<h3>scp</h3>
<p>Quand on est sur une machine serveur, il n'est a priori pas nécessaire d'installer un quelconque client, sauf cas exceptionnel et identifié. En voici un : sans installer le paquet <code>openssh-clients</code> sur mon serveur minimaliste, je ne peux pas faire de scp vers celui-ci. Je suppose que le binaire scp doit être appelé à un moment quelconque côté serveur, mais toujours est-il que sans, bein ça ne fonctionne pas.</p>
<h3>Perl et la locale</h3>
<p>Celui-ci est assez tordu et concerne les paramétrages de langue. Il se trouve qu'après avoir installé Perl sur ce serveur minimaliste, j'ai voulu lancer un script utilisant ce langage. J'ai eu droit, durant les scripts, à un message de ce genre :</p>
<div class="highlight"><pre><span></span><code>perl: warning: Falling back to the standard locale <span class="o">(</span><span class="s2">"C"</span><span class="o">)</span>.
</code></pre></div>
<p>Alors le pourquoi exact, je ne suis toujours pas certain, je suspecte qu'il manque un paquet et que celui-ci (toujours pas identifié) fait un paramétrage particulier, toujours est-il que je me voyais mal <a href="https://stackoverflow.com/questions/2499794/how-to-fix-a-locale-setting-warning-from-perl" title=""Stackoverflow">modifier ma configuration OpenSSH</a> pour aller jouer avec les variables d'environnement exportées par ce dernier. J'ai préféré finalement <a href="https://qiita.com/Kaisyou/items/9c2c5f5e1b28c24e91b7" title=""CentOS7">ajouter deux petites lignes à /etc/environment</a> :</p>
<div class="highlight"><pre><span></span><code><span class="nv">LANG</span><span class="o">=</span>en_US.utf-8
<span class="nv">LC_ALL</span><span class="o">=</span>en_US.utf-8
</code></pre></div>
<p>Cela force le système en anglais américain, en UTF-8.</p>
<h3>Les logs</h3>
<p>Bon alors celle-là, elle est fantastique : rsyslog n'est du coup plus installé par défaut et certains logiciels n'envoient plus de log, comme OpenSSH : j'ai voulu diagnostiquer des erreurs de connexion SSH et je n'avais pas de fichier <code>/var/log/secure</code> ! En effet, par défaut OpenSSH sous CentOS utilise le protocole syslog pour fournir ses logs. A noter aussi que logrotate manquait, ce qui aurait pu s'avérer plus dramatique au bout de quelques mois sur une machine de production.</p>
<h3>C'est tout ?</h3>
<p>Ce n'est probablement que le début. Je me rends compte à l'usage qu'il me manque pas mal de choses de mon petit confort (vim, less, tmux...). Un autre paquet que je n'ai pas encore réinstallé est NetworkManager, à voir si cela devient vraiment pratique.</p>
<p><em>Vous avez aimé cet article ? Alors partagez-le sur les réseaux sociaux !</em></p>
<p><em>Crédit photo : <a href="https://unsplash.com/photos/PtgLGdMzi-Y" title=""Same">Adam Sherez - Same but different</a>.</em></p>
<h2>Commentaires</h2>
<h3>Le 15/06/2018 06:47 par <a href="http://www.standardtelephonique.org/">Alain C</a></h3>
<p>Merci pour ton tuto ! Perso je me verrais mal bosser sans NetworkManager mais je pense que c'est facile à ré-installer une fois que CentOS 7 est ON ? Non ?
Au plaisir,
Alain</p>
<h3>Le 16/06/2018 12:12 par Nils</h3>
<p>Merci de ton commentaire Alain ! Pour ce qui est de l’installation de NetworkManager sur un système CentOS 7 existant, oui c’est facile, il suffit d’utiliser yum pour les packages ! En revanche si de nombreuses configurations réseau particulières ont été faites (bridge, bonding...) ça sera un peu plus coton.</p>
<p>Personnellement j’ai connu les versions précédentes de CentOS et de Fedora, où NetworkManager n’était pas forcément présent, donc je n’aurais pas de problème sans ;)</p>
<h3>Le 20/06/2018 06:33 par Alain C</h3>
<p>Ok super ! Merci pour ta réponse je vais essayer :)</p>sslh : faire cohabiter SSH et HTTPS2017-12-19T17:25:00+01:002017-12-19T17:25:00+01:00Nils Ratuszniktag:blog.anotherhomepage.org,2017-12-19:/post/2017/12/19/sslh-faire-cohabiter-ssh-et-https/<p><img alt="""" src="https://blog.anotherhomepage.org/public/20160214_183534.jpg">Sur un système Unix libre, il n'est pas possible de faire écouter deux services réseau sur un même port. <a href="http://www.rutschle.net/sslh" title="sslh">sslh</a> est un logiciel qui permet d'écouter sur un port et redirige le trafic vers un service, selon les premiers octets écoutés. Il devient ainsi possible, par exemple, de partager son …</p><p><img alt="""" src="https://blog.anotherhomepage.org/public/20160214_183534.jpg">Sur un système Unix libre, il n'est pas possible de faire écouter deux services réseau sur un même port. <a href="http://www.rutschle.net/sslh" title="sslh">sslh</a> est un logiciel qui permet d'écouter sur un port et redirige le trafic vers un service, selon les premiers octets écoutés. Il devient ainsi possible, par exemple, de partager son port 443 entre un serveur SSH et un serveur HTTPS.</p>
<p>La configuration est très simple, voici ce que j'ai mis en place sur un Raspberry Pi fonctionnant sous NetBSD :</p>
<div class="highlight"><pre><span></span><code><span class="n">verbose</span><span class="o">:</span><span class="w"> </span><span class="kc">false</span><span class="o">;</span><span class="w"></span>
<span class="n">foreground</span><span class="o">:</span><span class="w"> </span><span class="kc">false</span><span class="o">;</span><span class="w"></span>
<span class="n">inetd</span><span class="o">:</span><span class="w"> </span><span class="kc">false</span><span class="o">;</span><span class="w"></span>
<span class="n">numeric</span><span class="o">:</span><span class="w"> </span><span class="kc">false</span><span class="o">;</span><span class="w"></span>
<span class="n">transparent</span><span class="o">:</span><span class="w"> </span><span class="kc">false</span><span class="o">;</span><span class="w"></span>
<span class="n">timeout</span><span class="o">:</span><span class="w"> </span><span class="mi">2</span><span class="o">;</span><span class="w"></span>
<span class="n">user</span><span class="o">:</span><span class="w"> </span><span class="s2">"nobody"</span><span class="o">;</span><span class="w"></span>
<span class="n">pidfile</span><span class="o">:</span><span class="w"> </span><span class="s2">"/var/run/sslh.pid"</span><span class="o">;</span><span class="w"></span>
<span class="n">listen</span><span class="o">:</span><span class="w"></span>
<span class="o">(</span><span class="w"></span>
<span class="w"> </span><span class="o">{</span><span class="w"> </span><span class="n">host</span><span class="o">:</span><span class="w"> </span><span class="s2">"netpi3"</span><span class="o">;</span><span class="w"> </span><span class="n">port</span><span class="o">:</span><span class="w"> </span><span class="s2">"443"</span><span class="o">;</span><span class="w"> </span><span class="o">}</span><span class="w"></span>
<span class="o">);</span><span class="w"></span>
<span class="n">protocols</span><span class="o">:</span><span class="w"></span>
<span class="o">(</span><span class="w"></span>
<span class="w"> </span><span class="o">{</span><span class="w"> </span><span class="n">name</span><span class="o">:</span><span class="w"> </span><span class="s2">"ssh"</span><span class="o">;</span><span class="w"> </span><span class="n">service</span><span class="o">:</span><span class="w"> </span><span class="s2">"ssh"</span><span class="o">;</span><span class="w"> </span><span class="n">host</span><span class="o">:</span><span class="w"> </span><span class="s2">"netpi3"</span><span class="o">;</span><span class="w"> </span><span class="n">port</span><span class="o">:</span><span class="w"> </span><span class="s2">"22"</span><span class="o">;</span><span class="w"> </span><span class="n">probe</span><span class="o">:</span><span class="w"> </span><span class="s2">"builtin"</span><span class="o">;</span><span class="w"> </span><span class="o">},</span><span class="w"></span>
<span class="w"> </span><span class="o">{</span><span class="w"> </span><span class="n">name</span><span class="o">:</span><span class="w"> </span><span class="s2">"ssl"</span><span class="o">;</span><span class="w"> </span><span class="n">host</span><span class="o">:</span><span class="w"> </span><span class="s2">"netpi3"</span><span class="o">;</span><span class="w"> </span><span class="n">port</span><span class="o">:</span><span class="w"> </span><span class="s2">"8443"</span><span class="o">;</span><span class="w"> </span><span class="n">probe</span><span class="o">:</span><span class="w"> </span><span class="s2">"builtin"</span><span class="o">;</span><span class="w"> </span><span class="o">}</span><span class="w"></span>
<span class="o">);</span><span class="w"></span>
</code></pre></div>
<p>Avec cette configuration, sslh redirige le trafic SSH vers netpi3 sur le port 443 vers netpi3 sur le port 22 (j'aurais pû mettre localhost), et redirige aussi le trafic HTTPS vers netpi3 sur le port 443 vers netpi3 sur le port 8443 (j'aurais aussi pû mettre localhost). Un inconvénient à ce système, c'est que le trafic vu par le serveur SSH ou par le serveur HTTPS est vu comme provenant de l'IP hébergeant sslh. Cela peut s'avérer gênant dans la configuration d'un pare-feu ou d'autres outils comme Fail2ban. Il existe toutefois une configuration pour ce dernier, et dans le cas de Linux et de FreeBSD, sslh gère une fonctionnalité de proxy transparent (voir la <a href="http://www.rutschle.net/tech/sslh/README.html" title=""sslh">documentation</a>).</p>
<p>A noter que HTTPS et SSH ne sont pas les seuls protocoles pris en charge. Il est possible de faire pareil avec XMPP et OpenVPN, par exemple.</p>
<p><em>Vous avez aimé cet article ? Alors partagez-le sur les réseaux sociaux !</em></p>
<p><em>Crédit photo : <a href="https://www.flickr.com/photos/134947886@N02/25146087731/" title="20160214_183534">David Verbrugge - 20160214_183534</a>.</em></p>Haveged : ajouter de l'entropie à son VPS Linux2017-05-18T09:00:00+02:002017-05-18T09:00:00+02:00Nils Ratuszniktag:blog.anotherhomepage.org,2017-05-18:/post/2017/05/18/haveged-ajouter-entropie-vps-linux/<p><img alt=""Entropy"" src="https://blog.anotherhomepage.org/public/entropy.jpg" title=""Entropy,">Entre deux bidouilles <a href="/tag/NetBSD">NetBSD</a>, je me suis retrouvé à des bidouilles <a href="/tag/Linux">Linux</a>. Plus particulièrement en jetant un œil à <a href="https://www.ssi.gouv.fr/entreprise/guide/recommandations-pour-un-usage-securise-dopenssh/" title=""Usage">une certaine documentation utile</a>, j'ai pu lire :</p>
<blockquote>
<p>Les clés doivent être générées dans un contexte où la source d’aléa est fiable, ou à défaut dans un environnement où suffisamment d …</p></blockquote><p><img alt=""Entropy"" src="https://blog.anotherhomepage.org/public/entropy.jpg" title=""Entropy,">Entre deux bidouilles <a href="/tag/NetBSD">NetBSD</a>, je me suis retrouvé à des bidouilles <a href="/tag/Linux">Linux</a>. Plus particulièrement en jetant un œil à <a href="https://www.ssi.gouv.fr/entreprise/guide/recommandations-pour-un-usage-securise-dopenssh/" title=""Usage">une certaine documentation utile</a>, j'ai pu lire :</p>
<blockquote>
<p>Les clés doivent être générées dans un contexte où la source d’aléa est fiable, ou à défaut dans un environnement où suffisamment d’entropie a été accumulée.</p>
</blockquote>
<p>Et là, on commence à se poser des questions : qu'est-ce que l'entropie ? Pourquoi faut-il une source fiable ? Comment avoir une meilleure entropie ?</p>
<h3>Entropie et aléa</h3>
<p>Pour résumer, disons que l'entropie c'est la qualité de la génération de nombres aléatoires. C'est un raccourci assez grossier j'en conviens, mais cela évitera d'écrire ou de paraphraser des pavés mathématiques.</p>
<p>Mais alors, pourquoi générer des nombres aléatoires ? Tout simplement parce que cela fait partie de nombreuses bases d'outils cryptographiques, comme par exemple la génération de clés SSH. C'est d'ailleurs l'occasion d'aborder la question du risque qu'on prend si on ne génère pas assez d'aléa dans notre exemple : il devient possible de générer deux fois le même couple de clés SSH, et par conséquent, que quelqu'un soit en mesure de se connecter à une machine à laquelle il ne devrait pas avoir accès.</p>
<p>Si vous pensez que cela n'arrive jamais, il suffit de se rappeler la vulnérabilité OpenSSH Debian. En 2008, la version Debian d'OpenSSL s'est trouvée modifiée, et a eu pour conséquence un très faible nombre de possibilités pour générer des clés SSH. La preuve ? On peut trouver sur cette page l'intégralité des clés DSA (1024 et 2048 bits) et RSA (1024 à 4096 bits) possibles via cette version vulnérable. J'admets volontiers que c'est un cas extrême, mais il a le mérite d'être assez parlant.</p>
<p>Bref, tout ça pour dire que plus on a d'entropie, mieux c'est.</p>
<h3>Mesurer la qualité de l'entropie</h3>
<p>Pour mesurer la qualité de l'entropie, c'est très simple :</p>
<div class="highlight"><pre><span></span><code>$ cat /proc/sys/kernel/random/entropy_avail
<span class="m">175</span>
</code></pre></div>
<p>On voit que cela renvoie un nombre, qui désigne la quantité de nombres aléatoires générés. On dit que ce nombre est la taille de notre réservoir d'entropie. Et donc, plus il est grand, mieux c'est. Sauf que là, 175 sur une VM Vagrant CentOS 7, bein c'est pas glorieux.</p>
<p>Une autre manière de mesurer l'entropie consiste à utiliser l'outil rngtest (disponible dans le paquet rng-tools pour CentOS). Celui-ci va lancer un certain nombre de tests utilisant le standard FIPS-140.</p>
<p>Par exemple :</p>
<div class="highlight"><pre><span></span><code>$ cat /dev/random <span class="p">|</span> rngtest -c <span class="m">1000</span>
rngtest <span class="m">5</span>
Copyright <span class="o">(</span>c<span class="o">)</span> <span class="m">2004</span> by Henrique de Moraes Holschuh
This is free software<span class="p">;</span> see the <span class="nb">source</span> <span class="k">for</span> copying conditions. There is NO warranty<span class="p">;</span> not even <span class="k">for</span> MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
rngtest: starting FIPS tests...
rngtest: bits received from input: <span class="m">96</span>
rngtest: FIPS <span class="m">140</span>-2 successes: <span class="m">0</span>
rngtest: FIPS <span class="m">140</span>-2 failures: <span class="m">0</span>
rngtest: FIPS <span class="m">140</span>-2<span class="o">(</span><span class="m">2001</span>-10-10<span class="o">)</span> Monobit: <span class="m">0</span>
rngtest: FIPS <span class="m">140</span>-2<span class="o">(</span><span class="m">2001</span>-10-10<span class="o">)</span> Poker: <span class="m">0</span>
rngtest: FIPS <span class="m">140</span>-2<span class="o">(</span><span class="m">2001</span>-10-10<span class="o">)</span> Runs: <span class="m">0</span>
rngtest: FIPS <span class="m">140</span>-2<span class="o">(</span><span class="m">2001</span>-10-10<span class="o">)</span> Long run: <span class="m">0</span>
rngtest: FIPS <span class="m">140</span>-2<span class="o">(</span><span class="m">2001</span>-10-10<span class="o">)</span> Continuous run: <span class="m">0</span>
rngtest: input channel speed: <span class="o">(</span><span class="nv">min</span><span class="o">=</span><span class="m">0</span>.000<span class="p">;</span> <span class="nv">avg</span><span class="o">=</span><span class="m">0</span>.000<span class="p">;</span> <span class="nv">max</span><span class="o">=</span><span class="m">0</span>.000<span class="o">)</span>bits/s
rngtest: FIPS tests speed: <span class="o">(</span><span class="nv">min</span><span class="o">=</span><span class="m">0</span>.000<span class="p">;</span> <span class="nv">avg</span><span class="o">=</span><span class="m">0</span>.000<span class="p">;</span> <span class="nv">max</span><span class="o">=</span><span class="m">0</span>.000<span class="o">)</span>bits/s
rngtest: Program run time: <span class="m">21307295</span> microseconds
</code></pre></div>
<p>Et là, ce n'est toujours pas glorieux, car j'ai arrêté l'exécution faute de patience.</p>
<p>Avant de remédier à ce problème, comparons avec une machine physique notre premier indicateur :</p>
<div class="highlight"><pre><span></span><code>$ cat /proc/sys/kernel/random/entropy_avail
<span class="m">3217</span>
</code></pre></div>
<p>On peut aussi constater que le problème d'entropie affecte particulièrement les machines virtuelles. Cela s'explique surtout par le fait qu'elles disposent de beaucoup moins d'éléments qu'une machine physique, et donc moins d'éléments à lire pour espérer y trouver de l'aléa.</p>
<p>Bon, ce n'est pas tout, mais il est temps de remédier à ce problème d'entropie sur cette VM !</p>
<h3>Haveged : générateur d'entropie en espace utilisateur</h3>
<p><a href="http://issihosts.com/haveged/" title=""haveged">Haveged</a> est un logiciel qui se présente sous la forme d'un démon qui reste en espace utilisateur. Il tire son nom de l'algorithme qu'il utilise, HAVEGE (HArdware Volatile Entropy Gathering and Expansion).</p>
<p>Côté installation, rien de plus simple, il suffit, pour CentOS, d'avoir accès au dépôt <a href="https://fedoraproject.org/wiki/EPEL" title="EPEL">Fedora EPEL</a>. Une fois que c'est fait, un simple yum -y install haveged suffit à disposer du logiciel.</p>
<p>Comme il s'agit d'un démon, il faut le démarrer. Sous CentOS 7, cela se fait via systemd :</p>
<div class="highlight"><pre><span></span><code><span class="c1"># systemctl start haveged.service</span>
</code></pre></div>
<p>Et voilà ! Bon d'accord, cela fait peu. Maintenant, vérifions que notre entropie augmente :</p>
<div class="highlight"><pre><span></span><code>$ cat /proc/sys/kernel/random/entropy_avail
<span class="m">1779</span>
</code></pre></div>
<p>Voilà qui est mieux. Vérifions aussi avec rngtest :</p>
<div class="highlight"><pre><span></span><code>$ cat /dev/random <span class="p">|</span> rngtest -c <span class="m">1000</span>
rngtest <span class="m">5</span>
Copyright <span class="o">(</span>c<span class="o">)</span> <span class="m">2004</span> by Henrique de Moraes Holschuh
This is free software<span class="p">;</span> see the <span class="nb">source</span> <span class="k">for</span> copying conditions. There is NO warranty<span class="p">;</span> not even <span class="k">for</span> MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
rngtest: starting FIPS tests...
rngtest: bits received from input: <span class="m">20000032</span>
rngtest: FIPS <span class="m">140</span>-2 successes: <span class="m">1000</span>
rngtest: FIPS <span class="m">140</span>-2 failures: <span class="m">0</span>
rngtest: FIPS <span class="m">140</span>-2<span class="o">(</span><span class="m">2001</span>-10-10<span class="o">)</span> Monobit: <span class="m">0</span>
rngtest: FIPS <span class="m">140</span>-2<span class="o">(</span><span class="m">2001</span>-10-10<span class="o">)</span> Poker: <span class="m">0</span>
rngtest: FIPS <span class="m">140</span>-2<span class="o">(</span><span class="m">2001</span>-10-10<span class="o">)</span> Runs: <span class="m">0</span>
rngtest: FIPS <span class="m">140</span>-2<span class="o">(</span><span class="m">2001</span>-10-10<span class="o">)</span> Long run: <span class="m">0</span>
rngtest: FIPS <span class="m">140</span>-2<span class="o">(</span><span class="m">2001</span>-10-10<span class="o">)</span> Continuous run: <span class="m">0</span>
rngtest: input channel speed: <span class="o">(</span><span class="nv">min</span><span class="o">=</span><span class="m">2</span>.057<span class="p">;</span> <span class="nv">avg</span><span class="o">=</span><span class="m">17</span>.351<span class="p">;</span> <span class="nv">max</span><span class="o">=</span><span class="m">25</span>.915<span class="o">)</span>Mibits/s
rngtest: FIPS tests speed: <span class="o">(</span><span class="nv">min</span><span class="o">=</span><span class="m">44</span>.564<span class="p">;</span> <span class="nv">avg</span><span class="o">=</span><span class="m">139</span>.836<span class="p">;</span> <span class="nv">max</span><span class="o">=</span><span class="m">161</span>.640<span class="o">)</span>Mibits/s
rngtest: Program run time: <span class="m">1237535</span> microseconds
</code></pre></div>
<p>Dans ce dernier cas, la récupération des informations fut quasi-instantanée ! On peu d'ailleurs noter le nombre de tests réalisés avec succès, qui correspond mieux à nos attentes.</p>
<p>Pour ce qui est d'activer haveged au démarrage, il ne faut pas oublier la commande systemctl qui va bien :</p>
<div class="highlight"><pre><span></span><code><span class="c1"># systemctl enable haveged.service</span>
Created symlink from /etc/systemd/system/multi-user.target.wants/haveged.service to /usr/lib/systemd/system/haveged.service.
</code></pre></div>
<p>Selon les distributions, certains paramètres supplémentaires sont accessibles, mais cela fera l'objet d'un autre article ;)</p>
<p>Vous avez aimé cet article ? Alors partagez-le sur les réseaux sociaux ! Si en plus vous avez des remarques, ou des propositions d'améliorations, n'hésitez pas : les commentaires sont là pour ça !</p>
<p><em>Crédit photo : <a href="https://www.flickr.com/photos/teatimer/6773350588/" title="Entropy">teatimer - Entropy</a></em></p>
<h2>Commentaires</h2>
<h3>Le 18/05/2017 16:20 par Melua</h3>
<p>Je vous suggère de lire cet article à ce sujet : si l'instruction RDTSC n'est pas rendue disponible par votre machine hôte, les machines virtuelles recevront toujours le même résultat (ou un résultat prévisible) rendant votre génération par haveged faussement aléatoire.</p>
<p>https://security.stackexchange.com/questions/34523/is-it-appropriate-to-use-haveged-as-a-source-of-entropy-on-virtual-machines</p>
<h3>Le 18/05/2017 20:09 par Nils</h3>
<p>Merci pour ce commentaire très pertinent, Melua !</p>
<p>Cela m'a en effet été remonté sur Mastodon (discussion <a href="https://mastodon.xyz/@Nils/2876532">ici</a>), via le wiki d'Archlinux. Visiblement on mentionne surtout les produits VMware, et un peu VirtualBox, sans que ce dernier soit concerné (je suis du coup tranquille pour le moment). J'espère faire un billet de suivi concernant cette instruction, mais il me faudra chercher pour voir si cette instruction est disponible via d'autres hypverviseurs (je pense particulièrement à Xen en paravirtuel, mais je suis intéressé aussi par KVM et Hyper-V).</p>On vit dans un monde formidable2014-12-17T09:30:00+01:002014-12-17T09:30:00+01:00Nils Ratuszniktag:blog.anotherhomepage.org,2014-12-17:/post/2014/12/17/On-vit-dans-un-monde-formidable/<p>J'ai déjà fait quelques billets sur <a href="http://www.openssh.org/fr/index.html" title="OpenSSH">OpenSSH</a>, c'est toujours un plaisir d'apprendre de nouveaux trucs avec ce logiciel ! Parmi les trucs super chouette, il y a les possibilités d'<a href="/post/2009/11/09/Utilisation-transparente-d-une-passerelle-SSH">utilisation transparente</a>. Si vous avez la flemme de lire le lien, en gros quand je voulais passer au travers d'un serveur …</p><p>J'ai déjà fait quelques billets sur <a href="http://www.openssh.org/fr/index.html" title="OpenSSH">OpenSSH</a>, c'est toujours un plaisir d'apprendre de nouveaux trucs avec ce logiciel ! Parmi les trucs super chouette, il y a les possibilités d'<a href="/post/2009/11/09/Utilisation-transparente-d-une-passerelle-SSH">utilisation transparente</a>. Si vous avez la flemme de lire le lien, en gros quand je voulais passer au travers d'un serveur OpenSSH de manière transparente, j'utilisais ce genre de configuration :</p>
<div class="highlight"><pre><span></span><code><span class="k">Host</span><span class="w"> </span><span class="n">serveurdmz1</span><span class="w"></span>
<span class="w"> </span><span class="n">Hostname</span><span class="w"> </span><span class="n">lenomouladresseipduserveurdepuislapasserelle</span><span class="w"></span>
<span class="w"> </span><span class="n">Port</span><span class="w"> </span><span class="mi">22</span><span class="w"></span>
<span class="w"> </span><span class="n">Protocol</span><span class="w"> </span><span class="mi">2</span><span class="w"></span>
<span class="w"> </span><span class="k">User</span><span class="w"> </span><span class="n">nils</span><span class="w"></span>
<span class="w"> </span><span class="n">ProxyCommand</span><span class="w"> </span><span class="n">ssh</span><span class="w"> </span><span class="n">nils</span><span class="nv">@passerelle</span><span class="w"> </span><span class="ss">"nc %h %p"</span><span class="w"></span>
</code></pre></div>
<p>Depuis OpenSSH 5.4 (ouais, ça date, hein), il n'y a plus besoin de faire appel à Netcat ("nc" dans la directive "ProxyCommand"). Il suffit d'utiliser la commande "ssh -W". Cela donne donc :</p>
<div class="highlight"><pre><span></span><code>Host serveurdmz1
Hostname lenomouladresseipduserveurdepuislapasserelle
Port 22
Protocol 2
User nils
ProxyCommand ssh -W %h:%p passerelle
</code></pre></div>
<p>Y a pas à dire, on vit dans un monde formidable, où des développeurs prennent en compte les utilisations de leur logiciel.</p>freeshell : votre accès terminal UNIX sur internet2013-08-26T09:42:00+02:002013-08-26T09:42:00+02:00Nils Ratuszniktag:blog.anotherhomepage.org,2013-08-26:/post/2013/08/26/freeshell-votre-acces-terminal-UNIX-sur-internet/<p>Je me suis dit que ça serait sympa de vous faire découvrir l'association <a href="http://sdf.org/?faq?BASICS?01" title="SDF">SDF</a> (pour Super Dimension Fortress) et son projet <a href="http://www.freeshell.org" title="Freeshell">freeshell</a> : un accès en mode terminal sur une machine UNIX (NetBSD pour être exact). Cet accès, dans certaines conditions, est gratuit. C'est assez chouette, ça existe depuis très longtemps …</p><p>Je me suis dit que ça serait sympa de vous faire découvrir l'association <a href="http://sdf.org/?faq?BASICS?01" title="SDF">SDF</a> (pour Super Dimension Fortress) et son projet <a href="http://www.freeshell.org" title="Freeshell">freeshell</a> : un accès en mode terminal sur une machine UNIX (NetBSD pour être exact). Cet accès, dans certaines conditions, est gratuit. C'est assez chouette, ça existe depuis très longtemps et permet d'apprendre les rudiments d'UNIX sans forcément installer en physique ou en virtuel ce type d'environnement. L'association fait cela à but éducatif et culturel, et est reconnue "non-profit" (oui, c'est une association américaine).</p>
<p>Pour accéder à freeshell, et créer un compte, il suffit de se munir d'un client SSH et de se connecter de la façon suivante :</p>
<div class="highlight"><pre><span></span><code><span class="n">ssh</span><span class="w"> </span><span class="k">new</span><span class="nv">@sdf</span><span class="p">.</span><span class="n">org</span><span class="w"></span>
</code></pre></div>
<p>il existe d'autres moyens, qui reposent généralement sur SSH ou telnet, sur la page <a href="http://sdf.org/?signup" title=""SDF">d'inscription au service</a>.</p>
<p>J'ai indiqué plus haut que sous certaines conditions, ce service est gratuit : il y a en fait différent niveaux de services, selon ce que vous êtes prêts à payer. Une fois le compte et l'accès créé, vous disposez de certains outils, comme :</p>
<ul>
<li>mutt, pop3, imap, icq, twitter, bsflite (aim), irc (sur le réseau SDF) ;</li>
<li>games, mud, lynx, gopher, TOPS-20 ;</li>
<li>hébergement HTTP statique de type http://yourlogin.sdf.org (d'autres domaines sont possibles) ;</li>
<li>traceroute, ping, whois, dig et d'autres.</li>
</ul>
<p>mais tout ça est dans un shell limité. Si vous consentez à payer une petite somme (historiquement 1 Dollar US), un accès shell "classique" (comprendre : bash, ksh, tcsh, rc ou zsh) vous est alors ouvert, avec bien plus de possibilités, comme le webmail, FTP, SFTP (en entrée, pas en sortie), ou un accès à plus d'outils. Pourquoi le shell limité et pourquoi la somme ? Pour éviter le spam d'une part, et d'autre part car le traitement peut se faire par courrier papier, il suffit d'envoyer un billet de 1 Dollar (ou de 5 Euros) à l'adresse indiquée dans la <a href="http://www.sdf.org/index.cgi?why" title=""SDF">page d'explication</a>.</p>
<p>Encore plus d'outils et de possibilités sont offertes à qui est prêt à mettre un peu plus la main au portefeuille, et certains services sont facturés au mois, comme par exemple un accès VPN. Le tout est hébergé aux USA, et il existe aussi une version européenne, hébergée en Allemagne : <a href="https://sdfeu.org/w/join:join" title=""SDF">SDFEU</a>. Rien que pour l'accès shell, traceroute, dig, whois et autres lynx, c'est assez pratique je trouve, d'avoir un point "de sortie" ailleurs que dans son pays d'origine. Cela permet par exemple de tester des filtrages (géolocalisation ?). C'est aussi, à mon sens, un moyen de disposer d'un hébergement web (statique) peu coûteux et à taille plus humaine, et à finalité moins commerciale.</p>Configuration d'OpenSSH2011-03-14T09:30:00+01:002011-03-14T09:30:00+01:00Nils Ratuszniktag:blog.anotherhomepage.org,2011-03-14:/post/2011/03/14/configuration-openssh/<p><a href="http://www.openssh.org/fr/index.html">OpenSSH</a> est un logiciel formidable, tout le monde le sait. Quelque chose que j'aime beaucoup avec ce logiciel, c'est la manière dont son fichier de configuration permet de simplifier certaines opérations. Je vous propose de voir ou de revoir certaines options qu'on peut ajouter à la suite d'un bloc de …</p><p><a href="http://www.openssh.org/fr/index.html">OpenSSH</a> est un logiciel formidable, tout le monde le sait. Quelque chose que j'aime beaucoup avec ce logiciel, c'est la manière dont son fichier de configuration permet de simplifier certaines opérations. Je vous propose de voir ou de revoir certaines options qu'on peut ajouter à la suite d'un bloc de configuration qu'on stocke généralement dans \~/.ssh/config .</p>
<h3>La base</h3>
<p>On va configurer l'accès à la machine "testdrive" dont l'adresse IP est 192.168.13.37. Commençons avec les informations de base :</p>
<div class="highlight"><pre><span></span><code>Host testdrive
HostName 192.168.13.37
User nils
Protocol 2
Port 22
ServerAliveInterval 5
</code></pre></div>
<p>Lorsque que je taperai la commande "ssh testdrive", OpenSSH me connectera à la machine 192.168.13.37 en tant qu'utilisateur nils, en utilisant la version 2 du protocole SSH, sur le port 22 et vérifiera toutes les 5 secondes si la machine en question est toujours joignable, ce qui peut s'avérer pratique dans certains cas où on peut être déconnecté du réseau pour cause d'inactivité (réseau de téléphonie mobile, proxy...)</p>
<h3>Connexion au travers d'un proxy HTTP</h3>
<div class="highlight"><pre><span></span><code>ProxyCommand /usr/bin/corkscrew monproxy.lan 3128 %h %p ~/.ssh/proxy_auth
</code></pre></div>
<p>Ici, j'utilise un utilitaire nommé <a href="http://www.agroman.net/corkscrew/">Corkscrew</a> qui me permet de me connecter via un proxy HTTP à mon serveur. Dans mon exemple, le proxy écooute sur le port 3128 et nécessite une authentification, j'ai donc ajouté un fichier proxy_auth contenant les identifiants. Les variables %h et %p désignent l'hôte vers qui se connecter et son port. A noter que la plupart des serveurs proxy qu'on peut trouver sont configurés pour ne pas autoriser les ports autres que les ports HTTP, HTTPS, et éventuellement FTP. Il faudra donc peut-être changer le port d'écoute de notre testdrive, et mettre notre serveur SSH sur le port 80 ou 443. A noter que selon l'organisation qui administre le proxy, cette manière de faire peut être vue comme une violation de la charte informatique du réseau, ou de tout autre règlement intérieur. Ne l'utilisez donc que si vous y êtes autorisés !</p>
<h3>Créer un tunnel SOCKS</h3>
<div class="highlight"><pre><span></span><code>DynamicForward 1080
</code></pre></div>
<p>Cette option est très pratique si vous ne voulez pas vous casser la tête à créer un tunnel VPN. Une fois cette option ajoutée à la configuration de votre hôte, et la connexion à celui-ci effective, un tunnel SOCKS écoute sur la boucle locale de votre machine, sur le port 1080. Un cas concret d'utilisation est la connexion à vos sites préférés depuis un point d'accès sans fil public, comme une gare : une fois connecté au réseau, on se connecte en SSH à son serveur, puis on modifie les paramètres de proxy de notre navigateur web pour utiliser un proxy SOCKS dont l'adresse est 127.0.0.1 et le port est 1080. Tout le trafic web du navigateur passe ainsi dans la connexion SSH. Si vous faites souvent le va-et-viens dans votre configuration de proxy, Firefox possède une extension nommée FoxyProxy qui vous facilitera l'existence !</p>
<h3>Créer un tunnel pour rediriger du trafic</h3>
<div class="highlight"><pre><span></span><code>LocalForward 5901 192.168.13.38:5900
</code></pre></div>
<p>Encapsuler un trafic réseau dans SSH est quelque chose de connu, et l'exemple ci-dessus est lui aussi archi-connu : le protocole <a href="https://secure.wikimedia.org/wikipedia/fr/wiki/Virtual_Network_Computing">VNC</a> transite en clair sur le réseau, l'utilisation de SSH permet de chiffrer la transmission entre notre client et notre serveur. On transfère donc le port 5900 de la machine 192.168.13.38 (qui doit être joignable depuis notre machine testdrive) vers le port 5901 local. On lance ensuite notre client VNC en direction la machine localhost sur le port 5901.</p>
<h3>Spécifier l'algorithme de chiffrement</h3>
<div class="highlight"><pre><span></span><code>Ciphers aes128-cbc
</code></pre></div>
<p>De nombreux algorithmes de chiffrement sont disponibles avec OpenSSH, vous pourrez trouver la liste dans les pages de manuel. Certains processeurs (tels que l'<a href="https://secure.wikimedia.org/wikipedia/en/wiki/Geode_%28processor%29#Geode_LX">AMD Geode LX</a> ou le <a href="https://secure.wikimedia.org/wikipedia/en/wiki/VIA_C7">VIA C7</a>) savent déchiffrer certains algorithmes, ce qui les rend plus rapide pour ces types d'opérations. Forcer le chiffrement en <a href="https://secure.wikimedia.org/wikipedia/fr/wiki/Standard_de_chiffrement_avanc%C3%A9">AES 128</a> si vous vous connectez à une machine ayant un CPU AMD Geode peut ainsi s'avérer très efficace pour limiter l'utilisation du CPU et alléger la charge.</p>Utilisation transparente d'une passerelle SSH2009-11-09T11:56:00+01:002009-11-09T11:56:00+01:00Nils Ratuszniktag:blog.anotherhomepage.org,2009-11-09:/post/2009/11/09/Utilisation-transparente-d-une-passerelle-SSH/<p>Ou comment rebondir sans même le faire exprès !</p>
<p>J'aime beaucoup OpenSSH. C'est un très bon logiciel, au-delà des capacités de chiffrement ou de son système de transfert de fichiers. Tunnels et commandes automatisées, authentification par clés, tout est bon dans le poisson ! Comme mon billet en 3 étapes m'a semblé …</p><p>Ou comment rebondir sans même le faire exprès !</p>
<p>J'aime beaucoup OpenSSH. C'est un très bon logiciel, au-delà des capacités de chiffrement ou de son système de transfert de fichiers. Tunnels et commandes automatisées, authentification par clés, tout est bon dans le poisson ! Comme mon billet en 3 étapes m'a semblé clair, je continue sur l'organisation énoncé - possibilités - mise en œuvre.</p>
<h2>C'est quoi ton problème ?</h2>
<p>Imaginons une zone réseau (au hasard une <a href="http://fr.wikipedia.org/wiki/Zone_d%C3%A9militaris%C3%A9e">DMZ</a>) dans laquelle il y a une ou plusieurs machines, possédant toutes un serveur OpenSSH. Une seule machine peut accéder à ce réseau, cette "passerelle" servant de rebond pour accéder aux autres serveurs en SSH. Au bout d'un certain nombre de fois, il devient rébarbatif d'avoir à se connecter d'abord à la "passerelle" puis à se connecter au serveur pour y faire les manipulations désirées. Il faudrait automatiser le rebond pour qu'il se fasse tout seul, en quelque sorte.</p>
<h2>Et t'as quoi comme solution ?</h2>
<p>Il en existe plusieurs. Celle que je décris ici est celle qui me convient le mieux, mais peut ne pas vous satisfaire. Ne la considérez donc pas comme LA solution.Le principe est d'utiliser le fichier de configuration "utilisateur" d'OpenSSH (<em>\~/.ssh/config</em>)pour automatiser le rebond via la directive "ProxyCommand". Commençons d'abord par lister les logiciels nécessaires : il nous suffit d'une machine avec un client OpenSSH (disponible sur tous les unix normalement, et sous Windows avec Cygwin), et sur la machine "passerelle", en plus du serveur OpenSSH, il nous faut le client et Netcat. Notez que dans mon cas :</p>
<ul>
<li>le client est sous NetBSD 5.0.1</li>
<li>la passerelle est sous CentOS 5.4</li>
<li>les serveurs accédés sous sous l'un des deux OS mentionnés ci-dessus</li>
<li>j'ai reproduit ce système avec des RHEL 4</li>
</ul>
<p>La commande de l'outil Netcat est "nc", vérifions donc que les commandes sont disponibles, d'abord le client :</p>
<div class="highlight"><pre><span></span><code><span class="n">nils</span><span class="nv">@client</span><span class="err">:</span><span class="o">~</span><span class="err">$</span><span class="w"> </span><span class="n">which</span><span class="w"> </span><span class="n">ssh</span><span class="w"></span>
<span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">ssh</span><span class="w"></span>
</code></pre></div>
<p>Et puis la passerelle :</p>
<div class="highlight"><pre><span></span><code><span class="n">nils</span><span class="nv">@passerelle</span><span class="err">:</span><span class="o">~</span><span class="err">#</span><span class="w"> </span><span class="n">which</span><span class="w"> </span><span class="n">ssh</span><span class="w"></span>
<span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">ssh</span><span class="w"></span>
<span class="n">nils</span><span class="nv">@passerelle</span><span class="err">:</span><span class="o">~</span><span class="err">#</span><span class="w"> </span><span class="n">which</span><span class="w"> </span><span class="n">nc</span><span class="w"></span>
<span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">nc</span><span class="w"></span>
</code></pre></div>
<p>Le chemin n'est pas forcément le même selon l'OS utilisé, l'important c'est que les outils soient installés.</p>
<h2>On passe à l'action ?</h2>
<p>Rentrons à présent dans le vif du sujet. La configuration ne se fait que depuis la machine cliente, commençons par configurer un accès vers la passerelle. Pour cela, il faut créer un fichier <em>\~/.ssh/config</em>, et l'éditer avec le logiciel qui vous conviendra le mieux : dans mon cas, il s'agit de Vim. N'oublions pas de créer le répertoire .ssh/ s'il n'existe pas :</p>
<div class="highlight"><pre><span></span><code><span class="n">nils</span><span class="nv">@client</span><span class="err">:</span><span class="o">~</span><span class="err">$</span><span class="w"> </span><span class="n">cd</span><span class="w"> </span><span class="o">~</span><span class="w"></span>
<span class="n">nils</span><span class="nv">@client</span><span class="err">:</span><span class="o">~</span><span class="err">$</span><span class="w"> </span><span class="n">mkdir</span><span class="w"> </span><span class="p">.</span><span class="n">ssh</span><span class="w"></span>
<span class="n">nils</span><span class="nv">@client</span><span class="err">:</span><span class="o">~</span><span class="err">$</span><span class="w"> </span><span class="n">chmod</span><span class="w"> </span><span class="mi">600</span><span class="w"> </span><span class="p">.</span><span class="n">ssh</span><span class="w"></span>
<span class="n">nils</span><span class="nv">@client</span><span class="err">:</span><span class="o">~</span><span class="err">$</span><span class="w"> </span><span class="n">cd</span><span class="w"> </span><span class="p">.</span><span class="n">ssh</span><span class="w"></span>
<span class="n">nils</span><span class="nv">@tomb</span><span class="err">:</span><span class="o">~/</span><span class="p">.</span><span class="n">ssh</span><span class="err">$</span><span class="w"> </span><span class="n">touch</span><span class="w"> </span><span class="n">config</span><span class="w"></span>
<span class="n">nils</span><span class="nv">@tomb</span><span class="err">:</span><span class="o">~/</span><span class="p">.</span><span class="n">ssh</span><span class="err">$</span><span class="w"> </span><span class="n">chmod</span><span class="w"> </span><span class="mi">644</span><span class="w"> </span><span class="n">config</span><span class="w"></span>
<span class="n">nils</span><span class="nv">@tomb</span><span class="err">:</span><span class="o">~/</span><span class="p">.</span><span class="n">ssh</span><span class="err">$</span><span class="w"> </span><span class="n">vim</span><span class="w"> </span><span class="n">config</span><span class="w"></span>
</code></pre></div>
<p>Note : les droits sont très importants ! La configuration pour la passerelle est la suivante :</p>
<div class="highlight"><pre><span></span><code>Host passerelle
Hostname lenomouladresseipdelapasserelle
Port 22
Protocol 2
User nils
ProxyCommand none
</code></pre></div>
<p>On remarque que cette configuration n'a pour but que de simplifier les connexions vers la machine passerelle, il devient ainsi aisé de taper <em>ssh passerelle</em> au lieu de <em>ssh nils\@lenomouladresseipdelapasserelle</em> (et le numéro de port si votre serveur OpenSSH n'écoute pas sur le port 22). Passons à la configuration pour accéder au serveur nommé <em>serveurdmz1</em>, qu'on ajoute à la suite du fichier config en cours d'édition :</p>
<div class="highlight"><pre><span></span><code><span class="k">Host</span><span class="w"> </span><span class="n">serveurdmz1</span><span class="w"></span>
<span class="w"> </span><span class="n">Hostname</span><span class="w"> </span><span class="n">lenomouladresseipduserveurdepuislapasserelle</span><span class="w"></span>
<span class="w"> </span><span class="n">Port</span><span class="w"> </span><span class="mi">22</span><span class="w"></span>
<span class="w"> </span><span class="n">Protocol</span><span class="w"> </span><span class="mi">2</span><span class="w"></span>
<span class="w"> </span><span class="k">User</span><span class="w"> </span><span class="n">nils</span><span class="w"></span>
<span class="w"> </span><span class="n">ProxyCommand</span><span class="w"> </span><span class="n">ssh</span><span class="w"> </span><span class="n">nils</span><span class="nv">@passerelle</span><span class="w"> </span><span class="ss">"nc %h %p"</span><span class="w"></span>
</code></pre></div>
<p>On remarque que la directive ProxyCommand utilise directement le nom <em>passerelle</em>, grâce à la configuration précédente. On sauvegarde et on quitte (sous Vi/Vim : Echap puis ZZ). Maintenant on teste le résultat :</p>
<div class="highlight"><pre><span></span><code><span class="n">nils</span><span class="nv">@client</span><span class="err">:</span><span class="o">~</span><span class="err">$</span><span class="w"> </span><span class="n">ssh</span><span class="w"> </span><span class="n">serveurdmz1</span><span class="w"></span>
<span class="n">nils</span><span class="nv">@passerelle</span><span class="s1">'s password:</span>
<span class="s1">nils@serveurdmz1'</span><span class="n">s</span><span class="w"> </span><span class="nl">password</span><span class="p">:</span><span class="w"></span>
<span class="n">nils</span><span class="nv">@serveurdmz1</span><span class="err">:</span><span class="o">~</span><span class="err">$</span><span class="w"></span>
</code></pre></div>
<p>Ce résultat peut différer légèrement, je ne poste pas les acceptations de clés pour les premières connexions. Il suffit maintenant de répéter le deuxième bloc pour chaque serveur de votre "DMZ".</p>
<h2>Observations et améliorations possibles</h2>
<p>Après ce premier essai, on remarque qu'il y a encore de la place pour l'automatisation, en particulier le mot de passe de la passerelle qui est réclamé. Ceci peut être résolu par l'utilisation de clés de chiffrement, comme l'explique très bien <a href="http://linux-attitude.fr/post/Connexion-sans-mot-de-passe">Peck</a>.</p>
<p>Une autre remarque, si on se connecte à deux, trois serveurs : en tapant la commande <em>who</em> sur la passerelle, on voit qu'on est connecté une fois sur la passerelle pour chaque connexion vers un serveur en DMZ. Par exemple, si j'ai un shell sur la passerelle et un shell sur 3 serveurs en DMZ, la commande <em>who</em> sur la passerelle montrera que l'utilisateur nils est connecté 4 fois ! Cela peut s'avérer gênant pour certains. Pour ceux-là, il est préférable de changer de méthode, et de créer un tunnel socks puis d'utiliser ce tunnel pour accéder aux serveurs en DMZ (via la directive <em>ProxyCommand</em>), ou d'essayer de <a href="http://linux-attitude.fr/post/Un-tien-vaut-mieux-que-deux-connexions">mutualiser les connexions</a>. A noter un inconvénient du tunnel socks : il faut d'abord ouvrir le tunnel (et donc un shell) avant de pouvoir se connecter aux serveurs en DMZ.</p>
<h2>Commentaires</h2>
<h3>Le 19/04/2010 11:23 par Flo</h3>
<p>Bonjour,
Une petite question, que signifie le "nc %h %p" ?</p>
<h3>Le 20/04/2010 14:51 par Nils</h3>
<p>Comme indiqué dans le billet, nc est en fait l'outil Netcat. Les options <code>%hi</code> et <code>%pi</code> ne sont pas des options de Netcat mais de la directive <code>ProxyCommand</code>. Elles permettent de passer les arguments du nom d'hôte et du port de la machine de destination à Netcat. Ce qui fait que lorsque tu tapes <code>ssh serveurdmz1</code>, tu obtiens fonctionnellement le même résultat que <code>ssh nils@passerelle "ssh nils@serveurdmz1"</code>. Pour plus d'informations, on peut se référer à la page de manuel <code>ssh_config</code>.</p>Transfert de fichier simple et sécurisé : sftp en chroot2009-10-04T09:33:00+02:002009-10-04T09:33:00+02:00Nils Ratuszniktag:blog.anotherhomepage.org,2009-10-04:/post/2009/10/04/Transfert-de-fichier-simple-et-sécurisé-:-sftp-en-chroot/<p>Meurs, FTP, meurs !</p>
<h2>C'est quoi ton problème ?</h2>
<p>Comme beaucoup de gens, pour transférer des fichiers sur un serveur web, j'utilise souvent <a href="http://fr.wikipedia.org/wiki/File_Transfer_Protocol">FTP</a>. Ce protocole possède plusieurs inconvénients :</p>
<ul>
<li>il faut ouvrir plusieurs ports dans le pare-feu, au moins deux (connexion de contrôle et de données)</li>
<li>le mot de passe transite en …</li></ul><p>Meurs, FTP, meurs !</p>
<h2>C'est quoi ton problème ?</h2>
<p>Comme beaucoup de gens, pour transférer des fichiers sur un serveur web, j'utilise souvent <a href="http://fr.wikipedia.org/wiki/File_Transfer_Protocol">FTP</a>. Ce protocole possède plusieurs inconvénients :</p>
<ul>
<li>il faut ouvrir plusieurs ports dans le pare-feu, au moins deux (connexion de contrôle et de données)</li>
<li>le mot de passe transite en clair sur le réseau, et même si on utilise <a href="http://fr.wikipedia.org/wiki/FTPS">FTPS</a>, qui chiffre la partie authentification, tous les clients et serveurs ne le supportent pas ou de manière boguée (voir chez <a href="http://forum.filezilla-project.org/viewtopic.php?f=2&t=7688">FileZilla</a> pour une explication)</li>
<li>les données transitent en clair (mince, le fichier config.php de mon appli avec les codes d'accès à la base de données...)</li>
<li>gestion du NAT catastrophique (du moins avec <a href="http://vsftpd.beasts.org/">Vsftpd</a>)</li>
</ul>
<p>Du coup, je cherche depuis plusieurs mois à éradiquer FTP de mes machines. Ce qui m'intéresse, c'est de pouvoir enfermer les utilisateurs dans une cage, de sorte qu'ils n'aient accès qu'à leurs données et pas à celles des autres, encore moins les autres fichiers et répertoires du serveurs. On appelle ceci un <a href="http://fr.wikipedia.org/wiki/Chroot">chroot</a>. Je faisais déjà ceci avec Vsftpd, j'espérais donc le faire avec la solution de remplacement. D'ailleurs, cette solution de remplacement était déjà toute trouvée : je désirais utiliser le serveur SFTP contenu dans le très bon logiciel <a href="http://www.openssh.com/fr/index.html">OpenSSH</a>. Maintenant, il me fallait réussir à créer des utilisateurs en leur empêchant d'avoir accès au shell, et en les confinant dans un chroot.</p>
<h2>Et t'as quoi comme solution ?</h2>
<p>Pour enlever l'accès au shell, très facile : tout système Unix qui se respecte possède soit un exécutable nommé <em>false</em>, soit un autre nommé <em>nologin</em>. D'ailleurs ce dernier est très simpliste, regardons sur, au hasard, un système NetBSD 5.0.1 :</p>
<div class="highlight"><pre><span></span><code><span class="n">nils</span><span class="nv">@tomb</span><span class="err">:</span><span class="o">~</span><span class="w"> </span><span class="err">$</span><span class="n">cat</span><span class="w"> </span><span class="o">/</span><span class="n">sbin</span><span class="o">/</span><span class="n">nologin</span><span class="w"> </span>
<span class="err">#!</span><span class="w"> </span><span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">sh</span><span class="w"></span>
<span class="n">echo</span><span class="w"> </span><span class="ss">"This account is currently not available."</span><span class="w"></span>
<span class="k">exit</span><span class="w"> </span><span class="mi">1</span><span class="w"></span>
</code></pre></div>
<p>Il suffit donc de remplacer le shell de l'utilisateur par le chemin vers nologin, et cette question est résolue.</p>
<p>Pour créer et maintenir un chroot, c'est une autre paire de manches. Dans Vsftpd c'était assez simple, et j'espérais trouver aussi simple. De nombreuses pages sur <a href="http://sublimation.org/scponly/wiki/index.php/Main_Page">Scponly</a> ou <a href="http://pizzashack.org/rssh/">rssh</a> expliquent comment faire un chroot pour un utilisateur n'ayant accès qu'à sftp ou scp, mais le jour où il faut mettre à jour l'OS, voire le migrer vers une version majeure plus récente (ou pourquoi pas en changer, comme passer d'un Linux à un BSD ou inversement, ou tout simplement changer de distribution Linux), le chroot doit être maintenu à jour. Et ça, je trouve que c'est totalement contre-productif, en tous cas du point de vue du sysadmin fainéant que nous avons tous en nous ;)</p>
<p>Et là, la lumière est arrivée, par <a href="http://undeadly.org/cgi?action=article&sid=20080220110039">ici</a>. Depuis la version 4.8, OpenSSH permet de créer des chroot, et n'oblige pas à recréer tout un environnement quand il s'agit de sftp. Exactement ce dont j'ai besoin ! Maintenant, reste à savoir quels systèmes disposent d'au moins OpenSSH 4.8.</p>
<p>Une petite liste non-exhaustive des systèmes chanceux :</p>
<ul>
<li>NetBSD 5.0.1</li>
<li>FreeBSD 7.2</li>
<li>Debian Lenny</li>
<li>Mac OS 10.5.8</li>
</ul>
<p>Une autre liste, mais de systèmes moins chanceux :</p>
<ul>
<li>CentOS 3,4,5.X</li>
<li>RHEL 3,4,5.X</li>
<li>Debian Etch</li>
</ul>
<p>Si votre système unix libre (ou pas, d'ailleurs, puisque j'ai listé Mac OS X) comporte OpenSSH, vous pouvez vérifier sa version par :</p>
<div class="highlight"><pre><span></span><code><span class="n">nils</span><span class="nv">@darkmoon</span><span class="err">:</span><span class="o">~</span><span class="w"> </span><span class="err">$</span><span class="n">ssh</span><span class="w"> </span><span class="o">-</span><span class="n">V</span><span class="w"></span>
<span class="n">OpenSSH_5</span><span class="mf">.1</span><span class="n">p1</span><span class="p">,</span><span class="w"> </span><span class="n">OpenSSL</span><span class="w"> </span><span class="mf">0.9.7</span><span class="n">l</span><span class="w"> </span><span class="mi">28</span><span class="w"> </span><span class="n">Sep</span><span class="w"> </span><span class="mi">2006</span><span class="w"></span>
</code></pre></div>
<p>(exemple pris sur un mac) En utilisant sshd au lieu de ssh, ça sera sans doute plus représentatif, mais l'option -V n'existe pas sur le serveur. La réponse retournée donnera quand même la version. Exemple, toujours sur le même mac :</p>
<div class="highlight"><pre><span></span><code><span class="n">nils</span><span class="nv">@darkmoon</span><span class="err">:</span><span class="o">~</span><span class="w"> </span><span class="err">$</span><span class="n">sshd</span><span class="w"> </span><span class="o">-</span><span class="n">V</span><span class="w"></span>
<span class="nl">sshd</span><span class="p">:</span><span class="w"> </span><span class="n">illegal</span><span class="w"> </span><span class="k">option</span><span class="w"> </span><span class="o">--</span><span class="w"> </span><span class="n">V</span><span class="w"></span>
<span class="n">OpenSSH_5</span><span class="mf">.1</span><span class="n">p1</span><span class="p">,</span><span class="w"> </span><span class="n">OpenSSL</span><span class="w"> </span><span class="mf">0.9.7</span><span class="n">l</span><span class="w"> </span><span class="mi">28</span><span class="w"> </span><span class="n">Sep</span><span class="w"> </span><span class="mi">2006</span><span class="w"></span>
<span class="k">usage</span><span class="err">:</span><span class="w"> </span><span class="n">sshd</span><span class="w"> </span><span class="o">[</span><span class="n">-46DdeiqTt</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">-b bits</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">-C connection_spec</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">-f config_file</span><span class="o">]</span><span class="w"></span>
<span class="w"> </span><span class="o">[</span><span class="n">-g login_grace_time</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">-h host_key_file</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">-k key_gen_time</span><span class="o">]</span><span class="w"></span>
<span class="w"> </span><span class="o">[</span><span class="n">-o option</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">-p port</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">-u len</span><span class="o">]</span><span class="w"></span>
</code></pre></div>
<p>Si votre système ne possède pas un OpenSSH assez récent, plusieurs possibilités s'offrent à nous :</p>
<ul>
<li>changer de système</li>
<li>mettre à jour vers la dernière version majeure si celle-ci possède une version assez récente</li>
<li>installer sa propre version d'OpenSSH ou récupérer le paquet qu'aurait fait quelqu'un de généreux</li>
</ul>
<p>La dernière solution est assez documentée pour CentOS et RHEL, pour faire ses propres RPM, mais j'ai décidé de ne pas la suivre, car cela pose le problème des mises à jour : de la même manière que maintenir un chroot ne me satisfait pas, passer mon temps à guetter les nouvelles versions d'OpenSSH pour compiler un paquet ne me plait pas plus. La deuxième solution s'avère sans doute la moins gênante selon les applications en production. De mon côté, j'ai choisi la première : migration de serveur dédié oblige, j'en ai profité pour élargir mes horizons dans le monde des unix libres et depuis quelques mois, ce blog tourne sous NetBSD. C'est donc avec cet OS que je vais décrire la manipulation de création de chroot.</p>
<h2>On passe à l'action ?</h2>
<p>Je pars du principe dorénavant que nous avons un système avec un OpenSSH 4.8 ou supérieur, que le serveur sshd est activé, que nous avons deux utilisateurs : root, et notre utilisateur habituel avec lequel nous faisons tout ce qui n'a pas besoin d'être fait en root. Le but est d'avoir un ou plusieurs utilisateurs supplémentaires, enfermés dans un répertoire défini, sans shell, et pouvant accéder à ce réperoire en sftp. On pourra, en supplément, faire en sorte que l'utilisateur accède à son compte sftp avec une clé (et éventuellement une phrase de passe) plutôt qu'un mot de passe.</p>
<p>Cela va se faire en modifiant dans un premier temps le fichier de configuration <em>/etc/ssh/sshd_config</em> (en tant que root, et le chemin peut varier selon le système). Cherchons la ligne contenant <em>sftp-server</em>, pour NetBSD elle ressemble à ceci :</p>
<div class="highlight"><pre><span></span><code>Subsystem sftp /usr/libexec/sftp-server
</code></pre></div>
<p>On constate que le serveur sftp est un programme externe. Nous allons le remplacer par le sous-système sftp de sshd :</p>
<div class="highlight"><pre><span></span><code>Subsystem sftp internal-sftp
</code></pre></div>
<p>J'ai donc remplacé <em>/usr/libexec/sftp-server</em> par <em>internal-sftp</em>. Allons ensuite à la fin du fichier, et ajoutons les directives suivantes :</p>
<div class="highlight"><pre><span></span><code>Match Group wwwusers
ChrootDirectory %h
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
</code></pre></div>
<p>Cela signifie que pour les utilisateurs du groupe <em>wwwusers</em>, je les emprisonne dans leur répertoire home, je les oblige à utiliser le sftp interne, et je les empêche d'utiliser les différentes techniques de forwarding habituellement à disposition avec sshd. j'aurais pu les chrooter ailleurs, d'autres sites indiquent par exemple <em>/chroot/%u</em>, où <em>%u</em> désigne le nom de l'utilisateur. Une fois ces modifications effectuées, il ne reste qu'à redémarrer le serveur ssh et à créer le groupe et les utilisateurs.</p>
<p>Petit aparté concernant NetBSD 5.01 : j'ai remarqué un bug sur cette version, qui doit aussi être présent dans la 5.0; il ne faut surtout rien ajouter au fichier de configuration <em>/etc/ssh/sshd_config</em> après cette directive, pas même un commentaire ! Si cela venait à arriver, la directive que nous venons d'ajouter serait tout simplement ignorée.</p>
<p>Créons le groupe :</p>
<div class="highlight"><pre><span></span><code><span class="n">root</span><span class="nv">@vhost</span><span class="err">:</span><span class="o">~</span><span class="w"> </span><span class="n">#groupadd</span><span class="w"> </span><span class="n">wwwusers</span><span class="w"></span>
</code></pre></div>
<p>Créons ensuite un utilisateur nommé test :</p>
<div class="highlight"><pre><span></span><code><span class="n">root</span><span class="nv">@vhost</span><span class="err">:</span><span class="o">~</span><span class="w"> </span><span class="n">#useradd</span><span class="w"> </span><span class="o">-</span><span class="n">m</span><span class="w"> </span><span class="o">-</span><span class="n">g</span><span class="w"> </span><span class="n">wwwusers</span><span class="w"> </span><span class="o">-</span><span class="n">s</span><span class="w"> </span><span class="o">/</span><span class="n">sbin</span><span class="o">/</span><span class="n">nologin</span><span class="w"> </span><span class="n">test</span><span class="w"></span>
</code></pre></div>
<p>Attribuons un mot de passe à cet utilisateur :</p>
<div class="highlight"><pre><span></span><code><span class="n">root</span><span class="nv">@vhost</span><span class="err">:</span><span class="o">~</span><span class="w"> </span><span class="n">#passwd</span><span class="w"> </span><span class="n">test</span><span class="w"></span>
<span class="n">Changing</span><span class="w"> </span><span class="n">password</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">test</span><span class="p">.</span><span class="w"></span>
<span class="k">New</span><span class="w"> </span><span class="nl">Password</span><span class="p">:</span><span class="w"></span>
<span class="n">Retype</span><span class="w"> </span><span class="k">New</span><span class="w"> </span><span class="nl">Password</span><span class="p">:</span><span class="w"></span>
</code></pre></div>
<p>(le mot de passe est tapé en aveugle, bien entendu). Ensuite, assurons-nous que le répertoire home de l'utilisateur appartient non pas à l'utilisateur mais à root, avec des permissions en 755. Si ce n'est pas le cas, on y remédie de cette manière :</p>
<div class="highlight"><pre><span></span><code><span class="n">root</span><span class="nv">@vhost</span><span class="err">:</span><span class="o">~</span><span class="w"> </span><span class="n">#chown</span><span class="w"> </span><span class="nl">root</span><span class="p">:</span><span class="n">wheel</span><span class="w"> </span><span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">test</span><span class="w"></span>
<span class="n">root</span><span class="nv">@vhost</span><span class="err">:</span><span class="o">~</span><span class="w"> </span><span class="n">#chmod</span><span class="w"> </span><span class="mi">755</span><span class="w"> </span><span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">test</span><span class="w"></span>
</code></pre></div>
<p>On notera que pour les OS Linux, on indique <em>root:root</em> par rapport à NetBSD qui n'a pas de groupe <em>root</em> mais un groupe <em>wheel</em>. A ne pas oublier aussi, seul <em>/home/test</em> appartient à root, pas les fichiers et répertoires à l'intérieur (i.e. pas de chmod/chown -R)</p>
<p>Depuis une autre machine, vérifions que nous pouvons nous connecter en sftp :</p>
<div class="highlight"><pre><span></span><code><span class="n">sftp</span><span class="w"> </span><span class="n">test</span><span class="nv">@vhost</span><span class="w"></span>
<span class="n">Connecting</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="n">vhost</span><span class="p">...</span><span class="w"></span>
<span class="nl">Password</span><span class="p">:</span><span class="w"></span>
<span class="n">sftp</span><span class="o">></span><span class="w"> </span><span class="n">ls</span><span class="w"></span>
<span class="n">sftp</span><span class="o">></span><span class="w"> </span><span class="n">pwd</span><span class="w"></span>
<span class="n">Remote</span><span class="w"> </span><span class="n">working</span><span class="w"> </span><span class="nl">directory</span><span class="p">:</span><span class="w"> </span><span class="o">/</span><span class="w"></span>
</code></pre></div>
<p>Ici, on remarque que je me suis déjà connecté à cette machine avant, puisqu'on ne me réclame pas d'accepter de clé. On remarque aussi qu'on est directement dans le répertoire / et qu'il n'y a rien, la commande <em>pwd</em> indique <em>/</em> et pas <em>/home/test</em>. Si on crée dans ce répertoire un deuxième <em>/home/test</em>, sftp nous y emmènera directement dedans. De plus, on note qu'on ne peut pas créer ou ajouter de répertoire/fichier (normal, le répertoire appartient à root). Créons donc, sur le serveur, le second “home” de l'utilisateur :</p>
<div class="highlight"><pre><span></span><code><span class="n">root</span><span class="nv">@vhost</span><span class="err">:</span><span class="o">~</span><span class="w"> </span><span class="n">#cd</span><span class="w"> </span><span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">test</span><span class="w"></span>
<span class="n">root</span><span class="nv">@vhost</span><span class="err">:</span><span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">test</span><span class="w"> </span><span class="err">#</span><span class="w"> </span><span class="n">mkdir</span><span class="w"> </span><span class="o">-</span><span class="n">p</span><span class="w"> </span><span class="n">home</span><span class="o">/</span><span class="n">test</span><span class="w"></span>
<span class="n">root</span><span class="nv">@vhost</span><span class="err">:</span><span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">test</span><span class="w"> </span><span class="err">#</span><span class="w"> </span><span class="n">chown</span><span class="w"> </span><span class="o">-</span><span class="n">R</span><span class="w"> </span><span class="nl">test</span><span class="p">:</span><span class="n">wwwusers</span><span class="w"> </span><span class="n">home</span><span class="w"></span>
<span class="n">root</span><span class="nv">@vhost</span><span class="err">:</span><span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">test</span><span class="w"> </span><span class="err">#</span><span class="w"> </span><span class="n">chmod</span><span class="w"> </span><span class="mi">755</span><span class="w"> </span><span class="n">home</span><span class="w"></span>
</code></pre></div>
<p>Reconnectons-nous à notre serveur sftp :</p>
<div class="highlight"><pre><span></span><code><span class="n">sftp</span><span class="w"> </span><span class="n">test</span><span class="nv">@vhost</span><span class="w"></span>
<span class="n">Connecting</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="n">vhost</span><span class="p">...</span><span class="w"></span>
<span class="nl">Password</span><span class="p">:</span><span class="w"></span>
<span class="n">sftp</span><span class="o">></span><span class="w"> </span><span class="n">ls</span><span class="w"></span>
<span class="n">sftp</span><span class="o">></span><span class="w"> </span><span class="n">pwd</span><span class="w"></span>
<span class="n">Remote</span><span class="w"> </span><span class="n">working</span><span class="w"> </span><span class="nl">directory</span><span class="p">:</span><span class="w"> </span><span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">test</span><span class="o">/</span><span class="w"></span>
</code></pre></div>
<p>Je peux maintenant créer des répertoires, envoyer des fichiers, en rapatrier d'autres. Mission accomplie !</p>Forcer openssh à ouvrir un terminal2008-03-05T20:56:00+01:002008-03-05T20:56:00+01:00Nils Ratuszniktag:blog.anotherhomepage.org,2008-03-05:/post/2008/03/05/forcer-openssh-a-ouvrir-un-tty-pour-su-c/<p>Ces jours-ci, j'en apprend des trucs marrants !</p>
<p>L'autre jour, je voulais faire la feignasse : plutôt que de me connecter en ssh, devenir root puis taper une commande (un bête mkdir je crois), et ce sur 5-6 serveurs, je me suis demandé si je ne pouvais pas faire tout ça en …</p><p>Ces jours-ci, j'en apprend des trucs marrants !</p>
<p>L'autre jour, je voulais faire la feignasse : plutôt que de me connecter en ssh, devenir root puis taper une commande (un bête mkdir je crois), et ce sur 5-6 serveurs, je me suis demandé si je ne pouvais pas faire tout ça en une fois, au moins disons une commande par bécane, quitte à juste taper les mots de passe ensuite. Et bien c'est possible !</p>
<p>D'abord, on regarde la page de manuel de ssh, et on voit qu'on peut donner une commande en argument pour juste exécuter cette commande :</p>
<div class="highlight"><pre><span></span><code><span class="n">nils</span><span class="nv">@darkmoon</span><span class="err">:</span><span class="o">~</span><span class="w"> </span><span class="err">$</span><span class="n">ssh</span><span class="w"> </span><span class="n">www</span><span class="p">.</span><span class="n">anotherhomepage</span><span class="p">.</span><span class="n">org</span><span class="w"> </span><span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">uname</span><span class="w"></span>
<span class="n">nils</span><span class="nv">@www</span><span class="p">.</span><span class="n">anotherhomepage</span><span class="p">.</span><span class="n">org</span><span class="err">'</span><span class="n">s</span><span class="w"> </span><span class="nl">password</span><span class="p">:</span><span class="w"> </span>
<span class="n">Linux</span><span class="w"></span>
</code></pre></div>
<p>Ensuite on se dit qu'on rajouterait bien des arguments à notre commande, donc on rajoute des guillemets :</p>
<div class="highlight"><pre><span></span><code><span class="n">nils</span><span class="nv">@darkmoon</span><span class="err">:</span><span class="o">~</span><span class="w"> </span><span class="err">$</span><span class="n">ssh</span><span class="w"> </span><span class="n">www</span><span class="p">.</span><span class="n">anotherhomepage</span><span class="p">.</span><span class="n">org</span><span class="w"> </span><span class="ss">"/bin/uname -sp"</span><span class="w"></span>
<span class="n">nils</span><span class="nv">@www</span><span class="p">.</span><span class="n">anotherhomepage</span><span class="p">.</span><span class="n">org</span><span class="err">'</span><span class="n">s</span><span class="w"> </span><span class="nl">password</span><span class="p">:</span><span class="w"> </span>
<span class="n">Linux</span><span class="w"> </span><span class="n">i686</span><span class="w"></span>
</code></pre></div>
<p>Pour s'amuser, disons qu'on veut faire un truc en tant que root. On peut, si on ne dispose pas de sudo, utiliser "su -c" pour ne taper qu'une commande en tant que root, sous réserve de connaître le mot de passe. Mais si on le fait, on se heurte à un message d'erreur :</p>
<div class="highlight"><pre><span></span><code><span class="n">nils</span><span class="nv">@darkmoon</span><span class="err">:</span><span class="o">~</span><span class="w"> </span><span class="err">$</span><span class="n">ssh</span><span class="w"> </span><span class="n">www</span><span class="p">.</span><span class="n">anotherhomepage</span><span class="p">.</span><span class="n">org</span><span class="w"> </span><span class="ss">"su -c whoami"</span><span class="w"></span>
<span class="n">nils</span><span class="nv">@www</span><span class="p">.</span><span class="n">anotherhomepage</span><span class="p">.</span><span class="n">org</span><span class="err">'</span><span class="n">s</span><span class="w"> </span><span class="nl">password</span><span class="p">:</span><span class="w"> </span>
<span class="n">standard</span><span class="w"> </span><span class="ow">in</span><span class="w"> </span><span class="n">must</span><span class="w"> </span><span class="n">be</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">tty</span><span class="w"></span>
</code></pre></div>
<p>Et là, c'est le drame... comment ouvre-t-on un tty? Un retour dans la page de manuel (merci <a href="http://www.sakana.fr/blog/">Stéphane</a> !) nous apprend que l'option "-t" force ssh à ouvrir un tty. Allez, on recommence :</p>
<div class="highlight"><pre><span></span><code><span class="n">nils</span><span class="nv">@darkmoon</span><span class="err">:</span><span class="o">~</span><span class="w"> </span><span class="err">$</span><span class="n">ssh</span><span class="w"> </span><span class="o">-</span><span class="n">t</span><span class="w"> </span><span class="n">www</span><span class="p">.</span><span class="n">anotherhomepage</span><span class="p">.</span><span class="n">org</span><span class="w"> </span><span class="ss">"su -c whoami"</span><span class="w"></span>
<span class="n">nils</span><span class="nv">@www</span><span class="p">.</span><span class="n">anotherhomepage</span><span class="p">.</span><span class="n">org</span><span class="err">'</span><span class="n">s</span><span class="w"> </span><span class="nl">password</span><span class="p">:</span><span class="w"> </span>
<span class="nl">Password</span><span class="p">:</span><span class="w"> </span>
<span class="n">root</span><span class="w"></span>
<span class="k">Connection</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="n">www</span><span class="p">.</span><span class="n">anotherhomepage</span><span class="p">.</span><span class="n">org</span><span class="w"> </span><span class="n">closed</span><span class="p">.</span><span class="w"></span>
</code></pre></div>
<p>On remarquera que cette fois-ci, on me demande 2 mots de passe : le mot de passe de nils (utilisateur implicite du fait que je suis connecté en tant que nils sur darkmoon), et le mot de passe de root. Le tty est ensuite refermé avec le ssh.</p>
<p>On pourrait bien entendu se passer de taper les mots de passe en utilisant une authentification par clés pour ssh et sudo pour les commandes qui le nécessitent. Ensuite, si on désire faire ceci sur plusieurs machines d'affilée, rien n'empêche d'imbriquer tout ça dans une boucle for. Si la commande lancée après le "su -c" nécessite des arguments, alors on peut utiliser les guillemets simples :</p>
<div class="highlight"><pre><span></span><code><span class="n">nils</span><span class="nv">@darkmoon</span><span class="err">:</span><span class="o">~</span><span class="w"> </span><span class="err">$</span><span class="n">ssh</span><span class="w"> </span><span class="o">-</span><span class="n">t</span><span class="w"> </span><span class="n">www</span><span class="p">.</span><span class="n">anotherhomepage</span><span class="p">.</span><span class="n">org</span><span class="w"> </span><span class="ss">"su -c 'whoami --help'"</span><span class="w"></span>
<span class="n">nils</span><span class="nv">@www</span><span class="p">.</span><span class="n">anotherhomepage</span><span class="p">.</span><span class="n">org</span><span class="err">'</span><span class="n">s</span><span class="w"> </span><span class="nl">password</span><span class="p">:</span><span class="w"> </span>
<span class="nl">Password</span><span class="p">:</span><span class="w"> </span>
<span class="k">Usage</span><span class="err">:</span><span class="w"> </span><span class="n">whoami</span><span class="w"> </span><span class="o">[</span><span class="n">OPTION</span><span class="o">]</span><span class="p">...</span><span class="w"></span>
<span class="k">Print</span><span class="w"> </span><span class="n">the</span><span class="w"> </span><span class="k">user</span><span class="w"> </span><span class="n">name</span><span class="w"> </span><span class="n">associated</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="n">the</span><span class="w"> </span><span class="k">current</span><span class="w"> </span><span class="n">effective</span><span class="w"> </span><span class="k">user</span><span class="w"> </span><span class="n">ID</span><span class="p">.</span><span class="w"></span>
<span class="n">Same</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="n">id</span><span class="w"> </span><span class="o">-</span><span class="n">un</span><span class="p">.</span><span class="w"></span>
<span class="w"> </span><span class="o">--</span><span class="n">help</span><span class="w"> </span><span class="n">display</span><span class="w"> </span><span class="n">this</span><span class="w"> </span><span class="n">help</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="k">exit</span><span class="w"></span>
<span class="w"> </span><span class="o">--</span><span class="n">version</span><span class="w"> </span><span class="k">output</span><span class="w"> </span><span class="n">version</span><span class="w"> </span><span class="n">information</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="k">exit</span><span class="w"></span>
<span class="n">Report</span><span class="w"> </span><span class="n">bugs</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="o"><</span><span class="n">bug</span><span class="o">-</span><span class="n">coreutils</span><span class="nv">@gnu</span><span class="p">.</span><span class="n">org</span><span class="o">></span><span class="p">.</span><span class="w"></span>
<span class="k">Connection</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="n">www</span><span class="p">.</span><span class="n">anotherhomepage</span><span class="p">.</span><span class="n">org</span><span class="w"> </span><span class="n">closed</span><span class="p">.</span><span class="w"></span>
</code></pre></div>
<h2>Commentaires</h2>
<h3>Le 20/03/2008 23:27 par pierre fauquembergue</h3>
<p>Sinon, plus simple il y a cssh ( pour cluster ssh ), ca change la vie !</p>