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

<channel>
	<title>Le blog de John Jean &#187; Sysadmin</title>
	<atom:link href="http://www.john-jean.com/blog/category/sysadmin/feed" rel="self" type="application/rss+xml" />
	<link>http://www.john-jean.com/blog</link>
	<description>Actualité de sécurité informatique</description>
	<lastBuildDate>Wed, 19 May 2010 09:19:09 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Tracer les requêtes MySQL en cours d&#8217;exécution</title>
		<link>http://www.john-jean.com/blog/sysadmin/tracer-les-requetes-mysql-en-cours-dexecution-330</link>
		<comments>http://www.john-jean.com/blog/sysadmin/tracer-les-requetes-mysql-en-cours-dexecution-330#comments</comments>
		<pubDate>Tue, 18 May 2010 23:03:38 +0000</pubDate>
		<dc:creator>John JEAN</dc:creator>
				<category><![CDATA[Sysadmin]]></category>
		<category><![CDATA[3306]]></category>
		<category><![CDATA[binary log]]></category>
		<category><![CDATA[libpcap]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[mysqlsniffer]]></category>
		<category><![CDATA[query log]]></category>
		<category><![CDATA[show processlist]]></category>
		<category><![CDATA[slow query log]]></category>
		<category><![CDATA[sniffer MySQL]]></category>
		<category><![CDATA[tcpdump]]></category>

		<guid isPermaLink="false">http://www.john-jean.com/blog/?p=330</guid>
		<description><![CDATA[Cette méthode permet de tracer l'intégralité des requêtes exécutées par MySQL à un instant T en utilisant tcpdump/libpcap.]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.john-jean.com/blog/wp-content/uploads/2010/05/mysql_logo.jpg" alt="mysql logo" width="165" height="147" align="left" /></p>
<p>S&#8217;il est relativement aisé de débugger une application en cours de développement ou lors des phases de preprod, c&#8217;est une toute autre histoire lorsque celle-ci est en production, et que l&#8217;on doit continuer à servir les pages aux internautes sans (trop) dégrader l&#8217;applicatif.</p>
<p>L&#8217;un des problèmes majeurs, si cela n&#8217;a pas été prévu en amont ou lors des tests unitaires, est de traquer ce que doit traiter MySQL à un instant T pour comprendre pourquoi mysqld utilise, par exemple, plus de 50% du CPU. En effet, les 3/4 des soucis de performance que nous rencontrons sur les développements sont dus à des requêtes mal pensées ou mal utilisées.</p>
<p><span id="more-330"></span></p>
<p>Dans le cadre d&#8217;un récent développement par un prestataire, nous avons eu à auditer une application qu&#8217;il a livré. Celle-ci avait une architecture relativement simple: Flex pour l&#8217;interface utilisateur, PHP propulsé par un Framework dont je tairais le nom pour traiter les actions de l&#8217;utilisateur, et ce dernier fait donc exécuter les requêtes MySQL pour servir le contenu au Flex. Au delà de ça, diverses choses comme du chat et de la webcam sont traitées par un serveur de streaming propriétaire d&#8217;Adobe: Flash Media Server (FMS pour les intimes). Le contexte d&#8217;analyse est simple: &laquo;&nbsp;tout se passait bien jusqu&#8217;au jour de la mise en beta&nbsp;&raquo;, jour à partir duquel il a été mis à disposition d&#8217;un bien grand nombre d&#8217;internautes des invitations &laquo;&nbsp;privées&nbsp;&raquo;, information relayée par quelques tweets de <a href="http://www.korben.info" target="_blank">bloggeurs influents</a>, tout ceci histoire de lancer paisiblement la machine. Ce jour là les classiques ont été constatés: charge apache, charge MySQL, SWAP et le tout s&#8217;est terminé en beauté par un magnifique segfault de FMS.</p>
<p>Afin de faire comprendre au prestataire que les soucis de performance n&#8217;étaient ni du:</p>
<ul>
<li>à une incroyable et incontrôlable explosion du trafic sur le serveur</li>
<li>à l&#8217;incompétence du sysadmin</li>
<li>à un comportement ésotérique du serveur</li>
<li>au sous dimensionnement du hardware (pour cette partie en tout cas) [1]</li>
<li>à bien d&#8217;autres choses&#8230;</li>
</ul>
<p>nous avons décidé de sortir sur un laps de quinze minutes les requêtes que devait exécuter MySQL. Ça c&#8217;était pour la théorie, maintenant quelle solution choisir ?</p>
<ol>
<li><strong>Utiliser munin</strong><br />
Munin ne nous aurait donné qu&#8217;une statistique générale du nombre de requêtes à traiter à un instant, sans nous en extraire le contenu. En effet, si l&#8217;on se penche sur le plugin mysql_queries de munin situé dans /usr/share/munin/plugins/, on observe qu&#8217;il ne fait qu&#8217;utiliser mysqladmin avec l&#8217;argument extended-status:</p>
<pre name="code" class="py">my $MYSQLADMIN = $ENV{mysqladmin} || "mysqladmin";
my $COMMAND = "$MYSQLADMIN $ENV{mysqlopts} extended-status";</pre>
</li>
</ol>
<ol>
<li><strong>Utiliser le <a title="Mysql Query log" href="http://dev.mysql.com/doc/refman/5.1/en/query-log.html" target="_blank">query log</a> de MySQL</strong><br />
Inenvisageable au moins pour deux raisons: nous étions en production, et donc pas envie de faire une erreur de configuration, aussi minime soit-elle. Mais surtout activer les logs de MySQL, sans savoir précisément de quoi il en retourne derrière (en volume de requêtes), c&#8217;est un coup à aggraver la situation en faisant exploser les I/O et par la même d&#8217;augmenter l&#8217;overhead de la machine. Le /etc/mysql/my.cnf est d&#8217;ailleurs plutôt clair à ce sujet:</p>
<pre class="py">
# Both location gets rotated by the cronjob.
# <strong>Be aware that this log type is a performance killer.</strong>
# log = /var/log/mysql/mysql.log
</pre>
</li>
<li><strong>Utiliser le <a title="Slow query log MySQL" href="http://dev.mysql.com/doc/refman/5.0/en/slow-query-log.html" target="_blank">slow query log</a> de MySQL<br />
</strong>Il ne recense que les requêtes qui prennent plus d&#8217;une seconde. Le problème est que la plupart des soucis de performance ne viennent pas de requêtes trop longues, mais simplement de requêtes qui sont exécutées très souvent, par exemple dans une boucle au lieu d&#8217;utiliser un JOIN.</li>
<li><strong>Utiliser le <a title="MySQL Binary log" href="http://dev.mysql.com/doc/refman/5.0/en/binary-log.html" target="_blank">log binaire</a> de MySQL<br />
</strong>Utilisation inappropriée: il enregistre l&#8217;intégralité des changements et est généralement utilisé pour la réplication, du fait de son contenu et de son format.</li>
<li><strong>Utiliser <a title="SHow profiles MySQL" href="http://dev.mysql.com/doc/refman/5.0/en/show-profiles.html" target="_blank">SHOW PROFILES</a></strong><br />
Malheureusement, il ne fait état que des ressources, ne gère pas l&#8217;intégralité des requêtes et doit surtout être <a href="http://dev.mysql.com/tech-resources/articles/using-new-query-profiler.html" target="_blank">gourmand</a>.</li>
<li><strong>Utiliser le patch de Google <a title="Mysql user statistics - Google patch" href="http://www.mysqlperformanceblog.com/2008/09/12/googles-user_statistics-v2-port-and-changes/" target="_blank">user_statistics<br />
</a></strong>Cette solution semble réellement viable pour analyser les performances par utilisateur, mais cela ne collait pas du tout à l&#8217;utilisation que je souhaitais en faire. Et ce n&#8217;était de toute façon pas déployé sur la machine.</li>
<li><strong>Utiliser <a title="MySQL Proxy" href="http://forge.mysql.com/wiki/MySQL_Proxy" target="_blank">Mysql Proxy</a></strong><br />
Cette solution est réellement idéale, elle embarque load balancing, failover, <strong>query analysis, query filtering</strong>,&#8230; avec de beaux charts. Malheureusement, même tarif que pour les logs cités précédemment: On ne déploie pas cela sur de la prod lorsqu&#8217;il est trop tard.</li>
</ol>
<p>Toutes ces solutions semblaient efficaces pour benchmarker au global un applicatif, un utilisateur, ou pour analyser les requêtes au globale, mais pas pour faire un snapshot à un instant T sans mettre le serveur à genoux.</p>
<p>Il existait un solution un peu bâtarde connue de tous:</p>
<ul>
<li><strong>La commande showprocesslist</strong><br />
Cette commande affiche la liste des requêtes en cours d&#8217;exécution. Pour chaque requête, vous pouvez voir en combien de temps celle-ci a été exécutée, son utilisateur et son état. Le soucis est que le snap est fait à l&#8217;instant précis où l&#8217;on tape la commande. En d&#8217;autre terme, je ne connais QUE la requête qui est exécutée précisément à CET instant. Je ne connais ni celle d&#8217;avant, ni celle d&#8217;après. C&#8217;est évidement la grosse limitation de cette méthode. Son avantage est en revanche d&#8217;être présent nativement sur toutes les versions de MySQL. On pouvait donc imaginer réunir les requêtes à l&#8217;aide un bête script:</p>
<pre>
john@laptop:~$ ./process.sh > dump
#!/bin/sh
while true
do
mysqladmin -ujohn -puuencode processlist
done
</pre>
<p>Pour le coup cette méthode ne m&#8217;a rien apporté de concluant:</p>
<pre>
+-------+------+-----------+----+---------+------+-------+------------------+
| Id    | User | Host      | db | Command | Time | State | Info             |
+-------+------+-----------+----+---------+------+-------+------------------+
| 22703 | joh  | localhost |    | Query   | 0    |       | show processlist |
+-------+------+-----------+----+---------+------+-------+------------------+
</pre>
</li>
</ul>
<p>Je n&#8217;ai trouvé que deux solutions pour réussir à faire ce dont j&#8217;avais besoin, mais ces deux solutions sont globalement les mêmes, elles utilisent la même méthode et le même principe: sniffer ce qui se passe sur le port 3306, port d&#8217;écoute de MySQL.</p>
<ol>
<li><strong>Utilisation de tcpdump<br />
</strong>J&#8217;ai donc entrepris de sniffer ce qui arrivait sur le 3306 avec tcpdump/libpcap à l&#8217;aide de la commande suivante [2]:</p>
<pre name="code" class="py">tcpdump -i lo -s 0 -l -w - dst port 3306 | strings | perl -e '
while(&lt;&gt;) { chomp; next if /^[^ ]+[ ]*$/;
if(/^(SELECT|UPDATE|DELETE|INSERT|SET|COMMIT|ROLLBACK|CREATE|DROP|ALTER|SHOW)/i) {
if (defined $q) { print "$q\n"; }
$q=$_;
} else {
$_ =~ s/^[ \t]+//; $q.=" $_";
}
}'
</pre>
<p>Celle-ci affichera en interactif l&#8217;intégralité des requêtes qui sont soumises à MySQL. Cette méthode n&#8217;a rien donné dans un premier temps: les fichiers de configuration utilisaient localhost comme hôte de connexion. J&#8217;ai donc du modifier l&#8217;hôte en 127.0.0.1 pour passer par la network stack. Et là, Ô joie, toutes les requêtes processées par MySQL s&#8217;empilent les unes aux autres dans mon shell.</li>
<li><strong>Utilisation de <a href="http://hackmysql.com/mysqlsniffer" target="_blank">mysqlsniffer<br />
</a></strong>Cette méthode est plus commode pour le néophyte, et elle permet de dumper efficacement la requête, mais également la réponse de MySQL. Pour l&#8217;utiliser, voici la marche à suivre:</p>
<pre name="code" class="py">apt-get install libpcap-dev
mkdir &amp;&amp; cd mysqlsniffer
wget http://hackmysql.com/code/mysqlsniffer.tgz
tar zxvf mysqlsniffer.tgz
gcc -O2 -lpcap -o mysqlsniffer mysqlsniffer.c packet_handlers.c misc.c
</pre>
<p>Après il n&#8217;y a plus qu&#8217;à:</p>
<pre name="code" class="py">john@laptop:~$ ./mysqlsniffer
mysqlsniffer v1.2 - Watch MySQL traffic on a TCP/IP network
Usage: mysqlsniffer [OPTIONS] INTERFACE
OPTIONS:
--port N Listen for MySQL on port number N (default 3306)
--verbose Show extra packet information
--tcp-ctrl Show TCP control packets (SYN, FIN, RST, ACK)
--net-hdrs Show major IP and TCP header values
--no-mysql-hdrs Do not show MySQL header (packet ID and length)
--state Show state
--v40 MySQL server is version 4.0
--dump Dump all packets in hex
--help Print this
Original source code and more information at:

http://hackmysql.com/mysqlsniffer
</pre>
</li>
</ol>
<p>Allez, pour le plaisir des yeux, une requête parmi tant d&#8217;autres que j&#8217;ai pu trouver lors du dump. Elle est exécutée à chaque inscription, ou à chaque modification dans le profil de l&#8217;utilisateur, la grande classe. Bah quoi, elle est sujette à changer souvent cette liste. Ce que vous êtes médisants.</p>
<pre name="code" class="sql">­127.0.0.1.59387 &gt; server: ID 0 len 46 COM_QUERY: SELECT * FROM `countries` ORDER BY `name` ASC
server &gt; 127.0.0.1.59387: ID 1 len 1 4 Fields
ID 2 len 47 Field: john.countries.id &lt;type tiny int (8961) size 3&gt;
ID 3 len 51 Field: john.countries.name &lt;type var string (253) size 135&gt;
ID 4 len 59 Field: john.countries.latitude &lt;type float (4) size 12&gt;
ID 5 len 61 Field: john.countries.longitude &lt;type float (4) size 12&gt;
ID 6 len 5 End &lt;warnings 0&gt;
ID 7 len 20 || 3 | Afghanistan | 33 | 65 ||
ID 8 len 26 || 233 | Afrique du Sud | -29 | 24 ||
ID 9 len 16 || 6 | Albanie | 41 | 20 ||
ID 10 len 17 || 59 | Algérie | 28 | 3 ||
ID 11 len 18 || 54 | Allemagne | 51 | 9 ||
ID 12 len 19 || 1 | Andorre | 42.5 | 1.5 ||
ID 13 len 20 || 9 | Angola | -12.5 | 18.5 ||
ID 14 len 26 || 5 | Anguilla | 18.25 | -63.1667 ||
ID 15 len 21 || 10 | Antarctique | -90 | 0 ||
ID 16 len 33 || 4 | Antigua-et-Barbuda | 17.05 | -61.8 ||
ID 17 len 39 || 8 | Antilles néerlandaises | 12.25 | -68.75 ||
ID 18 len 26 || 182 | Arabie saoudite | 25 | 45 ||
ID 19 len 21 || 11 | Argentine | -34 | -64 ||
ID 20 len 17 || 7 | Arménie | 40 | 45 ||
ID 21 len 23 || 15 | Aruba | 12.5 | -69.9667 ||
ID 22 len 21 || 14 | Australie | -27 | 133 ||
ID 23 len 28 || 13 | Autriche | 47.3333 | 13.3333 ||
ID 24 len 26 || 16 | Azerbaïdjan | 40.5 | 47.5 ||
ID 25 len 21 || 30 | Bahamas | 24.25 | -76 ||
ID 26 len 21 || 23 | Bahren | 26 | 50.55 ||
ID 27 len 20 || 19 | Bangladesh | 24 | 90 ||
ID 28 len 28 || 18 | Barbade | 13.1667 | -59.5333 ||
ID 29 len 20 || 175 | Belau | 7.5 | 134.5 ||
ID 30 len 22 || 20 | Belgique | 50.8333 | 4 ||
ID 31 len 23 || 35 | Belize | 17.25 | -88.75 ||
ID 32 len 19 || 25 | Bénin | 9.5 | 2.25 ||
ID 33 len 27 || 26 | Bermudes | 32.3333 | -64.75 ||
ID 34 len 21 || 31 | Bhoutan | 27.5 | 90.5 ||
ID 35 len 22 || 34 | Biélorussie | 53 | 28 ||
ID 36 len 19 || 138 | Birmanie | 22 | 98 ||
ID 37 len 19 || 28 | Bolivie | -17 | -65 ||
ID 38 len 29 || 17 | Bosnie-HerzÃ©govine | 44 | 18 ||
ID 39 len 19 || 33 | Botswana | -22 | 24 ||
ID 40 len 19 || 29 | Brésil | -10 | -55 ||
ID 41 len 22 || 27 | Brunei | 4.5 | 114.667 ||
ID 42 len 18 || 22 | Bulgarie | 43 | 25 ||
ID 43 len ­22 || 21 | Burkina Faso | 13 | -2 ||
ID 44 len 19 || 24 | Burundi | -3.5 | 30 ||
ID 45 len 20 || 111 | Cambodge | 13 | 105 ||
ID 46 len 17 || 45 | Cameroun | 6 | 12 ||
ID 47 len 17 || 36 | Canada | 60 | -95 ||
ID 48 len 19 || 50 | Cap-Vert | 16 | -24 ||
ID 49 len 17 || 44 | Chili | -30 | -71 ||
ID 50 len 16 || 46 | Chine | 35 | 105 ||
ID 51 len 16 || 52 | Chypre | 35 | 33 ||
ID 52 len 18 || 47 | Colombie | 4 | -72 ||
ID 53 len 27 || 113 | Comores | -12.1667 | 44.25 ||
ID 54 len 15 || 40 | Congo | -1 | 15 ||
ID 55 len 26 || 115 | Corée du Nord | 40 | 127 ||
ID 56 len 27 || 116 | Corée du Sud | 37 | 127.5 ||
ID 57 len 21 || 48 | Costa Rica | 10 | -84 ||
ID 58 len 23 || 42 | Côte d'Ivoire | 8 | -5 ||
ID 59 len 24 || 94 | Croatie | 45.1667 | 15.5 ||
ID 60 len 17 || 49 | Cuba | 21.5 | -80 ||
ID 61 len 18 || 56 | Danemark | 56 | 10 ||
ID 62 len 20 || 55 | Djibouti | 11.5 | 43 ||
ID 63 len 30 || 57 | Dominique | 15.4167 | -61.3333 ||
ID 64 len 16 || 62 | Egypte | 27 | 30 ||
ID 65 len 28 || 2 | Emirats arabes unis | 24 | 54 ||
ID 66 len 21 || 60 | Equateur | -2 | 77.5 ||
ID 67 len 19 || 64 | Erythrée | 15 | 39 ||
ID 68 len 17 || 65 | Espagne | 40 | -4 ||
ID 69 len 17 || 61 | Estonie | 59 | 26 ||
ID 70 len 22 || 219 | Etats-Unis | 38 | -97 ||
ID 71 len 17 || 66 | Ethiopie | 8 | 38 ||
ID 72 len 55 || 136 | ex-République yougoslave de Macédoine | 41.8333 | 22 ||
ID 73 len 18 || 67 | Finlande | 64 | 26 ||
ID 74 len 15 || 72 | France | 46 | 2 ||
ID 75 len 18 || 73 | Gabon | -1 | 11.75 ||
ID 76 len 27 || 81 | Gambie | 13.4667 | -16.5667 ||
ID 77 len 20 || 76 | Géorgie | 42 | 43.5 ||
ID 78 len 14 || 78 | Ghana | 8 | -2 ||
ID 79 len 29 || 79 | Gibraltar | 36.1833 | -5.3667 ||
ID 80 len 16 || 85 | Grèce | 39 | 22 ||
ID 81 len 28 || 75 | Grenade | 12.1167 | -61.6667 ||
ID 82 len 20 || 80 | Groenland | 72 | -40 ||
ID 83 len 24 || 88 | Guam | 13.4667 | 144.783 ||
ID 84 len 25 || 87 | Guatemala | 15.5 | -90.25 ||
ID 85 len 18 || 82 | Guinée | 11 | -10 ||
ID 86 len 29 || 84 | Guinée équatoriale | 2 | 10 ||
ID 87 len 25 || 89 | Guinée-Bissao | 12 | -15 ||
ID 88 len 16 || 90 | Guyana | 5 | -59 ||
ID 89 len 22 || 95 | Haïti| 19 | -72.4167 ||
ID 90 len 21 || 93 | Honduras | 15 | -86.5 ||
ID 91 len 27 || 91 | Hong Kong | 22.25 | 114.167 ||
ID 92 len 17 || 96 | Hongrie | 47 | 20 ||
ID 93 len 27 || 32 | Ile Bouvet | -54.4333 | 3.4 ||
ID 94 len 31 || 51 | Ile Christmas | -10.5 | 105.667 ||
ID 95 len 32 || 155 | Ile Norfolk | -29.0333 | 167.95 ||
ID 96 len 27 || 118 | Iles Cayman | 19.5 | -80.5 ||
ID 97 len 31 || 43 | Iles Cook | -21.2333 | -159.767 ||
ID 98 len 42 || 37 | Iles des Cocos (Keeling) | -12.5 | 96.8333 ||
ID 99 len 28 || 69 | Iles Falkland | -51.75 | -59 ||
ID 100 len 22 || 71 | Iles Féroé | 62 | -7 ||
ID 101 len 22 || 68 | Iles Fidji | -18 | 175 ||
ID 102 len 53 || 86 | Iles Géorgie du Sud et Sandwich du Sud | -54.5 | -37 ||
ID 103 len 40 || 92 | Iles Heard et McDonald | -53.1 | 72.5167 ||
ID 104 len 24 || 135 | Iles Marshall | 9 | 168 ||
ID 105 len 59 || 218 | Iles mineures éloignées des Etats-Unis | 19.2833 | 166.6 ||
ID 106 len 22 || 236 | Iles Pitcairn | 0 | 0 ||
ID 107 len 24 || 183 | Iles Salomon | -8 | 159 ||
ID 108 len 37 || 190 | Iles Svalbard et Jan Mayen | 78
ID 109 len 40 || 201 | Iles Turks-et-Caicos | 21.75 | -71.5833 ||
ID 110 len 47 || 226 | Iles Vierges américaines | 18.3333 | -64.8333 ||
ID 111 len 41 || 225 | Iles Vierges britanniques | 18.5 | -64.5 ||
ID 112 len 15 || 100 | Inde | 20 | 77 ||
ID 113 len 21 || 97 | Indonésie | -5 | 120 ||
ID 114 len 15 || 103 | Iran | 32 | 53 ||
ID 115 len 15 || 102 | Iraq | 33 | 44 ||
ID 116 len 17 || 98 | Irlande | 53 | -8 ||
ID 117 len 19 || 104 | Islande | 65 | -18 ||
ID 118 len 22 || 99 | Israël | 31.5 | 34.75 ||
ID 119 len 27 || 105 | Italie | 42.8333 | 12.8333 ||
ID 120 len 26 || 106 | Jamaïque | 18.25 | -77.5 ||
ID 121 len 17 || 108 | Japon | 36 | 138 ||
ID 122 len 19 || 107 | Jordanie | 31 | 36 ||
ID 123 len 21 || 119 | Kazakhstan | 48 | 68 ||
ID 124 len 15 || 109 | Kenya | 1 | 38 ||
ID 125 len 23 || 110 | Kirghizistan | 41 | 75 ||
ID 126 len 24 || 112 | Kiribati | 1.4167 | 173 ||
ID 127 len 28 || 117 | Koweït | 29.3375 | 47.6581 ||
ID 128 len 16 || 120 | Laos | 18 | 105 ||
ID 129 len 23 || 126 | Lesotho | -29.5 | 28.5 ||
ID 130 len 19 || 129 | Lettonie| 57 | 25 ||
ID 131 len 26 || 121 | Liban | 33.8333 | 35.8333 ||
ID 132 len 21 || 125 | Liberia | 6.5 | -9.5 ||
ID 133 len 16 || 130 | Libye | 25 | 17 ||
ID 134 len 33 || 123 | Liechtenstein | 47.1667 | 9.5333 ||
ID 135 len 19 || 127 | Lituanie | 56 | 24 ||
ID 136 len 28 || 128 | Luxembourg | 49.75 | 6.1667 ||
ID 137 len 25 || 140 | Macao | 22.1667 | 113.55 ||
ID 138 len 22 || 134 | Madagascar | -20 | 47 ||
ID 139 len 23 || 150 | Malaisie | 2.5 | 112.5 ||
ID 140 len 20 || 148 | Malawi | -13.5 | 34 ||
ID 141 len 21 || 147 | Maldives | 3.25 | 73 ||
ID 142 len 15 || 137 | Mali | 17 | -4 ||
ID 143 len 26 || 145 | Malte | 35.8333 | 14.5833 ||
ID 144 len 34 || 141 | Mariannes du Nord | 15.2 | 145.75 ||
ID 145 len 16 || 131 | Maroc | 32 | -5 ||
ID 146 len 27 || 146 | Maurice | -20.2833 | 57.55 ||
ID 147 len 22 || 143 | Mauritanie | 20 | -12 ||
ID 148 len 20 || 149 | Mexique | 23 | -102 ||
ID 149 len 29 || 70 | Micronésie | 6.9167 | 158.25 ||
ID 150 len 19 || 133 | Moldavie | 47 | 29 ||
ID 151 len 23 || 132 | Monaco | 43.7333 | 7.4 ||
ID 152 len 20 || 139 | Mongolie |
ID 153 len 27 || 144 | Montserrat | 16.75 | -62.2 ||
ID 154 len 25 || 151 | Mozambique | -18.25 | 35 ||
ID 155 len 19 || 152 | Namibie | -22 | 17 ||
ID 156 len 26 || 161 | Nauru | -0.5333 | 166.917 ||
ID 157 len 17 || 160 | Népal | 28 | 84 ||
ID 158 len 21 || 157 | Nicaragua | 13 | -85 ||
ID 159 len 15 || 154 | Niger | 16 | 8 ||
ID 160 len 17 || 156 | Nigeria | 10 | 8 ||
ID 161 len 29 || 162 | Nioué | -19.0333 | -169.867 ||
ID 162 len 19 || 159 | Norvège | 62 | 10 ||
ID 163 len 36 || 153 | Nouvelle-Calédonie | -21.5 | 165.5 ||
ID 164 len 30 || 163 | Nouvelle-Zélande | -41 | 174 ||
ID 165 len 15 || 164 | Oman | 21 | 57 ||
ID 166 len 17 || 217 | Ouganda | 1 | 32 ||
ID 167 len 23 || 221 | Ouzbékistan | 41 | 64 ||
ID 168 len 19 || 170 | Pakistan | 30 | 70 ||
ID 169 len 17 || 165 | Panama | 9 | -80 ||
ID 170 len 38 || 168 | Papouasie-Nouvelle-Guinée | -6 | 147 ||
ID 171 len 21 || 176 | Paraguay | -23 | -58 ||
ID 172 len 23 || 158 | Pays-Bas | 52.5 | 5.75 ||
ID 173 len 19 || 166 | Pérou | -10 | -76 ||
ID 174 len 23 || 169 | Philippines | 13 | 122
ID 175 len 18 || 171 | Pologne | 52 | 20 ||
ID 176 len 35 || 167 | Polynésie française | -15 | -140 ||
ID 177 len 27 || 173 | Porto Rico | 18.25 | -66.5 ||
ID 178 len 21 || 174 | Portugal | 39.5 | -8 ||
ID 179 len 21 || 177 | Qatar | 25.5 | 51.25 ||
ID 180 len 35 || 39 | République centrafricaine | 7 | 21 ||
ID 181 len 43 || 38 | République démocratique du Congo | 0 | 25 ||
ID 182 len 39 || 58 | République dominicaine | 19 | -70.6667 ||
ID 183 len 35 || 53 | République tchèque | 49.75 | 15.5 ||
ID 184 len 19 || 179 | Roumanie | 46 | 25 ||
ID 185 len 21 || 74 | Royaume-Uni | 54 | -2 ||
ID 186 len 18 || 180 | Russie | 60 | 100 ||
ID 187 len 17 || 181 | Rwanda | -2 | 30 ||
ID 188 len 30 || 63 | Sahara occidental | 24.5 | -13 ||
ID 189 len 48 || 114 | Saint-Christophe-et- | 17.3333 | -62.75 ||
ID 190 len 32 || 193 | Saint-Marin | 43.7667 | 12.4167 ||
ID 191 len 48 || 223 | Saint-Vincent-et-les-Grenadines | 13.25 | -61.2 ||
ID 192 len 34 || 188 | Sainte-Hélène | -15.9333 | -5.7 ||
ID 193 len 34 || 122 | Sainte-Lucie | 13.8833 | -61.1333 ||
ID 194 30 || 198 | Salvador | 13.8333 | -88.9167 ||
ID 195 len 28 || 230 | Samoa | -13.5833 | -172.333 ||
ID 196 len 36 || 12 | Samoa américaines | -14.3333 | -170 ||
ID 197 len 30 || 197 | Sao Tomé-et-Principe | 1 | 7 ||
ID 198 len 21 || 194 | Sénégal | 14 | -14 ||
ID 199 len 30 || 237 | Serbie et Monténegro | 0 | 0 ||
ID 200 len 31 || 184 | Seychelles | -4.5833 | 55.6667 ||
ID 201 len 27 || 192 | Sierra Leone | 8.5 | -11.5 ||
ID 202 len 27 || 187 | Singapour | 1.3667 | 103.8 ||
ID 203 len 27 || 191 | Slovaquie | 48.6667 | 19.5 ||
ID 204 len 20 || 189 | Slovénie | 46 | 15 ||
ID 205 len 18 || 195 | Somalie | 10 | 49 ||
ID 206 len 17 || 185 | Soudan | 15 | 30 ||
ID 207 len 19 || 124 | Sri Lanka | 7 | 81 ||
ID 208 len 17 || 186 | Suède | 62 | 15 ||
ID 209 len 15 || 41 | Suisse | 47 | 8 ||
ID 210 len 19 || 196 | Suriname | 4 | -56 ||
ID 211 len 25 || 200 | Swaziland | -26.5 | 31.5 ||
ID 212 len 16 || 199 | Syrie | 35 | 38 ||
ID 213 len 22 || 206 | Tadjikistan | 39 | 71 ||
ID 214 len 21 || 214 | Taïwan | 23.5 | 121 ||
ID 215 len 19 || 215 | Tanzanie | -6 | 35
ID 216 len 16 || 202 | Tchad | 15 | 19 ||
ID 217 len 40 || 203 | Terres australes françaises | -43 | 67 ||
ID 218 len 54 || 101 | Territoire britannique de l'Océan Indien | -6 | 71.5 ||
ID 219 len 22 || 205 | Thaïlande | 15 | 100 ||
ID 220 len 18 || 204 | Togo | 8 | 1.1667 ||
ID 221 len 22 || 207 | Tokélaou | -9 | -172 ||
ID 222 len 19 || 210 | Tonga | -20 | -175 ||
ID 223 len 30 || 212 | Trinité-et-Tobago | 11 | -61 ||
ID 224 len 17 || 209 | Tunisie | 34 | 9 ||
ID 225 len 24 || 208 | Turkménistan | 40 | 60 ||
ID 226 len 18 || 211 | Turquie | 39 | 35 ||
ID 227 len 18 || 213 | Tuvalu | -8 | 178 ||
ID 228 len 18 || 216 | Ukraine | 49 | 32 ||
ID 229 len 20 || 220 | Uruguay | -33 | -56 ||
ID 230 len 20 || 228 | Vanuatu | -16 | 167 ||
ID 231 len 23 || 222 | Vatican | 41.9 | 12.45 ||
ID 232 len 20 || 224 | Venezuela | 8 | -66 ||
ID 233 len 21 || 227 | Viét Nam | 16 | 106 ||
ID 234 len 34 || 229 | Wallis-et-Futuna | -13.3 | -176.2 ||
ID 235 len 17 || 231 | Yémen | 15 | 48 ||
ID 236 len 18 || 234 | Zambie | -15 | 30 ||
ID 237 len 20 || 235 | Zimbabwe | -20 |
</pre>
<p>Au fait, pour <a title="Le blog de Cédric Blancher" href="http://sid.rstack.org/blog/index.php/394-bobine-de-fils" target="_blank">ceux</a> qui croient que le blog est en friche, j&#8217;ai sorti la tondeuse.</p>
<p>[1]Il faut quand même de sacrés machines pour faire tenir 500 pelos sur un serveur.<br />
<a href="http://www.adobe.com/devnet/flashmediaserver/articles/performance_tuning_webcasts.html">http://www.adobe.com/devnet/flashmediaserver/articles/performance_tuning_webcasts.html</a></p>
<p>[2]Merci à Brian Racer.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.john-jean.com/blog/sysadmin/tracer-les-requetes-mysql-en-cours-dexecution-330/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Un koala à la rescousse de mes secteurs défectueux&#8230;</title>
		<link>http://www.john-jean.com/blog/informatique/un-koala-a-la-rescousse-de-mes-secteurs-defectueux-289</link>
		<comments>http://www.john-jean.com/blog/informatique/un-koala-a-la-rescousse-de-mes-secteurs-defectueux-289#comments</comments>
		<pubDate>Tue, 03 Nov 2009 23:29:39 +0000</pubDate>
		<dc:creator>John JEAN</dc:creator>
				<category><![CDATA[Informatique]]></category>
		<category><![CDATA[Sysadmin]]></category>
		<category><![CDATA[ddrescue]]></category>
		<category><![CDATA[disque dur]]></category>
		<category><![CDATA[erreur réallocation]]></category>
		<category><![CDATA[karmic]]></category>
		<category><![CDATA[koala]]></category>
		<category><![CDATA[Palimpsest]]></category>
		<category><![CDATA[sauvegarde]]></category>
		<category><![CDATA[sauvegarder]]></category>
		<category><![CDATA[secteurs défectueux]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.john-jean.com/blog/informatique/un-koala-a-la-rescousse-de-mes-secteurs-289</guid>
		<description><![CDATA[C&#8217;était une petite nuit d&#8217;hiver, glacée, les frimas envahissaient les rues et il faisait bon être à l&#8217;intérieur pour regarder à travers la fênetre cette belle nuit étoilée. Tout se prêtait à une nuit tranquille et apaisante. Contemplatif de ma configuration travaillée au jour le jour depuis une bonne année, j&#8217;étais satisfait d&#8217;avoir pu, enfin, [...]]]></description>
			<content:encoded><![CDATA[<p><img alt="4big 3Qtr-Left NEW" align="left" src="http://www.john-jean.com/blog/wp-content/uploads/2009/11/4big_3qtr-left_new-1.jpg" width="160" height="172" />C&#8217;était une petite nuit d&#8217;hiver, glacée, les frimas envahissaient les rues et il faisait bon être à l&#8217;intérieur pour regarder à travers la fênetre cette belle nuit étoilée. Tout se prêtait à une nuit tranquille et apaisante. Contemplatif de ma configuration travaillée au jour le jour depuis une bonne année, j&#8217;étais satisfait d&#8217;avoir pu, enfin, retrancher mon OS dans ses moindres recoins. Je m&#8217;apprétais donc à sombrer avec délectation dans la monotonie d&#8217;un environnement bien trop stable.</p>
<p><span id="more-289"></span>
<p>Je commencais à songer à aller me coucher quand je me pris à vouloir tenter le diable. Et pourquoi ne pas faire comme le teenager devant le Virgin Megastore à 3 heures du matin pour acheter le dernier album de son artiste préféré, pourquoi donc ne pas tenter de faire une upgrade en <a href="http://doc.ubuntu-fr.org/karmic" target="_blank">Karmic Koala</a> fraichement poussée dans les repos par les joyeux lurons de <a href="http://www.canonical.com/" target="_blank">Canonical</a> quelques heures plus tôt ?</p>
<p>Aussitôt dit, presque aussitôt fait (il faut s&#8217;armer de patience lors d&#8217;un landrush), je me retrouvais trois heures plus tard avec la dernière mouture en date. Après le reboot réglementaire, je m&#8217;appretais à utiliser fièrement mon Gnome 2.28 fraichement déployé lorsqu&#8217;une icone vint troubler mon attention: elle m&#8217;invitait à prendre connaissance de l&#8217;état de mon disque dur. Je cliquais donc.</p>
<p><img alt="secteurs" align="left" src="http://www.john-jean.com/blog/wp-content/uploads/2009/11/secteurs.png" width="450" height="402" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Cela m&#8217;a surpris au début. J&#8217;ai cru à un faux positif, comme en réservent souvent les packets nouvellement poussés en production (sur ubuntu en tout cas, il est chez Red Hat depuis un moment). Pour vérifier ses dires, j&#8217;ai redémarré et accédé à la partition de diagnostic Dell. Vérification RAM, CPU, et ainsi de suite: PASS, et sur le disque: FAILED. Vraisemblablement le test de surface génère beaucoup d&#8217;erreurs.</p>
<p>Comme j&#8217;avais bidouillé les drivers SATA/AHCI je me suis dit que cela pouvait venir de cela. Après avoir testé par l&#8217;OS (donc par la S.M.A.R.T puis par le diagnostic-tool de Dell), je décidais de descendre d&#8217;un niveau en utilisant l&#8217;utilitaire du <a href="http://www.samsung.com" target="_blank">constructeur</a> appelé <a href="http://www.samsung.com/global/business/hdd/support/utilities/ES_Tool.html" target="_blank">ES Tool</a>. Après l&#8217;avoir gravé, je lançais l&#8217;utilitaire (CD amorcable, aucun système ne doit évidemment être loadé pour le diagnostic): même résultat. J&#8217;avais bien bons nombres de secteurs défectueux, ou en tout cas en attente de réallocation.</p>
<p>On était donc jeudi soir, j&#8217;avais évidement beaucoup de choses à faire pour le boulot le vendredi, mais en même temps on ne plaisante pas avec un disque dur qui commence à claquer, d&#8217;autant plus lorsqu&#8217;il contient tous les documents importants du boulot et avec une criticité parfois élevée. Alors oui j&#8217;avais bien fait des sauvegardes, mais comme la plupart du temps, elles n&#8217;étaient pas fondamentalement tenues à jour (cela ne se comptait pas en trimestre non plus, n&#8217;exagérons rien).</p>
<p>J&#8217;ai donc utilisé ma journée du vendredi à recenser tout ce que j&#8217;avais à sauvegarder après avoir monté mes partitions au travers d&#8217;un livecd. J&#8217;ai tenté au mieux de minimiser les accès disque même si consulter les dossiers génère son petit lot d&#8217;accès. Je suis parvenu au constat que j&#8217;avais dans les 200 go de documents à migrer pour être certain de ne rien oublier. Cependant je perdais toute ma configuration, mais aussi ma vieille partition Windows en dual-bot que je gardais par acquis de conscience. Afin de sauvegarder tout ce petit monde je ne comptais pas réaliser une copie de dossier un à un, c&#8217;était un travail gigantesque mais également la meilleure solution pour oublier quelque chose. J&#8217;ai donc songé à un utilitaire présent dans toutes les distribs linux: dd. En gros celui-ci me permettait de copier l&#8217;intégralité de mon disque dur sur un autre support et cela sans me soucier des fichiers, des partitions, ni même de la MBR. Cela tombait bien: j&#8217;avais reçu quelques jours auparavant mon nouveau système de sauvegarde perso, un <a href="http://www.lacie.com/fr/products/product.htm?pid=11268" target="_blank">Lacie Quadra</a> me permettant de faire des sauvegarde de 2 To en mirroring (RAID 1/0), ou de 4 To en mode fast. Paranoïaque avéré je l&#8217;ai bien entendu configuré en 1/0. Donc une fois le Lacie connecté en USB, je vérifiais ma table de montage (à peu près 200 fois, de peur de me retrouver une dizaine d&#8217;heure plus tard à rechercher des données après un mauvais format):<br />
<code><br />
john@john-laptop:~$ mount | grep sda<br />
john@john-laptop:~$ mount | grep sdb<br /></code></p>
<p>Mon hd endommagé était bien sur /dev/sda et l&#8217;externe sur /dev/sdb. Même si cela peut paraitre stupide: quand on risque de perdre 200 go de données, on fait attention. J&#8217;ai donc ensuite bêtement executée:<br />
<code><br />
dd if=/dev/sda of=/dev/sdb<br /></code></p>
<p>Et j&#8217;ai laissé tourner pendant quelques heures. Et là j&#8217;ai noté quelques défauts dans ce cher et vieux dd. Tout d&#8217;abord <em>par défaut</em> la verbosité n&#8217;est pas exceptionnelle. On est dans le flou complet. Un mode interractif sans annonce de progression. Mais au bout d&#8217;une heure, j&#8217;ai pu avoir un peu de verbose; les choses ont commencé à mal tourner: il n&#8217;avait copié que 6,5 GO. Il bouclait sur une I/O error que générait sans doute l&#8217;un de mes premiers secteurs défectueux. Après un second essai du même acabit, j&#8217;ai RTFM pour de bon<em>.</em> Après un man dd, j&#8217;ai été réellement étonné de ne trouver aucun argument de type &laquo;&nbsp;onerrorskip&nbsp;&raquo; ou &laquo;&nbsp;noretry&nbsp;&raquo;. J&#8217;ai par dépit tenté un:<br />
<code><br />
dd if=/dev/sda of=/dev/sdb conv=noerror,direct<br /></code></p>
<p>Mais même en passant ces options il bouclait sur mes I/O error. J&#8217;ai laissé tourner pendant quelques heures supplémentaires pour ne copier au grand maximum que quelques dizaines de Mo de plus. Avant de me résoudre à entreprendre ce que j&#8217;avais réfuté du début (la copie de dossier un à un), je me suis penché du côté des livecds pour copier les données à partir de disques endommagés mais je n&#8217;ai pas vraiment trouvé de chaussure à mon pied. En revanche j&#8217;ai trouvé un fork de dd nommé <a href="http://www.gnu.org/software/ddrescue/ddrescue.html" target="_blank">ddrescue</a>. Celui-ci ressemble à son grand frère à cette différence près: il ne boucle pas sur les erreurs, il les loggue et tente ensuite plusieurs passes pour récupérer les données potentiellement &laquo;&nbsp;perdues&nbsp;&raquo;. J&#8217;ai donc téléchargé le <a href="http://ftp.gnu.org/gnu/ddrescue/ddrescue-1.11.tar.lz" target="_blank">dernier en date</a>, un configure,un make, et une doc plus tard, je lancais ca:<br />
<code><br />
ddrescue -n /dev/sda /dev/sdb debug.log<br /></code></p>
<p>Pour la petite histoire le -n évite de faire plusieurs passes sur la logfile afin de récupérer le maximum de données. Il s&#8217;oppose à -r qui est le max retries passes. Chaque secteur déféctueux est analysé une fois par passe. Comme j&#8217;étais pressé et que je voulais surtout tester si cela allait me sauver, je donc lancé avec -n. 30 heures plus tard ma copie était faite et surtout j&#8217;avais pu suivre le bon déroulement des opérations car ddrescue est très interractif:</p>
<p><img alt="capture2xl1" align="left" src="http://www.john-jean.com/blog/wp-content/uploads/2009/11/capture2xl1.png" width="450" height="219" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Ce screen n&#8217;est pas celui de ma machine, il vous permet simplement de voir l&#8217;interactivité du soft. Au bout de 30 heures, il avait détecté 692 erreurs, estimé 67Mo d&#8217;errorsize, qu&#8217;il a su (en une seule et unique passe !) ramener à 6 mo. Je pense qu&#8217;en cinq passes je récupérais l&#8217;intégralité de mes données (je n&#8217;ai toujours pas trouvé ce que j&#8217;ai perdu, probablement de l&#8217;espace libre).</p>
<p>Après avoir vérifié en profondeur ma sauvegarde sur mon HD externe j&#8217;ai contacté Dell pour procéder au remplacement de mon disque dur. Comme d&#8217;habitude, SAV irréprochable, j&#8217;ai appelé vendredi soir, lundi matin <del>l&#8217;un de leur techos</del> l&#8217;un des techos de l&#8217;un des leurs sous-traitants pour le SAV était au bureau. Avant de rendre mon ancien disque dur j&#8217;ai bien pris soin d&#8217;effectuer deux opérations, un format bas niveau depuis l&#8217;utilitaire Samsung prévu à cet effet, ce qui a au passage résolu le soucis de secteurs déféctueux (temporairement, va sans dire), et suite à la résolution de ce problème de secteurs j&#8217;ai sorti mon plus joli:<br />
<code><br />
dd if=/dev/zero of=/dev/sda<br /></code></p>
<p>&nbsp;</p>
<p>Idéalement j&#8217;aurai bien fait un<br />
<code><br />
dd if=/dev/random of=/dev/sda<br /></code></p>
<p>mais je n&#8217;avais pas la semaine devant moi. D&#8217;ailleurs chez Dell ils doivent avoir l&#8217;habitude des raleurs surtout lors de soucis de disque, ils m&#8217;ont échangé mon Samsung contre un Western Digital 500GO. Youhou 100 GO de gagné.</p>
<p>Pour conclure, je ne sais pas si cet article interessera beaucoup d&#8217;entre vous, il ne poursuit que quelques buts:</p>
<ul>
<li style="LIST-STYLE-TYPE: none"></li>
<li>Vous donner une méthode efficace de sauvegarde lorsque vous avez des secteurs défectueux. dd ne faisant pas son travail, ddrescue est votre ami. En effet vous avez bien mieux à faire lors d&#8217;un soucis hardware, surtout avec votre hd, que de penser à quels sont les fichiers à ne pas oublier. Autant prendre l&#8217;intégralité avec l&#8217;effort minimimum, cela tient en une commande.</li>
</ul>
<p>&nbsp;</p>
<ul>
<li>Vous donner une méthode vous permettant de récupérer vos données avec des secteurs déféctueux. Comme je l&#8217;ai dit, avec cinq passes je suppose que je retrouvais l&#8217;intégralité des mes données.</li>
</ul>
<p>&nbsp;</p>
<ul>
<li>Vous avertir sur le fait qu&#8217;au final <a href="http://doc.ubuntu-fr.org/karmic" target="_blank">Karmic Koala</a> m&#8217;a sauvé, parce que ni mes outils de monitoring S.M.A.R.T sous windows (que je boot très rarement il est vrai), ni <a href="http://doc.ubuntu-fr.org/jaunty" target="_blank">Jaunty</a> ne m&#8217;avaient alerté. Il a fallu l&#8217;apparition de Palimpsest dans Karmic pour que je prenne conscience que mon disque dur était en train de mourrir en tentant désespérement de m&#8217;alerter.</li>
</ul>
<p>&nbsp;</p>
<ul>
<li>Que ce n&#8217;est au final pas si mal d&#8217;upgrader son système les jours de landrush: deux jours plus tard 300 secteurs disparaissaient à nouveau (juste à la fin de ma maltraitance sur /dev/sda avec ddrescue)</li>
</ul>
<p>&nbsp;</p>
<ul>
<li>Qu&#8217;il est préférable de rendre à son constructeur un disque dur où l&#8217;on a un peu compliqué la tâche des recovery tools: format bas niveau + /dev/zero ou /dev/random, même si ce n&#8217;est pas &laquo;&nbsp;parfait&nbsp;&raquo;, je pense que c&#8217;est suffisant dans mon cas de figure.</li>
</ul>
<p>&nbsp;</p>
<ul>
<li>Qu&#8217;au final je n&#8217;ai pas fait le processus inverse:<br />
dd if=/dev/sdb of=/dev/sda pour restaurer mon système. J&#8217;ai réinstallé la dernière version d&#8217;ubuntu pour &laquo;&nbsp;profiter&nbsp;&raquo; de l&#8217;ext4 et avoir une réelle base de comparaison, et voir si ce FS est mal réputé à tort ou à raison pour son instabilité. Cela m&#8217;a permis de repenser ma gestion des <a href="http://doc.ubuntu-fr.org/lvm" target="_blank">lvms cryptés</a> sur ma machine pour m&#8217;orienter vers une solution basée sur <a href="http://www.truecrypt.org/" target="_blank">truecrypt</a>, même si elle semble <a href="http://www.securityvibes.com/evil-maid-rutkowska-fde-jsaiz-news-3003411.html" target="_blank">parfois</a> <a href="http://www.h-online.com/security/news/item/Tool-to-fool-TrueCrypt-published-832301.html" target="_blank">mise à mal</a>. Bon j&#8217;avoue, j&#8217;ai quand même copié mes /home/john/.* :)</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.john-jean.com/blog/informatique/un-koala-a-la-rescousse-de-mes-secteurs-defectueux-289/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Linux NULL pointer dereference due to incorrect proto_ops initializations, Cocorico !</title>
		<link>http://www.john-jean.com/blog/securite-informatique/linux-null-pointer-dereference-due-to-incorrect-proto_ops-initializations-cocorico-216</link>
		<comments>http://www.john-jean.com/blog/securite-informatique/linux-null-pointer-dereference-due-to-incorrect-proto_ops-initializations-cocorico-216#comments</comments>
		<pubDate>Sun, 16 Aug 2009 02:21:04 +0000</pubDate>
		<dc:creator>John JEAN</dc:creator>
				<category><![CDATA[Sysadmin]]></category>
		<category><![CDATA[Sécurité informatique]]></category>
		<category><![CDATA[deference]]></category>
		<category><![CDATA[faille]]></category>
		<category><![CDATA[grsecurity]]></category>
		<category><![CDATA[hole]]></category>
		<category><![CDATA[IPv6]]></category>
		<category><![CDATA[julien tinnes]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[linus torvalds]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[null]]></category>

		<guid isPermaLink="false">http://www.john-jean.com/blog/divers/linux-null-pointer-dereference-due-to-incorrect-proto_ops-initializations-cocorico-216</guid>
		<description><![CDATA[Voici une faille sortie il y a maintenant trois jours (pas eu le temps de blogger le jour même) qui va assez facilement alimenter les propos de news0ft. Il expliquait avec intellect la fuite des cerveaux Français en matière de sécurité informatique pour des causes diverses et variées que je vous laisse découvrir dans l&#8217;article. [...]]]></description>
			<content:encoded><![CDATA[<p><img alt="coq2" align="left" src="http://www.john-jean.com/blog/wp-content/uploads/2009/08/coq2.gif" width="160" height="155" />Voici une faille sortie il y a maintenant trois jours (pas eu le temps de blogger le jour même) qui va assez facilement alimenter les <a title="Echec de la sécurité francaise" href="http://news0ft.blogspot.com/2009/07/lechec-de-la-securite-francaise.html">propos</a> de <a href="http://news0ft.blogspot.com">news0ft</a>. Il expliquait avec intellect la fuite des cerveaux Français en matière de sécurité informatique pour des causes diverses et variées que je vous laisse découvrir dans <a title="Echec de sécurité Francaise" href="http://news0ft.blogspot.com/2009/07/lechec-de-la-securite-francaise.html">l&#8217;article</a>. Il cite en dehors de Kostya Kortchinsky, Nicolas Pouvesle, <a href="http://www.msuiche.net">Matthieu Suiche</a> , Nicolas Brulez, un certain Julien Tinnès :-) Et il s&#8217;avère que ce Julien Tinnès est l&#8217;un des co-découvreur de cette faille qui risque de bien dépanner quelques l33t hax0r, et de ravir tous les pen-testeurs de la planète au grand désespoir de leurs clients.</p>
<p><span id="more-216"></span>
<p>Cette faille permet depuis un simple compte utilisateur de passer root. Et la mauvaise nouvelle c&#8217;est que cela affecte la plupart des kernels supportant IPv6 (bon ca c&#8217;est la version édulcorée, en vrai c&#8217;est le protocole qui gère Bluetooth, PPPoX, IRDA et autres joyeusetés); c&#8217;est à dire:</p>
<p>- Linux 2.4, de 2.4.4 jusqu&#8217;à 2.4.37.4 compris.<br />
- Linux 2.6, de 2.6.0 jusqu&#8217;à 2.6.30.4 compris.</p>
<p>C&#8217;est donc un monstre de dangerosité. Inutile de se lancer dans des élucubrations sur la faille en elle même, elle est bien évidemment largement documentée par ses auteurs: <a href="http://archives.neohapsis.com/archives/fulldisclosure/2009-08/0174.html">http://archives.neohapsis.com/archives/fulldisclosure/2009-08/0174.html</a> ou surtout <a href="http://blog.cr0.org/2009/08/linux-null-pointer-dereference-due-to.html">le blog de julien</a> (qui doit voir son PR exploser).</p>
<p>- return sock-&gt;ops-&gt;sendpage(sock, page, offset, size, flags);<br />
+ return kernel_sendpage(sock, page, offset, size, flags);</p>
<p>Cette ligne suffit à corriger la faille dans le kernel, patchée d&#8217;ailleurs par Sieur Torvalds himself. Le patch <a title="Patch Linus Torvalds" href="http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=e694958388c50148389b0e9b9e9e8945cf0f1b98">est ici</a>.</p>
<p><img alt="bleh" align="left" src="http://www.john-jean.com/blog/wp-content/uploads/2009/08/bleh-1.png" width="450" height="281" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Cette faille provoque bien évidemment une patch party chez les hébergeurs sérieux ayant avertis leurs clients. Par exemple OVH a avertis par mailing mais également sur le <a href="http://forum.ovh.com/showthread.php?t=50120">forum</a>. Ils mettent à disposition une version recompilée du noyau sur <a href="ftp://ftp.ovh.net/made-in-ovh/bzImage/">ftp://ftp.ovh.net/made-in-ovh/bzImage/</a>.</p>
<p>Je vous encourage vivement à mettre à jour vos systèmes. L&#8217;exploit est en effet disponible sur <a href="http://www.milw0rm.com/exploits/9435">milw0rm,</a> <a href="http://www.milw0rm.com/exploits/9436">[2]</a>. Enfin dernière chose amusante, l&#8217;auteur du premier exploit est <a href="http://fr.wikipedia.org/wiki/Brad_Spengler">Brad Spengler</a>, oui oui l&#8217;auteur de Grsecurity (Un patch qui permet d&#8217;ajouter des fonctions de sécurité au kernel). D&#8217;ailleurs les kernels tournant avec GRS ne sont pas faillibles :-) Pied de nez aux personnes n&#8217;étant pas disposées à réduire un peu les performances pour améliorer la sécurité de leurs serveurs.</p>
<p>Juste pour information sur mon introduction, <a href="http://blog.cr0.org/">Julien Tinnes</a> n&#8217;est pas à son premier <a href="http://blog.cr0.org/2009/07/old-school-local-root-vulnerability-in.html">coup d&#8217;essai</a>, <a href="http://blog.cr0.org/2009/06/bypassing-linux-null-pointer.html">[2]</a>, <a href="http://blog.cr0.org/2009/05/write-once-own-everyone.html">[3 !]</a>. Il travaille désormais chez Google comme Ingénieur Securité après avoir fait un passage chez Orange Labs. Décidément pas de chaussure au pieds des ingés sécurité en France ?</p>
<p>Sur ce, bonne lecture et bon tests.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.john-jean.com/blog/securite-informatique/linux-null-pointer-dereference-due-to-incorrect-proto_ops-initializations-cocorico-216/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Parametrer / configurer son firewall sur Gnu/Linux avec Iptables et Netfilter</title>
		<link>http://www.john-jean.com/blog/securite-informatique/parametrer-configurer-son-firewall-sur-gnulinux-avec-iptables-et-netfilter-175</link>
		<comments>http://www.john-jean.com/blog/securite-informatique/parametrer-configurer-son-firewall-sur-gnulinux-avec-iptables-et-netfilter-175#comments</comments>
		<pubDate>Tue, 21 Apr 2009 14:15:40 +0000</pubDate>
		<dc:creator>John JEAN</dc:creator>
				<category><![CDATA[Sysadmin]]></category>
		<category><![CDATA[Sécurité informatique]]></category>
		<category><![CDATA[configuration]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[firewall]]></category>
		<category><![CDATA[iptables]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[netfilter]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.john-jean.com/blog/securite-informatique/parametrer-configuration-son-firewall-sur-gnulinux-avec-iptablesnetfilter-175</guid>
		<description><![CDATA[La plupart des nouveaux utilisateurs de systèmes Gnu/Linux partent du postulat qu&#8217;utiliser un Linux est bien plus sûr qu&#8217;un Windows, et que de fait, il n&#8217;est pas forcément nécessaire d&#8217;avoir un firewall, ou encore de passer de temps à paramétrer son système. Ils ont évidement tort, considérer Linux comme plus secure que Windows est une [...]]]></description>
			<content:encoded><![CDATA[<p><img alt="hoho" align="left" src="http://www.john-jean.com/blog/wp-content/uploads/2009/07/hoho-1.jpg" width="165" height="158" /></p>
<p>La plupart des nouveaux utilisateurs de systèmes Gnu/Linux partent du postulat qu&#8217;utiliser un Linux est bien plus sûr qu&#8217;un Windows, et que de fait, il n&#8217;est pas forcément nécessaire d&#8217;avoir un firewall, ou encore de passer de temps à paramétrer son système. Ils ont évidement tort, considérer Linux comme plus secure que Windows est une erreur, et ne pas paramétrer son OS en est une autre. Lors des audits de sécurité, c&#8217;est souvent une machine end-user du parc qui fait défaut. Il existe pourtant un module qui fournit à Linux l&#8217;intégralité des fonctions de pare-feu: Netfilter. Il intercepte et manipule les paquets IP avant et après le routage. Pour configurer Netfilter en espace utilisateur, on utilise Iptables. Nous devons souvent proposer aux administrateurs et utilisateurs une configuration d&#8217;un firewall que nous estimons saine post-audit. Ce billet reprend la plupart des informations que nous mettons en avant dans le rapport.</p>
<p><span id="more-175"></span>
<p>Afin de faciliter la lecture de cette configuration, j&#8217;ai opté pour un export html, avec quelques textareas permettant à chacun de pouvoir copier coller les parties qui l&#8217;interesse. Une fonction amusante de port knocking est expliquée en fin de document.</p>
<p><a title="Configuration d'un firewall avec NetFilter/Iptables" href="http://www.john-jean.com/blog/parametrer-configuration-firewall-linux-en-utilisant-netfilter-iptable.html" target="_blank">Configuration d&#8217;un firewall avec Iptables/Netfilter</a></p>
<p>A noter que l&#8217;auteur de la configuration initiale est Raphael Prevost, consultant sécurité au sein de <a title="Audit de sécurité informatique" href="http://www.wargan.com" target="_blank">Wargan Solutions</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.john-jean.com/blog/securite-informatique/parametrer-configurer-son-firewall-sur-gnulinux-avec-iptables-et-netfilter-175/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Comment empêcher le hotlinking de vos images ?</title>
		<link>http://www.john-jean.com/blog/sysadmin/comment-empecher-hotling-images-127</link>
		<comments>http://www.john-jean.com/blog/sysadmin/comment-empecher-hotling-images-127#comments</comments>
		<pubDate>Sun, 08 Feb 2009 20:14:59 +0000</pubDate>
		<dc:creator>John JEAN</dc:creator>
				<category><![CDATA[Sysadmin]]></category>
		<category><![CDATA[anti-leech]]></category>
		<category><![CDATA[bandwidth]]></category>
		<category><![CDATA[hotlink]]></category>
		<category><![CDATA[hotlinking]]></category>
		<category><![CDATA[htaccess]]></category>
		<category><![CDATA[image]]></category>

		<guid isPermaLink="false">http://www.john-jean.com/blog/?p=127</guid>
		<description><![CDATA[Comment empêcher les internautes d'utiliser votre bande passante en volant les images contenues sur votre site.]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" title="Bandwidth Image Hotlink" src="http://www.john-jean.com/hotlink_logo.jpg" alt="Image Hotlinkg" width="165" height="147" /></p>
<p>Après un mois d&#8217;inactivité blogesque du à mon <a title="Chef de projet Internet" href="http://www.john-jean.com/blog/" target="_self">travail</a>, je fais un petit saut pour vous raconter comment  empêcher d&#8217;autres webmasters de vous piquer votre bande passante. Le hotlinking c&#8217;est quoi ? Simple: Vous avez un site Internet et hébergez des images que vous avez créés ou trouvées pour illustrer vos propos. Google image passe faire un tour par là, et hop, l&#8217;ensemble de vos images, créations, captures d&#8217;écran, logos se retrouvent sur le moteur. Jusqu&#8217;ici tout va bien, sauf que si vous êtes convenablement positionné sur un mot clé, une ribambelle de bloggers fainéants vont utiliser votre image pour illustrer leur billet. Qu&#8217;ils utilisent votre image sans vous en avertir, c&#8217;est une chose, mais qu&#8217;en plus au lieu de l&#8217;héberger, ils la pompent directement depuis votre serveur, c&#8217;en est une autre. Le hotlinking c&#8217;est ca, le fait d&#8217;utiliser des images hébergées sur un autre site que celui où elles sont affichées (site internet, forum, etc).</p>
<p><span id="more-127"></span>Pour le coup, l&#8217;exemple de Google image n&#8217;est pas le plus probant, simplement parce qu&#8217;il suffit d&#8217;insérer le code suivant dans votre robots.txt afin de faire le ménage:</p>
<p><code>User-Agent: *<br />
Allow: /</code><br />
<code><br />
User-Agent: Googlebot-Image<br />
Disallow: /</code></p>
<p>Par contre si vous avez un site à forte audience comme <a title="vidéo humour" href="http://www.abrutis.com">abrutis.com</a>,  il suffit qu&#8217;1/10 des visiteurs hotlinkent* (* attention, néologisme douteux) les images &laquo;&nbsp;marrantes&nbsp;&raquo; sur leur blog pour mettre votre serveur sur les rotules, où pour faire quadrupler vos coûts en bande passante. Autre cas de figure, nous avons un site Internet <a title="Hébergement image gratuit" href="http://www.dump-it.fr" target="_blank">dump-it.fr</a>, qui permet à n&#8217;importe quel internaute d&#8217;héberger son image afin de la donner à ses proches par IM, Mail ou en mettant un lien sur un forum ou sur son site. Ceci dit, les liens que l&#8217;on fournit afin de donner l&#8217;image sont formatés de telle façon que l&#8217;image soit affichée à l&#8217;écran contenue dans une page HTML, permettant ainsi d&#8217;améliorer le référencement de dump-it.fr, mais également de le monétiser. Mettre de la pub dans des pages html, c&#8217;est possible, au sein d&#8217;une image c&#8217;est plus difficile :D. Toujours est-il que j&#8217;ai comparé les stats que nous resortait Analytics pour ce site et celles du serveur sur lequel il est hébergé. Analytics comptabilisait dans les 600 visiteurs unique par jour quand en me basant sur l&#8217;analyse des logs du serveur j&#8217;en resortait dans les 1100. Il y a donc un manque à gagner de 500 visiteurs qu&#8217;Analytics ne peut comptabiliser, car ces derniers sont ceux qui affichent des images hotlinkés (et donc pas de tracker JS pour Analytics). J&#8217;ai donc décidé d&#8217;enrayer ce fléau pour les raisons que j&#8217;ai déjà evoqué (Bande passante, référencement, monétisation).</p>
<p>Il vous suffit de créer un htaccess qui ne va autoriser l&#8217;accès à vos images qu&#8217;aux referers que vous aurez autorisé. Alors bien évidement, on ne peut pas considérer que c&#8217;est une solution fiable à 100% car tout le monde sait qu&#8217;un referer est fakable. Ceci dit je mise sur le fait qu&#8217;une personne préfèrera uploader l&#8217;image sur son site plutôt que de devoir faker le referer de son script pour afficher une image hostée sur dump-it.fr &#8230;</p>
<p><code><br />
RewriteEngine on<br />
RewriteCond %{HTTP_REFERER} !^$<br />
RewriteCond %{HTTP_REFERER} !^http://(www\.)?dump-it.fr/.*$ [NC]<br />
RewriteCond %{HTTP_REFERER} !^http://(www\.)?john-jean.com/.*$ [NC]<br />
RewriteRule .*\.(gif|GIF|jpg|JPG|bmp|BMP|jpeg|JPEG)$ http://www.dump-it.fr/hotlink.jpe [R,NC]</code></p>
<p>Cette méthode permet donc de rediriger l&#8217;ensemble des personnes tentant d&#8217;accéder à vos images, et dont le referer n&#8217;est ni vide (2ème ligne), ni dump-it.fr ou john-jean.com (3eme et 4eme lignes) vers l&#8217;image hotlink.jpe (dernière ligne). Notez bien que hotlink.jpe n&#8217;est pas une coquille, simplement si je renvoyais vers un .jpg, cela bouclerait car ma règle <code>RewriteRule .*\.(gif|jpg|jpeg|bmp)$ </code>réécrit pour les .jpg.  Les navigateurs interprètent correctement les .jpe de toute facon.</p>
<p>L&#8217;intérêt de cette méthode est qu&#8217;elle permet d&#8217;afficher des images relativement cocasses aux personnes qui vous leechent* (Second néologisme douteux du billet). Je me suis pas mal amusé avec <a title="hébergeur image gratuit" href="http://www.dump-it.fr">dump-it.fr</a> à mettre toute sorte d&#8217;images et c&#8217;était amusant de voir ce que cela rendait chez les hotlinkers. Un site e-commerce a vu l&#8217;ensemble de ses images intégralement remplacées, un site d&#8217;humour avec un forum actif également, et bien d&#8217;autres. Pour le coup, ceux qui m&#8217;ont contacté ont été ajoutés à ma white list ;)</p>
<p>Si vous ne souhaitez pas vous amuser à changer les images de tous les sites qui vous volent (et vous spolient !), vous pouvez simplement rediriger vers une 403:</p>
<p><code>RewriteRule .*\.(gif|GIF|jpg|JPG|bmp|BMP|jpeg|JPEG)$ - [F]</code></p>
<p>Voilà, bon amusement et désolé si cet article a été relativement mal écrit, je me remet dans le bain ;)<br />
PS: Pour le cas de dump-it, comme le site était mal organisé j&#8217;avais une arbo comme cela: /upload/images/miniatures/, donc je devais limiter l&#8217;accès à images (pour le hotlink), mais laisser miniatures ouvert car il sert à l&#8217;insertion des miniatures dans les bbcode forum. Si vous avez le même type de soucis, il suffit simplement de rajouter dans le dossier *miniatures*:<br />
<code><br />
RewriteEngine off<br />
allow from all<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.john-jean.com/blog/sysadmin/comment-empecher-hotling-images-127/feed</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Comment rendre Mysql accessible depuis l&#8217;extérieur ? &#8230;</title>
		<link>http://www.john-jean.com/blog/securite-informatique/comment-rendre-mysql-accessible-depuis-lexterieur-102</link>
		<comments>http://www.john-jean.com/blog/securite-informatique/comment-rendre-mysql-accessible-depuis-lexterieur-102#comments</comments>
		<pubDate>Fri, 26 Dec 2008 21:09:38 +0000</pubDate>
		<dc:creator>John JEAN</dc:creator>
				<category><![CDATA[Sysadmin]]></category>
		<category><![CDATA[Sécurité informatique]]></category>
		<category><![CDATA[3306]]></category>
		<category><![CDATA[accès]]></category>
		<category><![CDATA[connexion]]></category>
		<category><![CDATA[distant]]></category>
		<category><![CDATA[htaccess]]></category>
		<category><![CDATA[iptables]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.john-jean.com/blog/?p=102</guid>
		<description><![CDATA[&#8230; Et si possible avec une gestion des accès utilisateurs cohérente. Voici une question qui revient souvent et pour laquelle certains webmasters sont un peu perdus. En effet, pour des raisons de sécurité évidente, Mysql n&#8217;autorise par défaut pas les connexions distantes. Ce billet s&#8217;adresse donc aux personnes ayant plusieurs machines / serveurs à disposition [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" src="http://www.john-jean.com/mysql_logo.jpg" alt="Logo Mysql" /> &#8230; Et si possible avec une gestion des accès utilisateurs cohérente. Voici une question qui revient souvent et pour laquelle certains webmasters sont un peu perdus. En effet, pour des raisons de sécurité évidente, Mysql n&#8217;autorise par défaut pas les connexions distantes. Ce billet s&#8217;adresse donc aux personnes ayant plusieurs machines / serveurs à disposition et souhaitant rendre Mysql contactable à distance sur le 3306. Le but est donc d&#8217;avoir un serveur Mysql central, sur lequel plusieurs autres serveurs pourront venir chercher les informations dont ils ont besoin. Plusieurs raisons: méthode de sécurisation (!), authentification unifiée, besoin d&#8217;un serveur robuste pour un site, etc&#8230;</p>
<p><span id="more-102"></span></p>
<p>Bien, donc imaginons que vous avez développé www.example.com. Vous avez aussi historiquement une dizaine de sites, example1.com, example2.com, example3.com et ainsi de suite. Vous souhaitez pouvoir gérer les accès aux répertoires /admin/ par le biais d&#8217;un login unifié par Mysql; Comprendre: déployer le même htaccess partout qui permet de checker dans une db si tel utilisateur a accès à tel site ou pas.  Au delà du fait que vous allez avoir besoin de <a href="http://modauthmysql.sourceforge.net/" target="_blank">mod_auth_mysql</a>, il vous faut un serveur Mysql dans lequel l&#8217;ensemble des htaccess iront taper pour savoir si les utilisateurs peuvent se loger ou non. Autre exemple, example.com prend de l&#8217;ampleur, les requêtes SQL sont déjà optimisées mais elles mettent cependant le serveur sur les rotules tellement il y a de visiteurs sur le site, même chose, besoin d&#8217;un serveur Mysql à distance (je n&#8217;entend pas troller ici sur l&#8217;affinage des requêtes, l&#8217;optimisation hardware, etc ;) ).</p>
<p>Donc, comment permettons nous à Mysql d&#8217;écouter à distance ? C&#8217;est en réalité assez simple, mais comme ce n&#8217;est pas si évident que cela de retrouver sur google comment faire dans une seul document, je fais ce billet qui tente de condenser l&#8217;information.</p>
<p>La première chose à faire est d&#8217;aller modifier votre /etc/mysql/my.cnf afin de commenter la ligne suivante:</p>
<pre class="code">bind-address           = 127.0.0.1 devient donc
#bind-address           = 127.0.0.1</pre>
<p>Vous devez ensuite, comme d&#8217;habitude, redémarrer mysql:</p>
<pre class="code">[john@coincoin:~]# /etc/init.d/mysql restart
Stopping MySQL database server: mysqld.
Starting MySQL database server: mysqld.</pre>
<p>Vous venez d&#8217;enlever l&#8217;écoute locale du serveur Mysql. Désormais, vous pouvez créer vos utilisateurs. Et c&#8217;est ici qu&#8217;il faut être vigilant, si je reprend l&#8217;exemple d&#8217;avant (example2.com, example3.com, etc), potentiellement nous avons besoin qu&#8217;un utilisateur Mysql soit crée afin d&#8217;accéder aux informations. Mais ce n&#8217;est pas parce que 10 serveurs peuvent avoir besoin de contacter notre serveur Mysql que cet utilisateur doit avoir les droits %. Il convient de gérer précisement les autorisations de chaque utilisateur. Même si la solution de facilité souvent employée par les webmasters est de mettre en droit &laquo;&nbsp;%&nbsp;&raquo; (le % est une wildcard qui permet à l&#8217;utilisateur Mysql de se connecter depuis n&#8217;importe où), en cas de faille de type Injection Mysql, c&#8217;est la porte ouverte à n&#8217;importe qui pour collecter les informations (alors que de devoir faire relai sur le serveur qui possède la faille est beaucoup plus rébarbatif).</p>
<p>Donc pour résumer, ce qu&#8217;il ne faut pas faire:</p>
<pre class="code">CREATE USER 'example'@'%' IDENTIFIED BY '****';
GRANT USAGE ON * . * TO 'example'@'%' IDENTIFIED BY '****' WITH MAX_QUERIES_PER_HOUR 0
MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;
CREATE DATABASE IF NOT EXISTS `example` ;
GRANT ALL PRIVILEGES ON `example` . * TO 'example'@'%';</pre>
<p>Là, vous créez un utilisateur qui peut se connecter de n&#8217;importe ou. Par contre si example.com est hébergé sur 80.80.80.80, voici ce qu&#8217;il convient mieux de faire:</p>
<pre class="code">CREATE USER 'example'@'88.80.80.80' IDENTIFIED BY '****';
GRANT USAGE ON * . * TO 'example'@'88.80.80.80' IDENTIFIED BY '****' WITH MAX_QUERIES_PER_HOUR
0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;
CREATE DATABASE IF NOT EXISTS `example` ;
GRANT ALL PRIVILEGES ON `example` . * TO 'example'@'88.80.80.80;</pre>
<p>Dans le cas où vous hébergez un site sur le serveur Mysql directement, et que vous n&#8217;avez pas besoin de contacter à distance pour l&#8217;utilisateur Mysql, vous pouvez mettre directement localhost, autant être logique. Et si d&#8217;aventure, vous n&#8217;avez pas envie de granter les accès immédiatement:</p>
<pre class="code">CREATE USER 'example'@'localhost' IDENTIFIED BY '****';
GRANT USAGE ON * . * TO 'example'@'localhost' IDENTIFIED BY '****' WITH MAX_QUERIES_PER_HOUR 0
MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;</pre>
<p>Malgré tout cela, Ca ne marche pas ?!<br />
Il n&#8217;est pas impossible que <a href="http://www.netfilter.org/" target="_blank">IPTABLES </a>rejette les connexions entrantes, vous devez donc autoriser les serveurs distants à vous contacter, là encore c&#8217;est comme le % ou l&#8217;IP directement, il y a deux écoles. Soit c&#8217;est Open-bar:</p>
<pre class="code">/sbin/iptables -A INPUT -i eth0 -p tcp --destination-port 3306 -j ACCEPT</pre>
<p>Soit on met l&#8217;adresse IP du serveur qui peut venir taper sur le 3306:</p>
<pre class="code">/sbin/iptables -A INPUT -i eth0 -s 80.80.80.80 -p tcp --destination-port 3306 -j ACCEPT</pre>
<p>N.B:  Rendre vos bases de données accessibles depuis l&#8217;extérieur n&#8217;est pas synonyme de faiblesse de sécurité si les choses sont bien faites. Pour résumer:</p>
<ul>
<li>On commente bind-adress dans /etc/mysql/my.cnf</li>
<li>On crée les utilisateurs avec les droits NECESSAIRES, pas plus. Autrement dit, on autorise depuis l&#8217;adresse IP d&#8217;où ils contactent et jamais depuis partout (%). Si l&#8217;utilisateur est local, on ne l&#8217;authentifie que depuis localhost.</li>
<li>On crée des règles iptables pour autoriser les serveurs qui ont le droit de rentrer, pas pour tout le monde (-s 80.80.80.80).</li>
</ul>
<p>Bonnes bidouilles.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.john-jean.com/blog/securite-informatique/comment-rendre-mysql-accessible-depuis-lexterieur-102/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Les nouveautés de WordPress 2.7 &#8211; Mise à jour recommandée.</title>
		<link>http://www.john-jean.com/blog/sysadmin/cest-reparti-pour-un-tour-30</link>
		<comments>http://www.john-jean.com/blog/sysadmin/cest-reparti-pour-un-tour-30#comments</comments>
		<pubDate>Wed, 17 Dec 2008 09:43:31 +0000</pubDate>
		<dc:creator>John JEAN</dc:creator>
				<category><![CDATA[Sysadmin]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[mise à jour]]></category>
		<category><![CDATA[ouverture]]></category>

		<guid isPermaLink="false">http://www.john-jean.com/blog/?p=30</guid>
		<description><![CDATA[Une nouvelle mise à jour de WordPress (2.7), il ne m&#8217;en aura pas fallu plus pour que je sois re-re-re-retenté par l&#8217;aventure blogesque.  Je vous encourage vivement à mettre à jour votre actuel WordPress, pleins de nouveautés interessantes font leur apparition dans cette version (Interface admin revu et corrigée, suivi des commentaires par thread, Possibilité [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" src="http://www.john-jean.com/icon2_rss.png" alt="Mise à jour WordPress 2.7" width="165" height="152" />Une <strong>nouvelle</strong> mise à jour de WordPress (2.7), il ne m&#8217;en aura pas fallu plus pour que je sois re-re-re-retenté par l&#8217;aventure blogesque.  Je vous encourage vivement à mettre à jour votre actuel WordPress, pleins de nouveautés interessantes font leur apparition dans cette version (Interface admin revu et corrigée, suivi des commentaires par thread, Possibilité de mettre à jour les plugins en un clic, possibilité de répondre aux commentaires&#8230;etc).</p>
<p><span id="more-30"></span>En somme, bon nombre de choses présentes par le biais de plugins ont été intégrés d&#8217;emblée à WordPress. Ca me rappelle un peu IE 7.x / FF.Quoiqu&#8217;il en soit, il faudra bien que je finisse par arrêter de faire du half-blogging, car cela devient de plus en plus dur de trouver des introductions à chaque renouvellement.</p>
<p>Au fait, à quel lecteur j&#8217;écris là ? :D</p>
]]></content:encoded>
			<wfw:commentRss>http://www.john-jean.com/blog/sysadmin/cest-reparti-pour-un-tour-30/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
