VPS OVH | Ubuntu 16.04.3 LTS | LAMP | SYMFONY 4
- Votre projet doit être versionné avec
git
et hébergé (Github, Bitbucket...). - Vous devez avoir acheté un VPS et un nom de domaine.
- Vous devez également générer une clé SSH sur votre ordinateur. (explications ci-dessous)
Générez les clés SSH sur votre ordinateur local. Cette clé vous permettra de vous authentifier plus facilement au serveur.
ssh-keygen -t rsa -b 4096 -o -a 100
Ensuite, créez un passphrase (Mot de passe) ou appuyez sur ENTRER
pour ne pas en utiliser.
NOTE : Si vous n'utilisez pas de passphrase, vous pourrez vous connecter au serveur sans entrer de mot de passe. Il est conseillé d'utiliser un passphrase, bien que ne pas en utiliser est toujours plus sécurisé que l'authentification par mot de passe classique.
Ceci génère deux fichiers : id_rsa (clé privée), et id_rsa.pub (clé publique), dans le dossier .ssh
du répertoire courant de l'utilisateur. Rappplez-vous que la clé privée ne doit pas être partagée.
Dans votre espace client OVH, en haut à droite, accédez à Mon compte
, puis sur la gauche Mes clés SSH
.
Pour ajouter une clé SSH, cliquez sur Ajouter une clé SSH
puis sur Dédié
.
Pour afficher votre clé publique :
cat ~/.ssh/id_rsa.pub
Coller le résultat de la commande et confirmer.
NOTE : Attention ! Ceci supprimera toutes les données sur votre serveur.
Toute réinstallation du VPS se fait dans la partie Cloud
de l'espace client OVH. Il suffit de selectionner le VPS dans la colonne de gauche puis de cliquer sur le bouton Réinstaller mon VPS
:
-
Sélectionnez la distribution Ubuntu 16.04 (Long Term Support Version) https://wiki.ubuntu.com/Releases
-
De préférence en langue anglaise pour éviter les erreurs de traduction.
-
Et sélectionnez votre clé SSH.
NOTE : Si vous avez effectué une réinstallation et que vous vous étiez déjà connecté en SSH, supprimez la clé commençant par
vpsXXXX.ovh.net
située dans le fichier~/.ssh/known_hosts
de votre ordinateur.
Lors de la première connexion, un message de confirmation va apparaître pour ajouter l'empreinte de l'hôte dans le fichier ~/.ssh/known_hosts
The authenticity of host 'vpsXXXX.ovh.net (192.89.11.121)' can't be established.
ECDSA key fingerprint is SHA256:*******************************************.
Are you sure you want to continue connecting (yes/no)? yes
Entrez yes
puis appuyez sur ENTRER
pour vous connecter.
À l’installation d’une distribution, un mot de passe est créé automatiquement pour l’administrateur (root). Il est très fortement conseillé de le modifier pour des raisons de sécurité.
passwd root
Le système demandera alors de rentrer un nouveau mot de passe deux fois pour le valider. Par mesure de sécurité, celui-ci ne s’affichera pas lors de l’écriture. Vous ne pourrez donc pas voir les caractères saisis. Il est très important d'utiliser un mot de passe fort.
NOTE : Un mot de passe fort, est supérieur à 8 caractères. Il doit combiner des lettres minuscules, majuscules, des chiffres, des caractères spéciaux et/ou des lettres accentuées. Mais également évité d'utiliser des mots du dictionnaire, noms/prénoms, nom d'entreprise, nom d'utilisateur... L'utilisation délibérée de fautes d'orthographe est un bon moyen de sécuriser facilement un mot de passe.
NOTE : L’administrateur root est créé par défaut sur les systèmes UNIX, il est l'utilisateur qui possède le plus de droits sur votre système. Il est déconseillé, voir dangereux de laisser votre VPS accessible uniquement via cet utilisateur, ce dernier pouvant effectuer des opérations irréversibles sur votre serveur.
Nous allons donc créer un utilisateur avec un accès restreint pour exécuter les tâches courantes.
adduser user
Entrez un mot de passe sécurisé et appuyez sur ENTRER
pour chaque question à passer puis valider les informations avec Y
.
Donnez ensuite les droits d'administrateur au nouvel utilisateur.
usermod -aG sudo user
Les commandes nécessitant les droits d'administrateur seront précédées du mot clé sudo
et le mot de passe de l'utilisateur sera alors demandé.
Ouvrez une nouvelle fenêtre de terminal et utilisez ssh-copy-id
.
ssh-copy-id [email protected]
La plupart des attaques que votre serveur va recevoir viendrons de robots visant le port SSH par défaut (le port 22). Modifier le port d’écoute, leur compliquera la tâche et rendra votre serveur plus difficile à atteindre.
EDITEUR : Vous pouvez utiliser
vim
ounano
. Avec vim, pour éditer le fichier appuyez une fois suri
pour activer le mode INSERT. Une fois les modifications apportées appuyez surECHAP
puis:wq
pour sauvegarder et quitter.
Pour changer le port d'écoute, modifiez le fichier de configuration de SSH.
vim /etc/ssh/sshd_config
Trouvez la ligne Port 22
et remplacez le port par un port non-utilisé.
NOTE : Conservez le numéro de port en dessous de 1024 car ce sont des ports privilégiés qui ne peuvent être ouverts que par l'administrateur ou par des processus s'exécutant en tant qu'administrateur.
Pour voir les ports utilisés :
netstat -nat | grep LISTEN
# Affichage (Une fois la configuration par défaut du serveur terminée)
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:587 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp6 0 0 :::443 :::* LISTEN
tcp6 0 0 :::80 :::* LISTEN
tcp6 0 0 :::22 :::* LISTEN
Pour appliquer les modifications, redémarrez SSH.
/etc/init.d/ssh restart
Il est également recommandé de désactiver l'accès direct de l'utilisateur root via le protocole SSH.
Pour effectuer cette opération, il faut modifier le fichier de configuration SSH.
vim /etc/ssh/sshd_config
Repérez ensuite la ligne suivante :
PermitRootLogin yes
Remplacez le yes
par no
.
Pour que cette modification soit prise en compte, il faut redémarrer le service SSH.
/etc/init.d/ssh restart
Maintenant et pour exécuter les tâches courantes, servez-vous de l’utilisateur que vous venez de créer pour vous connecter à votre VPS.
Ouvrez une nouvelle fenêtre de terminal et testez la connexion.
ssh [email protected] -p nouveau_port
À partir de maintenant, les commandes nécessitant les droits root seront précédées du mot clé sudo
.
Le mot de passe de l'utilisateur vous sera alors demandé.
Si jamais vous avez besoin d'accéder à l'utilisateur root, utilisez la commande :
su root
Mais utilisez le nouvel utilisateur pour la suite du tutoriel.
su user
Afin de résoudre les messages d'erreurs lors de la mise à jour des paquets, définissez la locale par défaut du serveur.
sudo dpkg-reconfigure locales
La liste des locales va apparaître, appuyez sur ENTRER
, puis sélectionner en_US.UTF-8
grace aux flèches directionnelles et appuyez sur ENTRER
pour valider.
sudo localedef -i en_US -c -f UTF-8 en_US.UTF-8
Éditez le fichier /etc/default/locale
:
LANG=en_US.UTF-8
LC_ALL=en_US.UTF-8
LANGUAGE=en_US.UTF-8
Ensuite, redémarrez votre VPS dans votre espace client.
Cette commande est à lancer régulièrement
sudo apt-get update && sudo apt-get upgrade
Entrez Y
pour installer les paquets. Si vous êtes de nouveau questionné, utilisez les valeurs par défaut sauf si vous savez ce que vous faites.
Pour libérer le port SSH par défaut.
sudo ufw allow ssh
Et pour libérer uniquement les connexions entrante du nouveau_port_ssh
.
sudo ufw allow nouveau_port_ssh/tcp
Activez le firewall.
sudo ufw enable
Pour afficher le statut et les règles du firewall.
sudo ufw status verbose
Pour supprimer une règle.
sudo ufw delete allow ssh
La mémoire partagée peut être utilisée lors d'une attaque contre un service en cours d'exécution.
Modifiez /etc/fstab
pour ajouter une protection.
sudo vim /etc/fstab
À la afin du fichier ajoutez cette ligne :
tmpfs /run/shm tmpfs defaults,noexec,nosuid 0 0
Fail2Ban est un framework de prévention contre les intrusions dont le but est de bloquer les adresses IP inconnues qui tentent de pénétrer dans votre système. Ce paquet est recommandé, voire indispensable, pour vous prémunir contre toute tentative de brute force sur vos services.
NOTE : Fail2Ban scanne les logs et interdit les adresses IP qui affichent des signes malveillants (trop d'échecs de mot de passe, mauvais nom d'utilisateur...) En général, Fail2Ban est utilisé pour mettre à jour les règles du pare-feu afin de rejeter les adresses IP pendant une durée donnée, bien que toute autre action arbitraire puisse également être configurée. D'autre part, Fail2Ban est livré avec des filtres pré-configurés pour différents services (apache, courrier, ftp, SSH, etc).
L’installation de ce paquet s’effectue avec la commande suivante :
sudo apt-get install fail2ban
Une fois le paquet installé, il faut modifier le fichier de configuration de ce dernier pour l’adapter à la vôtre. Avant toute modification, il est recommandé de faire une sauvegarde de ce fichier en tapant la commande suivante :
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.conf.backup
Apportez ensuite vos modifications sur le fichier :
sudo vim /etc/fail2ban/jail.conf
Si vous souhaitez recevoir des e-mails de Fail2Ban informant si des hôtes sont bannis, changez les lignes suivantes par votre adresse e-mail.
destemail = [email protected]
Changez également la ligne action = %(action_)s
par :
action = %(action_mwl)s
Activez tous les services que vous souhaitez que Fail2Ban surveille en changeant enabled = false
par enabled = true
Si vous avez modifié le port SSH par défaut, vous devez remplacer tout les port = ssh
par port = nouveau_port_ssh
[sshd]
enabled = true
port = nouveau_port_ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
Vous pouvez également créer des filtres pour les différents services que vous souhaitez surveiller avec Fail2Ban et qui ne sont pas fournis par défaut en les plaçant dans le fichier suivant :
sudo vim /etc/fail2ban/jail.local
Une fois l’opération terminée, vous devez redémarrer le service à l’aide de cette commande :
sudo /etc/init.d/fail2ban restart
Pour toute informations complémentaire concernant Fail2Ban, n’hésitez pas à consulter la documentation officielle.
Linux Apache MySQL PHP
Vérifiez les mises à jour disponibles, puis installez-les toutes.
sudo apt-get update && sudo apt-get upgrade
Installez le serveur Web Apache.
sudo apt-get install apache2
Éditez la configuration d'Apache:
sudo vim /etc/apache2/apache2.conf
À la fin de ce fichier, ajoutez le mot-clé ServerName
, pointant vers le domaine du serveur ou IP.
ServerName 192.89.11.121
Vérifiez ensuite les erreurs de syntaxe dans la configuration :
sudo apache2ctl configtest
# Affichage
Syntax OK
Pour appliquer les modifications, redémarrez Apache.
sudo /etc/init.d/apache2 restart
Libérez les connexions entrante du port HTTP
sudo ufw allow 80/tcp
# ou
sudo ufw allow http/tcp
Accédez à http://vpsXXXX.ovh.net
. Si vous voyez la page suivante, Apache fonctionne correctement :
Installez le système de gestion de base de données, MySQL.
sudo apt-get install mysql-server
Entrez un mot de passe pour l'utilisateur root MySQL.
Une fois l'installation terminée, exécutez un script de sécurité qui supprimera certaines valeurs par défaut dangereuses et verrouillera certains accès :
mysql_secure_installation
Vous serez invité à entrer le mot de passe que vous avez défini pour l'utilisateur root MySQL. Ensuite, il vous sera demandé si vous voulez configurer le VALIDATE PASSWORD PLUGIN
.
ATTENTION : Si activé, les mots de passe qui ne correspondent pas aux critères spécifiés seront rejetés par MySQL avec une erreur. Cela entraînera des problèmes si vous utilisez un mot de passe faible mais également avec un logiciel qui configure automatiquement les mots de passe de l'utilisateur MySQL, tel que
phpMyAdmin
. Il est possible de laisser la vérification désactivée, mais vous devez toujours utiliser des mots de passe forts et uniques pour vos bases de données.
Si le mot de passe n'est pas fort et unique vous pouvez le modifier dans le mysql_secure_installation
Pour le reste des questions, vous pouvez répondre y
. Cela supprimera certains utilisateurs anonymes, la base de données de test, désactivera les connexions root distantes et chargera ces nouvelles règles afin que MySQL respecte immédiatement les modifications que nous avons apportées.
Le système de base de données est maintenant configuré !
Pour installer la dernière version de php, lancez :
sudo apt-get install -y python-software-properties
sudo add-apt-repository -y ppa:ondrej/php
sudo apt-get update -y
sudo apt-get install php7.2 libapache2-mod-php7.2 php7.2-mysql php-mcrypt
PHP a beaucoup de modules qui peuvent être facilement installés pour améliorer ses fonctionnalités. Recherchez ces modules supplémentaires avec apt-cache
:
apt-cache search php7.2 | less
Testez votre installation en créant un fichier info.php
.
sudo vim /var/www/html/info.php
Et ajoutez ceci pour afficher la configuration de php.
<?php phpinfo(); ?>
Modifiez le date.timezone
de votre php.ini
sudo vim /etc/php/7.2/cli/php.ini
Retirez le commentaire ;
et indiquez le fuseau horaire de l'application par exemple : Europe/Paris
NOTE : Pour vérifier l'heure et le fuseau horaire du serveur utilisez :
timedatectl status
. Pour le modifier entrez :sudo timedatectl set-timezone
suivi de votre fuseau horaireEurope/Paris
ouUTC
. Une liste est disponibletimedatectl list-timezones
. Si vous avez des tâchescron
n'oubliez pas de le redémarrer.
Ouvrez votre navigateur et accédez à http://vpsXXXX.ovh.net/info.php
. Si vous voyez la page suivante, PHP est correctement installé !
Installez git
pour récupérer votre projet et acl
pour attribuer les autorisations lors de l'installation de l'application. Pour finir, ajoutez les modules php utilisés par Symfony et composer
.
sudo apt-get install acl git php7.2-curl php7.2-zip php7.2-xml php7.2-mbstring php7.2-gd php7.2-common
Puis installez composer :
sudo curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin --filename=composer
Accédez à la racine de l'environement web et créez le répertoire du site :
cd /var/www
sudo mkdir exemple.fr
Modifiez les autorisations en faveur de l'utilisateur courant :
sudo chown -R $USER:$USER /var/www/exemple.fr
Clonez votre projet (De préférence avec https
)
git clone https://[email protected]/user/sf4-exemple.fr.git exemple.fr
Connectez-vous et entrez le mot de passe de l'utilisateur root MySQL.
mysql -u root -p
Créez la base de données de l'application.
CREATE DATABASE exemple_db;
La base de données créée, l'étape suivante consiste à créer un utilisateur MySQL et à lui donner accès à notre nouvelle base de données.
CREATE USER 'user'@'localhost' IDENTIFIED BY 'mot_de_passe';
Cela va créer un utilisateur nommé user
, avec le mot de passe mot_de_passe
. Il est important de noter que ce sont des valeurs d'exemples et vous devrez utiliser un mot de passe fort pour votre utilisateur MySQL afin de garantir la sécurité de vos données.
Nous allons accorder à cet utilisateur les autorisations appropriées la base de données :
GRANT ALL PRIVILEGES ON exemple_db.* TO 'user'@'localhost';
Puis valider les modifications.
FLUSH PRIVILEGES;
Pour tester si tout fonctionne comme prévu, quittez le client MySQL.
quit;
Et connectez-vous en utilisant le nouvel utilisateur et mot de passe MySQL que vous venez de créer.
mysql -u user -p
Vous pouvez vérifier les bases de données auxquelles cet utilisateur a accès avec :
SHOW DATABASES;
# Affichage
+--------------------+
| Database |
+--------------------+
| information_schema |
| exemple_db |
+--------------------+
Vous pouvez alors quitter le client MySQL.
quit;
Modifiez les autorisations en faveur de l'utilisateur www-data
sudo setfacl -R -m u:www-data:rX /var/www/exemple.fr
NOTE : Dans les versions précédentes de Symfony, il était nécessaire d'attribuer des autorisations spéciales pour s'assurer que le dossier de cache était accessible en écriture. Dans Symfony 4, tout fonctionne automatiquement :
- En mode
dev
,umask()
est utilisé dansbin/console
etpublic/index.php
pour que tous les fichiers créés soient accessibles en écriture pour tout le monde.- En mode
prod
(c'est-à-dire : lorsqueAPP_ENV=prod
etAPP_DEBUG=0
), tant que vous exécutezphp bin/console cache:warmup
, aucun fichier de cache n'aura besoin d'être modifié lors de l'exécution de l'application.
Accédez au répertoire de votre application :
cd exemple.fr
Modifier le .env
:
vim .env
ATTENTION : Si vous avez versionné le
.env
ou même le.env.dist
vous devez obligatoirement modifier l'APP_SECRET
Pour générer un APP_SECRET
php -r "print(hash('sha1', uniqid(mt_rand(), true)));"
N'hésitez pas à modifier l'algorithme. Une liste est disponible avec :
php -r "print_r(hash_algos());"
Passez ensuite le projet en mode prod
APP_ENV=prod
APP_DEBUG=0
Modifiez également les paramètres de connexion à la base de données
DATABASE_URL=mysql://user:'mot_de_passe'@127.0.0.1:3306/exemple_db
Vous pouvez sauvegarder et quitter le fichier .env
Installez les vendors
composer install --optimize-autoloader
Générez ensuite le schéma de la base de données puis réinitialisez le cache :
php bin/console doctrine:schema:create
php bin/console cache:clear && php bin/console cache:warmup
Afin de lier votre nom de domaine à votre VPS. Pensez à copier l'adresse IP du VPS située dans votre espace client OVH. Rendez-vous ensuite dans la partie Web
de l'espace client et sélectionnez votre nom de domaine. Cliquez ensuite sur l'onglet Zone DNS
puis sur la droite sur Réinitialiser ma zone DNS
.
Cochez OUI
pour utiliser la configuration de base et cliquez sur Suivant
.
Sélectionnez Personalisé
puis coller l'IP du VPS préalablement copiée.
Pour les mails, vous pouvez utiliser une redirection vers une adresse mail existante. Pour cela, sélectionez Redirection
puis une fois les modifications éffectuées créez votre redirection dans le menu Emails
de la barre latérale de gauche.
Puis confimez.
La modification peut prendre quelques instants. En attendant créez votre ou vos VirtualHosts.
Créez une nouvelle VirtualHost
sudo vim /etc/apache2/sites-available/exemple.fr.conf
<VirtualHost *:80>
ServerAdmin [email protected]
ServerName exemple.fr
DocumentRoot /var/www/exemple.fr/public
<Directory /var/www/exemple.fr/public>
AllowOverride None
Order Allow,Deny
Allow from All
<IfModule mod_rewrite.c>
Options -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>
</Directory>
# (Optional) Disable the RewriteEngine for the bundles asset directories
<Directory /var/www/exemple.fr/public/bundles>
<IfModule mod_rewrite.c>
RewriteEngine Off
</IfModule>
</Directory>
ErrorLog /var/log/apache2/exemple.fr_error.log
CustomLog /var/log/apache2/exemple.fr_access.log combined
</VirtualHost>
Activez la VirtualHost de l'application et désactivez celle par défaut
sudo a2ensite exemple.fr.conf
sudo a2dissite 000-default.conf
sudo a2enmod rewrite
Redémarrez Apache pour appliquer les modifications
sudo /etc/init.d/apache2 restart
Avec Let's Encrypt il est très facile de passer votre site en https
Importez le repository puis installez Certbot
sudo apt-get update
sudo apt-get install software-properties-common python-software-properties
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install python-certbot-apache
Le client Let's Encrypt de certbot est maintenant prêt à être utilisé.
sudo certbot --apache -d exemple.fr
# ou pour plusieurs domaines
sudo certbot --apache -d exemple.fr -d matomo.exemple.fr
sudo vim /etc/apache2/sites-available/exemple-le-ssl.fr.conf
<VirtualHost *:80>
ServerName exemple.fr
DocumentRoot /var/www/exemple.fr/public
<IfModule mod_rewrite.c>
Options -MultiViews
RewriteEngine On
# Redirect http to https (only after configurate the SSL)
RewriteCond %{SERVER_NAME} =exemple.fr
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
</IfModule>
</VirtualHost>
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerAdmin [email protected]
ServerName exemple.fr
DocumentRoot /var/www/exemple.fr/public
<Directory /var/www/exemple.fr/public>
AllowOverride None
Order Allow,Deny
Allow from All
<IfModule mod_rewrite.c>
Options -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>
</Directory>
# (Optional) Disable the RewriteEngine for the bundles asset directories
<Directory /var/www/exemple.fr/public/bundles>
<IfModule mod_rewrite.c>
RewriteEngine Off
</IfModule>
</Directory>
ErrorLog /var/log/apache2/exemple.fr_error.log
CustomLog /var/log/apache2/exemple.fr_access.log combined
SSLCertificateFile /etc/letsencrypt/live/exemple.fr/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/exemple.fr/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>
Libérer le port 443
du firewall
sudo ufw allow https
Désactivez l'ancienne VirtualHost. La nouvelle a déjà été activée.
sudo a2dissite exemple.fr.conf
Redémarrez Apache pour appliquer les modifications
sudo /etc/init.d/apache2 restart
Certbot est livré avec une tâche cron qui va automatiquement renouveller les certificats avant leur exipiration. Les certificats de Let's Encrypt durent 90 jours, il est donc fortement recommandé d'utiliser cette fonctionnalité.
Vous pouvez tester le renouvellement de vos certificats avec :
sudo certbot renew --dry-run
Si vous ne voyez pas d'erreurs, la configuration est terminée.
NOTE : En temps voulu, Certbot renouvelera les certificats et redémmarrera apache pour appliquer les changements. En cas d'echec, Let’s Encrypt enverra un message à l'adresse mail spécifiée pour avertir que le certificat va exipirer.
Librement inspiré des documentations suivantes : OVH - Digital Ocean - Symfony 4.0 - Certbot
Chapeau bas l'artiste !