Docker sous Debian Stretch

12 octobre 2017 | Posted in Docker | By

Docker est train de devenir incontournable. Je reviendrai pas ici sur ce qu’est docker ni son principe de fonctionnement, il y a de très bons articles qui expliquent la différence entre docker et une vm, ses avantages et aussi c’est inconvénient.

Cet article a pour but de vous aider à installer docker mais aussi des outils dans la bonne version tel que docker-compose dans votre Debian from scratch.

Pré-requis :

Rien de bien compliqué, une installation vierge et à jour d’une Debian stretch 64 bit. Un conseil lors de la mise en place de votre Debian, il est fortement recommandé de faire une partition spécialement pour docker.
En effet vous n’êtes pas a l’abri d une image mal faite qui si ce n était pas le cas remplirait votre espace disque plantant ainsi votre serveur.

Installation de docker

L installation de docker est simple et d ailleurs très bien documenter dans leur wiki :

https://docs.docker.com/engine/installation/linux/docker-ce/debian/

Je vais néanmoins reprendre la documentation ici et vous donnez les instructions de sécurisation très simple à mettre en place.

Ce qui est bon à savoir c’est que docker propose un dépôt pour Debian.

Vu que vous êtes sur une Debian vierge on peut sauter les étapes de nettoyage.

On commence par installer les packets nécessaires à l utilisation du dépôt docker en https
apt-get install apt-transport-https ca-certificates curl gnupg2 software-properties-common

On importe la clé du dépôt docker :
curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg | apt-key add -

Maintenant on peut intégrer le dépôt docker dans notre sources.list
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") $(lsb_release -cs) stable"

Il nous reste plus qu’a installer docker

apt-get update
apt-get install docker-ce

Maintenant on configure docker pour démarrer automatiquement
systemctl enable docker

Sécurisation de docker

Docker déconseille de lancer les conteneurs en tant que root. L installation crée déjà un group docker. On doit juste rattacher votre utilisateur standard au group docker. Ensuite pensez bien que vous devez lancer vos conteneurs avec cet utilisateur

j’appellerai ici mon utilisateur toto, je sais c’est pas original.
usermod -aG docker toto

Vérification de votre docker

On va vérifier la version et lancer un docker de test :

Pour la version
sudo -u toto docker version
qui va répondre :

Client:
Version: 17.09.0-ce
API version: 1.32
Go version: go1.8.3
Git commit: afdb6d4
Built: Tue Sep 26 22:42:09 2017
OS/Arch: linux/amd64

Server:
Version: 17.09.0-ce
API version: 1.32 (minimum version 1.12)
Go version: go1.8.3
Git commit: afdb6d4
Built: Tue Sep 26 22:40:48 2017
OS/Arch: linux/amd64
Experimental: false

On lance un docker :

sudo -u toto docker run hello-world
qui répondra un jolie Hello from Docker!

Voila docker est prêt à être utilisé

Installation de docker-compose

Malheureusement le docker-compose disponible dans les dépôts officiels Debian est obsolète. Nous allons donc installer la dernière version en manuel.
Pour connaître la dernière version voici le lien :

https://github.com/docker/compose/releases

Normalement il n’y a pas besoin de dépendance pour que cela marche. Mais quand on regarde les dépendances du paquet officiel Debian on trouve cela :

python-backports.ssl-match-hostname python-cached-property python-docker python-dockerpty python-docopt python-functools32 python-jsonschema python-texttable python-websocket python-yaml

J ai testé sans , cela marche . Mais voulant être tranquille je les installe quand même :

apt install python-backports.ssl-match-hostname python-cached-property python-docker python-dockerpty python-docopt python-functools32 python-jsonschema python-texttable python-websocket python-yaml

On télécharge maintenant la dernière version du docker-compose. Vérifiez bien dans la ligne ci-dessous que la version est la mème que celle proposée dans le lien que je viens de vous fournir.

curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/bin/docker-compose
chmod +x /usr/bin/docker-compose

On verifie que tout fonctionne :
docker-compose version

qui répondra :

docker-compose version 1.16.1, build 6d1ac21

Conclusion

Voilà rien de bien compliquer, vous venez d’installer docker sous votre Debian ainsi que l utilitaire docker-compose. Souvenez vous que la bonne pratique est de ne pas lancer vos conteneurs en route !!
Nous venons ici que d’effleurer le haut de l iceberg. Docker est une technologie vaste et complexe.
Par la suite nous verrons :

  • Les commandes simples de docker
  • Les fichiers de configuration Dockerfile
  • Les principes de volumes et de persistances des données
  • Comment mettre à jour un conteneur
  • Les environnement complexes multi-conteneurs avec docker-compose
  • Des outils pour vous simplifier la vie comme Portainer ou Rancher
  • Comment superviser vos conteneurs
  • Comment sauvegarder vos conteneurs

Comme vous le voyez la route est encore longue avant de maîtriser complètement docker.

Read More...

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...

Réécrire l’adresse mail d’un utilisateur linux via postfix

16 janvier 2017 | Posted in Mail | By

Vous avez peut être déjà eu le cas d’un programme en bash qui envoie des emails via la fonction mail et vous avez défini votre hostname avec un nom spécial pour votre réseau du style serveurHp1

Quand votre utilisateur lance un mail, il y a donc un from du type utilisateur@serveurHp1

Évidemment, beaucoup de serveurs mail vont le refuser !! En effet, il est impossible de résoudre serveurHp1
Alors comment modifier ce mail from ?

Fonction Mail

Si c’est votre script, vous pouvez utiliser la fonction mail en modifiant ses attributs.

export REPLYTO=reponse@mondomaine.com
echo $MonCorpsdeMessage | mail -aFrom:email@mondomaine.com -s 'Sujet' destinataire@email.com

Décryptons :
En premier lieu, on peut définir avec le export une adresse différente pour le reply-to/
Ensuite, on pousse le corps du message via la variable $MonCorpsdeMessage.
L’attribut -a permet de modifier le header et donc l’adresse d’envoi (from).
L’attribut -s permet de spécifier le sujet.
Et enfin, nous mettons l’adresse du destinataire ( à noter que si vous envoyez à plusieurs contacts, il suffit de les séparer par une virgule )
Pour plus d’informations reportez vous au man.
man mail

Mais il arrive que cela ne soit pas vos scripts et que vous ne puissiez pas les modifier, alors voici la deuxième méthode :

Postfix

Il suffit de passer par le generic_maps de postfix

rajouter dans /etc/postfix/main.cf :
smtp_generic_maps = hash:/etc/postfix/generic

Il ne reste plus qu’à relier votre utilisateur à votre email

echo 'www-data email@mondomaine.com' >> /etc/postfix/generic

puis on créé la map et relance postfix

postmap /etc/postfix/generic
/etc/init.d/postfix restart

Voilà, ce n’est pas grand chose, mais pour le suivi de vos crons ou de vos robots cette astuce peut vraiment vous aider.

Read More...

Installation de Zend Server 8.5 sous debian 7

26 septembre 2016 | Posted in Logiciel, php | By

Bien qu’étant administrateur système depuis quelques années, mon premier amour a été le code php. Et comme on dit souvent, on revient souvent à ses premiers amours. Ainsi, aujourd’hui, on va installer et utiliser la dernière version de Zend Server.

Alors pourquoi Zend server. Tout simplement parce que j’aime coder avec Zend Studio et que les deux forment une plate-forme de développement très efficace. De plus, avec le Z-ray, nous avons une veritable analyse de notre code. Plusieurs Framework et CMS sont en plus pleinement intégrés dans Z-ray :

  • Magento
  • Drupal
  • ZF
  • WordPress
  • Symfony

Et franchement c’est un gros plus. Certains me diront « oui mais pour symfony on a la même chose ». Oui certes, mais que pour symphony, là, on l’a pour plusieurs types de framework.

Pré-requis :

Une debian 7 64 bits from scratch

Pour commencer, nous allons installer mysql car il n’est pas installé automatiquement. On en profitera pour rajouter quelques paquets.

apt-get install htop screen rsync wget less sudo psmisc ntp ntpdate bind9 bzip2 vim w3m zip iftop git joe iotop tmux fail2ban rkhunter mysql-server

et un peu de couleur pour vim

echo "syntax on
set hlsearch
set number" >> /etc/vim/vimrc

Editez le fichier /etc/apt/source.list et ajoutez

deb http://repos.zend.com/zend-server/8.5/deb_ssl1.0 server non-free

Puis récupérez la clé

wget http://repos.zend.com/zend.key -O- | apt-key add -

on met à jour notre liste

apt-get update

on installe notre zend server avec la version du php que l’on désire.

apt-get install zend-server-php-5.5

Configuration de Zend

Pour finir l’installation, il faut vous rendre sur l’interface web d’administration de votre serveur

http://VOTRE_IP:10081/ZendServer

Sélection_001_17_12:23:40Il suffit d’accepter en cochant la case puis next

Sélection_001_17_12:24:03On sélectionne le type de serveur que l’on veut, personnellement c’est pour du développement ce qui me permet d’avoir Z-ray d’activé.

Sélection_001_17_12:25:31On définit les mots de passe administrateur et développeur pour le zend server.

Sélection_001_17_12:25:42

Le zend server déploie ses librairies :

Sélection_001_17_12:26:23Il reste plus qu’a cliquer sur launch pour finir l’installation

Sélection_001_17_12:26:39Zend server travaille quelques intants

et vous arrivez sur votre administration :

Sélection_001_17_12:27:19

On va maintenant déployer phpmyadmin depuis l’interface de zend. Pour cela, c’est très simple, sur la page d’accueil, cliquez sur le logo phpmyadmin

Sélection_001_17_13:31:13

Sélection_001_17_13:31:50Zend server télécharge son paquet d’installation de phpmyadminSélection_001_17_13:32:21 Il faut rentrer le nom du répertoire pour la configuration d’apache

Sélection_001_17_13:42:55Zend Server valide que les pré-requis sont installés.

Sélection_001_17_13:50:40Il vous demande de rentrer les paramètres de la base de données que nous avons installé précédemment.
Normalement vous n’avez qu’a mettre le mot de passe.

Sélection_001_17_13:50:59Le dernier écran qui récapitule les informations et on clique sur déployer

Sélection_001_17_13:51:10Zend installe phpmyadmin.

Comme vous pouvez le constater, il est très simple de déployer une application sur zend server.

 

Conclusion

On a vu ensemble l’installation via le dépot de zend de zend server 8.5 sous debian 7. Mais pourquoi ne pas l’avoir fait sous debian 8 ?

En fait sous debian 8, on a un souci avec le module php5 de zend et apache 2.4. Ce n’est pour l instant pas compatible.

Read More...

Installation de Redmine 3.0.3 sous debian 7 avec passenger

logo redmine

13 juin 2015 | Posted in Logiciel | By

On ne présente plus redmine, le soft open-source de gestion de projet développé en Ruby sur la base du framework Ruby on Rails.

Pré requis

Un serveur sous debian 7 64 bit vierge.

Introduction

Je vais vous montrer comment installer redmine en version 3 sur une debian 7 avec :

  • mysql 5.5
  • ruby 2.2
  • rails 4.2
  • gem 2.4.5
  • apache2
  • passenger
  • et une authentification ldap

Installation d’apache et de mysql

On commence par le plus simple, on rajoutera le php et phpmyadmin et imagemagick en même temps.

apt-get install mysql-server mysql-common libmysqlclient-dev mysql-client apache2 apache2-mpm-prefork apache2-prefork-dev libapr1-dev libaprutil1-dev libfcgi-dev libssl-dev zlib1g-dev libcurl4-openssl-dev phpmyadmin imagemagick libmagickwand-dev php5 libapache2-mod-php5 php5-mysql php5-ldap php5-imagick php5-curl php5-gd php5-intl php-pear php5-imap php5-mcrypt php5-ps php5-pspell php5-recode php5-snmp php5-sqlite php5-tidy php5-xmlrpc php5-xsl php-apc curl vim subversion

Vous pouvez après reprendre les fichiers de configuration d’apache, php et mysql afin d’optimiser le tout et surtout le sécuriser.

Installation de ruby

Nous allons d’abord installer les pré-requis puis télécharger la dernière version disponible. En effet le package dans debian est la 1:1.9.3
C’est d’ailleurs pour cela que je n’ai pas installé le paquet passenger disponible.

apt-get install gcc build-essential zlib1g zlib1g-dev zlibc libzlib-ruby libssl-dev libyaml-dev libcurl4-openssl-dev libapr1-dev libxslt-dev checkinstall libffi-dev libreadline-dev git-core

Afin de faciliter l’installation, on va utiliser rmv
J’ai essayé avec rbenv et j’ai eu des soucis pour info.

mkdir /usr/local/rvm
cd /usr/local/rvm
gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
curl -sSL https://get.rvm.io | bash -s stable --rails
usermod -aG rvm www-data

Il faut maintenant reload votre shell

source ~/.bashrc

Pour vérifier que c’est bon :

ruby -v
ruby 2.2.1p85 (2015-02-26 revision 49769) [x86_64-linux]

Si vous obtenez

ruby 1.8.7 (2012-02-08 patchlevel 358) [x86_64-linux]

c’est que vous avez le paquet ruby de debian, supprimez le et recommencez l’installation comme décrite ci-dessus

et on vérifie gem

gem -v

Installation de rails, bundler et passenger pour redmine

gem install bundler
gem install passenger

On active le passenger
On génère les fichiers de configuration de passenger

passenger-install-apache2-module

On va mettre en place le fichier de configuration

vim /etc/apache2/mods-available/passenger.conf
PassengerRoot /usr/local/rvm/gems/ruby-2.2.1/gems/passenger-5.0.6
PassengerDefaultRuby /usr/local/rvm/gems/ruby-2.2.1/wrappers/ruby

Puis le chargement du module

vim /etc/apache2/mods-available/passenger.load
LoadModule passenger_module /usr/local/rvm/gems/ruby-2.2.1/gems/passenger-5.0.6/buildout/apache2/mod_passenger.so

On active le module et on refresh apache

a2enmod passenger
apache2ctl graceful

 

On vérifie que le module est bien activé

apache2ctl -t -D DUMP_MODULES | grep passenger

qui doit nous répondre

passenger_module (shared)

Tout va bien on continue.

Création de la base de données redmine

CREATE DATABASE redmine CHARACTER SET utf8;
CREATE USER 'redmine'@'localhost' IDENTIFIED BY 'my_password';
GRANT ALL PRIVILEGES ON redmine.* TO 'redmine'@'localhost';

Pensez à changer my_password par votre mot de passe.

Installation de redmine

mkdir -p /data/www/rubyonrails/
cd /data/www/rubyonrails

Pour plus de sécurité, nous allons créer un utilisateur système redmine avec pour groupe www-data

useradd -d /home/ -g 33 -m -s /bin/sh redmine

On télécharge notre archive et on la décompresse, pour faciliter les mises à jour futures, je vais créer un lien symbolique

wget http://www.redmine.org/releases/redmine-3.0.3.tar.gz
tar xvfz redmine-3.0.3.tar.gz
rm redmine-3.0.3.tar.gz
ln -s redmine-3.0.3 redmine

On configure la connexion à la base de données

cp -p /data/www/rubyonrails/redmine/config/database.yml.example /data/www/rubyonrails/redmine/config/database.yml

On se place dedans

cd /data/www/rubyonrails/redmine/

On installe les dépendances

bundle install --without development

On génère le token

bundle exec rake generate_secret_token

On nourrit la base de données de production

RAILS_ENV=production bundle exec rake db:migrate

puis

RAILS_ENV=production bundle exec rake redmine:load_default_data

On configure le vhost d apache

vim /etc/apache2/sites-available/redmine.site.com

<VirtualHost *:80>
ServerName redmine.site.com
DocumentRoot /data/www/rubyonrails/redmine/public/
<Directory /data/www/rubyonrails/redmine/public/>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>

RailsEnv production

AddOutputFilter DEFLATE text/html text/plain text/xml application/xml application/xhtml+xml text/javascript text/css
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html

ErrorLog /var/log/apache2/redmine.site.com/error.log
LogLevel warn
CustomLog /var/log/apache2/redmine.site.com/access.log combined
</VirtualHost>

on active le site et on restart apache

a2ensite redmine.site.com
apache2ctl graceful

Conclusion

Vous voila avec une installation redmine, il ne vous reste plus qu’à configurer vos projets et votre authentification Ldap dans l’administration de votre interface.

Read More...

Installation du waf modsecurity d’apache et reverse proxy

13 juin 2015 | Posted in Securisation | By

Par tous les moyens, vous cherchez à protéger votre réseau. Vous déployez un firewall pour bloquer les accès et les protéger de l’anti-spoofing, un fail2ban contre le brut force, rkhunter et compagnie, mais comment sécuriser les sites web que vous hébergez ??? Êtes-vous sûr que leur développement respecte les règles de l’art, qu’ils sont bien patchés avec les versions à jour… Il existe pourtant des solutions. Explorons ensemble la mise en place d’un web applicatif firewall appelé entre-amis WAF.

WAF le firewall pour vos applications web

Le principe du WAF est assez simple, un WAF se place entre internet et votre application web. Il va intercepter toutes les requêtes http pour les analyser suivant des règles de filtrage permettant de repérer les attaques et de les bloquer.
Il existe plusieurs modèles de WAF, nous allons ici mettre en place le module d’apache modsecurity. Vous pouvez bien sûr mettre directement votre waf sur votre serveur où sont les sites internets, mais ici je vais vous montrer comment mutualiser un WAF.

Schema waf mutualisé

schéma de flux pour infrastructure serveur web protégé par un waf

 

Explication de l infrastructure réseaux WAF

J ai choisi de mettre le serveur WAF sur un esxi pour plusieurs raison. D abord c est un serveur qui doit pouvoir évoluer suivant notre datacenter, une machine virtuelle offre cette flexibilité. Ensuite j ai fait le choix de donner une interface réseaux sur le WAF pour chaque serveur web que protégera le WAF. J ai donc une interface pour l administration et une pour chaque serveur web soit ici 3 en tout.
Pourquoi sommes toutes une interface par serveur web. Et bien tout simplement parce que cela m apporte de nombreux avantages de configurations je trouve. Pour le proxy je peux tout rediriger par l ip et non par le nom de domaine. Très utilie lorsque l’on a un serveur web hébergeant plusieurs nom de domaine.

 

Installation du WAF et du PROXY

On part d’une debian 7 fron scratch.

On commence par installer le serveur web apache et le modsecurity et le mod proxy

apt-get install apache2 libapache2-modsecurity libapache2-mod-proxy-html

On active tout le monde

a2enmod mod-security
a2enmod headers
a2enmod proxy_html
a2enmod proxy_http

 

Réglons tout de suite un bug de load de module. Si vous ne le faites pas vous aurez cette erreur dans votre /var/log/error.log


[Thu Jul 10 12:54:10 2014] [warn] proxy: No protocol handler was valid for the URL /. If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule.
[Thu Jul 10 12:54:10 2014] [warn] proxy: No protocol handler was valid for the URL /favicon.ico. If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule.

Il suffit de faire ceci :

ln -s /etc/apache2/mods-available/proxy_http.load /etc/apache2/mods-enabled/proxy_http.load

Paramétrage Modsecurity

on paramètre modsecurity

cd /etc/modsecurity
mv modsecurity.conf-recommended modsecurity.conf

On l’édite

vim /etc/modsecurity/modsecurity.conf

On active complètement modescurity

SecRuleEngine DetectionOnly

en

SecRuleEngine On

Puis rajouter juste après

SecDefaultAction "phase:2,log,auditlog,deny,status:403,tag:'SLA 24/7'"
SecServerSignature "Serveur Sécurisé"

Modifiez

SecPcreMatchLimit 1000
SecPcreMatchLimitRecursion 1000

En

SecPcreMatchLimit 2000
SecPcreMatchLimitRecursion 2000

Enfin

SecDataDir /tmp/

En

SecDataDir /var/cache/modsecurity/

Dé-commentez

SecDebugLog /var/log/apache2/modsecurity-debug.log
SecDebugLogLevel 3

et pour activer des règles on ajoute

Include /etc/modsecurity/activerules/*.conf

Attention l’include ne marche pas de manière récursive il faut toujours spécifier tous les répertoires ou vous avez des règles à charger.

Trouvez des règles pour le modsecurity

Par défault le modsecurity ne comporte pas de règle il faut en installer dans le dossier /etc/modsecurity/activerules/.

Il existe plusieurs sources gratuites ou payantes. Voici quelques liens.

A vous de faire votre choix.

En annexe un petit document à lire pour vous

http://www.ssi.gouv.fr/uploads/IMG/cspn/anssi-cspn-cible_2010-05fr.pdf

Configuration du Proxy

Pour rappel, nous avons détourné le flux http (port 80) allant sur le serveur web1 (192.168.1.40) vers le serveur waf sur son interface 192.168.1.4.

Il faut donc maintenant via apache rediriger le flux sur le serveur web1 grâce au mod_proxy

vim /etc/apache2/sites-available/web1.conf
<VirtualHost 192.168.1.4:80>

ServerAdmin webmaster@localhost
ProxyRequests Off
ProxyPreserveHost On
#ProxyHTMLExtended On

#SetOutputFilter INFLATE;proxy-html;DEFLATE
ProxyPass / http://192.168.1.40/
ProxyPassReverse / http://192.168.1.40/
ProxyTimeout 60
</Virtualhost>

On active le virtualhost et on recharge


a2ensite web1.conf
apache2ctl graceful

Modification des logs sur les serveurs Web

Si vous regardez les logs de votre serveur web, vous n’aurez plus que l’ip de l’interface du waf. Pour cela, il faut modifier le LogFormat afin qu’il reprenne en compte l’ip de l’internaute.

Éditez le fichier apache2.conf

vim /etc/apache2/apache2.conf

Commenter la ligne

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

ce qui donne

#LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

et ajoutez en dessous

LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

Il suffit maintenant d’appliquer le tout

apache2ctl graceful

Conclusion

Nous venons de rajouter une couche en plus pour la protection de votre infrastructure, de plus nous l’avons centralisé en un endroit, ce qui facilite l’entretien. N’oubliez pas que sans les règles un WAF ne sert à rien, il faut donc les mettre à jour régulièrement.

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...

Ajouter un domaine à votre owncloud

26 décembre 2014 | Posted in Owncloud | By

Introduction

Vous désirez mettre en place un owncloud, mais pour des raisons propres à vous, vous avez besoin que votre owncloud soit accessible via différents domaines.
Voici donc la procédure afin d’ajouter autant de domaines ou sous domaines à votre cloud personnel.

Pré-requis

Une installation d’owncloud tournant sur un apache2. La version d’owncloud que j ai est actuellement la 7.0.4

Comment ajouter un nouveau domaine à votre Owncloud

Modification de la configuration apache

En tout premier lieu nous allons mettre à jour la configuration de votre serveur web apache, afin qu’il accepte votre nouveau nom de domaine ou sous-domaine.

Éditez le fichier /etc/apache2/sites-avalaible/owncloud.conf

ServerAlias cloud.domaine.com

Modification de la configuration du owncloud

On y est presque il reste plus maintenant que rajoutez votre nom de domaine à la configuration du logiciel.

Éditez /var/www/config/config.php

Vous verrez un array trusted_domains
rajoutez une ligne en incrémentant le numéro et en mettant votre domaine.
Exemple :
Si votre domaine principal est cloud.test.com et que vous voulez rajouter cloud.famille.com
vous ferez cela :

'trusted_domains' =>
array (
0 => 'cloud.test.com',
1 => 'cloud.famille.com',
),

redémarrez apache

apache2ctl graceful

Conclusion

Voila une modification rapide à faire, néanmoins une petite remarque importante :
Owncloud peut forcer le passage en https, si vous voulez avoir un certificat vérifié sur une installation multi-domaine, pensez bien à prendre le certificat adéquate sous peine de devoir en racheter un.

Read More...