Archives pour juin, 2011

Squid : gestion séparée des logs d’accès

Squid stocke par défaut les accès client dans un unique fichier journal. Ceci est problématique dans le cas d’un reverse-proxy mutualisé car il est nécessaire de générer des statistiques d’accès par site.

Comme toujours avec ce logiciel, la solution réside au niveau des ACL. Ici, il s’agit d’effectuer un test sur le domaine (dstdomain), voire l’URL (url_regex) s’il convient de distinguer au niveau protocole. L’ACL est ensuite à spécifier en dernier argument de l’option access_log afin de limiter les données stockées dans le log. Evidemment, il faut veiller à ce que toutes les options access_log utilisent une ACL sous peine d’avoir un beau catch-all qui va griller le disque et les temps d’accès inutilement.

Je colle ici un exemple de configuration permettant la séparation des logs d’accès de deux sites web (fichier squid.conf) :

acl LOG_SITE1 dstdomain "/etc/squid/log_site1.txt"
acl LOG_SITE2 dstdomain "/etc/squid/log_site2.txt"

logformat combined %>a %ui %un [%tl] "%rm %ru HTTP/%rv" %Hs %<st "%{Referer}>h" "%{User-Agent}>h" %Ss:%Shcache_store_log none

access_log /var/log/squid/site1-access.log combined LOG_SITE1
access_log /var/log/squid/site2-access.log combined LOG_SITE2

Reste ensuite à créer pour chaque site le fichier listant des alias utilisés :

# more /etc/squid/log_site1.txt
www.site1.fr
site1.fr
# more /etc/squid/log_site2.txt
.site2.fr

Bref, c’est simple et performant.

Apache : redirection HTTPS générique

RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

Gentoo : installation GRUB2 / GPT / RAID1.2 / root-on-LVM

Quelques notes suite à l’installation d’une Gentoo avec un partitionnement GPT, mirroir RAID1 et un rootfs ext4 sur LVM. mdadm utilisant par défaut les métadonnées au format 1.2, l’autodétection kernel ne peut fonctionner (seul le format 0.9 est reconnu). Il est donc nécessaire de créer un initramfs sur mesure pour assembler les périphériques RAID et monter le LVM.

Correction du stage3 :

Le stage3 ne crée pas les périphériques /dev nécessaires au lancement d’udev avec le baselayout-2. Il faut donc effectuer ces commandes avant le montage bind de /dev :

livecd # cd /mnt/gentoo/dev
livecd # mknod --mode=600 console c 5 1
livecd # mknod --mode=666 null c 1 3
livecd # mknod --mode=666 zero c 1 5

Il faut également ajouter le lancement d’udev par openrc :

cd /mnt/gentoo/etc/runlevels/sysinit
ln -s /etc/init.d/udev udev

Configuration kernel :

General setup  --->
[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support
Device Drivers  --->
Generic Driver Options  --->
[*] Maintain a devtmpfs filesystem to mount at /dev
Device Drivers  --->
[*] Multiple devices driver support (RAID and LVM)  --->
<*>   RAID support
< >     Autodetect RAID arrays during kernel boot
<*>     RAID-1 (mirroring) mode
<*>   Device mapper support
<*>     Snapshot target
File systems  --->
<*> The Extended 4 (ext4) filesystem
[*]   Use ext4 for ext2/ext3 file systems
[*]   Ext4 extended attributes
[*]     Ext4 POSIX Access Control Lists
[*]     Ext4 Security Labels
File systems  --->
Partition Types  --->
[*] Advanced partition selection
[*]   EFI GUID Partition support

Configuration portage :

# more /etc/portage/package.keywords
=sys-boot/grub-9999 **
# more /etc/portage/package.use
sys-apps/busybox static
sys-boot/grub static device-mapper
sys-fs/lvm2 static
sys-fs/mdadm static

Le flag static est à utiliser pour l’ensemble des binaires présents dans l’initramfs.

Création de l’initramfs :

# mkdir /usr/src/initramfs
# cd /usr/src/initramfs
# mkdir -p bin lib dev dev/mapper dev/vc etc mnt/root proc root sbin sys
# cp -a /dev/{null,zero,console,tty,urandom} dev/
# ln -s ../console /usr/src/initramfs/dev/vc/0
# cp /bin/busybox bin/
# cp /sbin/mdadm sbin/
# cp /sbin/lvm.static sbin/lvm

Le fichier de configuration de mdadm est à créer :

# echo "DEVICE /dev/sd??* > /usr/src/initramfs/etc/mdadm.conf
# mdadm --examine --scan >> /usr/src/initramfs/etc/mdadm.conf

A présent le script d’init :

# more /usr/src/initramfs/init
#!/bin/busybox sh

rescue_shell() {
   busybox --install -s
   exec /bin/sh
}

CMDLINE=`cat /proc/cmdline`

mount -t proc none /proc
mount -t sysfs none /sys
mount -t devtmpfs none /dev

mdadm --assemble --scan /dev/md0
mdadm --assemble --scan /dev/md1

lvm vgscan --mknodes
lvm lvchange -aly vg/root
mount -o ro -t ext4 /dev/mapper/vg-root /mnt/root || rescue_shell

umount /sys
umount /proc
umount /dev

exec /bin/busybox switch_root /mnt/root /sbin/init ${CMDLINE}
# chmod +x /usr/src/initramfs/init

Tous les périphériques RAID doivent être assemblés par ce script même s’ils ne sont pas montés. Au niveau LVM, il faut évidemment faire correspondre le nom de votre VG + LV root. Point important, je démonte le /dev sous peine d’avoir des erreurs de permissions d’udev.

L’image est ensuite construite et installée dans /boot :

# mount /boot
# find . -print0 | cpio --null -ov --format=newc | gzip -9 > /boot/initrd-2.6.38-hardened-r6

Configuration GRUB

Le fichier grub.cfg est à régénérer :

# grub-mkconfig -o /boot/grub/grub.cfg

Il faut bien vérifier que l’option initrd est détectée par GRUB :

# more /boot/grub/grub.cfg  |grep initrd
	initrd	/initrd-2.6.38-hardened-r6
	initrd	/initrd-2.6.38-hardened-r6

Si c’est le cas, il ne reste plus qu’à installer GRUB et à rebooter :

# grub-install /dev/sda
# grub-install /dev/sdb
Haut de page