FreeBSD : jail PostgreSQL

Pour pouvoir exécuter un serveur PostgreSQL sous une jail FreeBSD, il est nécessaire d’autoriser le support de la mémoire partagée (SHM). Il convient d’activer le flag dans /etc/rc.conf :

jail_sysvipc_allow="YES"

Si cela n’est pas fait, l’initialisation de l’espace de stockage échoue de cette façon :

sql# /usr/local/etc/rc.d/postgresql oneinitdb
The files belonging to this database system will be owned by user "pgsql".
This user must also own the server process.</p>
The database cluster will be initialized with locale C.
The default text search configuration will be set to "english".
creating directory /usr/local/pgsql/data ... ok
creating subdirectories ... ok
selecting default max_connections ... 10
selecting default shared_buffers ... 400kB
creating configuration files ... ok
creating template1 database in /usr/local/pgsql/data/base/1 ... FATAL:  could not create shared memory segment: Function not implemented
DETAIL:  Failed system call was shmget(key=1, size=1622016, 03600).
child process exited with exit code 1
initdb: removing data directory "/usr/local/pgsql/data"

Sphider : patch pour connexion SQL non persistante

Sphider est un indexeur et un moteur de recherche PHP, intégrable idéalement dans de petits sites Web. J’ai remarqué que l’outil utilisait une connexion SQL persistante, ce qui est problématique dans le cas d’un serveur mutualisé.

Je propose donc ce patch chargé de gérer les connexions SQL non persistantes (option de configuration SQL_PCONNECT dans le fichier settings/database.php) :

sphider-1.3.5 # cat settings/database.php
<?php
define ('SQL_DB', 'sphider');
define ('SQL_USER', 'root');
define ('SQL_PASS', '');
define ('SQL_HOST', 'localhost');
define ('SQL_TABLE_PREFIX', '');
define ('SQL_PCONNECT', 0);

$mysql_table_prefix = SQL_TABLE_PREFIX;
?>

Le patch est à appliquer sur la version 1.3.5 de Sphider :

sphider-1.3.5 # patch -p1 < patch-sphider-sql_connect.sql
patching file admin/admin.php
patching file admin/auth.php
patching file admin/install.php
patching file admin/spider.php
patching file include/commonfuncs.php
patching file include/js_suggest/suggest.php
patching file search.php
patching file settings/database.php

patch-sphider-1.3.5-sql_connect.gz

Roundcube : plugin vacation 0.3.2

Quelques corrections mineures ont été apportées. Merci à Achim J.Latz et Zanda pour leurs rapports.

Plugin : rc-vacation-0.3.2.tar.gz
Dépôt Git : http://github.com/bhuisgen/rc-vacation

Réseau : DNS publics Google

nameserver 8.8.8.8
nameserver 8.8.4.4

Réseau : géolocalisation de votre connexion

Pour géolocaliser votre connexion Internet (au niveau du DSLAM de votre FAI), une commande sympa :

$ curl -s "http://www.geody.com/geoip.php?ip=$(curl -s icanhazip.com)" | sed '/^IP:/!d;s/<[^>][^>]*>//g'
IP: XX.XX.XX.XXX Location: Munshausen, Luxembourg   (Visual Online S.A.)

Linux : trouver la date d'installation d'un système

Une petite astuce pour obtenir la date d’installation d’un système d’exploitation Linux grâce à la commande dumpe2fs :

# dumpe2fs /dev/sda1 | grep 'created'
dumpe2fs 1.41.9 (22-Aug-2009)
Filesystem created:       Fri Jan 27 23:35:05 2006

Il est également possible d’obtenir la date du dernier et du prochain filecheck :

# dumpe2fs /dev/sda1|grep check
dumpe2fs 1.41.9 (22-Aug-2009)
Last checked:             Sat Nov 21 04:04:03 2009
Next check after:         Thu May 20 05:04:03 2010

MySQL : gestion du cache de requêtes

Le cache de requêtes de MySQL permet d’optimiser le temps d’exécution des requêtes en lecture, à savoir les SELECT. Son efficacité est d’autant plus grande que les requêtes sont fréquentes et les résultats invariants, ce qui est majoritairement le cas pour les sites Web. Son fonctionnement est simple : la sortie texte de la requête et des résultats des requêtes est mise en cache et le serveur les récupère en cas de requête identique (comparaison caractère à caractère). En cas de modification des données,  tous les résultats associés aux tables cache sont nettoyés, ce qui entraîne sur le long terme une fragmentation des blocs mémoire du cache.

Pour vérifier que le cache est activé et ses différents paramètres de configuration :

mysql> SHOW VARIABLES LIKE '%query_cache%';
+------------------------------+----------+
| Variable_name                | Value    |
+------------------------------+----------+
| have_query_cache             | YES      |
| query_cache_limit            | 1048576  |
| query_cache_min_res_unit     | 4096     |
| query_cache_size             | 33554432 |
| query_cache_type             | ON       |
| query_cache_wlock_invalidate | OFF      |
+------------------------------+----------+
6 rows in set (0.00 sec)

Ainsi, il est parfois utile de désactiver la mise en cache :

  • pour une requête spécifique :
mysql> SELECT SQL_CACHE id, name FROM customer;
  • pour une connexion (session client) :
mysql> SET SESSION query_cache_type = OFF;

Si query_cache_type est fixée à DEMAND (valeur 2), alors la mise en cache est forcée au niveau du serveur (GLOBAL) ou client (SESSION) :

mysql> SET GLOBAL query_cache_type=2;
mysql> SET SESSION query_cache_type=2;

Un script de maintenance journalier peut se charger de défragmenter le cache :

mysql> FLUSH QUERY CACHE;

ou encore le vider :

mysql> RESET QUERY CACHE;

Postfix : virtual alias lookup problem

Un problème courant sur les serveurs SMTP Postfix avec gestion virtuelle des utilisateurs avec backend MySQL, concerne la présence de nombreux warnings dans le log comme ceci :

Feb  5 03:02:19 srv07 postfix/cleanup[22193]: warning: 7C6E95117E: virtual_alias_maps map lookup problem for user@domain.fr

Pour le corriger, il suffit de corriger la requête SQL des alias mail :

query = SELECT goto FROM alias WHERE address=CONVERT('%s' USING latin1) AND active = '1

Linux : interfaces réseaux en channel bonding

Le channel bonding est une technique d’agrégation au niveau 2 de la pile OSI de n liens réseaux physiques en un seul. Son utilité est de permettre une redondance du lien réseau (si une carte réseau grille, les autres assurent la continuité du lien), d’équilibrer la charge réseau, et également d’augmenter la bande passante (si le switch/routeur réseau peut communiquer plus rapidement que les cartes réseaux).

En premier lieu, il faut vérifier que le module de bonding est compilé dans le noyau (rubrique Device Drivers / Network Device Support / Bonding Driver Support). Ensuite, il faut configurer l’interface réseau de bonding. Par exemple, sous Gentoo, pour former l’interface de bonding bond0 avec deux cartes réseaux eth0 et eth1 :

# cat /etc/conf.d/net
slaves_bond0="eth0 eth1"
depend_bond0() {
need net.eth0 net.eth1
}
config_eth0=( "null" )
config_eth1=( "null" )
config_bond0=( "192.168.1.1 netmask 255.255.255.0 broadcast 192.168.1.255" )
routes_bond0=( "default via 192.168.1.254" )

Les 2 interfaces réseaux eth0 et eth1 sont donc déclarées mais sans leur attribuer d’adresse IP, puis l’interface bond0 effectuant le bonding de eth0 et eth1 se voit attribuer l’IP 192.168.1.1. Il n’est pas nécessaire de redémarrer le serveur, mais il faut veiller à ce que le module soit chargé automatiquement au moment du montage de l’interface réseau, en ajoutant un alias dans /etc/modprobe.conf :

alias bond0 bonding
options bond0 mode=0 miimon=100

Au niveau des script rc.d, il reste à ajouter les liens symboliques pour le montage automatique au boot :

# cd /etc/init.d
# ln -s net.lo net.eth0
# ln -s net.lo net.eth1
# ln -s net.lo net.bond0
# rc-update del net.eth0
# rc-update del net.eth1
# rc-update add net.bond0 default

Reste ensuite à monter l’interface de bonding :

# /etc/init.d/net.bond0 start

La configuration du bonding peut se faire à chaud avec sysfs :

# cd /sys/class/net/bond0/bonding
# cat miimon
100
# cat mii_status
up
# cat use_carrier
1
# echo 250 > /sys/class/net/bond0/bonding/miimon

SSH : refuser les connexions root sans clé SSH

Autoriser l’accès SSH pour l’utilisateur root n’est pas une solution conseillée mais elle est parfois nécessaire. Pour limiter les risques d’intrusion, il est possible de limiter uniquement les connexions par clés SSH. Ainsi, toutes les connexions par mot de passe seront refusées et au final, les attaques par dictionnaire empêchées. Pour ce faire, il suffit de remplacer :

PermitRootLogin yes

par :

PermitRootLogin without-password
Haut de Page