<?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>asyd's blog</title>
	<atom:link href="http://blog.asyd.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.asyd.net</link>
	<description>unix forever, for everyone. Not convinced, try Mac OS X!</description>
	<lastBuildDate>Wed, 29 Feb 2012 08:44:54 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Appel à conférences, sysadmin #4</title>
		<link>http://blog.asyd.net/2012/02/appel-a-conferences-sysadmin-4/</link>
		<comments>http://blog.asyd.net/2012/02/appel-a-conferences-sysadmin-4/#comments</comments>
		<pubDate>Wed, 29 Feb 2012 08:44:54 +0000</pubDate>
		<dc:creator>asyd</dc:creator>
				<category><![CDATA[Sysadmin]]></category>

		<guid isPermaLink="false">http://blog.asyd.net/?p=629</guid>
		<description><![CDATA[Bonjour à tous, la quatrième édition des séminaires sysadmins se tiendra les 26 et 27 avril sur Paris. Comme les précédentes éditions, une journée sera dédiée à un thème particulier et cette fois c&#8217;est autour du monitoring et métrologie. La deuxième journée n&#8217;a pas de thème spécifique, donc toute proposition est la bienvenue !]]></description>
			<content:encoded><![CDATA[<p>Bonjour à tous,</p>
<p>la quatrième édition des séminaires sysadmins se tiendra les 26 et 27 avril sur Paris. Comme les précédentes éditions, une journée sera dédiée à un thème particulier et cette fois c&#8217;est autour du monitoring et métrologie. La deuxième journée n&#8217;a pas de thème spécifique, donc toute proposition est la bienvenue !</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.asyd.net/2012/02/appel-a-conferences-sysadmin-4/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Du modèle EAV, ou comment s&#8217;arracher les cheveux, pour plein de raisons</title>
		<link>http://blog.asyd.net/2012/01/du-modele-eav-ou-comment-sarracher-les-cheveux-pour-plein-de-raisons/</link>
		<comments>http://blog.asyd.net/2012/01/du-modele-eav-ou-comment-sarracher-les-cheveux-pour-plein-de-raisons/#comments</comments>
		<pubDate>Mon, 02 Jan 2012 11:27:20 +0000</pubDate>
		<dc:creator>asyd</dc:creator>
				<category><![CDATA[Sysadmin]]></category>
		<category><![CDATA[etl]]></category>
		<category><![CDATA[itop]]></category>
		<category><![CDATA[puppet]]></category>

		<guid isPermaLink="false">http://blog.asyd.net/?p=621</guid>
		<description><![CDATA[Dans le cadre du projet SOIF (qui fera l&#8217;objet d&#8217;un prochain billet), je travaille actuellement sur un job de transformation d&#8217;une base Puppet facts pour injecter dans iTop. Avant tout, un peu de contexte : Puppet intègre la commande facter qui renvoie tout un ensemble d&#8217;informations sous la forme attribut=valeur, et qui est facilement extensible, [...]]]></description>
			<content:encoded><![CDATA[<p>Dans le cadre du projet <a href="https://wiki.opencsi.com/public/bin/view/SOIF/WebHome">SOIF</a> (qui fera l&#8217;objet d&#8217;un prochain billet), je travaille actuellement sur un job de transformation d&#8217;une base <a href="http://theforeman.org/projects/foreman/wiki/Puppet_Facts">Puppet facts</a> pour injecter dans <a href="http://sourceforge.net/projects/itop/">iTop</a>.</p>
<p>Avant tout, un peu de contexte : Puppet intègre la commande <em>facter</em> qui renvoie tout un ensemble d&#8217;informations sous la forme <em>attribut=valeur</em>, et qui est facilement extensible, bref c&#8217;est très intéressant. Là où le bat blesse, c&#8217;est que &#8211; logiquement &#8211; ces informations sont stockées en base de données en utilisant le modèle de conception <a href="http://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model">EAV</a> pour Entity Attribute Value.</p>
<p>Ce qui donne :</p>
<pre>
+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | int(11)      | NO   | PRI | NULL    | auto_increment |
| name       | varchar(255) | NO   | MUL | NULL    |                |
| updated_at | datetime     | YES  |     | NULL    |                |
| created_at | datetime     | YES  |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+
</pre>
<p>et </p>
<pre>
mysql> desc fact_values;
+--------------+----------+------+-----+---------+----------------+
| Field        | Type     | Null | Key | Default | Extra          |
+--------------+----------+------+-----+---------+----------------+
| id           | int(11)  | NO   | PRI | NULL    | auto_increment |
| value        | text     | NO   |     | NULL    |                |
| fact_name_id | int(11)  | NO   | MUL | NULL    |                |
| host_id      | int(11)  | NO   | MUL | NULL    |                |
+--------------+----------+------+-----+---------+----------------+
</pre>
<p>Donc, pour obtenir par exemple la <em>fact</em> <em>serialnumber</em> pour un hôte donné, cela donne quelque chose du genre :</p>
<p><code lang="sql"><br />
select fact_values.value FROM fact_values LEFT JOIN hosts ON fact_values.host_id = hosts.id LEFT JOIN fact_names ON fact_values.fact_name_id = fact_names.id WHERE hosts.name = 'xxx' AND fact_names.name = 'serialnumber';<br />
</code></p>
<p>Mais maintenant, retour à mon objectif : travailler par lot, c&#8217;est à dire pour tous les enregistrements de la table <em>hosts</em>. Se pose donc la question de comment faire pour obtenir la liste de tous les hôtes, avec la valeur <em>serialnumber</em>, à froid, pour l&#8217;expert SQL que je ne suis pas, mon premier jet à donné :<br />
<code><br />
SELECT hosts.id, fact_values.value FROM hosts LEFT JOIN fact_values ON hosts.id = fact_values.host_id LEFT JOIN fact_names ON fact_names.id = fact_values.fact_name_id WHERE fact_names.name = 'serialnumber';<br />
</code><br />
qui semble fonctionné à priori, mais, MAIS, cela ne renvoie que les enregistrements pour lesquels il existe la valeur <em>serialnumber</em>.</p>
<p>Après de nombreuses recherches, il semblerait que la seule solution à mon problème soit :</p>
<pre>
SELECT
  hosts.id,
  (SELECT fact_values.value
    FROM fact_values
    JOIN fact_names
     ON fact_names.id = fact_values.fact_name_id
    WHERE fact_names.name = 'serialnumber'
     AND fact_values.host_id = hosts.id) as serialnumber,
FROM hosts;
</pre>
<p>et là, on le voit tout de suite, ça devient compliqué. Pourquoi ? parce que je n&#8217;ai pas seulement besoin du <em>serialnumber</em> mais de nombreux autres champs, et pour chaque champ que je veux, je dois donc rajouter un nouveau SELECT, je vous laisse deviner l&#8217;impact sur les performances.</p>
<p>Bref, EAV, ça pue. Bien évidemment si vous avez une autre solution, n&#8217;hésitez pas à commenter !</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.asyd.net/2012/01/du-modele-eav-ou-comment-sarracher-les-cheveux-pour-plein-de-raisons/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Astuce : trouver le caractère UTF8 associé à un code hexa</title>
		<link>http://blog.asyd.net/2011/12/astuce-trouver-le-caractere-utf8-associe-a-un-code-hexa/</link>
		<comments>http://blog.asyd.net/2011/12/astuce-trouver-le-caractere-utf8-associe-a-un-code-hexa/#comments</comments>
		<pubDate>Thu, 29 Dec 2011 09:24:47 +0000</pubDate>
		<dc:creator>asyd</dc:creator>
				<category><![CDATA[Sysadmin]]></category>

		<guid isPermaLink="false">http://blog.asyd.net/?p=617</guid>
		<description><![CDATA[Dans mes péripéties mod_security, j&#8217;ai eu l&#8217;erreur suivante : [Thu Dec 29 08:44:22 2011] [error] [client xx.21.3.31] ModSecurity: Warning. Pattern match "\\W{4,}" at ARGS:typeLibelle. [file "/usr/local/apache2/conf/crs/activated_rules/modsecurity_crs_41_sql_injection_attacks.conf"] [line "507"] [id "960024"] [rev "2.2.2"] [msg "SQL Character Anomaly Detection Alert - Repetative Non-Word Characters"] [data " \\xc3\\xa0 "] [hostname "dev.xxxx.fr"] [uri "/xxxx"] [unique_id "TvwaVgpArWEAAHu7CtMAAAAG"] Et la question [...]]]></description>
			<content:encoded><![CDATA[<p>Dans mes péripéties mod_security, j&#8217;ai eu l&#8217;erreur suivante :</p>
<p><code><br />
[Thu Dec 29 08:44:22 2011] [error] [client xx.21.3.31] ModSecurity: Warning. Pattern match "\\W{4,}" at ARGS:typeLibelle. [file "/usr/local/apache2/conf/crs/activated_rules/modsecurity_crs_41_sql_injection_attacks.conf"] [line "507"] [id "960024"] [rev "2.2.2"] [msg "SQL Character Anomaly Detection Alert - Repetative Non-Word Characters"] [data " \\xc3\\xa0 "] [hostname "dev.xxxx.fr"] [uri "/xxxx"] [unique_id "TvwaVgpArWEAAHu7CtMAAAAG"]<br />
</code></p>
<p>Et la question qui tue : à quoi correspond \\xc3\\xa0 ? Je me doutais que c&#8217;était un caractère UTF8, j&#8217;ai donc demandé à mon expert jeu de caractères (aka Laurent Blume) qui m&#8217;a donné l&#8217;astuce suivante :</p>
<ul>
<li> Avant tout, avoir un système en UTF-8 </li>
<li> Lancer vim (pas besoin d&#8217;ouvrir un fichier) </li>
<li> Taper un caractère accentué, par exemple é </li>
<li> Convertir en hexadécimal à l&#8217;aide de la commande &#8220;:%!xxd&#8221;, ce qui va donner quelque chose du genre &#8220;0000000: c3a9 0a&#8221; </li>
<li> Modifier le c3a9 en c3a0 </li>
<li> Reconvertir en texte, à l&#8217;aide de la commande &#8220;:%!xxd -r&#8221;, et miracle on obtient le caractère &#8220;à&#8221; !</li/
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.asyd.net/2011/12/astuce-trouver-le-caractere-utf8-associe-a-un-code-hexa/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Séminaire #3, le programme</title>
		<link>http://blog.asyd.net/2011/10/seminaire-3-le-programme/</link>
		<comments>http://blog.asyd.net/2011/10/seminaire-3-le-programme/#comments</comments>
		<pubDate>Mon, 03 Oct 2011 09:09:18 +0000</pubDate>
		<dc:creator>asyd</dc:creator>
				<category><![CDATA[Sysadmin]]></category>

		<guid isPermaLink="false">http://blog.asyd.net/?p=614</guid>
		<description><![CDATA[La troisième édition des séminaires sysadmin se tiendra les 20 et 21 Octobre à l&#8217;IRILL (merci à eux aux passage). Le programme (non définitif) est maintenant disponible ! Les inscriptions seront ouvertes d&#8217;ici peu.]]></description>
			<content:encoded><![CDATA[<p>La troisième édition des séminaires sysadmin se tiendra les 20 et 21 Octobre à l&#8217;IRILL (merci à eux aux passage).</p>
<p><a href="http://sysadmin.asyd.net/">Le programme (non définitif) est maintenant disponible !</a> Les inscriptions seront ouvertes d&#8217;ici peu.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.asyd.net/2011/10/seminaire-3-le-programme/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Premier pas avec mod_security</title>
		<link>http://blog.asyd.net/2011/06/premier-pas-avec-mod_security/</link>
		<comments>http://blog.asyd.net/2011/06/premier-pas-avec-mod_security/#comments</comments>
		<pubDate>Sun, 19 Jun 2011 14:00:18 +0000</pubDate>
		<dc:creator>asyd</dc:creator>
				<category><![CDATA[Security]]></category>
		<category><![CDATA[planet-libre]]></category>
		<category><![CDATA[waf mod_security]]></category>

		<guid isPermaLink="false">http://blog.asyd.net/?p=602</guid>
		<description><![CDATA[Un client m&#8217;a demandé récemment si je pouvais jeter un œil à mod_security pour ses besoins de protections d&#8217;URL (WAF, en anglais Web Application Firewall, plus d&#8217;infos sur l&#8217;article Wikipedia). En quelques mots, mod_security est un module Apache &#8211; comme son nom l&#8217;indique &#8211; qui apporte donc une fonctionnalité de filtre relativement avancé, mais avec [...]]]></description>
			<content:encoded><![CDATA[<p>Un client m&#8217;a demandé récemment si je pouvais jeter un œil à mod_security pour ses besoins de protections d&#8217;URL (WAF, en anglais Web Application Firewall, plus d&#8217;infos sur <a>l&#8217;article Wikipedia</a>). En quelques mots, mod_security est un module Apache &#8211; comme son nom l&#8217;indique &#8211; qui apporte donc une fonctionnalité de filtre relativement avancé, mais avec l&#8217;avantage d&#8217;être opensource et donc gratuit. De plus, il vient avec un ensemble de règles déjà établies qui sont le fruit du travail du groupe OWASP, qui se définit comme un <em>501c3 not-for-profit worldwide charitable organization focused on improving the security of application software</em>.</p>
<p>L&#8217;objectif de ma première approche de mod_security est relativement simple puisqu&#8217;il consiste à logger toutes les tentatives d&#8217;authentification avec un nom d&#8217;utilisateur qui contient des caractères hormis [a-zA-Z0-9]. Voici un récapitulatif de l&#8217;architecture (simple) mise en œuvre :</p>
<ul>
<li>Distribution : CentOS</li>
<li>un apache (où sera installé le module mod_security) en frontal devant un Tomcat, en utilisant le mod_proxy (en HTTP)</li>
<li>un Tomcat avec <a href="http://xebia-france.googlecode.com/svn/training/xebia-spring-travel/trunk/">une application de test</a> nommée <em>Xebia Travel</em> développée par <a href="http://www.xebia.com/">Xebia</a></li>
<li>L&#8217;authentification des utilisateurs sur l&#8217;application <em>Xebia Travel</em> s&#8217;effectue via un POST au travers d&#8217;un formulaire, avec les variables <em>j_username</em> et <em>j_password</em></li>
</ul>
<p>Une fois installé mod_security (depuis le dépôt <a href="http://fedoraproject.org/wiki/EPEL">EPEL</a>), et quelques petites heures de recherche, voici le résultat que j&#8217;ai obtenu :</p>
<p><code><br />
                SecAuditLog             /var/log/httpd/ecommerce-audit.log<br />
                SecDebugLog             /var/log/httpd/ecommerce-security.log<br />
                SecDebugLogLevel        3<br />
                SecAuditEngine  relevantonly</p>
<p>                SecRequestBodyAccess On</p>
<p>                SecRule         ARGS:j_username "!@rx ^([A-Za-z0-9]+)$" auditlog,id:10000<br />
</code></p>
<p>Quelques explications :</p>
<ul>
<li> Les directives <em>SecAuditLog, SecDebug, SecDebugLogLevel et SecAuditEngine</em> sont relativement explicites. Elles permettent en effet de configurer les différents fichiers de logs et d&#8217;audit, ainsi que leur verbosité </li>
<li> La directive <em>SecRequestBodyAccess</em> est <b>très importante</b>, puisqu&#8217;elle permet de dire à mod_security d&#8217;analyser non pas seulement les en-têtes des requêtes mais également le corps. Pourquoi est-ce important ? Parce qu&#8217;avec les formulaires de type POST, les variables sont passées non pas en en-tête, mais bien dans le corps du message. Sans cette directive, il est donc impossible d&#8217;analyser les arguments des formulaires de type POST</li>
<li> et enfin, la directive la plus importante à savoir <em>SecRule</em> qui est exécutée à chaque fois qu&#8217;une requête est effectuée avec l&#8217;argument j_username (POST ou GET), et je vérifie au travers d&#8217;une expression rationnelle (regex) qu&#8217;elle contient d&#8217;autres caractères que [A-Za-z0-9], auquel cas je lui définie l&#8217;action <em>auditlog</em>, en lui demendant d&#8217;identifier cette règle avec l&#8217;<em>id</em> 10000, ce qui s&#8217;avère pratique pour l&#8217;analyse du fichier d&#8217;audit.</li>
<p></lu></p>
<p>Bien entendu, ce billet ne montre qu&#8217;un centième des utilisations possible de mod_security, mais si cela peut aider à commencer, sur ce, à bientôt !</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.asyd.net/2011/06/premier-pas-avec-mod_security/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Séminaire #3, appel à conférences</title>
		<link>http://blog.asyd.net/2011/06/seminaire-3-appel-a-conferences/</link>
		<comments>http://blog.asyd.net/2011/06/seminaire-3-appel-a-conferences/#comments</comments>
		<pubDate>Wed, 15 Jun 2011 08:20:59 +0000</pubDate>
		<dc:creator>asyd</dc:creator>
				<category><![CDATA[Social]]></category>
		<category><![CDATA[Sysadmin]]></category>

		<guid isPermaLink="false">http://blog.asyd.net/?p=598</guid>
		<description><![CDATA[Bonjour à tous, courant fin septembre 2011 se tiendra la troisième édition des séminaires de la liste francophone sysadmin (le programme de la deuxième édition est toujours en ligne, et surtout les vidéos et présentations). Cette troisième édition se tiendra sur deux journées, la première consacrée à des sujets autour de la conformité de configuration [...]]]></description>
			<content:encoded><![CDATA[<p>Bonjour à tous,</p>
<p>courant fin septembre 2011 se tiendra la troisième édition des séminaires de la liste francophone sysadmin (<a href="http://sysadmin.asyd.net/">le programme de la deuxième édition</a> est toujours en ligne, et surtout les <a href="http://archives.sysadmin-fr.org/">vidéos et présentations</a>). Cette troisième édition se tiendra sur deux journées, la première consacrée à des sujets autour de la conformité de configuration (tel que Chef, Puppet, etc.), la seconde avec des sujets divers et variés. Si vous êtes intéressé par faire une présentation, je vous invite à me contacter par mail à asyd at asyd dot net, et/ou en laissant un commentaire sur ce présent billet.</p>
<p>Merci de votre participation !</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.asyd.net/2011/06/seminaire-3-appel-a-conferences/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>EJBCA Créer un certificat administrateur en ligne de commande</title>
		<link>http://blog.asyd.net/2011/05/ejbca-creer-un-certificat-administrateur-en-ligne-de-commande/</link>
		<comments>http://blog.asyd.net/2011/05/ejbca-creer-un-certificat-administrateur-en-ligne-de-commande/#comments</comments>
		<pubDate>Wed, 04 May 2011 05:39:37 +0000</pubDate>
		<dc:creator>asyd</dc:creator>
				<category><![CDATA[PKI]]></category>
		<category><![CDATA[ejbca]]></category>

		<guid isPermaLink="false">http://blog.asyd.net/?p=592</guid>
		<description><![CDATA[De retour chez un client après quelques années d&#8217;absences, je me retrouve avec un certificat d&#8217;administrateur expiré sur la PKI de test. Voici la procédure de création d&#8217;un nouveau certificat, le tout en ligne de commande, forcément : ./bin/ejbca.sh ra adduser bbonfils00 foo123 "cn=Bruno Bonfils,UID=bbonfils,O=Customer,C=FR" NULL AdminCA1 bruno@opencsi.com 1 P12 ENDUSER EE_PKI_ADMINISTRATOR ./bin/ejbca.sh ra setclearpwd [...]]]></description>
			<content:encoded><![CDATA[<p>De retour chez un client après quelques années d&#8217;absences, je me retrouve avec un certificat d&#8217;administrateur expiré sur la PKI de test. Voici la procédure de création d&#8217;un nouveau certificat, le tout en ligne de commande, forcément :</p>
<p><code> ./bin/ejbca.sh ra adduser bbonfils00 foo123 "cn=Bruno Bonfils,UID=bbonfils,O=Customer,C=FR" NULL AdminCA1 bruno@opencsi.com 1 P12 ENDUSER EE_PKI_ADMINISTRATOR<br />
./bin/ejbca.sh ra setclearpwd bbonfils00 foo123<br />
./bin/ejbca.sh batch<br />
</code></p>
<p>Bien entendu il faut que le certificat corresponde au profil. Si besoin, vous devez pouvoir utiliser le profil EMPTY en ne spécifiant uniquement le CN. Il faut maintenant obtenir le numéro de série du certificat.</p>
<p><code> ./bin/ejbca.sh ra getusercert bbonfils00<br />
</code></p>
<p>Copier / coller le certificat dans un certificat, puis extraire le numéro de série à l&#8217;aide de la commande OpenSSL :</p>
<p><code> openssl x509 -in /tmp/bbonfils0.pem -noout -serial<br />
serial=4AEDB10E68DC69B6<br />
</code></p>
<p>Et finalement, identifier un groupe d&#8217;administrateur, puis rajouter l&#8217;administrateur dans ce groupe :</p>
<p><code> ./bin/ejbca.sh admins listgroups<br />
Using JBoss JNDI provider...<br />
PKI CA Administrators (1 admin)<br />
Super Administrator Group (2 admins)<br />
./bin/ejbca.sh admins addadmin "Super Administrator Group" "AdminCA" "WITHSERIALNUMBER" EQUALCASEINS 4AEDB10E68DC69B6<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.asyd.net/2011/05/ejbca-creer-un-certificat-administrateur-en-ligne-de-commande/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Le futur de la sécurité Web, ce n&#8217;est pas le https</title>
		<link>http://blog.asyd.net/2011/04/le-futur-de-la-securite-web-ce-nest-pas-le-https/</link>
		<comments>http://blog.asyd.net/2011/04/le-futur-de-la-securite-web-ce-nest-pas-le-https/#comments</comments>
		<pubDate>Mon, 04 Apr 2011 12:50:47 +0000</pubDate>
		<dc:creator>asyd</dc:creator>
				<category><![CDATA[Security]]></category>
		<category><![CDATA[planet-libre]]></category>

		<guid isPermaLink="false">http://blog.asyd.net/?p=570</guid>
		<description><![CDATA[Suite aux problèmes récents de divers fournisseurs officiels de certificats, notamment Comodo, on peut croiser ici et là diverses propositions de changement (assez radicaux) quant à la gestion des certificats. Certains parlent d&#8217;un Web of Trust (pour faire simple et court, c&#8217;est l&#8217;utilisateur qui choisi au cas par cas à qui il fait confiance), d&#8217;autres [...]]]></description>
			<content:encoded><![CDATA[<p>Suite aux problèmes récents de divers fournisseurs officiels de certificats, notamment Comodo, on peut croiser <a href="http://www.h-online.com/security/news/item/Proposals-for-the-future-of-certificates-1220816.html">ici</a> et <A href="https://docs.google.com/present/view?id=df9sn445_206ff3kn9gs&#038;pli=1">là</a> diverses propositions de changement (assez radicaux) quant à la gestion des certificats. Certains parlent d&#8217;un <em>Web of Trust</em> (pour faire simple et court, c&#8217;est l&#8217;utilisateur qui choisi au cas par cas à qui il fait confiance), d&#8217;autres encore pensent à sortir du modèle actuel des fournisseurs officiels, en utilisant notamment le DNS pour fournir l&#8217;information sur le certificat attendu, ce qui permettrait au navigateur de savoir si le certificat reçu est celui attendu.</p>
<p>Cependant, toutes ces propositions ne sont là que pour <em>corriger</em> le modèle actuel des fournisseurs de certificats, aucune proposition (du moins parmi celle que j&#8217;ai lues) ne remet en question le modèle du HTTPs, à savoir de la protection de transport. Pour moi, le vrai problème ne se situe plus à la protection du transport, mais à la protection du contenu. Qu&#8217;est ce que je veux dire par là ? Prenons un cas simple, une page d&#8217;authentification. Il va de soit que l&#8217;identifiant et surtout le mot de passe doit être transmis de manière sécurisé. </p>
<p>Aujourd&#8217;hui nous utilisons de plus en plus de sites internets, issus de différents éditeurs, et surtout de plus en plus de portails. Comme je l&#8217;avais <a href="http://blog.asyd.net/2008/09/imaginons-un-navigateur-xhtml-xades/">imaginé il y a déjà plus de 2 ans</a>, de mon avis l&#8217;avenir réside dans le fait de sécuriser le contenu, et non plus le contenant. Prenons l&#8217;exemple d&#8217;un utilisateur qui va sur un site que l&#8217;on appellera BLOG, cette personne veut publier un commentaire, mais ne dispose pas d&#8217;un compte sur la plateforme BLOG. Peu importe, nous sommes au XXI ème siècle, il est possible de s&#8217;identifier via Facebook ! Oui mais… suivant comment est implémentée cette authentification, rien ne garanti que le mot de passe circule de manière chiffrée sur la plateforme BLOG. Cependant, l&#8217;authentification est un cas à part, il existe déjà des mécanismes pour éviter ce genre de problème, notamment la fédération d&#8217;identité, qui permet à un fournisseur de service (tel qu&#8217;un blog wordpress comme celui que vous lisez actuellement) d&#8217;être indépendant du fournisseur d&#8217;identité (là où on tape son identifiant et son mot de passe).</p>
<p>Le principe est relativement simple, plutôt que de chiffrer le tuyau d&#8217;une communication sensible, on chiffre le contenu de la communication, qui peut donc transiter de manière sûre via des canaux non sûrs. Bien entendu, cela ne change en rien la problématique de délivrance des certificats. Mais je pense que plutôt que d&#8217;essayer de corriger le problème en bout de chaîne, essayons de corriger la source. Par exemple, la plupart de nos chers voisins belges disposent d&#8217;une carte d&#8217;identité électronique, qui contient un certificat. Ce dernier, au travers d&#8217;un lecteur de carte (avec des drivers qui fonctionnent aussi bien sous Windows que sous Linux, en passant par Mac OS X), peuvent utiliser leur certificat, notamment pour déposer des dossiers légaux de manière purement électronique. En aucun cas je ne suis en train de dire que tous les certificats serveurs doivent être délivrés par l&#8217;État ou assimilé (encore que, quand on voit <a href="http://lwn.net/Articles/372264/">cet article</a> on peut se demander de la pertinence d&#8217;une telle solution). Mais l&#8217;utilisation massive par les utilisateurs d&#8217;un certificat permettrait &#8211; je le pense &#8211; une meilleure compréhension, et surtout cela imposerait aux éditeurs de logiciels de prendre du temps pour réfléchir à l&#8217;ergonomie associée. Car, et je terminerais la dessus, le problème de sécurité des certificats actuels, est surtout lié aux éditeurs des navigateurs. </p>
<p>En effet, bien que l&#8217;on puisse reprocher l&#8217;aspect monétaire, le modèle actuel pêche surtout par l&#8217;absence de renouvellement régulier des certificats racines, certains sont en 1024 bits, d&#8217;autres utilisent du MD4 (non, il n&#8217;y a pas de typo, je parle bien de MD4 et non MD5, qui de toute manière est tout aussi faible dans le cas de certificats). De plus, bien qu&#8217;il existe des mécanismes de vérification des certificats (tel que l&#8217;utilisation de CRL, et surtout de l&#8217;OCSP) ces mécanismes ne sont pas activés par défaut sur les navigateurs et/ou systèmes d&#8217;exploitations. Pour conclure, plutôt que d&#8217;essayer de trouver un nouveau modèle, il faudrait utiliser les technologies qui nous sont d&#8217;ores et déjà proposées.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.asyd.net/2011/04/le-futur-de-la-securite-web-ce-nest-pas-le-https/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Un SI propre avec iTop, RunDeck, Puppet, FusionInventory</title>
		<link>http://blog.asyd.net/2011/03/un-si-propre-avec-itop-rundeck-puppet-fusioninventory/</link>
		<comments>http://blog.asyd.net/2011/03/un-si-propre-avec-itop-rundeck-puppet-fusioninventory/#comments</comments>
		<pubDate>Wed, 23 Mar 2011 12:49:12 +0000</pubDate>
		<dc:creator>asyd</dc:creator>
				<category><![CDATA[Sysadmin]]></category>
		<category><![CDATA[cmdb]]></category>
		<category><![CDATA[devops]]></category>
		<category><![CDATA[fusioninventory]]></category>
		<category><![CDATA[itop]]></category>
		<category><![CDATA[puppet]]></category>
		<category><![CDATA[rundeck]]></category>

		<guid isPermaLink="false">http://blog.asyd.net/?p=543</guid>
		<description><![CDATA[Au vu de mes futures (nouvelles ) activités, et parce qu&#8217;au XXI ème siècle, on se doit d&#8217;avoir un système d&#8217;information propre, j&#8217;ai commencé une maquette en n&#8217;utilisant que des outils libres. Les objectifs sont multiples&#160;: l&#8217;information ne doit être déclarée qu&#8217;à un seul endroit la configuration des serveurs doit être automatisée disposer d&#8217;une CMDB [...]]]></description>
			<content:encoded><![CDATA[<p>Au vu de mes futures (nouvelles ) activités, et parce qu&#8217;au XXI ème siècle, on se doit d&#8217;avoir un système d&#8217;information propre, j&#8217;ai commencé une maquette en n&#8217;utilisant que des outils libres. Les objectifs sont multiples&nbsp;:</p>
<ul>
<li> l&#8217;information ne doit être déclarée qu&#8217;à un seul endroit </li>
<li> la configuration des serveurs doit être automatisée </li>
<li> disposer d&#8217;une CMDB </li>
<li> automatisé toutes les tâches possibles </li>
</ul>
<h2>Une CMDB, cékoidonc ?</h2>
<p>Avant de rentrer dans la technique, je me permet un petit rappel sur la définition d&#8217;une CMDB (Configuration Management DataBase), qui est un concept né et normalisé par ITIL. Comme le décrit Wikipedia, une CMDB recense les composants d&#8217;un système d&#8217;information. Par exemple, la liste des serveurs, mais aussi et surtout la liste des serveurs d&#8217;applications, des applications, et de tout autre composant structurant. Une fois renseigné ces différentes briques, il est possible de les regrouper, notamment par solutions applications et par processus métier, et surtout, de lier toutes ces briques. L&#8217;objectif&nbsp;? Définir des relations de dépendance, entre le métier (par exemple &#8220;Vendre des articles via mon site d&#8217;ecommerce&#8221;) et les briques techniques (le serveur &#8220;LDAP&#8221;). D&#8217;une part, renseigner ces informations oblige à documenter ces interactions, et éviter qu&#8217;elles ne soient que dans la tête de l&#8217;administrateur, mais pour un administrateur, cela permet de répondre à la question fatidique &#8220;qu&#8217;est ce qui se passe si je change mon serveur LDAP&#8221;. Bon nombre d&#8217;administrateur vont me dire &#8220;mais je sais très bien quelles applications utilisent le LDAP&#8221; ou bien encore &#8220;c&#8217;est dans Puppet, donc j&#8217;ai pas à m&#8217;en occuper&#8221;, je leur répondrais alors &#8220;oui, toi tu es conscient de l&#8217;impact technique. Si je demande à ta direction s&#8217;ils mesurent les impacts business de ta migration, ils vont en penser quoi ?&#8221; (Et là, je viens de me faire des ennemis, mais c&#8217;est une autre histoire).</p>
<p>Jusqu&#8217;il y a encore quelques années, je n&#8217;avais trouvé aucun logiciel opensource me permettant de créer cette CMDB. En effet, la plupart des logiciels de ce genre viennent avec un modèle déjà tout prêt. Cependant, nous n&#8217;avons pas tous les même besoin, et j&#8217;irais presque jusqu&#8217;à dire pas tous la même manière de les représenter (même si justement ITIL décrit un modèle de référence). Or, il y a quelques mois de cela, j&#8217;ai découvert un nouveau logiciel dans ce monde très spécifique, à savoir iTop. C&#8217;est un outil GPL, écrit en PHP, et d&#8217;origine française. Ses auteurs sont des anciens de HP, pour qui ils ont déjà travaillés sur ces problématiques. Résultat, bien qu&#8217;encore jeune, iTop est un outil formidable, car très simple d&#8217;utilisation, mais aussi par sa richesse. En effet, il est relativement aisé de modifier le modèle par défaut (au hasard celui d&#8217;ITIL) pour l&#8217;adapter à ses besoins. Pour citer un des fondateurs de la société Combodo éditrice de ce logiciel, il est tout à fait possible de schématiser une école maternelle avec ses élèves, ses professeurs, ses salles, etc. C&#8217;est typiquement le genre de logiciel que j&#8217;affectionne, il répond à un besoin, mais via une approche <em>framework</em> que logiciel rigide.</p>
<h3>Exemple d&#8217;un processus métier</h3>
<p>Voici un exemple du <em>processus métier</em> gérer la configuration. Étant administrateur système mon métier reste technique, chez d&#8217;autres sociétés, &#8220;Gérer la configuration&#8221; sera plutôt une <em>solution applicative</em> qu&#8217;un <em>processus métier</em>.</p>
<div id="attachment_546" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.asyd.net/wp-content/uploads/2011/03/gestion-de-la-configuration.png"><img src="http://blog.asyd.net/wp-content/uploads/2011/03/gestion-de-la-configuration-300x188.png" alt="" title="gestion-de-la-configuration" width="300" height="188" class="size-medium wp-image-546" /></a><p class="wp-caption-text">iTop : processus métier</p></div>
<h2>La gestion des jobs</h2>
<p>Dans un SI, avec plein de serveurs, il peut être intéressant de pouvoir exécuter des jobs, aussi bien à intervalle régulier, que de manière occasionnelle. Bien entendu, chaque UNIX vient avec un <em>daemon</em> CRON, mais celui-ci est mono serveur, à une syntaxe différente entre les différents UNIX, etc. On pourrait très bien imaginer de gérer les fichiers <em>cron</em> via le logiciel de conformité de configuration, mais cela ne répond qu&#8217;au besoin de jobs réguliers. Pour cette brique, je me suis tourné vers RunDeck. Cet outil est un <em>job scheduler</em> en Java, encore une fois un projet relativement jeune, mais qui profite d&#8217;une grande expérience puisqu&#8217;il est issu des même développeurs que ControlTier, autre outil de <em>job scheduling</em>.  Avec quelques lignes de développement PHP, RunDeck utilise iTop pour obtenir la liste des nodes (serveurs), et utilise une notion de tags dans iTop, pour rajouter par exemple le tag <em>puppet</em> que je défini sur les serveurs où l&#8217;agent est installé.</p>
<h2>La conformité de la configuration</h2>
<p>Chers lecteurs, étant donné que vous êtes en grande majorité des administrateurs systèmes, je vais passer outre la description de Puppet. Pour les autres, en quelques mots, c&#8217;est un outil qui permet de s&#8217;assurer que des classes de serveurs soient configurés de la même manière, par exemple en forçant la présence de tel ou tel package, que le fichier <em>/etc/sshd/sshd_config</em> soit identique, et ce à partir d&#8217;un fichier maître, etc. Par défaut, un <em>daemon</em> est présent sur chaque nœud, mais pour ma part j&#8217;ai choisi de ne pas l&#8217;utiliser, et d&#8217;exécuter l&#8217;agent via un job RunDeck (avec mon fameux tag). Cela me permet de centraliser via la WebUI de RunDeck la sortie des différentes instances des agents, et également de pouvoir exécuter l&#8217;agent avant d&#8217;attendre le prochain <em>scheduling</em></p>
<h2>La gestion de l&#8217;inventaire</h2>
<p>Jusqu&#8217;ici, j&#8217;ai déclaré mes serveurs (grosso modo nom, adresse IP, informations SSH) dans iTop, mais j&#8217;aimerais bien avoir un inventaire plus précis, comme par exemple la liste des packages installés, la quantité de mémoire, etc. Ça tombe bien, il existe un outil performant pour faire l&#8217;inventaire d&#8217;une machine UNIX, à savoir FusionInventory. Et vous allez me demander, comment intégrer tout ça ? (en fait, je me doute que vous l&#8217;aurez déjà deviné). Tout simplement en forçant la présence du paquetage via Puppet, et l&#8217;exécution d&#8217;un inventaire toujours via Puppet (j&#8217;aurais pu également le faire via RunDeck cependant). Ensuite, je collecte le XML que génère FusionInventory, je lui applique quelques XSL, et j&#8217;intègre le résultat dans iTop, et tout ça de manière automatique. Voila, la boucle est bouclée.</p>
<h2>Pour résumer</h2>
<div id="attachment_548" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.asyd.net/wp-content/uploads/2011/03/all-components.png"><img src="http://blog.asyd.net/wp-content/uploads/2011/03/all-components-300x119.png" alt="" title="all-components" width="300" height="119" class="size-medium wp-image-548" /></a><p class="wp-caption-text">Les liens entre les composants</p></div>
<h2>Et demain ?</h2>
<p>Et bien, demain, je vais coupler de manière plus forte iTop et puppet. Avec un peu de travail, mais rien de bien compliqué, je vais pouvoir faire en sorte que iTop soit l&#8217;origine d&#8217;une partie de la configuration, notamment celle métier. L&#8217;objectif est par exemple, via iTop, de créer une nouvelle instance Tomcat sur un serveur, et que puppet assure son installation (je le fais déjà, mais via les fichiers de configuration puppet).</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.asyd.net/2011/03/un-si-propre-avec-itop-rundeck-puppet-fusioninventory/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Makefile et squelette qui va bien pour docbook vers PDF</title>
		<link>http://blog.asyd.net/2011/03/makefile-et-squelette-qui-va-bien-pour-docbook-vers-pdf/</link>
		<comments>http://blog.asyd.net/2011/03/makefile-et-squelette-qui-va-bien-pour-docbook-vers-pdf/#comments</comments>
		<pubDate>Mon, 14 Mar 2011 13:43:52 +0000</pubDate>
		<dc:creator>asyd</dc:creator>
				<category><![CDATA[Business tools]]></category>
		<category><![CDATA[docbook]]></category>

		<guid isPermaLink="false">http://blog.asyd.net/?p=523</guid>
		<description><![CDATA[Étant donné mon futur changement professionnel (vous en saurez plus dans un futur proche), je me suis confronté au problème de la production des documents (principalement technique). Plusieurs solutions s&#8217;offraient à moi, la plus facile, en tant qu&#8217;utilisateur de Mac OS X, est d&#8217;utiliser Pages, de la suite iWork. Bien que ce dernier soit un [...]]]></description>
			<content:encoded><![CDATA[<p>Étant donné mon futur changement professionnel (vous en saurez plus dans un futur proche), je me suis confronté au problème de la production des documents (principalement technique). Plusieurs solutions s&#8217;offraient à moi, la plus facile, en tant qu&#8217;utilisateur de Mac OS X, est d&#8217;utiliser Pages, de la suite iWork. Bien que ce dernier soit un produit très adapté pour produire rapidement un joli document, je trouve que la construction d&#8217;un thème <em>from scratch</em> n&#8217;est pas très facile, et de toute façon, il n&#8217;est utilisable que sous Mac, donc difficile en clientèle par exemple. La seconde solution, est d&#8217;utiliser OpenOffice ou LibreOffice, cependant, après quelques années d&#8217;expériences, je trouve que ce n&#8217;est pas très pratique sur le long terme, de plus, l&#8217;avenir des deux produits me semble incertain, le premier est devenu payant, le second, communautaire, ne me rassure pas quant à son avenir.</p>
<p>Les deux solutions restantes sont <em>docbook</em> et <em>LaTeX</em>. Le dernier, bien que connu pour être très bien, me parait coûteux en temps, principalement sur la personnalisation du rendu (PDF dans mon cas). Me reste donc <em>docbook</em> (si vous êtes anti XML, passé votre chemin). Pour ma part, il me semble absolument indispensable de différencier le contenu de son style (le rendu). Bien que beaucoup   (mais ce n&#8217;est probablement pas votre cas, cher lecteur) pensent que <em>&lt;important&gt;mon texte&lt;/important&gt;</em> soit équivalent à <em>&lt;gras&gt;mon texte&lt;/gras&gt;</em>, ce n&#8217;est pas mon cas. Je peux pouvoir écrire un document (un contenu) à un instant <em>t</em> et le rendre en PDF mais surtout pouvoir modifier le style (couleur du titre, etc.) sans toucher le document d&#8217;origine, et ce plusieurs mois après la rédaction du fichier. C&#8217;est pourquoi je me suis tourné vers <em>docbook</em>.</p>
<p>Après quelques heures <em>perdues</em>, j&#8217;ai réussi à obtenir un squelette de production de mes documents, que je vais décrire dans le présent billet.</p>
<h2>Les fichiers</h2>
<p>Pour commencer, voici la liste des fichiers impliqués dans la production d&#8217;un document&nbsp;: </p>
<ul>
<li><em>documentation.xml</em>, c&#8217;est mon fichier source <em>docbook</em>, le contenu que je veux produire en pdf&nbsp;;</li>
<li><em>default.xsl</em>, ce fichier est une transformation XML (<em>xsl</em>) qui me permet de modifier le fichier <em>docbook</em> d&#8217;origine, pour par exemple rajouter automatique la partie sur l&#8217;auteur si elle n&#8217;est pas présente dans le document d&#8217;origine. Autant essayer de ne pas dupliquer l&#8217;information autant que faire se peut.&nbsp;;</li>
<li><em>monstyle.xsl</em>, c&#8217;est le fichier qui me permet de surcharger la transformation <em>docbook</em> vers <em>FO</em> (une étape intermédiaire avant transformation en PDF). C&#8217;est là que je vais définir les couleurs (ou tout paramètre disponible <a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/">par la XSL de Walsh</a>), ou bien encore surcharger un <em>template</em> précis&nbsp;;</li>
<li>et finalement, un fichier <em>Makefile</em> qui me permet d&#8217;automatiser tout cela.</li>
</ul>
<h2>Le Makefile</h2>
<p>Comme expliqué précédemment, ce fichier me permet d&#8217;automatiser la transformation d&#8217;un fichier <em>docbook</em> vers un fichier PDF. Et comme je galère un peu sur <em>Makefile</em>, je vais profiter de ce billet pour me faire un mémo.</p>
<pre>
DOCUMENTS=documentation.xml

FOP=/Users/bbonfils/tools/fop-1.0/fop
FOP_XSL=xsl/docbook.xsl
FOP_CONF=conf/fop.xconf
DEFAULT_XSL=xsl/default.xsl
XSLTPROC=xsltproc
XMLLINT=xmllint
TMP=tmp
ENV=LC_ALL=en_US.UTF-8
FOP_ENV=FOP_OPTS=-Djava.awt.headless=true

default: $(DOCUMENTS:.xml=.pdf)

%.pdf: %.xml
   $(ENV) $(XSLTPROC) $(DEFAULT_XSL) $? | $(XMLLINT) -format - > $(TMP)/$?
   $(ENV) $(FOP_ENV) $(FOP) -c $(FOP_CONF) -xml $(TMP)/$? -xsl $(FOP_XSL) -pdf $@

clean:
   @rm -f *.pdf
</pre>
<p>Les premières lignes définissent des variables, notamment <em>DOCUMENTS</em> qui me permet de lister les fichiers <em>docbook</em> à transformer en PDF. Ensuite, je défini la règle implicite suivante:&nbsp;:</p>
<pre>
%.pdf: %.xml
   $(ENV) $(XSLTPROC) $(DEFAULT_XSL) $? | $(XMLLINT) -format - > $(TMP)/$?
   $(ENV) $(FOP_ENV) $(FOP) -c $(FOP_CONF) -xml $(TMP)/$? -xsl $(FOP_XSL) -pdf $@
</pre>
<p>qui décrit la manière de <em>compiler</em> (transformer dans mon cas) un fichier XML vers un PDF. La première ligne permet d&#8217;appliquer ma <em>XSL</em> <em>default.xsl</em> qui permet de rajouter les informations de l&#8217;auteur si elles n&#8217;existent pas. La deuxième ligne applique la transformation <em>docbook</em> vers <em>FO</em> puis de <em>FO</em> vers PDF.</p>
<p>Et finalement, je définis la cible par défaut <em>default</em> en lui demande de me transformer la liste des fichiers renseignés par la variable <em>DOCUMENTS</em> en PDF, par substitution de l&#8217;extension.</p>
<p>Voilà, voilà, je dois avouer que ce billet est plus un <em>memento</em> personnel, mais tant qu&#8217;a faire, autant partager avec le monde. Pour les lecteurs avertis, vous aurez remarque que je traite que des fichiers textes qui sont donc parfaitement adaptés pour un gestionnaire de source tel que <em>Subversion</em> ou <em>Git</em>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.asyd.net/2011/03/makefile-et-squelette-qui-va-bien-pour-docbook-vers-pdf/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

