Faire un cloud chez soi comme les grands
Avant-propos
Selon le National Institute of Standards and Technology il existe trois catégories de services qui peuvent être offerts en cloud computing : IaaS (infrastructure as a service), PaaS (platform as a service) et SaaS (software as a service). Nous va faire du STaaS (Storage as a service). On va mettre en place un « cloud » privé accessible uniquement avec SSL avec la possibilité de chiffrer certaines bibliothèques. On va aussi tenter de se donner un semblant de sécurité. Sans compter véritablement, le partage de fichiers est installé et totalement fonctionnel en 1 heure environ avec un système d’exploitation installé préalablement. Inclus le temps de génération des clés et contrôle. Alors si vous avez 1 heure à tuer …
Avant de commencer
Pour commencer, il faut avoir une machine Linux sous la main. On peut en trouver une sur https://www.debian.org/CD/http-ftp/ (Jessie dans mon exemple). On télécharge et installe notre système d’exploitation. On attribue une IP fixe à notre machine, mais il fait pointer un nom de domaine dessus. On va faire pointer, par exemple https://ogelin.wordpress.com, sur une adresse accessible sur Internet.
Si on se trouve derrière un NAT ou un PAT, il faudra configurer notre routeur/pare-feu pour qu’il ouvre le port 443 (SSL) et le redirige vers notre machine avec une IP fixe. Le porte 443 sera le seul ouvert sur votre réseau et pointera au final sur le reverse proxy.
En résumé, on devrait avoir :
- une machine sous Linux avec une IP fixe
- un routeur/pare-feu correctement configuré avec le port 443 et pointant sur notre machine
- un DNS configuré pour pointer sur l’adresse publique du routeur/par-feu
Seafile avec MySQL
On passe en root sur la machine et on lance cette commande
aptitude install python2.7 python-setuptools python-simplejson python-imaging python-mysqldb mysql-server
On répond à la question du mot de passe de notre base MySQL avec précaution. On télécharge l’archive contenant notre serveur, on la décompresse, puis on déplace le dossier résultant dans un autre dossier au choix. Dans mon exemple, je le mets dans /opt/.
tar zxvf seafile-server_5.0.3_x86-64.tar.gz mv seafile-server_5.0.3_x86-64 /opt/seafile-server
Au passage, le dossier a été renommé. On se déplace dans le dossier et on lance notre configuration de MySQL.
cd /opt/seafile-server/ ./setup-seafile-mysql.sh
On répond aux divers questions. Il faut faire attention à une question :
What is the ip or domain of the server? For example: www.mycompany.com, 192.168.1.101 [ This server's ip or domain ]
Il faut répondre avec le DNS que vous avez pré-configuré précédemment. Dans mon exemple, cela donne ogelin.wordpress.com. Ne pas mettre votre adresse IP privée dans ce champ. Si vous faites une erreur à ce moment là, il sera possible de modifier la chose dans le fichier de configuration ccnet.conf.
Pour la suite, il faut créer une nouvelle base pour seahub, car à ce stage nous n’avons pas de base de données. Il faudra également renseigner le mot de passe de la base MySQL. Le script va générer plusieurs fichiers de base de données et de configuration.
Nous allons modifier encre 2 fichiers de configuration. Leur emplacement diffère selon les versions du serveur.
nano /opt/conf/ccnet.conf
On va ajouter une « s » à http. Nous avons http://ogelin.wordpress.com:8000. Nous allons le transformer pour avoir https://ogelin.wordpress.com:8000. On sauvegarde le fichier et on passe au suivant.
On faut remplacer le nom de domaine ogelin.wordpress.com par votre DNS. On ajoute ainsi au fichier seahub_settings.py la ligne FILE_SERVER_ROOT = ‘https://ogelin.wordpress.com/seafhttp’
echo "FILE_SERVER_ROOT = 'https://ogelin.wordpress.com/seafhttp'" >> /opt/conf/seahub_settings.py
On notera que les ports par défaut sont le 8000 et 8082. Il n’est pas nécessaire en soit de les changer, nous allons uniquement être visible par le port 443 grâce au routeur/pare-feu. Notre serveur est prêt pour fonctionner en SSL. On s’arrête là et on ne lance rien de plus sur le serveur seafile.
Reverse proxy
Nous allons tenter de sécuriser un peu nos échanges, tout en gardant à l’esprit qu’il est possible d’en faire plus. Tous ces changements vont dans le sens de mettre du SSL et de sécuriser ce SSL.
SSL
On met à jour notre arbre et on installe notre reverse proxy avec des clés/certificats avec les commandes
aptitude update aptitude install nginx cd /etc/ssl openssl genrsa -out privkey.pem 2048 openssl req -new -x509 -key privkey.pem -out cacert.pem -days 1095
On peut changer les nombres 2048 et 1095. On dit qu’on génère une clé RSA d’une longueur de 2048 bits pour 3 ans. Les clés de 1024 sont considérées comme faible. On peut remplacer 2048 par 4096, si vous souhaitez une plus grande longueur de clés.
Forward Secrecy & Diffie Hellman Ephemeral
On s’attaquer à un autre problème de sécurité au niveau des échanges de clés avec DH. On va générer une clé d’échange en 4069. La création prend un petit moment, si vous avez un café à vous faire. N’hésitez plus.
cd /etc/ssl/certs openssl dhparam -out dhparam.pem 4096
Plus d’information sur https://fr.wikipedia.org/wiki/Confidentialit%C3%A9_persistante
HTTP Strict Transport Security (HSTS)
On va demander à notre serveur de forcer la SSL et bloquer les iframe pour le clickjacking. Ces options n’enlève rien aux fonctionnalités du serveur.
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"; add_header X-Frame-Options "DENY";
Plus d’informations sur https://developer.mozilla.org/fr/docs/S%C3%A9curit%C3%A9/HTTP_Strict_Transport_Security
Configuration
On va maintenant configurer ngnix pour faire du SSL grâce à ces clés et certificats. On va aller modifier le fichier /etc/ngnx/nginx.conf avec la commande
nano /etc/ngnx/nginx.conf
Vérifier ou ajouter la présence des lignes suivantes dans la partie consacrée au SSL.
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH'; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m;
Nous n’acceptons pas de faire du SSLv3 pour se préserver de l’attaque de type POODLE. Nous pouvons ajouter des ciphers en place pour permettre la rétrocompatibilité avec des navigateurs comme IE6. Voir sur le lien suivant au besoin https://wiki.mozilla.org/Security/Server_Side_TLS
Nous allons encore y ajouter les divers éléments que vous avons préparer juste avant la derrière « } » du fichier. Merci de remplacer FQDN par votre DNS avec la copie dans votre fichier de configuration.
server { listen 80; server_name FQDN; # Modifier ICI rewrite ^ https://$http_host$request_uri? permanent; } server { listen 443; ssl on; ssl_certificate /etc/ssl/cacert.pem; ssl_certificate_key /etc/ssl/privkey.pem; ssl_dhparam /etc/ssl/certs/dhparam.pem add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"; add_header X-Frame-Options "DENY"; server_name FQDN; # Modifier ICI location / { fastcgi_pass 127.0.0.1:8000; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_script_name; fastcgi_param SERVER_PROTOCOL $server_protocol; fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_param SERVER_ADDR $server_addr; fastcgi_param SERVER_PORT $server_port; fastcgi_param SERVER_NAME $server_name; fastcgi_param HTTPS on; fastcgi_param HTTP_SCHEME https; access_log /var/log/nginx/seahub.access.log; error_log /var/log/nginx/seahub.error.log; } location /seafhttp { rewrite ^/seafhttp(.*)$ $1 break; proxy_pass http://127.0.0.1:8082; client_max_body_size 0; proxy_connect_timeout 36000s; proxy_read_timeout 36000s; } location /media { root /opt/seafile-server/seahub; } }
Lancement du serveur
On relance notre ami ngnix pour prendre en compte sa nouvelle configuration. On va tester si tout fonctionne bien.
systemctl nginx configtest
Et si tout est bon, on le relance
systemctl nginx restart
Puis on se déplace dans le répertoire de notre serveur et on le lance
cd /opt/seafile-server/
./seafile.sh start
./seahub.sh start-fastcgi
Si vous avec des « Done » à chaque commande. Le serveur devrait être accessible en https://FQDN, dans mon cas https://ogelin.wordpress.com
Troubleshooting
J’espère avoir été assez clair, cependant si vous avez des problèmes. Pensez à
- Vérifier vos DNS, le problème vient général de là.
- Revérifier les fichiers de configurations ccnet.conf et seahub_settings.py
- Contrôler que le routeur/pare-feu fait bien son travail de redirection
Laisser un commentaire