scripts pour mysql

This commit is contained in:
Cédric Abonnel 2025-03-22 11:52:23 +01:00
parent 4ee5bcc04f
commit 9b29b85fb2
5 changed files with 323 additions and 0 deletions

View File

@ -2,3 +2,4 @@ common
server-dhcp
server-httpd
server-mail
server-mariadb

View File

@ -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 ==="

View File

@ -0,0 +1,2 @@
create_db.sh
setup_mariadb.sh

View File

@ -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"

View File

@ -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 ==="