Installer LAMP et Adminer sur un cloud Hetzner

hetzner+lamp.png

Pour installer l'ensemble applicatif LAMP (Linux Apache MySQL et PHP), vous devez au préalable vous créer un compte Hetzner et posséder un nom de domaine. Ceci fait, allons-y.

Créer un projet

  • Votre compte Hetzner créé, connectez-vous au service cloud.

  • Créer votre projet si ce n'est déjà fait. Un projet regroupe un ensemble de serveurs.

Ajouter une clé SSH

Si vous éprouvez des difficultés avec les clés SSH sur Hetzner, peut-être bien que cet article pourrait vous aider : Se connecter en SSH sur un server cloud Hetzner.

Ajouter un serveur

  • Ajouter un nouveau serveur à votre projet. Préférez un emplacement européen, sélectionner l'image APPS > LAMP Stack.

  • Sélectionner le type de serveur que vous désirez en fonction de votre budget et de la puissance que vous désirez.

  • La clé SSH que vous avez renseigné précédemment devrait être sélectionné par défaut.

  • Donnez un petit nom à votre nouveau serveur et donnez-lui vie.

Ajouter un certificat SSL (HTTPS)

  • Faire pointer votre nom de domaine vers votre serveur.

  • Ouvrir un terminal (invite de commandes) et connecter en SSH à votre serveur :

ssh root@ipduserveur
  • A la première connexion sur votre terminal, il va vous être demandé de saisir votre nom de domaine. Cette étape est cruciale, elle va générer la configuration pour Apache qui va bien et vous générer un certificat avec Let's Encrypt :

  • Dire oui au deux premières questions, puis saisir votre e-mail pour recevoir les notifications de Let's Encrypt.

  • Félicitations, votre nom de domaine pointe désormais vers un beau Hello World en https ;)

  • Vous devriez avoir une version d'Ubuntu récente, pour l'identifier :

lsb_release -a

Récupérer le mot de passe root pour MySQL

Votre mot de passe root pour MySQL (mysql_root_pass) a été déposé sur votre serveur, vous pouvez y accéder par SFTP dans /root/.hcloud_password. Une fois le mot de passe récupéré et stocké dans un VaultWarden, supprimer le fichier.

Initialiser MySQL

Pour créer votre utilisateur MySQL nous allons configurer MySQL.

  • Dans votre terminal, connecté en SSH, saisir :
mysql_secure_installation
  • Saisir votre mot de passe root MySQL.

  • Ne validez pas le composant VALIDATE PASSWORD (sous si vous le souhaitez), vous pouvez rencontrer potentiellement des erreurs à l'installation de certaines applications.

  • Modifier votre mot de passe root si vous le souhaitez, celui généré par défaut est quand même pas mal.

  • Supprimer les utilisateurs anonymes.

  • Désactiver l'accès à distance de l'accès root.

  • Supprimer la base de données test.

  • Et enfin recharger les tables de privilèges.

All done!

  • Se connecter à MySQL
mysql -u root -p
  • Saisir votre mot de passe root MySQL.

  • Saisir la requête suivante :

CREATE USER 'username' IDENTIFIED BY 'password';

En prenant bien soin de remplacer username et password hin.

  • Donner tous les droits au nouvel utilisateur :
GRANT ALL PRIVILEGES ON * . * TO 'username';
  • Vous pouvez voir les droits de votre nouvel utilisateur avec cette requête :
SHOW GRANTS FOR username;
  • Pour quitter MySQL :
exit

Bye

Se connecter depuis un autre serveur à MySQL

  • Toujours avec un utilisateur root, saisir la commande suivante pour éditer le fichier de configuration de MySQL :
nano /etc/mysql/mysql.conf.d/mysqld.cnf
  • Chercher le paramètre bind-address et remplacer la valeur 127.0.0.1 par 0.0.0.0

  • Redémarrer MySQL :

systemctl restart mysql
  • Se connecter à MySQL
mysql -u root -p
  • Saisir votre mot de passe root MySQL.

  • Créer un utilisateur spécifique associé au serveur distant (remote_server_ip) :

CREATE USER 'username'@'remote_server_ip' IDENTIFIED BY 'password';

En prenant bien soin de remplacer username, remote_server_ip et password hin.

  • Lui donner les droits selon le besoin, exemple :
GRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT, REFERENCES, RELOAD on *.* TO 'username'@'remote_server_ip' WITH GRANT OPTION;
  • Possiblement, vous pourriez rencontrer l'erreur ER_NOT_SUPPORTED_AUTH_MODE à la connexion, modifier alors le mode d'authentification :
ALTER USER 'username'@'remote_server_ip' IDENTIFIED WITH mysql_native_password BY 'password';
  • Vider la mémoire
FLUSH PRIVILEGES;
  • Pour quitter MySQL :
exit

Bye

  • Redémarrer MySQL :
systemctl restart mysql
  • Ajouter une règle dans le pare-feu pour autoriser cette connexion au port 3306 :
ufw allow from remote_server_ip to any port 3306
  • Activer le pare-feu si ce n'avait pas été fait :
ufw enable
  • Vérifier si la règle a été ajoutée :
ufw status
  • Attention ! Si vous ne voyez que la nouvelle règle que vous venez d'ajouter, pensez à ajouter les suivantes :

Pour l'accès SSH

ufw allow 22/tcp

Pour l'accès au site et renouvellement de votre certificat SSL :

ufw allow in 80
ufw allow in 443

Pensez à recharger UFW :

ufw reload

Vous devriez pouvoir vous connecter depuis le serveur remote_server_ip à votre base MySQL ;)

Installer Adminer

Pourquoi Adminer me direz-vous ? Parce que plus léger et nettement plus rapide que phpMyAdmin tout simplement pour ce qu'en j'en fais.

  • Mettre à jour tous les versions de packages du serveur :
apt update
  • Télécharger et installer les nouvelles versions :
apt upgrade
  • Créer un utilisateur System (nommer le comme vous voulez) avec son mot de passe :
adduser master
  • Ajouter l'utilisateur au sudo group
usermod -aG sudo master
  • Se connecter avec celui-ci
su - master
  • Installer Adminer, votre mot de passe vous sera demandé
sudo apt install adminer
  • Activer la configuration d'Adminer
sudo a2enconf adminer
  • Redémarrer Apache
sudo systemctl restart apache2
  • Vous devriez accéder à Adminer à l'url https://[votrenomdedomaine.ndd]/adminer

A noter que l'on aurait pu opter pour la solution portable (un fichier php à déposer dans le répertoire de votre choix), mais on perd la souplesse de mise jour proposée par Ubuntu, à vous de voir.

Ajouter un code OTP (Two-Factor Authentication) à Adminer

Pour plus de sécurité, vous pouvez ajouter de la double authentification via son système de plugin. Avant d'installer celui-ci, il faut vous assurer que le serveur utilise le même fuseau horaire que les applications que vous allez utiliser pour générer votre code OTP. En effet, ce système est basé sur la date.

  • Sur le serveur, lancer la commande suivante pour afficher son fuseau horaire :
timedatectl
  • Si la Time zone n'est pas la vôtre, modifiez-la. Par exemple pour celle de Paris :
timedatectl set-timezone Europe/Paris

Ceci fait installons le plugin login-otp.php :

  • Télécharger le plugin et copier le sur votre serveur dans le dossier /usr/share/adminer/plugins. Normalement avec l’installation via le gestionnaire de paquets d'Ubuntu (APT), il devrait déjà y être.

  • Sur cette Url : https://www.adminer.org/en/plugins/otp/ vous trouvez la méthode pour générer votre clé. Vous pouvez utilisez cette méthode pour Google Authenticator, ou scanner simplement le QR Code pour récupérer votre clé pour la copier dans votre VaultWarden par exemple. Tout dépend de l'outil que vous utiliserez pour générer votre code.

  • Toujours sur cette Url récupérer le code généré en dessous du QR Code et reporter les modifications dans le fichier de configuration d'Adminer qui se trouve dans le dossier /etc/adminer/conf.php

  • Si vous rencontrez des difficultés à le paramétrer, je vous ai mis plus bas la configuration complète ;)

  • Redémarrer Apache :

sudo systemctl restart apache2
  • A la connexion, vous devriez avoir ceci :

Ajouter un switcher de thème à Adminer

Si vous ne trouvez pas le design d'Adminer très heureux, vous pouvez activer un sélecteur de designs (ou thèmes).

  • Ajouter l'alias du chemin vers le dossier des designs préinstallés en modifiant le fichier de configuration :
nano /etc/apache2/conf-available/adminer.conf
Alias /adminer /etc/adminer
Alias /designs /usr/share/adminer/designs

<Directory /etc/adminer>
	Require all granted
	DirectoryIndex conf.php
</Directory> 
  • Reporter les modifications suivantes dans le fichier de configuration d'Adminer :
nano /etc/adminer/conf.php
<?php
define('ADMINER_DIR', '/usr/share/adminer');

function adminer_object() {
    // required to run any plugin
    include_once ADMINER_DIR . "/plugins/plugin.php";
	include_once ADMINER_DIR . "/plugins/login-otp.php";
	include_once ADMINER_DIR . "/plugins/designs.php";

    // autoloader
    foreach (glob(ADMINER_DIR . "/plugins/*.php") as $filename) {
        include_once $filename;
    }

	// designs
	$designs = array();
	foreach (glob(ADMINER_DIR . "/designs/*", GLOB_ONLYDIR) as $filename) {
		$designs["/designs/". basename($filename) ."/adminer.css"] = basename($filename);
	}
	
    $plugins = array(
		new AdminerDesigns($designs),
		new AdminerLoginOtp(base64_decode('MLM7N1kV/a2dQA==')),
        new AdminerVersionNoverify(),
    );

    return new AdminerPlugin($plugins);
}

include ADMINER_DIR . "/adminer.php";
?>
  • Redémarrer Apache :
sudo systemctl restart apache2
  • En bas à droite de l'interface d'Adminer, vous devriez trouver un sélecteur de designs.

  • Vous devriez voir un nouveau thème comme par exemple celui-ci :

A noter que si vous avez opter pour la version portable, déposez simplement le fichier adminer.css de votre design préféré à côté du fichier php portable.

Enjoy ^^