1727 lines
123 KiB
HTML
1727 lines
123 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="en">
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<title>Wxcafé</title>
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
<meta name="author" content="wxcafé">
|
||
<link rel="icon" type="image/png" href="//wxcafe.net/theme/img/favicon.ico">
|
||
<!-- Le styles -->
|
||
<link rel="stylesheet" href="//wxcafe.net/theme/css/bootstrap.css" type="text/css" />
|
||
<script type="text/javascript">
|
||
/* <![CDATA[ */
|
||
(function() {
|
||
var s = document.createElement('script');
|
||
var t = document.getElementsByTagName('script')[0];
|
||
|
||
s.type = 'text/javascript';
|
||
s.async = true;
|
||
s.src = '//api.flattr.com/js/0.6/load.js?'+
|
||
'mode=auto&uid=wxcafe&button=compact&popout=0';
|
||
t.parentNode.insertBefore(s, t);
|
||
})();
|
||
/* ]]> */
|
||
</script> <!-- flattr button loader -->
|
||
<style type="text/css">
|
||
body {
|
||
padding-top: 60px;
|
||
padding-bottom: 40px;
|
||
}
|
||
.sidebar-nav {
|
||
padding: 9px 0;
|
||
}
|
||
.tag-1 {
|
||
font-size: 13pt;
|
||
}
|
||
.tag-2 {
|
||
font-size: 10pt;
|
||
}
|
||
.tag-2 {
|
||
font-size: 8pt;
|
||
}
|
||
.tag-4 {
|
||
font-size: 6pt;
|
||
}
|
||
</style>
|
||
<link href="//wxcafe.net/theme/css/bootstrap-responsive.css" rel="stylesheet">
|
||
<link href="//wxcafe.net/theme/css/font-awesome.css" rel="stylesheet">
|
||
<link href="//wxcafe.net/theme/css/pygments.css" rel="stylesheet">
|
||
<!-- Le fav and touch icons -->
|
||
<link rel="shortcut icon" href="//wxcafe.net/theme/images/favicon.ico">
|
||
|
||
<link href="//wxcafe.net/feeds/feed.rss.xml" type="application/atom+xml" rel="alternate" title="Wxcafé RSS Feed" />
|
||
|
||
</head>
|
||
|
||
<body>
|
||
|
||
<div class="navbar navbar-fixed-top">
|
||
<div class="navbar-inner">
|
||
<div class="container-fluid">
|
||
<a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
|
||
<span class="icon-bar"></span>
|
||
<span class="icon-bar"></span>
|
||
<span class="icon-bar"></span>
|
||
</a>
|
||
<a class="brand" href="//wxcafe.net/index.html">Wxcafé </a>
|
||
<div class="nav-collapse">
|
||
<ul class="nav">
|
||
<li><a href="//wxcafe.net/archives.html"><i class="icon-th-list"></i> Archives</a></li>
|
||
<li><a href="//wxcafe.net/pages/about/">A propos</a></li>
|
||
<li class="divider-vertical"></li>
|
||
<ul class="nav pull-right">
|
||
</ul>
|
||
</ul>
|
||
</div><!--/.nav-collapse -->
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="container-fluid">
|
||
<div class="row">
|
||
<div class="span9" id="content">
|
||
<div class="article">
|
||
<h1><a href="//wxcafe.net/posts/%D/opensmtpd-debian/">OpenSMTPd comme serveur mail sous debian</a></h1>
|
||
<div class="well small"><footer class="post-info">
|
||
<span class="label">Date</span>
|
||
<span class="published" title="2014-11-07T13:04:00+01:00">
|
||
<i class="icon-calendar"></i> Fri 07 November 2014
|
||
</span>
|
||
<br />
|
||
<span class="label">By</span>
|
||
<a href="//wxcafe.net/author/wxcafe.html"><i class="icon-user"></i>Wxcafé</a>
|
||
<br />
|
||
<span class="label">Category</span>
|
||
<a href="//wxcafe.net/category/tutorial/"><i class="icon-folder-open"></i>Tutorial</a>
|
||
<br />
|
||
|
||
|
||
|
||
|
||
</footer><!-- /.post-info --></div>
|
||
<div class="summary"><p>J'avais dit il y a un certain temps que j'allais écrire un tutoriel expliquant
|
||
comment gérer ses mails soi-même. Il se trouve que j'ai récemment décidé de
|
||
changer le serveur qui héberge (entre autres) ce blog, et que ce dernier héberge
|
||
aussi mes emails. J'ai donc totalement changé d'infrastructure quand a la
|
||
gestion de mon système de mails.</p>
|
||
<p>Ainsi, j'ai décidé de passer de Postfix a OpenSMTPd, changement que je voulais
|
||
effectuer depuis un certain temps. <a href="https://opensmtpd.org">OpenSMTPd</a> est un
|
||
projet originaire d'<a href="http://openbsd.org">OpenBSD</a> qui a pour but de fournir un
|
||
serveur SMTP fiable, simple, rapide, et surtout sécurisé (les même buts que ceux
|
||
qu'a le projet OpenBSD, globalement).</p>
|
||
<p>Pour rappel, le système d'emails fonctionne d'une façon très simple : votre MUA
|
||
(Mail User Agent, ou client email) contacte le MTA (Mail Transport Agent, ou
|
||
serveur SMTP) de votre fournisseur email, qui contacte le MTA du fournisseur du
|
||
destinataire, qui lui même contacte le MDA (Mail Delivery Agent) qui délivre le
|
||
mail au destinataire.</p>
|
||
<p>Si vous avez bien suivi, vous pouvez voir que je n'ai pas parlé de récupération
|
||
ni de lecture des mails. C'est pour une raison simple, qui est que ces taches
|
||
sont remplies par d'autres services encore (IMAP/POP pour la récupération depuis
|
||
le serveur, des yeux pour la lecture).</p>
|
||
<p>Or ce qui nous intéresse ici, ce n'est pas simplement d'envoyer et de recevoir
|
||
des emails mais bien aussi de pouvoir les récupérer et les lire, et c'est pour
|
||
ça que ce tutoriel ne parlera pas que d'OpenSMTPd mais aussi de
|
||
<a href="http://dovecot.org/">Dovecot</a> qui fait office de serveur IMAP et
|
||
<a href="http://www.ijs.si/software/amavisd/">amavis</a>/<a href="http://spamassassin.apache.org/">spamassassin</a>
|
||
pour filtrer les mails entrants et sortants.
|
||
Le schéma suivant explique la façon dont les mails sont gérés sur le système</p>
|
||
<div class="highlight"><pre> <span class="err">╭────────────────╮</span> <span class="err">╭──────────╮</span>
|
||
<span class="err">│╭──────────────</span><span class="o">></span><span class="err">│────</span><span class="o">></span> <span class="n">to</span> <span class="n">filter</span> <span class="err">───</span><span class="o">></span><span class="err">│─╮</span> <span class="err">│</span>
|
||
<span class="n">mail</span> <span class="n">in</span> <span class="err">││</span> <span class="err">│</span> <span class="err">│</span> <span class="err">│</span> <span class="n">amavis</span> <span class="err">│</span>
|
||
<span class="err">───────────</span><span class="o">></span><span class="err">│╯</span> <span class="n">OpenSMTPd</span> <span class="err">╭──│</span><span class="o"><</span><span class="err">───</span> <span class="n">from</span> <span class="n">filter</span><span class="o"><</span><span class="err">───│</span><span class="o"><</span><span class="err">╯</span> <span class="err">│</span>
|
||
<span class="err">│</span> <span class="err">│</span> <span class="err">│</span> <span class="err">╰──────────╯</span>
|
||
<span class="n">mail</span> <span class="n">out</span> <span class="err">│</span> <span class="err">│</span> <span class="err">│</span> <span class="err">╭──────────╮</span>
|
||
<span class="o"><</span><span class="err">───────────│</span><span class="o"><</span><span class="err">────────────┴─</span><span class="o">></span><span class="err">│─────</span><span class="o">></span> <span class="n">to</span> <span class="n">MDA</span> <span class="err">─────</span><span class="o">></span><span class="err">│─────────</span><span class="o">></span><span class="err">│──</span><span class="o">></span> <span class="n">to</span> <span class="n">user</span><span class="err">'</span><span class="n">s</span>
|
||
<span class="err">│</span> <span class="err">│</span> <span class="err">│</span> <span class="n">dovecot</span> <span class="err">│</span> <span class="n">mailbox</span>
|
||
<span class="err">╰────────────────╯</span> <span class="err">╰──────────╯</span>
|
||
</pre></div>
|
||
|
||
|
||
<p>Normalement, ceci devrait être a peu près clair.
|
||
Pour expliquer vite fait, les emails entrants (venant des utilisateurs mais
|
||
aussi d'autres correspondants) sont transmis a OpenSMTPd, qui envoie tout a
|
||
<code>amavis</code>, qui vérifie a la fois les spams et les malwares pour les mails
|
||
venants de l'exterieur, et qui signe avec DKIM pour les mails venants de
|
||
nos utilisateurs, puis qui rentransmet les mails filtrés/signés a OpenSMTPd,
|
||
qui a ce moment-ci trie en fonction de la destination : les mails gérés
|
||
par le domaine vont via dovecot dans les boites mail des destinataires
|
||
locaux, les mails exterieurs vont directement vers le MTA du serveur
|
||
distant.</p>
|
||
<p>Voyons comment mettre cela en place. Tout d'abord, il faut décider de la façon
|
||
dont les différents services vont communiquer.</p>
|
||
<p>Déjà, amavis étant configuré par défaut pour écouter (en SMTP) sur le port
|
||
10024 et répondre sur le port 10025 quand il s'agit de filtrer et
|
||
écouter sur le port 10026 et répondre sur le port 10027 quand il s'agit de
|
||
signer, nous allons profiter de cette configuration et donc lui parler en SMTP
|
||
sur ces ports.</p>
|
||
<p>Quand a Dovecot, nous allons lui transmettre les emails en LMTP (Local Mail
|
||
Transfer Protocol), non pas sur un port mais via un socket (dans ce cas précis,
|
||
<code>/var/run/dovecot/lmtp</code>).</p>
|
||
<p>Ainsi, pour reprendre le schéma présenté plus haut :</p>
|
||
<div class="highlight"><pre> <span class="err">╭───────────────╮</span> <span class="err">╭───────────╮</span>
|
||
<span class="err">│╭─────────────</span><span class="o">></span><span class="err">│──</span><span class="o">></span> <span class="n">SMTP</span> <span class="p">(</span><span class="mi">10026</span><span class="p">)</span> <span class="err">──</span><span class="o">></span><span class="err">│─╮</span> <span class="err">│</span>
|
||
<span class="n">SMTP</span> <span class="n">in</span> <span class="err">││</span> <span class="err">│</span> <span class="err">│</span> <span class="err">│</span> <span class="n">amavis</span> <span class="err">│</span>
|
||
<span class="err">────────</span><span class="o">></span> <span class="mi">25</span><span class="err">│╯</span> <span class="n">OpenSMTPd</span> <span class="err">╭──│</span><span class="o"><</span><span class="err">──</span> <span class="n">SMTP</span> <span class="p">(</span><span class="mi">10027</span><span class="p">)</span> <span class="o"><</span><span class="err">──│</span><span class="o"><</span><span class="err">╯</span> <span class="p">(</span><span class="n">sign</span><span class="p">)</span> <span class="err">│</span>
|
||
<span class="err">│</span> <span class="err">│</span> <span class="err">│</span> <span class="err">╰───────────╯</span>
|
||
<span class="n">SMTP</span> <span class="n">out</span> <span class="err">│</span> <span class="err">│</span> <span class="err">│</span>
|
||
<span class="mi">25</span> <span class="o"><</span><span class="err">────────│</span><span class="o"><</span><span class="err">───────────╯</span> <span class="err">│</span>
|
||
<span class="err">╰───────────────╯</span>
|
||
</pre></div>
|
||
|
||
|
||
<p>Pour les mails sortants; et</p>
|
||
<div class="highlight"><pre> <span class="err">╭───────────────╮</span> <span class="err">╭────────────╮</span>
|
||
<span class="err">│╭─────────────</span><span class="o">></span><span class="err">│──</span><span class="o">></span> <span class="n">SMTP</span> <span class="p">(</span><span class="mi">10024</span><span class="p">)</span> <span class="err">──</span><span class="o">></span><span class="err">│─╮</span> <span class="err">│</span>
|
||
<span class="n">SMTP</span> <span class="n">in</span> <span class="err">││</span> <span class="err">│</span> <span class="err">│</span> <span class="err">│</span> <span class="n">amavis</span> <span class="err">│</span>
|
||
<span class="err">────────</span><span class="o">></span> <span class="mi">25</span><span class="err">│╯</span> <span class="n">OpenSMTPd</span> <span class="err">╭──│</span><span class="o"><</span><span class="err">──</span> <span class="n">SMTP</span> <span class="p">(</span><span class="mi">10025</span><span class="p">)</span> <span class="o"><</span><span class="err">──│</span><span class="o"><</span><span class="err">╯</span><span class="p">(</span><span class="n">filter</span><span class="p">)</span> <span class="err">│</span>
|
||
<span class="err">│</span> <span class="err">│</span> <span class="err">│</span> <span class="err">╰────────────╯</span>
|
||
<span class="err">│</span> <span class="err">│</span> <span class="err">│</span> <span class="err">╭────────────╮</span>
|
||
<span class="err">│</span> <span class="err">╰─</span><span class="o">></span><span class="err">│──</span><span class="o">></span> <span class="n">LMTP</span> <span class="p">(</span><span class="n">socket</span><span class="p">)</span> <span class="err">─</span><span class="o">></span><span class="err">│───────────</span><span class="o">></span><span class="err">│──</span><span class="o">></span> <span class="n">to</span> <span class="n">user</span><span class="err">'</span><span class="n">s</span>
|
||
<span class="err">│</span> <span class="err">│</span> <span class="err">│</span> <span class="n">dovecot</span> <span class="err">│</span> <span class="n">mailbox</span>
|
||
<span class="err">╰───────────────╯</span> <span class="err">╰────────────╯</span>
|
||
</pre></div>
|
||
|
||
|
||
<p>Pour les mails entrants.</p>
|
||
<p>Maintenant que la théorie est claire, mettons en place tout cela. Je me baserai
|
||
ici sur le fait que vous utilisiez une plateforme Debian ou OpenBSD. Pour
|
||
d'autres plateformes, la configuration devrait être sensiblement la même</p>
|
||
<p>(Vous aurez besoin de certificats SSL pour ce guide, même self-signés.
|
||
Si vous ne savez pas comment en créer, vous pouvez aller voir <a href="http://wxcafe.net/posts/05/30/14/SSL-ou-la-securite-sur-internet/">ce
|
||
post</a>)</p>
|
||
<p>Tout d'abord, commençons par installer les programmes nécessaires :</p>
|
||
<div class="highlight"><pre><span class="n">sudo</span> <span class="n">apt</span><span class="o">-</span><span class="n">get</span> <span class="n">install</span> <span class="n">opensmtpd</span> <span class="n">dovecot</span> <span class="n">dovecot</span><span class="o">-</span><span class="n">pigeonhole</span> <span class="n">amavisd</span><span class="o">-</span><span class="n">new</span> <span class="n">dovecot</span><span class="o">-</span><span class="n">managesieved</span>
|
||
<span class="n">sudo</span> <span class="n">pkg_add</span> <span class="n">dovecot</span> <span class="n">dovecot</span><span class="o">-</span><span class="n">pigeonhole</span> <span class="n">amavisd</span><span class="o">-</span><span class="n">new</span>
|
||
</pre></div>
|
||
|
||
|
||
<p>Continuons en configurant OpenSMTPd tel que nous avons vu plus haut :</p>
|
||
<p><code>/etc/smtpd.conf</code></p>
|
||
<div class="highlight"><pre><span class="err">#</span> <span class="nx">This</span> <span class="nx">is</span> <span class="nx">the</span> <span class="nx">smtpd</span> <span class="nx">server</span> <span class="nx">system</span><span class="na">-wide</span> <span class="nx">configuration</span> <span class="nx">file.</span>
|
||
<span class="err">#</span> <span class="nx">See</span> <span class="nx">smtpd.conf</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span> <span class="nb">for</span> <span class="nx">more</span> <span class="nx">information.</span>
|
||
|
||
<span class="err">##</span> <span class="nx">Certs</span>
|
||
<span class="nx">pki</span> <span class="nx">exem.pl</span> <span class="nx">certificate</span> <span class="s2">"/etc/certs/exem.pl.crt"</span>
|
||
<span class="nx">pki</span> <span class="nx">exem.pl</span> <span class="nb">key</span> <span class="s2">"/etc/certs/exem.pl.key"</span>
|
||
|
||
<span class="err">##</span> <span class="nx">Ports</span> <span class="k">to</span> <span class="nb">listen</span> <span class="k">on</span><span class="p">,</span> <span class="ow">and</span> <span class="nx">how</span> <span class="k">to</span> <span class="nb">listen</span> <span class="k">on</span> <span class="nx">them</span>
|
||
<span class="nb">listen</span> <span class="k">on</span> <span class="nx">eth0</span> <span class="nb">port</span> <span class="mi">25</span> <span class="nx">tls</span> <span class="nx">pki</span> <span class="nx">exem.pl</span> <span class="nb">hostname</span> <span class="nx">exem.pl</span> <span class="nb">auth</span><span class="na">-optional</span>
|
||
<span class="nb">listen</span> <span class="k">on</span> <span class="nx">eth0</span> <span class="nb">port</span> <span class="mi">465</span> <span class="nx">tls</span><span class="na">-require</span> <span class="nx">pki</span> <span class="nx">exem.pl</span> <span class="nb">hostname</span> <span class="nx">exem.pl</span> <span class="nb">auth</span> <span class="nx">mask</span><span class="na">-source</span>
|
||
<span class="nb">listen</span> <span class="k">on</span> <span class="nx">eth0</span> <span class="nb">port</span> <span class="mi">587</span> <span class="nx">tls</span><span class="na">-require</span> <span class="nx">pki</span> <span class="nx">exem.pl</span> <span class="nb">hostname</span> <span class="nx">exem.pl</span> <span class="nb">auth</span> <span class="nx">mask</span><span class="na">-source</span>
|
||
|
||
<span class="err">##</span> <span class="nx">Aliases</span>
|
||
<span class="nb">table</span> <span class="nx">aliases</span> <span class="nb">file</span><span class="p">:/</span><span class="nx">etc</span><span class="p">/</span><span class="nx">aliases</span>
|
||
|
||
<span class="err">#</span> <span class="nx">coming</span> <span class="nb">from</span> <span class="nx">amavisd</span><span class="p">,</span> <span class="nb">checked</span> <span class="nb">for</span> <span class="nx">spam</span><span class="p">/</span><span class="nx">malware</span>
|
||
<span class="nb">listen</span> <span class="k">on</span> <span class="nx">lo</span> <span class="nb">port</span> <span class="mi">10025</span> <span class="kt">tag</span> <span class="nx">Filtered</span>
|
||
<span class="err">#</span> <span class="nx">coming</span> <span class="nb">from</span> <span class="nx">amavisd</span><span class="p">,</span> <span class="nx">signed</span> <span class="k">with</span> <span class="nx">DKIM</span>
|
||
<span class="nb">listen</span> <span class="k">on</span> <span class="nx">lo</span> <span class="nb">port</span> <span class="mi">10027</span> <span class="kt">tag</span> <span class="nx">Signed</span>
|
||
|
||
<span class="err">##</span> <span class="nx">Receiving</span>
|
||
<span class="err">#</span> <span class="k">if</span> <span class="nx">the</span> <span class="p">(</span><span class="nx">incoming</span><span class="p">)</span> <span class="nx">mail</span> <span class="nx">has</span> <span class="nx">been</span> <span class="nx">through</span> <span class="nx">amavisd</span><span class="p">,</span> <span class="nx">then</span> <span class="nx">we</span> <span class="nx">can</span> <span class="nx">deliver</span> <span class="nx">it</span>
|
||
<span class="nb">accept</span> <span class="nx">tagged</span> <span class="nx">Filtered</span> <span class="nb">for</span> <span class="nb">any</span> <span class="nx">alias</span> <span class="o"><</span><span class="nx">aliases</span><span class="o">></span> <span class="nx">deliver</span> <span class="k">to</span> <span class="nx">lmtp</span> <span class="s2">"/var/run/dovecot/lmtp"</span>
|
||
<span class="err">#</span> <span class="nx">we</span> <span class="nx">directly</span> <span class="nx">tranfer</span> <span class="nx">incoming</span> <span class="nx">mail</span> <span class="k">to</span> <span class="nx">amavisd</span> <span class="k">to</span> <span class="nx">be</span> <span class="nb">checked</span>
|
||
<span class="nb">accept</span> <span class="nb">from</span> <span class="nb">any</span> <span class="nb">for</span> <span class="nx">domain</span> <span class="s2">"exem.pl"</span> <span class="nx">relay</span> <span class="nx">via</span> <span class="s2">"smtp://localhost:10024"</span>
|
||
<span class="err">#</span> <span class="nx">we</span> <span class="nx">have</span> <span class="k">to</span> <span class="nx">put</span> <span class="nx">these</span> <span class="n">lines</span> <span class="k">in</span> <span class="nx">this</span> <span class="k">order</span> <span class="k">to</span> <span class="nx">avoid</span> <span class="nx">infinite</span> <span class="nx">loops</span>
|
||
|
||
<span class="err">##</span> <span class="nx">Sending</span>
|
||
<span class="err">#</span> <span class="k">if</span> <span class="nx">the</span> <span class="p">(</span><span class="nx">outgoint</span><span class="p">)</span> <span class="nx">mail</span> <span class="nx">has</span> <span class="nx">been</span> <span class="nx">through</span> <span class="nx">amavisd</span><span class="p">,</span> <span class="nx">then</span> <span class="nx">we</span> <span class="nx">can</span> <span class="nx">deliver</span> <span class="nx">it</span>
|
||
<span class="nb">accept</span> <span class="nx">tagged</span> <span class="nx">Signed</span> <span class="nb">for</span> <span class="nb">any</span> <span class="nx">relay</span>
|
||
<span class="err">#</span> <span class="nx">we</span> <span class="nx">tranfer</span> <span class="nx">the</span> <span class="nx">outgoing</span> <span class="nx">mail</span> <span class="k">to</span> <span class="nx">amavisd</span> <span class="k">to</span> <span class="nx">be</span> <span class="nx">signed</span>
|
||
<span class="nb">accept</span> <span class="nb">for</span> <span class="nb">any</span> <span class="nx">relay</span> <span class="nx">via</span> <span class="s2">"smtp://localhost:10026"</span>
|
||
<span class="err">#</span> <span class="nx">same</span><span class="p">,</span> <span class="nx">we</span> <span class="nx">have</span> <span class="k">to</span> <span class="nx">put</span> <span class="nx">these</span> <span class="n">lines</span> <span class="k">in</span> <span class="nx">this</span> <span class="k">order</span> <span class="ow">or</span> <span class="nx">infinite</span> <span class="nx">loops...</span>
|
||
</pre></div>
|
||
|
||
|
||
<p>Expliquons un peu ce fichier de configuration :</p>
|
||
<ul>
|
||
<li>Tout d'abord, le paragraphe nommé "Certs" contient les déclaration
|
||
d'emplacement des certificats SSL.</li>
|
||
<li>Ensuite, le paragraphe contenant les ports externes sur lesquels nous écoutons :
|
||
port 25 avec TLS optionel et ports 465 et 587 avec TLS obligatoire</li>
|
||
<li>Les alias sont définis juste après</li>
|
||
<li>Le paragraphe suivant contient les ports locaux sur lesquels nous écoutons :
|
||
10025 (port de sortie du filtre de amavis) dont on taggue les mails sortants
|
||
comme "Filtered" et 10027 (port de sortie des mails signés par amavis) dont on
|
||
taggue les mails sortants comme "Signed"</li>
|
||
<li>Nous avons ensuite le paragraphe qui traite les mails rentrants. Si le mail
|
||
traité est taggué comme Filtered, alors il a été vérifié par amavis, et on
|
||
peut donc le transmettre au destinataire. Sinon, c'est qu'il n'a pas encore
|
||
été vérifié par amavis, donc on lui transmet pour analyse (sur le port 10024
|
||
donc). Il est important de mettre les déclarations dans ce sens, car la
|
||
première règle qui matche l'état du paquet est appliquée. Ici, la deuxième
|
||
ligne matchant tous les mails arrivant et la première seulement ceux filtrés,
|
||
inverser leur sens voudrait dire que les mails seraient toujours renvoyés a
|
||
amavis</li>
|
||
<li>Enfin, le dernier paragraphe traite les mails sortants. De la même façon que
|
||
pour le paragraphe précédent, si le mail sortant est déjà taggué comme Signed
|
||
on le transmet au MTA du destinataire, sinon il n'a pas encore été signé par
|
||
DKIM par amavis et on le transmet donc a amavis pour qu'il le signe. Le
|
||
problème de l'ordre des lignes se pose encore, pour la même raison qu'au
|
||
dessus.</li>
|
||
</ul>
|
||
<p>Nous allons maintenant configurer dovecot. Comme nous l'avons vu, dovecot doit
|
||
écouter en LMTP via la socket <code>/var/run/dovecot/lmtp</code> et transmettre les
|
||
emails a la boite email de l'utilisateur. Il serait aussi interessant
|
||
qu'il nous permette de récuperer les mails. Pour cette configuration, on ne
|
||
mettra en place que du IMAPS. Cependant, si vous voulez mettre en place du
|
||
POP3[s], différents guides sont trouvables facilement sur internet.</p>
|
||
<p><code>/etc/dovecot/dovecot.conf</code></p>
|
||
<div class="highlight"><pre><span class="cp">## Dovecot configuration file</span>
|
||
|
||
<span class="cp"># basic config</span>
|
||
<span class="n">info_log_path</span> <span class="o">=</span> <span class="o">/</span><span class="n">var</span><span class="o">/</span><span class="n">log</span><span class="o">/</span><span class="n">dovecot</span><span class="o">-</span><span class="n">info</span><span class="p">.</span><span class="n">log</span>
|
||
<span class="n">log_path</span> <span class="o">=</span> <span class="o">/</span><span class="n">var</span><span class="o">/</span><span class="n">log</span><span class="o">/</span><span class="n">dovecot</span><span class="p">.</span><span class="n">log</span>
|
||
<span class="n">log_timestamp</span> <span class="o">=</span> <span class="s">"%Y-%m-%d %H:%M:%S "</span>
|
||
<span class="n">mail_location</span> <span class="o">=</span> <span class="n">maildir</span><span class="o">:%</span><span class="n">h</span><span class="o">/</span><span class="n">mail</span>
|
||
|
||
<span class="cp"># authentication</span>
|
||
<span class="n">passdb</span> <span class="p">{</span>
|
||
<span class="n">driver</span> <span class="o">=</span> <span class="n">pam</span>
|
||
<span class="p">}</span>
|
||
<span class="n">userdb</span> <span class="p">{</span>
|
||
<span class="n">driver</span> <span class="o">=</span> <span class="n">passwd</span>
|
||
<span class="p">}</span>
|
||
|
||
<span class="cp"># the protocols we use</span>
|
||
<span class="n">protocols</span> <span class="o">=</span> <span class="n">imap</span> <span class="n">lmtp</span> <span class="n">sieve</span>
|
||
|
||
<span class="cp"># ssl config</span>
|
||
<span class="n">ssl_cert</span> <span class="o">=</span> <span class="o"></</span><span class="n">etc</span><span class="o">/</span><span class="n">certs</span><span class="o">/</span><span class="n">exem</span><span class="p">.</span><span class="n">pl</span><span class="p">.</span><span class="n">cert</span>
|
||
<span class="n">ssl_key</span> <span class="o">=</span> <span class="o"></</span><span class="n">etc</span><span class="o">/</span><span class="n">certs</span><span class="o">/</span><span class="n">exem</span><span class="p">.</span><span class="n">pl</span><span class="p">.</span><span class="n">key</span>
|
||
<span class="n">ssl_cipher_list</span> <span class="o">=</span> <span class="n">HIGH</span><span class="o">+</span><span class="n">kEDH</span><span class="o">:</span><span class="n">HIGH</span><span class="o">+</span><span class="n">kEECDH</span><span class="o">:</span><span class="n">HIGH</span><span class="o">:!</span><span class="n">PSK</span><span class="o">:!</span><span class="n">SRP</span><span class="o">:!</span><span class="mi">3</span><span class="n">DES</span><span class="o">:!</span><span class="n">aNULL</span>
|
||
<span class="n">ssl</span> <span class="o">=</span> <span class="n">yes</span>
|
||
|
||
<span class="cp">## configuring services </span>
|
||
<span class="cp"># disables imap login without SSL (yes dovecot is dumb that way)</span>
|
||
<span class="n">service</span> <span class="n">imap</span><span class="o">-</span><span class="n">login</span> <span class="p">{</span>
|
||
<span class="n">inet_listener</span> <span class="n">imap</span> <span class="p">{</span>
|
||
<span class="n">port</span><span class="o">=</span><span class="mi">0</span>
|
||
<span class="p">}</span>
|
||
<span class="p">}</span>
|
||
|
||
<span class="n">service</span> <span class="n">lmtp</span> <span class="p">{</span>
|
||
<span class="n">unix_listener</span> <span class="n">lmtp</span> <span class="p">{</span>
|
||
<span class="n">mode</span> <span class="o">=</span> <span class="mo">0666</span>
|
||
<span class="p">}</span>
|
||
<span class="p">}</span>
|
||
|
||
<span class="cp">## configuring protocols</span>
|
||
<span class="cp"># the dovecot lda, we set it to use sieve</span>
|
||
<span class="n">protocol</span> <span class="n">lda</span> <span class="p">{</span>
|
||
<span class="n">mail_plugins</span> <span class="o">=</span> <span class="err">$</span><span class="n">mail_plugins</span> <span class="n">sieve</span>
|
||
<span class="p">}</span>
|
||
|
||
<span class="n">protocol</span> <span class="n">lmtp</span> <span class="p">{</span>
|
||
<span class="n">postmaster_address</span> <span class="o">=</span> <span class="n">whoever</span><span class="err">@</span><span class="n">exem</span><span class="p">.</span><span class="n">pl</span>
|
||
<span class="n">mail_plugins</span> <span class="o">=</span> <span class="err">$</span><span class="n">mail_plugins</span> <span class="n">sieve</span>
|
||
<span class="p">}</span>
|
||
|
||
<span class="n">plugin</span> <span class="p">{</span>
|
||
<span class="n">sieve</span> <span class="o">=</span> <span class="o">~/</span><span class="p">.</span><span class="n">dovecot</span><span class="p">.</span><span class="n">sieve</span>
|
||
<span class="n">sieve_dir</span> <span class="o">=</span> <span class="o">~/</span><span class="n">sieve</span>
|
||
<span class="p">}</span>
|
||
</pre></div>
|
||
|
||
|
||
<p><strong>ATTENTION: Sous OpenBSD, remplacez</strong></p>
|
||
<div class="highlight"><pre><span class="n">passdb</span> <span class="p">{</span>
|
||
<span class="n">driver</span> <span class="o">=</span> <span class="n">pam</span>
|
||
<span class="p">}</span>
|
||
</pre></div>
|
||
|
||
|
||
<p><strong>par</strong></p>
|
||
<div class="highlight"><pre><span class="n">passdb</span> <span class="p">{</span>
|
||
<span class="n">driver</span> <span class="o">=</span> <span class="n">bsdauth</span>
|
||
<span class="p">}</span>
|
||
</pre></div>
|
||
|
||
|
||
<p><strong>pour identifier les utilisateurs système</strong></p>
|
||
<p>Ici aussi, voyons comment ce fichier est structuré :</p>
|
||
<ul>
|
||
<li>Tout d'abord, les configurations de base : ou iront les logs, comment formater
|
||
leur datation, et l'endroit ou seront stockés les mails des utilisateurs.</li>
|
||
<li>Nous configurons ensuite la gestion de l'authentification des utilisateurs.
|
||
Ici nous identifions les utilisateurs avec le fichier /etc/passwd et leurs
|
||
mots de passe avec PAM (ou BSDAuth)</li>
|
||
<li>Nous configurons ensuite les protocoles que nous servons. Ici, nous voulons de
|
||
l'IMAPS, du LMTP local et Sieve (qui sert pour trier les messages).</li>
|
||
<li>Nous configurons le SSL</li>
|
||
<li>Le section suivante contient la configuration des services. Nous avons en
|
||
premier lieu le service IMAP, dont la configuration sert uniquement a
|
||
désactiver IMAP. En effet, dovecot ne permet d'activer IMAPS qu'en activant
|
||
IMAP avec. Comme nous ne voulons pas d'IMAP sans SSL, nous le désactivons.
|
||
La configuration de lmtp sert a attribuer des permissions plus correctes au
|
||
fifo qu'il utilise</li>
|
||
<li>Nous configurons maintenant les protocoles, pour faire fonctionner Sieve</li>
|
||
<li>enfin, nous configurons le plugin sieve en lui indiquant quel fichier et
|
||
quel dossier utiliser pour sa configuration.</li>
|
||
</ul>
|
||
<p>Enfin, il nous reste a configurer amavis. Comme expliqué, amavis va nous servir
|
||
a deux choses : signer les emails sortants, et filtrer les emails entrants. Il
|
||
doit donc écouter sur les port 10026 pour les signatures et 10024 pour le
|
||
filtrage, et répondre respectivement sur les ports 10027 et 10025 (le tout, en
|
||
SMTP. Comme toutes les transactions se font sur le loopback, il n'y a aucun
|
||
risque a utiliser des protocoles non chiffrés.
|
||
Pour OpenBSD, pensez a copier la configuration par défaut depuis
|
||
<code>/usr/local/share/examples/amavisd-new/amavisd.conf</code> et ajoutez les
|
||
modifications nécessaires a la fin du fichier.</p>
|
||
<p><code>/etc/amavis/conf.d/99-local.conf</code> (debian)
|
||
<code>/etc/amavis.conf</code> (OpenBSD)</p>
|
||
<div class="highlight"><pre><span class="n">use</span> <span class="n">strict</span><span class="p">;</span>
|
||
|
||
<span class="err">$</span><span class="n">enable_dkim_verification</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
|
||
<span class="err">$</span><span class="n">enable_dkim_signing</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
|
||
<span class="n">dkim_key</span><span class="p">(</span><span class="s">"exem.pl"</span><span class="p">,</span> <span class="s">"main"</span><span class="p">,</span> <span class="s">"/etc/certs/dkim.key"</span> <span class="p">);</span>
|
||
|
||
<span class="err">@</span><span class="n">dkim_signature_options_bysender_maps</span> <span class="o">=</span> <span class="p">(</span>
|
||
<span class="p">{</span> <span class="sc">'.'</span> <span class="o">=></span>
|
||
<span class="p">{</span> <span class="n">ttl</span> <span class="o">=></span> <span class="mi">21</span><span class="o">*</span><span class="mi">24</span><span class="o">*</span><span class="mi">3600</span><span class="p">,</span> <span class="n">c</span> <span class="o">=></span> <span class="err">'</span><span class="n">relaxed</span><span class="o">/</span><span class="n">simple</span><span class="err">'</span> <span class="p">}</span>
|
||
<span class="p">}</span>
|
||
<span class="p">);</span>
|
||
|
||
<span class="err">$</span><span class="n">inet_socket_port</span> <span class="o">=</span> <span class="p">[</span><span class="mi">10024</span><span class="p">,</span> <span class="mi">10026</span><span class="p">];</span>
|
||
<span class="err">$</span><span class="n">policy_bank</span><span class="p">{</span><span class="err">'</span><span class="n">MYNETS</span><span class="err">'</span><span class="p">}</span> <span class="o">=</span> <span class="p">{</span>
|
||
<span class="n">originating</span> <span class="o">=></span> <span class="mi">1</span><span class="p">,</span>
|
||
<span class="n">os_fingerprint_method</span> <span class="o">=></span> <span class="n">undef</span><span class="p">,</span>
|
||
<span class="p">};</span>
|
||
|
||
<span class="err">$</span><span class="n">interface_policy</span><span class="p">{</span><span class="err">'</span><span class="mi">10026</span><span class="err">'</span><span class="p">}</span> <span class="o">=</span> <span class="err">'</span><span class="n">ORIGINATING</span><span class="err">'</span><span class="p">;</span>
|
||
|
||
<span class="err">$</span><span class="n">policy_bank</span><span class="p">{</span><span class="err">'</span><span class="n">ORIGINATING</span><span class="err">'</span><span class="p">}</span> <span class="o">=</span> <span class="p">{</span>
|
||
<span class="n">originating</span> <span class="o">=></span> <span class="mi">1</span><span class="p">,</span>
|
||
<span class="n">allow_disclaimers</span> <span class="o">=></span> <span class="mi">1</span><span class="p">,</span>
|
||
<span class="n">virus_admin_maps</span> <span class="o">=></span> <span class="p">[</span><span class="s">"root\@$mydomain"</span><span class="p">],</span>
|
||
<span class="n">spam_admin_maps</span> <span class="o">=></span> <span class="p">[</span><span class="s">"root\@$mydomain"</span><span class="p">],</span>
|
||
<span class="n">warnbadhsender</span> <span class="o">=></span> <span class="mi">1</span><span class="p">,</span>
|
||
<span class="n">forward_method</span> <span class="o">=></span> <span class="err">'</span><span class="n">smtp</span><span class="o">:</span><span class="n">localhost</span><span class="o">:</span><span class="mi">10027</span><span class="err">'</span><span class="p">,</span>
|
||
<span class="n">smtpd_discard_ehlo_keywords</span> <span class="o">=></span> <span class="p">[</span><span class="err">'</span><span class="mi">8</span><span class="n">BITMIME</span><span class="err">'</span><span class="p">],</span>
|
||
<span class="n">bypass_banned_checks_maps</span> <span class="o">=></span> <span class="p">[</span><span class="mi">1</span><span class="p">],</span>
|
||
<span class="n">terminate_dsn_on_notify_success</span> <span class="o">=></span> <span class="mi">0</span><span class="p">,</span>
|
||
<span class="p">};</span>
|
||
|
||
<span class="cp">#------------ Do not modify anything below this line -------------</span>
|
||
<span class="mi">1</span><span class="p">;</span> <span class="err">#</span> <span class="n">ensure</span> <span class="n">a</span> <span class="n">defined</span> <span class="k">return</span>
|
||
</pre></div>
|
||
|
||
|
||
<p>A nouveau, expliquons ce fichier :
|
||
- le premier paragraphe définit que nous voulons qu'amavis signe les emails
|
||
sortants, vérifie la signature DKIM des emails rentrants, et l'endroit ou se
|
||
trouve la clé privée servant a signer les emails.
|
||
- le second définit les options DKIM que nous souhaitons utiliser comme défaut.
|
||
Je vous invite a consulter la <a href="https://tools.ietf.org/html/rfc4871">RFC 4871</a>
|
||
- nous définissons ensuite les ports sur lesquels nous allons écouter, puis les
|
||
paramètres que nous utiliserons pour les emails venant de nos utilisateurs :
|
||
ils seront traités comme "originating" et nous ne vérifierons pas l'OS duquel
|
||
ils viennent.
|
||
- nous savons que les emails venants du port 10026 sont sortants, nous les
|
||
traitons donc comme tel
|
||
- le paragraphe suivant décrit le traitement que nous faisons subir aux emails
|
||
sortants : tout d'abord, nous réaffirmons qu'ils viennent bien de notre
|
||
serveur. Nous autorisons les disclaimers (voire encore une fois la <a href="https://tools.ietf.org/html/rfc4871">RFC
|
||
4871</a>. Nous déclarons l'adresse a
|
||
prévenir en cas de spam/virus venants de notre système, et que nous voulons
|
||
être prévenus. Nous déclarons ou envoyer les mails une fois signés et filtrés,
|
||
puis qu'il est nécessaire de convertir les emails au format 7 bits avant de
|
||
les envoyer au MTA, que nous autorisons tous les types et noms de fichiers, et
|
||
les notifications de succès d'envoi. Et voila!</p>
|
||
<p>Vous avez pu remarquer qu'a aucun moment nous ne configurions ni la signature
|
||
des emails sortants ni le filtrage des emails entrants. Ces paramètres sont en
|
||
fait inclus par défaut dans amavis.</p>
|
||
<p>Il nous reste cependant quelques opérations a faire, encore.
|
||
Tout d'abord, il nous faut générer notre clé DKIM. Pour cela, il existe
|
||
différentes méthodes, j'ai personnellement utilisé opendkim (<a href="https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-dkim-with-postfix-on-debian-wheezy">un
|
||
tutorial</a>)
|
||
mais de nombreuses autre méthodes existent.
|
||
Il nous reste encore a configurer spamassassin :</p>
|
||
<div class="highlight"><pre><span class="cp">#rewrite_header Subject *****SPAM*****</span>
|
||
<span class="cp"># report_safe 1</span>
|
||
<span class="n">required_score</span> <span class="mf">2.0</span>
|
||
<span class="cp"># use_bayes 1</span>
|
||
<span class="cp"># bayes_auto_learn 1</span>
|
||
<span class="cp"># bayes_ignore_header X-Bogosity</span>
|
||
<span class="cp"># bayes_ignore_header X-Spam-Flag</span>
|
||
<span class="cp"># bayes_ignore_header X-Spam-Status</span>
|
||
<span class="n">ifplugin</span> <span class="n">Mail</span><span class="o">::</span><span class="n">SpamAssassin</span><span class="o">::</span><span class="n">Plugin</span><span class="o">::</span><span class="n">Shortcircuit</span>
|
||
<span class="cp"># shortcircuit USER_IN_WHITELIST on</span>
|
||
<span class="cp"># shortcircuit USER_IN_DEF_WHITELIST on</span>
|
||
<span class="cp"># shortcircuit USER_IN_ALL_SPAM_TO on</span>
|
||
<span class="cp"># shortcircuit SUBJECT_IN_WHITELIST on</span>
|
||
<span class="cp"># shortcircuit USER_IN_BLACKLIST on</span>
|
||
<span class="cp"># shortcircuit USER_IN_BLACKLIST_TO on</span>
|
||
<span class="cp"># shortcircuit SUBJECT_IN_BLACKLIST on</span>
|
||
<span class="n">shortcircuit</span> <span class="n">ALL_TRUSTED</span> <span class="n">off</span>
|
||
<span class="cp"># shortcircuit BAYES_99 spam</span>
|
||
<span class="cp"># shortcircuit BAYES_00 ham</span>
|
||
|
||
<span class="n">endif</span> <span class="err">#</span> <span class="n">Mail</span><span class="o">::</span><span class="n">SpamAssassin</span><span class="o">::</span><span class="n">Plugin</span><span class="o">::</span><span class="n">Shortcircuit</span>
|
||
</pre></div>
|
||
|
||
|
||
<p>Comme vous pouvez le voir, les modifications se résument globalement a baisser
|
||
le required_score pour ma part.</p>
|
||
<p>Pour finir, activez les services nécessaires : opensmtpd, dovecot, amavisd, et
|
||
spamassassin, et tout devrait fonctionner parfaitement</p>
|
||
<p>Bon courage pour votre hosting de mail ensuite...</p></div>
|
||
</div>
|
||
<hr />
|
||
<div class="article">
|
||
<h1><a href="//wxcafe.net/posts/%D/freebsd-online-mfsbsd/">Installer FreeBSD sur un serveur Online avec MfsBSD</a></h1>
|
||
<div class="well small"><footer class="post-info">
|
||
<span class="label">Date</span>
|
||
<span class="published" title="2014-08-28T12:16:00+02:00">
|
||
<i class="icon-calendar"></i> Thu 28 August 2014
|
||
</span>
|
||
<br />
|
||
<span class="label">By</span>
|
||
<a href="//wxcafe.net/author/wxcafe.html"><i class="icon-user"></i>Wxcafe</a>
|
||
<br />
|
||
<span class="label">Category</span>
|
||
<a href="//wxcafe.net/category/tutoriel/"><i class="icon-folder-open"></i>Tutoriel</a>
|
||
<br />
|
||
|
||
|
||
|
||
|
||
</footer><!-- /.post-info --></div>
|
||
<div class="summary"><p>J'ai récemment eu l'occasion de louer un serveur chez Online.net (filiale de Illiad)
|
||
Voulant depuis pas mal de temps gérer un serveur sous FreeBSD (et tester <a href="http://bhyve.org/">bhyve</a>)
|
||
et n'ayant pour différentes raisons pas eu l'occasion de le faire sur mon
|
||
<a href="http://home.wxcafe.net">serveur auto-hebergé</a> ni sur <a href="http://wxcafe.net">ce serveur ci</a>,
|
||
j'ai commencé a chercher comment le faire sur ce serveur.</p>
|
||
<p>Étant donné que Online ne propose pas directement d'image FreeBSD sur ses serveurs, il m'a fallu
|
||
chercher un peu plus loin. Il se trouve que <a href="http://forum.online.net/index.php?/topic/3557-installation-de-freebsd-91-amd64-sur-une-dedibox-lt15k-2013/">ce post</a> sur les forums
|
||
d'online explique une procédure, mais celle-ci ne fonctionnait pas pour mon serveur en particulier. </p>
|
||
<p>J'ai donc cherché un peu sur internet, puis demandé sur irc (#freebsd-fr@freenode),
|
||
ou l'on m'a dirigé vers <a href="http://mfsbsd.vx.sk/">mfsbsd</a>, un projet d'installeur
|
||
alternatif, minimaliste et simplifié pour FreeBSD.</p>
|
||
<p>Pour installer FreeBSD sur votre serveur, donc, il vous faudra accéder a une
|
||
console KVM (dans mon cas personnel, iLO). Cela doit être faisable depuis le
|
||
panel Online. Une fois cela fait, lancez une console, puis téléchargez l'image
|
||
mfsbsd. Dans la console iLO, choisissez de booter sur une image CD/DVD, puis
|
||
choisissez l'image mfsbsd. Ensuite, rebootez le serveur. Choisissez de booter
|
||
sur l'image CD/DVD (F11 puis 1). Une fois ceci fait, un FreeBSD a l'air tout
|
||
a fait classique va démarrer. Une fois ceci fait, la partie importante arrive:
|
||
mfsbsd contient un script d'installation root-on-zfs, nommé logiquement
|
||
zfsinstall, qui va se charger de tout le travail pour nous.</p>
|
||
<p>Utilisez donc ce script ainsi : </p>
|
||
<div class="highlight"><pre><span class="cp"># tout d'abord, wipons le MBR :</span>
|
||
<span class="n">dd</span> <span class="o"><</span> <span class="o">/</span><span class="n">dev</span><span class="o">/</span><span class="n">zero</span> <span class="o">></span> <span class="o">/</span><span class="n">dev</span><span class="o">/</span><span class="n">da0</span> <span class="n">count</span><span class="o">=</span><span class="mi">1</span>
|
||
<span class="cp"># maintenant, installons le système</span>
|
||
<span class="n">zfsinstall</span> <span class="o">-</span><span class="n">g</span> <span class="n">da0</span> <span class="o">-</span><span class="n">u</span> <span class="n">ftp</span><span class="o">:</span><span class="c1">//ftp.freebsd.org/pub/FreeBSD/releases/amd64/10.0-RELEASE/ -s 2G -p root -c</span>
|
||
</pre></div>
|
||
|
||
|
||
<p>Avec <code>-g da0</code> votre disque dur principal, <code>-s 2G</code> la quantité de swap désirée,
|
||
<code>-p root</code> le nom du zpool, et <code>-c</code> pour activer la compression. D'autres options
|
||
sont disponibles, je vous invite a faire un <code>zfsinstall -h</code> si mon setup ne vous
|
||
convient pas.</p>
|
||
<p>Une fois ceci fait, faites un chroot dans /mnt (ou doit se trouver le nouveau
|
||
système) et éditez /etc/rc.conf :</p>
|
||
<div class="highlight"><pre><span class="n">zfs_load</span><span class="o">=</span><span class="s">"YES"</span>
|
||
<span class="n">sshd_load</span><span class="o">=</span><span class="s">"YES</span>
|
||
<span class="n">hostname</span><span class="o">=</span><span class="s">"whatever"</span>
|
||
<span class="n">ifconfig_igb0</span><span class="o">=</span><span class="s">"DHCP"</span>
|
||
</pre></div>
|
||
|
||
|
||
<p>Remplacez whatever par votre hostname, et igb0 par le nom de votre interface
|
||
physique connectée a internet. Quittez le chroot, rebootez, et voila, vous avez
|
||
maintenant un système FreeBSD tout propre installé sur zfs a découvrir et
|
||
utiliser!</p>
|
||
<p>Voila, c'est la fin de ce tutoriel.
|
||
(Cela dit, bon courage pour tester bhyve, vu que l'IPv6 chez online est... peu
|
||
crédible, disons)</p>
|
||
<p>Bon sinon sur d'autres sujets, j'ai mis en place des bots twitter
|
||
<a href="https://twitter.com/wxcafe_ebooks">wxcafe_ebooks</a>,
|
||
<a href="https://twitter.com/petitefanfare">petitefanfare</a>,
|
||
<a href="https://twitter.com/capet_ebooks">capet_ebooks</a>,
|
||
<a href="https://twitter.com/zengisse">zengisse</a>,
|
||
et <a href="https://wxcafe.net/kim_ebooks">kim_ebooks</a>. Ils sont tous basés sur <a href="https://github.com/wxcafe/ebooks_example">ce
|
||
code</a>, qui vient de
|
||
<a href="https://twitter.com/m1sp">@m1sp</a>
|
||
(<a href="https://github.com/twitter_ebooks">github.com/twitter_ebooks</a>). Donc voila.</p>
|
||
<p>A plus</p></div>
|
||
</div>
|
||
<hr />
|
||
<div class="article">
|
||
<h1><a href="//wxcafe.net/posts/%D/SSL-ou-la-securite-sur-internet/">SSL ou la sécurité sur l'internet</a></h1>
|
||
<div class="well small"><footer class="post-info">
|
||
<span class="label">Date</span>
|
||
<span class="published" title="2014-05-30T08:25:00+02:00">
|
||
<i class="icon-calendar"></i> Fri 30 May 2014
|
||
</span>
|
||
<br />
|
||
<span class="label">By</span>
|
||
<a href="//wxcafe.net/author/wxcafe.html"><i class="icon-user"></i>Wxcafe</a>
|
||
<br />
|
||
<span class="label">Category</span>
|
||
<a href="//wxcafe.net/category/notes/"><i class="icon-folder-open"></i>Notes</a>
|
||
<br />
|
||
|
||
|
||
|
||
|
||
</footer><!-- /.post-info --></div>
|
||
<div class="summary"><p><em>Disclaimer: Ce billet est écrit après le visionnage de la conférence de Moxie
|
||
Marlinspike suivante: <a href="https://www.youtube.com/watch?v=ibF36Yyeehw">More Tricks for Defeating SSL</a>,
|
||
présentée a la DefCon 17 (en 2011), et la lecture du billet suivant:
|
||
<a href="http://www.thoughtcrime.org/blog/lavabit-critique/">A Critique of Lavabit</a>,
|
||
ce qui peut avoir l'effet de rendre légèrement parano. Si vous considérez que
|
||
c'est le cas ici, veuillez ne pas tenir compte de ce billet (et vous pouvez dès
|
||
a présent dire coucou aux différentes personnes qui écoutent votre connection)</em></p>
|
||
<p>Si vous venez ici souvent (vous devriez), et que vous utilisez SSL pour vous
|
||
connecter a ce site (vous devriez, vraiment, dans ce cas), vous avez peut être
|
||
remarqué quelque chose récemment : il se trouve que le certificat qui permet de
|
||
desservir ce site a changé.</p>
|
||
<p>Cela fait suite aux évènements évoqués dans le <em>Disclaimer</em>, mais aussi a des
|
||
doigts sortis d'un endroit particulier du corps de l'admin/auteur de ce "blog",
|
||
qui a pris <strong>enfin</strong> les 5 minutes nécessaires a la compréhension superficielle
|
||
du fonctionnement de SSL, et les 10 nécessaires a la mise en place d'un système
|
||
fonctionnel utilisant cette compréhension récemment acquise.</p>
|
||
<p>Bref, le certificat a changé. Mais de quelle façon, vous demandez vous peut
|
||
être (ou pas, mais bon, je vais expliquer de toute façon). Et bien c'est très
|
||
simple : il existait auparavant un certificat pour <code>wxcafe.net</code>, un pour
|
||
<code>paste.wxcafe.net</code>, un pour <code>mail.wxcafe.net</code>, etc... Bref, un certificat
|
||
différent pour chaque sous-domaine.</p>
|
||
<p>Il s'avère que c'est a la fois très peu pratique a utiliser (les utilisateurs
|
||
doivent ajouter chaque certificat a leur navigateur séparément, chaque
|
||
changement de sous-domaine conduit a un message d'erreur, etc) et pas plus
|
||
sécurisé que d'avoir un seul certificat wildcard. J'ai donc généré un certificat
|
||
pour <code>*.wxcafe.net</code> hier, et il sera dorénavant utilisé pour tous les
|
||
sous-domaine de <code>wxcafe.net</code>; et un certificat pour <code>wxcafe.net</code>, qui ne matche
|
||
pas <code>*.wxcafe.net</code>, et qui sera donc utilisé... bah pour <code>wxcafe.net</code>.</p>
|
||
<p>Il serait préférable de faire des redirections automatiques des adresses http
|
||
vers les adresses https, cependant, étant donné que le certificat est
|
||
self-signed, il me semble préférable que l'arrivée sur le site ne commence pas
|
||
par une page firefox disant "Something's Wrong!", et ces redirections ne seront
|
||
donc pas mises en place.</p>
|
||
<p>De plus, après la lecture de l'article de blog sur Lavabit dont le lien est plus
|
||
haut, il semble intéressant (et assez important) de faire en sorte que le
|
||
serveur utilise en priorité (et si possible, uniquement) des ciphers supportant
|
||
PFS, soit EDH et EECDH (Ephemeral Diffie-Helmann et la version Elliptic Curves
|
||
de ce même algorithme). Cela permet de faire en sorte que toutes les
|
||
communications avec ce serveur soient future-proof, c'est a dire que, même si
|
||
quelqu'un récupérait la clé privée, elle ne serait pas utile pour déchiffrer les
|
||
communications passées.</p>
|
||
<p>Bon, maintenant que les explications basiques sont faites, voyons
|
||
l'implémentation : <br />
|
||
Pour générer la clé, tout d'abord, il convient d'utiliser les commandes
|
||
suivantes: </p>
|
||
<div class="highlight"><pre><span class="n">sudo</span> <span class="n">openssl</span> <span class="n">genrsa</span> <span class="o">-</span><span class="n">out</span> <span class="n">example</span><span class="p">.</span><span class="n">key</span> <span class="mi">4096</span>
|
||
<span class="cp"># nous utilisons ici une clé de 4096 bits, la taille est laissée a votre appréciation</span>
|
||
<span class="n">sudo</span> <span class="n">openssl</span> <span class="n">req</span> <span class="o">-</span><span class="n">new</span> <span class="o">-</span><span class="n">key</span> <span class="n">example</span><span class="p">.</span><span class="n">key</span> <span class="o">-</span><span class="n">out</span> <span class="n">example</span><span class="p">.</span><span class="n">csr</span>
|
||
<span class="cp"># OpenSSL va ici vous demander de nombreuses informations, "Common Name" devant contenir le FQDN</span>
|
||
<span class="n">sudo</span> <span class="n">openssl</span> <span class="n">X509</span> <span class="o">-</span><span class="n">req</span> <span class="o">-</span><span class="n">days</span> <span class="mi">1095</span> <span class="o">-</span><span class="n">in</span> <span class="n">example</span><span class="p">.</span><span class="n">csr</span> <span class="o">-</span><span class="n">signkey</span> <span class="n">example</span><span class="p">.</span><span class="n">key</span> <span class="o">-</span><span class="n">out</span> <span class="n">example</span><span class="p">.</span><span class="n">crt</span>
|
||
<span class="cp"># enfin, nous générons la clé, d'une durée de vie de 3 ans</span>
|
||
</pre></div>
|
||
|
||
|
||
<p>Bien entendu, si vous voulez utiliser une clé wildcard, il vous faut préciser
|
||
<code>*.example.com</code> comme common name.
|
||
Une fois la clé générée, il faut dire aux différents services de l'utiliser, et
|
||
de n'utiliser que des ciphers PFS. La méthode dépend donc du service.
|
||
Je vais lister ici les methodes pour quelques services que j'utilise :</p>
|
||
<h3>apache :</h3>
|
||
<div class="highlight"><pre><span class="cp"># /etc/apache2/mods_enabled/ssl.conf</span>
|
||
<span class="cp"># [...]</span>
|
||
<span class="n">SSLProtocol</span> <span class="n">all</span> <span class="o">-</span><span class="n">SSLv2</span> <span class="o">-</span><span class="n">SSLv3</span>
|
||
<span class="n">SSLHonorCipherOrder</span> <span class="n">on</span>
|
||
<span class="n">SSLCipherSuite</span> <span class="s">"EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 \</span>
|
||
<span class="s"> EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 \</span>
|
||
<span class="s"> EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS"</span>
|
||
<span class="cp"># [...]</span>
|
||
<span class="cp"># /etc/apache2/sites-enabled/default-ssl</span>
|
||
<span class="cp"># [...]</span>
|
||
<span class="n">SSLEngine</span> <span class="n">on</span>
|
||
<span class="n">SSLCertificateFile</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">certs</span><span class="o">/</span><span class="n">example</span><span class="p">.</span><span class="n">com</span><span class="p">.</span><span class="n">crt</span>
|
||
<span class="n">SSLCertificateKeyFile</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">certs</span><span class="o">/</span><span class="n">example</span><span class="p">.</span><span class="n">com</span><span class="p">.</span><span class="n">key</span>
|
||
<span class="cp"># [...]</span>
|
||
</pre></div>
|
||
|
||
|
||
<h3>nginx :</h3>
|
||
<div class="highlight"><pre><span class="cp"># /etc/nginx/nginx.conf </span>
|
||
<span class="cp"># [...]</span>
|
||
<span class="n">ssl_protocols</span> <span class="n">TLSv1</span> <span class="n">TLSv1</span><span class="mf">.1</span> <span class="n">TLSv1</span><span class="mf">.2</span><span class="p">;</span>
|
||
<span class="n">ssl_prefer_server_ciphers</span> <span class="n">on</span><span class="p">;</span>
|
||
<span class="n">ssl_ciphers</span> <span class="s">"EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 \</span>
|
||
<span class="s"> EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 \</span>
|
||
<span class="s"> EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS"</span><span class="p">;</span>
|
||
<span class="cp"># [...]</span>
|
||
<span class="cp"># /etc/nginx/sites-enabled/default-ssl</span>
|
||
<span class="cp"># [...]</span>
|
||
<span class="n">ssl</span> <span class="n">on</span><span class="p">;</span>
|
||
<span class="n">ssl_certificate</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">certs</span><span class="o">/</span><span class="n">example</span><span class="p">.</span><span class="n">com</span><span class="p">.</span><span class="n">crt</span>
|
||
<span class="n">ssl_certificate_key</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">certs</span><span class="o">/</span><span class="n">example</span><span class="p">.</span><span class="n">com</span><span class="p">.</span><span class="n">key</span>
|
||
<span class="cp"># [...]</span>
|
||
</pre></div>
|
||
|
||
|
||
<h3>prosody (jabber) :</h3>
|
||
<div class="highlight"><pre><span class="cp"># tout d'abord, lancez la commande suivante :</span>
|
||
<span class="n">sudo</span> <span class="n">openssl</span> <span class="n">dhparam</span> <span class="o">-</span><span class="n">out</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">prosody</span><span class="o">/</span><span class="n">certs</span><span class="o">/</span><span class="n">dh</span><span class="o">-</span><span class="mf">2048.</span><span class="n">pem</span> <span class="mi">2048</span>
|
||
<span class="cp"># ensuite, pour chaque VirtualHost dans /etc/prosody/prosody.conf :</span>
|
||
<span class="n">ssl</span> <span class="o">=</span> <span class="p">{</span>
|
||
<span class="n">dhparam</span> <span class="o">=</span> <span class="s">"/etc/prosody/certs/dh-2048.pem"</span><span class="p">;</span>
|
||
<span class="n">key</span> <span class="o">=</span> <span class="s">"/etc/certs/example.com.key"</span><span class="p">;</span>
|
||
<span class="n">certificate</span> <span class="o">=</span> <span class="s">"/etc/certs/example.com.crt"</span><span class="p">;</span>
|
||
<span class="p">}</span>
|
||
<span class="cp"># la cipher suite de prosody utilise par défaut EDH et EECDH</span>
|
||
</pre></div>
|
||
|
||
|
||
<h3>postfix (email) :</h3>
|
||
<div class="highlight"><pre><span class="cp"># /etc/postfix/main.cf</span>
|
||
<span class="cp"># [...]</span>
|
||
<span class="n">smtpd_tls_cert_file</span> <span class="o">=</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">certs</span><span class="o">/</span><span class="n">example</span><span class="p">.</span><span class="n">com</span><span class="p">.</span><span class="n">crt</span>
|
||
<span class="n">smtpd_tls_key_file</span> <span class="o">=</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">certs</span><span class="o">/</span><span class="n">example</span><span class="p">.</span><span class="n">com</span><span class="p">.</span><span class="n">key</span>
|
||
<span class="n">tls_preempt_cipherlist</span> <span class="o">=</span> <span class="n">yes</span>
|
||
<span class="n">smtpd_tls_eecdh_grade</span> <span class="o">=</span> <span class="n">strong</span>
|
||
<span class="n">smtdp_tls_mandatory_ciphers</span> <span class="o">=</span> <span class="n">high</span>
|
||
<span class="n">smtpd_tls_mandatory_exclude_ciphers</span> <span class="o">=</span> <span class="n">aNULL</span><span class="p">,</span> <span class="n">eNULL</span><span class="p">,</span> <span class="n">MD5</span><span class="p">,</span> <span class="n">LOW</span><span class="p">,</span> <span class="mi">3</span><span class="n">DES</span><span class="p">,</span> <span class="n">EXP</span><span class="p">,</span> <span class="n">PSK</span><span class="p">,</span> <span class="n">SRP</span><span class="p">,</span> <span class="n">DSS</span>
|
||
<span class="n">smtpd_tls_security_level</span> <span class="o">=</span> <span class="n">encrypt</span>
|
||
<span class="n">smtpd_tls_mandatory_protocols</span> <span class="o">=</span> <span class="o">!</span><span class="n">SSLv2</span><span class="p">,</span> <span class="o">!</span><span class="n">SSLv3</span>
|
||
<span class="n">smtpd_use_tls</span> <span class="o">=</span> <span class="n">yes</span>
|
||
<span class="cp"># [...]</span>
|
||
</pre></div>
|
||
|
||
|
||
<h3>dovecot (imap) :</h3>
|
||
<div class="highlight"><pre><span class="cp"># /etc/dovecot/dovecot.conf </span>
|
||
<span class="cp"># [...]</span>
|
||
<span class="n">ssl_cert</span> <span class="o">=</span> <span class="o"></</span><span class="n">etc</span><span class="o">/</span><span class="n">certs</span><span class="o">/</span><span class="n">example</span><span class="p">.</span><span class="n">com</span><span class="p">.</span><span class="n">crt</span>
|
||
<span class="n">ssl_key</span> <span class="o">=</span> <span class="o"></</span><span class="n">etc</span><span class="o">/</span><span class="n">certs</span><span class="o">/</span><span class="n">example</span><span class="p">.</span><span class="n">com</span><span class="p">.</span><span class="n">key</span>
|
||
<span class="n">ssl_cipher_list</span> <span class="o">=</span> <span class="n">HIGH</span><span class="o">+</span><span class="n">kEDH</span><span class="o">:</span><span class="n">HIGH</span><span class="o">+</span><span class="n">kEECDH</span><span class="o">:</span><span class="n">HIGH</span><span class="o">:!</span><span class="n">PSK</span><span class="o">:!</span><span class="n">SRP</span><span class="o">:!</span><span class="mi">3</span><span class="n">DES</span><span class="o">:!</span><span class="n">aNULL</span>
|
||
</pre></div>
|
||
|
||
|
||
<p>Voila. Pour d'autres protocoles/services, je vous invite a RTFM^W vous reporter
|
||
au manuel approprié.</p>
|
||
<p>Cela étant dit, je conseille a tout le monde d'aller voir la conférence dans le
|
||
disclaimer, et tant qu'a faire la conférence du même hacker <a href="https://www.youtube.com/watch?v=8N4sb-SEpcg">SSL and the future
|
||
of Authenticity</a> qui parle de son
|
||
implémentation d'une technologie "remplaçant" le système de CAs qui existe
|
||
actuellement.</p></div>
|
||
</div>
|
||
<hr />
|
||
<div class="article">
|
||
<h1><a href="//wxcafe.net/posts/%D/mise-en-place-dun-serveur-dns/">Mise en place d'un serveur DNS</a></h1>
|
||
<div class="well small"><footer class="post-info">
|
||
<span class="label">Date</span>
|
||
<span class="published" title="2014-02-24T02:49:00+01:00">
|
||
<i class="icon-calendar"></i> Mon 24 February 2014
|
||
</span>
|
||
<br />
|
||
<span class="label">By</span>
|
||
<a href="//wxcafe.net/author/wxcafe.html"><i class="icon-user"></i>Wxcafe</a>
|
||
<br />
|
||
<span class="label">Category</span>
|
||
<a href="//wxcafe.net/category/tutoriel/"><i class="icon-folder-open"></i>Tutoriel</a>
|
||
<br />
|
||
|
||
|
||
|
||
|
||
</footer><!-- /.post-info --></div>
|
||
<div class="summary"><p>Le DNS (Domain Name System) est le service permettant la résolution des noms de
|
||
domaines en différentes informations : adresses IPv4, adresses IPv6, certificats
|
||
DNSSEC ou IPsec, localisation géographique, ou encore texte. En général, le DNS
|
||
est utilisé pour résoudre des noms de domaines en adresses IP, et ainsi pour
|
||
simplifier la vie de tous les utilisateurs (je doute que tout le monde retienne
|
||
de se connecter a <a href="http://173.194.45.66">http://173.194.45.66</a>, ou a
|
||
<a href="http://199.16.156.70">http://199.16.156.70</a>. Voire même a
|
||
<a href="http://5.39.76.46">http://5.39.76.46</a>).</p>
|
||
<p>Cependant, le DNS est un système qui date de 1984, et les exigences de l'époque
|
||
en termes d'expérience utilisateur n'étaient pas forcément aussi importantes que
|
||
de nos jours. La configuration des serveurs DNS peut ainsi être assez
|
||
contre intuitive.
|
||
Cela étant dit, comprendre le fonctionnement de DNS et contrôler ses
|
||
enregistrements est important.</p>
|
||
<p>Tout d'abord, une petite explication théorique. Le DNS fonctionne de la même
|
||
façon que le système de fichiers : en arborescence. Cependant, là ou la racine
|
||
du FS est <code>/</code>, celle de DNS est <code>.</code>, et là ou il convient d'écrire, par exemple,
|
||
<code>/usr/</code> et ou la progression se fait de gauche a droite pour le FS, pour DNS le
|
||
<code>.</code> n'est pas obligatoire et la progression se fait de droite a gauche. Par
|
||
exemple, le tld(top level domain, domaine de haut niveau) <code>com</code>, et le domaine
|
||
<code>google.com</code> appartient a <code>com</code>, on écrit donc <code>google.com</code> sans écrire le point
|
||
a la fin de façon courante.</p>
|
||
<p>Le reverse DNS est une variante du DNS "classique" permettant de résoudre les
|
||
adresses IP en nom de domaine. Ainsi, 5.39.46.76 a pour domaine wxcafe.net.
|
||
Cependant, le reverse DNS n'a, par définition, pas de TLD sur lequel se diriger
|
||
quand on lui adresse une query. Les "adresses" que l'on query en reverse DNS
|
||
sont donc constituées de l'adresse IP, <strong><em>dans le sens contraire a l'ordre
|
||
habituel</em></strong>, et du faux domaine .in-addr.arpa
|
||
Par exemple, pour connaitre le reverse de 5.39.46.76, il faudra faire <code>dig PTR
|
||
76.46.39.5.in-addr.arpa</code>. La réponse sera, évidemment, <code>wxcafe.net</code></p>
|
||
<p>Voyons maintenant comment mettre en place son propre serveur DNS. Tout d'abord,
|
||
quelques informations. DNS fonctionne sur le port 53 en UDP, et la commande
|
||
utilisée pour faire des tests DNS est <code>dig</code>. Le DNS fonctionne avec des
|
||
"enregistrements", records en anglais. Par exemple, un record A indique une
|
||
adresse IP, un record NS indique un Serveur de nom, etc. <code>dig</code> se base sur ces
|
||
records : par défaut, il ira chercher le(s) record(s) A correspondant(s) au nom
|
||
de domaine que vous donnez en argument, mais en précisant un autre type de
|
||
record, vous pouvez obtenir n'importe quelle information : par exemple, <code>dig NS
|
||
wxcafe.net</code> devrait vous renvoyer</p>
|
||
<div class="highlight"><pre><span class="p">;</span> <span class="o"><<>></span> DiG <span class="m">9.8.4</span><span class="o">-</span>rpz2<span class="o">+</span>rl005.12<span class="o">-</span>P1 <span class="o"><<>></span> NS wxcafe.net
|
||
<span class="p">;;</span> global options<span class="o">:</span> <span class="o">+</span>cmd
|
||
<span class="p">;;</span> Got answer<span class="o">:</span>
|
||
<span class="p">;;</span> <span class="o">->></span>HEADER<span class="o"><<-</span> opcode<span class="o">:</span> QUERY<span class="p">,</span> status<span class="o">:</span> NOERROR<span class="p">,</span> id<span class="o">:</span> <span class="m">13846</span>
|
||
<span class="p">;;</span> flags<span class="o">:</span> qr rd ra<span class="p">;</span> QUERY<span class="o">:</span> <span class="m">1</span><span class="p">,</span> ANSWER<span class="o">:</span> <span class="m">2</span><span class="p">,</span> AUTHORITY<span class="o">:</span> <span class="m">0</span><span class="p">,</span> ADDITIONAL<span class="o">:</span> <span class="m">0</span>
|
||
|
||
<span class="p">;;</span> QUESTION SECTION<span class="o">:</span>
|
||
<span class="p">;</span>wxcafe.net. IN NS
|
||
|
||
<span class="p">;;</span> ANSWER SECTION<span class="o">:</span>
|
||
wxcafe.net. <span class="m">3600</span> IN NS ns.wxcafe.net.
|
||
wxcafe.net. <span class="m">3600</span> IN NS ns.home.wxcafe.net.
|
||
|
||
<span class="p">;;</span> Query time<span class="o">:</span> <span class="m">60</span> msec
|
||
<span class="p">;;</span> SERVER<span class="o">:</span> <span class="m">10.0.42.1</span><span class="c1">#53(10.0.42.1)</span>
|
||
<span class="p">;;</span> WHEN<span class="o">:</span> Tue Dec <span class="m">10</span> <span class="m">13</span><span class="o">:</span><span class="m">31</span><span class="o">:</span><span class="m">18</span> <span class="m">2013</span>
|
||
<span class="p">;;</span> MSG SIZE rcvd<span class="o">:</span> <span class="m">67</span>
|
||
</pre></div>
|
||
|
||
|
||
<p>Comme vous pouvez le voir, les serveurs DNS principaux pour
|
||
<a href="http://wxcafe.net">wxcafe.net</a> sont <code>ns.wxcafe.net</code> et <code>ns.home.wxcafe.net</code>,
|
||
qui sont respectivement des alias pour <code>wxcafe.net</code> et <code>home.wxcafe.net</code>. Ainsi,
|
||
chacun fait autorité pour lui même, et le problème évident est que le résolveur
|
||
ne peut résoudre la query si il est renvoyé encore et encore vers le même
|
||
serveur. Il convient donc de définir dans le même fichier de configuration
|
||
l'adresse de ces deux serveurs. Ainsi, le résolveur, au bout de son deuxième
|
||
loop, se rendra compte qu'il est en train de faire une boucle infinie et
|
||
demandera l'adresse au serveur auquel il est connecté. La première indication de
|
||
direction se fait grâce au serveur du TLD.</p>
|
||
<p>La configuration de bind est assez simple dans le principe, le plus complexe
|
||
étant en fait d'écrire les fichiers de zone.
|
||
La configuration de bind sous debian se fait dans le dossier /etc/bind/. Il
|
||
existe 4 fichiers de configuration principaux : <code>named.conf</code>,
|
||
<code>named.conf.default-zones</code>, <code>named.conf.local</code> et <code>named.conf.options</code>.
|
||
<code>named.conf</code> contient les options par défaut de bind, <code>named.conf.default-zones</code>
|
||
les déclarations des zones par défaut (auxquelles il vaut mieux ne pas toucher),
|
||
<code>named.conf.local</code> contient les déclarations de vos zones, et
|
||
named.conf.options contient les options que vous rajoutez pour changer le
|
||
comportement de bind.</p>
|
||
<p>Pour commencer, il convient de préciser que nous allons parler ici du cas dans
|
||
lequel se trouve wxcafe.net: deux domaines dont nous voulons faire l'autorité,
|
||
deux serveurs DNS, et un service de résolution récursive limitée a quelques IPs
|
||
(notamment mon accès chez moi). </p>
|
||
<p>Examinons tout d'abord les fichiers de configuration de named.
|
||
<code>named.conf.local</code> contient les définitions des zones forward et reverse.
|
||
Sur wxcafe.net, les zones <code>wxcafe.net</code> et <code>76.46.39.5.in-addr.arpa</code> sont gérées
|
||
en master, et les zones <code>home.wxcafe.net</code> et <code>103.177.67.80.in-addr.arpa</code> sont
|
||
gérées en slave. Nous n'examinerons ici que les déclarations de zones sur ce
|
||
serveur, et pas sur home., car elles sont sensiblement les mêmes. La différence
|
||
principale étant que l'un héberge en slave les masters de l'autre.
|
||
Le fichier <code>named.conf.local</code> sur wxcafe.net contient donc </p>
|
||
<div class="highlight"><pre><span class="n">zone</span> <span class="s">"wxcafe.net"</span> <span class="p">{</span>
|
||
<span class="n">type</span> <span class="n">master</span><span class="p">;</span>
|
||
<span class="n">file</span> <span class="s">"/etc/bind/master/wxcafe.net"</span><span class="p">;</span>
|
||
<span class="n">allow</span><span class="o">-</span><span class="n">transfer</span> <span class="p">{</span>
|
||
<span class="mf">80.67.177.103</span><span class="p">;</span>
|
||
<span class="p">};</span>
|
||
<span class="p">};</span>
|
||
|
||
<span class="n">zone</span> <span class="s">"home.wxcafe.net"</span> <span class="p">{</span>
|
||
<span class="n">type</span> <span class="n">slave</span><span class="p">;</span>
|
||
<span class="n">file</span> <span class="s">"/etc/bind/slave/home.wxcafe.net"</span><span class="p">;</span>
|
||
<span class="n">masters</span> <span class="p">{</span>
|
||
<span class="mf">80.67.177.103</span><span class="p">;</span>
|
||
<span class="p">};</span>
|
||
<span class="p">};</span>
|
||
|
||
<span class="n">zone</span> <span class="s">"46.76.39.5.in-addr.arpa"</span> <span class="p">{</span>
|
||
<span class="n">type</span> <span class="n">master</span><span class="p">;</span>
|
||
<span class="n">file</span> <span class="s">"/etc/bind/master/46.76.39.5.in-addr.arpa"</span><span class="p">;</span>
|
||
<span class="n">allow</span><span class="o">-</span><span class="n">transfer</span> <span class="p">{</span>
|
||
<span class="mf">80.67.177.103</span><span class="p">;</span>
|
||
<span class="p">};</span>
|
||
<span class="p">};</span>
|
||
|
||
<span class="n">zone</span> <span class="s">"103.177.67.80.in-addr.arpa"</span> <span class="p">{</span>
|
||
<span class="n">type</span> <span class="n">slave</span><span class="p">;</span>
|
||
<span class="n">file</span> <span class="s">"/etc/bind/slave/103.177.67.80.in-addr.arpa"</span><span class="p">;</span>
|
||
<span class="n">masters</span> <span class="p">{</span>
|
||
<span class="mf">80.67.177.103</span><span class="p">;</span>
|
||
<span class="p">};</span>
|
||
<span class="p">};</span>
|
||
</pre></div>
|
||
|
||
|
||
<p>Cela devrait être relativement clair. Globalement, les zones master ont un
|
||
fichier dans <code>/etc/bind/master/</code>, et les slaves un fichier dans
|
||
<code>/etc/bind/slave/</code>, les masters autorisent le transfert vers home.wxcafe.net
|
||
tandis que les slaves déclarent home.wxcafe.net comme master, et le reste est
|
||
assez parlant.</p>
|
||
<p>Voyons maintenant le fichier de zone concernant wxcafe.net, soit
|
||
<code>/etc/bind/master/wxcafe.net</code> : </p>
|
||
<div class="highlight"><pre><span class="err">$</span><span class="n">TTL</span> <span class="mi">3600</span> <span class="p">;</span> <span class="mi">1</span> <span class="n">hour</span>
|
||
<span class="err">@</span> <span class="n">IN</span> <span class="n">SOA</span> <span class="n">ns</span><span class="p">.</span><span class="n">wxcafe</span><span class="p">.</span><span class="n">net</span><span class="p">.</span> <span class="n">wxcafe</span><span class="p">.</span><span class="n">wxcafe</span><span class="p">.</span><span class="n">net</span><span class="p">.</span> <span class="p">(</span>
|
||
<span class="mi">2014011001</span> <span class="p">;</span> <span class="n">serial</span>
|
||
<span class="mi">3</span><span class="n">h</span> <span class="p">;</span> <span class="n">refresh</span>
|
||
<span class="mi">1</span><span class="n">h</span> <span class="p">;</span> <span class="n">retry</span>
|
||
<span class="mi">168</span><span class="n">h</span> <span class="p">;</span> <span class="n">expire</span>
|
||
<span class="mi">300</span> <span class="p">;</span> <span class="n">negative</span> <span class="n">response</span> <span class="n">ttl</span>
|
||
<span class="p">)</span>
|
||
|
||
<span class="p">;</span> <span class="n">Name</span> <span class="n">servers</span>
|
||
<span class="n">IN</span> <span class="n">NS</span> <span class="n">ns</span><span class="p">.</span><span class="n">wxcafe</span><span class="p">.</span><span class="n">net</span><span class="p">.</span>
|
||
<span class="n">IN</span> <span class="n">NS</span> <span class="n">ns</span><span class="p">.</span><span class="n">home</span><span class="p">.</span><span class="n">wxcafe</span><span class="p">.</span><span class="n">net</span><span class="p">.</span>
|
||
|
||
<span class="p">;</span> <span class="n">Mail</span> <span class="n">exchangers</span>
|
||
<span class="n">IN</span> <span class="n">MX</span> <span class="mi">10</span> <span class="n">wxcafe</span><span class="p">.</span><span class="n">net</span><span class="p">.</span>
|
||
<span class="n">IN</span> <span class="n">SPF</span> <span class="s">"v=spf1 ip4:5.39.76.46 a -all"</span>
|
||
|
||
<span class="p">;</span> <span class="n">Main</span> <span class="n">A</span><span class="o">/</span><span class="n">AAAA</span> <span class="n">records</span>
|
||
<span class="n">IN</span> <span class="n">A</span> <span class="mf">5.39.76.46</span>
|
||
<span class="n">ns</span> <span class="n">IN</span> <span class="n">A</span> <span class="mf">5.39.76.46</span>
|
||
|
||
<span class="p">;</span> <span class="n">Aliases</span>
|
||
<span class="n">data</span> <span class="n">IN</span> <span class="n">CNAME</span> <span class="n">wxcafe</span><span class="p">.</span><span class="n">net</span><span class="p">.</span>
|
||
<span class="p">;</span> <span class="p">[...]</span>
|
||
<span class="n">www</span> <span class="n">IN</span> <span class="n">CNAME</span> <span class="n">wxcafe</span><span class="p">.</span><span class="n">net</span><span class="p">.</span>
|
||
|
||
|
||
<span class="p">;</span> <span class="n">home</span><span class="p">.</span><span class="n">wxcafe</span><span class="p">.</span><span class="n">net</span><span class="p">.</span> <span class="n">definition</span>
|
||
<span class="err">$</span><span class="n">ORIGIN</span> <span class="n">home</span><span class="p">.</span><span class="n">wxcafe</span><span class="p">.</span><span class="n">net</span><span class="p">.</span>
|
||
<span class="err">@</span> <span class="n">IN</span> <span class="n">NS</span> <span class="n">ns</span><span class="p">.</span><span class="n">home</span><span class="p">.</span><span class="n">wxcafe</span><span class="p">.</span><span class="n">net</span><span class="p">.</span>
|
||
<span class="n">IN</span> <span class="n">NS</span> <span class="n">ns</span><span class="p">.</span><span class="n">wxcafe</span><span class="p">.</span><span class="n">net</span><span class="p">.</span>
|
||
<span class="n">ns</span> <span class="n">IN</span> <span class="n">A</span> <span class="mf">80.67.177.103</span>
|
||
<span class="n">IN</span> <span class="n">A</span> <span class="mf">80.67.177.103</span>
|
||
</pre></div>
|
||
|
||
|
||
<p>Alors. Expliquons ligne par ligne.<br />
|
||
Tout d'abord, le TTL (time to live) est un paramètre définissant le temps
|
||
pendant lequel les serveurs récursif (qui font un cache des données) doivent
|
||
cacher ce fichier de zone. <br />
|
||
Le @ est un raccourci pour exprimer le nom de domaine courant. Ici, donc,
|
||
wxcafe.net. <br />
|
||
Maintenant, nous arrivons a un record important : SOA (Start of Authority).
|
||
Ce record prend de nombreux arguments, dans l'ordre :<br />
|
||
- Le nameserver autoritaire pour le nom de domaine en question,<br />
|
||
- L'adresse email du responsable de cette zone, avec le premier point
|
||
remplacé par un @, </p>
|
||
<p>puis entre parenthèses :<br />
|
||
- Le numéro de série ("version" du fichier de zone, ici au format
|
||
YYYYMMDDNN) <br />
|
||
- La période de refresh, période entre chaque mise a jour du nameserver
|
||
authoritaire secondaire, <br />
|
||
- La période de retry, le temps entre chaque essai de mise a jour si le
|
||
nameserveur authoritaire primaire est indisponible, <br />
|
||
- La période d'expire, le temps qu'attendra le serveur autoritaire
|
||
secondaire avant de supprimer les informations de son cache si le primaire
|
||
reste indisponible, et enfin <br />
|
||
- La période de TTL négatif, le temps qu'attendra le serveur secondaire
|
||
avant de ne plus offrir les informations de cette zone si le serveur
|
||
primaire est injoignable. </p>
|
||
<p>Bon, tout ceci est peut-être un peu confus, mais ce n'est pas le record le plus
|
||
important a lire (pour les humains en tout cas). Continuons : </p>
|
||
<p>NS (nameserver) permet de désigner les différents nameservers faisant autorité
|
||
pour ce domaine. </p>
|
||
<p>MX permet d'indiquer ou il convient d'envoyer les emails pour ce domaine.
|
||
SPF est un record d'authentification pour les emails.
|
||
Les records A désignent l'association entre un nom de domaine et une adresse
|
||
IPv4. Les records AAAA font de même pour les IPv6, mais malheureusement ce site
|
||
n'est pas encore en IPv6.</p>
|
||
<p>Les CNAME (canonical name) sont en quelque sorte des alias, ils permettent de
|
||
mettre en place des domaines exactement semblables a d'autre (ce qui permet par
|
||
exemple de filtrer ensuite avec les Virtual Hosts d'Apache, pour le web)</p>
|
||
<p>Enfin, la partie qui suit commence avec une déclaration $ORIGIN, ce qui permet
|
||
de changer la valeur du @ et des noms de domaine non complets (qui ne se
|
||
terminent pas avec un .). Ainsi, la partie suivant définit les nameservers et
|
||
l'adresse IP principale de home.wxcafe.net et de ns.home.wxcafe.net. Comme on
|
||
l'a vu, étant donné que ce nom de domaine est géré par un autre serveur DNS,
|
||
cela permet de rediriger les requêtes nous parvenant et demandant un domaine se
|
||
trouvant sous home.wxcafe.net.</p>
|
||
<p>Les autres fichiers de zone sont sensiblement similaires, avec les quelques
|
||
différences n'étant en fin de compte que des différences de valeurs (dues au
|
||
fait que, eh bah, c'est pas les mêmes domaines...).</p>
|
||
<p>Voila donc une courte explication de ce qu'est le DNS. Bien entendu, tout n'est
|
||
pas expliqué ici, je ne suis passé que sur ce qui est en place au niveau de
|
||
wxcafe.net, et encore, rapidement. Si vous voulez en savoir plus, vous pouvez
|
||
aller vous renseigner directement a la source : le <a href="https://www.ietf.org/rfc/rfc1034.txt">RFC
|
||
1034</a> et le
|
||
<a href="https://www.ietf.org/rfc/rfc1035.txt">RFC 1035</a>. Dans un autre style (bien plus
|
||
avancé) le blog de <a href="http://bortzmeyer.org">Stéphane Bortzmeyer</a> est interessant
|
||
aussi.</p></div>
|
||
</div>
|
||
<hr />
|
||
<div class="article">
|
||
<h1><a href="//wxcafe.net/posts/%D/nat/">NAT</a></h1>
|
||
<div class="well small"><footer class="post-info">
|
||
<span class="label">Date</span>
|
||
<span class="published" title="2014-02-17T05:02:00+01:00">
|
||
<i class="icon-calendar"></i> Mon 17 February 2014
|
||
</span>
|
||
<br />
|
||
<span class="label">By</span>
|
||
<a href="//wxcafe.net/author/wxcafe.html"><i class="icon-user"></i>wxcafé</a>
|
||
<br />
|
||
<span class="label">Category</span>
|
||
<a href="//wxcafe.net/category/ranting/"><i class="icon-folder-open"></i>Ranting</a>
|
||
<br />
|
||
|
||
|
||
|
||
|
||
</footer><!-- /.post-info --></div>
|
||
<div class="summary"><p>NAT (Network Address Translation) in a word?<br />
|
||
It's complicated. Very. Don't do it, you'd damage your brain. </p>
|
||
<p>Bon, sinon, prochain article serieux vite, bisous.</p></div>
|
||
</div>
|
||
<hr />
|
||
<div class="article">
|
||
<h1><a href="//wxcafe.net/posts/%D/plan-9-from-whichever-space/">Plan9 from whichever space</a></h1>
|
||
<div class="well small"><footer class="post-info">
|
||
<span class="label">Date</span>
|
||
<span class="published" title="2013-09-09T11:17:00+02:00">
|
||
<i class="icon-calendar"></i> Mon 09 September 2013
|
||
</span>
|
||
<br />
|
||
<span class="label">By</span>
|
||
<a href="//wxcafe.net/author/wxcafe.html"><i class="icon-user"></i>Wxcafe</a>
|
||
<br />
|
||
<span class="label">Category</span>
|
||
<a href="//wxcafe.net/category/oses/"><i class="icon-folder-open"></i>OSes</a>
|
||
<br />
|
||
|
||
|
||
|
||
|
||
</footer><!-- /.post-info --></div>
|
||
<div class="summary"><p><a href="http://en.wikipedia.org/wiki/Plan_9_from_Outer_Space"><strong>Plan 9 from Outer Space</strong></a> est un film de série Z, produit en 1959 par Edward D.
|
||
Wood. Il est assez connu comme étant l'un des pires films jamais sortis. Rempli
|
||
d'erreur de montage, d'effets spéciaux au rabais, et ayant même connu la mort
|
||
d'un acteur, il a ainsi atteint le statut de film culte grâce a sa médiocrité.</p>
|
||
<p><a href="http://plan9.bell-labs.com/plan9/"><strong>Plan 9 from Bell Labs</strong></a> est un OS venant de Bell Labs (comme son nom l'indique),
|
||
et qui a été pensé comme le successeur d'Unix. Il est conçu comme une poursuite
|
||
des concepts unixiens jusqu'à leur but naturel. Ainsi, c'est Plan9 qui a
|
||
introduit le concept d'UnionFS, le protocole 9P qui permet d'acceder a des
|
||
ressources appartenant a d'autres ordinateurs a distance, un support de
|
||
l'unicode par défaut et sur tout le système (a l'inverse d'Unix, qui fonctionne
|
||
a la base en ASCII), un support de ProcFS amélioré, une interface graphique par
|
||
défaut, et d'autres améliorations sur les thèmes de base que propose Unix. </p>
|
||
<p>Cependant, Plan9 n'a jamais été véritablement utilisé pour quoi que ce soit
|
||
d'autre que la recherche en systèmes, et c'est dommage, parce que Plan9 a
|
||
quelque chose de très intéressant à proposer. En effet, en ces jours d'intérêt
|
||
grandissant pour le klaoude et la délocalisation a la fois du processing et des
|
||
données, et bien que Plan9 ait été créé bien avant que le terme "cloud
|
||
computing" n'apparaisse pour la première fois, il semble que ce système ait été
|
||
conçu pour apporter cette délocalisation tant rêvée.</p>
|
||
<p>En effet, même si l'on considère que les nouveautés qu'il apporte par rapport a
|
||
Unix ne sont pas extraordinaires en soit (alors qu'elles sont déjà
|
||
conséquentes), lorsqu'on les prend ensemble, elles font de Plan9 le système
|
||
d'exploitation ultime en terme de partage de ressources et de données.
|
||
Ainsi, le fait que 9P permette de considérer toutes les ressources d'un système
|
||
distant comme n'étant qu'une poignée de fichiers permet de le monter comme
|
||
n'importe quel système de fichier. Le fait que chaque utilisateur puisse accéder
|
||
a plusieurs namespaces de façon transparente (et donc de démarrer, arrêter et
|
||
gérer des processus sur chacun de ces namespaces) et que chaque namespace puisse
|
||
interagir avec les autres, même s'ils sont hétérogènes (c'est a dire provenant
|
||
de machines différentes), permet d'utiliser les ressources d'une machine
|
||
distante comme si elle était présente localement. Le mécanisme d'UnionFS permet
|
||
de rendre tout ça utilisable, en montant plusieurs systèmes de fichiers sur le
|
||
même point de montage, en même temps, et de pouvoir ainsi accéder aux fichiers
|
||
de plusieurs machines a la fois (ce qui permet une délocalisation des données
|
||
bien plus poussée que Dropbox ou Google Drive, et ce en kernelspace).</p>
|
||
<p>Le réseau fait donc partie intégrante de Plan9, et il devient plus difficile de
|
||
parler d'ordinateur lorsque le concept même du système est d'être composé de
|
||
clusters eux mêmes composés de machines hétérogènes. Le système de fichier
|
||
virtuel /net fourni par le kernel de Plan9 permet d'implémenter très facilement
|
||
différents concepts réseaux : en montant le /net d'un ordinateur du réseau local
|
||
sur celui servant de gateway vers l'internet, on crée un NAT vers cet ordinateur
|
||
du réseau local. En montant le /net d'un ordinateur distant sur un ordinateur
|
||
local via le protocole 9P sécurisé, on crée un VPN : les connections locales se
|
||
font en utilisant l'accès de l'ordinateur distant, et les connections entre les
|
||
deux sont chiffrées. </p>
|
||
<p>Bref, bien avant les clusters de Raspberry Pi qui utilisent une api python pour
|
||
partager leur "puissance" de calcul en userspace, des superordinateurs pour
|
||
lesquels le noyau Linux s'est doté du support de jusqu'à 4096 CPUs, des OS tels
|
||
JoliOS qui promettent une integration du klaoude alors qu'ils ne sont en fait
|
||
que des navigateurs web a peine améliorés et des services de stockage en ligne
|
||
qui promettent un accès universel a toutes nos données alors qu'ils ne proposent
|
||
que de les garder a disposition par le web, Plan9 promettait une technologie de
|
||
partage des ressources système et de données, une intégration du réseau dans le
|
||
système particulièrement poussée, un environnement graphique supporté par le
|
||
basesystem et non greffé par dessus comme l'a été X11, et de nombreuses autres
|
||
améliorations sur Unix.</p>
|
||
<p>Malheureusement, il n'a jamais été adopté de façon véritablement significative,
|
||
et ce pour une raison très Unixiènne : "worse is better". En effet, le parc de
|
||
machines Unix déjà installées était suffisamment performant et fonctionnel pour
|
||
que des solutions soient développées au dessus du système pour remplir les
|
||
mêmes fonctions que remplit Plan9 <em>via</em> son kernel, tels le nouveau ProcFS de
|
||
Linux, FUSE, etc...</p></div>
|
||
</div>
|
||
<hr />
|
||
<div class="article">
|
||
<h1><a href="//wxcafe.net/posts/%D/sed-basics/">Sed Basics</a></h1>
|
||
<div class="well small"><footer class="post-info">
|
||
<span class="label">Date</span>
|
||
<span class="published" title="2013-08-18T22:57:00+02:00">
|
||
<i class="icon-calendar"></i> Sun 18 August 2013
|
||
</span>
|
||
<br />
|
||
<span class="label">By</span>
|
||
<a href="//wxcafe.net/author/wxcafe.html"><i class="icon-user"></i>Wxcafe</a>
|
||
<br />
|
||
<span class="label">Category</span>
|
||
<a href="//wxcafe.net/category/tutoriel/"><i class="icon-folder-open"></i>Tutoriel</a>
|
||
<br />
|
||
|
||
|
||
|
||
|
||
</footer><!-- /.post-info --></div>
|
||
<div class="summary"><p><code>sed</code> est un outil Unix très largement utilisé et très pratique pour manipuler
|
||
le texte (ce qui se montre relativement indispensable dans un environnement
|
||
Unix, puisque ce système est assez porté sur le texte). Cependant, il assez peu
|
||
connu en détail, et la plupart du temps une seule fonction est utilisée : le
|
||
remplacement de texte.<br />
|
||
Or <code>sed</code> a bien plus de possibilités que ça, comme nous allons le voir.</p>
|
||
<p>Tout d'abord, rappelons les bases : <code>sed</code> est un programme Unix de base, mais
|
||
aussi un langage de manipulation de texte dérivé de <code>ed</code>, l'éditeur original.
|
||
<code>ed</code> est un éditeur de ligne, conçu a l'époque ou les ordinateurs n'étaient pas
|
||
personnels et étaient utilisés avec des <a href="http://fr.wikipedia.org/wiki/telescripteur">téléscripteurs</a>, c'est a dire des
|
||
machines dépourvues d'écrans et ne permettant donc pas l'utilisation d'éditeurs
|
||
dits "visuels", tels que vim, emacs, et globalement tous les éditeurs ayant un
|
||
curseur et affichant plusieurs lignes. <code>sed</code> est donc une évolution de <code>ed</code>, le
|
||
s signifiant stream, <code>sed</code> est un éditeur de flux, prenant donc avantage du
|
||
concept Unixien de flux de données (voir <a href="http://fr.wikipedia.org/wiki/Flux_standard">Flux standards</a>) pour éditer plus d'une ligne a la fois.
|
||
En pratique, <code>sed</code> est principalement utilisé sur des fichiers.</p>
|
||
<p><code>sed</code> a quelques options pratique, notamment <code>-s</code> qui permet d'empêcher
|
||
l'affichage systématique des lignes traitées, ou bien <code>-i</code> (pour GNU sed) qui
|
||
permet de rediriger l'output dans le fichier d'input. Cela dit, l'intérêt unique
|
||
du programme est son langage de manipulation de texte.</p>
|
||
<p><code>ed</code>, et donc <code>sed</code>, utilise un langage basé sur les séparations (en général des
|
||
/). Ainsi, la commande de base dans <code>sed</code> est </p>
|
||
<div class="highlight"><pre><span class="o">/</span><span class="p">[</span><span class="n">regex</span><span class="p">]</span><span class="o">/</span>
|
||
</pre></div>
|
||
|
||
|
||
<p>qui permet de ne sélectionner que les lignes qui matchent [regex] (et donc de
|
||
n'exécuter les commandes qui suivent que sur ces lignes.) </p>
|
||
<p><br/>
|
||
La commande <code>sed</code> la plus utilisée est bien entendu le <strong>s</strong>, qui s'utilise de
|
||
la façon suivante : </p>
|
||
<div class="highlight"><pre><span class="n">s</span><span class="o">/</span><span class="p">[</span><span class="n">old</span> <span class="n">text</span><span class="p">]</span><span class="o">/</span><span class="p">[</span><span class="n">new</span> <span class="n">text</span><span class="p">]</span><span class="o">/</span><span class="p">[</span><span class="n">options</span><span class="p">]</span>
|
||
</pre></div>
|
||
|
||
|
||
<p>qui se propose donc de remplacer (substitute) [old text] (qui peut être une
|
||
regex) par [new text] (qui doit être un texte fixe, avec quelques
|
||
exceptions), en appliquant [options], la plus connue des options étant <code>g</code>,
|
||
qui permet d'appliquer la commande affectée a toutes les occurrences du texte
|
||
matché sur la/les lignes concernée-s.<br />
|
||
Les exceptions a la "fixité" de [new text] sont particulièrement
|
||
intéressantes. En effet, <code>sed</code> utilise un langage de regex plutôt standard,
|
||
excepté le fait qu'il permet jusqu'à 9 "holding spaces", qui sont délimités par
|
||
\( et \), et qui sont représentées dans le texte de remplacement par \1 à
|
||
\9.</p>
|
||
<p>Par exemple, la commande </p>
|
||
<div class="highlight"><pre><span class="n">sed</span> <span class="err">'</span><span class="n">s</span><span class="o">/</span><span class="err">\</span><span class="p">(</span><span class="n">hello</span> <span class="n">world</span><span class="err">\</span><span class="p">)</span> <span class="n">world</span><span class="o">/</span><span class="err">\</span><span class="mi">1</span><span class="o">/</span><span class="err">'</span>
|
||
</pre></div>
|
||
|
||
|
||
<p>sur le texte "hello world world" renverrait comme résultat</p>
|
||
<div class="highlight"><pre><span class="n">hello</span> <span class="n">world</span>
|
||
</pre></div>
|
||
|
||
|
||
<p>De la même façon, le symbole <code>&</code> dans le texte de remplacement représente le
|
||
texte original. Ainsi, la commande </p>
|
||
<div class="highlight"><pre><span class="n">sed</span> <span class="err">'</span><span class="n">s</span><span class="o">/</span><span class="n">hello</span> <span class="n">world</span><span class="o">/&</span> <span class="n">world</span><span class="o">/</span><span class="err">'</span>
|
||
</pre></div>
|
||
|
||
|
||
<p>sur le texte "hello world" renverrait comme résultat</p>
|
||
<div class="highlight"><pre><span class="n">hello</span> <span class="n">world</span> <span class="n">world</span>
|
||
</pre></div>
|
||
|
||
|
||
<p><br/></p>
|
||
<p>Une autre commande utile est <strong>p</strong>, qui sert a afficher le texte présent dans
|
||
l'espace courant :</p>
|
||
<div class="highlight"><pre><span class="o">/</span><span class="p">[</span><span class="n">regex</span><span class="p">]</span><span class="o">/</span><span class="n">p</span>
|
||
</pre></div>
|
||
|
||
|
||
<p><code>sed</code> stocke en effet la ligne sur laquelle il travaille dans un espace mémoire
|
||
dédié, que j'appelle l'espace courant (pattern space en anglais). La commande
|
||
<code>p</code> affiche (print) ce qui ce trouve dans cet espace. La /[regex]/ réduit
|
||
le pattern space de façon a ce qu'il ne contienne que les lignes matchant, et le
|
||
<strong>p</strong> affiche donc ce dernier.</p>
|
||
<p>Un autre exemple de commande sont <strong>c</strong>, <strong>i</strong> et <strong>a</strong>, qui s'utilisent ainsi :</p>
|
||
<div class="highlight"><pre><span class="n">c</span> \
|
||
<span class="p">[</span><span class="n">text</span><span class="p">]</span>
|
||
</pre></div>
|
||
|
||
|
||
<p>De la même façon, pour le i : </p>
|
||
<div class="highlight"><pre><span class="n">i</span> \
|
||
<span class="p">[</span><span class="n">text</span><span class="p">]</span>
|
||
</pre></div>
|
||
|
||
|
||
<p>Et de même pour a. </p>
|
||
<p>Ces trois commandes s'utilisent de la même façon pour la bonne raison qu'elles
|
||
sont très proches. <strong>i</strong> sert a insérer du texte <em>avant</em> le pattern space. <strong>a</strong>
|
||
sert a insérer du texte <em>après</em> le pattern space, et enfin <strong>c</strong> sert a
|
||
remplacer <em>tout</em> le pattern space. Les trois utilisent [text] comme
|
||
remplacement ou insert.
|
||
Attention, les insertions se font sur la ligne précédant ou suivant le pattern
|
||
space, et non sur la ligne en question.</p>
|
||
<p>Enfin, dernière commande ne fonctionnant que ligne par ligne, <strong>d</strong> :
|
||
/[regex]/d
|
||
<strong>d</strong> (delete) supprime les contenus du pattern space.</p>
|
||
<p><code>sed</code> est un outil puissant, mais complexe. Dans un prochain article, je
|
||
parlerai des commandes multilignes et des labels.</p></div>
|
||
</div>
|
||
<hr />
|
||
<div class="article">
|
||
<h1><a href="//wxcafe.net/posts/%D/le-chiffrement-de-partition-avec-dm-crypt-et-device-mapper/">Le chiffrement de partitions avec dm-crypt et device-mapper</a></h1>
|
||
<div class="well small"><footer class="post-info">
|
||
<span class="label">Date</span>
|
||
<span class="published" title="2013-07-10T03:18:00+02:00">
|
||
<i class="icon-calendar"></i> Wed 10 July 2013
|
||
</span>
|
||
<br />
|
||
<span class="label">By</span>
|
||
<a href="//wxcafe.net/author/wxcafe.html"><i class="icon-user"></i>Wxcafe</a>
|
||
<br />
|
||
<span class="label">Category</span>
|
||
<a href="//wxcafe.net/category/tutoriel/"><i class="icon-folder-open"></i>Tutoriel</a>
|
||
<br />
|
||
|
||
|
||
|
||
|
||
</footer><!-- /.post-info --></div>
|
||
<div class="summary"><p>Le chiffrement en tant que concept informatique est traditionnellement associé
|
||
au chiffrement de fichiers, c'est a dire au fait de passer d'un fichier <em>en
|
||
clair</em> a un fichier chiffré dit <em>cyphertext</em>. Cependant, il ne se limite pas a
|
||
ça, et peut aussi servir a garantir l'intégrité d'un système d'exploitation, ou
|
||
bien la confidentialité d'un support de stockage, par exemple. Nous allons ici
|
||
voir comment mettre en place un système de ce type sous GNU/Linux. Cet article
|
||
n'a pas pour but de vous apprendre a mettre en place un système basé sur une
|
||
procédure de boot sécurisée, mais plutôt d'expliquer les concepts qui entrent en
|
||
jeu dans l'utilisation du sous-système du noyau Linux <a href="http://en.wikipedia.org/wiki/dm-crypt"><strong>dm_crypt</strong></a> et de
|
||
présenter un rapide tutoriel concernant la création d'un support chiffré sur
|
||
lequel garder vos informations confidentielles (par exemple, votre <a href="http://wxcafe.net/posts/11/19/12/la-cryptographie-avec-pgp-et-principalement-gnupg">clé GPG</a>)</p>
|
||
<p>dm-crypt est un sous-système de device-mapper, qui est lui-même un sous-système
|
||
du noyau Linux, et s'appuie sur <a href="http://en.wikipedia.org/wiki/Linux_Unified_Key_Setup">LUKS</a>, un standard de chiffrement
|
||
de disques. Comme son nom l'indique, device-mapper est un système qui a pour but
|
||
de <strong>mapper</strong> des <strong>block devices</strong>. Pour être plus clair, le kernel considère
|
||
comme "block device" tout fichier spécial (en gros, les fichiers disques dans
|
||
<code>/dev/</code>, les systèmes de fichiers type LVM, les RAID logiciels, et, dans le
|
||
cas qui nous intéresse, les systèmes de fichier chiffrés). Son mode de
|
||
fonctionnement est simple : a partir d'un "fichier de périphérique" (trad.
|
||
Wikipédia), il en "crée" un nouveau, virtuel, ayant des propriétés différentes.
|
||
Par exemple, un disque partitionné via LVM apparaîtra comme un seul disque dans
|
||
/dev, et device-mapper est requis pour pouvoir en voir les partitions (qui
|
||
apparaîtront donc dans /dev/mapper)</p>
|
||
<p>Ainsi, dans le cas qui nous intéresse ici, device-mapper prend un système de
|
||
fichier chiffré, crée un périphérique virtuel non chiffré dans /dev/mapper, et
|
||
déchiffre a la volée tous les accès disques a ce périphérique non chiffré en les
|
||
traduisant sur le système de fichier chiffré, le tout de manière tout a fait
|
||
transparente pour les applications utilisant le disque en question. Cela induit
|
||
bien entendu une baisse de performance relativement significative dans le cas
|
||
d'un chiffrement du système de fichier root, mais quasiment insignifiante dans
|
||
le cas de chiffrement de partitions de données.</p>
|
||
<p>D'ailleurs, certain-e-s se demandent peut-être comment le système peut démarrer
|
||
si le système de fichier root est chiffré. Dans ce cas précis, la procédure de
|
||
boot <strong><em>doit</em></strong> s'appuyer sur une image initrd (l'initrd est un système de
|
||
fichier minimal qui sert uniquement a initialiser le système. Les kernels de
|
||
base de la plupart des distributions GNU/Linux en utilisent un dans tous les
|
||
cas, pour des raisons de compatibilité) et sur une partition de boot qui elle
|
||
n'est pas chiffrée. Ainsi, le bootloader de niveau 2 (grub, syslinux,...) charge
|
||
en mémoire le kernel depuis la partition de boot, puis ce dernier décompresse et
|
||
charge l'initrd en RAM, celui-ci a son tour lance un script permettant de
|
||
charger les modules nécessaires a la suite du boot (que ce soit pour un boot
|
||
sans disque root local, ou bien comme ici avec un système chiffré), puis le
|
||
système de fichier "cible" est remonté sur la racine, et l'initrd est démonté
|
||
est la RAM qu'il occupait est libérée, puis la procédure de boot normale reprend
|
||
depuis le système de fichier maintenant monté sur la racine.</p>
|
||
<p>La méthode la plus évidente pour contourner le chiffrement du disque est alors
|
||
de remplacer le fichier compressé initrd dans /boot, qui n'est pas chiffrée, par
|
||
un autre modifié, copiant par exemple la phrase de passe permettant de
|
||
déchiffrer la partition cible. Plusieurs méthodes permettent de se prémunir
|
||
contre ce genre d'attaques : l'une des plus simple est de faire un checksum du
|
||
fichier initrd utilisé et reconnu comme sûr, et de vérifier lors du <em>vrai</em> boot
|
||
que l'initrd présente toujours le même checksum. Cela dit, cette méthode a
|
||
l'inconvénient d'intervenir après les faits, et de nécessiter au moins un accès
|
||
a un fichier initrd reconnu comme sûr.<br />
|
||
Une autre approche consisterait a placer le système de fichier /boot sur un
|
||
périphérique dédié, protégé en écriture de façon matérielle (par exemple, une
|
||
carte SD) ou, de façon encore plus efficace, sur un périphérique chiffré et
|
||
protégé en écriture de façon matérielle. Ainsi, il n'est pas possible pour un
|
||
attaquant de modifier ce système de fichier, et l'initrd est alors toujours de
|
||
confiance. Cependant, cela a pour conséquence de rendre la mise a jour de
|
||
l'initrd et du noyau <em>beaucoup</em> plus difficile qu'elle ne le serait sans.</p>
|
||
<p>Pour en revenir aux systèmes de fichiers chiffrés, leur gestion est faite par un
|
||
programme dédié, <code>cryptsetup</code>. Ce dernier était en charge de cryptoloop,
|
||
l'ancien sous-système de chiffrement du kernel Linux (déprécié depuis), et est
|
||
maintenant responsable de l'utilisation <em>userspace</em> de dm-crypt, qui pour sa
|
||
part est entièrement <em>kernel-space</em>. Cryptsetup permet ainsi le chiffrement, la
|
||
manipulation (montage/démontage/...) et la gestion de clé des systèmes de fichier
|
||
LUKS. Cryptsetup est cependant conçu pour être utilisé en tant que root, et les
|
||
utilisateurs qui veulent monter de systèmes de fichiers chiffrés devront ainsi
|
||
obligatoirement être capables de le faire en tant que root. </p>
|
||
<p>Voyons comment il faudrait procéder pour créer une image disque chiffrée de 1Go :<br />
|
||
Tout d'abord, il nous faut créer le fichier qui contiendra l'image. Pour cela,
|
||
dans une situation réelle ou l'on cherche a chiffrer un disque, il convient
|
||
d'utiliser /dev/urandom comme source, pour éviter la détection du système de
|
||
fichier chiffré sur le disque.
|
||
Ici, par exemple, nous allons faire : </p>
|
||
<div class="highlight"><pre><span class="n">dd</span> <span class="n">bs</span><span class="o">=</span><span class="mi">1000</span> <span class="n">count</span><span class="o">=</span><span class="mi">1000000</span> <span class="k">if</span><span class="o">=/</span><span class="n">dev</span><span class="o">/</span><span class="n">urandom</span> <span class="n">of</span><span class="o">=</span><span class="n">image</span><span class="p">.</span><span class="n">img</span>
|
||
</pre></div>
|
||
|
||
|
||
<p>Maintenant que notre image est créée, nous pouvons la chiffrer : </p>
|
||
<div class="highlight"><pre><span class="n">sudo</span> <span class="n">cryptsetup</span> <span class="n">luksFormat</span> <span class="n">image</span><span class="p">.</span><span class="n">img</span>
|
||
</pre></div>
|
||
|
||
|
||
<p><code>cryptsetup</code> va alors nous demander si nous sommes absolument surs de vouloir
|
||
formater ce disque (nous allons donc valider en tapant YES), puis une
|
||
passphrase. Il convient ici de choisir une passphrase particulièrement sûre,
|
||
puisque toute personne ayant accès a la passphrase aura aussi accès au disque et
|
||
donc a vos secrets.<br />
|
||
Une fois cela fait, nous allons mapper cette image : </p>
|
||
<div class="highlight"><pre><span class="n">sudo</span> <span class="n">cryptsetup</span> <span class="n">luksOpen</span> <span class="n">image</span><span class="p">.</span><span class="n">img</span> <span class="n">crypto</span>
|
||
</pre></div>
|
||
|
||
|
||
<p><code>cryptsetup</code> nous redemande la passphrase, charge pendant quelques secondes,
|
||
puis nous redonne le prompt. Que s'est-il passé? En cherchant un peu, nous
|
||
voyons qu'il n'y a pas de nouveau disque dans /dev. C'est tout a fait normal. En
|
||
effet, cryptsetup (et par lui, device-mapper et dm-crypt) ne monte pas les
|
||
systèmes de fichiers chiffrés, il les mappe, et ça n'a rien a voir. On remarque
|
||
qu'est apparu dans /dev/mapper le fichier crypto. Ce fichier est le disque
|
||
virtuel qui correspond a notre image. Il se comporte comme toute partition, et
|
||
peut donc être monté, formaté, etc (il ne peut cependant pas être partitionné.
|
||
Il se comporte en effet comme une partition, et non comme un véritable disque.)
|
||
Bon, ceci fait, notre disque virtuel n'est pas formaté. Il nous reviens donc de
|
||
le faire, pour pouvoir l'utiliser. </p>
|
||
<div class="highlight"><pre><span class="n">sudo</span> <span class="n">mkfs</span><span class="p">.</span><span class="n">ext4</span> <span class="o">/</span><span class="n">dev</span><span class="o">/</span><span class="n">mapper</span><span class="o">/</span><span class="n">crypto</span>
|
||
</pre></div>
|
||
|
||
|
||
<p>Maintenant que notre disque est formaté, il peut être monté : </p>
|
||
<div class="highlight"><pre><span class="n">sudo</span> <span class="n">mount</span> <span class="o">/</span><span class="n">dev</span><span class="o">/</span><span class="n">mapper</span><span class="o">/</span><span class="n">crypto</span> <span class="o">/</span><span class="n">mnt</span>
|
||
</pre></div>
|
||
|
||
|
||
<p>Et voila, nous avons un système de fichier fonctionnel et chiffré! Si vous
|
||
voulez vérifier, un <code>mount | grep crypto</code> devrait vous donner le résultat
|
||
suivant : </p>
|
||
<div class="highlight"><pre><span class="o">/</span><span class="n">dev</span><span class="o">/</span><span class="n">mapper</span><span class="o">/</span><span class="n">crypto</span> <span class="n">on</span> <span class="o">/</span><span class="n">mnt</span> <span class="n">type</span> <span class="n">ext4</span> <span class="p">(</span><span class="n">rw</span><span class="p">,</span><span class="n">relatime</span><span class="p">,</span><span class="n">data</span><span class="o">=</span><span class="n">ordered</span><span class="p">)</span>
|
||
</pre></div>
|
||
|
||
|
||
<p>Vous pouvez maintenant commencer a stocker tous vos secrets sur ce fichier, ils
|
||
sont (en fonction de votre passphrase) en sécurité. </p>
|
||
<p>Pour résumer :</p>
|
||
<ul>
|
||
<li>
|
||
<p>Pour monter vos partitions : </p>
|
||
<div class="highlight"><pre><span class="nx">sudo</span> <span class="nx">cryptsetup</span> <span class="nx">luksOpen</span> <span class="o"><</span><span class="nx">fichier</span> <span class="nx">chiffré</span><span class="o">></span> <span class="o"><</span><span class="nx">nom</span> <span class="nx">de</span> <span class="nx">disque</span> <span class="nx">virtuel</span><span class="o">></span>
|
||
<span class="nx">sudo</span> <span class="nx">mount</span> <span class="p">/</span><span class="nx">dev</span><span class="p">/</span><span class="nx">mapper</span><span class="o">/<</span><span class="nx">nom</span> <span class="nx">de</span> <span class="nx">disque</span> <span class="nx">virtuel</span><span class="o">></span> <span class="o"><</span><span class="nx">emplacement</span><span class="o">></span>
|
||
</pre></div>
|
||
|
||
|
||
</li>
|
||
<li>
|
||
<p>Pour démonter vos partitions : </p>
|
||
<div class="highlight"><pre><span class="nx">sudo</span> <span class="nx">umount</span> <span class="o"><</span><span class="nx">emplacement</span><span class="o">></span>
|
||
<span class="nx">sudo</span> <span class="nx">cryptsetup</span> <span class="nx">luksClose</span> <span class="o"><</span><span class="nx">nom</span> <span class="nx">de</span> <span class="nx">disque</span> <span class="nx">virtuel</span><span class="o">></span>
|
||
</pre></div>
|
||
|
||
|
||
</li>
|
||
</ul>
|
||
<p>Pour simplifier la vie de tous, j'ai créé deux petits scripts vous permettant de
|
||
créer et de monter/démonter vos images/disques chiffré-e-s en une seule
|
||
commande. Ils se trouvent sur <a href="https://github.com/wxcafe/cryptoscripts">github</a>. </p>
|
||
<p>Par ailleurs, si vous comptez transferer votre image disque sur un véritable
|
||
disque (ou clé usb, ou autre), il est préférable de créer une partition de
|
||
taille appropriée et de faire un <code>dd if=votre_image of=/dev/votre_partition</code>
|
||
pour ce faire.</p></div>
|
||
</div>
|
||
<hr />
|
||
<div class="article">
|
||
<h1><a href="//wxcafe.net/posts/%D/redesign-du-blog/">Redesign du blog, etc</a></h1>
|
||
<div class="well small"><footer class="post-info">
|
||
<span class="label">Date</span>
|
||
<span class="published" title="2013-06-12T19:14:00+02:00">
|
||
<i class="icon-calendar"></i> Wed 12 June 2013
|
||
</span>
|
||
<br />
|
||
<span class="label">By</span>
|
||
<a href="//wxcafe.net/author/wxcafe.html"><i class="icon-user"></i>wxcafe</a>
|
||
<br />
|
||
<span class="label">Category</span>
|
||
<a href="//wxcafe.net/category/notes/"><i class="icon-folder-open"></i>Notes</a>
|
||
<br />
|
||
|
||
|
||
|
||
|
||
</footer><!-- /.post-info --></div>
|
||
<div class="summary"><p>Comme vous avez pu le remarquer, ce blog a "un peu" changé récemment.</p>
|
||
<p>Du coup, expliquons. J'ai récemment monté <a href="http://serverporn.fr">serverporn</a>, et ai par la même
|
||
occasion découvert <a href="http://getpelican.com">pelican</a>. J'ai tout de suite accroché a ce générateur de
|
||
site statique en python, du fait de son efficacité, de sa facilité d'utilisation
|
||
et de sa grande customisation. En gros, pelican est un logiciel qui prend des
|
||
fichiers markdown ou reStructuredText, les passe a la moulinette d'un "thème"
|
||
constitué de templates pour les fichiers html et l'organisation du projet et
|
||
d'une partie "statique" contenant le css, et les autres fichiers nécessaires au
|
||
projet, et en fait des pages html. </p>
|
||
<p>Globalement, un thème est constitué ainsi :</p>
|
||
<div class="highlight"><pre><span class="n">th</span><span class="err">è</span><span class="n">me</span>
|
||
<span class="err">├──</span> <span class="k">static</span>
|
||
<span class="err">│</span> <span class="err">├─</span> <span class="n">css</span>
|
||
<span class="err">│</span> <span class="err">│</span> <span class="err">└─</span> <span class="p">[</span><span class="n">css</span> <span class="n">files</span><span class="p">]</span>
|
||
<span class="err">│</span> <span class="err">├─</span> <span class="n">img</span>
|
||
<span class="err">│</span> <span class="err">│</span> <span class="err">└─</span> <span class="p">[</span><span class="n">image</span> <span class="n">files</span><span class="p">]</span>
|
||
<span class="err">│</span> <span class="err">└─</span> <span class="n">js</span>
|
||
<span class="err">│</span> <span class="err">└─</span> <span class="p">[</span><span class="n">javascript</span> <span class="n">files</span><span class="p">]</span>
|
||
<span class="err">└──</span> <span class="n">template</span>
|
||
<span class="err">├─</span> <span class="n">base</span><span class="p">.</span><span class="n">html</span>
|
||
<span class="err">├─</span> <span class="n">index</span><span class="p">.</span><span class="n">html</span>
|
||
<span class="err">├─</span> <span class="n">page</span><span class="p">.</span><span class="n">html</span>
|
||
<span class="err">├─</span> <span class="p">[...]</span>
|
||
<span class="err">└─</span> <span class="n">article</span><span class="p">.</span><span class="n">html</span>
|
||
</pre></div>
|
||
|
||
|
||
<p>Sachant que les fichiers .html sont en réalité des fichiers suivant la syntaxe
|
||
django, et utilisent des variables particulières telles <code>{{ article.content }}</code>,
|
||
par exemple. La syntaxe complète est très bien documentée dans la <a href="http://docs.getpelican.com/en/3.2/themes.html#templates-and-variables">doc</a> de
|
||
pelican.</p>
|
||
<p>L'un des grands avantages de pelican est aussi la facilité qu'il offre quand a
|
||
la mise a jour du blog.<br />
|
||
En effet, il offre un système de Makefiles permettant, grâce a de nombreuses
|
||
cibles de compilation, de régénérer le site entier, de ne générer que les
|
||
fichiers modifiés depuis la dernière génération, de générer uniquement les
|
||
fichiers n'existant pas la dernière fois, etc...
|
||
La gestion du projet en devient donc très simple, puisque après avoir écrit un
|
||
article, il suffit de faire un <code>make html</code> pour mettre a jour le blog.</p>
|
||
<p>De plus, le système de wordpress commençait a ne plus me convenir, du fait du
|
||
manque de customisation, du fait que ça soit du PHP (beurk), etc. La, avec
|
||
pelican, je contrôle bien plus ce qui est mis sur le serveur (puisque c'est moi
|
||
qui ait modifié les templates et le css), c'est lisible (puisque c'est du
|
||
python, par opposition au PHP...), et c'est plus "efficace". Le markdown est
|
||
très pratique, je peux utiliser mon éditeur de texte de prédilection pour faire
|
||
les articles, je n'ai pas besoin d'un accès continu au net, bref, c'est plus
|
||
efficace.</p>
|
||
<p>En ce qui concerne les points négatifs : </p>
|
||
<ul>
|
||
<li>
|
||
<p>Perte des commentaires:
|
||
Je vous propose de vous référer a l'article de Gordontesos <a href="http://gordon.re/hacktivisme/la-necessite-des-commentaires.html">ici</a> quand a
|
||
mon avis sur ce sujet.</p>
|
||
</li>
|
||
<li>
|
||
<p>Perte du bouton flattr:
|
||
Il va bientôt être remis, c'est juste un manque de temps de ma part, mais vu
|
||
que toutes les pages passent par les mêmes templates, c'est assez facile a
|
||
faire.</p>
|
||
</li>
|
||
<li>
|
||
<p>Perte du spam:
|
||
Pourquoi c'est dans les points négatifs, ca?</p>
|
||
</li>
|
||
<li>
|
||
<p>Temps d'adaptation et d'appréhension du système:
|
||
Oui, pendant encore un certain temps, il y aura des glitchs plus ou moins
|
||
réguliers sur le blog, c'est parce que j'apprend a me servir de ce système
|
||
et que j'apprend du css et du html. Ca arrive, ca passera, mais dans tous
|
||
les cas ca me permet d'apprendre plein de choses, donc je mets plutôt ca
|
||
dans la catëgorie positive.</p>
|
||
</li>
|
||
</ul>
|
||
<p>Voila, c'est mon retour d'expérience sur pelican. A plus. </p></div>
|
||
</div>
|
||
<hr />
|
||
<div class="article">
|
||
<h1><a href="//wxcafe.net/posts/%D/comment-saurik-a-roote-les-google-glass/">Comment Saurik a rooté les Google Glass</a></h1>
|
||
<div class="well small"><footer class="post-info">
|
||
<span class="label">Date</span>
|
||
<span class="published" title="2013-05-06T06:24:00+02:00">
|
||
<i class="icon-calendar"></i> Mon 06 May 2013
|
||
</span>
|
||
<br />
|
||
<span class="label">By</span>
|
||
<a href="//wxcafe.net/author/wxcafe.html"><i class="icon-user"></i>Wxcafe</a>
|
||
<br />
|
||
<span class="label">Category</span>
|
||
<a href="//wxcafe.net/category/hacking/"><i class="icon-folder-open"></i>Hacking</a>
|
||
<br />
|
||
|
||
|
||
|
||
|
||
</footer><!-- /.post-info --></div>
|
||
<div class="summary"><p>Comme vous avez pu le lire dans les médias, Saurik (Jay Freeman, connu
|
||
pour avoir développé Cydia, un "app store" alternatif pour les iTrucs),
|
||
après avoir reçu une paire de Google glass de la part de Google (de
|
||
façon assez évidente...), a trouvé intéressant d'obtenir un accès root
|
||
sur celles-ci, ce qu'il a accompli très rapidement. Des démentis de la
|
||
part de Google et de certains autres sites sont vite arrivés, disant que
|
||
les lunettes possédaient un bootloader débloqué et que de fait, le root
|
||
était facile a obtenir : il suffisait de débloquer le bootloader,
|
||
d'extraire l'OS, de le rooter hors-fonctionnement, puis de le
|
||
réinstaller, rooté, sur les lunettes.</p>
|
||
<p>Le fait est que de débloquer le bootloader laisse une trace permanente
|
||
sur les lunettes, et que Saurik n'a pas utilisé cette technique pour
|
||
rooter sa paire. Voyons comment il a fait :</p>
|
||
<p><em>Je tiens tout d'abord a préciser que toutes les informations qui vont
|
||
suivre sont extraites de <a href="http://www.saurik.com/id/16">cet article</a>, et plus précisément de la
|
||
partie "How does this exploit work". Je tente d'apporter ma maigre
|
||
contribution a cette explication.</em></p>
|
||
<p>Donc, d'après les témoignages des quelques utilisateurs de Glass dans le
|
||
monde, il semblerait que ces dernières fonctionnent avec un système
|
||
d'exploitation Android, avec une nouvelle interface, mais avec les mêmes
|
||
outils internes: un kernel Linux, des outils userland GNU et une machine
|
||
virtuelle Java Dalvik pour les applications.</p>
|
||
<p>Saurik a donc cherché un exploit connu pour cette version d'android, et
|
||
l'a appliqué a son problème. L'exploit en question est relativement
|
||
simple. Depuis la version 4.0 d'android, le système permet la sauvegarde
|
||
des données des différentes applications, une a une, via ADB (Android
|
||
Debug Bridge, un protocole USB permettant l'accès a de nombreuses
|
||
fonctions avancées des machines fonctionnant sous android, dont, entre
|
||
autre, un shell, un accès au logs de debugging, etc... Cette
|
||
fonctionnalité est bien entendu désactivable.) Ce backup est très simple :
|
||
il crée un fichier .tgz contenant le dossier de configuration de
|
||
l'application. Lors de la restauration, le système supprime la
|
||
configuration existante, puis la remplace par celle dans l'archive gzip.</p>
|
||
<p>Le problème de sécurité vient du fait que les applications android
|
||
voient leurs données stockées dans /data/data/identifiant/, et que
|
||
/data/ a pour permissions drwxrwx--x 27 system system, ce qui
|
||
signifie que seul system et les membres du groupe system peuvent lire
|
||
dessus. Or, le fichier /data/local.prop définit de nombreux paramètres
|
||
au démarrage, et notamment un qui permet au système de déterminer s'il
|
||
fonctionne dans une VM ou sur un véritable appareil. S'il fonctionne sur
|
||
une machine virtuelle, il donne les droits root a tout utilisateur se
|
||
connectant via ADB, ce qui est ce que l'on cherche pour l'instant. Le
|
||
fait que /data/ appartienne a system veut dire que le programme de
|
||
restauration doit être setuid pour accéder aux données a l’intérieur qui
|
||
appartiennent a root (soit toutes les applications système d'android,
|
||
dont l'application paramètres, et, dans ce cas précis, l'application de
|
||
log système présente sur les google glass de test. Ainsi, nous avons un
|
||
processus tournant en tant que root, qui va écrire sur une partition qui
|
||
nous intéresse des données que nous possédons.</p>
|
||
<p>Cependant, un problème reste : le système de restauration d'Android
|
||
vérifie les données avant de restaurer, et ne restaure pas les symlinks,
|
||
ce qui nous empêche d'avoir accès directement a /data/local.prop, le
|
||
fichier qu'on cherche a modifier. Cela dit, il nous reste une
|
||
possiblité. Plaçons un dossier world-writable dans le fichier de backup,
|
||
et nous pourrons écrire dedans pendant quelques secondes, le temps que
|
||
la restauration se termine et que le système remette les permissions en
|
||
place. Ainsi, nous pouvons créer le fichier
|
||
/data/local/com.google.glass.logging/whatev/x, lien vers
|
||
/data/local.prop, et nous avons un toujours un processus tournant en
|
||
tant que root qui est en train d'écrire dans ce dossier.</p>
|
||
<p>Donc, nous allons lancer deux processus en même temps : </p>
|
||
<ul>
|
||
<li>
|
||
<p>Le premier tentera en boucle de créer le symlink. Il sera consitué de
|
||
la commande suivante, depuis un shell sur les lunettes :</p>
|
||
<div class="highlight"><pre><span class="k">while</span> <span class="o">!</span> <span class="n">ln</span> <span class="o">-</span><span class="n">s</span> <span class="o">/</span><span class="n">data</span><span class="o">/</span><span class="n">local</span><span class="p">.</span><span class="n">prop</span> <span class="o">/</span><span class="n">data</span><span class="o">/</span><span class="n">data</span><span class="o">/</span><span class="n">com</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">glass</span><span class="p">.</span><span class="n">logging</span><span class="o">/</span><span class="n">whatev</span><span class="o">/</span><span class="n">x</span> <span class="mi">2</span><span class="o">>/</span><span class="n">dev</span><span class="o">/</span><span class="n">null</span>
|
||
<span class="k">do</span> <span class="o">:</span>
|
||
<span class="n">done</span>
|
||
</pre></div>
|
||
|
||
|
||
</li>
|
||
<li>
|
||
<p>Le deuxième sera le processus de restauration de notre exploit. Celui
|
||
ci, pour une plus grande chance de réussite, devra être suffisamment
|
||
lourd : au moins \~50Mo. Il devra contenir whatev/bigfile et whatev/x,
|
||
pour qu'il crée whatev, prenne du temps a copier bigfile, puis écrive
|
||
dans x après que le symlink soit effectif. La commande sera, depuis
|
||
l'ordinateur host :</p>
|
||
<div class="highlight"><pre><span class="n">adb</span> <span class="n">restore</span> <span class="n">exploit</span><span class="p">.</span><span class="n">ab</span>
|
||
</pre></div>
|
||
|
||
|
||
<p>Ces commandes vont fonctionner de concert pour nous donner un accès root :<br />
|
||
- Le processus de restauration va créer le dossier whatev, qui sera
|
||
world-readable. Il va commencer a copier le fichier bigfile.<br />
|
||
- Le processus de symlink va créer le lien
|
||
/data/data/com.google.glass.logging/whatev/x, pointant vers
|
||
/data/local.prop, puis rendre l'âme proprement.<br />
|
||
- Le processus de restauration, ayant enfin fini de copier
|
||
whatev/bigfile, copiera les contenus que nous voulons dans whatev/x, qui
|
||
est lié a /data/local.prop. Comme le processus est setuid root, il ne se
|
||
rendra compte de rien, et écrira tout dans /data/local.prop.</p>
|
||
</li>
|
||
</ul>
|
||
<p>And voilà! On a écrit ce que l'on veut dans /data/local.prop, ce qui
|
||
nous permet de faire croire a android qu'il tourne dans une machine
|
||
virtuelle (ce que l'on veut, c'est en fait "ro.kernel.qemu=1", qui
|
||
indique au noyau qu'il tourne dans qemu, un système de VM).</p>
|
||
<p>Il nous reste a rebooter, depuis l'ordinateur host :</p>
|
||
<div class="highlight"><pre><span class="n">adb</span> <span class="n">reboot</span>
|
||
</pre></div>
|
||
|
||
|
||
<p>Puis nous remontons la partitions système en lecture/écriture (r/w),
|
||
depuis le host :</p>
|
||
<div class="highlight"><pre><span class="n">adb</span> <span class="n">shell</span> <span class="s">"mount -o remount,rw /system"</span>
|
||
</pre></div>
|
||
|
||
|
||
<p>Nous copions le binaire <a href="https://data.wxcafe.net/uploads/android/glass/su">su</a> vers l'appareil :</p>
|
||
<div class="highlight"><pre><span class="n">adb</span> <span class="n">push</span> <span class="n">su</span> <span class="o">/</span><span class="n">system</span><span class="o">/</span><span class="n">xbin</span>
|
||
</pre></div>
|
||
|
||
|
||
<p>Nous donnons les bonnes permissions a ce binaire, afin de pouvoir
|
||
l’exécuter plus tard :</p>
|
||
<div class="highlight"><pre><span class="n">adb</span> <span class="n">shell</span> <span class="s">"chmod 6755 /system/xbin/su"</span>
|
||
</pre></div>
|
||
|
||
|
||
<p>Ensuite, nous supprimons le fichier /data/local.prop, pour pouvoir
|
||
redémarrer normalement :</p>
|
||
<div class="highlight"><pre><span class="n">adb</span> <span class="n">shell</span> <span class="s">"rm /data/local.prop"</span>
|
||
</pre></div>
|
||
|
||
|
||
<p>Enfin, nous redemarrons a nouveau :</p>
|
||
<div class="highlight"><pre><span class="n">adb</span> <span class="n">reboot</span>
|
||
</pre></div>
|
||
|
||
|
||
<p>Et voila, une paire de google glass rootée!</p>
|
||
<p>Il est bon de préciser que cette manipulation n'est possible que parce
|
||
que les lunettes tournent sous une ancienne version d'android, et que ce
|
||
bug a été fixé depuis.</p>
|
||
<p>Il serait aussi interessant de couvrir les problèmes de vie privée
|
||
qu'engendrent les Google Glass, et ce sera fait dans un autre billet.</p>
|
||
<p>A bientôt!</p></div>
|
||
</div>
|
||
<hr />
|
||
<div class="pagination">
|
||
<ul>
|
||
<li class="prev disabled"><a href="#">← Previous</a></li>
|
||
<li class="active">
|
||
<a href="//wxcafe.net/index.html">1</a>
|
||
</li>
|
||
<li class="">
|
||
<a href="//wxcafe.net/index2.html">2</a>
|
||
</li>
|
||
<li class="">
|
||
<a href="//wxcafe.net/index3.html">3</a>
|
||
</li>
|
||
<li class="next"><a href="//wxcafe.net/index2.html">Next →</a></li>
|
||
</ul>
|
||
</div>
|
||
</div><!--/span-->
|
||
<div class="span3 well sidebar-nav" id="sidebar">
|
||
<ul class="nav nav-list">
|
||
|
||
|
||
<!-- Categories links -->
|
||
<li class="nav-header"><h4><i class="icon-folder-close icon-large"></i> Categories</h4></li>
|
||
<li>
|
||
<a href="//wxcafe.net/category/hacking/">
|
||
<i class="icon-folder-open icon-large"></i>Hacking
|
||
</a>
|
||
</li>
|
||
<li>
|
||
<a href="//wxcafe.net/category/language/">
|
||
<i class="icon-folder-open icon-large"></i>Language
|
||
</a>
|
||
</li>
|
||
<li>
|
||
<a href="//wxcafe.net/category/notes/">
|
||
<i class="icon-folder-open icon-large"></i>Notes
|
||
</a>
|
||
</li>
|
||
<li>
|
||
<a href="//wxcafe.net/category/oses/">
|
||
<i class="icon-folder-open icon-large"></i>OSes
|
||
</a>
|
||
</li>
|
||
<li>
|
||
<a href="//wxcafe.net/category/programmation/">
|
||
<i class="icon-folder-open icon-large"></i>Programmation
|
||
</a>
|
||
</li>
|
||
<li>
|
||
<a href="//wxcafe.net/category/ranting/">
|
||
<i class="icon-folder-open icon-large"></i>Ranting
|
||
</a>
|
||
</li>
|
||
<li>
|
||
<a href="//wxcafe.net/category/teaching/">
|
||
<i class="icon-folder-open icon-large"></i>Teaching
|
||
</a>
|
||
</li>
|
||
<li>
|
||
<a href="//wxcafe.net/category/tutorial/">
|
||
<i class="icon-folder-open icon-large"></i>Tutorial
|
||
</a>
|
||
</li>
|
||
<li>
|
||
<a href="//wxcafe.net/category/tutoriel/">
|
||
<i class="icon-folder-open icon-large"></i>Tutoriel
|
||
</a>
|
||
</li>
|
||
<hr>
|
||
|
||
<!-- Social links -->
|
||
<li class="nav-header"><h4><i class="icon-exchange"></i> social</h4></li>
|
||
<a class="FlattrButton" style="display:none;"
|
||
title="//wxcafe.net"
|
||
style="padding-top: 10px;"
|
||
rel="flattr;
|
||
url://wxcafe.net;
|
||
title://wxcafe.net;
|
||
button:compact;
|
||
popout:0;
|
||
uid:wxcafe;
|
||
category:blog;"
|
||
href="//wxcafe.net">flattr</a>
|
||
<li><a href="https://twitter.com/wxcafe"><i class="icon-twitter icon-large"></i> Twitter</a></li>
|
||
<li><a href="https://github.com/wxcafe"><i class="icon-github icon-large"></i> Github</a></li>
|
||
<li><a href="mailto://wxcafe@wxcafe.net"><i class="icon-envelope icon-large"></i> Email</a></li>
|
||
<li><a href="https://data.wxcafe.net/wxcafe.asc"><i class="icon-key icon-large"></i> Gpg</a></li>
|
||
<li><a href="finger://wxcafe@wxcafe.net"><i class="icon-terminal icon-large"></i> Finger</a></li>
|
||
<li><a href="http://leloop.org/where.html"><i class="icon-map-marker icon-large"></i> IRL</a></li>
|
||
|
||
<hr>
|
||
|
||
<!-- Links -->
|
||
<li class="nav-header"><h4><i class="icon-external-link"></i> Links</h4></li>
|
||
<li><a href="https://github.com/wxcafe/blog-source"><i class="icon-code icon-large "></i> Source!</a></li>
|
||
<li><a href="http://paste.wxcafe.net"><i class="icon-paste icon-large "></i> Zerobin</a></li>
|
||
<li><a href="http://git.wxcafe.net"><i class="icon-github-sign icon-large "></i> Public Git</a></li>
|
||
<hr>
|
||
|
||
<!--- RSS feed -->
|
||
<li class="nav-header"><h4><i class="icon-rss"></i> feeds</h4></li>
|
||
<li><a href="//wxcafe.net/feeds/feed.rss.xml" rel="alternate"><i class="icon-bookmark-empty icon-large"></i> RSS</a></li>
|
||
<li><a href="//wxcafe.net/feeds/feed.atom.xml" rel="alternate"><i class="icon-bookmark-empty icon-large"></i> Atom</a></li>
|
||
|
||
|
||
</ul> </div><!--/.well -->
|
||
</div><!--/row-->
|
||
<hr>
|
||
<footer>
|
||
<address id="about">
|
||
Proudly powered by <a href="http://pelican.notmyidea.org/">Pelican</a>,
|
||
which takes great advantage of <a href="http://python.org">Python</a>.<br />
|
||
Powered by <a href="https://github.com/getpelican/pelican-themes/tree/master/bootstrap2">bootstrap2</a> theme, thanks!
|
||
</address>
|
||
</footer>
|
||
</div><!--/.fluid-container-->
|
||
</body>
|
||
</html> |