10avr. 2009

Fixing broken portage installations

J'ennoncais dans mon précédent article l'utilisation d'un portage recovery, permettant de continuer à utiliser la commande en cas de problème.

Le script get_portage_back.sh automatisant la mise en place du portage recovery disponible sur la page officielle Gentoo Manually fixing broken portage installations redirigeant à présent vers une erreur 404, voici la source de ce script :

#!/bin/bash
 
python_version=$(python -c 'import sys; print "%02d%02d" % sys.version_info[:2]')
unpack_dir=/var/tmp/portage-unpack
 
die() {
	echo $@
	exit 1
}
 
case "$python_version" in
	0202)
		portage_version=2.0.51.22
		portage_dir=/usr/lib/portage
		;;
	0203)
		portage_version=2.1.1
		portage_dir=/usr/lib/portage
		;;
	0204|0205)
		portage_version=2.1.4
		portage_dir=${HOME}|>/portage-recover
		;;
	0201|0200)
		die "your python version is too old"
		;;
	*)
		die "unknown python version: $python_version"
		;;
esac
 
echo ">>> Found python version ${python_version}, using portage-${portage_version}"
 
tarball="portage-${portage_version}.tar.bz2"
mypath=$(readlink -f $0)
[ -z "${DISTDIR}" ] && DISTDIR=${mypath%/*/*}
mkdir -p "$portage_dir" "$unpack_dir"
 
[ -d "$DISTDIR" ] || DISTDIR=/var/tmp
 
wget -O "${DISTDIR}/${tarball}" "http://distfiles.gentoo.org/distfiles/${tarball}"
 
tar xfj "${DISTDIR}/${tarball}" -C "$unpack_dir" 
unpack_dir=${unpack_dir}|>/portage-${portage_version}|>
 
cp -r "${unpack_dir}"/{pym,bin} "${portage_dir}/"
if [ ! -e /etc/make.globals ]; then
	echo ">>> Restoring /etc/make.globals"
	cp "${unpack_dir}/cnf/make.globals" /etc
fi
 
if [ -e "${unpack_dir}/cnf/sets.conf" -a ! -e /usr/share/portage/config/sets.conf ]; then
	echo ">>> Restoring /usr/share/portage/config/sets.conf"
	mkdir -p /usr/share/portage/config/
	cp -r "${unpack_dir}/cnf/sets.conf" /usr/share/portage/config/
fi
 
echo ">>> Testing if rescue portage works and trying to remerge portage"
export PYTHONPATH="${portage_dir}/pym" 
export PATH="${portage_dir}/bin:${PATH}"
emerge --version > /dev/null && emerge --oneshot portage
if [ "$?" -ne 0 ]; then
	echo "!!! Portage was not remerged correctly"
fi
if [ "${portage_dir}" != /usr/lib/portage ]; then
	echo ">>> The rescue portage has been installed in \$HOME/portage-recover. You can access it"
	echo "    with the following command:"
	echo "    PYTHONPATH=${portage_dir}/pym PATH="${portage_dir}|>/bin:\$PATH" emerge"
	echo "    Of course you can also remove that directory if you've sucessfully remerged portage"
	echo "    and don't need the rescue version anymore."
fi
echo ">>> Cleaning up"
rm -rf "$(dirname ${unpack_dir})"



Script : get_portage_back.sh

10avr. 2009

Emerge IOError: [Errno 21] Is a directory [sys-apps/portage]

J'ai procédé à un upgrade apparemment sans problème de sys-apps/portage-2.1.4.5 vers sys-apps/portage-2.1.6.7.

Finalement au bout de quelques jours j'ai eu besoin d'installer et de mettre à jour un paquet et c'est là que tout ce complique, la fameuse erreur IOError: [Errno 21] Is a directory est apparu.

raga ~ # emerge -av tcpdump
 
These are the packages that would be merged, in order:
 
Calculating dependencies
Traceback (most recent call last):
File "/usr/bin/emerge", line 40, in <module>
retval = _emerge.emerge_main()
File "//usr/lib/portage/pym/_emerge/__init__.py", line 14670, in emerge_main
myopts, myaction, myfiles, spinner)
File "//usr/lib/portage/pym/_emerge/__init__.py", line 13587, in action_build
mydepgraph = depgraph(settings, trees, myopts, myparams, spinner)
File "//usr/lib/portage/pym/_emerge/__init__.py", line 4373, in __init__
pkg_cache=self._pkg_cache)
File "//usr/lib/portage/pym/_emerge/__init__.py", line 1074, in __init__
real_dbapi.flush_cache()
File "//usr/lib/portage/pym/portage/dbapi/vartree.py", line 368, in flush_cache
self._owners.populate() # index any unindexed contents
File "//usr/lib/portage/pym/portage/dbapi/vartree.py", line 748, in populate
self._populate()
File "//usr/lib/portage/pym/portage/dbapi/vartree.py", line 774, in _populate
owners_cache.add(cpv)
File "//usr/lib/portage/pym/portage/dbapi/vartree.py", line 698, in add
contents = self._vardb._dblink(cpv).getcontents()
File "//usr/lib/portage/pym/portage/dbapi/vartree.py", line 1162, in getcontents
myc = open(contents_file,"r")
IOError: [Errno 21] Is a directory

Cette erreur ne donnant rien de concret sur les moteurs de recherches, je me suis tourné vers le chan officiel Gentoo, un problème de compilation avec python a été évoqué, néanmoins je reste sceptique à cette hypothèse, en effet le portage recover en version 2.1.4.5 fonctionne parfaitement. Cependant en l'utilisant je reste limité à l'utilisation de paquet dans la branche EAPI=1.

Je me suis donc intéressé de plus près au fameux dossier /var/db/pkg contenant toutes les informations sur les paquets installés nécessaires à portage. Après suppression de ce dossier (un backup a été effectué), emerge a l'air de fonctionner néanmoins je ne valide pas l'installation du paquet.

En procédant par élimination (d'où l'intérêt du backup), je remonte jusqu'au dossier /var/db/pkg/sys-libs/timezone-data-2006a, après suppression de ce dernier et une réinstallation de sys-libs/timezone-data-2009b, tout fonctionne parfaitement.

30mars 2009

Centralisation des sessions Magento en cluster

magento_logo.jpg
Après avoir effectué quelques recherches sur la centralisation des sessions Magento en cluster, 2 modes ont retenu mon attention.

Le premier mode avec une centralisation par base de données, et le second via un serveur Memcached.

Voici pour les développeurs la syntaxe à adopter pour l'utilisation d'un serveur Memcached via Magento :

<session_save><![CDATA[memcache]]></session_save>
 <session_save_path><![CDATA[tcp://XXX.XXX.XXX.XXX:11211?persistent=1&weight=2&timeout=10&retry_interval=10]]></session_save_path>
 <session_cache_limiter><![CDATA[]]></session_cache_limiter>
 <cache>
     <backend>memcached</backend>
     <memcached>
  <servers>
      <server>
   <host><![CDATA[XXX.XXX.XXX.XXX]]></host>
   <port><![CDATA[11211]]></port>
   <persistent><![CDATA[0]]></persistent>

Je ne suis pas du tout développeur donc si vous avez des améliorations, des conseils n'hésitez pas ;) Par ailleurs je rappel que Magento est une vraie usine à gaz et qu'il existe sur la toile une foule de conseils afin de l'optimiser.

Lien :

Session-cache-limiter

26mars 2009

Solutions Linux 2009

Information de dernière minute, nous ne devions pas être présent au salon en tant qu'exposant mais finalement nous avons en dernière minute changé d'avis.

SD-France sera donc cette année encore de la partie.

Je vous donne donc rendez vous au salon Solutions Linux qui aura lieu le 31 mars, 1er et 2 avril 2009 à la Porte de Versailles, nous exposerons au stand A10 situé à l'entrée du salon ainsi vous n'aurez aucune excuses pour ne pas passer nous voir ;)

Demandez donc votre badge dès maintenant : Pré-enregistrement

23févr. 2009

Présentation du datacenter Equinix

Bonjour,

Une partie de nos serveurs dédiés sont situés sur le datacenter Equinix Saint-Denis mais régulièrement on me pose la question suivante :

Où sont hébergés vos serveurs ?

Je vous propose donc de consulter ce lien détaillant de manière assez brèves nos baies présentes sur le Datacenter Equinix Saint-Denis.

Il est à noter que nous disposons d'un total de 3 suites privatives, ces photos proviennent de notre dernière suite dans laquelle il ne reste que peu de disponibilité au vu des tarifs proposés.

N'hésitez donc pas à me contacter si vous désirez une offre d'hébergement (U, 1/4 de baie, 1/2 Baie, Baie).

Lien : Baie SD-France Datacenter Equinix St-Denis

29janv. 2009

Utilisation Mysql SSL

mysql_logo.gif
Par défaut, MySQL utilise une connexion en clair entre le client et le serveur. Cela signifie qu'une personne peut surveiller votre trafic, et lire les données échangées. Cette personne pourrait aussi modifier les données qui transitent entre le client et le serveur. Parfois, vous aurez besoin d'échanger des informations sur un réseau public, mais en sécurisant ces informations. Dans ce cas, utiliser une connexion sans protection est inacceptable.

SSL est un protocole qui utilise différents algorithmes de chiffrement pour s'assurer que les données qui transitent par un réseau public peuvent être considérées comme fiables. Ce protocole dispose de méthodes pour s'assurer que les données n'ont pas été modifiées, ce que soit par une altération, une perte ou une répétition des données. SSL inclut aussi des algorithmes pour reconnaître et fournit des outils de vérifications d'identité, pris en charge par le standard X509.

Le chiffrement est une méthode pour rendre des données illisibles. En fait, les pratiques actuelles requièrent d'autres éléments de sécurité issus des algorithmes de chiffrement. Ils doivent savoir résister à de nombreux types d'attaque, comme la modification de l'ordre des messages ou les répétitions inopinées.

X509 est un standard qui rend possible l'identification d'une personne sur l'internet. Il est particulièrement utilisé pour les applications e-commerce. En termes simples, il doit y avoir une entreprise (appelée l'``autorité de certification'') qui assigne un certificat électronique à toute personne qui en a besoin. Ces certificats utilisent un chiffrement assymétrique qui exploitent deux clés de chiffrement, une clé publique et une clé privée. Le propriétaire d'un certificat peut prouver son identité en montrant son certificat à l'autre partie. Un certificat est constitué de la clé publique du propriétaire. Toute donnée qui est chiffrée avec cette clé publique doit être déchiffrée avec la clé secrète correspondante, qui est détenue par le propriétaire du certificat.

MySQL n'utilise pas les connexions chiffrées par défaut, car cela ralentit considérablement le protocole de communication. Toute fonctionnalité supplémentaire requiert du travail supplémentaire de la part du serveur, et chiffrer des données est une tâche particulièrement coûteuse, qui peut ralentir considérablement les tâches principales de MySQL. Par défaut, MySQL est paramétré pour être aussi rapide que possible.

A savoir :

MySQL permet de faire du cas par cas. Il est possible de n'activer SSL que pour certains utilisateurs ou encore de permettre des communications sécurisées avec un utilisateur sans vérifier l'authenticité du client.

Vérification du support ssl :

Afin de savoir si un serveur MySQL possède le support pour SSL, il suffit de s'y connecter et de taper la requête suivante :

mysql> SHOW VARIABLES LIKE 'have_openssl';
+------------------+-------------+
| Variable_name |     Value    |
+------------------+-------------+
| have_openssl  | DISABLED | 
+------------------+-------------+
1 row IN SET (0.00 sec)

Le support est disponible mais non actif.

Activation du support ssl et création des certificats

Tout les certificats doivent être en format "pem" (X509 en base-64)

  • On prépare le terrain

1) On crée le répertoire

mkdir -p /etc/ssl/mysql/private
mkdir /etc/ssl/mysql/newcerts/
cd /etc/ssl/mysql

2) Création des fichiers nécessaires : database, serial

touch /etc/ssl/mysql/index.txt
echo "01" > /etc/ssl/mysql/serial

3) Préparation d'un openssl.cnf alternatif

srv94 mysql # cp -av /etc/ssl/openssl.cnf ./       
`/etc/ssl/openssl.cnf' -> `./openssl.cnf'

4) On modifie openssl.cnf

srv94 mysql # diff /etc/ssl/openssl.cnf ./openssl.cnf 
37c37
< dir		= ./demoCA		# Where everything is kept
---
> dir		= /etc/ssl/mysql/	# Where everything is kept
  • Génération du certificat d'autorité (CA) :
srv94 mysql # openssl req -new -x509 -keyout /etc/ssl/mysql/private/cakey.pem -out /etc/ssl/mysql/cacert.pem -config /etc/ssl/mysql/openssl.cnf
Generating a 1024 bit RSA private key
................++++++
..........................++++++
writing new private key to '/etc/ssl/mysql/private/cakey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:FR
State or Province Name (full name) [Some-State]:Seine Saint-Denis
Locality Name (eg, city) []:Saint-Denis
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Euro-Web SARL
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:srv94.sd-france.net
Email Address []:xxxxxxx@xxxxx.xx
  • On génère la clé privée du serveur ainsi qu'une demande de certificat :
srv94 mysql # openssl req -new -keyout /etc/ssl/mysql/server-key.pem -out /etc/ssl/mysql/server-req.pem -days 3600 -config /etc/ssl/mysql/openssl.cnf
Generating a 1024 bit RSA private key
.......................................++++++
............++++++
writing new private key to '/etc/ssl/mysql/server-key.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:FR
State or Province Name (full name) [Some-State]:Seine Saint-Denis
Locality Name (eg, city) []:Saint-Denis
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Euro-Web SARL
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:srv94.sd-france.net
Email Address []:xxxxxxx@xxxxx.xx
 
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
  • On supprime la passphrase de la clé :
srv94 mysql # openssl rsa -in /etc/ssl/mysql/server-key.pem -out /etc/ssl/mysql/server-key.pem
Enter pass phrase for /etc/ssl/mysql/server-key.pem:
writing RSA key
  • Signature par l'autorité de certification (CA) du certificat serveur :
srv94 mysql # openssl ca  -policy policy_anything -out /etc/ssl/mysql/server-cert.pem -config /etc/ssl/mysql/openssl.cnf -infiles /etc/ssl/mysql/server-req.pem
Using configuration from /etc/ssl/mysql/openssl.cnf
Enter pass phrase for /etc/ssl/mysql//private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: Feb 12 17:55:14 2009 GMT
            Not After : Feb 12 17:55:14 2010 GMT
        Subject:
            countryName               = FR
            stateOrProvinceName       = Seine Saint-Denis
            localityName              = Saint-Denis
            organizationName          = Euro-Web SARL
            commonName                = srv94.sd-france.net
            emailAddress              = xxxxxxx@xxxxx.xx
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                CC:D2:B4:BF:DD:7F:07:9D:46:5F:22:3B:4D:A4:8C:08:D6:C2:EB:B7
            X509v3 Authority Key Identifier: 
                keyid:54:F0:E4:EF:61:E0:05:70:F1:24:82:B2:06:69:60:83:01:4E:27:16
 
Certificate is to be certified until Feb 12 17:55:14 2010 GMT (365 days)
Sign the certificate? [y/n]:y
 
 
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
  • On génère la clé privée du client ainsi qu'une demande de certificat :
srv94 mysql # openssl req -new -keyout /etc/ssl/mysql/client-key.pem -out /etc/ssl/mysql/client-req.pem -days 3600 -config /etc/ssl/mysql/openssl.cnf
Generating a 1024 bit RSA private key
..............++++++
...................................++++++
writing new private key to '/etc/ssl/mysql/client-key.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:FR
State or Province Name (full name) [Some-State]:Paris
Locality Name (eg, city) []:Paris
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Euro-Web
Organizational Unit Name (eg, section) []:SD-France
Common Name (eg, YOUR name) []:blog.yacoubi.fr
Email Address []:xxxxx@xxx.xx
 
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
  • On supprime la passphrase
srv94 mysql # openssl rsa -in /etc/ssl/mysql/client-key.pem -out /etc/ssl/mysql/client-key.pem
Enter pass phrase for /etc/ssl/mysql/client-key.pem:
writing RSA key
  • Et enfin on signe par le CA le certificat
srv94 mysql # openssl ca  -policy policy_anything -out /etc/ssl/mysql/client-cert.pem -config /etc/ssl/mysql/openssl.cnf -infiles /etc/ssl/mysql/client-req.pem
Using configuration from /etc/ssl/mysql/openssl.cnf
Enter pass phrase for /etc/ssl/mysql//private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 2 (0x2)
        Validity
            Not Before: Feb 12 18:07:44 2009 GMT
            Not After : Feb 12 18:07:44 2010 GMT
        Subject:
            countryName               = FR
            stateOrProvinceName       = Paris
            localityName              = Paris
            organizationName          = Euro-Web
           organizationalUnitName          = SD-France
            commonName                = blog.yacoubi.fr
            emailAddress              = xxxxx@xxx.xx
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                09:76:3A:FC:BF:58:34:42:CF:54:CE:23:81:63:C4:13:A3:4F:CD:5B
            X509v3 Authority Key Identifier: 
                keyid:54:F0:E4:EF:61:E0:05:70:F1:24:82:B2:06:69:60:83:01:4E:27:16
 
Certificate is to be certified until Feb 12 18:07:44 2010 GMT (365 days)
Sign the certificate? [y/n]:y
 
 
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

Configuration du serveur :

On modifie la configuration de MYSQL

[mysqld]
ssl-ca=/etc/ssl/mysql/cacert.pem
ssl-cert=/etc/ssl/mysql/server-cert.pem
ssl-KEY=/etc/ssl/mysql/server-KEY.pem

On vérifie que SSL est bien activé

mysql> SHOW VARIABLES LIKE 'have_openssl';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| have_openssl  | YES   | 
+------------------+-------+
1 row IN SET (0.00 sec)

Pour la suite tout se fera à la ligne de commande, vous pouvez bien entendu configuré /etc/mysql/my.cnf en conséquence

[client]
ssl-ca = /etc/ssl/mysql/cacert.pem
ssl-cert = /etc/ssl/mysql/client-cert.pem
ssl-KEY = /etc/ssl/mysql/client-KEY.pem

On crée/modifie un utilisateur pour forcer le SSL

REVOKE ALL PRIVILEGES ON `mohamed`.* FROM 'mohamed'@'%'; GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, EXECUTE ON `mohamed`.* TO 'mohamed'@'%' REQUIRE SSL;

Un test pour une connexion standard nous permet de vérifier que SSL est bien requis

blog ~ # mysql -umohamed -pssl -hsrv94
ERROR 1045 (28000): Access denied for user 'mohamed'@'localhost' (using password: YES)

Un nouveau test en précisant le CA, on constate que la connexion s'établie

blog ~ # mysql -umohamed -pssl --ssl-ca=/etc/mysql/ca-cert.pem -hsrv94
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 101
Server version: 5.0.70 Gentoo Linux mysql-5.0.70-r1
 
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
 
mysql>

Voici la différence entre la version non SSL et SSL obtenu en sniffant

mysqlsniffer listening for MySQL on interface eth0 port 3306
78.41.233.209.60024 > server: ID 0 len 1 COM_QUIT
server > 78.41.233.209.60025: ID 0 len 52 Handshake <proto 10 ver 5.0.70 thd 17> 
78.41.233.209.60025 > server: ID 1 len 61 Handshake (new auth) <user mohamed db (null) max pkt 16777216> 
server > 78.41.233.209.60025: ID 2 len 7 OK <fields 0 affected rows 0 insert id 0 warnings 0> 
78.41.233.209.60025 > server: ID 0 len 33 COM_QUERY: select @@version_comment limit 1
server > 78.41.233.209.60025: ID 1 len 1 1 Fields
        ID 2 len 39 Field: ..@@version_comment <type var string (509) size 28>
        ID 3 len 5 End <warnings 0> 
        ID 4 len 29 || Gentoo Linux mysql-5.0.70-r1 ||
        ID 5 len 5 End <warnings 0>

mysqlsniffer listening for MySQL on interface eth0 port 3306
server > 78.41.233.209.60302: ID 0 len 52 Handshake <proto 10 ver 5.0.70 thd 21> 
78.41.233.209.60302 > server: ID 1 len 32 Handshake (new auth) <user  db (null) max pkt 16777216> 
78.41.233.209.60302 > server: ::FRAGMENT END::
server > 78.41.233.209.60302: 
        ::FRAGMENT START::
        ::FRAGMENT END::
78.41.233.209.60302 > server: 
        ::FRAGMENT START::
        ::FRAGMENT END::
server > 78.41.233.209.60302: 
        ::FRAGMENT START::
        ::FRAGMENT END::
78.41.233.209.60302 > server: 
        ::FRAGMENT START::
        ::FRAGMENT END::
server > 78.41.233.209.60302: 
        ::FRAGMENT START::
        ::FRAGMENT END::
78.41.233.209.60302 > server: 
        ::FRAGMENT START::
        ::FRAGMENT END::
server > 78.41.233.209.60302: 
        ::FRAGMENT START::
        ::FRAGMENT END::

Il est à noter que cette option active juste le cryptage, on teste avec un fichier pris au hasard sur le système

blog ~ # mysql -umohamed -pssl --ssl-ca=/root/LISEZMOI.TXT -hsrv94
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 103
Server version: 5.0.70 Gentoo Linux mysql-5.0.70-r1
 
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
 
mysql>

C'est bien beau de chiffré mais si n'importe quelle fichier peut faire office de CA ça limite l'intérêt. Nous allons donc forcer l'utilisation d'un certificat valide, donc signé

REVOKE ALL PRIVILEGES ON `mohamed`.* FROM 'mohamed'@'%'; GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, EXECUTE ON `mohamed`.* TO 'mohamed'@'%' REQUIRE X509;

On test de nouveau

blog ~ # mysql -umohamed -pssl  -hsrv94                                  
ERROR 1045 (28000): Access denied for user 'mohamed'@'localhost' (using password: YES)
blog ~ # mysql -umohamed -pssl --ssl-ca=/root/LISEZMOI.TXT -hsrv94
ERROR 1045 (28000): Access denied for user 'mohamed'@'localhost' (using password: YES)
blog ~ # mysql -umohamed -pssl --ssl-ca=/etc/ssl/mysql/ca-cert.pem -hsrv94
ERROR 1045 (28000): Access denied for user 'mohamed'@'localhost' (using password: YES)

C'est parfait, on test à présent avec le certificat signé par la CA

blog ~ # mysql -umohamed -pssl --ssl-ca=/etc/ssl/mysql/ca-cert.pem --ssl-cert=/etc/ssl/mysql/client-cert.pem --ssl-key=/etc/ssl/mysql/client-key.pem -hsrv94
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 109
Server version: 5.0.70 Gentoo Linux mysql-5.0.70-r1
 
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
 
mysql>

Et voila ca fonctionne, le seul bémol est que pour le moment il n'est pas possible de définir un certificat pour un utilisateur précis.

Il est à noter que nous pouvons ajouter d'autres options afin d'accroître la sécurité :

REQUIRE ISSUER "issuer" restreint les tentatives de connexion : le client doit se présenter avec un certificat X509 valide, émis par l' autorité de certification "issuer". Utiliser un certificat X509 implique obligatoirement des chiffrements, donc l'option SSL est sous entendue.

REQUIRE SUBJECT "subject" impose au client d'avoir un certificat X509 valide, avec le sujet "subject". Si le client présente un certificat valide, mais que le "subject" est différent, la connexion est refusée.

REQUIRE CIPHER "cipher" est utilisé pour s'assurer que les chiffrements sont suffisamment robuste, et que la bonne longueur de clé est utilisée. SSL lui même peut être faible si des algorithmes sont utilisés avec des clés courtes. En utilisant cette option, il est possible d'imposer la méthode de chiffrement avec la connexion.

Les options SUBJECT, ISSUER et CIPHER peuvent être combinées avec la clause REQUIRE.

Lien : Mysql secure connections

14déc. 2008

Chiffrement du filesystem complet (dm-crypt,luks)

Suite à mon billet du 26 Mai 2008 , je vais comme promis procéder au chiffrement complet (hors /boot) de mon laptop toujours grâce à dm-crypt. Sans le mot de passe associé (passphrase), le portable ne pourra booter.

Bien entendu, nous utiliserons toujours la norme LUKS (Linux Unified Key Setup) :

Le projet LUKS, développé par Clemens Fruhwirth de l’université de Vienne, vise à standardiser le chiffrement de systèmes de fichiers par la définition et l’implémentation d’un format standard.

En fournissant une norme sur l'encryption disque, il ne se contente pas de faciliter la compatibilité entre les distributions, mais aussi fournir une gestion sûre des multiples mots de passe utilisateur.

Prérequis :

     1. Kernel :
Device Drivers --> RAID and LVM Support --> 
[*] Multiple devices driver support (RAID and LVM)           
<*> Device mapper support
<*> Crypt target support
 Cryptographic Options --> 
 <*> AES cipher algorithms (x86_64)
 <*>   SHA256 digest algorithm
 <*>   SHA384 and SHA512 digest algorithms
     2. Outil :
sys-fs/cryptsetup

Mise en place :

Nous allons supprimé toutes les trace des données qui sont actuellement sur le disque dur. Il existe des outils dit de "forensic" comme TCT, qui peuvent retrouver des données effacées. Une donnée sur un disque dur disparait au bout d'environ sept écritures au même endroit, il existe un outil nommé shred (sys-apps/coreutils) qui effectue se genre de chose.

shred -n 10 -v /dev/sda2
shred -n 10 -v /dev/sda3
shred -n 10 -v /dev/sda4

Shred n'etant pas efficace pour la génération d'entropie (reproduit toujours la même séquence), on va donc généré de l'entropie depuis /dev/urandom

dd if=/dev/urandom of=/dev/sda2
dd if=/dev/urandom of=/dev/sda3
dd if=/dev/urandom of=/dev/sda4

On crée à présent la partition crypté LUKS en y définissant une passphrase.

cryptsetup -y --cipher aes-cbc-essiv:sha256  --key-size 256 luksFormat /dev/sda4

On dévérouille la partition crypté

cryptsetup luksOpen /dev/sda4 racine

luksOpen créé un mapping pour la partition crypté, /dev/sda4 devient /dev/mapper/racine. On formate ce mapping (par ailleurs je revient en ext3).

mke2fs -j /dev/mapper/racine

Je crée le cryptage de la swap

cryptsetup -d /dev/urandom create swap /dev/sda3

Je formate la swap

mkswap /dev/mapper/swap

Je prépare la partition /boot

mke2fs /dev/sda2

On monte les partitions de manière classique

mount /dev/mapper/racine /mnt/gentoo
mkdir /mnt/gentoo/boot
mount /dev/sda2 /mnt/gentoo/boot

Je restaure mes données :)

tar xvjpf backup.tar.bz2 -C /mnt/gentoo

On configure le fstab

/dev/sda2	/boot	ext2	noauto,noatime	1 2
/dev/mapper/racine	/	ext3	noatime	0 1
/dev/mapper/swap	none	swap	sw	0 0
shm/dev/shm	tmpfs	nodev,nosuid,noexec	0 0

On déclare les partitions crypté pour le device mapper

  • /etc/conf.d/dmcrypt
swap=swap
source='/dev/sda3'
target=racine    
source='/dev/sda4'

On va créer l'initramfs

1) On crée la structure

cd /mnt/
mkdir -p work/initramfs/{bin,sbin,etc,proc,sys,newroot}
cd work
touch initramfs/etc/mdev.conf

2) Mise en place de busybox

wget http://blog.yacoubi.fr/scripts/busybox/busybox-1.10.1-static.bz2 -O - | bunzip2 > initramfs/bin/busybox
chmod +x initramfs/bin/busybox
ln -s busybox initramfs/bin/sh

3) Mise en place du script d'init

touch initramfs/init
chmod +x initramfs/init
  • initramfs/init
#!/bin/sh
 
#Mount things needed by this script
mount -t proc proc /proc
mount -t sysfs sysfs /sys
 
#Disable kernel messages from popping onto the screen
echo 0 > /proc/sys/kernel/printk
 
#Clear the screen
clear
 
#Create all the symlinks to /bin/busybox
busybox --install -s
 
#Create device nodes
mknod /dev/null c 1 3
mknod /dev/tty c 5 0
mdev -s
 
#Function for parsing command line options with "=" in them
# get_opt("init=/sbin/init") will return "/sbin/init"
get_opt() {
	echo "$@" | cut -d "=" -f 2
}
 
#Defaults
init="/sbin/init"
root="/dev/mapper/racine"
enc_root=/dev/sda4
 
#Process command line options
for i in $(cat /proc/cmdline); do
	case "${i}" in
		root\=*)
			root=$(get_opt $i)
			;;
		init\=*)
			init=$(get_opt $i)
			;;
		enc_root\=*)
			enc_root=$(get_opt $i)
			;;
	esac
done
 
#Open encrypted partition to create /dev/mapper/racine
cryptsetup luksOpen "${enc_root}" racine
if [ $? -ne 0 ]
then
exec /sbin/halt
else
#Mount the root device
mount "${root}" /newroot
fi
#Unmount all other mounts so that the ram used by
#the initramfs can be cleared after switch_root
umount /sys /proc
 
#Switch to the new root and execute init
if [[ -x "/newroot/${init}" ]] ; then
	exec switch_root /newroot "${init}"
fi
 
#This will only be run if the above line failed
echo "Failed to switch_root, dropping to a shell"
exec sh

4) Copie de l'executable cryptsetup

cp /sbin/cryptsetup initramfs/bin/

5) Construction de l'image

cd initramfs
find . | cpio -H newc -o > ../initramfs.cpio
cd ..
cat initramfs.cpio | gzip > initramfs.igz

6) Configuration de grub

title=Gentoo Linux
root (hd0,1)
kernel /boot/linux
initrd /initramfs.igz

A présent on redémarre, la passphrase devrait vous être demandé, à ce sujet la configuration clavier sera alors en QWERTY et non en AZERTY donc attention au caractère spéciaux. Votre filesystem ainsi que votre swap sont à présent crypté ;)

Lien utile :

Luks Official Web Site

28oct. 2008

Erreur lors d'un dump Mysql "File './nav_almo7tar1381/nuke_video_stream_settings.MYD' not found (Errcode: 24) "

mysql_logo.gif
Une erreur assez récurrente a lieu sur certains de nos serveurs Mysql assez chargés , lors du dump journalier. Voici un exemple de cette erreur :

nav_allkille260 - dumping : mysqldump: Got error: 1105: File './nav_allkille260/xoops1_image.MYD' NOT found (Errcode: 24) when USING LOCK TABLES
nav_almo7tar1300 - dumping : mysqldump: Got error: 1017: Ne peut trouver le fichier: './nav_almo7tar1300/nuke_webcams_cat.frm' (Errcode: 24) when USING LOCK TABLES
nav_almo7tar1381 - dumping : mysqldump: Got error: 1105: File './nav_almo7tar1381/nuke_video_stream_settings.MYD' NOT found (Errcode: 24) when USING LOCK TABLES
nav_bak931417 - dumping : mysqldump: Got error: 1016: Ne peut ouvrir le fichier: 'forum_baksearch_wordlist.MYI'. (Errcode: 145) when USING LOCK TABLES
nav_toutsurl - dumping : mysqldump: Got error: 1105: File './nav_toutsurl/phpbb_themes.MYD' NOT found (Errcode: 24) when USING LOCK TABLES

Avec le temps on s'aperçoit que les tables indiquée dans l'erreur ne sont pas toujours les même, on peut donc exclure une table corrompue. Le problème est en réalité très simple, le nombre de fichiers ouverts par MySQL dépasse la limite maximale définie par open_files_limit. En théorie cela peut également poser problème lors de l'utilisation du serveur, néanmoins ces serveurs hébergeant la partie Mysql pour des petits sites internet aucun problème n'est à déplorer hormis durant les backups.

Une fois cette option modifié dans le fichier de configuration Mysql, le problème est résolue.

  • /etc/mysql/my.cf
set-variable    = open_files_limit=3000

08sept. 2008

How To Roundcube

roundcube_logo.png
Habituellement j'utilise Squirrelmail, néanmoins ce dernier commence à m'ennuyer (par habitude je vous rassure) j'ai donc décidé de le remplacer par Roundcube.

RoundCube Webmail (RC) est un client Webmail IMAP multilingue basé sur les standards du web, et doté d'une interface utilisateur lui donnant l'aspect d'une application "client lourd" classique. Il contient toutes les fonctionnalités que vous pouvez attendre d'un client de messagerie électronique, notamment le support des types MIME, un carnet d'adresse, la manipulation des dossiers IMAP, la recherche de messages, et la vérification orthographique. RoundCube Webmail est écrit en PHP et nécessite une base de données MySQL. L'interface utilisateur est entièrement personnalisable, via l'utilisation de XHTML et de CSS2.

Roundcube fournit une interface de votre système de messagerie via le web. Il contient toutes les fonctionnalités que vous pourriez attendre d'un client E-Mail moderne, notamment les carnets d'adresse et la manipulation des dossiers IMAP. RoundCube est aussi fortement personnalisable. Vos administrateurs système peuvent écrire et installer des thèmes pour que cela convienne à votre identité de marque.

On prépare les sources

cd /home/public/www/;
svn checkout https://svn.roundcube.net/trunk/roundcubemail roundcube;

On crée la base de donnée et le user

CREATE USER 'db_roundcube'@'%' IDENTIFIED BY '****************';
GRANT USAGE ON * . * TO 'db_roundcube'@'%' IDENTIFIED BY '****************' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;
CREATE DATABASE `db_roundcube` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;
GRANT SELECT , INSERT , UPDATE , DELETE , CREATE , DROP , INDEX , ALTER , CREATE TEMPORARY TABLES , LOCK TABLES , CREATE VIEW , SHOW VIEW , CREATE ROUTINE, ALTER ROUTINE, EXECUTE ON `db\_roundcube` . * TO 'db_roundcube'@'%';

On importe la structure de la base

mysql -u root -p db_roundcube < /home/public/www/roundcube/SQL/mysql5.initial.sql

On configure roundcube

  • /home/public/www/roundcube/config/db.inc.php
$rcmail_config['db_dsnw'] = 'mysql://db_roundcube:xxxxxxxxxxxxxxx@localhost/db_roundcube';
  • /home/public/www/roundcube/config/main.inc.php
$rcmail_config['default_host'] = 'localhost';
$rcmail_config['des_key'] = 'clé aléatoire de 24 caractères';
$rcmail_config['language'] = 'fr_FR';

On supprime à présent les fichiers inutiles

rm -r /home/public/www/roundcube/installer;
rm -r /home/public/www/roundcube/SQL;

08sept. 2008

How To Waeco MS-50 sur Ford Focus

Une fois n'est pas coutume et pour prouver que j'ai une vie à côté, je vais vous faire un How To du montage de l'installation du régulateur de vitesse Waeco MS-50 sur mon véhicule. Le montage date de Juin 2008.

Voici la liste des opérations à effectuer :

- Débrancher la batterie
- Fixer le servo-mécanisme
- Démonter le boîtier papillon
- Fixer le câble d'accélérateur
- Vérifier le fonctionnement des câbles d'accélérateur
- Remontage du boîtier papillon
- On teste de nouveau
- On se raccorde à la dépression
- On fixe le module électronique dans l'habitacle, on peut également sectionner le shunt noir
- On raccorde le câble noir, blanc, rouge au servo-mécanisme
- On relie le câble vert à la masse
- On relie le câble Orange au +12V après contact (Je me suis raccorder sur le commodo des phares)
- On relie les câbles marron et marron/blanc au contacteur de freinage (marron/blanc doit normalement être relié directement au +12V permanent mais je me contente du +12 après contact de la pédale de frein)
- On pose le commodo de commande
- On raccorde le commodo
- On relie le câble bleu à l'info compte tour (connecteur AVC de l'autoradio), le câble noir ne sert à rien
- On effectue les tests du manuel

L'aperçu du montage en image :

La partie moteur :

1) Le colis

Colis Waeco MS50

2) Le contenu du paquet, le régulateur et de la doc commerciale (en allemand)

Contenu Waeco MS50

3) Les différentes pièces

Piece Waeco MS50

4) Les pièces préparés avant montage

Avant montage Waeco MS50

5) On démonte intégralement la batterie et l'admission au niveau du filtre à air

Demontage Waeco MS50

6) On fixe le servo-mécanisme

Fixation Waeco MS50 Fixation Waeco MS50

7) On démonte le boîtier papillon afin d'accéder au câble d'accélérateur

papillon waeco MS50

8) On fixe le câble du servo-mécanisme au câble d'accélérateur, le branchement se fait en parallèle et l'angle entre les 2 câbles ne doit pas excéder les 20°

Servo-Mecanisme Waeco MS50

9) Voici une vue d'ensemble une fois les taches ci-dessus effectuées

Vue ensemble Waeco MS50

10) Voici une vue du câble d'accélérateur ainsi que celui du servo-mécanisme

Accelerateur waeco ms50 Accelerateur waeco ms50

11) On coupe la durite de dépression afin de raccorder le T fourni, une fois le montage effectuée n'hésitez à tester l'étanchéité avec l'eau savonneuse (le moteur doit bien entendu tourner)

depression waeco MS50 Depression waeco MS50

La partie électrique (cette partie sera très brève vu sa simplicité il suffit de suivre le manuel fourni) :

12) Le faisceau de câble du servo-mécanisme passe de la façon suivante

Elec Waeco MS50 Elec Waeco MS50

13) Voici le commodo de commande

Commodo Waeco MS50

14) Un aperçu des câblages

Cablage Waeco MS50

15) Voici le boîtier électronique de commande, je l'ai installé du coté passager, derrière la boite à gants

Commande Waeco MS50

16) Voici où j'ai récupéré l'info compte tour, tout simplement sur le câble AVC de l'autoradio (C6 de mémoire)

Capteur vitesse Waeco MS50

Petite particularité :


- Je ne précise pas le montage du disjoncteur jumelé qui permet lors de l'embrayage de désactiver le régulateur tout simplement parce que je suis fainéant et que je ne l'ai pas monté, et étant donnée que je connaît le risque d'embrayer avec le RV activé je ne le ferais pas. Je précise également que j'ai essayé de couplé le connecteur d'embrayage à celui des freins mais cette solution ne fonctionne pas car l'embrayage utilise du 5V (voir câblage électrique de la notice pour comprendre)
- Il est nécessaire de sectionner le câble noir sur le boîtier électronique afin de lui permettre gérer les impulsions du signal AVC (regarder la notice pour plus d'explication)
- Bien entendu à chaque étape du montage mécanique, il est nécessaire de procéder à de multiples test.

Le régulateur est à présent fonctionnel sur mon véhicule (5000Km parcouru depuis), ce dernier est réglé sur Haute sensibilité.

Edit du 27/02/2010 :


Montage du disjoncteur jumelé pour l'embrayage

- page 4 de 5 -