scripts pour mysql
This commit is contained in:
parent
4ee5bcc04f
commit
9b29b85fb2
scripts
|
@ -2,3 +2,4 @@ common
|
|||
server-dhcp
|
||||
server-httpd
|
||||
server-mail
|
||||
server-mariadb
|
||||
|
|
|
@ -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 ==="
|
||||
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
create_db.sh
|
||||
setup_mariadb.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"
|
|
@ -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 ==="
|
Loading…
Reference in New Issue