Centraliser vos logs avec Graylog2 sous Debian 9

9 juin 2017 | Posted in Réseau, Supervision | By

Présentation de Graylog2

Aujourd’hui on va installer le génialisime Graylog !!! Tout bon administrateur système comprend la nécessité d’avoir des logs faciles à lire et à stocker.
Le log a plusieurs inconvénient :

  • Le Log peux prendre beaucoup de place sur un serveur de production et remplir une partition.
  • Le Log peut être perdu suite à un crash d’une machine, on est alors aveugle sur le pourquoi du crash
  • Le Log peut aussi bien être corrompu par un attaquant pour masquer son attaque.

Graylog va donc centraliser les logs de vos serveurs et application et grâce à son interface très intuitive de pouvoir facilement comparer les logs et les analyser. Un gain de temps phénoménal. Mais ce n’est pas tout.
Graylog peut aussi faire des analyses automatiques qui vous alerteront en automatique via email. Tout bonnement génial. Avant j’utilisais octopussy , maintenant sans hésitez graylog !!!

Objectif de ce tutorial sur Graylog2

Comme toujours nous allons partir sur une Debian vierge, mais pour la première fois une Debian 9 stretch. Après tout elle sort officiellement dans 10 jours.
Quelques conseils pour votre infrastructure :

  • Que vous soyez dans un vswitch ou sur un LAN je vous invite fortement à avoir un VLAN réservé à votre administration (sonde de monitoring et log) et cela bien sur dans la mesure du possible sur une autre carte Réseaux.
    Pourquoi me direz vous? Tout simplement pour séparer les Flux applicatifs des flux administrations.
  • N’oubliez pas que les Logs sont soumis à la réglementation et qu’ils doivent être conservé, l’espace disque peut donc devenir conséquent et suivant le parc machine les accès en écriture et lecture tout autant, dimensionnez bien votre infrastructure. Personnellement je monte une partition sur un nas pour les données.
  • Les logs ne doivent jamais circulé en clair, il y a bien souvent trop d’informations importantes.

Graylog s’appuie sur deux dépendances :

  • Elasticsearch
  • MongoDb

Nous verrons donc comment installer ses dépendances mais aussi un peu les sécuriser. Puis nous installerons Graylog et le configurerons.

Pour tout ce qui sera certificat SSL je me baserai sur le tutorial Letsencrypt que j’ai écrit précédemment.

Installation de Graylog

Infrastructure

On commence par monter une infrastructure de test. Pour des raisons pratiques je ferai tout cela dans mon esxi.
Cette infrastructure  comprendra :

  1. Un vm de test sous debian jessie avec un apache et un mysql
  2. Une vm de test sous windows 2012 Server R2
  3. Une Vm equivalent à un nas
  4. La Vm pour Graylog en mode standalone

Toutes les Vms à part bien sur le nas auront une interface public. ( Traduction chez ovh une ipfailover )
Toutes les Vms auront une interface privé en Lan réservé au log sur un viswitch dédié.
La vm faisant office de nas servira a stocker les logs et les données. Le point de montage sera /mnt/data

Attention à bien faire ce point de montage car je le met en dur dans la configuration.

Génération des certificats

Installation

Comme je le disais précédemment nous allons encrypter les flux de données. Grace à Letsencrypt rien de bien compliquer. Il vous faut juste un nom de domaine pointant vers votre serveur et le package certbot

apt-get install certbot

Configuration

Imaginons que vous decidiez d avoir comme nom de domaine pour votre graylog : log.mon-domaine.com
Pour générez le certificat il vous faut faire :

certbot certonly --standalone -d log.mon-domaine.com

Le certificat ainsi généré sera disponible dans le dossier : /etc/letsencrypt/live/log.mon-domaine.com

Elasticsearch

Installation

Nous allons maintenant installé elasticsearch en passant par le dépôt officiel mais attention !!! la plupart des tutoriaaux remonte l’information que Graylog2 requière au minimum elasticsearch 2.x, mais ne stipule pas que Graylog2 n’est pas compatible avec les versions supérieurs à 5.x !!!!! On va donc prendre la version 2.4 et non la 6 ou 5. Oui elasticsearch est passé de la version 2.4 à 5 sans passer par le 3 ou 4

Perso pour information, j ai essayé avec la 6 ou cas ou, je confirme que graylog ne fonctionne pas du tout.


apt-get install apt-transport-https openjdk-8-jdk
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | apt-key add -
echo "deb http://packages.elastic.co/elasticsearch/2.x/debian stable main" | tee -a /etc/apt/sources.list.d/elasticsearch-2.x.list
apt-get update && apt-get install elasticsearch

On crée nos répertoires sur le nas pour les logs et les data d elasticsearch

mkdir /mnt/nas/elasticsearch && chown -R elasticsearch:elasticsearch /mnt/nas/elasticsearch

Configuration

Nous allons configurer elasticsearch, le sécuriser et aussi s occuper de systemd pour automatiser son démarrage.

sed -i -r 's/^# cluster.name:.*/cluster.name: graylog/' /etc/elasticsearch/elasticsearch.yml
sed -i -r 's/^# node.name:.*/node.name: graylog-server/' /etc/elasticsearch/elasticsearch.yml
sed -i 's/# node.max_local_storage_nodes: 1/node.max_local_storage_nodes: 1/' /etc/elasticsearch/elasticsearch.yml
sed -i -r 's/^# network.host:.*/network.host: 127.0.0.1/' /etc/elasticsearch/elasticsearch.yml
sed -i -r 's/^# path.data:.*/path.data: \/mnt\/nas\/elasticsearch\/data /' /etc/elasticsearch/elasticsearch.yml
sed -i -r 's/^# path.logs:.*/path.logs: \/mnt\/nas\/elasticsearch\/logs /' /etc/elasticsearch/elasticsearch.yml

Pour comprendre, je demande en premier de changer le nom du cluster et celui du node. Je force à ce qu’il y ait qu’un seul node.
Puis pour sécuriser je bloque l’écoute de l elasticsearch qu’en local.
Enfin je déplace les données et les logs directement sur le nas.

Enfin j active le redemarrage automatique et je lance elasticsearch
systemctl start elasticsearch
systemctl enable elasticsearch

Pour verifier que tout fonctionne :
journalctl | tail

et

netstat -anp | grep 9200

Mongodb

Maintenant nous passons à Mongodb qui malheureusement ne possède pas à ce jour de dépôt propre sur le site de mongodb.
On va donc installer la version de base qui par chance est la version 3.2 parfaitement compatible avec graylog

Installation

apt-get install mongodb-server

Configuration

Nous allons donc sécuriser votre serveur.

sed -i -r 's/^#nohttpinterface/nohttpinterface/' /etc/mongodb.conf
Enfin vérifiez bien que votre bind_ip est bien sur 127.0.0.1

Installation de Graylog 2.2

Installation

apt-get install uuid-runtime pwgen
wget https://packages.graylog2.org/repo/packages/graylog-2.2-repository_latest.deb
dpkg -i graylog-2.2-repository_latest.deb
apt-get update
apt-get install -y graylog-server

Comme indiquer, à la fin de l’installation, il vous reste à automatiser le démarrage de Graylog


systemctl enable graylog-server.service
systemctl daemon-reload
systemctl start graylog-server.service

Configuration


# generation d un salt unique pour hash mot de passe
mdprand=$(openssl rand -base64 32)
sed -i 's#password_secret =.*#password_secret = '"$mdprand"'#' /etc/graylog/server/server.conf
# Mot de passe de l administrateur , changez MOT_DE_PASSE_ROOT par votre mot de passe
mdp_root=$(echo -n "MOT_DE_PASSE_ROOT" | shasum -a 256 | awk '{print $1}')
sed -i 's#root_password_sha2 =.*#root_password_sha2 = '"$mdp_root"'#' /etc/graylog/server/server.conf
# email contact
sed -i 's/#root_email = ""/root_email = "ROOT_EMAIL"/' /etc/graylog/server/server.conf
#Timezone Paris
sed -i 's/#root_timezone = UTC/root_timezone = CET/' /etc/graylog/server/server.conf
#config elasticsearch
sed -i 's/elasticsearch_shards = 4/elasticsearch_shards = 1/' /etc/graylog/server/server.conf
sed -i 's/#elasticsearch_discovery_zen_ping_multicast_enabled = false/elasticsearch_discovery_zen_ping_multicast_enabled = false/' /etc/graylog/server/server.conf
sed -i 's/#elasticsearch_discovery_zen_ping_unicast_hosts = 127.0.0.1:9300/elasticsearch_discovery_zen_ping_unicast_hosts = 127.0.0.1:9300/' /etc/graylog/server/server.conf
# On ouvre l interface web en 127.0.0.1 et on fera apres un proxy avec apache pour avoir du https
sed -i 's/#web_listen_uri = .*/web_listen_uri = http:\/\/127.0.0.1:9000/' /etc/graylog/server/server.conf

On redemarre graylog


systemctl restart graylog-server.service

Accès à l’interface web

On installe apache :

apt-get install apache2 cronolog

On active les mods apache dont on a besoin :

a2enmod ssl
a2enmod rewrite
a2enmod headers
a2enmod proxy
a2enmod proxy_http

Il ne reste plus qu’à mettre ne place un vhost qui force le https avec le certificat que l on a créé précédemment.

Je rappelle qu il faut remplacer dans ce qui suit log.mon-domaine.com par votre nom de domaine

On crée le virtualhost dans le fichier :

touch /etc/apache2/sites-available/log.mon-domaine.com.conf

Vous y coller la configuration suivante :

<VirtualHost *:80>
ServerName log.mon-domaine.com
Redirect permanent / https://log.mon-domaine.com/
</VirtualHost>

<VirtualHost *:443>
ServerName log.mon-domaine.com

ErrorLog « |/usr/bin/cronolog /var/log/apache2/log.mon-domaine.com/%Y/%m/error_log »
CustomLog « |/usr/bin/cronolog /var/log/apache2/log.mon-domaine.com/%Y/%m/access_log » combined
TransferLog « |/usr/bin/cronolog /var/log/apache2/log.mon-domaine.com/%Y/%m/transfer_log »

 

SSLEngine On
SSLCertificateKeyFile /etc/letsencrypt/live/log.mon-domaine.com/privkey.pem
SSLCertificateFile /etc/letsencrypt/live/log.mon-domaine.com/cert.pem
SSLCertificateChainFile /etc/letsencrypt/live/log.mon-domaine.com/chain.pem

SSLProtocol all -SSLv2 -SSLv3
SSLCipherSuite « EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4 »
SSLHonorCipherOrder on
SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire

# HSTS (mod_headers est requis, 15 768 000 secondes = 6 mois)
Header always set Strict-Transport-Security « max-age=15768000 »

RequestHeader set X-Graylog-Server-URL « https://log.mon-domaine.com/api/ »
ProxyPass / http://127.0.0.1:9000/
ProxyPassReverse / http://127.0.0.1:9000/

</VirtualHost>

Astuce pour bien ne rien oubliez passer par sed pour tout modifier :

sed -i 's#log.mon-domaine.com#www.mon-domaine.com#' /etc/apache2/sites-available/log.mon-domaine.com.conf

On active le site

a2ensite log.mon-domaine.com
apache2ctl graceful

On peut maintenant apprécié le résultat :

Conclusion

Nous venons donc d’installer notre centralisateur de log Graylog2 en version 2.2.3 sur une debian 9 Stretch tout en y apportant une petite couche de sécurité. Je vous invite à bien lire le fichier server.conf qui regorgent d informations sur les possibles configurations de Graylog2.

Il ne vous reste plus qu à configurer vos inputs, il existe de nombreux tutoriaux la dessus.
Note importante : Votre graylog bien évidemment ne tourne pas avec l utilisateur root, donc lorsque vous créez vos input il faut mettre un port supérieur à 1024 !!!

Liens annexes

D’excellents tutoriaux proposent de la documentation sur Graylog :

En francais :

En anglais :

Read More...

Mysql – Cryptage SSL des connexions sous Debian Jessie

16 janvier 2017 | Posted in Réseau, Securisation | By

Pour plusieurs raisons propres, vous devez ouvrir votre serveur mysql vers l’extérieur. Vous trouverez de nombreux tutoriels afin de le faire. Mais ici, nous allons voir comment sécuriser vos communications entre le client et le serveur rendant ainsi impossible d’intercepter par sniffage un mot de passe ou le résultat de vos requêtes.
Il serait gênant de devoir expliquer à vos clients que leurs informations personnelles sont entre les mains de hackers malins.

Pre-requis

Serveur Debian 8 jessie dont l’ip sera 192.168.0.1
le package mysql-server installé

Information Importante

La documentation de mysql 5.5 décrit la manière de sécuriser les connexions, vous trouverez aussi de nombreux tutoriels décrivant les processus. Néanmoins, ces dernières ne fonctionnent pas sous Debian 8 à cause d’openssl. La version actuelle d’openssl sous jessie est la 1.0.1t alors que lors de l’écriture des tutoriels officiels, la version était 0.9.8. Il en découle une différence dans les protocoles PKS. La procédure décrite ci dessous en tient compte.

Ouvrir les connexions distantes

En premier lieu, nous allons modifier le fichier /etc/my.cnf afin de dire à mysql d’ouvrir son port 3306 vers l’extérieur.

sed -i '/bind-address/ s/^/# /' /etc/mysql/my.cnf
service mysql restart

Il faut maintenant faire deux choses.
La première : vérifiez que vous n’avez pas déjà un utilisateur ayant pour attribut un host % (signifiant que vous acceptez des connexions de partout) et la deuxième, de savoir créer un utilisateur.

mysql -u root -p

puis dans le shell mysql on commence par vérifier

select user,host from mysql.user;
sortie bash mysql requete
Comme on peut le voir, pas d’utilisateur ouvert vers l’extérieur.

On créé maintenant un utilisateur ssl_user provenant de l’adresse 192.168.0.10.

CREATE USER "ssl_user"@"192.168.0.10" IDENTIFIED BY "mot_de_passe";
GRANT SELECT, SHOW DATABASES ON *.* TO "ssl_user"@"192.168.0.10" REQUIRE SSL;
FLUSH PRIVILEGES;

On vérifie le tout :
select user,host,ssl_type from mysql.user;
sortie bash mysql requete
On peut voir le champ ssl_type avec la valeur ANY qui montre que l’utilisateur sssl_user accepte n’importe quel type de chiffrement ssl.

Création et déploiement des certificats SSL

Nous allons en premier lieu vérifier que votre serveur mysql est bien compilé avec le support SSL. Normalement, si vous êtes passé par les dépôts, pas de soucis à se faire

toujours depuis le shell mysql tapez :
show variables LIKE "%ssl%";
sortie bash mysql requete

Comme vous pouvez le voir, on est en etat DISABLED.
Jusque là rien d’anormal, si vous aviez eu NO à la place cela vous indiquerait alors que votre serveur Mysql n’est pas compilé avec openssl.

Géneration des certificats

Personnellement, je range mes certificats dans le même dossier que la configuration mysql


cd /etc/mysql && mkdir MysqlCertif
cd MysqlCertif

Nous allons y stocker les certificats de l’autorité de certification, du serveur et du client.

Autorité de certification


openssl genrsa 2048 > ca-key.pem
openssl req -new -x509 -nodes -days 1825 -key ca-key.pem > ca-cert.pem

On génère donc une clé de 2048 bits (le maximum légal en France, perso je mets plus …) valable 1825 jours soit 5 ans.

Certificat serveur


openssl req -newkey rsa:2048 -days 1825 -nodes -keyout serverMysql-key.pem > serverMysql-req.pem
openssl x509 -req -in serverMysql-req.pem -days 1825 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > serverMysql-cert.pem
openssl rsa -in serverMysql-key.pem -out serverMysql-key.pem

Certificat Client


openssl req -newkey rsa:2048 -days 30 -nodes -keyout clientMysql-key.pem > clientMysql-req.pem
openssl x509 -req -in clientMysql-req.pem -days 30 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > clientMysql-cert.pem
openssl rsa -in clientMysql-key.pem -out clientMysql-key.pem

j’ai modifié la validité du certificat client à 30 jours afin de vous montrer que vous pouvez donner ainsi une date de péremption et bloquer la connexion au bout de 30 jours

Cela évite aussi de laisser traîner des certificats valides dans la nature trop longtemps.

on fini en mettant les certificats avec les droits mysql

chown -R mysql:mysql /etc/mysql/MysqlCertif

Configuration du serveur mysql

Editez le fichier /etc/mysql/my.cnf

dans la section [mysqld] ajoutez :

ssl-ca=/etc/mysql/MysqlCertif/ca-cert.pem
ssl-cert=/etc/mysql/MysqlCertif/serverMysql-cert.pem
ssl-key=/etc/mysql/MysqlCertif/serverMysql-key.pem

Il ne reste plus qu’à redémarrer le service

service mysql restart

Vérifions maintenant que tout fonctionne :

Dans la console mysql :
show variables LIKE "%ssl%";

sortie bash mysql requete serveur ok

On a bien la confirmation que tout est ok.

Configuration cote client

En premier lieu, il faut récupérer les fichiers pour le certificat client

Les fichiers à transmettre sont :

  • /etc/mysql/MysqlCertif/ca-cert.pem
  • /etc/mysql/MysqlCertif/clientMysql-cert.pem
  • /etc/mysql/MysqlCertif/clientMysql-key.pem

Pour le client, vous avez deux manières de vous connecter.

Soit en ligne de commandes :
mysql -u ssl_user -p -h 192.168.0.1 --ssl-ca=/etc/mysql/MysqlCertif/ca-cert.pem --ssl-cert=/etc/mysql/MysqlCertif/clientMysql-cert.pem --ssl-key=/etc/mysql/MysqlCertif/clientMysql-key.pem

Soit directement dans le fichier my.cnf du client sous la section [client] :

éditez le fichier my.cnf

vim /etc/mysql/my.cnf

ssl-ca=/etc/mysql/MysqlCertif/ca-cert.pem
ssl-cert=/etc/mysql/MysqlCertif/clientMysql-cert.pem
ssl-key=/etc/mysql/MysqlCertif/clientMysql-key.pem

redémarrer le service

service mysql restart

on teste la connexion :

mysql -u ssl_user -p -h 192.168.0.1

Si tout fonctionne en tapant \s dans la console mysql on aura :

Que voit t’on la dedans? Première chose, le SSL fonctionne car on a le Cipher in use is DHE-RSA-AES256-SHA, la deuxième chose, je vous laisse la deviner et la mettre en commentaire.

Vérifier la sécurité

On pourrait s’arrêter là, mais on va aller un peu plus loin en regardant de plus près ce que l’on a avec mysql 5.5

dans votre console mysql :

SHOW GLOBAL STATUS where Variable_name like "Ssl%";

sortie bash mysql requete option global

On voit donc que la version ssl est TLSv1, ce qui est une bonne chose.
Le cipher est calé sur DHE-RSA-AES256-SHA ce qui est bon aussi.

Maintenant il faudra passer sous mysql 5.7 pour pouvoir modifier les valeurs et forcer par exemple le serveur en TLSv1.2.

Conclusion

Voila vos connexions extérieures cryptées.
Le cryptage de la connexion va un peu consommer de ressources mais d’après plusieurs benchmark cela est minime. Vous aurez par contre une latence augmentant proportionnellement avec le nombre de connexion actives.
Autre désavantage à prendre en compte, certains logiciels, sondes de monitoring ne fonctionnent pas avec une connexion cryptée ssl.

Read More...

Avoir et installer un certificat SSL https gratuitement

16 janvier 2017 | Posted in Non classé, Réseau, Securisation | By

Toujours dans l’optique d’améliorer la sécurité de votre site, vous avez pensé acheter un certificat. Mais un certificat, cela a un coût… Payer une rente annuelle pour sécuriser un flux smtp, ftp ou autres avec un certificat authentifié est hors de vos moyens.
Mais ça, c’etait avant, maintenant grâce à letsencrypt, à vous les certificats SSL valides mais sans assurance sur les transactions financières. Ils sont donc parfait pour un site ou un service non e-commerce.

Comment ca marche ?

Afin de délivrer le certificat, letsencrypt vérifie que le nom de domaine est bien relié à l’ip déclarée dans le dns. Pour cela, il monte un mini serveur http pour effectuer une connexion au service afin d’authentifier la demande de certificat. C’est pour cela que lors de la génération ou le renouvellement d’un certificat il faut arrêter apache.

Pré-requis

Si vous copier-coller mes virtualhosts, avoir installé chronolog.
Les sites sont placés dans le dossier /var/www avec comme architecture de dossier :

  • log
  • tmp
  • html

Installation

Il faut commencer par installer letsencrypt sur son serveur, la procédure est différente entre Debian 7 et une Debian 8. La Debian 8 permet maintenant l’utilisation du package.

Debian 7

On choisi d’installer le script certbot directement dans le dossier /var/ice/script/shell/

cd /opt/
wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto

Debian 8

Il faut commencer par activer les backports de debian

echo "deb http://ftp.debian.org/debian jessie-backports main" >> /etc/apt/sources.list
apt-get update
apt-get install certbot -t jessie-backports

Générez vos certificats

Pour info : on peut générer plusieurs certificats en une ligne en ajoutant des -d nomdedomaine.com
Remplacer évidemment nomdedomaine.com par la valeur du nom de domaine sans les www pour les racines.

Debian 7

cd /opt/
./certbot-auto certonly --standalone -d nomdedomaine.com --pre-hook "/etc/init.d/apache2 stop" --post-hook "/etc/init.d/apache2 start"

Debian 8

certbot certonly --standalone -d nomdedomaine.com --pre-hook "service apache2 stop" --post-hook "service apache2 start"

Renouvellement des certificats

Debian 7

cd /opt/
./certbot-auto renew --pre-hook "/etc/init.d/apache2 stop" --post-hook "/etc/init.d/apache2 start"

Debian 8

certbot renew --pre-hook "service apache2 stop" --post-hook "service apache2 start"

Configuration apache

on utilise deux mods

a2enmod headers
a2enmod ssl

le mode ssl gère les multi ssl avec une ip

ATTENTION :

Header always set Strict-Transport-Security envoie une commande via le header au navigateur qui va pendant le temps exprimé, forcer le navigateur à passer en HTTPS, même si vous avez désactivé le https ou mis un htaccess après. Cela reste dans le cache du navigateur.

Exemple de virtualhost


ServerName www.site.fr
ServerAlias site.fr
DocumentRoot /var/www/www.site.fr/html
LogLevel warn

ErrorLog « |/usr/bin/cronolog /var/www/www.site.fr/log/%Y/%m/error_log »
CustomLog « |/usr/bin/cronolog /var/www/www.site.fr/log/%Y/%m/access_log » combined
TransferLog « |/usr/bin/cronolog /var/www/www.site.fr/log/%Y/%m/transfer_log »

php_admin_value auto_prepend_file none
php_admin_value open_basedir /var/www/www.site.fr:/tmp
php_admin_value upload_tmp_dir /var/www/www.site.fr/tmp
php_admin_value session.save_path /var/www/www.site.fr/tmp

SetEnv AWSTATS_FORCE_CONFIG www.site.fr

SSLEngine On
SSLCertificateKeyFile /etc/letsencrypt/live/www.site.fr/privkey.pem
SSLCertificateFile /etc/letsencrypt/live/www.site.fr/cert.pem
SSLCertificateChainFile /etc/letsencrypt/live/www.site.fr/chain.pem

SSLProtocol all -SSLv2 -SSLv3
SSLCipherSuite          ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA

SSLHonorCipherOrder on
SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire
SSLCompression Off

# HSTS (mod_headers est requis, 15 768 000 secondes = 6 mois)
Header always set Strict-Transport-Security « max-age=15768000

Virtualhost pour debian 6


ServerName www.site.fr
ServerAlias site.fr

DocumentRoot /var/www/www.site.fr/html

LogLevel warn

ErrorLog « |/usr/bin/cronolog /var/www/www.site.fr/log/%Y/%m/error_log »
CustomLog « |/usr/bin/cronolog /var/www/www.site.fr/log/%Y/%m/access_log » combined
TransferLog « |/usr/bin/cronolog /var/www/www.site.fr/log/%Y/%m/transfer_log »

php_admin_value auto_prepend_file none
php_admin_value open_basedir /var/www/www.site.fr:/tmp
php_admin_value upload_tmp_dir /var/www/www.site.fr/tmp
php_admin_value session.save_path /var/www/www.site.fr/tmp

SetEnv AWSTATS_FORCE_CONFIG www.site.fr

SSLEngine on

SSLCertificateKeyFile /etc/letsencrypt/live/www.site.fr/privkey.pem
SSLCertificateFile /etc/letsencrypt/live/www.site.fr/cert.pem
SSLCertificateChainFile /etc/letsencrypt/live/www.site.fr/chain.pem

<FilesMatch « \.(cgi|shtml|phtml|php)$ »>
SSLOptions +StdEnvVars

SSLOptions +StdEnvVars

BrowserMatch « .*MSIE.* » \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0

on active et on recharge apache

a2ensite www.site.fr.conf
apache2ctl graceful

Lexique commande

certonly : pour la création de certificat
renew : Pour le renouvellement
–dry-run : mode test
-q : mode silencieux sans sortie dans le shell
–force-renewal : pour forcer le renouvellement même si il n’est pas encore temps de le renouveler.
–email : pour spécifier un email différent de celui par défaut généré lors de la première utilisation
–rsa-key-size : taille de la clé RSA par défaut 2018
–pre-hook : Pour lancer une commande avant que certbot fasse l’action
–post-hook : Pour lance une commande après que certbot ait fonctionné.

Cas spécial pour les os non supportés.

L’astuce est valable si vous avez deux serveurs dont un avec une Debian. Il suffit de bouger les dns sur le serveur pouvant générer le certificat et de générer les fichiers.
Recopier les certificats dans le dossier /etc/letsencrypt sur la machine d’origine. Attention n’utilisez pas cette technique pour un service critique.

Test

Pour vérifier que votre serveur apache, votre virtualhost et votre certificat marchent correctement, rien de plus simple, il suffit de se rendre à cette adresse :

https://www.ssllabs.com/ssltest/

Et voila le résultat :

resultat test ssl site

Inconvénient

Il y a néammoins un inconvénient avec letsencrypt, les certificats sont valables que 2 mois … Il faut penser à renouveler vos certificats.

J’ai pour cela une astuce : nous allons utiliser le crontab et y mettre cette commande.


30 3 10 * * ./certbot-auto renew --pre-hook "/etc/init.d/apache2 stop" --post-hook "/etc/init.d/apache2 start"

Conclusion

Maintenant vous avez un site en https et en plus A+ d’après qualys et sans avoir débourser d’argent.

 

Read More...

Load Balancing SMTP ou autre grâce à iptable

13 juin 2015 | Posted in Réseau | By

Voila ma problématique : comment répartir le flux smtp entre deux serveurs avec un seul point d’entrée sans pour autant perdre les informations du flux tel que l’ip de la source? Au début, je pensais que cela serait facile. Manque de pot pour moi à l époque j’étais encore en Debian 6, voir 7 et les versions de haproxy et de nginx ne me permettaient pas de faire du load balancing proprement.

J’ai donc dù faire ça, on peut dire d’une manière nettement plus rustique via iptable.

Principe du Load Balancing SMTP

Pourquoi faire un Load Balancing SMTP, je pourrai très bien mettre en place plusieurs enregistrements MX. Certes, mais cela ne sert que pour les serveurs Mails qui m’envoient les messages de leur clients. Comment faire pour mes clients? Dans leur configuration outlook, ils sont obligés de spécifier l’adresse du serveur smtp.
Imaginons donc que pour une société, j’ai besoin de mettre en place deux serveurs SMTP afin de pouvoir faire face à leur charge mail.
Je ne vais pas dire au client les 100 premiers comptes vous les mettez sur smtp1.mondomaine.fr et les 100 suivants sur smtp2.mondomaine.fr. Si l’entreprise grandit et que nous rajoutions un troisième serveur, les deux premiers seront saturés, voir ralentis alors que le nouveau lui, montera en charge lentement.

 

Le Load Balancing va donc permettre d’apporter de la souplesse et de la facilité pour le client, ainsi qu’une meilleure répartition de la charge. Malheureusement, le Load Balancing SMTP via iptable ne permet pas de distribuer suivant la charge du serveur.
Dans la liste des autres inconvénients, vous aurez aussi celui du blacklistage, si le point d’entrée est blacklisté, tous les serveurs sont impactés.
Si on vous demande de rechercher dans les logs la trace d’un email, vous devrez chercher dans les 3 serveurs emails, car vous ne saurez pas lequel des serveurs mails a traité la requête.

Mais ne vous inquiétez pas, il existe des solutions pour cela, je traite d’ailleurs de la centralisation des logs dans un article.

Le principe est relativement simple, nous allons tagué chaque nouveau flux smtp. Suivant le tag, iptable l’enverra sur tel ou tel serveur.

Configurer iptable pour faire du Load Balancing SMTP

Pour la configuration du noyau je vous invite à lire cet article du blog

Le code iptable a chargé sur le point d’entrée.

iptables -t mangle -A PREROUTING -i eth0 -p tcp --dport 25 -m state --state new -m statistic --mode nth --every 2 --packet 0 -j CONNMARK --set-mark 0

iptables -t mangle -A PREROUTING -i eth0 -p tcp --dport 25 -m state --state new -m statistic --mode nth --every 2 --packet 0 -j CONNMARK --set-mark 1

iptables -t nat - A PREROUTING  -i eth0 -p tcp --dport 25 -m connmark --mark 0 -j DNAT --to 192.168.1.2:25

iptables -t nat - A PREROUTING  -i eth0 -p tcp --dport 25 -m connmark --mark 1 -j DNAT --to 192.168.1.3:25

petit décryptage :

-i eth0 : tout ce qui vient de l’interface réseau eth0

–dport 25 : à destination du port 25

–every 2 : tous les deux marquages, on boucle. Traduction le 2 représente le n serveur de votre infra

–set-mark 0 : on tag le paquet , le décompte du tag commence a 0 et non 1

Ensuite comme vous voyez, on redirige les paquets tagués 0 sur la machine a l ip 192.168.1.2 sur le port 25

Conclusion

Bien que rustique, cette solution reste très efficace et peu gourmande en ressources, elle peut répondre à n’importe quel protocole. Néanmoins, de part ce coté brut de fonderie, il faut bien comprendre que si la machine cible ne répond pas, on perdra le paquet et que vous n’aurez aucune gestion de la charge machine. Cette solution est à utiliser en dernier recours. Maintenant, haproxy gère le smtp de manière plus fine mais la technique sera valable pour d’autres ports.

Read More...

Créez un Lan dans votre ESXi accédant à internet

2 avril 2014 | Posted in Réseau, Système d exploitation | By

Préambule

Afin de tester OBM en mode déployé, j ai décidé de mettre en place plusieurs VM sous debian sur mon ESXI hébergé sous ovh.
Désirant avant tout tester les points d’accès à OBM dans ce type d’infra je voulais que seul un serveur ai une ip publique et que tous les autres soient sur un LAN. Déjà cela m’évitais d’avoir plusieurs ip failover a acheter à OVH. Mais pour que cela marche il me faut faire en sorte que mes serveurs sur le LAN puissent accéder tout de même à internet pour leur installation et mise à jour. Dans ce tutoriel, je vais vous montrer comment mettre en place sur votre esxi ce type de réseau virtualisé.

Préparation de l’esxi

Les switchs

En tout premier lieu il va falloir créer un nouveau switch dont l’étiquette réseau sera  LAN.
Dans votre vsphere :
Clic sur l’ip de votre serveur -> onglet configuration a droite -> encart matériel clic sur mise en réseau
En haut à droite ajouter gestion réseau
Sélectionner en type connexion : Machine virtuelle puis suivant et encore suivant
Dans étiquette réseau mettre LAN puis suivant et terminé.

Voila votre switch est maintenant opérationnel.
A ce stade vous avez maintenant deux switch, un vSwitch0 qui lui est connecté à la carte réseau de votre ESXI et le vSwitch1 qui va servir à créer votre LAN interne à l’ESXI

Configuration des VM

Il a deux types de VM

  1. La VM ayant accès a internet et faisant le partage
  2. Les VM du LAN n’ayant pas d’ip publique.

La VM partageant la connexion internet.

Elle aura besoin de deux adaptateurs réseaux un sur le VM Network relié à internet et l’autre sur le réseau LAN.

Les VM du LAN n’ayant pas d’ip publique.

Une seule interface réseau reliée uniquement sur le LAN.

Paramétrage des machines sous debian

Voila un schéma de ce à quoi nous devons arriver.

partageconnexion

Paramétrage du serveur partageant sa connexion internet.

Paramétrage carte réseau

Nous devons définir les cartes eth0 (connectée au VM NETWORK) et eth1 (connectée à LAN).

éditez le fichier  /etc/network/interfaces

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug eth0
iface eth0 inet static
        address 188.165.59.111
        netmask 255.255.255.255
        broadcast 188.165.59.111
        post-up route add 94.23.17.254 dev eth0
        post-up route add default gw 94.23.17.254
        post-down route del 94.23.17.254 dev eth0
        post-down route del default gw 94.23.17.254

allow-hotplug eth1
iface eth1 inet static
        address 192.168.4.1
        netmask 255.255.255.0
        broadcast 192.168.4.1
        # dns-* options are implemented by the resolvconf package, if installed
        dns-nameservers 213.186.33.99
        dns-search ovh.com

Mise à jour du noyau

Maintenant que les cartes sont ok, nous allons activer la fonction de fowarding d’ip dans le noyau.

éditez le fichier : /etc/sysctl.conf

dé-commentez la ligne : net.ipv4.ip_forward=1

Configuration du firewall iptable

Nous allons créer un fichier  autoloader au démarrage pour initialiser le firewall

vim /etc/network/if-pre-up.d/iptables-start

et coller ceci dedans

#!/bin/sh

# REMISE à ZERO des règles de filtrage
iptables -F
iptables -t nat -F

# Forwarfind ou eth0 est l interface connectée à internet
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

on rend le script exécutable

chmod a+x /etc/network/if-pre-up.d/iptables-start

Voila la machine est prête.

Paramétrage des serveurs sur le LAN

Nous aurons juste qu’a paramétrer l’interface réseau.

voici un exemple :

allow-hotplug eth0
iface eth0 inet static
        address 192.168.4.2
        netmask 255.255.255.0
        network 192.168.4.0
        broadcast 192.168.4.255
        gateway 192.168.4.1
        # dns-* options are implemented by the resolvconf package, if installed
        dns-nameservers 213.186.33.99

Voila tout est en place

Read More...