From 9b29b85fb24d911ef6de3ec132835804dd87a79e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9drix?= <cedric@abonnel.fr> Date: Sat, 22 Mar 2025 11:52:23 +0100 Subject: [PATCH] scripts pour mysql --- scripts/.directories.txt | 1 + scripts/common/common_utils.sh | 5 + scripts/server-mariadb/.list_files.txt | 2 + scripts/server-mariadb/create_db.sh | 151 ++++++++++++++++++++++ scripts/server-mariadb/setup_mariadb.sh | 164 ++++++++++++++++++++++++ 5 files changed, 323 insertions(+) create mode 100644 scripts/server-mariadb/.list_files.txt create mode 100644 scripts/server-mariadb/create_db.sh create mode 100644 scripts/server-mariadb/setup_mariadb.sh diff --git a/scripts/.directories.txt b/scripts/.directories.txt index f913cea..e5ea4a0 100644 --- a/scripts/.directories.txt +++ b/scripts/.directories.txt @@ -2,3 +2,4 @@ common server-dhcp server-httpd server-mail +server-mariadb diff --git a/scripts/common/common_utils.sh b/scripts/common/common_utils.sh index 4706acd..4fde7a2 100644 --- a/scripts/common/common_utils.sh +++ b/scripts/common/common_utils.sh @@ -9,6 +9,11 @@ check_root() { fi } +generate_token() { + tr -dc 'A-Za-z0-9@#%+=_-' < /dev/urandom | head -c "${1:-32}" + echo +} + update_system() { echo "=== Mise à jour du système ===" diff --git a/scripts/server-mariadb/.list_files.txt b/scripts/server-mariadb/.list_files.txt new file mode 100644 index 0000000..1f5f76d --- /dev/null +++ b/scripts/server-mariadb/.list_files.txt @@ -0,0 +1,2 @@ +create_db.sh +setup_mariadb.sh diff --git a/scripts/server-mariadb/create_db.sh b/scripts/server-mariadb/create_db.sh new file mode 100644 index 0000000..c4f7bc8 --- /dev/null +++ b/scripts/server-mariadb/create_db.sh @@ -0,0 +1,151 @@ +#!/bin/bash +# Basé sur un travail de Cédric Abonnel / Cédrix sous licence CC BY-NC 4.0 + +# Importer les fonctions communes +source "$(dirname "$0")/../common/common_utils.sh" + +# Vérifier si le script est exécuté en root +check_root + +echo "=== Gestion du mot de passe administrateur ===" + +# Vérifier la présence de la commande mysql +if ! command -v mysql >/dev/null 2>&1; then + echo "❌ La commande 'mysql' est introuvable. Veuillez l'installer." + exit 1 +fi + +# Fonction de recherche dans un fichier cnf ou conf +get_password_from_cnf() { + local file=$1 + if [[ -f "$file" ]]; then + PASSWORD=$(grep -m1 'password\s*=' "$file" | sed -E 's/.*password\s*=\s*//;s/"//g') + if [[ -n "$PASSWORD" ]]; then + echo "$PASSWORD" + return 0 + fi + fi + return 1 +} + +# Tentative de récupération depuis /etc/mysql/debian.cnf +DB_ROOT_PASSWORD=$(get_password_from_cnf "/etc/mysql/debian.cnf") +if [[ -n "$DB_ROOT_PASSWORD" ]]; then + echo "✅ Mot de passe root récupéré depuis /etc/mysql/debian.cnf" +else + # Recherche dans d'autres fichiers .cnf ou .conf + for file in /etc/mysql/*.cnf /etc/mysql/conf.d/*.cnf /etc/my.cnf /etc/my.cnf.d/*.cnf; do + DB_ROOT_PASSWORD=$(get_password_from_cnf "$file") + if [[ -n "$DB_ROOT_PASSWORD" ]]; then + echo "✅ Mot de passe root trouvé dans $file" + break + fi + done +fi + +# Si toujours rien, demande à l'utilisateur +if [[ -z "$DB_ROOT_PASSWORD" ]]; then + echo -n "🔐 Entrez le mot de passe root pour MariaDB : " + read -r -s USER_PASSWORD + echo + DB_ROOT_PASSWORD="$USER_PASSWORD" +fi + +# Création d'un fichier temporaire sécurisé pour la connexion MySQL +TEMP_CNF=$(mktemp) +chmod 600 "$TEMP_CNF" +cat > "$TEMP_CNF" <<EOF +[client] +user=root +password=$DB_ROOT_PASSWORD +EOF + +# TEST du mot de passe root +echo "🔎 Test de connexion avec le mot de passe root..." +if ! mysql --defaults-extra-file="$TEMP_CNF" -e "SELECT 1;" 2>/dev/null; then + echo "❌ Échec de la connexion avec le mot de passe root. Arrêt du script." + rm -f "$TEMP_CNF" + exit 1 +fi +echo "✅ Connexion root réussie." + +echo "=== Création d'une nouvelle base de données MariaDB ===" + +# Lecture du nom de la base de données +read -rp "Nom de la base de données : " DB_NAME +if [[ -z "$DB_NAME" ]]; then + echo "❌ Nom de base de données requis." + rm -f "$TEMP_CNF" + exit 1 +fi + +# Vérification de l'existence de la base de données +DB_EXISTS=$(mysql --defaults-extra-file="$TEMP_CNF" -sse "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME='$DB_NAME'") +if [[ "$DB_EXISTS" == "$DB_NAME" ]]; then + echo "❌ La base de données '$DB_NAME' existe déjà." + rm -f "$TEMP_CNF" + exit 1 +fi + +# Lecture du nom de l'utilisateur +read -rp "Nom de l'utilisateur : " DB_USER +if [[ -z "$DB_USER" ]]; then + echo "❌ Nom d'utilisateur requis." + rm -f "$TEMP_CNF" + exit 1 +fi + +# Vérification de l'existence de l'utilisateur +USER_EXISTS=$(mysql --defaults-extra-file="$TEMP_CNF" -sse "SELECT COUNT(*) FROM mysql.user WHERE user='$DB_USER'") +if [[ "$USER_EXISTS" -gt 0 ]]; then + echo "ℹ️ L'utilisateur '$DB_USER' existe déjà. Il ne sera pas recréé." + CREATE_USER_SQL="" + USER_PASS_TO_SAVE="" +else + echo "✅ L'utilisateur '$DB_USER' sera créé." + # Demande du mot de passe utilisateur ou génération + read -rsp "Mot de passe de l'utilisateur (laisser vide pour générer) : " DB_PASS + echo + if [[ -z "$DB_PASS" ]]; then + DB_PASS=$(generate_token 64) + echo "🔑 Mot de passe généré : $DB_PASS" + fi + CREATE_USER_SQL="CREATE USER '$DB_USER'@'localhost' IDENTIFIED BY '$DB_PASS';" + USER_PASS_TO_SAVE="$DB_PASS" +fi + +# Création de la base et attribution des droits +SQL=$(cat <<EOF +CREATE DATABASE \`$DB_NAME\` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +$CREATE_USER_SQL +GRANT ALL PRIVILEGES ON \`$DB_NAME\`.* TO '$DB_USER'@'localhost'; +FLUSH PRIVILEGES; +EOF +) + +echo "✅ Exécution de la création..." +if mysql --defaults-extra-file="$TEMP_CNF" -e "$SQL"; then + echo "🎉 Base de données '$DB_NAME' créée et droits attribués à '$DB_USER'." +else + echo "❌ Erreur lors de la création." + rm -f "$TEMP_CNF" + exit 1 +fi + +# Sauvegarde des identifiants +if [[ -n "$USER_PASS_TO_SAVE" ]]; then + TIMESTAMP=$(date +%Y%m%d%H%M%S) + CRED_FILE="db_${DB_NAME}_${TIMESTAMP}.credentials" + + umask 077 # Restriction immédiate des droits sur le fichier + { + printf "Base: %s\n" "$DB_NAME" + printf "User: %s\n" "$DB_USER" + printf "Password: %s\n" "$USER_PASS_TO_SAVE" + } > "$CRED_FILE" + + echo "🔒 Identifiants sauvegardés dans $CRED_FILE" +fi + +# Nettoyage du fichier temporaire de connexion +rm -f "$TEMP_CNF" diff --git a/scripts/server-mariadb/setup_mariadb.sh b/scripts/server-mariadb/setup_mariadb.sh new file mode 100644 index 0000000..c7d3dea --- /dev/null +++ b/scripts/server-mariadb/setup_mariadb.sh @@ -0,0 +1,164 @@ +#!/bin/bash +# Basé sur un travail de Cédric Abonnel / Cédrix sous licence CC BY-NC 4.0 + +# Importer les fonctions communes +source "$(dirname "$0")/../common/common_utils.sh" + +# Vérifier si le script est exécuté en root +check_root + +# Mise à jour du système +update_system + +PASS_FILE=~/mariadb_root_password.txt +DEBIAN_CNF=/etc/mysql/debian.cnf +MARIADB_CNF=/etc/mysql/mariadb.conf.d/50-server.cnf + +echo "=== Installation de MariaDB ===" +apt install -y mariadb-server mariadb-client + +echo "=== Activation et démarrage de MariaDB ===" +systemctl enable mariadb +systemctl start mariadb + +echo "=== Configuration du bind-address pour bloquer les connexions externes ===" +if grep -q "^bind-address" $MARIADB_CNF; then + sed -i 's/^bind-address.*/bind-address = 127.0.0.1/' $MARIADB_CNF +else + echo "bind-address = 127.0.0.1" >> $MARIADB_CNF +fi + +echo "=== Activation du log binaire et purge automatique des anciens logs ===" +if ! grep -q "^log-bin" "$MARIADB_CNF"; then + cat >> "$MARIADB_CNF" <<EOL + +# Journalisation binaire activée pour la réplication et la sécurité +log-bin = /var/log/mysql/mariadb-bin +expire_logs_days = 7 +EOL +fi + +echo "=== Vérification et création du répertoire pour les binlogs ===" +mkdir -p /var/log/mysql +chown mysql:mysql /var/log/mysql +chmod 750 /var/log/mysql + + +systemctl restart mariadb + +echo "=== Gestion du mot de passe administrateur ===" + +# Fonction de recherche dans un fichier cnf ou conf +get_password_from_cnf() { + local file=$1 + if [[ -f "$file" ]]; then + PASSWORD=$(grep -m1 'password\s*=' "$file" | sed -E 's/.*password\s*=\s*//;s/"//g') + if [[ -n "$PASSWORD" ]]; then + echo "$PASSWORD" + return 0 + fi + fi + return 1 +} + +# Générer ou récupérer le mot de passe root MariaDB +if [[ -f "$PASS_FILE" ]]; then + DB_ROOT_PASSWORD=$(grep 'root password:' "$PASS_FILE" | awk '{print $3}') + echo "Mot de passe root existant récupéré." +else + # Tentative de récupération depuis /etc/mysql/debian.cnf + DB_ROOT_PASSWORD=$(get_password_from_cnf "/etc/mysql/debian.cnf") + if [[ -n "$DB_ROOT_PASSWORD" ]]; then + echo "Mot de passe root récupéré depuis /etc/mysql/debian.cnf" + else + # Tentative dans d'autres fichiers .cnf ou .conf connus + for file in /etc/mysql/*.cnf /etc/mysql/conf.d/*.cnf /etc/my.cnf /etc/my.cnf.d/*.cnf; do + DB_ROOT_PASSWORD=$(get_password_from_cnf "$file") + if [[ -n "$DB_ROOT_PASSWORD" ]]; then + echo "Mot de passe root trouvé dans $file" + break + fi + done + fi + + # Si toujours pas de mot de passe trouvé, demander ou générer + if [[ -z "$DB_ROOT_PASSWORD" ]]; then + echo -n "Entrez un mot de passe root pour MariaDB ou le mot de passe existant (laisser vide pour générer automatiquement) : " + read -r -s USER_PASSWORD + echo + if [[ -n "$USER_PASSWORD" ]]; then + DB_ROOT_PASSWORD="$USER_PASSWORD" + echo "Mot de passe root défini par l'utilisateur." + else + DB_ROOT_PASSWORD=$(generate_token 64) + echo "Mot de passe root généré automatiquement." + echo "root password: $DB_ROOT_PASSWORD" > "$PASS_FILE" + chmod 600 "$PASS_FILE" + echo "Mot de passe root sauvegardé dans $PASS_FILE." + fi + fi + +fi + + +echo "=== Sécurisation de MariaDB ===" +mysql -u root -p"$DB_ROOT_PASSWORD" <<EOF +-- Définir le mot de passe root correctement +ALTER USER 'root'@'localhost' IDENTIFIED BY '$DB_ROOT_PASSWORD'; + +-- Supprimer les utilisateurs anonymes +DELETE FROM mysql.user WHERE User=''; + +-- Supprimer tout accès root externe ou d'autres users externes +DELETE FROM mysql.user WHERE Host NOT IN ('localhost', '127.0.0.1', '::1'); + +-- Supprimer la base de test si elle existe +DROP DATABASE IF EXISTS test; + +-- Supprimer les droits sur la base de test +DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%'; + +-- Recharger les privilèges +FLUSH PRIVILEGES; +EOF + +echo "=== Mise à jour de /etc/mysql/debian.cnf pour les scripts de maintenance ===" +cat > /etc/mysql/debian.cnf <<EOL +[client] +host = localhost +user = root +password = $DB_ROOT_PASSWORD +socket = /run/mysqld/mysqld.sock + +[mysql_upgrade] +host = localhost +user = root +password = $DB_ROOT_PASSWORD +socket = /run/mysqld/mysqld.sock +EOL +chmod 600 /etc/mysql/debian.cnf + +echo "=== Vérification de la présence de PHP ===" +if command -v php >/dev/null 2>&1; then + PHP_VERSION=$(php -r 'echo PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;') + echo "PHP version détectée : $PHP_VERSION" + + echo "=== Installation de php-mysql pour PHP $PHP_VERSION ===" + apt install -y php${PHP_VERSION}-mysql + + echo "=== Redémarrage d'Apache si installé ===" + if systemctl list-units --type=service | grep -q apache2; then + systemctl restart apache2 + echo "Apache redémarré" + fi + + echo "=== Redémarrage de PHP-FPM si installé ===" + if systemctl list-units --type=service | grep -q php${PHP_VERSION}-fpm; then + systemctl restart php${PHP_VERSION}-fpm + echo "PHP-FPM redémarré" + fi +else + echo "PHP n'est pas installé. Installation de MariaDB terminée sans liaison PHP." +fi + +echo "=== Fin de l'installation et sécurisation de MariaDB ==="