Base de connaisances

Faire un cloud chez soi comme les grands

leave a comment »

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

Written by olivier

2 janvier 2016 à 12:00

Laisser un commentaire