VPS OVH | Ubuntu 16.04.3 LTS | LAMP | SYMFONY 4
- Votre projet doit être versionné avec
gitet 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 100Ensuite, 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.pubColler 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.netsituée dans le fichier~/.ssh/known_hostsde 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 rootLe 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 userEntrez 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 userLes 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
vimounano. Avec vim, pour éditer le fichier appuyez une fois suripour activer le mode INSERT. Une fois les modifications apportées appuyez surECHAPpuis:wqpour sauvegarder et quitter.
Pour changer le port d'écoute, modifiez le fichier de configuration de SSH.
vim /etc/ssh/sshd_configTrouvez 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 restartIl 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_configRepé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 restartMaintenant 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 rootMais utilisez le nouvel utilisateur pour la suite du tutoriel.
su userAfin 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 localesLa 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-8Ensuite, redémarrez votre VPS dans votre espace client.
Cette commande est à lancer régulièrement
sudo apt-get update && sudo apt-get upgradeEntrez 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 sshEt pour libérer uniquement les connexions entrante du nouveau_port_ssh.
sudo ufw allow nouveau_port_ssh/tcpActivez le firewall.
sudo ufw enablePour afficher le statut et les règles du firewall.
sudo ufw status verbosePour supprimer une règle.
sudo ufw delete allow sshLa 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 0Fail2Ban 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 fail2banUne 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.backupApportez ensuite vos modifications sur le fichier :
sudo vim /etc/fail2ban/jail.confSi 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)sActivez 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.localUne fois l’opération terminée, vous devez redémarrer le service à l’aide de cette commande :
sudo /etc/init.d/fail2ban restartPour 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 upgradeInstallez 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.121Vérifiez ensuite les erreurs de syntaxe dans la configuration :
sudo apache2ctl configtest
# Affichage
Syntax OKPour appliquer les modifications, redémarrez Apache.
sudo /etc/init.d/apache2 restartLibérez les connexions entrante du port HTTP
sudo ufw allow 80/tcp
# ou
sudo ufw allow http/tcpAccé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-serverEntrez 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_installationVous 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-mcryptPHP 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 | lessTestez votre installation en créant un fichier info.php.
sudo vim /var/www/html/info.phpEt 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.iniRetirez 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-timezonesuivi de votre fuseau horaireEurope/ParisouUTC. Une liste est disponibletimedatectl list-timezones. Si vous avez des tâchescronn'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-commonPuis installez composer :
sudo curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin --filename=composerAccédez à la racine de l'environement web et créez le répertoire du site :
cd /var/www
sudo mkdir exemple.frModifiez les autorisations en faveur de l'utilisateur courant :
sudo chown -R $USER:$USER /var/www/exemple.frClonez votre projet (De préférence avec https)
git clone https://[email protected]/user/sf4-exemple.fr.git exemple.frConnectez-vous et entrez le mot de passe de l'utilisateur root MySQL.
mysql -u root -pCré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 -pVous 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.frNOTE : 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/consoleetpublic/index.phppour que tous les fichiers créés soient accessibles en écriture pour tout le monde.- En mode
prod(c'est-à-dire : lorsqueAPP_ENV=prodetAPP_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.frModifier le .env :
vim .envATTENTION : Si vous avez versionné le
.envou même le.env.distvous 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=0Modifiez également les paramètres de connexion à la base de données
DATABASE_URL=mysql://user:'mot_de_passe'@127.0.0.1:3306/exemple_dbVous pouvez sauvegarder et quitter le fichier .env
Installez les vendors
composer install --optimize-autoloaderGé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:warmupAfin 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 rewriteRedémarrez Apache pour appliquer les modifications
sudo /etc/init.d/apache2 restartAvec 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-apacheLe 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.frsudo 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.confRedémarrez Apache pour appliquer les modifications
sudo /etc/init.d/apache2 restartCertbot 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-runSi 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






