Tags

bin_sh fail-over fail2ban freebsd install jail kimsufi nginx rrdcgi symon var_empty

Powered by

blOg
maRkdown
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 <ssh_ok> 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 <spammers> persist file "/etc/spammers"
block quick from <spammers>

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

Pour les amis

Le tout est disponible ici.


Lien vers ce billet