title | tags | robots | author |
---|---|---|---|
Configurer un VPS |
tuto, vps, server |
noindex, nofollow |
Julien Noyer |
Une application développée sur la stack dite "MEAN" présente l'avantage d'être basé sur un seul langagee, à savoir la Javascrip, et cette avantage reste intéressant en terme de déploiement. Le technologie Javascrip étant supportée chez tous les hébergeurs et les solutions qu'ils proposent, le déploiemeent est alors simplifié dans la mesure ou le choix de telle ou telle solution ne sont pas contraintes par le langage utilisé pour déveloperr l'application.
Les instructions qui vont suivre sont basées sur différrents tutoriels et peuvent être suives pour n'importe quel hébergeur proposant une offre qui donne accès à une connexion SSH vers un serveur (privé ou mutualisé), il est primordial que la commande sudo soit autorisée sur le serveur. L'hébergeur qui est présentée dans ce tutoriel est Digital Ocean car il présente plusieurs avantages, notament celui d'être intégré dans le pack GitHub Education.
Configuration du Droplet (VPS) Digital Ocean
Build Faster, Scale Easier. DigitalOcean's Optimized Droplets Saves Your Team Time
L'outil proposé par Digital Ocean s'appel un Droplet, il faut se rendre dans la section Create > Droplet du site qui permet de les configurer et de suivre les étapes. Pour ce tutorel la configuration suivante est utilsée :
- Distribution : Ubuntu 18.04.3 (LTS)x64
- Plan : 5 dollars/mo Standrad
- Datacenter : Amsterdam
- Authentication : One time passord
Il est possible d'associer une clef SSH à votre VPS, nous conseillons de ne pas le faire pour pouvoir l'ajouter en ligne de commande pendant la configuration du serveur.
Une fois les étapes de configurations passées, un mail est envoyé par Digital Ocean contenant les information pour ce connecter au Droplet créé. Nous allons à présent utiliser ces identifiants pour nous connecter et configurer le Droplet.
Comme dit précédemment peu importe l'hébergeur selectionner, les différentes commandes que nous allons utiliser sont utilissable sur n'importe quel serveur Linux.
La connexion au serveur est faite en Secure Shell (SSH) en invite de commande via la commande suivante :
ssh [email protected]
Un messagee s'affice alors dans le terminal vous demandant d'accepter la connexion au serveur :
The authenticity of host 'ip.du.droplet (ip.du.droplet)' can't be established.
ECDSA key fingerprint is SHA256:ucLbhJljBojqwF2c/py/GABOdltQo7c6N53B+VFL3ZU.
Are you sure you want to continue connecting (yes/no)?
Il faut accepter la connexion pour ensuite indiquer le mot de passe reçu par mail :
Warning: Permanently added '64.227.74.105' (ECDSA) to the list of known hosts.
[email protected]'s password:
A la première connexion sur le serveur avec l'identifiant root, il est demandé de changer le mote de passe. C'est une prremière étape de sécurité qui impose de ne pas garder le mot de passee généré par Digital Ocean.
Changing password for root.
(current) UNIX password:
Enter new UNIX password:
Retype new UNIX password:
Les mots de passe ne s'affichent pas, il faut veiller à bien les renseigner.
Une fois la connexion établie sur le serveur il faut avant toute chose s'assurer qu'il est à jour en tapant les commandes suivantes :
apt-get update
apt-get install
Il va de soit que l'utilisation d'un compte nommé root est une faille de sécurité dans la mesure ou il sera le premier à être testé dans le cadre d'une attaque. C'est pourquoi la première étape qu'il faut suivre dans la configuration d'un server distant et l'ajout d'un compte sudo et la suppression du compte root.
Pour créer un nouvel utilisateur il faut taper les commandes suivantes :
adduser adminserveur
usermod -aG sudo adminserveur
su - adminserveur
C'est 3 commandes permettent de créer un utilisatuer, de l'ajouter au groupe sudo et de et de changer de compte utilisateur.
La dernière commande permettant de se connecter avec l'utilisateur créé, il est à présent possible d'associer une clef SSH pour plus de sécurité. Dans un premeier temps il faut créer le dossier et le fichier pour enregister la clef sur le serveur :
mkdir ~/.ssh
chmod 700 ~/.ssh
nano ~/.ssh/authorized_keys
La dernière commande ouvre l'éditeur Nano dans lequel nous allons coller la clef SSH de notre compte. Dans un autre invite de commande nous allons tous d'abord créer une nouvelle clef si aucune n'est présente sur la machine :
ssh-keygen -t rsa
Un message s'affiche demandant d'indiquer le chemin vers la clef .../.ssh/id_rsa
, attention car si une clef existe déjà elle sera remplacée.
Nous n'ajoutons pas de
passphrase
pour simplifier l'utilisation de la clef.
nous pouvons maintenant copier la clef que nous venons de créer avec la commande suivante :
pbcopy < ~/.ssh/id_rsa.pub
une fois la clef copier i suffi de la coller dans la fenêtre Nano overte précédemment pour l'associer au compte créé sur le serveur. Il faut à présent changer les permissions sur le dossier .ssh
avec la commande suivante :
chmod 600 ~/.ssh/authorized_keys
NB : les commandes présentées pour gérer les clefs SSH correspondent à l'OS Machintosh, pour Windows il faut utiliser Putty.
Nous allons à présent supprimer le compte root, pour commencerr nous devons bloquer la possibilité de s'identifiant avec cet utilisateur. Le fichier de configuration sshd_config
nous permet dee gérer les méthode de connexion :
sudo nano /etc/ssh/sshd_config
Dans ce fichier il faut changer les valeur de PermitRootLogin
et PasswordAuthentication
puis sauvegarder le fichier :
PermitRootLogin no
PasswordAuthentication no
Une fois la configuration modifier il faut redémarrer le service SSH :
sudo service ssh restart
Il est à présent possible de ce connecter à notre serveur avec notre nouveau compte. Il faut d'abord nous deconnecter du compte en tapant deux fois la commande exit
pour ensuite relancer la connexion SSH avec le nouveau compte :
ssh [email protected]
Une fois la problématique de connexion sur le VPS passsée, nous pouvons à présent nus occuperr d'installer les modules et invites de commande pour déploiyer nodee application Javascript. Les dernières versions des Droplets Digital Ocean intégrent la commande Git, si ce n'est pas le cas, il faut l'installer aveec la commande :
sudo apt-get install git-all
Cette commande vous permet également de meettre tous les ouutils Git à jour.
Pour commencer nous allons installer les modules nous permettant d'utiliser un environement - Javascrip sur notre serveur, à savoir NodeJS avec les commandes suivantes :
curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -
sudo apt-get install nodejs
Il faut vérifier avant de taper la commande le numéro de version de NodeJS.
La commande NPM est à présent disponible sur notre serveur, nouss allons en profiterr pour installer PM2, un module qui nous permettra de génrer nos commande npm start
et LetsEncrypt qui nous permettra de géré nos certificat SSL:
sudo npm i -g pm2
sudo git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt
Nous allons à présent installer MongoDB qui nous permettra dee gérer les données de notre application :
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv EA312927
echo "deb http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.2.list
sudo apt-get install -y mongodb
Pour finir nous allons installer NGINX qui nous permettra de gérer les URLS de notre VPS :
sudo apt-get install nginx
Pour terminer la préparation du VPS nous allons activer NGINX et définir son comportement par defaut pour indiquer que nous redirigeons toutes les requêtes HTTP en HTTPS que nouos configurerons plus tard avec LetsEncrypt.
Pour commencer nous ajoutons ouvrir le fichierdefault
dans la configuration de NGINX et l'ouvrons dans Nano :
sudo nano /etc/nginx/sites-enabled/default
Une fois Nano ouvert, nous remplaçons le code affiché par le suivant avant de fermer et d'enregistrer le fichier :
# HTTP — redirect all traffic to HTTPS
server {
listen 80;
listen [::]:80 default_server ipv6only=on;
return 301 https://$host$request_uri;
}
Nous allons à présent crypter les requêtes grâce à la commande dhparam
afin de gérer les reqêtes HTTPS :
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
Nous devons maintenant créer un fichier de configuration SSL, afin de rendre les requêtes HTTPS valides. Pour cela nouus ouuvons le fichier :
sudo nano /etc/nginx/snippets/ssl-params.conf
Et nous ajoutons le code suivant avant d'enregister le fichier :
# See https://cipherli.st/ for details on this configuration
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_ecdh_curve secp384r1; # Requires nginx >= 1.1.0
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off; # Requires nginx >= 1.5.9
ssl_stapling on; # Requires nginx >= 1.3.7
ssl_stapling_verify on; # Requires nginx => 1.3.7
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
# Add our strong Diffie-Hellman group
ssl_dhparam /etc/ssl/certs/dhparam.pem;
Pour finir la configuration de NGINX nous devons autoriser certains typee de connexion avec les commandes suivantes :
sudo ufw allow OpenSSH
sudo ufw allow http
sudo ufw allow https
sudo ufw enable
Nous pouvons à présent démarrer le service NGINX pour finir notre configuration, dans un premier temps nous devons redémarrer notre VPS :
sudo reboot
Il faut ensuite nous reconnecter pour lancer le service NGINX :
sudo systemctl start nginx
Activation du service MongoDB
Pour configurer MongoDB en tant que service nous allons créer un fichier qui nous permettra de le configurer :
sudo nano /etc/systemd/system/mongodb.service
Nous allons coller le code suivant avant d'enrigistrer le fichier :
[Unit]
Description=High-performance, schema-free document-oriented database
After=network.target
[Service]
User=mongodb
ExecStart=/usr/bin/mongod --quiet --config /etc/mongod.conf
[Install]
WantedBy=multi-user.target
Nous poouvons à présent lancer le service MongoDB avec la commande suivante :
sudo systemctl start mongodb
Pour vérifier le statut du service il faut taper la commande
sudo systemctl status mongodb
.
Activation du service PM2
Nous allons à présent configurer PM2 pour qu’il puisse redémarrer si le serveur redémarre en tapant la commande suivante :
pm2 startup systemd
Cette dernière commande permet d’afficher un code à taper pour valider la configuration qui ressemble au code suivant :
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u dws --hp /home/adminuser
Déployer l'application sur le VPS
L'application que nous allons installer sur le VPS est basée sur la stack "MEAN" et nous l'avons versionnée sur GitHub. Pour l'installer sur notre VPS nous allons simplement créer un dossier à la racine de notre dossier utilisateur de notre VPS.
Une fois le dossier crée il suffi de la connecter au répertoire GitHub pour récuperer les fichier sources du projet, installer les dépendances et créer les fichiers nécessaires au démarrage du projet (comme les fichiers d'environnement par exemple). Ce tutoriel ne prend pas en compte ces notions qui sont spécifiques à chaque projet.
Gestion des certificats SSL
Les certificats SSL nous permettent de configurer l'accés HTTPS à nos noms de domaines. Avant de commencer cette configuration sur le VPS nous avons dans un premier temps acheté un nom dee domaine que nous avons fait pointé sur l'adresse IP de notre Droplet.
Une fois le nom de domaine correctement configuré, nous devons dans un premier temps stoper NGINX et lancer la commande LetsEncrypt pour générer les clef SSL :
sudo systemctl stop nginx.service
sudo /opt/letsencrypt/letsencrypt-auto certonly --standalone
Nous suivons les instruction de LetsEncrypt pour nous identifier puis nous définissions à la fin du processus notre nom de domaine (sans https://). Une fois le nom de domaine enregistré un message de validation affiche l'endroit ou sont stockées les clef SSL :
Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/<nom.de.domaine>/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/<nom.de.domaine>/privkey.pem
Les clef que nous venons de créer vont nous permettre à présent d'ajouter un fichier de configuration dans NGINX afin d'associer correctement les cleefs SSL à notre nom de domaine. Nous ouvons donc un nouuveau fichier dans Nano :
sudo nano /etc/nginx/sites-enabled/<nom.de.domaine>
Il est recommander de nommer le fichier par le nom de domaine
Dans le fichier qui vient de s'ouvir nous collons le code suivant pour gérer les clef SSL pour ce nom de domaine :
# HTTPS — proxy all requests to the Node app
server {
# Enable HTTP/2
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name <nom.de.domaine>;
# Use the Let’s Encrypt certificates
ssl_certificate /etc/letsencrypt/live/<nom.de.domaine>/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/<nom.de.domaine>/privkey.pem;
# Include the SSL configuration from cipherli.st
include snippets/ssl-params.conf;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://localhost:<port>/;
proxy_ssl_session_reuse off;
proxy_set_header Host $http_host;
proxy_cache_bypass $http_upgrade;
proxy_redirect off;
}
}
Nous prenons soins de bien modifier les informations pour qu'elles correspondent à notre configuration :
- nom.de.domaine : le domaine que nous avons fait poointer sur le serveur
- port : le port qui corrrespond à notre application
Pour vérifier notre configuration NGINX nous tapons la commande sudo nginx -t
qui noous affiche en résultat :
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Notre configuration est à présent terminé, nous pouvons pour la finaliser et activer le nom dde domaine ssur notre VPS, redemmarer le service NGINX avec la commande suivante :
sudo systemctl start nginx.service
Tout est prêt sur notre VPS pour configurer un nom de domaine en HTTPS qui pointee sur un port spécifique. Nous allons donc à présent utiliser PM2 pour lancer notre application en tapant la commander suivante dans le dossier racine dee notre application :
pm2 start server.js --name APPname
La liste ci-dessous contient les liens utiles cité dans ce document.
- Javascrip https://developer.mozilla.org/fr/docs/Web/JavaScript
- VPS https://fr.wikipedia.org/wiki/Serveur_dédié_virtuel
- Git https://git-scm.com
- GitHub https://github.com
- Commande sudo https://fr.wikipedia.org/wiki/Sudo
- Digital Ocean https://cloud.digitalocean.com
- GitHub Education https://education.github.com
- Linux https://fr.wikipedia.org/wiki/Linux
- Secure Shell (SSH) https://fr.wikipedia.org/wiki/Secure_Shell
- Nano https://doc.ubuntu-fr.org/nano
- PM2 https://pm2.keymetrics.io
- LetsEncrypt https://letsencrypt.org/fr/
- MongoDB https://www.mongodb.com/fr
- Express.js http://expressjs.com/fr/
- Angular.io https://angular.io/
- Node.js https://nodejs.org/en/docs/
- NGINX https://www.nginx.com
- HTTPS https://fr.wikipedia.org/wiki/HyperText_Transfer_Protocol_Secure
- SSL https://fr.wikipedia.org/wiki/Transport_Layer_Security
- Adresse IP https://fr.wikipedia.org/wiki/Adresse_IP