Tags

arm bin_sh blocage blosxom bsd bsdfrance cblog certification chroot cluster dg834 dhcp dns dnsmasq dovecot fail-over fail2ban firefox freebsd ftp git guruplug install ipv6 jail kernel kimsufi lex libre linutop makefile ml150 mohawk netbook netbsd nginx ntp ntp.org openbsd openntpd openrd openwrt pkgng poudriere proxy python reverse rmll route rrdcgi sendmail sieve sl2009 ssd symon update usb var_empty vimperator world xen yacc zfs

Powered by

blOg
maRdown
awK
shEll

14/08/2008

[ nginx fail-over fail2ban ]

200808140800 nginx fail-over fail2ban

Fail-over et nginx

Fail-over: pourquoi faire ?

Je devais depuis longtemps installer nginx, afin de mettre à disposition quelques lignes de code. Histoire de corser la chose, pourquoi ne pas utiliser la deuxième @IP de mon dédié ? Je suis bien conscient que le but premier d'une adresse fail-over n'est pas de réserver une adresse pour un service particulier mais il faut bien s'amuser :)

Comment faire ?

On commence par activer l'adresse fail-over dans la console de management. Une fois le courriel de confirmation reçu, je crée une jail:
ks# ./bin/mk_jail.sh donwload 10240M dowload.bsdsx.fr 172.16.0.4
J'installe nginx:
compil# cd /usr/port/www/nginx
compil# make package
compil# pkg_delete nginx-0.6.32
[ copie de nginx-0.6.32.tbz depuis compil vers download ]
download$ sudo pkg_add nginx-0.6.32.tbz

La configuration se limite à l'emplacement des fichiers de logs et du document root.

On lance le serveur:
download$ sudo /usr/local/etc/rc.d/nginx start
On n'oublie pas la rotation des logs:
download$ grep nginx /etc/newsyslog.conf
/var/log/nginx/*.log   640  10  5000  $W6D0  JG  /var/run/nginx.pid
Et le démarrage au boot:
download# echo 'nginx_enable="YES"' >> /etc/rc.conf
Reste la configuration du pf de l'hôte (extraits):
failover="adresse.ip.du.failover"
nat on $ext_if from 172.16.0.4 -> $failover
rdr pass on $ext_if proto tcp from  to $failover port ssh -> 172.16.0.4 port ssh
rdr pass on $ext_if proto tcp to $failover port http -> 172.16.0.4 port http

Et c'est tout ?

Ben oui. Ce serveur web proposant (pour l'instant j'espère :) très peu de chose, je ne me suis pas soucié des logs. Grave erreur:
download$ grep -c w00t /var/log/nginx/access.log
267
download$ grep -c php /var/log/nginx/access.log
455
Aux grands maux, les grands remèdes:
download$ grep -A 2 'location.*php' /usr/local/etc/nginx/nginx.conf
location ~ \.php {
  deny all;
}
Et depuis l'hôte:
ks# awk '{ print $11 }' /zfs/jail/download/var/log/nginx/error.log | sort -u | tr -d ',' >> /etc/spammers
Avec une règle pf kivabien:
ks# grep spammers /etc/pf.conf
table  persist file "/etc/spammers"
block quick from 
Et un script qui met à jour /etc/spammers:
[ snip alimentation /etc/spammers ]
/sbin/pfctl -q -t spammers -T replace -f /etc/spammers

Et oui, fail2ban c'est bien, mais sous freebsd c'est demerdeune ziziche :)

Update:

Merci à dug pour la (double :) correction de la ligne de newsyslog.conf


Lien vers ce billet

13/08/2008

[ symon rrdcgi bin_sh ]

200808130800 symon rrdcgi bin_sh

symon et rrdcgi

rrdcgi n'est pas mon ami

Comme indiqué clairement dans le man:
rrdcgi is a sort of very limited script interpreter
Ce qui signifie que ce genre de chose ne fonctionne pas:
<RRD::SETVAR _ma_var un>
<RRD::SETVAR _mon_block
 multi
 ligne
<RRD::GETVAR _ma_var>
 ligne
 multi
>

<RRD::GETVAR _mon_block>
<RRD::SETVAR _ma_var deux>
<RRD::GETVAR _mon_block>

Lors du deuxième appel, _ma_var n'est pas réévaluée. Moi qui pensais pouvoir définir un squelette pour RRD::GRAPH agrémenté de RRD::GETVAR, c'est loupé !

J'ai eu beau retourner le problème dans tous les sens (même à coup de réécriture d'url), pas moyen d'utiliser rrdcgi comme je le veux.

Est-il utile de préciser que je n'ai pas réussi à échapper une quote (simple ou double) ?

J'ai un autre ami

Comme d'habitude, les solutions les plus simples sont souvent les meilleures. Quelques lignes de shell et le tour est joué !
#!/bin/sh
. common.inc
_graph() {
[ snip definition du graph ]
}

head 'Titre de la page'
_graph 'Titre du graphique' <start>
_graph 'Titre du graphique' <autre_start>
footer

J'ai des amis

On active tout ça dans lighttpd.conf (extraits):
url.access-deny = ("~", ".inc") # defini par default
static-file.exclude-extensions = (".php", ".pl", ".fgci", ".sh") # on rajoute ".sh"
cgi.assign = ( ".pl" => "/usr/bin/perl", ".sh" => "/bin/sh" )    # idem

Et on peut admirer le résultat ici. On remarquera que:

Pour les amis

Le tout est disponible ici.


Lien vers ce billet