samedi 12 décembre 2009

Revue de presse de la Semaine

Decouvrez TinySlider

TinySlider est un slideshow javascript ultra léger (1.5Kb) et dégradable si le navigateur ne supporte pas Javascript. D'une simplicité absolue, son code proprement codé vous permettra de le personnalisé en quelques minutes. A voir absolument.

Lien : Tinyslider

Ajax.org, un futur concurrent pour ExtJS?

Les graphiques en 3D sont simplement epoustouflants

Lien : http://www.ajax.org

samedi 5 décembre 2009

Revue de presse de la semaine

Google Street Views

Google Street Views débarque dans nos campagnes! Retrouvez maintenant une multitude de villes plus ou moins importantes ainsi que les grands axes sur Google Street Views

Lien : Google Street Views

Gestionnaire de Projet Qdpm

Qdpm est un projet jeune mais ambitieux qui souffre encore de quelques lacunes. A tester absolument. Qdpm est en quelque sorte un PhpCollab rafraichit.

Lien : Qdpm

Creer des minatures sous Linux

Un execellement tutoriel sur la ferme du web pour creer des miniatures à la volée sur un serveur dédié sans serveur X.

Lien : Créer des miniatures sous Linux

Vidéo de la Semaine

Le Lipdub des employés de Toys'rus au Havre ;)

dimanche 29 novembre 2009

Aspirer un site avec Wget

wget -r -k -np http://www.lesite.com

l'option -r signifie que le téléchargement sera récursif (il télécharge aussi les liens de la page)
le -k permet de reconstituer le site localement (les liens sont modifié pour pointer localement)
le -np empêche de remonter dans le répertoire parent.

dimanche 22 novembre 2009

En vrac

Je m'aperçois que je n'ai pas posté d'articles depuis le 30 octobre, une éternité!

En vrac, 2 sites excellents que j'ai découvert il y a peu:
http://www.lafermeduweb.com
http://www.lejournaldublog.com


Quelques plugins et thèmes pour Wordpress traduits en Français:
http://liseweb.fr/BLOG/wordpress/plugins/les-plugins-que-jai-traduits-en-francais

vendredi 30 octobre 2009

Revue de presse de la semaine

Erp Achievo
Vous cherchez un ERP pour gérer vos agendas, vos factures et vos demandes clients en opensource? Jetez un coup d'oeil à Achievo,

Lien : Achievo

Bijint.com
Vous trouvez que l'horloge parlante n'est pas assez sexy, jetez un coup d'oeil à Bijint.com
Simple et frais.
Lien : Bijint

Un datacenter en Basse-Normandie
Normhost a inauguré le premier datacenter à Caen, en Normandie. Les professionnels pourront y héberger leurs serveurs très prochainement.

Lien : Normhost

Thèmes wordress
Voici quelques liens en pagaille de thèmes wordpress croisés cette semaine. Gratuits ou payants.

Lien : Hacks wordpress sur Smashing Magazine

Lien : 111 Css Gallery
Lien : Theme Forest
Lien : Business Themes

Une classe pour la Google Maps Api
Yohann Cerdan nous propose une classe PHP assez complète qui vous permet de manipuler facilement des Google Maps. Cette classe gère pas mal de choses au niveau du javascript d’une gmap comme la gestion de catégories de marqueurs, les itinéraires, l’insertion de flux XML, la clusterisation (regroupement de marqueurs), l’affichage d’infobulles, la geolocalisation d’une adresse etc…

Lien : Cliquez-ici

La vidéo de la semaine

vendredi 23 octobre 2009

Revue de presse de la semaine

Petite revue de presse cette semaine, presque 100% Wordpress

Sun Weblog Publisher
Une extension pour OpenOffice qui permet de gérer son blog, dont Wordpress, très simplement
Lien : Cliquez-ici

PHP Pratique
Un petit script pratique pour calculer la distance en mètres et à vol d'oiseau entre deux coordonnées GPS
Lien : Cliquez-ici

Extensions Firefox pour Wordpress
13 extensions pour firefox afin de se faciliter la vie avec son blog Wordpress. Ma préférence est pour Scribefire.
Lien : Cliquez-ici

Vidéo de la semaine spécial Normandie ;)

mercredi 21 octobre 2009

E-Commerce > Les boutiques open-source

Je tenterais de tester dans les semaines qui viennent 3 gros poids lourds du e-commerce open-source:
-Magento
-Prestashop
-Joomla Virtuemart

Je fais l'impasse sur OsCommerce, que j'ai déjà utilisé dans le passé : le test n'était vraiment pas concluant, une usine à gaz pas assez modulable à mon goût.

Quand à Thélia, ce que j'ai pû en lire ici ou là ne m'a guère enthousiasmé. Ce serait un mélange de Magento et de Prestahop, mais en prenant le pire des deux... Donc pour éviter de perdre mon temps je ne le testerais pas pour l'instant.

Magento, je l'utilise à titre professionnel en ce moment, ce sera donc le premier test... peu concluant. Il a de très bon côtés mais aussi de moins bons! A suivre.

Prestashop est à l'étude, et déjà installé sur le pc!

Quand à Joomla VirtueMart ce sera la surprise du chef, je ne le connais pas du tout.

samedi 17 octobre 2009

Revue de presse de la semaine

Salaires des professionnels du web
Pierre Cannet, PDG de Blue-Search conseil, cabinet de recrutement et de conseil RH spécialisé dans les nouvelles technologies, revient sur les disparités salariales dans la filière Internet.
Lire l'article

Jean Sarkozy vraiment partout...
Nouveau buzz sur le net, les humoristes et les opposants à Jean Sarkozy se déchainent sur Twitter
Quelques citations : "Il y a 3 Pays où on hérite du pouvoir de père en fils : Gabon, Corée du Nord et Hauts de Seine ! "(Denis Baupin), "Quand Jean Sarkozy parle, même Frédéric Lefevre se tait!" (Patrick J)
Lire l'article

Apprendre le langage informatique PHP
Vous debutez en PHP. Voici 2 articles en anglais pour mieux comprendre les bases du langage.
Lien : Ecrire une fonction PHP
Lien : Ecrire une classe PHP et manipuler les objets

Facebook aurait 30.000 serveurs dédiés
Pour ceux qui pensent qu'un site c'est facile à maintenir, passage en revue des plus gros propriétaires de serveurs dédiés, c'est un peu le Forbs des Geeks :) A ce niveau il faut même avoir les compétences de maçon et d'électricien pour construire le datacenter nécessaire à son site. Le web c'est une multitude de métiers!
Lien : Facebook aurait 30.000 serveurs dédiés

Vidéo de la semaine



mardi 13 octobre 2009

Javascript et raccourcis claviers

Retrouvez sur openJS un script javascript qui permet d'inserer facilement des raccourcis claviers dans vos pages web. A la maniere de gmail et de sa touche shift, ajoutez plus d'interactivité dans vos interfaces web.

Attention, certains raccourcis faisant appel à la touche Ctrl ne semblent pas fonctionner avec tous les navigateurs.

Lien : http://www.openjs.com/scripts/events/keyboard_shortcuts

jeudi 23 avril 2009

APACHE : Redirection automatique domaine.com vers www.domaine.com

Pour rediriger automatiquement les requetes sur domaine.com vers www.domaine.com, mettre ceci dans votre .htaccess .

RewriteEngine on
RewriteCond %{HTTP_HOST} !^www\.domaine\.fr [NC]
RewriteCond %{HTTP_HOST} !^$
RewriteRule ^/(.*) http://www.domaine.fr/$1 [L,R=301]

mercredi 22 avril 2009

Lenny : Installer PhpSysInfo

PhpSysInfo n'est pas présent sur les paquets Debian. Il faut le telecharger:
wget http://ovh.dl.sourceforge.net/sourceforge/phpsysinfo/phpsysinfo-2.5.3-rc1.tar.gz

Décompressez-le dans votre dossier web adequate.

Dans le cadre de l'article APACHE : PHP4 et PHP5 sur le même serveur, il faudra indiquer à PhpSysInfo d'utiliser PHP5.

Dans votre dossier web mettre le .htaccess pour php5 avec les 2 lignes suivantes.
AddHandler x-httpd-php5 .php
Action x-httpd-php5 /cgi-bin/php

Il est recommandé de restreindre PhpSysInfo à votre propre IP seulement, comme vu dans l'article "APACHE : Activer le server-status".

mardi 21 avril 2009

Lenny : Installer PhpMyAdmin

Pour installer PhpMyAdmin, tapez la commande suivante sous Debian:
apt-get install PhpMyAdmin

Vous pouvez acceder à phpmyadmin via l'adresse http://127.0.0.1/phpmyadmin par exemple.

Dans le cadre de l'article APACHE : PHP4 et PHP5 sur le même serveur, il faudra indiquer à PhpMyAdmin d'utiliser PHP5 pour eviter le probleme avec la librairie mcrypt.

Dans /usr/share/phpMyAdmin mettre le .htaccess pour php5 avec les 2 lignes suivantes:
AddHandler x-httpd-php5 .php
Action x-httpd-php5 /cgi-bin/php

Si vous le pouvez, restreignez PhpMyAdmin à votre propre IP seulement, comme vu dans l'article APACHE : Activer le server-status.

lundi 20 avril 2009

APACHE : PHP4 et PHP5 sur le même serveur

Sur Debian Lenny, cela necessite un serieux bricolage. Il faut vraiment savoir ce que l'on fait.

Il faut commencer par ajouter etch au /etc/apt/sources.list en inserant la ligne suivante:
deb http://ftp.fr.debian.org/debian etch main

Puis on installe php4 en tant que module
apt-get install php4

et PHP5 en tant que CGI.
apt-get install php5-cgi

Surtout, sous aucun prétexte, ne pas installer le paquet php5.

Il faut activer le module actions puis redemarrer.
a2enmod actions
/etc/init.d/apache2 restart

A ce moment, un appel en php à la fonction phpinfo() devrait vous retourner la version de php4 installée.

Nous allons utiliser un fichier .htaccess pour passer du php4 à php5 dans le dossier voulu.

Inserer dans le .htaccess les lignes suivantes
AddHandler x-httpd-php5 .php
Action x-httpd-php5 /cgi-bin/php

Puis re-afficher phpinfo(). Normalement vous êtes désormais en PHP5. Vous pouvez switcher comme vous voulez entre php4/php5 grace à ce .htaccess en ajoutant ou commentant ces 2 lignes ci-dessus.

Nous pouvons désormais installer les extensions.

Installer l'extension GD
apt-get install php4-gd php5-gd

Installer le support de mysql pour PHP5
apt-get install php5-mysql

Si vous installez directement php4-mysql, lipaprutil1 risque d'entrer en conflit avec php4-mysql et vouloir supprimer un tas de paquets Apache. Il ne faut surtout pas! Nous allons donc retrograder vers une ancienne version Etch de libaprutils1 :
apt-get install "libpaprutil1=1.2.7+dfsg-2"

Puis installer php4-mysql. Normalement il n'y a plus de problemes.
apt-get install php4-mysql

Un rapide coup d'oeil à php -v peut vous indiquer que php4 connait quelques soucis avec les types magic-mime.

Si il y a des erreurs lors du php -v et dans les logs Apache , editer /usr/share/file/magic.mime et commenter les lignes suivantes:
#0 regex BEGIN[[:space:]]*[{] application/x-awk ##
#0 search/400 \\input text/x-tex
#0 search/400 \\section text/x-tex
#0 search/400 \\setlength text/x-tex
#0 search/400 \\documentstyle text/x-tex
#0 search/400 \\chapter text/x-tex
#0 search/400 \\documentclass text/x-tex

ainsi que la ligne contenant x-inform qui peut poser probleme également.

Redemarrez apache, verifiez les logs. Tout fonctionne.

Pour aller plus loin sur le sujet:
http://www.siteduzero.com/tutoriel-3-34539-php4-et-php5-en-meme-temps-sur-un-serveur-linux.html
http://packages.debian.org/etch/libaprutil1
https://forum.debian-fr.org/viewtopic.php?f=3&t=17168
http://forum.ovh.com/showthread.php?t=36949

dimanche 19 avril 2009

APACHE : Activer le server-status

Normalement, le module est déjà installé. Il suffit de l'activer:
a2enmod status

Puis ajouter, par exemple dans le VirtualHost on dans le general de /etc/apache2/apache2.conf:


SetHandler server-status
Order Deny,Allow
Allow from all


Dans ce cas on autorise l'accès à tous. Il sera bon par la suite de le limiter à votre seul ip de la façon suivante
Order Deny,Allow
Deny from all
Allow from 127.0.0.1

Il faut egalement mettre dans /etc/apache2/apache2.conf
ExtendedStatus On

Et redemarrer Apache, verifier tous les logs.

Vous retrouverez les principales infos serveurs à l 'adresse http://mondomaine.tld/server-status

samedi 18 avril 2009

APACHE : Modifier la signature du serveur

Bien que la sécurité par l'obscur ne soit pas ce que je préfère, il est tout de même important de cacher la version de son serveur pour donner un minimum d'informations à un eventuel hacker.

Pour cela, modifier ou ajouter dans /etc/apache2/apache2.conf
ServerTokens Prod
ServerSignature Off

Et redemarrer Apache, verifier tous les logs.

vendredi 17 avril 2009

APACHE : Utiliser le mod_evasive

Le mod-evasive permet d'éviter les attaques par saturation (multiples connections en un minimum de temps)

Installer le mod-evasive (sous Debian)
apt-get install libapache2-mod-evasive

Activer le mod-evasive
a2enmod mod-evasive

Dans /etc/apache2/conf.d/evasive ajouter ceci


DOSHashTableSize 3097
# Nbre d'affichage de la même page par IP : 2
DOSPageCount 2
# Nbre d'affichage du même site par IP : 50
DOSSiteCount 50
# Interval d'affichage de la même page par IP : 1 seconde
DOSPageInterval 1
# Interval d'affichage du même site par IP : 1 seconde
DOSSiteInterval 1
# Durée du blocus (exprimé en secondes)
DOSBlockingPeriod 10
# Notification par adresse email pour être prévenu
DOSEmailNotify adresse@email.com
# nouveau dossier pour y placer le logs du module
DOSLogDir "/var/log/apache2/evasive/"
# Utlisation de iptables pour bannier l'IP qui tente de saturer le serveur
#DOSSystemCommand "/sbin/iptables -I INPUT -s %s -j DROP"
# Liste blanche permettant à une IP d'effecuer un nombre illimité de requètes
#DOSWhiteLt 127.0.0.1


Puis créer le dossier /var/log/apache2/evasive/ et lui donner les bons droits pour que Apache puisse ecrire dedans.
mkdir /var/log/apache2/evasive
chown -R www-data:www-data /var/log/apache2/evasive

Et redemarrer Apache, verifier tous les logs.

Pour tester, on peut utiliser un fichier Perl.

Creer test-evasive.pl et y ajouter ceci:
#!/usr/bin/perl
# test.pl: small script to test mod_dosevasive's effectiveness

use IO::Socket;
use strict;

for(0..50) {
my($response);
my($SOCKET) = new IO::Socket::INET( Proto => "tcp",
PeerAddr=> "127.0.0.1:80");
if (! defined $SOCKET) { die $!; }
print $SOCKET "GET /?$_ HTTP/1.0\n\n";
$response = <$SOCKET>;
print $response;
close($SOCKET);
}

Puis
chmod u+x test-evasive.pl
./test-evasive

Vous devez avoir des reponses normales "200" puis des reponses "403" lorsque que le mod-evasive detecte l'attaque par saturation du script test-evasive.pl.

mercredi 15 avril 2009

APACHE : Utiliser le mod_bw (bandwith)

Le module Bandwith permet de gerer la bande passante de chaque client VirtualHost individuellement.

Installer le module (sous Debian)
apt-get install libapache2-mod-bw

Activer le module
a2enmod bw

Modifier le virtualHost. Pour les 2 premieres lignes, se referer à l'article "Utiliser le module vhost_alias pour simplifier les virtualHosts".


Options +FollowSymLinks
VirtualDocumentRoot /var/Www/%0.0
#Gestion BandWith
BandWidthModule On
#ON LIMITE LA BANDE PASSANTE TOTALE A 5Mb/s
BandWidth all 5000000
#ON LIMITE LES FICHIERS DE + DE 5Mo à 500kb/s
LargeFileLimit all 5000 500000
#LE NB MAX DE CONNECTIONS à 20.
MaxConnection all 20
#LE MINIMUM ALLOUE DOIT ETRE DE 20Kb/s
MinBandWidth all 20000


Puis redemarrer apache et verifier attentivement les logs pour voir si tout va bien.

mardi 14 avril 2009

APACHE: SSL sur un multi-hosts

Mon but ici est que les sites web du VirtualHost aient un accès securisé au repertoire /admin, c'est à dire qu'ils transmettent le login/mdp encodé et non en clair. Je ne tiens pas des alertes de sécurité dû au même certificat utilisé pour tous les domaines.

Dans un premier temps nous allons générer notre certificat.

openssl genrsa -out my-ca.key 2048
openssl req -new -x509 -days 3650 -key my-ca.key -out my-ca.crt
openssl x509 -in my-ca.crt -text -noout

Nous avons donc, par l'intermédiaire de la première commande, généré une clé. Par la seconde, nous avons généré le certificat pour qu'il soit fonctionnel 10 ans. Et enfin, par la dernière commande, nous avons rempli ce certificat.

Ensuite nous allons créer le certificat pour le domaine en particulier

openssl genrsa -des3 -out test.com.key 1024
openssl req -new -key test.com.key -out test.com.csr

Important lors de la seconde commande : Dans Common Name il faut mettre le VRAI nom du serveur, exemple : test.com ou www.test.com

openssl x509 -req -in test.com.csr -out test.com.crt -sha1 -CA my-ca.crt -CAkey my-ca.key -CAcreateserial -days 3650

Une fois que tout cela est créé, pour éviter tout piratage, changez les permissions sur les fichiers *.key par cette commande :
chmod 0400 *.key

Nous devons à présent copier ces fichiers dans le répertoire d'Apache, pour cela :
cp test.com.crt /etc/apache2/ssl/ssl.crt
cp test.com.key /etc/apache2/ssl/ssl.key
cp test.com.crt /etc/apache2/ssl/my-ca.crt

Puis creer un virtualHost. Pour les 2 premieres lignes, se referer à l'article "Utiliser le module vhost_alias pour simplifier les virtualHosts"


Options +FollowSymLinks
VirtualDocumentRoot /var/www/%0.0

#SECTION SSL
SSLEngine on
SSLProtocol all -SSLv2
SSLCertificateFile /etc/apache2/ssl/ssl.crt
SSLCertificateKeyFile /etc/apache2/ssl/ssl.key
SSLCertificateChainFile /etc/apache2/ssl/my-ca.crt
SSLCACertificateFile /etc/apache2/ssl/my-ca.crt


Enfin, nous allons modifier le VirtualHost non-ssl (port 80) pour que l'on redirige automatique en sécurisé lorsque l'on invoque /admin.


Options +FollowSymLinks
VirtualDocumentRoot /var/www/%0.0
#GESTION DU SSL
SSLEngine off
RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteCond %{REQUEST_URI} /admin
RewriteRule ^(.*)$ https://%{HTTP_HOST}:443/admin


Puis on redemarre Apache
/etc/init.d/apache2 restart

Puis on fait des test http/https etc... pour s'assurer que tout est ok.

Plus d'informations sur le sujet
http://francois.openmod.org/blog/index.php?post/2007/05/28/55-apache2-en-mode-securise-sous-debian-etch
http://www.vanstormbroek.nl/blog/?p=4

lundi 13 avril 2009

APACHE : vhost_alias pour simplifier les virtualHosts

Pré-requis :
Utiliser une distribution Debian.
Avoir installé Apache 2 en utilisant la commande apt-get install apache2
Penser à ouvrir votre firewall en conséquence si ce n'est déjà fait

Normalement, après avoir installé Apache 2 il suffit d'activer le module vhost_alias
a2enmod vhost_alias

Ensuite dans Dans /etc/apache2/apache2.conf il faut ajouter cette ligne
Options +FollowSymLinks

Puis ajouter

Options +FollowSymLinks
VirtualDocumentRoot /var/www/%0.0


il suffit de creer le repertoire /var/www/mondomaine.tld pour que le mondomaine.tld soit hosté.
pour www.mondomaine.tld il faudra créer /var/www/www.mondomaine.tld

A noter que l'utilisation de liens symboliques fonctionne. C'est à dire que vous pouvez linker /var/www/mondomaine.tld vers /home/mondomaine, ce qui peut être pratique en cas d'hébergement FTP, utilisation de quotas, etc...

Plus d'infos sur Apache en général:
http://www.serveur-rps.fr/apache-mysql/installation_configuration_et_optimisation_d_apache2_et_des_modules

vendredi 13 mars 2009

Mettre à l'heure automatiquement

Installer ntpdate
apt-get install ntpdate

Penser à ouvrir le port udp 123.

Puis
ntpdate ntp.tuxfamily.net && hwclock --systohc

Vous pouvez mettre ce script dans un cron qui se chargera de remettre les pendules à l'heure toutes les heures.

jeudi 12 mars 2009

Protections réseaux sous Linux

Exemple de fichier de protection réseau utilisant iptables et les fonctions reseau du noyau

======DEBUT FICHIER==========

#suppression des regles
iptables -F

#suppression des regles non standards
iptables -X

#par defaut tout est fermé sauf en sortie
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

#la machine locale est sure
iptables -A INPUT -i lo -j ACCEPT

#DNS
#on autorise les connexion pour tous
#attention doit resoudre seulement pour les zones du DNS
iptables -A INPUT -i eth0 --protocol udp --dport 53 -j ACCEPT
iptables -A INPUT -i eth0 --protocol tcp --dport 53 -j ACCEPT

#NTP
iptables -A INPUT -i eth0 --protocol udp --sport 123 -j ACCEPT

#APACHE
#on autorise les connexions pour tous
iptables -A INPUT -p tcp --dport 80 -i eth0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -i eth0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

#POP3 ET POP3S
#pour que les utilisateurs relevent leurs comptes
iptables -A INPUT -p tcp --dport 110 -i eth0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 995 -i eth0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

#IMAP ET IMAPS
#pour que les utilisateurs relevent leurs comptes
iptables -A INPUT -p tcp --dport 143 -i eth0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 993 -i eth0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

#SMTP et SMTPS
#on est serveur de courrier, doit etre ouvert à tous
iptables -A INPUT -p tcp --dport 25 -i eth0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 465 -i eth0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

#SSH
#on l'ouvre aux visiteurs autorisés seulement
iptables -A INPUT -p tcp -s 192.168.1.250 --dport 666 -i eth0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

#VSFTPD (se renseigner sur ftp et ftp-data)
#on l'ouvre aux visiteurs autorisés seulement
iptables -t filter -A INPUT -p tcp -s 192.168.1.250 --dport 20 -i eth0 -j ACCEPT
iptables -t filter -A INPUT -p tcp -s 192.168.1.250 --dport 21 -i eth0 -j ACCEPT

#ON AUTORISE TOUTE CONNECTION DEJA ETABLIE, NECESSAIRE AU FTP
iptables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#PING
#on l'ouvre à quelques privilégiés seulement
iptables -A INPUT -p icmp -s 192.168.1.250 -i eth0 -m limit --limit 1/s -j ACCEPT

#INTERDIRE L'IPV6
ip6tables -P INPUT DROP
ip6tables -P OUTPUT DROP
ip6tables -P FORWARD DROP
ip6tables --flush
ip6tables --flush INPUT
ip6tables --flush OUTPUT
ip6tables --flush FORWARD
ip6tables --flush -t mangle
ip6tables --delete-chain

#LES PROTECTIONS NOYAUX

#interdire le source routing (evite le spoofing)
echo "0" > /proc/sys/net/ipv4/conf/all/accept_source_route

#pour enregistrer les paquets avec adresses falsifiées
echo "1" > /proc/sys/net/ipv4/conf/all/log_martians

#contre le spoofing
echo "1" > /proc/sys/net/ipv4/conf/all/rp_filter

#se proteger contre le syn packet flooding
echo "1" > /proc/sys/net/ipv4/tcp_syncookies

#Emule une reponse windows
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

#interdit les redirections / forwardings
echo "0" > /proc/sys/net/ipv4/conf/all/accept_redirects
echo "0" > /proc/sys/net/ipv4/conf/all/secure_redirects

#FAIL2BAN
/etc/init.d/fail2ban restart

#on affiche tout
iptables -L

=====FIN DU FICHIER========

Pour executer ce fichier au demarrage
ln -s monfichier /etc/init.d/firewall
update-rc.d firewall defaults

Pour le retirer, vous pouvez utiliser la commande suivante :
update-rc.d -f firewall remove

Il vous suffira de redémarrez, ou exécutez /etc/init.d/firewall pour activer le filtrage.

Pour verifier une valeur de protection noyau
sysctl -A | grep tcp_syncookies

devra afficher
net.ipv4.tcp_syncookies=1

Pour afficher toutes les regles de iptables
iptables -L ou iptables -nL

Pour retablir les regles de iptables par defaut (tout autoriser)
iptables -F
iptables -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

Pour aller plus loin:
http://www.linux-france.org/prj/inetdoc/guides/iptables-tutorial/
http://reseau.erasme.org/static/serveurs_linux/sect_02_03.html
http://ipsysctl-tutorial.frozentux.net/chunkyhtml/tcpvariables.html

mercredi 11 mars 2009

Se proteger des scans sous Linux

Installer fail2ban

Fail2ban permet d'etablir des regles du genre bannir pendant 600 secondes quiconque echouera à 3 tentatives d'identifications. Cela permet d'eviter les attaques par bruteforce. Il est disponible pour SSH, PAM, Xinetd, Apache, VsFTPD, ProFTPD, WuFTPD, Postfix, Courier et Bind. Mais vous pouvez egalement ecrire vos propres regles. Quiconque echouera plus de 3 fois sera bannit par une regle dans Iptable qui l'empechera de se connecter.

Pour installer fail2ban
apt-get install fail2ban

Creer jail.local qui aura autorité sur jail.conf et ne se fera pas ecraser à la prochaine mise à jour
cd /etc/fail2ban
cp jail.conf jail.local

Editer jail.local pour modifier l'adresse email de destination destemail puis activer les modules necessaires en bas de fichier.

Si vsftpd est utilisé avec pam, le log est /var/log/auth.log et non le vsftpd.log.

Redemarrer fail2ban
/etc/init.d/fail2ban restart

Utiliser portsentry

Installer le packet
apt-get install portsentry

Editer /etc/portsentry/portsentry.conf pour modifier ces valeurs
BLOCK_UDP="1";
BLOCK_TCP="1";

Et egalement decommenter KILL_ROUTE="/sbin/iptables -I INPUT -s $TARGET$ -j DROP"

Puis un /etc/init.d/portsentry restart.

Plein de ports bidons (netstat -an) seront alors créés. Tout tentative de scannage des ports provoquera un blacklistage du fautif. Attention d'autres logiciels de securité seront egalement leurrés et détecterons des faux positifs.

mardi 10 mars 2009

Detections d'intrusions sous Linux

Utilisation de A.I.D.E (Advanced Intrusion Detection Environment)

Aide permet de detecter les intrusions en envoyant des rapports en cas de detection d'anomalie.
Il etablie une base de signatures des fichiers, ce qui permet de detecter tout modification non voulue.

Installer le paquet
apt-get install aide

Creer les 2 bases
touch /var/lib/aide/aide.db
touch /var/lib/aide/aide.db.new

Dans /etc/defaults/aide, decommenter les 2 dernieres ligne
UPAC_CONFDIR="/etc/aide"
UPAC_CONFD="$UPAC_CONFDIR/aide.conf.d"

Mettre votre email ici
MAILTO=votremail

Il ne faut pas essayer d'utiliser l'executable aide -i par exemple, mais toujours passer par le cron /etc/cron.daily/aide

si vous avez un message du genre File database must have one db_spec specification
cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db

cette commande permettra d'etablir la base initiale.

Après des modifications sur votre serveur, il sera bon d'executer les commandes suivantes afin que la base de signatures soit mise à jour
/etc/cron.daily/aide
cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db

Pour aller plus loin
https://mailman.cs.tut.fi/pipermail/aide/2008-February/000903.html
http://www.hsc.fr/ressources/breves/aide.html.fr

Utiliser checksecurity

Checksecurity effectue des vérifications de sécurité basiques, telles que chercher les changements dans les programmes qui possèdent des permissions setuid et que les systèmes de fichiers distants ne soient pas autorisés à avoir des programmes exécutables setuid.

Installer le paquet
apt-get install checksecurity

Dans /etc/checksecurity.conf, decommenter CHECKSECURITY_EMAIL et mettre votre email

Pour lancer checksecurity
/etc/cron.daily/checksecurity

Utiliser rkhunter

Rkhunter permet la detection de rootkits

Installer le paquet
apt-get install rkhunter

Dans /etc/rkhunter.conf decommenter MAIL-ON-WARNING et mettre votre email

Pour lancer rkhunter
rkhunter -c ou --cronjob

Utiliser chkrootkit

Chkrootkit permet la detection de rootkits

Installer le paquet
apt-get install chkrootkit

Vous retrouverez toutes les options dans /etc/chkrootkit.conf

Pour le lancer tapez
chkrootkit

Pour aller plus loin:
http://softice.lakeland.usf.edu/wiki/index.php/How-to:install:chkrootkit

Après c'est à vous de configurer ces outils pour qu'ils soient efficacent sans vous noyer sous un nombre impressionant de faux positifs

Utiliser Logcheck

Logcheck lit les logs vous envoie ce qui lui parait suspect

Installer le paquet
apt-get install logcheck

Dans /etc/logcheck/logcheck.conf, mettre votre adresse email et reportlevel paranoid (du moins, au début)
Mettre les fichiers que l'on veut checker dans /etc/logcheck/logcheck.logfiles

Logcheck s'executera toutes les heures.

Utilisation de tiger

Tiger fournit des rapports sur la securité (1 par jour)
Normalement, il est installé par défaut sous Debian

Dans /etc/tiger/tigerrc mettre votre email à la ligne Tiger_Mail_RCPT

Utiliser la commande tigercron pour tester.

lundi 9 mars 2009

Utilisation de lsattr et chattr

chattr agit comme chmod mais avec plus d'attributs, notamment +i et +a que nous allons developpés ci-dessous.
lsattr permet de lister les attributs comme le fait la la commande ls mais avec plus d'attributs, notamment +i et +a.

L’attribut « i » (inchangeable, « immutable ») : un fichier ayant cet attribut ne peut-être ni modifié ni effacé ou encore renommé et aucun lien ne peut le référencer, même par le super- utilisateur.

L’attribut « a » (ajout, « append ») : cet attribut a le même effet que l’attribut « immutable », excepté que vous pouvez encore ouvrir le fichier en mode ajout. Ceci veut dire que vous pouvez encore ajouter plus de contenu au fichier, mais qu’il est impossible de modifier un
contenu précédent. Cet attribut est particulièrement utile pour les fichiers de log stockés dans /var/log/, bien que vous devez considérer qu’ils sont parfois déplacés à cause des scripts d’archivage.

Ces attributs ne sont habituellement pas sauvés quand vous sauvegardez le système, donc si vous changez l’un d’entre eux, il peux être utile de sauver les commandes chattr successives dans un script pour pouvoir les repositionner plus tard si vous avez à récupérer une sauvegarde.

Sur quels fichiers
Il est aisé de voir que l’attribut « a » améliore la sécurité, en donnant aux programmes qui ne fonctionnent pas en tant que super-utilisateur, la possibilité d’ajouter des données à un fichier sans pouvoir modifier son précédent contenu.

L'utilité des commandes est tout de meme discutable. Dans un soucis de securité, lcap a été supprimé de Debian. Hors en ajoutant lcap CAP_LINUX_IMMUTABLE au demarrage et lcap CAP_LINUX_IMMUTABLE apres modification des attributs, même le root ne pouvait plus modifié les attributs. Sans cette commande, il suffit au pirate de se retrouver root pour que l'attribut +i ne serve plus à rien. De plus en tant que root il lui serait facile de supprimer le script avant le redemarrage.

vendredi 6 mars 2009

Installer un antispam et un antivirus

Maintenant que vous avez un serveur mail pleinement fonctionnel (postfix et courier), il va vite s'averer indispensable d'installer un antispam et un antivirus.

Nous pourrons commencer par utiliser Postgrey.
Postgrey refuse systematiquement un mail 600 secondes avant de l'accepter. Un serveur de courrier correctement configurer re-tentera au dela de 600 secondes et le courrier sera delivré. Un serveur de spammeur mal configuré ou un virus lui ne re-tentera pas.

Installer postgrey
apt-get install postgrey

ajouter cette ligne
check_policy_service inet:127.0.0.1:10023,

pour les smtpd_recipient_restrictions. dans /etc/postfix/main.cf. Exemple:

smtpd_recipient_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
check_policy_service inet:127.0.0.1:10023,
reject_rbl_client sbl-xbl.spamhaus.org,
reject_rbl_client zen.spamhaus.org,
reject_rbl_client bl.spamcop.net,
reject_unauth_destination

Redemarrer Postfix et normalement Postgrey est pris en compte. Regarder les logs pour s'assurer qu'il n'y a pas d'erreurs.

Installer un antivirus : Amavis/Clamav

Installer les paquets
apt-get install amavisd-new clamav clamav-daemon clamav-freshclam lha arj unrar zoo nomarch lzop unzip bzip2

Dans /etc/amavis/conf.d/05-node_id
$myhostname = "test.priv"

et supprimer le 1; qui genere des erreurs.

Redemarrer amavis
/etc/init.d/amavis restart

Installer un antispam : Spamassassin

Installer les paquets
apt-get install spamassassin libnet-dns-perl libmail-spf-query-perl libnet-ident-perl libio-socket-ssl-perl libsys-hostname-long-perl razor pyzor dcc-client

Dans /etc/default/spamassassin, mettre le ENABLED à 1

Redemarrer
/etc/init.d/spamassassin restart

Maintenant il va falloir interfacer l'antivirus et l'antispam avec Postfix.

Dans /etc/amavis/conf.d/15-content_filter_mode decommenter les regles.

Puis à la la fin de /etc/postfix/master.cf ajouter ceci:

vscan unix - n n - 10 pipe user=amavis argv=usr/sbin/amavis ${sender} ${recipient}
smtp-amavis unix - - n - 2 smtp
-o smtp_data_done_timeout=1200
-o smtp_send_xforward_command=yes
-o disable_dns_lookups=yes
127.0.0.1:10025 inet n - n - - smtpd
-o content_filter=
-o local_recipient_maps=
-o relay_recipient_maps=
-o smtpd_restriction_classes=
-o smtpd_client_restrictions=
-o smtpd_helo_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o mynetworks=127.0.0.0/8
-o strict_rfc821_envelopes=yes
-o smtpd_error_sleep_time=0
-o smtpd_soft_error_limit=1001
-o smtpd_hard_error_limit=1000


Puis à la fin de /etc/postfix/main.cf
content_filter = smtp-amavis:[127.0.0.1]:10024

Redemarrez le tout (amavis,spamassassin,postfix)

Si vous envoyez un message normal à compte local, cette ligne sera ajoutée dans les headers du message:
X-virus-scanned: Debian amavisd-new at test.priv

Si vous envoyez la chaine suivante (chaine servant à tester amavis):
XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X)

Vous aurez un message de rejet de votre email.

Pour ne pas etre ennuyé avec les notifications qui peuvent engorger le serveur, modifier ceci dans /etc/amavis/conf.d/20-debian_defaults

$final_virus_destiny = D_DISCARD;
$final_banned_destiny = D_DISCARD;
$final_spam_destiny = D_DISCARD;
$final_bad_header_destiny = D_PASS;

Puis redemarrer le tout à nouveau

Pour aller plus loin:
http://www.queret.net/wiki/index.php/Linux/How-to/Postfix/Amavis
http://lindev.fr/index.php?post/2008/10/15/Passerelle-Anti-spam-sous-Debian
http://www.radical-spam.org/documentations/amavisd-new.html

Installer Courier avec support TLS/SSL

Courier est un serveur pop3/Imap. Il permet la distribution des emails afin que les utilisateurs puissent les recuperer. C'est en quelque sorte le facteur.

Il faut avoir préalablement installé Postfix de cette manière.

Installer les paquets necessaires
apt-get courier-authdaemon courier-authlib-mysql courier-pop courier-pop-ssl courier-imap courier-imap-ssl

Indiquer à Courier qu'il faut utiliser mysql en editant /etc/courier/authdaemonrc et changez la valeur de authmodulelist comme suit :
authmodulelist="authmysql"

Ensuite éditez /etc/courier/authmysqlrc. Il devrait ressembler à ceci :
MYSQL_SERVER localhost
MYSQL_USERNAME postfix
MYSQL_PASSWORD password
MYSQL_PORT 3306
MYSQL_DATABASE postfix
MYSQL_USER_TABLE mailbox
MYSQL_CRYPT_PWFIELD password
#MYSQL_CLEAR_PWFIELD password
MYSQL_UID_FIELD 5000
MYSQL_GID_FIELD 5000
MYSQL_LOGIN_FIELD email
MYSQL_HOME_FIELD "/var/mail/vmail"
MYSQL_MAILDIR_FIELD CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/')
#MYSQL_NAME_FIELD
MYSQL_QUOTA_FIELD concat(quota,'S')


Pour le service POP3, editer les fichiers /etc/courier/pop3d et /etc/courier/pop3d-ssl puis modifier la (dernière) ligne :
MAILDIRPATH=.

Vérifier par la même occasion que POP3DSTART est bien à YES :
POP3DSTART=YES

Faire de même pour le service IMAP, editer fichiers /etc/courier/imapd et /etc/courier/imapd-ssl :
IMAPDSTART=YES
MAILDIRPATH=.

Redemarrer le tout
/etc/init.d/courier-authdaemon restart
/etc/init.d/courier-imap restart
/etc/init.d/courier-imap-ssl restart
/etc/init.d/courier-pop restart
/etc/init.d/courier-pop-ssl restart

Et voilà vous avez un service POP3/POP3S/IMAP/IMAPS actif pour deliver les emails.

Il ne vous reste plus qu'à tester tout cela avec un client email du type "Outlook" ou "Evolution".

Pop3 ecoute sur le port 110 et Pop3S sur le port 995
Imap ecoute sur le port 143 et ImapS sur le port 993
Pensez à regler vos firewalls en consequence.

En cas de soucis, consultez dans /var/log:
mail.log
mail.info
mail.err
mail.warn

Important: lorsqu'une nouvelle boite email est créée, envoyer automatiquement un email dans cette boite. Sinon l'utilisateur relevant ses mails aura un message d'erreur tant que aucun mail ne sera jamais arrivé dans sa boite.

Il sera maintenant bon d'activer fail2ban pour postfix, courrierauth, sasl.

Installation de Postfix avec authentification SASL et activation TLS/SSL

Postfix est un serveur SMTP. D'un côté il réceptionne le courrier en entrée et le stock. Il ne les distribue pas aux differents utilisateurs. De l'autre côté il permet d'expédier des emails en communiquant avec d'autres serveurs smtp. Nous allons installer Postfix avec le support MYSQL afin de pouvoir ajouter facilement des domaines et des boites emails.

En tant que root mysql, creons un utilisateur postfix qui aura le droit de seulement lire la base

mysql -u root -p
mysql>CREATE DATABASE `postfix`;
mysql>GRANT SELECT ON `postfix`.* TO 'postfix'@'127.0.0.1' IDENTIFIED BY 'password';

postfix.* signifie que vous appliquez les droits à toutes les tables de la base postfix.
postfix@127.0.0.1 signifie que autorisé postfix seulement depuis 127.0.0.1 (cad en local)
Password etant le mot de passe que vous attribuez à l'utilisateur postfix.

Pui, toujours tant que root, nous allons créer les tables mysql

USE postfix;

--
-- Structure de la table `domain`
--
CREATE TABLE `domain` (
`domain` varchar(255) NOT NULL default '',
`actif` tinyint(1) NOT NULL default '1',
PRIMARY KEY (`domain`)
) ENGINE=MyISAM COMMENT='Postfix Admin - Domaines Virtuels';

--
-- Structure de la table `mailbox`
--
CREATE TABLE `mailbox` (
`email` varchar(255) NOT NULL default '',
`password` varchar(255) NOT NULL default '',
`quota` int(10) NOT NULL default '0',
`actif` tinyint(1) NOT NULL default '1',
`imap` tinyint(1) NOT NULL default '1',
`pop3` tinyint(1) NOT NULL default '1',
PRIMARY KEY (`email`)
) ENGINE=MyISAM COMMENT='Postfix Admin - Boites Emails Virtuelles';

--
-- Structure de la table `alias`
--
CREATE TABLE `alias` (
`source` varchar(255) NOT NULL default '',
`destination` text NOT NULL,
`actif` tinyint(1) NOT NULL default '1',
PRIMARY KEY (`source`)
) ENGINE=MyISAM COMMENT='Postfix Admin - Alias Virtuels';

Maintenant nous sommes prêt du côté Mysql.

Postfix ne gere pas nativement les quotas.

Il y a 2 solutions : soit on telecharge les sources puis on applique un patch.
C'est le cas ici : http://doku.beyondhosting.fr/doku.php/howto:debian:postfix dans la section "Patch Quota pour Postfix". L'inconvenient est que le paquet ne sera plus mis à jour par le gestionnaire de paquets. Il faudra à chaque faille de securité decouverte re-compiler postfix.

Etant deja dans ce cas avec Mysql afin qu'il supporte SSL, j'ai donc plutot choisit de continuer à utiliser les paquets debian en ajoutant le dépot VDA (auteur du patch des quotas). Il faut juste s'assurer que vda sorte rapidement les mises à jour lorsqu'il y en a et qu'ils ne se fassent pas hacker...

Pour ajouter le depot, mettre ces lignes à la fin du fichier /etc/apt/sources.list
#postfix VDA
deb http://debian.home-dn.net/sarge postfix-vda/

On installe postfix avec le support mysql
apt-get update
apt-get install postfix postfix-mysql

L'installeur va alors vous poser quelques questions.

Pour un serveur dédié il faudra choisir "Systeme Internet", et pour le domaine votre domaine principale. Nous utiliserons test.priv pour les tests.

Ensuite, il est necessaire de creer un utilisateur pour les mails virtuels. Tous les mails virtuels arriveront dans /var/spool/Vmail/test.priv/user

groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /var/spool/vmail/ -m

Puis editer /etc/postfix/main.cf

Modifier
myhostname = test.priv

#restrictions d'accès
# adresses d'expédition
# le "reject_unknown_sender_domain" verifie que le domaine existe
smtpd_sender_restrictions =
permit_mynetworks,
reject_unknown_sender_domain,
warn_if_reject reject_unverified_sender

# adresses de destination
smtpd_recipient_restrictions =
permit_mynetworks,
reject_unauth_destination,
reject_unknown_recipient_domain,
reject_non_fqdn_recipient

# client
smtpd_client_restrictions =
reject_unknown_client,
permit_mynetworks

Et ajouter ceci
disable_vrfy_command = yes
smtpd_helo_required = yes

virtual_alias_maps = mysql:/etc/postfix/mysql-virtual_aliases.cf,mysql:/etc/postfix/mysql-virtual_aliases_mailbox.cf
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual_domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual_mailboxes.cf
virtual_mailbox_base = /var/spool/vmail/
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000

virtual_create_maildirsize = yes
virtual_mailbox_extended = yes
virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql-virtual_mailbox_limit_maps.cf
virtual_mailbox_limit_override = yes
virtual_maildir_limit_message = "Desole, la boite email de l'utilisateur est pleine, essayez plus tard."
virtual_overquota_bounce = yes

Ensuite creer les fichiers suivants dans /etc/postfix

# mysql-virtual_domains.cf
hosts = 127.0.0.1
user = postfix
password = pass
dbname = postfix
select_field = 'virtual'
table = domain
where_field = domain
additional_conditions = AND actif=1

# mysql-virtual_mailboxes.cf
hosts = 127.0.0.1
user = postfix
password = pass
dbname = postfix
select_field = CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/')
table = mailbox
where_field = email
additional_conditions = AND actif=1

# mysql-virtual_aliases.cf
hosts = 127.0.0.1
user = postfix
password = pass
dbname = postfix
select_field = destination
table = alias
where_field = source
additional_conditions = AND actif=1

# mysql-virtual_aliases_mailbox.cf
hosts = 127.0.0.1
user = postfix
password = pass
dbname = postfix
select_field = email
table = mailbox
where_field = email
additional_conditions = AND actif=1

# mysql-virtual_mailbox_limit_maps.cf
hosts = 127.0.0.1
user = postfix
password = pass
dbname = postfix
select_field = quota
table = mailbox
where_field = email

Autoriser postfix à lire ces fichiers
chgrp postfix /etc/postfix/mysql-virtual_*.cf
chmod u=rw,g=r,o= /etc/postfix/mysql-virtual_*.cf

puis redemarrer postfix et checker la configuration
/etc/init.d/postfix restart
postfix check

regarder les logs dans /var/log
il y a mail.err, mail.info, mail.log, mail.warn

Avec mysql5, un probleme de connexion mysql peut survenir si vous avez activer skip-networking. Il suffit de le commenter, ecouter seulement sur 127.0.0.1 aura le même effet.

Maintenant nous allons ajouter la partie sasl et modifier la partie TLS dans /etc/postfix/main.cf

#sasl
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = test.priv
broken_sasl_auth_clients = yes

# tls config
smtp_use_tls = yes
smtpd_use_tls = yes
smtp_tls_note_starttls_offer = yes
smtpd_tls_key_file = /etc/postfix/smtpd.pem
smtpd_tls_cert_file = /etc/postfix/smtpd.pem
smtpd_tls_CAfile = /etc/postfix/smtpd.pem
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom

Et ajouter ceci qui permet de limiter les spams et les scans
### Tarpit those bots/clients/spammers who send errors or scan for accounts
smtpd_error_sleep_time = 60
smtpd_soft_error_limit = 60
smtpd_hard_error_limit = 10

Enfin, nous allons modifier ceci dans /etc/postfix/main.cf pour autoriser les authentifications sasl

# adresses de destination
smtpd_recipient_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination,
reject_unknown_recipient_domain,
reject_non_fqdn_recipient

Comme nous avons activé TLS, il faut generer les certificats dans /etc/postfix
openssl req -new -x509 -nodes -out smtpd.pem -keyout smtpd.pem -days 3650

Autoriser Postfix à lire ces certificats
chgrp postfix /etc/postfix/smtpd.*
chmod u=rw,g=r,o= /etc/postfix/smtpd.*

Ensuite, decommenter ces lignes dans /etc/postfix/master.cf

smtps inet n - - - - smtpd
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
-o milter_macro_daemon_name=ORIGINATING

Pour utiliser les principales listes antispam dans /etc/postfix/main.cf, modifier ceci:

smtpd_recipient_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_rbl_client sbl-xbl.spamhaus.org,
reject_rbl_client zen.spamhaus.org,
reject_rbl_client bl.spamcop.net,
reject_unauth_destination,
reject_unknown_recipient_domain,
reject_non_fqdn_recipient

Installons maitenant sasl et le module mysql pour PAM
apt-get install libsasl2-2 libsasl2-modules libsasl2-modules-sql sasl2-bin libpam-mysql

Creer un dossier pour sasl
mkdir -p /var/spool/postfix/var/run/saslauthd

Editez /etc/default/saslauthd.
Remplacez START=no en START=yes puis modifiez le paramètre OPTION
OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd -r"

Créez ensuite le fichier /etc/pam.d/smtp. Il ne doit contenir seulement ces deux lignes (changez les différents paramètre):

auth required pam_mysql.so user=postfix passwd=password host=127.0.0.1 db=postfix table=mailbox usercolumn=email passwdcolumn=password crypt=1
account sufficient pam_mysql.so user=postfix passwd=password host=127.0.0.1 db=mail table=mailbox column=email passwdcolumn=password crypt=1

Ensuite, créez le fichier /etc/postfix/sasl/smtpd.conf comme suit :

pwcheck_method: saslauthd
mech_list: plain login
allow_plaintext: true
auxprop_plugin: mysql
sql_hostnames: 127.0.0.1
sql_user: postfix
sql_passwd: password
sql_database: postfix
sql_select: select password from mailbox where email = '%u'

Coreection d'un bug
dpkg-statoverride --add root sasl 710 /var/spool/postfix/var/run/saslauthd
adduser postfix sasl

Puis redemarrer
/etc/init.d/postfix restart
postfix check
/etc/init.d/saslauthd restart

Regarder dans les logs si tout va bien comme vu precedemment

Maintenant nous allons tester que le smtp fait bien ce que nous voulons.

Vous aurez peut-etre besoin de telnet
apt-get install telnet-ssl

Ajoutons un domaine test2.priv, et un email test@test2.priv

mysql -u root -p
mysql>USE postfix
mysql>INSERT INTO domain VALUES ('test2.priv',1);
mysql>INSERT INTO mailbox VALUES ('test@test2.priv',ENCRYPT('secret'),0,1,1,1);

Creer une clée d'authentification pour ce serveur
% perl -MMIME::Base64 -e 'print encode_base64("\000test\@test2.priv\000secret")'
AGptczFAam1zMS5uZXQAbm90Lm15LnJlYWwucGFzc3dvcmQ

Depuis le serveur nous devons pouvoir envoyer vers l'exterieur ou vers un compte local.

Vers un compte local
telnet localhost 25
HELO test.priv
mail from: test@test.priv
250 ok
rcpt to: test@test2.priv
250 ok
data
354 go ahead
From: John
To: Nobody
Subject: test postfix
test postfix
.
250 ok 1113954693 qp 29052
quit

Vers exterieur, recommencer la manipulation precedente avec un compte wanadoo par exemple au lieu de test@test2.priv.Attention si vous essayez depuis un reseau domestique et non un serveur dédié, la plupart des FAI bloquent le port 25 et donc le mail ne partira reellement pas.

Si tout est ok vous devez retrouver des emails dans /var/spool/vmail/test2.priv/test.

Depuis l'exterieur, si nous ne sommes pas identifié nous pouvons seulement envoyer vers un compte local. Si nous sommes identifier nous pouvons envoyer vers l'exterieur egalement. Nous allons en profiter pour tester l'authentification SSL.

Pour tester l'envoi vers un compte local, faire la meme manipulation que ci-dessus avec un telnet ip.du.serv.eur 25.

Idem vers un compte exterieur (du type @wanadoo.fr). A ce moment après avoir tapé rcpt to: vous allez avoir un message du genre "relay denied". Ce qui est normal, il ne faut pas que n'importe qui puisse utiliser votre serveur pour spammer le monde entier.

Il faut vous authentifier avec la clé que l'on a créé plus haut. tapez ceci dans le telnet:
AUTH PLAIN AGptczFAam1zMS5uZXQAbm90Lm15LnJlYWwucGFzc3dvcmQ=
235 ok, go ahead (#2.0.0)

puis refaire:
mail from: test@test.priv
250 ok
rcpt to: test@wanadoo.fr
250 ok
data
354 go ahead
From: John
To: Nobody
Subject: test postfix
test postfix
.
250 ok 1113954693 qp 29052
quit

Maintenant vous pouvez envoyer vers l'exterieur.

Testons maintenant le SSL, le smtp SSL ouvre un port 465. Pensez à l'ouvrir sur votre firewall.
openssl s_client -crlf -connect ip.du.serv.eur:465

puis refaire les memes manipulations que ci-dessus, tester l'authentification etc...

Voici la manipulation pour tester le TLS egalement
openssl s_client -starttls smtp -crlf -connect ip.du.serv.eur:25

Pour l'administration des quotas (3eme colonne de la table mailbox), sachez que pour autoriser 2Mo il faudra indiquer 2048000. Les valeurs sont à donner en bytes.

En cas de besoin, pour configurer Postfix en tant que MX secondaire d'un autre serveur de mails, ajoutez ceci dans /etc/postfix/main.cf
relay_domains = domain1.tld

Il faudra configurer les DNS de domain1.tld de la facon suivante:
domain1.tld. IN MX 10 mx1.domain1.tld.
domain1.tld. IN MX 20 backup.example.tld.

backup.example.tld etant notre postfix secondaire.

Pour renvoyer un utilisateur local vers une boite que l'on peut relever, on pourra ajouter comme alias
root vers test@test2.priv
root@localhost vers test@test2.priv
root@test.priv vers test@test2.priv

Sans ajouter localhost et test.priv à la table domain.

Maintenant, vous savez tout sur le fonctionnement d'un serveur SMTP du type Postfix. Bon courage!

Pour aller plus loin:
http://www.lea-linux.org/documentations/index.php/Postfix-courier-mysql-quota-spamassassin-amavis
http://doku.beyondhosting.fr/doku.php/howto:debian:postfix
http://postfix.state-of-mind.de/patrick.koetter/smtpauth/smtp_auth_mailclients.html
http://ftp.traduc.org/doc-vf/gazette-linux/html/2007/142/lg142-C.html
http://www.yocum.org/faqs/postfix-tls-sasl.html
http://www.postfix.org/SASL_README.html
http://linuxfr.org/~Dinmax/10161.html
http://www.bxlug.be/articles/108

mercredi 4 mars 2009

Configuration d'un serveur bind

Nous allons commencer par mettre bind dans un environnement chrooté afin de limiter la casse en cas de hack

Stopper le serveur
/etc/init.d/bind9 stop

Editer le fichier /etc/default/bind9
OPTIONS="-u bind -t /var/lib/named"

Puis créer quelques dossiers
mkdir -p /var/lib/named/etc
mkdir /var/lib/named/dev
mkdir -p /var/lib/named/var/cache/bind
mkdir -p /var/lib/named/var/run/bind/run

Copier la configuration dans l'environnement chrooté
mv /etc/bind /var/lib/named/etc

Faire les liens symboliques
ln -s /var/lib/named/etc/bind /etc/bind

Le necessaire dans /dev
mknod /var/lib/named/dev/null c 1 3
mknod /var/lib/named/dev/random c 1 8

Donner les bons droits
chmod 666 /var/lib/named/dev/null /var/lib/named/dev/random
chown -R bind:bind /var/lib/named/var/*
chown -R bind:bind /var/lib/named/etc/bind

Et copier le fichier rndc.key
cp /etc/bind/bind/rndc.key /etc/bind

Puis editer le syslog /etc/default/syslogd
SYSLOGD="-a /var/lib/named/var/log"

Enfin, redemmarer le tout
/etc/init.d/sysklogd restart
/etc/init.d/bind9 start

Nous allons maintenant configurer bind dans cette environnement chrooté

Editer le fichier /etc/bind/bind/named.conf.options et ajouter les lignes suivantes dans options {}

#Bind resoudra les domaines du monde entier seulement pour la machine locale
#les autres n'auront le droit qu'aux seuls zones pour lesquelles le DNS est autoritaire

allow-recursion{
127.0.0.1;
192.168.1.1; #IP SERVEUR LOCAL
};

#On autorisera les transferts de zones uniquement pour les DNS secondaires

allow-transfer{
none; #SEULEMENT LES SECONDAIRES
};

#IP sur laquelle on ecoute, ici l'ip du serveur local

listen-on{
192.168.1.1; #IP SERVEUR
};

Puis pour creer une nouvelle zone, editer /etc/bind/bind/named.conf.local et inserer les lignes ci-dessous

zone "test.com" {
type master;
file "test.com.hosts";
};

Dans le fichier correspondant /var/lib/named/var/cache/bind/test.com.hosts, mettre ceci

@ IN SOA ns1.test.com postmaster.test.com (
2009030401 ; serial
21600 ; refresh after 6 hours
3600 ; retry after 1 hour
604800 ; expires after 1 week
86400 ) ; minimum TTL of 1 day

IN NS ns1.test.com.
IN NS ns2.test.com.
IN MX 10 mail.test.com.

IN A 192.168.1.1
ww1 IN A 192.168.1.1
mail IN A 192.168.1.1
ns1 IN A 10.0.1.2
ns2 IN A 10.0.1.3

Un peu d'explications

ns1.test.com est le dns primaire
postmaster.test.com signifie que postmaster@test.com est l'adresse principale pour ce domaine
le serial doit etre de la forme yyyymmdd0x où x est incrementé à chaque maj quotidienne

Pour tester sous linux sur la machine locale, ne pas oublier de mettre l'ip du serveur local en premier dans /etc/resolv.conf
un nslookup google.fr 192.168.1.1 fonctionnera en local et ne doit pas fonctionner depuis une autre ip du reseau
un nslookup test.com 192.168.1.1 doit dans les 2 cas (reseau & local) retourner 192.168.1.1

Ensuite nous pouvons proteger un peu plus Bind avec fail2ban contre une attaque DDOS (Distributed Denial of Service). Il faut que fail2ban soit déjà installé.

Dans /etc/bind/bind/named.conf.local ajouter ceci

logging {
channel security_file {
file "/var/log/named/security.log" versions 3 size 30m;
severity dynamic;
print-time yes;
};
category security {
security_file;
};
};

Puis dans /etc/fail2ban/jail.conf ou jail.local selon votre configuration, modifier les lignes suivantes

[named-refused-udp]
enabled = true

[named-refused-tcp]
enabled = true

Enfin pour terminer on reboote le tout

/etc/init.d/bind9 restart
/etc/init.d/fail2ban restart

Pour en savoir un peu plus sur la configuration de Bind:

http://www.cgsecurity.org/Articles/dns_bind.html
http://www.linux-kheops.com/doc/redhat72/rhl-rg-fr-7.2/s1-bind-configuration.html
http://www.alsacreations.com/tuto/lire/623-Bind-dns-chroot.html

mardi 3 mars 2009

Configurer correctement le SSH

Le ssh étant le seul moyen d'accès complet au serveur dédié (normalement...), il est important de le configurer correctement et de la manière la plus sécurisée possible.

La majeur partie des options se modifient dans le fichier /etc/ssh/sshd_config

ListenAddress 192.168.0.1
On doit indiquer ici une seule adresse où ssh écoute (le plus souvent sur eth0)

PermitRootLogin no
Il ne faut pas autoriser le root à se logguer directement, cela favoriserait encore plus les attaques par bruteforce. Avant d'interdire le root, assurez vous que vous avez un autre utilisateur qui pourra executer la commande su.

Port 666 (ou eventuellement ListenAddress 192.168.0.1:666)
Il est preferable de changer le port par defaut. Cela compliquera un peu la vie à ceux qui veulent rentrer dans votre machine.

PermitEmptyPasswords no
Les mots de passe vides sont un affront au système de sécurité.

AllowUsers alex@host.com jeff
Autorise alex seulement depuis tel domaine et jeff depuis partout. Evite que tous vos utilisateurs FTP aient un accès SSH par exemple. Nous verrons plus bas que cette fonction est également possible avec l'utilisation de l'authentification PAM.

AllowGroups wheel admin
Comme pour les utilisateurs, on peut autoriser seulement certains groupes.

Il existe aussi leurs pendants DenyUsers et DenyGroups.

PasswordAuthentication yes

Il vous appartient complètement de décider ce que vous voulez faire. Il est plus sûr d’autoriser l’accès à la machine uniquement aux utilisateurs avec des clés ssh placées dans le fichier ~/.ssh/authorized_keys. Si c’est ce que vous voulez, positionnez cette option à “no”.

Désactiver toute forme d’autorisation dont vous n’avez pas réellement besoin si vous n’utilisez pas, par exemple, RhostsRSAAuthentication, HostbasedAuthentication, KerberosAuthentication ou RhostsAuthentication, vous devriez les désactiver même s’ils le sont déjà par défaut.

Protocol 2
Désactiver le protocole version 1, car il a des défauts de conception qui facilite le crack.

Passer cette étape nous pouvons nous occuper de l'authentification PAM. Pam permet permet des authentification plus restrictives.

Nous allons commencer par créer le fichier /etc/.sshusers-allowed
touch /etc/.sshusers-allowed

Nous allons mettre dedans tous les utilisateurs autorisés à se connecter, séparés par des sauts de ligne. On voit ici la double-utilisation avec le parametre AllowUsers de sshd_config.

Ensuite à la fin du fichier /etc/pam.d/sshd nous allons ajouter ces 2 lignes
auth required pam_listfile.so onerr=fail item=user sense=allow file=/etc/.sshusers-allowed
password required pam_cracklib.so retry=3 minlen=6 difok=3

La premiere ligne fait que le serveur SSH exigera que l'utilisateur soint indiqué dans /etc/.sshusers-allowed pour pouvoir se connecter.

La seconde ligne fait que l'utilisateur ne pourra tenter plus de 3 mots de passes differents en cas d'erreur, et que les mots de passe devront faire au minimum 6 caracteres. Pour que cette methode soit efficace il sera bon de la coupler à fail2ban.

Si vous n'avez pas beaucoup d'utilisateurs ssh distants, ce qui normalement doit etre le cas, vous pouvez augmenter la securité en realisant un script d'authentification qui fera plusieurs choses:

1.-Ouvrir le firewall (iptables) seulement pour ces ip. Exemple si l'ip 192.168.1.250 est autorisée à se connecter.

iptables -A INPUT -p tcp -s 192.168.1.250 --dport 666 -i eth0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -p tcp -d 192.168.1.250 --sport 666 -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT

Ne pas utiliser ces commandes si vous ne connaissez pas iptables et son utilisation!

2-Autoriser seulement ces ip dans le tcpwrapper.

Dans /hosts.deny indiquer quelque chose qui ressemblerai à ceci
sshd : ALL EXCEPT 111.111.111.111, 222.222.222.222 : SPAWN echo "test %c" >> /var/log/test.txt &

Si l'ip n'est pas 111.111.111.111 ou 222.222.222.222 l'adresse ip sera logguée dans /var/log/test.txt. On peut imaginer à la place de echo "test %c" >> /var/log/test.txt & l'appel à un script iptables qui blacklisterait les indesirables (l'ip étant %c)

3.Autoriser seulement toto@111.111.111.111 dans AllowUsers de sshd_config

Avec fail2ban et portsentry le SSH devrait être suffisamment sécurisé pour décourager les petits malins si vous n'êtes pas la CIA ;) Pensez à faire le script qui fera l'inverse, cad qui dés-authentifiera un utilisateur pour une ip donnée.

Enfin, pour logguer tout ce qui se passe au niveau des logins, vous pouvez modifier dans le fichier fichier /etc/login.defs ces 2 lignes:
FAILLOG_ENAB=YES //loggue les erreurs
LOG_OK_LOGIN=YES //loggue les logins ok

et n'hesitez pas à utiliser la commande makepasswd pour generer vos mots de passe.