Compare commits
38 Commits
cdd5b93432
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 48c26f9f84 | |||
| 70facd85f3 | |||
| 5eda1c002e | |||
| 24a45fecf3 | |||
| 1b758b6161 | |||
| b75afa7df8 | |||
| 58b6a44819 | |||
| 8e882c7756 | |||
| b8808e4219 | |||
| 5375a48bfd | |||
| 4936d3c8e7 | |||
| 3d64c538af | |||
| d9c2e20402 | |||
| 12cbbd0a6a | |||
| bd74da92ff | |||
| 5e663d8925 | |||
| 2f0831aa09 | |||
| cad29cdc71 | |||
| eabf6c042e | |||
| ca73246a47 | |||
| 1b7173b824 | |||
| bc57514c0d | |||
| 9b29b85fb2 | |||
| 4ee5bcc04f | |||
| 164c69f580 | |||
| 00c1c9562b | |||
| a8cd67f38c | |||
| 285e332a9f | |||
| 0d46cf7752 | |||
| a3ecc212dd | |||
| 506dfb1086 | |||
| f22cf0bff7 | |||
| 917f3a68bb | |||
| 579631df00 | |||
| 680b9a2af9 | |||
| bf8b686477 | |||
| 86583798f5 | |||
| 4c1ca83681 |
@@ -1,4 +1,7 @@
|
|||||||
|
all_inclusive
|
||||||
common
|
common
|
||||||
server-dhcp
|
server-dhcp
|
||||||
server-httpd
|
server-httpd
|
||||||
server-mail
|
server-mail
|
||||||
|
server-mariadb
|
||||||
|
server-postgres
|
||||||
|
|||||||
@@ -3,16 +3,16 @@
|
|||||||
Ce guide vous explique comment télécharger et exécuter les scripts d'installation et de configuration disponibles dans ce dépôt.
|
Ce guide vous explique comment télécharger et exécuter les scripts d'installation et de configuration disponibles dans ce dépôt.
|
||||||
|
|
||||||
## 🛠 Prérequis
|
## 🛠 Prérequis
|
||||||
|
Avant d'utiliser les scripts, assurez-vous de disposer des éléments suivants :
|
||||||
Avant d'utiliser les scripts, assurez-vous d'avoir :
|
- Un système Linux de type Debian
|
||||||
- Un système Linux Debian like
|
- `git` installé si vous déployez avec GIT (sauf méthode 3)
|
||||||
- `git` installé sur votre machine si vous déployez avec GIT
|
|
||||||
- Les droits administrateur (`sudo`)
|
- Les droits administrateur (`sudo`)
|
||||||
|
|
||||||
## 🚀 Installation
|
## 🚀 Installation
|
||||||
|
Vous avez trois options pour récupérer les scripts. La troisième est recommandée.
|
||||||
|
|
||||||
### 1️⃣ Cloner le dépôt
|
### 1️⃣ Cloner le dépôt
|
||||||
Si vous souhaitez récupérer l'intégralité du projet, utilisez :
|
Si vous souhaitez récupérer l'intégralité du projet, utilisez la commande suivante :
|
||||||
```bash
|
```bash
|
||||||
git clone https://git.abonnel.fr/cedricAbonnel/notes-techniques.git
|
git clone https://git.abonnel.fr/cedricAbonnel/notes-techniques.git
|
||||||
cd notes-techniques/scripts
|
cd notes-techniques/scripts
|
||||||
@@ -27,29 +27,80 @@ git sparse-checkout add scripts/server-mail
|
|||||||
```
|
```
|
||||||
Remplacez `server-mail` par le dossier du service que vous souhaitez installer.
|
Remplacez `server-mail` par le dossier du service que vous souhaitez installer.
|
||||||
|
|
||||||
### 3️⃣ Exécuter un script d'installation
|
### 3️⃣ Exécuter le script d'installation personnalisé (recommandé)
|
||||||
Une fois dans le bon dossier, lancez le script d'installation correspondant. Par exemple, pour installer un serveur de messagerie :
|
Un script personnalisé permet de télécharger un ou plusieurs scripts en fonction des éléments sélectionnés. Il offre les avantages suivants :
|
||||||
|
- Mise à jour automatique avec la dernière version disponible
|
||||||
|
- Téléchargement sélectif des scripts depuis le dépôt
|
||||||
|
- Interface interactive de sélection des scripts avec `whiptail`
|
||||||
|
- Suppression des fichiers obsolètes
|
||||||
|
- Application automatique des permissions d'exécution
|
||||||
|
- Pas besoin d'avoir le programme `git`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 🔄 Installation et mise à jour automatique des scripts
|
||||||
|
|
||||||
|
## 🛠 Prérequis
|
||||||
|
Avant d'exécuter le script, assurez-vous que votre système répond aux exigences suivantes :
|
||||||
|
- Système d'exploitation Linux
|
||||||
|
- `bash` installé
|
||||||
|
- `wget` installé
|
||||||
|
- `whiptail` (inclus dans `dialog` sur certaines distributions)
|
||||||
|
|
||||||
|
Pour installer les dépendances, utilisez la commande suivante :
|
||||||
|
```bash
|
||||||
|
sudo apt update && sudo apt install -y wget dialog
|
||||||
|
```
|
||||||
|
(Sur une distribution utilisant `yum` ou `dnf`, adaptez la commande en conséquence.)
|
||||||
|
|
||||||
|
## 📥 Installation
|
||||||
|
### 1️⃣ Télécharger le script
|
||||||
|
```bash
|
||||||
|
wget -O fetch_scripts.sh https://git.abonnel.fr/cedricAbonnel/notes-techniques/raw/branch/main/scripts/fetch_scripts.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2️⃣ Rendre le script exécutable
|
||||||
|
```bash
|
||||||
|
chmod +x fetch_scripts.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3️⃣ Exécuter le script
|
||||||
|
```bash
|
||||||
|
./fetch_scripts.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
Accédez ensuite au dossier de votre choix et exécutez le script d'installation correspondant. Par exemple, pour installer un serveur de messagerie :
|
||||||
```bash
|
```bash
|
||||||
cd scripts/server-mail
|
cd scripts/server-mail
|
||||||
./setup_server.sh
|
./setup_server.sh
|
||||||
```
|
```
|
||||||
Suivez ensuite les instructions affichées.
|
Suivez ensuite les instructions affichées.
|
||||||
|
|
||||||
## 📌 Utilisation du script de téléchargement automatique
|
## ⚙️ Fonctionnement du script
|
||||||
|
Le script permet de :
|
||||||
|
- Se mettre à jour automatiquement en téléchargeant la dernière version disponible
|
||||||
|
- Télécharger une liste de scripts depuis le dépôt
|
||||||
|
- Offrir une interface interactive pour sélectionner les scripts à télécharger
|
||||||
|
- Supprimer les fichiers obsolètes
|
||||||
|
- Appliquer les permissions d'exécution aux scripts téléchargés
|
||||||
|
|
||||||
Si vous préférez récupérer uniquement les fichiers nécessaires sans passer par Git, vous pouvez utiliser le script de téléchargement automatique :
|
## 🔄 Mise à jour des scripts
|
||||||
|
Le script se met à jour automatiquement à chaque exécution si une nouvelle version est disponible. Pour forcer une mise à jour, exécutez :
|
||||||
### 1️⃣ Télécharger le script
|
|
||||||
```bash
|
|
||||||
wget -O fetch_scripts.sh "https://git.abonnel.fr/cedricAbonnel/notes-techniques/raw/branch/main/scripts/fetch_scripts.sh"
|
|
||||||
chmod +x fetch_scripts.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2️⃣ Exécuter le script
|
|
||||||
```bash
|
```bash
|
||||||
./fetch_scripts.sh
|
./fetch_scripts.sh
|
||||||
```
|
```
|
||||||
Le script vous proposera une liste de dossiers. Sélectionnez ceux que vous souhaitez télécharger.
|
|
||||||
|
## 🛠 Problèmes courants
|
||||||
|
|
||||||
|
- **Erreur : `whiptail: command not found`**
|
||||||
|
- Installez `whiptail` avec la commande suivante :
|
||||||
|
```bash
|
||||||
|
sudo apt install dialog # ou sudo yum install dialog
|
||||||
|
```
|
||||||
|
|
||||||
|
- **Erreur de connexion au dépôt**
|
||||||
|
- Vérifiez votre connexion internet
|
||||||
|
- Assurez-vous que l'URL du dépôt est correcte
|
||||||
|
|
||||||
## 📖 Support & Contribution
|
## 📖 Support & Contribution
|
||||||
Si vous rencontrez un problème ou souhaitez proposer une amélioration, consultez le fichier `CONTRIBUTING.md` ou ouvrez une issue sur le dépôt.
|
Si vous rencontrez un problème ou souhaitez proposer une amélioration, consultez le fichier `CONTRIBUTING.md` ou ouvrez une issue sur le dépôt.
|
||||||
|
|||||||
@@ -20,5 +20,5 @@ Consulter le document de [contribution](../CONTRIBUTING.md) pour plus d'informat
|
|||||||
|
|
||||||
## 📜 Licence
|
## 📜 Licence
|
||||||
|
|
||||||
Ce projet est sous licence [CC By-NC](../LICENSE.md). Vous trouverez plus d'explications dans la [note d'informations concernant la Licence MIT en français](../LICENCE_FR.md).
|
Ce projet est sous licence [CC By-NC](../LICENSE.md). Vous trouverez plus d'explications dans la [note d'informations concernant la Licence en français](../LICENCE_FR.md).
|
||||||
|
|
||||||
|
|||||||
1
scripts/all_inclusive/.list_files.txt
Normal file
1
scripts/all_inclusive/.list_files.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
lychee_install.sh
|
||||||
159
scripts/all_inclusive/lychee_install.sh
Normal file
159
scripts/all_inclusive/lychee_install.sh
Normal file
@@ -0,0 +1,159 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Vérifier que le script est lancé en root
|
||||||
|
if [[ $EUID -ne 0 ]]; then
|
||||||
|
echo "Ce script doit être exécuté en tant que root." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Définir les variables
|
||||||
|
DB_NAME="lychee"
|
||||||
|
DB_USER="lycheeuser"
|
||||||
|
LYCHEE_DIR="/var/www/lychee"
|
||||||
|
APACHE_CONF="/etc/apache2/sites-available/lychee.conf"
|
||||||
|
PHP_VERSION="8.3"
|
||||||
|
|
||||||
|
PHP_INI_CLI="/etc/php/${PHP_VERSION}/cli/php.ini"
|
||||||
|
PHP_INI_APACHE="/etc/php/${PHP_VERSION}/apache2/php.ini"
|
||||||
|
|
||||||
|
TIMEZONE=$(timedatectl show --value --property=Timezone)
|
||||||
|
|
||||||
|
# Générer un mot de passe alphanumérique sécurisé
|
||||||
|
DB_PASSWORD=$(tr -dc 'A-Za-z0-9' </dev/urandom | head -c 16)
|
||||||
|
echo "Mot de passe généré pour la base de données : ${DB_PASSWORD}"
|
||||||
|
|
||||||
|
# Sauvegarde temporaire root-only
|
||||||
|
echo "${DB_PASSWORD}" > /root/.lychee_db_password
|
||||||
|
chmod 600 /root/.lychee_db_password
|
||||||
|
|
||||||
|
# Mise à jour du système
|
||||||
|
apt update && apt upgrade -y
|
||||||
|
|
||||||
|
# Ajout du dépôt Sury pour PHP 8.3
|
||||||
|
apt install -y apt-transport-https lsb-release ca-certificates wget gnupg2
|
||||||
|
wget -qO - https://packages.sury.org/php/apt.gpg | gpg --dearmor -o /etc/apt/trusted.gpg.d/php.gpg
|
||||||
|
echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list
|
||||||
|
apt update
|
||||||
|
|
||||||
|
# Installation des paquets nécessaires
|
||||||
|
apt install -y apache2 mariadb-server php${PHP_VERSION} php${PHP_VERSION}-cli php${PHP_VERSION}-intl php${PHP_VERSION}-xmlrpc \
|
||||||
|
php${PHP_VERSION}-soap php${PHP_VERSION}-mysql php${PHP_VERSION}-zip php${PHP_VERSION}-gd php${PHP_VERSION}-tidy \
|
||||||
|
php${PHP_VERSION}-mbstring php${PHP_VERSION}-curl php${PHP_VERSION}-xml php${PHP_VERSION}-bcmath php${PHP_VERSION}-imagick \
|
||||||
|
php${PHP_VERSION}-tokenizer libapache2-mod-php${PHP_VERSION} unzip
|
||||||
|
|
||||||
|
# Définir la timezone PHP pour CLI et Apache
|
||||||
|
sed -i "s|^;*date.timezone =.*|date.timezone = ${TIMEZONE}|" "${PHP_INI_CLI}"
|
||||||
|
sed -i "s|^;*date.timezone =.*|date.timezone = ${TIMEZONE}|" "${PHP_INI_APACHE}"
|
||||||
|
|
||||||
|
# Sécuriser MariaDB
|
||||||
|
mysql_secure_installation <<EOF
|
||||||
|
|
||||||
|
y
|
||||||
|
n
|
||||||
|
y
|
||||||
|
y
|
||||||
|
y
|
||||||
|
y
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Créer la base et l'utilisateur avec droits restreints
|
||||||
|
mysql <<EOF
|
||||||
|
CREATE DATABASE ${DB_NAME} CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||||
|
CREATE USER '${DB_USER}'@'localhost' IDENTIFIED BY '${DB_PASSWORD}';
|
||||||
|
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER ON ${DB_NAME}.* TO '${DB_USER}'@'localhost';
|
||||||
|
FLUSH PRIVILEGES;
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Télécharger et installer Lychee proprement
|
||||||
|
cd /tmp
|
||||||
|
wget https://github.com/LycheeOrg/Lychee/releases/latest/download/Lychee.zip
|
||||||
|
unzip Lychee.zip
|
||||||
|
rm -rf ${LYCHEE_DIR}
|
||||||
|
mv Lychee ${LYCHEE_DIR}
|
||||||
|
rm Lychee.zip
|
||||||
|
|
||||||
|
# Demander le nom de domaine ou l'IP publique
|
||||||
|
read -p "Entrez le nom de domaine ou l'adresse IP d'accès à Lychee (ex: lychee.mondomaine.fr ou 192.168.1.100) : " LYCHEE_HOST
|
||||||
|
|
||||||
|
# Forcer le protocole HTTP pour APP_URL
|
||||||
|
APP_URL="http://${LYCHEE_HOST}"
|
||||||
|
|
||||||
|
# Modification du .env
|
||||||
|
cp ${LYCHEE_DIR}/.env.example ${LYCHEE_DIR}/.env
|
||||||
|
|
||||||
|
sed -i "s|^APP_URL=.*|APP_URL=${APP_URL}|" ${LYCHEE_DIR}/.env
|
||||||
|
sed -i "s|^DB_CONNECTION=.*|DB_CONNECTION=mysql|" ${LYCHEE_DIR}/.env
|
||||||
|
sed -i "s|^DB_HOST=.*|DB_HOST=127.0.0.1|" ${LYCHEE_DIR}/.env
|
||||||
|
sed -i "s|^DB_PORT=.*|DB_PORT=3306|" ${LYCHEE_DIR}/.env
|
||||||
|
sed -i "s|^#*DB_DATABASE=.*|DB_DATABASE=${DB_NAME}|" ${LYCHEE_DIR}/.env
|
||||||
|
sed -i "s|^#*DB_USERNAME=.*|DB_USERNAME=${DB_USER}|" ${LYCHEE_DIR}/.env
|
||||||
|
sed -i "s|^#*DB_PASSWORD=.*|DB_PASSWORD=\"${DB_PASSWORD}\"|" ${LYCHEE_DIR}/.env
|
||||||
|
|
||||||
|
# Définir le fuseau horaire
|
||||||
|
echo "APP_TIMEZONE=Europe/Paris" >> ${LYCHEE_DIR}/.env
|
||||||
|
|
||||||
|
# Propriétés et permissions
|
||||||
|
chown -R www-data:www-data ${LYCHEE_DIR}
|
||||||
|
chmod 640 ${LYCHEE_DIR}/.env
|
||||||
|
find ${LYCHEE_DIR} -type f -exec chmod 640 {} \;
|
||||||
|
find ${LYCHEE_DIR} -type d -exec chmod 750 {} \;
|
||||||
|
|
||||||
|
# Permissions spécifiques pour data/upload
|
||||||
|
chmod -R 750 ${LYCHEE_DIR}/uploads/ ${LYCHEE_DIR}/data/
|
||||||
|
|
||||||
|
# Permissions spécifiques attendues par Lychee
|
||||||
|
chmod -R g+s ${LYCHEE_DIR}/public/uploads
|
||||||
|
chmod -R g+s ${LYCHEE_DIR}/public/sym
|
||||||
|
chmod 2775 ${LYCHEE_DIR}/public/uploads
|
||||||
|
chmod 2775 ${LYCHEE_DIR}/public/uploads/import
|
||||||
|
chmod 2775 ${LYCHEE_DIR}/public/sym
|
||||||
|
chmod 0664 ${LYCHEE_DIR}/public/uploads/import/index.html
|
||||||
|
chmod 0664 ${LYCHEE_DIR}/public/sym/index.html
|
||||||
|
chmod 2775 ${LYCHEE_DIR}/storage/tmp/jobs
|
||||||
|
chmod 2775 ${LYCHEE_DIR}/storage/tmp/uploads
|
||||||
|
chmod -R g+s ${LYCHEE_DIR}/storage/tmp/jobs
|
||||||
|
chmod -R g+s ${LYCHEE_DIR}/storage/tmp/uploads
|
||||||
|
|
||||||
|
# Protéger les fichiers sensibles via .htaccess
|
||||||
|
cat > ${LYCHEE_DIR}/.htaccess <<EOF
|
||||||
|
<FilesMatch "\.(env|env\.example|sql|log|conf)$">
|
||||||
|
Order allow,deny
|
||||||
|
Deny from all
|
||||||
|
</FilesMatch>
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Configuration Apache
|
||||||
|
cat > ${APACHE_CONF} <<EOF
|
||||||
|
<VirtualHost *:80>
|
||||||
|
ServerAdmin webmaster@localhost
|
||||||
|
DocumentRoot ${LYCHEE_DIR}/public
|
||||||
|
|
||||||
|
<Directory ${LYCHEE_DIR}/public>
|
||||||
|
Options -Indexes +FollowSymLinks
|
||||||
|
AllowOverride All
|
||||||
|
Require all granted
|
||||||
|
</Directory>
|
||||||
|
|
||||||
|
ErrorLog \${APACHE_LOG_DIR}/lychee_error.log
|
||||||
|
CustomLog \${APACHE_LOG_DIR}/lychee_access.log combined
|
||||||
|
|
||||||
|
LimitRequestBody 10485760
|
||||||
|
</VirtualHost>
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Désactiver modules inutiles
|
||||||
|
a2dismod -f autoindex status cgi userdir
|
||||||
|
|
||||||
|
# Activer Lychee et désactiver le site par défaut
|
||||||
|
a2enmod rewrite
|
||||||
|
a2ensite lychee.conf
|
||||||
|
a2dissite 000-default.conf
|
||||||
|
|
||||||
|
# Recharger Apache
|
||||||
|
systemctl reload apache2
|
||||||
|
|
||||||
|
# Déterminer l'IP locale
|
||||||
|
IP=$(hostname -I | awk '{print $1}')
|
||||||
|
|
||||||
|
echo "Installation de Lychee terminée."
|
||||||
|
echo "Accédez à l’interface web pour finaliser la configuration : http://${IP}"
|
||||||
@@ -1,2 +1,3 @@
|
|||||||
common_utils.sh
|
common_utils.sh
|
||||||
setup_debian.sh
|
setup_debian.sh
|
||||||
|
setup_mdns.sh
|
||||||
|
|||||||
@@ -9,6 +9,11 @@ check_root() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
generate_token() {
|
||||||
|
tr -dc 'A-Za-z0-9' < /dev/urandom | head -c "${1:-32}"
|
||||||
|
echo
|
||||||
|
}
|
||||||
|
|
||||||
update_system() {
|
update_system() {
|
||||||
echo "=== Mise à jour du système ==="
|
echo "=== Mise à jour du système ==="
|
||||||
|
|
||||||
@@ -73,17 +78,18 @@ check_dns() {
|
|||||||
if [[ -z "$FQDN_IP" ]]; then
|
if [[ -z "$FQDN_IP" ]]; then
|
||||||
echo "❌ Erreur : Impossible de récupérer l'adresse IP associée à $server_name via DIG."
|
echo "❌ Erreur : Impossible de récupérer l'adresse IP associée à $server_name via DIG."
|
||||||
echo "➡️ Vérifie la configuration DNS et l'existence du domaine."
|
echo "➡️ Vérifie la configuration DNS et l'existence du domaine."
|
||||||
exit 1
|
return 1 # Erreur bloquante uniquement ici
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Comparaison des IPs
|
# Comparaison des IPs mais uniquement en Alerte non bloquante
|
||||||
if [[ "$SERVER_IP" != "$FQDN_IP" ]]; then
|
if [[ "$SERVER_IP" != "$FQDN_IP" ]]; then
|
||||||
echo "⚠️ Alerte DNS : L'adresse IP résolue ($FQDN_IP) ne correspond pas à l'IP publique actuelle ($SERVER_IP)."
|
echo "⚠️ Alerte DNS : L'adresse IP résolue ($FQDN_IP) ne correspond pas à l'IP publique actuelle ($SERVER_IP)."
|
||||||
echo "➡️ Vérifie la configuration DNS et la propagation des enregistrements."
|
echo "➡️ Vérifie la configuration DNS et la propagation si nécessaire."
|
||||||
exit 1
|
else
|
||||||
|
echo "✅ Vérification réussie : $server_name pointe correctement vers $SERVER_IP."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "✅ Vérification réussie : $server_name pointe correctement vers $SERVER_IP."
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -138,6 +138,19 @@ configure_locales() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
configure_timezone() {
|
||||||
|
echo "Détection de la timezone via l'IP publique..."
|
||||||
|
TIMEZONE=$(curl -s https://ipinfo.io/timezone)
|
||||||
|
|
||||||
|
# Définir la timezone via timedatectl
|
||||||
|
echo "Définition de la timezone à : $TIMEZONE"
|
||||||
|
timedatectl set-timezone "$TIMEZONE"
|
||||||
|
}
|
||||||
|
|
||||||
|
install_paquets() {
|
||||||
|
apt install -y curl
|
||||||
|
}
|
||||||
|
|
||||||
### SECTION PRINCIPALE : Activer/Désactiver les options ici
|
### SECTION PRINCIPALE : Activer/Désactiver les options ici
|
||||||
update_system
|
update_system
|
||||||
install_sudo
|
install_sudo
|
||||||
@@ -145,6 +158,8 @@ add_admin_user
|
|||||||
configure_ssh
|
configure_ssh
|
||||||
install_fail2ban
|
install_fail2ban
|
||||||
configure_locales
|
configure_locales
|
||||||
|
install_paquets
|
||||||
|
configure_timezone
|
||||||
|
|
||||||
echo "Installation et configuration de base terminées."
|
echo "Installation et configuration de base terminées."
|
||||||
echo "Vous pouvez maintenant vous connecter avec l'utilisateur : $NEW_USER"
|
echo "Vous pouvez maintenant vous connecter avec l'utilisateur : $NEW_USER"
|
||||||
133
scripts/common/setup_mdns.sh
Normal file
133
scripts/common/setup_mdns.sh
Normal file
@@ -0,0 +1,133 @@
|
|||||||
|
#!/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
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
echo "=== Détection des interfaces réseau actives ==="
|
||||||
|
INTERFACES=$(ip -o link show | awk -F': ' '{print $2}' | grep -Ev 'lo|docker|veth|br|vmnet|virbr')
|
||||||
|
echo "Interfaces détectées : $INTERFACES"
|
||||||
|
ALLOWED_INTERFACES=$(echo "$INTERFACES" | paste -sd "," -)
|
||||||
|
|
||||||
|
echo "=== Installation d'Avahi (mDNS) et des dépendances ==="
|
||||||
|
apt update
|
||||||
|
apt install -y avahi-daemon avahi-utils libnss-mdns nscd systemd-resolved
|
||||||
|
|
||||||
|
echo "=== Vérification de la présence de libnss_mdns.so.2 ==="
|
||||||
|
if [[ ! -f /lib/x86_64-linux-gnu/libnss_mdns.so.2 ]]; then
|
||||||
|
echo "❌ libnss_mdns.so.2 manquante, tentative de réinstallation"
|
||||||
|
apt install --reinstall -y libnss-mdns
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "=== Configuration de /etc/nsswitch.conf ==="
|
||||||
|
if grep -q '^hosts:' /etc/nsswitch.conf; then
|
||||||
|
sed -i 's/^hosts:.*/hosts: files mdns4 dns/' /etc/nsswitch.conf
|
||||||
|
else
|
||||||
|
echo "hosts: files mdns4 dns" >> /etc/nsswitch.conf
|
||||||
|
fi
|
||||||
|
grep hosts /etc/nsswitch.conf
|
||||||
|
|
||||||
|
echo "=== Redémarrage des caches DNS si présents ==="
|
||||||
|
systemctl restart nscd || echo "nscd non utilisé"
|
||||||
|
systemctl restart systemd-resolved || echo "systemd-resolved non utilisé"
|
||||||
|
|
||||||
|
echo "=== Vérification d'un éventuel service sur le port 80 ==="
|
||||||
|
if ss -tuln | grep -q ':80 '; then
|
||||||
|
echo "❌ Un service écoute déjà sur le port 80. Abandon de la publication HTTP de test."
|
||||||
|
PUBLISH_HTTP=false
|
||||||
|
else
|
||||||
|
PUBLISH_HTTP=true
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "=== Sauvegarde de la conf avahi ==="
|
||||||
|
cp /etc/avahi/avahi-daemon.conf /etc/avahi/avahi-daemon.conf.bak.$(date +%F-%H%M)
|
||||||
|
|
||||||
|
echo "=== Génération de la configuration avahi-daemon.conf ==="
|
||||||
|
cat > /etc/avahi/avahi-daemon.conf <<EOF
|
||||||
|
[server]
|
||||||
|
host-name=$(hostname)
|
||||||
|
use-ipv4=yes
|
||||||
|
use-ipv6=no
|
||||||
|
allow-interfaces=$ALLOWED_INTERFACES
|
||||||
|
ratelimit-interval-usec=1000000
|
||||||
|
ratelimit-burst=10
|
||||||
|
|
||||||
|
[wide-area]
|
||||||
|
enable-wide-area=no
|
||||||
|
|
||||||
|
[publish]
|
||||||
|
publish-addresses=yes
|
||||||
|
publish-hinfo=yes
|
||||||
|
publish-workstation=yes
|
||||||
|
publish-domain=yes
|
||||||
|
|
||||||
|
[reflector]
|
||||||
|
enable-reflector=no
|
||||||
|
|
||||||
|
[rlimits]
|
||||||
|
rlimit-as=0
|
||||||
|
rlimit-core=0
|
||||||
|
rlimit-data=4194304
|
||||||
|
rlimit-fsize=0
|
||||||
|
rlimit-nofile=300
|
||||||
|
rlimit-stack=4194304
|
||||||
|
EOF
|
||||||
|
|
||||||
|
if $PUBLISH_HTTP; then
|
||||||
|
echo "=== Publication temporaire d'un service HTTP de test ==="
|
||||||
|
mkdir -p /etc/avahi/services
|
||||||
|
cat > /etc/avahi/services/test-http.service <<EOF
|
||||||
|
<?xml version="1.0" standalone='no'?>
|
||||||
|
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
|
||||||
|
<service-group>
|
||||||
|
<name replace-wildcards="yes">Test HTTP on %h</name>
|
||||||
|
<service>
|
||||||
|
<type>_http._tcp</type>
|
||||||
|
<port>80</port>
|
||||||
|
</service>
|
||||||
|
</service-group>
|
||||||
|
EOF
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "=== Activation et redémarrage du service Avahi ==="
|
||||||
|
systemctl enable avahi-daemon
|
||||||
|
systemctl restart avahi-daemon
|
||||||
|
|
||||||
|
echo "=== Vérification du statut du service ==="
|
||||||
|
systemctl status avahi-daemon --no-pager || { echo "❌ Avahi ne fonctionne pas."; exit 1; }
|
||||||
|
|
||||||
|
echo "=== Vérification du multicast sur l'interface ==="
|
||||||
|
ip a | grep MULTICAST || echo "⚠️ Aucune interface multicast détectée"
|
||||||
|
|
||||||
|
echo "=== Vérification de l'écoute sur le port UDP 5353 ==="
|
||||||
|
ss -uln | grep 5353 || echo "⚠️ Aucun service écoutant sur UDP/5353"
|
||||||
|
|
||||||
|
echo "=== Test de la résolution mDNS avec getent (NSS) ==="
|
||||||
|
LOCAL_HOST="$(hostname).local"
|
||||||
|
if getent hosts "$LOCAL_HOST"; then
|
||||||
|
echo "✅ Résolution mDNS de $LOCAL_HOST réussie via getent"
|
||||||
|
else
|
||||||
|
echo "❌ La résolution mDNS de $LOCAL_HOST a échoué via getent"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "=== Scan des services mDNS disponibles ==="
|
||||||
|
avahi-browse -a -t || echo "⚠️ Aucun service mDNS visible (normal si peu de services publiés)"
|
||||||
|
|
||||||
|
echo "✅ mDNS opérationnel sur : $ALLOWED_INTERFACES"
|
||||||
|
echo "$INTERFACES" > /var/log/mdns_interfaces.log
|
||||||
|
echo "Interfaces enregistrées dans /var/log/mdns_interfaces.log"
|
||||||
|
|
||||||
|
if $PUBLISH_HTTP; then
|
||||||
|
echo "=== Suppression du service HTTP de test ==="
|
||||||
|
rm -f /etc/avahi/services/test-http.service
|
||||||
|
systemctl restart avahi-daemon
|
||||||
|
echo "✅ Service HTTP de test retiré proprement"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "✅ Script terminé avec succès"
|
||||||
@@ -4,3 +4,4 @@ get_first_free_ip.sh
|
|||||||
remove_dns_entry.sh
|
remove_dns_entry.sh
|
||||||
search_entry.sh
|
search_entry.sh
|
||||||
setup_dhcp.sh
|
setup_dhcp.sh
|
||||||
|
setup_nat_auto.sh
|
||||||
|
|||||||
@@ -89,11 +89,11 @@ for HOSTNAME in "${HOSTNAMES[@]}"; do
|
|||||||
if is_hostname_registered "$FQDN"; then
|
if is_hostname_registered "$FQDN"; then
|
||||||
echo "L'association $FQDN -> $IP existe déjà."
|
echo "L'association $FQDN -> $IP existe déjà."
|
||||||
else
|
else
|
||||||
read -t 5 -p "Le FQDN $FQDN n'est pas dans la liste. Voulez-vous l'ajouter ? (o/N) 5s " REPLY
|
read -p "Le FQDN $FQDN n'est pas dans la liste. Voulez-vous l'ajouter ? (o/N) " REPLY
|
||||||
# Si aucune entrée n'est faite dans le délai imparti, on met "n" par défaut
|
# Si aucune entrée n'est faite dans le délai imparti, on met "n" par défaut
|
||||||
if [[ -z "$REPLY" ]]; then
|
if [[ -z "$REPLY" ]]; then
|
||||||
REPLY="n"
|
REPLY="n"
|
||||||
echo -e "\nTemps écoulé. Réponse par défaut : n"
|
echo -e "\nRéponse par défaut : n"
|
||||||
fi
|
fi
|
||||||
if [[ "$REPLY" =~ ^[Oo]$ ]]; then
|
if [[ "$REPLY" =~ ^[Oo]$ ]]; then
|
||||||
echo "address=/$FQDN/$IP" >> "$DNSMASQ_CONF"
|
echo "address=/$FQDN/$IP" >> "$DNSMASQ_CONF"
|
||||||
@@ -140,10 +140,10 @@ for HOSTNAME in "${HOSTNAMES[@]}"; do
|
|||||||
if [[ "$(get_actual_fqdn "$IP")" != "$ACTUAL_FQDN" ]]; then
|
if [[ "$(get_actual_fqdn "$IP")" != "$ACTUAL_FQDN" ]]; then
|
||||||
if [[ -n "$EXISTING_PTR" ]]; then
|
if [[ -n "$EXISTING_PTR" ]]; then
|
||||||
if [[ "$EXISTING_PTR" != "ptr-record=$PTR_RECORD,$ACTUAL_FQDN" ]]; then
|
if [[ "$EXISTING_PTR" != "ptr-record=$PTR_RECORD,$ACTUAL_FQDN" ]]; then
|
||||||
read -t 5 -p "Voulez-vous le remplacer ? (o/N) 5s " REPLY
|
read -p "Voulez-vous le remplacer ? (o/N) " REPLY
|
||||||
if [[ -z "$REPLY" ]]; then
|
if [[ -z "$REPLY" ]]; then
|
||||||
REPLY="n"
|
REPLY="n"
|
||||||
echo -e "\nTemps écoulé. Réponse par défaut : n"
|
echo -e "\nRéponse par défaut : n"
|
||||||
fi
|
fi
|
||||||
if [[ "$REPLY" =~ ^[Oo]$ ]]; then
|
if [[ "$REPLY" =~ ^[Oo]$ ]]; then
|
||||||
sed -i "/ptr-record=$PTR_RECORD/d" "$DNSMASQ_CONF"
|
sed -i "/ptr-record=$PTR_RECORD/d" "$DNSMASQ_CONF"
|
||||||
|
|||||||
@@ -1,103 +1,63 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# Basé sur un travail de Cédric Abonnel / Cédrix sous licence CC BY-NC 4.0
|
# Basé sur un travail de Cédric Abonnel / Cédrix sous licence CC BY-NC 4.0
|
||||||
|
|
||||||
# Importer les fonctions communes
|
# Fichier contenant les enregistrements
|
||||||
source "$(dirname "$0")/../common/common_utils.sh"
|
FILE="/etc/dnsmasq.d/custom_hosts"
|
||||||
|
|
||||||
# Vérifier si le script est exécuté en root
|
# Vérification de l'existence du fichier
|
||||||
check_root
|
if [[ ! -f "$FILE" ]]; then
|
||||||
|
echo "Erreur: Le fichier $FILE n'existe pas."
|
||||||
# Vérifie si une IP est fournie
|
|
||||||
if [ -z "$1" ]; then
|
|
||||||
echo "Usage: $0 <IP>"
|
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
IP="$1"
|
# Vérification des arguments
|
||||||
|
if [[ $# -ne 1 ]]; then
|
||||||
echo "🔍 Recherche du nom d'hôte pour l'IP : $IP"
|
echo "Usage: $0 <nom_machine|FQDN|adresse_IP>"
|
||||||
|
exit 1
|
||||||
# Fonction pour vérifier si une commande est disponible
|
|
||||||
command_exists() {
|
|
||||||
command -v "$1" &> /dev/null
|
|
||||||
}
|
|
||||||
|
|
||||||
# Détection du serveur DNS en prenant en compte dnsmasq et fallback sur resolv.conf
|
|
||||||
get_dns_server() {
|
|
||||||
local dns_server=""
|
|
||||||
|
|
||||||
if command_exists resolvectl; then
|
|
||||||
dns_server=$(resolvectl dns | awk '/^Global:/ {print $2; exit}')
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -z "$dns_server" ] && command_exists dnsmasq; then
|
|
||||||
dns_server=$(ss -tulpn | grep dnsmasq | awk '{print $5}' | cut -d: -f1 | head -n1)
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -z "$dns_server" ] && [ -f /etc/resolv.conf ]; then
|
|
||||||
dns_server=$(grep -m1 '^nameserver' /etc/resolv.conf | awk '{print $2}')
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "${dns_server:-9.9.9.9}" # Utilisation d'un fallback 9.9.9.9 si aucun DNS trouvé
|
|
||||||
}
|
|
||||||
|
|
||||||
DNS_SERVER=$(get_dns_server)
|
|
||||||
echo "🛜 Serveur DNS détecté : $DNS_SERVER"
|
|
||||||
|
|
||||||
# 1️⃣ Test LLMNR (Link-Local Multicast Name Resolution)
|
|
||||||
if command_exists resolvectl; then
|
|
||||||
HOSTNAME_LLMNR=$(resolvectl query "$IP" 2>/dev/null | grep -oP '(?<=Name:\s).*' | head -n1)
|
|
||||||
if [ -n "$HOSTNAME_LLMNR" ]; then
|
|
||||||
echo "✅ LLMNR: $HOSTNAME_LLMNR"
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo "⚠ LLMNR non disponible (resolvectl absent)"
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 2️⃣ Test mDNS (Multicast DNS / Avahi)
|
SEARCH_TERM="$1"
|
||||||
if command_exists avahi-resolve; then
|
|
||||||
HOSTNAME_MDNS=$(avahi-resolve -a "$IP" 2>/dev/null | awk '{print $2}')
|
# Détection du nom de domaine
|
||||||
if [ -n "$HOSTNAME_MDNS" ]; then
|
if [[ -f /etc/resolv.conf ]]; then
|
||||||
echo "✅ mDNS (Avahi): $HOSTNAME_MDNS"
|
DOMAIN=$(awk '/^search / {print $2; exit} /^domain / {print $2; exit}' /etc/resolv.conf)
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo "⚠ mDNS non disponible (avahi-resolve absent)"
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 3️⃣ Vérification du cache ARP
|
# Alternative si resolv.conf n'existe pas ou est vide
|
||||||
if command_exists arp; then
|
if [[ -z "$DOMAIN" ]]; then
|
||||||
HOSTNAME_ARP=$(arp -a | grep "$IP" | awk '{print $1}')
|
DOMAIN=$(hostname --domain 2>/dev/null) # Essayer avec hostname
|
||||||
if [ -n "$HOSTNAME_ARP" ]; then
|
if [[ -z "$DOMAIN" ]]; then
|
||||||
echo "✅ ARP: $HOSTNAME_ARP"
|
DOMAIN=$(nmcli -t -f IP4.DOMAIN dev show | head -n 1) # Essayer avec nmcli
|
||||||
exit 0
|
|
||||||
fi
|
fi
|
||||||
else
|
|
||||||
echo "⚠ ARP non disponible"
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 4️⃣ Vérification via NetBIOS (Windows/Samba)
|
# Vérifier qu'on a bien trouvé un domaine
|
||||||
if command_exists nmblookup; then
|
if [[ -z "$DOMAIN" ]]; then
|
||||||
HOSTNAME_NETBIOS=$(nmblookup -A "$IP" 2>/dev/null | grep -m1 '<00>' | awk '{print $1}')
|
echo "Erreur: Impossible de détecter le nom de domaine."
|
||||||
if [ -n "$HOSTNAME_NETBIOS" ]; then
|
exit 1
|
||||||
echo "✅ NetBIOS: $HOSTNAME_NETBIOS"
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo "⚠ NetBIOS non disponible (nmblookup absent)"
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 5️⃣ Scan réseau avec Nmap pour identifier l'hôte
|
# Si l'entrée ne contient pas un point, on ajoute le domaine détecté
|
||||||
if command_exists nmap; then
|
if [[ ! "$SEARCH_TERM" =~ \. ]]; then
|
||||||
HOSTNAME_NMAP=$(nmap --dns-servers "$DNS_SERVER" -sP "$IP" 2>/dev/null | grep "Nmap scan report" | awk '{print $5}')
|
SEARCH_TERM="$SEARCH_TERM.$DOMAIN"
|
||||||
if [ -n "$HOSTNAME_NMAP" ]; then
|
fi
|
||||||
echo "✅ Nmap: $HOSTNAME_NMAP"
|
|
||||||
exit 0
|
# Vérification si l'entrée est une adresse IP
|
||||||
fi
|
if [[ "$SEARCH_TERM" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
|
||||||
else
|
RESULTS=$(grep -E "/$SEARCH_TERM\$" "$FILE")
|
||||||
echo "⚠ Nmap non disponible"
|
else
|
||||||
|
if [[ ! "$SEARCH_TERM" =~ ^[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ ]]; then
|
||||||
|
echo "Erreur: '$SEARCH_TERM' ne semble pas être un FQDN valide."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
RESULTS=$(grep -E "^address=/$SEARCH_TERM/" "$FILE")
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Vérification et affichage des résultats
|
||||||
|
if [[ -n "$RESULTS" ]]; then
|
||||||
|
echo "Résultats trouvés :"
|
||||||
|
echo "$RESULTS"
|
||||||
|
else
|
||||||
|
echo "Aucun résultat trouvé pour '$SEARCH_TERM'."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "❌ Aucune correspondance trouvée."
|
|
||||||
exit 1
|
|
||||||
|
|||||||
@@ -18,11 +18,23 @@ NETMASK_CIDR=$(echo "$IP_INFO" | cut -d'/' -f2)
|
|||||||
# Extraire le préfixe réseau (ex: "192.168.100")
|
# Extraire le préfixe réseau (ex: "192.168.100")
|
||||||
PREFIX=$(echo "$NETWORK_IP" | awk -F. '{print $1"."$2"."$3}')
|
PREFIX=$(echo "$NETWORK_IP" | awk -F. '{print $1"."$2"."$3}')
|
||||||
|
|
||||||
# Calculer les bornes de la plage d'adresses IP en fonction du masque
|
# Calculer la plage IP en fonction du masque
|
||||||
NETMASK=$(( 32 - NETMASK_CIDR ))
|
TOTAL_HOSTS=$(( 2 ** (32 - NETMASK_CIDR) ))
|
||||||
TOTAL_HOSTS=$(( 2 ** NETMASK ))
|
|
||||||
IP_RANGE_START="$PREFIX.1"
|
IP_RANGE_START="$PREFIX.1"
|
||||||
IP_RANGE_END="$PREFIX.$(( TOTAL_HOSTS - 2 ))" # -2 pour exclure le broadcast
|
IP_RANGE_END="$PREFIX.$(( TOTAL_HOSTS - 2 ))" # -2 pour exclure le broadcast et l'adresse réseau
|
||||||
|
|
||||||
|
# Afficher la plage détectée
|
||||||
|
echo "🔍 Plage IP détectée :"
|
||||||
|
echo " ➡ Début : $IP_RANGE_START"
|
||||||
|
echo " ➡ Fin : $IP_RANGE_END"
|
||||||
|
|
||||||
|
# Demander confirmation ou modification de la plage
|
||||||
|
read -p "Nouvelle adresse de début (laisser vide pour conserver $IP_RANGE_START) : " NEW_START
|
||||||
|
read -p "Nouvelle adresse de fin (laisser vide pour conserver $IP_RANGE_END) : " NEW_END
|
||||||
|
|
||||||
|
# Si l'utilisateur ne saisit rien, conserver les valeurs détectées
|
||||||
|
IP_RANGE_START=${NEW_START:-$IP_RANGE_START}
|
||||||
|
IP_RANGE_END=${NEW_END:-$IP_RANGE_END}
|
||||||
|
|
||||||
# Fichier contenant les réservations DHCP
|
# Fichier contenant les réservations DHCP
|
||||||
RESERVATION_FILE="/etc/dnsmasq.d/custom_hosts"
|
RESERVATION_FILE="/etc/dnsmasq.d/custom_hosts"
|
||||||
@@ -49,33 +61,23 @@ fi
|
|||||||
# Lire toutes les IP utilisées dans le fichier de réservation
|
# Lire toutes les IP utilisées dans le fichier de réservation
|
||||||
USED_IPS=($(grep -oE 'address=/[^/]+/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' "$RESERVATION_FILE" | awk -F'/' '{print $3}'))
|
USED_IPS=($(grep -oE 'address=/[^/]+/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' "$RESERVATION_FILE" | awk -F'/' '{print $3}'))
|
||||||
|
|
||||||
# Si aucune IP n'est réservée, retourner la première adresse disponible
|
# Vérification et recherche de la première IP disponible
|
||||||
if [[ ${#USED_IPS[@]} -eq 0 ]]; then
|
|
||||||
echo "✅ Première IP disponible : $IP_RANGE_START"
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Trouver la plus grande IP utilisée
|
|
||||||
MAX_IP_INT=0
|
|
||||||
for ip in "${USED_IPS[@]}"; do
|
|
||||||
ip_int=$(ip_to_int "$ip")
|
|
||||||
if (( ip_int > MAX_IP_INT )); then
|
|
||||||
MAX_IP_INT=$ip_int
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
# Calculer la prochaine IP disponible
|
|
||||||
NEXT_IP_INT=$((MAX_IP_INT + 1))
|
|
||||||
NEXT_IP=$(int_to_ip "$NEXT_IP_INT")
|
|
||||||
|
|
||||||
# Vérifier que cette IP est bien dans la plage autorisée
|
|
||||||
START_INT=$(ip_to_int "$IP_RANGE_START")
|
START_INT=$(ip_to_int "$IP_RANGE_START")
|
||||||
END_INT=$(ip_to_int "$IP_RANGE_END")
|
END_INT=$(ip_to_int "$IP_RANGE_END")
|
||||||
|
|
||||||
if (( NEXT_IP_INT > END_INT )); then
|
CURRENT_IP_INT=$START_INT
|
||||||
echo "❌ Plus aucune IP disponible dans la plage définie."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "✅ Première IP disponible : $NEXT_IP"
|
while (( CURRENT_IP_INT <= END_INT )); do
|
||||||
exit 0
|
CURRENT_IP=$(int_to_ip "$CURRENT_IP_INT")
|
||||||
|
|
||||||
|
# Vérifier si l'IP est déjà réservée
|
||||||
|
if [[ ! " ${USED_IPS[@]} " =~ " $CURRENT_IP " ]]; then
|
||||||
|
echo "✅ Première IP disponible : $CURRENT_IP"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
(( CURRENT_IP_INT++ ))
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "❌ Plus aucune IP disponible dans la plage définie."
|
||||||
|
exit 1
|
||||||
|
|||||||
@@ -12,26 +12,62 @@ if ! command -v dnsmasq &> /dev/null; then
|
|||||||
echo "Installation de dnsmasq..."
|
echo "Installation de dnsmasq..."
|
||||||
apt update && apt install -y dnsmasq
|
apt update && apt install -y dnsmasq
|
||||||
echo "Installation d'outils réseau..."
|
echo "Installation d'outils réseau..."
|
||||||
apt install -y systemd-resolved avahi-utils net-tools smbclient nmap
|
apt install -y avahi-utils net-tools smbclient nmap
|
||||||
systemctl disable --now avahi-daemon
|
systemctl disable --now avahi-daemon
|
||||||
else
|
else
|
||||||
echo "dnsmasq est déjà installé."
|
echo "dnsmasq est déjà installé."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Récupérer toutes les interfaces réseau sauf loopback
|
||||||
|
mapfile -t NOMS < <(ip -o link show | awk -F': ' '{print $2}' | grep -v lo)
|
||||||
|
|
||||||
# Obtenir l'adresse IP du serveur sur l'interface principale
|
if [[ ${#NOMS[@]} -eq 0 ]]; then
|
||||||
IP_SERVEUR=$(ip -4 addr show $(ip route show default | awk '/default/ {print $5}') | grep -oP '(?<=inet\s)\d+(\.\d+){3}')
|
echo "Aucune interface réseau trouvée."
|
||||||
if [[ -z "$IP_SERVEUR" ]]; then
|
|
||||||
echo "Impossible de déterminer l'adresse IP du serveur."
|
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Vérifier si l'IP est dans une plage privée autorisée
|
# Construire les options avec IP si existante
|
||||||
if [[ "$IP_SERVEUR" =~ ^10\..* || "$IP_SERVEUR" =~ ^192\.168\..* || "$IP_SERVEUR" =~ ^172\.(1[6-9]|2[0-9]|3[0-1])\..* ]]; then
|
OPTIONS=()
|
||||||
echo "Adresse IP privée détectée : $IP_SERVEUR"
|
for IFACE in "${NOMS[@]}"; do
|
||||||
|
# Nettoyer l'interface de @ifX
|
||||||
|
IFACE_CLEAN=$(echo "$IFACE" | cut -d'@' -f1)
|
||||||
|
IP=$(ip -4 -o addr show "$IFACE_CLEAN" 2>/dev/null | awk '{print $4}' | cut -d'/' -f1)
|
||||||
|
if [[ -n "$IP" ]]; then
|
||||||
|
OPTIONS+=("$IFACE_CLEAN ($IP)")
|
||||||
|
else
|
||||||
|
OPTIONS+=("$IFACE_CLEAN (Pas d'IP)")
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "Sélectionnez l'interface réseau à utiliser (IP affichée si existante) :"
|
||||||
|
PS3="Votre choix : "
|
||||||
|
select CHOIX in "${OPTIONS[@]}"; do
|
||||||
|
if [[ -n "$CHOIX" ]]; then
|
||||||
|
INTERFACE=$(echo "$CHOIX" | awk '{print $1}')
|
||||||
|
break
|
||||||
|
else
|
||||||
|
echo "Choix invalide. Veuillez réessayer."
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Maintenant que l'interface est choisie, récupérer l'IP
|
||||||
|
IP_EXISTANTE=$(ip -4 -o addr show "$INTERFACE" 2>/dev/null | awk '{print $4}' | cut -d'/' -f1)
|
||||||
|
|
||||||
|
if [[ -n "$IP_EXISTANTE" ]]; then
|
||||||
|
IP_SERVEUR="$IP_EXISTANTE"
|
||||||
else
|
else
|
||||||
echo "Erreur : L'adresse IP $IP_SERVEUR n'est pas dans un réseau privé."
|
read -rp "Aucune IP détectée sur $INTERFACE. Veuillez entrer une IP à utiliser : " IP_SAISIE
|
||||||
exit 1
|
IP_SERVEUR="$IP_SAISIE"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "✅ Interface sélectionnée : $INTERFACE"
|
||||||
|
echo "✅ Adresse IP sélectionnée : $IP_SERVEUR"
|
||||||
|
|
||||||
|
# Vérifier si l'IP est privée ou publique
|
||||||
|
if [[ "$IP_SERVEUR" =~ ^10\. ]] || [[ "$IP_SERVEUR" =~ ^192\.168\. ]] || [[ "$IP_SERVEUR" =~ ^172\.(1[6-9]|2[0-9]|3[0-1])\. ]]; then
|
||||||
|
echo "✅ Adresse IP privée détectée : $IP_SERVEUR"
|
||||||
|
else
|
||||||
|
echo "⚠️ Attention : L'adresse IP $IP_SERVEUR semble PUBLIQUE !"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
FORCE=false
|
FORCE=false
|
||||||
@@ -40,8 +76,10 @@ if [[ "$1" == "--force" ]]; then
|
|||||||
echo "Mode forçage activé : reconfiguration complète..."
|
echo "Mode forçage activé : reconfiguration complète..."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if systemctl is-active --quiet dnsmasq && [ "$FORCE" = false ]; then
|
DNSMASQ_CONF="/etc/dnsmasq.conf"
|
||||||
echo "dnsmasq est déjà actif et configuré. Utilisez --force pour reconfigurer."
|
|
||||||
|
if grep -q "# CONFIGURE_PAR_CEDRIX" "$DNSMASQ_CONF" && [ "$FORCE" = false ]; then
|
||||||
|
echo "dnsmasq est déjà configuré. Utilisez --force pour reconfigurer."
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -88,7 +126,8 @@ fi
|
|||||||
# Configurer dnsmasq
|
# Configurer dnsmasq
|
||||||
echo "Configuration de dnsmasq..."
|
echo "Configuration de dnsmasq..."
|
||||||
|
|
||||||
cat <<EOF > /etc/dnsmasq.conf
|
cat <<EOF > $DNSMASQ_CONF
|
||||||
|
# CONFIGURE_PAR_CEDRIX
|
||||||
# Configuration de dnsmasq
|
# Configuration de dnsmasq
|
||||||
|
|
||||||
# Interface réseau principale
|
# Interface réseau principale
|
||||||
@@ -152,10 +191,18 @@ echo 'nameserver 127.0.0.1' > /etc/resolv.conf
|
|||||||
echo "Configuration DNS mise à jour sur 127.0.0.1"
|
echo "Configuration DNS mise à jour sur 127.0.0.1"
|
||||||
# Redémarrer les services nécessaires
|
# Redémarrer les services nécessaires
|
||||||
echo "Redémarrage des services..."
|
echo "Redémarrage des services..."
|
||||||
systemctl restart dnsmasq 2>/dev/null && echo "dnsmasq redémarré."
|
for service in dnsmasq systemd-resolved networking NetworkManager; do
|
||||||
systemctl restart systemd-resolved 2>/dev/null && echo "systemd-resolved redémarré."
|
if systemctl list-unit-files | grep -qw "${service}.service"; then
|
||||||
systemctl restart networking 2>/dev/null && echo "networking redémarré."
|
echo "Redémarrage de $service..."
|
||||||
systemctl restart NetworkManager 2>/dev/null && echo "NetworkManager redémarré."
|
if timeout 5s systemctl restart "$service" 2>/dev/null; then
|
||||||
|
echo "$service redémarré."
|
||||||
|
else
|
||||||
|
echo "⚠️ Timeout ou erreur sur $service."
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "Service $service non disponible sur ce système."
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
echo "Configuration terminée avec succès!"
|
echo "Configuration terminée avec succès!"
|
||||||
echo "Serveur DHCP/DNS fonctionnel sur $IP_SERVEUR"
|
echo "Serveur DHCP/DNS fonctionnel sur $IP_SERVEUR"
|
||||||
|
|||||||
88
scripts/server-dhcp/setup_nat_auto.sh
Normal file
88
scripts/server-dhcp/setup_nat_auto.sh
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Basé sur un travail de Cédric Abonnel / Cédrix sous licence CC BY-NC 4.0
|
||||||
|
# Objectif : Faire du NAT du LAN vers le WAN
|
||||||
|
|
||||||
|
# Import des fonctions utilitaires communes
|
||||||
|
source "$(dirname "$0")/../common/common_utils.sh"
|
||||||
|
|
||||||
|
# Vérification des droits root
|
||||||
|
check_root
|
||||||
|
|
||||||
|
echo "[+] Détection des interfaces réseau..."
|
||||||
|
|
||||||
|
# Détection de l'interface WAN (par défaut la passerelle)
|
||||||
|
WAN_IF=$(ip route | grep default | awk '{print $5}' | head -n 1)
|
||||||
|
if [[ -z "$WAN_IF" ]]; then
|
||||||
|
echo "[❌] Aucune interface WAN détectée (pas de route par défaut)."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "[+] Interface WAN détectée : $WAN_IF"
|
||||||
|
|
||||||
|
# Détection de l'interface LAN (IP privée autre que WAN_IF)
|
||||||
|
LAN_IF=""
|
||||||
|
LAN_IP=""
|
||||||
|
LAN_SUBNET=""
|
||||||
|
|
||||||
|
while IFS= read -r line; do
|
||||||
|
IFACE=$(echo "$line" | awk '{print $2}')
|
||||||
|
IP_CIDR=$(echo "$line" | awk '{print $4}')
|
||||||
|
IP_ADDR=${IP_CIDR%%/*}
|
||||||
|
|
||||||
|
# Vérifie que l'interface n'est pas celle du WAN et possède une IP privée
|
||||||
|
if [[ "$IFACE" != "$WAN_IF" ]] && (
|
||||||
|
[[ "$IP_ADDR" =~ ^192\.168\. ]] ||
|
||||||
|
[[ "$IP_ADDR" =~ ^10\. ]] ||
|
||||||
|
([[ "$IP_ADDR" =~ ^172\. ]] && [[ $(echo "$IP_ADDR" | cut -d. -f2) -ge 16 ]] && [[ $(echo "$IP_ADDR" | cut -d. -f2) -le 31 ]])
|
||||||
|
); then
|
||||||
|
LAN_IF="$IFACE"
|
||||||
|
LAN_IP="$IP_ADDR"
|
||||||
|
LAN_SUBNET="$IP_CIDR"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done < <(ip -o -4 addr show)
|
||||||
|
|
||||||
|
if [[ -z "$LAN_IF" || -z "$LAN_SUBNET" ]]; then
|
||||||
|
echo "[❌] Impossible de détecter l'interface LAN ou le sous-réseau."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "[+] Interface LAN détectée : $LAN_IF ($LAN_IP / $LAN_SUBNET)"
|
||||||
|
echo "[ℹ️] Toutes les interfaces réseau :"
|
||||||
|
ip -o -4 addr show | awk '{print "- Interface:", $2, "=> IP:", $4}'
|
||||||
|
|
||||||
|
if [[ "$LAN_IF" == "$WAN_IF" ]]; then
|
||||||
|
echo "[❌] Erreur : L'interface LAN et WAN sont identiques ($WAN_IF). Corrige ta configuration réseau."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -n "$LAN_IF" ]]; then
|
||||||
|
echo "[+] Interface LAN détectée : $LAN_IF"
|
||||||
|
echo "[+] Sous-réseau LAN détecté : $LAN_SUBNET"
|
||||||
|
else
|
||||||
|
echo "[⚠️] Aucune interface réseau avec une IP privée détectée."
|
||||||
|
echo " Vérifiez votre configuration réseau ou connectez-vous à un réseau local."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
echo "[+] Mise à jour et installation des paquets nécessaires..."
|
||||||
|
apt update -y
|
||||||
|
apt install -y iptables iproute2
|
||||||
|
|
||||||
|
echo "[+] Activation de l'IP forwarding..."
|
||||||
|
echo 1 > /proc/sys/net/ipv4/ip_forward
|
||||||
|
sed -i '/^#net.ipv4.ip_forward=1/s/^#//' /etc/sysctl.conf
|
||||||
|
sysctl -p
|
||||||
|
|
||||||
|
echo "[+] Nettoyage des anciennes règles iptables NAT..."
|
||||||
|
iptables -t nat -F
|
||||||
|
iptables -F
|
||||||
|
|
||||||
|
echo "[+] Mise en place du NAT (MASQUERADE)..."
|
||||||
|
iptables -t nat -A POSTROUTING -s "$LAN_SUBNET" -o "$WAN_IF" -j MASQUERADE
|
||||||
|
|
||||||
|
echo "[+] Sauvegarde des règles iptables..."
|
||||||
|
apt install -y iptables-persistent
|
||||||
|
netfilter-persistent save
|
||||||
|
|
||||||
|
echo "[✅] NAT opérationnel : $LAN_SUBNET sort par $WAN_IF"
|
||||||
@@ -1,3 +1,5 @@
|
|||||||
add_domain.sh
|
add_domain.sh
|
||||||
add_domain_ssl.sh
|
add_domain_ssl.sh
|
||||||
|
install-php8-3.sh
|
||||||
|
set-permissions-www.sh
|
||||||
setup_httpd.sh
|
setup_httpd.sh
|
||||||
|
|||||||
49
scripts/server-httpd/add_domain.sh
Normal file → Executable file
49
scripts/server-httpd/add_domain.sh
Normal file → Executable file
@@ -9,31 +9,19 @@ source "$(dirname "$0")/../common/common_utils.sh"
|
|||||||
# Vérifier si le script est exécuté en root
|
# Vérifier si le script est exécuté en root
|
||||||
check_root
|
check_root
|
||||||
|
|
||||||
# Vérification DNS
|
# Vérification DNS (alerte non bloquante)
|
||||||
check_dns "$DOMAIN"
|
if ! check_dns "$DOMAIN"; then
|
||||||
|
echo "⚠️ Attention : Résolution DNS impossible pour $DOMAIN. Vérifie si c'est bien ce que tu veux."
|
||||||
|
fi
|
||||||
|
|
||||||
REVERSED_DOMAIN=$(echo "$DOMAIN" | awk -F. '{for(i=NF; i>0; i--) printf "%s%s", $i, (i>1 ? "." : "")}')
|
REVERSED_DOMAIN=$(echo "$DOMAIN" | awk -F. '{for(i=NF; i>0; i--) printf "%s%s", $i, (i>1 ? "." : "")}')
|
||||||
VHOST_CONF="/etc/apache2/sites-available/$REVERSED_DOMAIN.conf"
|
VHOST_CONF="/etc/apache2/sites-available/$REVERSED_DOMAIN.conf"
|
||||||
LE_DIR="/etc/letsencrypt/live/$DOMAIN"
|
|
||||||
BACKUP_DIR="/etc/apache2/backups"
|
|
||||||
TEMPLATE_DIR="/etc/apache2/templates"
|
|
||||||
TEMPLATE="$TEMPLATE_DIR/vhost-template.conf"
|
|
||||||
CHALLENGE_DIR="/var/www/cedrix/.well-known/acme-challenge"
|
|
||||||
PATH_URL_ACME_CHALLENGE=".well-known/acme-challenge"
|
|
||||||
TEST_FILE="test-challenge"
|
|
||||||
TEST_URL="http://${DOMAIN}/${PATH_URL_ACME_CHALLENGE}/${TEST_FILE}"
|
|
||||||
RANDOM_CONTENT=$(openssl rand -hex 12)
|
|
||||||
|
|
||||||
# Créer les dossiers nécessaires
|
|
||||||
mkdir -p "$BACKUP_DIR" "$TEMPLATE_DIR" "$CHALLENGE_DIR"
|
|
||||||
chown -R www-data:www-data "$CHALLENGE_DIR"
|
|
||||||
|
|
||||||
|
# Préparer le dossier du VirtualHost
|
||||||
mkdir -p "/var/www/$REVERSED_DOMAIN"
|
mkdir -p "/var/www/$REVERSED_DOMAIN"
|
||||||
chown -R www-data:www-data "/var/www/$REVERSED_DOMAIN"
|
chown -R www-data:www-data "/var/www/$REVERSED_DOMAIN"
|
||||||
chmod -R 755 "/var/www/$REVERSED_DOMAIN"
|
chmod -R 755 "/var/www/$REVERSED_DOMAIN"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Vérifier si le VirtualHost HTTP existe déjà
|
# Vérifier si le VirtualHost HTTP existe déjà
|
||||||
if [[ ! -f "$VHOST_CONF" ]]; then
|
if [[ ! -f "$VHOST_CONF" ]]; then
|
||||||
echo "=== Création du fichier VirtualHost HTTP pour $DOMAIN ==="
|
echo "=== Création du fichier VirtualHost HTTP pour $DOMAIN ==="
|
||||||
@@ -44,11 +32,9 @@ if [[ ! -f "$VHOST_CONF" ]]; then
|
|||||||
ErrorLog \${APACHE_LOG_DIR}/$REVERSED_DOMAIN-error.log
|
ErrorLog \${APACHE_LOG_DIR}/$REVERSED_DOMAIN-error.log
|
||||||
CustomLog \${APACHE_LOG_DIR}/$REVERSED_DOMAIN-access.log combined
|
CustomLog \${APACHE_LOG_DIR}/$REVERSED_DOMAIN-access.log combined
|
||||||
|
|
||||||
# Cedrix challenge
|
<Directory /var/www/$REVERSED_DOMAIN>
|
||||||
Alias /${PATH_URL_ACME_CHALLENGE}/ $CHALLENGE_DIR/
|
|
||||||
<Directory $CHALLENGE_DIR>
|
|
||||||
Options +Indexes
|
Options +Indexes
|
||||||
AllowOverride None
|
AllowOverride All
|
||||||
Require all granted
|
Require all granted
|
||||||
</Directory>
|
</Directory>
|
||||||
|
|
||||||
@@ -61,26 +47,5 @@ else
|
|||||||
echo "✅ VirtualHost HTTP déjà configuré pour $DOMAIN."
|
echo "✅ VirtualHost HTTP déjà configuré pour $DOMAIN."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
# Vérification d'accès au dossier cedric-challenge
|
|
||||||
echo "Vérification d'accès au dossier ${PATH_URL_ACME_CHALLENGE}"
|
|
||||||
echo "$RANDOM_CONTENT" | sudo tee "$CHALLENGE_DIR/$TEST_FILE" > /dev/null
|
|
||||||
chmod 644 "$CHALLENGE_DIR/$TEST_FILE"
|
|
||||||
RESPONSE=$(curl -s "$TEST_URL")
|
|
||||||
|
|
||||||
if [[ "$RESPONSE" == "$RANDOM_CONTENT" ]]; then
|
|
||||||
echo "✅ Le dossier est accessible depuis l'extérieur."
|
|
||||||
else
|
|
||||||
echo "❌ Le dossier n'est pas accessible depuis l'extérieur."
|
|
||||||
echo "URL testée : $TEST_URL"
|
|
||||||
echo "Vérifiez votre configuration Apache/Nginx, les firewalls, les proxy et les permissions."
|
|
||||||
#sudo rm -f "$CHALLENGE_DIR/$TEST_FILE"
|
|
||||||
exit 3
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Suppression du fichier test
|
|
||||||
#sudo rm -f "$CHALLENGE_DIR/$TEST_FILE"
|
|
||||||
|
|
||||||
|
|
||||||
echo "✅ Virtual Host configuré pour $DOMAIN avec succès !"
|
echo "✅ Virtual Host configuré pour $DOMAIN avec succès !"
|
||||||
exit 0
|
exit 0
|
||||||
|
|||||||
0
scripts/server-httpd/add_domain_ssl.sh
Normal file → Executable file
0
scripts/server-httpd/add_domain_ssl.sh
Normal file → Executable file
165
scripts/server-httpd/install-php8-3.sh
Executable file
165
scripts/server-httpd/install-php8-3.sh
Executable file
@@ -0,0 +1,165 @@
|
|||||||
|
#!/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
|
||||||
|
|
||||||
|
# Définition des couleurs pour un affichage clair
|
||||||
|
GREEN="\e[32m"
|
||||||
|
YELLOW="\e[33m"
|
||||||
|
RED="\e[31m"
|
||||||
|
RESET="\e[0m"
|
||||||
|
|
||||||
|
echo -e "${YELLOW}Mise à jour des paquets...${RESET}"
|
||||||
|
apt update && apt upgrade -y || { echo -e "${RED}Échec de la mise à jour des paquets${RESET}"; exit 1; }
|
||||||
|
|
||||||
|
# Détection de la version de Debian
|
||||||
|
VERSION=$(lsb_release -sc)
|
||||||
|
SUPPORTED_VERSIONS=("buster" "bullseye" "bookworm")
|
||||||
|
|
||||||
|
TIMEZONE=$(timedatectl show --value --property=Timezone)
|
||||||
|
|
||||||
|
if [[ ! " ${SUPPORTED_VERSIONS[@]} " =~ " ${VERSION} " ]]; then
|
||||||
|
echo -e "${RED}Version de Debian non supportée : $VERSION${RESET}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -e "${GREEN}Version de Debian détectée : $VERSION${RESET}"
|
||||||
|
|
||||||
|
# Vérification de l'existence du dépôt Sury
|
||||||
|
if ! grep -q "packages.sury.org" /etc/apt/sources.list.d/php.list 2>/dev/null; then
|
||||||
|
echo -e "${YELLOW}Ajout du dépôt Sury pour PHP...${RESET}"
|
||||||
|
apt install -y ca-certificates apt-transport-https software-properties-common || { echo -e "${RED}Échec de l'installation des paquets nécessaires${RESET}"; exit 1; }
|
||||||
|
wget -qO /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg || { echo -e "${RED}Échec du téléchargement de la clé GPG de Sury${RESET}"; exit 1; }
|
||||||
|
echo "deb https://packages.sury.org/php/ $VERSION main" | tee /etc/apt/sources.list.d/php.list
|
||||||
|
apt update
|
||||||
|
else
|
||||||
|
echo -e "${GREEN}Le dépôt Sury est déjà installé.${RESET}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Définition de la version PHP souhaitée
|
||||||
|
PHP_VERSION="8.3"
|
||||||
|
|
||||||
|
PHP_INI_CLI="/etc/php/${PHP_VERSION}/cli/php.ini"
|
||||||
|
PHP_INI_APACHE="/etc/php/${PHP_VERSION}/apache2/php.ini"
|
||||||
|
|
||||||
|
# Vérification de l'installation de PHP
|
||||||
|
echo -e "${YELLOW}Installation de PHP $PHP_VERSION et des modules courants...${RESET}"
|
||||||
|
|
||||||
|
# Base des modules PHP à installer
|
||||||
|
PHP_MODULES=(
|
||||||
|
php${PHP_VERSION}
|
||||||
|
php${PHP_VERSION}-cli
|
||||||
|
php${PHP_VERSION}-fpm
|
||||||
|
php${PHP_VERSION}-curl
|
||||||
|
php${PHP_VERSION}-gd
|
||||||
|
php${PHP_VERSION}-mbstring
|
||||||
|
php${PHP_VERSION}-xml
|
||||||
|
php${PHP_VERSION}-zip
|
||||||
|
php${PHP_VERSION}-bcmath
|
||||||
|
php${PHP_VERSION}-soap
|
||||||
|
php${PHP_VERSION}-intl
|
||||||
|
php${PHP_VERSION}-readline
|
||||||
|
php${PHP_VERSION}-ldap
|
||||||
|
php${PHP_VERSION}-imagick
|
||||||
|
php${PHP_VERSION}-exif
|
||||||
|
php${PHP_VERSION}-gmp
|
||||||
|
php${PHP_VERSION}-apcu
|
||||||
|
php${PHP_VERSION}-opcache
|
||||||
|
php${PHP_VERSION}-sqlite3
|
||||||
|
)
|
||||||
|
|
||||||
|
# Vérification MySQL / MariaDB
|
||||||
|
if dpkg -l | grep -qE 'mysql-server|mariadb-server'; then
|
||||||
|
echo -e "${GREEN}MySQL/MariaDB détecté. Ajout du module php-mysql.${RESET}"
|
||||||
|
PHP_MODULES+=(php${PHP_VERSION}-mysql)
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Vérification PostgreSQL
|
||||||
|
if dpkg -l | grep -q postgresql; then
|
||||||
|
echo -e "${GREEN}PostgreSQL détecté. Ajout du module php-pgsql.${RESET}"
|
||||||
|
PHP_MODULES+=(php${PHP_VERSION}-pgsql)
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Installation des modules PHP
|
||||||
|
echo -e "${GREEN}Installation des modules PHP...${RESET}"
|
||||||
|
apt install -y "${PHP_MODULES[@]}" || {
|
||||||
|
echo -e "${RED}❌ Échec de l'installation de PHP ou des modules.${RESET}"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Vérification si Apache est installé et installation du module PHP si nécessaire
|
||||||
|
if systemctl list-units --type=service --all | grep -q "apache2.service"; then
|
||||||
|
echo -e "${YELLOW}Apache détecté. Installation de libapache2-mod-php${RESET}"
|
||||||
|
apt install -y libapache2-mod-php$PHP_VERSION || { echo -e "${RED}Échec de l'installation de libapache2-mod-php${RESET}"; exit 1; }
|
||||||
|
|
||||||
|
echo -e "${YELLOW}Redémarrage d'Apache...${RESET}"
|
||||||
|
systemctl restart apache2 || { echo -e "${RED}Échec du redémarrage d'Apache${RESET}"; exit 1; }
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Configuration de PHP-FPM si ce n'est pas déjà fait
|
||||||
|
PHP_INI="/etc/php/$PHP_VERSION/fpm/php.ini"
|
||||||
|
PHP_INI_DIR="/etc/php/${PHP_VERSION}/fpm/conf.d"
|
||||||
|
|
||||||
|
if grep -q "memory_limit = 512M" "$PHP_INI"; then
|
||||||
|
echo -e "${GREEN}Configuration de PHP-FPM déjà optimisée.${RESET}"
|
||||||
|
else
|
||||||
|
echo -e "${YELLOW}Configuration de PHP-FPM...${RESET}"
|
||||||
|
sed -i 's/memory_limit = .*/memory_limit = 512M/' "$PHP_INI"
|
||||||
|
sed -i 's/upload_max_filesize = .*/upload_max_filesize = 100M/' "$PHP_INI"
|
||||||
|
sed -i 's/post_max_size = .*/post_max_size = 100M/' "$PHP_INI"
|
||||||
|
sed -i 's/max_execution_time = .*/max_execution_time = 300/' "$PHP_INI"
|
||||||
|
|
||||||
|
echo -e "${YELLOW}Redémarrage de PHP-FPM...${RESET}"
|
||||||
|
systemctl restart php$PHP_VERSION-fpm || { echo -e "${RED}Échec du redémarrage de PHP-FPM${RESET}"; exit 1; }
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Configuration OPCache
|
||||||
|
OPCACHE_INI="${PHP_INI_DIR}/10-opcache.ini"
|
||||||
|
cat > "$OPCACHE_INI" <<EOF
|
||||||
|
; Configuration OPcache optimisée
|
||||||
|
opcache.enable=1
|
||||||
|
opcache.memory_consumption=128
|
||||||
|
opcache.interned_strings_buffer=16
|
||||||
|
opcache.max_accelerated_files=10000
|
||||||
|
opcache.revalidate_freq=60
|
||||||
|
opcache.fast_shutdown=1
|
||||||
|
opcache.enable_cli=1
|
||||||
|
EOF
|
||||||
|
echo "==> Fichier $OPCACHE_INI mis à jour."
|
||||||
|
|
||||||
|
# Configuration APCu
|
||||||
|
APCU_INI="${PHP_INI_DIR}/20-apcu.ini"
|
||||||
|
cat > "$APCU_INI" <<EOF
|
||||||
|
; Configuration APCu optimisée
|
||||||
|
apc.enabled=1
|
||||||
|
apc.shm_size=64M
|
||||||
|
apc.ttl=7200
|
||||||
|
apc.enable_cli=0
|
||||||
|
EOF
|
||||||
|
echo "==> Fichier $APCU_INI mis à jour."
|
||||||
|
|
||||||
|
# Définir la timezone PHP pour CLI et Apache
|
||||||
|
sed -i "s|^;*date.timezone =.*|date.timezone = ${TIMEZONE}|" "${PHP_INI_CLI}"
|
||||||
|
sed -i "s|^;*date.timezone =.*|date.timezone = ${TIMEZONE}|" "${PHP_INI_APACHE}"
|
||||||
|
|
||||||
|
# Test de la configuration Apache
|
||||||
|
if systemctl is-active --quiet apache2; then
|
||||||
|
read -rp "Voulez-vous tester le support de PHP par Apache ? (o/n) : " test_php
|
||||||
|
if [[ "$test_php" =~ ^[oOyY]$ ]]; then
|
||||||
|
echo -e "${YELLOW}Vérification du support de PHP par Apache...${RESET}"
|
||||||
|
echo "<?php phpinfo(); ?>" > /var/www/html/info.php
|
||||||
|
chown www-data:www-data /var/www/html/info.php
|
||||||
|
chmod 644 /var/www/html/info.php
|
||||||
|
echo -e "${GREEN}Vous pouvez tester PHP en accédant à : http://<IP_SERVEUR>/info.php${RESET}"
|
||||||
|
else
|
||||||
|
echo -e "${YELLOW}Test PHP annulé.${RESET}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo -e "${RED}Le service Apache n'est pas actif.${RESET}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -e "${GREEN}Installation terminée avec succès ! 🚀${RESET}"
|
||||||
70
scripts/server-httpd/set-permissions-www.sh
Executable file
70
scripts/server-httpd/set-permissions-www.sh
Executable file
@@ -0,0 +1,70 @@
|
|||||||
|
#!/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
|
||||||
|
|
||||||
|
WWW_DIR="/var/www"
|
||||||
|
CURRENT_USER="${SUDO_USER:-$(whoami)}"
|
||||||
|
|
||||||
|
echo "Correction des permissions de $WWW_DIR/html si nécessaire..."
|
||||||
|
if [ -d "$WWW_DIR/html" ]; then
|
||||||
|
OWNER_GROUP=$(stat -c "%U:%G" "$WWW_DIR/html")
|
||||||
|
if [ "$OWNER_GROUP" != "www-data:www-data" ]; then
|
||||||
|
sudo chown -R www-data:www-data "$WWW_DIR/html"
|
||||||
|
echo "Propriétaire de $WWW_DIR/html corrigé en www-data:www-data"
|
||||||
|
else
|
||||||
|
echo "$WWW_DIR/html est déjà correctement configuré."
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "Liste des dossiers dans $WWW_DIR :"
|
||||||
|
dirs=()
|
||||||
|
i=1
|
||||||
|
for d in "$WWW_DIR"/*/; do
|
||||||
|
folder=$(basename "$d")
|
||||||
|
dirs+=("$folder")
|
||||||
|
echo "[$i] $folder"
|
||||||
|
((i++))
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "[0] Tous les dossiers"
|
||||||
|
|
||||||
|
read -p "Sur quel dossier appliquer la règle ? (Entrer le numéro ou 0 pour tous) : " choix
|
||||||
|
|
||||||
|
# Ajout de l'utilisateur courant au groupe www-data
|
||||||
|
if id -nG "$CURRENT_USER" | grep -qw "www-data"; then
|
||||||
|
echo "L'utilisateur $CURRENT_USER est déjà dans le groupe www-data"
|
||||||
|
else
|
||||||
|
echo "Ajout de $CURRENT_USER au groupe www-data..."
|
||||||
|
usermod -aG www-data "$CURRENT_USER"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Fonction d'application des droits
|
||||||
|
apply_permissions() {
|
||||||
|
dossier="$1"
|
||||||
|
echo "Application des permissions sur $WWW_DIR/$dossier ..."
|
||||||
|
chown -R www-data:www-data "$WWW_DIR/$dossier"
|
||||||
|
chmod -R g+rwX "$WWW_DIR/$dossier"
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ "$choix" -eq 0 ]; then
|
||||||
|
for d in "${dirs[@]}"; do
|
||||||
|
apply_permissions "$d"
|
||||||
|
done
|
||||||
|
else
|
||||||
|
index=$((choix - 1))
|
||||||
|
if [ "$index" -ge 0 ] && [ "$index" -lt "${#dirs[@]}" ]; then
|
||||||
|
apply_permissions "${dirs[$index]}"
|
||||||
|
else
|
||||||
|
echo "Choix invalide."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "Opération terminée. Pensez à vous déconnecter/reconnecter si c'est la première fois que vous rejoignez le groupe www-data."
|
||||||
0
scripts/server-httpd/setup_httpd.sh
Normal file → Executable file
0
scripts/server-httpd/setup_httpd.sh
Normal file → Executable file
4
scripts/server-mariadb/.list_files.txt
Normal file
4
scripts/server-mariadb/.list_files.txt
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
check_mysql_secure.sh
|
||||||
|
create_db.sh
|
||||||
|
set_root_password.sh
|
||||||
|
setup_mariadb.sh
|
||||||
220
scripts/server-mariadb/check_mysql_secure.sh
Executable file
220
scripts/server-mariadb/check_mysql_secure.sh
Executable file
@@ -0,0 +1,220 @@
|
|||||||
|
#!/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
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
echo "=== Audit Sécurité MariaDB sur $(hostname) ($(date)) ==="
|
||||||
|
|
||||||
|
CONFIG_FILE="/etc/mysql/mariadb.conf.d/50-server.cnf"
|
||||||
|
ISSUES_FOUND=0
|
||||||
|
RESTART_REQUIRED=0
|
||||||
|
|
||||||
|
# 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
|
||||||
|
|
||||||
|
get_password_from_cnf() {
|
||||||
|
local file=$1
|
||||||
|
sed -n '/\[client\]/,/^\[/p' "$file" | grep -m1 'password' | sed -E 's/^[ \t]*password[ \t]*=[ \t]*//'
|
||||||
|
}
|
||||||
|
|
||||||
|
if [[ -f /etc/mysql/debian.cnf ]]; then
|
||||||
|
DB_USER=$(grep -A5 '\[client\]' /etc/mysql/debian.cnf | grep -m1 'user' | awk -F= '{gsub(/ /,"",$2); print $2}')
|
||||||
|
DB_ROOT_PASSWORD=$(get_password_from_cnf "/etc/mysql/debian.cnf" || echo "")
|
||||||
|
DB_ROOT_PASSWORD=$(echo "$DB_ROOT_PASSWORD" | tr -d '\r\n')
|
||||||
|
else
|
||||||
|
DB_USER="root"
|
||||||
|
read -rp "🔐 Entrez le mot de passe root pour MariaDB : " -s DB_ROOT_PASSWORD
|
||||||
|
echo
|
||||||
|
fi
|
||||||
|
|
||||||
|
TEMP_CNF=$(mktemp)
|
||||||
|
chmod 600 "$TEMP_CNF"
|
||||||
|
cat > "$TEMP_CNF" <<EOF
|
||||||
|
[client]
|
||||||
|
user=$DB_USER
|
||||||
|
password=$DB_ROOT_PASSWORD
|
||||||
|
EOF
|
||||||
|
|
||||||
|
MYSQL_CMD="mysql --defaults-extra-file=$TEMP_CNF"
|
||||||
|
|
||||||
|
echo "🔎 Test de connexion..."
|
||||||
|
if ! $MYSQL_CMD -e "SELECT 1;" >/dev/null 2>&1; then
|
||||||
|
echo "❌ Échec de connexion ($DB_USER)"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "✅ Connexion $DB_USER réussie"
|
||||||
|
|
||||||
|
echo
|
||||||
|
|
||||||
|
check_permissions() {
|
||||||
|
echo "Vérification des permissions systèmes..."
|
||||||
|
if [[ $(stat -c "%U %G" /var/lib/mysql) != "mysql mysql" ]]; then
|
||||||
|
echo "❌ /var/lib/mysql n'appartient pas à mysql:mysql"
|
||||||
|
ISSUE=1
|
||||||
|
else
|
||||||
|
echo "✔️ Permissions /var/lib/mysql OK"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ $(stat -c "%U %G" $CONFIG_FILE) != "root root" ]]; then
|
||||||
|
echo "❌ $CONFIG_FILE n'appartient pas à root:root"
|
||||||
|
ISSUE=1
|
||||||
|
else
|
||||||
|
echo "✔️ Permissions du fichier de conf OK"
|
||||||
|
fi
|
||||||
|
echo
|
||||||
|
}
|
||||||
|
|
||||||
|
check_storage_engines() {
|
||||||
|
echo "🛠 Vérification des moteurs de stockage..."
|
||||||
|
ENABLED=$($MYSQL_CMD -e "SHOW ENGINES;" | awk '$2 ~ /YES|DEFAULT/ {print $1}')
|
||||||
|
for ENGINE in ARCHIVE BLACKHOLE FEDERATED; do
|
||||||
|
if grep -q "$ENGINE" <<< "$ENABLED"; then
|
||||||
|
echo "❌ $ENGINE actif"
|
||||||
|
read -rp "Désactiver $ENGINE (ajout dans disabled_storage_engines) ? (y/n) " choice
|
||||||
|
if [[ $choice == "y" ]]; then
|
||||||
|
if ! grep -q "disabled_storage_engines" "$CONFIG_FILE"; then
|
||||||
|
echo "disabled_storage_engines=$ENGINE" >> "$CONFIG_FILE"
|
||||||
|
else
|
||||||
|
sed -i "/^disabled_storage_engines/s/$/,$ENGINE/" "$CONFIG_FILE"
|
||||||
|
fi
|
||||||
|
RESTART_REQUIRED=1
|
||||||
|
ISSUES_FOUND=1
|
||||||
|
echo "✔️ $ENGINE désactivé (redémarrage requis)"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "✔️ $ENGINE non actif"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
echo
|
||||||
|
}
|
||||||
|
|
||||||
|
check_bind() {
|
||||||
|
echo "🌐 Vérification du bind-address..."
|
||||||
|
BIND_ADDRESS=$(grep -E "^bind-address" "$CONFIG_FILE" | cut -d= -f2 | tr -d ' ')
|
||||||
|
if [[ "$BIND_ADDRESS" != "127.0.0.1" ]]; then
|
||||||
|
echo "❌ MariaDB écoute sur $BIND_ADDRESS"
|
||||||
|
read -rp "Forcer 127.0.0.1 ? (y/n) " choice
|
||||||
|
if [[ $choice == "y" ]]; then
|
||||||
|
sed -i 's/^bind-address.*/bind-address = 127.0.0.1/' "$CONFIG_FILE"
|
||||||
|
RESTART_REQUIRED=1
|
||||||
|
echo "✔️ bind-address corrigé"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "✔️ bind-address sécurisé"
|
||||||
|
fi
|
||||||
|
echo
|
||||||
|
}
|
||||||
|
|
||||||
|
check_anonymous_users() {
|
||||||
|
echo "👤 Vérification des utilisateurs anonymes..."
|
||||||
|
if [[ $($MYSQL_CMD -N -e "SELECT COUNT(*) FROM mysql.user WHERE User='';") -gt 0 ]]; then
|
||||||
|
echo "❌ Utilisateurs anonymes trouvés"
|
||||||
|
read -rp "Supprimer ? (y/n) " choice
|
||||||
|
[[ $choice == "y" ]] && $MYSQL_CMD -e "DELETE FROM mysql.user WHERE User=''; FLUSH PRIVILEGES;" && echo "✔️ Anonymes supprimés"
|
||||||
|
else
|
||||||
|
echo "✔️ Aucun utilisateur anonyme"
|
||||||
|
fi
|
||||||
|
echo
|
||||||
|
}
|
||||||
|
|
||||||
|
check_remote_root() {
|
||||||
|
echo "🔑 Vérification des accès root distants..."
|
||||||
|
if [[ $($MYSQL_CMD -N -e "SELECT COUNT(*) FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');") -gt 0 ]]; then
|
||||||
|
echo "❌ Accès root distant détecté"
|
||||||
|
read -rp "Supprimer ces accès ? (y/n) " choice
|
||||||
|
[[ $choice == "y" ]] && $MYSQL_CMD -e "DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1'); FLUSH PRIVILEGES;" && echo "✔️ Accès root externe supprimé"
|
||||||
|
else
|
||||||
|
echo "✔️ Aucun accès root distant"
|
||||||
|
fi
|
||||||
|
echo
|
||||||
|
}
|
||||||
|
|
||||||
|
check_test_db() {
|
||||||
|
echo "🧪 Vérification de la base 'test'..."
|
||||||
|
if $MYSQL_CMD -e "SHOW DATABASES LIKE 'test';" | grep -q "test"; then
|
||||||
|
echo "❌ Base 'test' présente"
|
||||||
|
read -rp "Supprimer ? (y/n) " choice
|
||||||
|
[[ $choice == "y" ]] && $MYSQL_CMD -e "DROP DATABASE test;" && echo "✔️ Base test supprimée"
|
||||||
|
else
|
||||||
|
echo "✔️ Base 'test' absente"
|
||||||
|
fi
|
||||||
|
echo
|
||||||
|
}
|
||||||
|
|
||||||
|
check_file_priv() {
|
||||||
|
echo "📂 Vérification des FILE PRIV..."
|
||||||
|
USERS=$($MYSQL_CMD -N -e "SELECT CONCAT(User, '@', Host) FROM mysql.user WHERE File_priv='Y';")
|
||||||
|
if [[ -n "$USERS" ]]; then
|
||||||
|
echo "❌ Utilisateurs avec FILE PRIV détectés:"
|
||||||
|
echo "$USERS"
|
||||||
|
read -rp "Retirer le droit FILE ? (y/n) " choice
|
||||||
|
if [[ $choice == "y" ]]; then
|
||||||
|
while read -r user; do
|
||||||
|
$MYSQL_CMD -e "REVOKE FILE ON *.* FROM '$user';"
|
||||||
|
done <<< "$USERS"
|
||||||
|
$MYSQL_CMD -e "FLUSH PRIVILEGES;"
|
||||||
|
echo "✔️ FILE révoqué"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "✔️ Aucun droit FILE abusif"
|
||||||
|
fi
|
||||||
|
echo
|
||||||
|
}
|
||||||
|
|
||||||
|
check_slow_log() {
|
||||||
|
echo "🐌 Vérification du slow query log..."
|
||||||
|
ACTIVE=$($MYSQL_CMD -N -e "SHOW VARIABLES LIKE 'slow_query_log';" | awk '{print $2}')
|
||||||
|
if [[ "$ACTIVE" != "ON" ]]; then
|
||||||
|
echo "⚠️ Slow query log désactivé"
|
||||||
|
read -rp "Activer dans la conf ? (y/n) " choice
|
||||||
|
if [[ $choice == "y" ]]; then
|
||||||
|
cat >> "$CONFIG_FILE" <<EOL
|
||||||
|
|
||||||
|
slow_query_log = 1
|
||||||
|
slow_query_log_file = /var/log/mysql/mariadb-slow.log
|
||||||
|
long_query_time = 2
|
||||||
|
EOL
|
||||||
|
touch /var/log/mysql/mariadb-slow.log
|
||||||
|
chown mysql:mysql /var/log/mysql/mariadb-slow.log
|
||||||
|
RESTART_REQUIRED=1
|
||||||
|
echo "✔️ Slow query log activé"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "✔️ Slow query log actif"
|
||||||
|
fi
|
||||||
|
echo
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "===> Démarrage de l'audit..."
|
||||||
|
echo
|
||||||
|
|
||||||
|
# Lancer les contrôles
|
||||||
|
check_permissions
|
||||||
|
check_storage_engines
|
||||||
|
check_bind
|
||||||
|
check_anonymous_users
|
||||||
|
check_remote_root
|
||||||
|
check_test_db
|
||||||
|
check_file_priv
|
||||||
|
check_slow_log
|
||||||
|
|
||||||
|
if [[ $RESTART_REQUIRED -eq 1 ]]; then
|
||||||
|
echo "♻️ Redémarrage de MariaDB requis"
|
||||||
|
systemctl restart mariadb
|
||||||
|
echo
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ $ISSUES_FOUND -eq 1 ]]; then
|
||||||
|
echo "⚠️ Audit terminé avec des recommandations ou actions effectuées."
|
||||||
|
else
|
||||||
|
echo "✅ Audit terminé - Aucun problème majeur détecté."
|
||||||
|
fi
|
||||||
157
scripts/server-mariadb/create_db.sh
Executable file
157
scripts/server-mariadb/create_db.sh
Executable file
@@ -0,0 +1,157 @@
|
|||||||
|
#!/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."
|
||||||
|
|
||||||
|
# Définir la variable MYSQL_CMD pour le reste du script
|
||||||
|
MYSQL_CMD="mysql --defaults-extra-file=$TEMP_CNF"
|
||||||
|
|
||||||
|
# N'oublie pas de prévoir un nettoyage à la fin :
|
||||||
|
trap 'rm -f "$TEMP_CNF"' EXIT
|
||||||
|
|
||||||
|
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"
|
||||||
112
scripts/server-mariadb/set_root_password.sh
Executable file
112
scripts/server-mariadb/set_root_password.sh
Executable file
@@ -0,0 +1,112 @@
|
|||||||
|
#!/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
|
||||||
|
|
||||||
|
# Variables
|
||||||
|
NEW_PASS=$(generate_token 20)
|
||||||
|
DB_SERVICE="mariadb" # Adapter si besoin
|
||||||
|
MYSQL_SOCK="/var/run/mysqld/mysqld.sock"
|
||||||
|
CNF_FILES=("/etc/mysql/debian.cnf" "/root/.my.cnf")
|
||||||
|
MYSQLD_SAFE_LOG="/tmp/mysqld_safe.log"
|
||||||
|
|
||||||
|
echo "[+] Nouveau mot de passe root généré."
|
||||||
|
|
||||||
|
# Arrêt du service MySQL/MariaDB
|
||||||
|
echo "[+] Arrêt du service $DB_SERVICE..."
|
||||||
|
systemctl stop "$DB_SERVICE"
|
||||||
|
|
||||||
|
echo "[+] Attente de l'arrêt complet du service..."
|
||||||
|
while systemctl is-active --quiet "$DB_SERVICE"; do
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
echo "[+] Service arrêté."
|
||||||
|
|
||||||
|
# Nettoyage des éventuels sockets ou PID bloquants
|
||||||
|
echo "[+] Nettoyage des sockets et PID..."
|
||||||
|
rm -f /var/run/mysqld/mysqld.pid /var/run/mysqld/mysqld.sock
|
||||||
|
|
||||||
|
# Démarrage en mode sans échec
|
||||||
|
echo "[+] Démarrage de MySQL en mode sans échec..."
|
||||||
|
mysqld_safe --skip-grant-tables --skip-networking > "$MYSQLD_SAFE_LOG" 2>&1 &
|
||||||
|
SAFE_PID=$!
|
||||||
|
|
||||||
|
# Attente que mysqld_safe soit vraiment prêt
|
||||||
|
echo "[+] Attente de la disponibilité de mysqld_safe..."
|
||||||
|
for i in {1..10}; do
|
||||||
|
if mysqladmin ping --socket="$MYSQL_SOCK" >/dev/null 2>&1; then
|
||||||
|
echo "[+] mysqld_safe est prêt."
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
|
||||||
|
if ! mysqladmin ping --socket="$MYSQL_SOCK" >/dev/null 2>&1; then
|
||||||
|
echo "[❌] Échec du démarrage de mysqld_safe. Voir $MYSQLD_SAFE_LOG"
|
||||||
|
kill -9 $SAFE_PID 2>/dev/null
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Réinitialisation du mot de passe root
|
||||||
|
echo "[+] Réinitialisation du mot de passe root..."
|
||||||
|
mysql --socket="$MYSQL_SOCK" <<EOF
|
||||||
|
FLUSH PRIVILEGES;
|
||||||
|
ALTER USER 'root'@'localhost' IDENTIFIED BY '$NEW_PASS';
|
||||||
|
FLUSH PRIVILEGES;
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Nettoyage complet du mode sans échec
|
||||||
|
echo "[+] Arrêt complet du mode sans échec et des processus MySQL/MariaDB..."
|
||||||
|
kill -9 $SAFE_PID
|
||||||
|
killall -9 mysqld_safe mariadbd mysqld || true
|
||||||
|
sleep 5
|
||||||
|
|
||||||
|
# Redémarrage du service
|
||||||
|
echo "[+] Redémarrage du service $DB_SERVICE..."
|
||||||
|
systemctl start "$DB_SERVICE"
|
||||||
|
|
||||||
|
# Vérification du bon démarrage
|
||||||
|
echo "[+] Attente du démarrage complet de MariaDB..."
|
||||||
|
for i in {1..10}; do
|
||||||
|
if systemctl is-active --quiet "$DB_SERVICE"; then
|
||||||
|
echo "[+] MariaDB est démarré."
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
|
||||||
|
if ! systemctl is-active --quiet "$DB_SERVICE"; then
|
||||||
|
echo "[❌] MariaDB ne démarre pas. Voir journalctl -xeu $DB_SERVICE"
|
||||||
|
systemctl status "$DB_SERVICE"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Test de connexion avec le nouveau mot de passe
|
||||||
|
echo "[+] Test de connexion réel avec le nouveau mot de passe root..."
|
||||||
|
if mysql -uroot -p"$NEW_PASS" -e "SELECT 'Connexion réussie' AS Status;" >/dev/null 2>&1; then
|
||||||
|
echo "[✔] Connexion root réussie."
|
||||||
|
|
||||||
|
# Mise à jour des fichiers .cnf si user = root
|
||||||
|
for file in "${CNF_FILES[@]}"; do
|
||||||
|
if [[ -f "$file" ]]; then
|
||||||
|
if grep -q "^\s*user\s*=\s*root" "$file"; then
|
||||||
|
echo "[+] Mise à jour du fichier $file (user=root détecté)."
|
||||||
|
sed -i -E "s/(password\s*=\s*).*/\1$NEW_PASS/" "$file"
|
||||||
|
else
|
||||||
|
echo "[!] Pas de user=root dans $file, aucune modification."
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "---------------------------------------------"
|
||||||
|
echo "[✔] Mot de passe root MySQL/MariaDB réinitialisé avec succès."
|
||||||
|
echo "[✔] Nouveau mot de passe root : $NEW_PASS"
|
||||||
|
echo "---------------------------------------------"
|
||||||
|
else
|
||||||
|
echo "[❌] Échec de la connexion root après redémarrage de MariaDB."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
164
scripts/server-mariadb/setup_mariadb.sh
Executable file
164
scripts/server-mariadb/setup_mariadb.sh
Executable 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 ==="
|
||||||
3
scripts/server-postgres/.list_files.txt
Normal file
3
scripts/server-postgres/.list_files.txt
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
create_pg_db.sh
|
||||||
|
create_pg_role.sh
|
||||||
|
setup-postgres.sh
|
||||||
52
scripts/server-postgres/create_pg_db.sh
Executable file
52
scripts/server-postgres/create_pg_db.sh
Executable file
@@ -0,0 +1,52 @@
|
|||||||
|
#!/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
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
echo "👉 Nom de la base de données à créer : "
|
||||||
|
read DB_NAME
|
||||||
|
|
||||||
|
echo "👉 Nom de l'utilisateur PostgreSQL propriétaire : "
|
||||||
|
read DB_USER
|
||||||
|
|
||||||
|
# Lecture du mot de passe en mode sécurisé
|
||||||
|
read -s -p "🔑 Mot de passe PostgreSQL de l'utilisateur 'postgres' : " DB_PASS
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Exporter le mot de passe temporairement
|
||||||
|
export PGPASSWORD="$DB_PASS"
|
||||||
|
|
||||||
|
echo "🔎 Vérification de l'existence de l'utilisateur PostgreSQL '$DB_USER'..."
|
||||||
|
USER_EXISTS=$(sudo -u postgres psql -tAc "SELECT 1 FROM pg_roles WHERE rolname='${DB_USER}'")
|
||||||
|
|
||||||
|
|
||||||
|
if [[ "$USER_EXISTS" != "1" ]]; then
|
||||||
|
echo "❌ L'utilisateur '$DB_USER' n'existe pas dans PostgreSQL."
|
||||||
|
unset PGPASSWORD
|
||||||
|
exit 2
|
||||||
|
else
|
||||||
|
echo "✅ L'utilisateur '$DB_USER' existe."
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "🔎 Vérification de l'existence de la base de données '$DB_NAME'..."
|
||||||
|
DB_EXISTS=$(sudo -u postgres psql -tAc "SELECT 1 FROM pg_database WHERE datname='${DB_NAME}'")
|
||||||
|
|
||||||
|
|
||||||
|
if [[ "$DB_EXISTS" == "1" ]]; then
|
||||||
|
echo "⚠️ La base de données '$DB_NAME' existe déjà."
|
||||||
|
else
|
||||||
|
echo "🛠 Création de la base de données '$DB_NAME' avec le propriétaire '$DB_USER'..."
|
||||||
|
sudo -u postgres createdb -O "$DB_USER" "$DB_NAME"
|
||||||
|
echo "✅ Base de données '$DB_NAME' créée avec succès."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Nettoyage de la variable d'environnement
|
||||||
|
unset PGPASSWORD
|
||||||
|
|
||||||
|
echo "🎉 Opération terminée."
|
||||||
73
scripts/server-postgres/create_pg_role.sh
Executable file
73
scripts/server-postgres/create_pg_role.sh
Executable file
@@ -0,0 +1,73 @@
|
|||||||
|
#!/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
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Demande interactive si le rôle n’est pas passé en paramètre
|
||||||
|
if [[ -n "$1" ]]; then
|
||||||
|
ROLE_NAME="$1"
|
||||||
|
else
|
||||||
|
read -p "👤 Entrez le nom du rôle PostgreSQL à créer : " ROLE_NAME
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -z "$ROLE_NAME" ]]; then
|
||||||
|
echo "❌ Le nom du rôle est obligatoire."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Demander le mot de passe de l'utilisateur 'postgres'
|
||||||
|
read -s -p "🔑 Entrez le mot de passe de l'utilisateur 'postgres' : " POSTGRES_PASSWORD
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Générer le mot de passe du rôle
|
||||||
|
echo "🔐 Génération d'un mot de passe fort pour le rôle '$ROLE_NAME'..."
|
||||||
|
ROLE_PASSWORD=$(generate_token 20)
|
||||||
|
|
||||||
|
# Générer un fichier SQL temporaire pour la vérification + création
|
||||||
|
SQL_FILE=$(mktemp)
|
||||||
|
|
||||||
|
cat <<EOF > "$SQL_FILE"
|
||||||
|
DO \$\$
|
||||||
|
BEGIN
|
||||||
|
IF NOT EXISTS (SELECT FROM pg_roles WHERE rolname = '${ROLE_NAME}') THEN
|
||||||
|
RAISE NOTICE '🛠 Création du rôle "${ROLE_NAME}"...';
|
||||||
|
CREATE ROLE ${ROLE_NAME} WITH LOGIN PASSWORD '${ROLE_PASSWORD}';
|
||||||
|
ELSE
|
||||||
|
RAISE NOTICE '⚠️ Le rôle "${ROLE_NAME}" existe déjà.';
|
||||||
|
END IF;
|
||||||
|
END
|
||||||
|
\$\$;
|
||||||
|
EOF
|
||||||
|
|
||||||
|
chmod 644 "$SQL_FILE"
|
||||||
|
|
||||||
|
# Une seule exécution de psql via sudo avec mot de passe PostgreSQL exporté
|
||||||
|
echo "🔎 Exécution des commandes SQL avec sudo..."
|
||||||
|
sudo -u postgres bash -c "PGPASSWORD='${POSTGRES_PASSWORD}' psql -v ON_ERROR_STOP=1 -f '${SQL_FILE}'"
|
||||||
|
|
||||||
|
rm -f "$SQL_FILE"
|
||||||
|
|
||||||
|
# Affichage des identifiants si création
|
||||||
|
echo ""
|
||||||
|
echo "-------------------------------------------"
|
||||||
|
echo " Nom du rôle : ${ROLE_NAME}"
|
||||||
|
echo " Mot de passe : ${ROLE_PASSWORD}"
|
||||||
|
echo "-------------------------------------------"
|
||||||
|
|
||||||
|
# Proposer d’enregistrer dans ~/.pgpass
|
||||||
|
read -p "💾 Voulez-vous enregistrer ces identifiants dans ~/.pgpass ? (y/n) " SAVE_PASS
|
||||||
|
if [[ "$SAVE_PASS" =~ ^[Yy]$ ]]; then
|
||||||
|
PGPASS_FILE="${HOME}/.pgpass"
|
||||||
|
echo "*:*:*:${ROLE_NAME}:${ROLE_PASSWORD}" >> "$PGPASS_FILE"
|
||||||
|
chmod 600 "$PGPASS_FILE"
|
||||||
|
echo "✅ Identifiants sauvegardés dans $PGPASS_FILE"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "⚠️ Pensez à sauvegarder ces informations si vous ne les enregistrez pas."
|
||||||
|
echo "🎉 Opération terminée."
|
||||||
77
scripts/server-postgres/setup-postgres.sh
Executable file
77
scripts/server-postgres/setup-postgres.sh
Executable file
@@ -0,0 +1,77 @@
|
|||||||
|
#!/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
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
echo "📦 Mise à jour des paquets..."
|
||||||
|
apt update -y
|
||||||
|
|
||||||
|
echo "📚 Installation de postgresql-common (pour script de dépôt officiel)..."
|
||||||
|
apt install -y postgresql-common
|
||||||
|
|
||||||
|
echo "➕ Ajout automatique du dépôt officiel PostgreSQL (via pgdg script)..."
|
||||||
|
/usr/share/postgresql-common/pgdg/apt.postgresql.org.sh -y
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "🧩 Versions disponibles dans le dépôt :"
|
||||||
|
AVAILABLE_VERSIONS=$(apt-cache search "^postgresql-[0-9][0-9]$" | awk '{print $1}' | cut -d'-' -f2 | sort -nr)
|
||||||
|
echo "$AVAILABLE_VERSIONS"
|
||||||
|
|
||||||
|
read -p "➡️ Entrez la version PostgreSQL à installer (ex: 17) : " PG_VERSION
|
||||||
|
|
||||||
|
if ! echo "$AVAILABLE_VERSIONS" | grep -q "^${PG_VERSION}$"; then
|
||||||
|
echo "❌ Version PostgreSQL invalide ou non disponible : ${PG_VERSION}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "📦 Installation de PostgreSQL $PG_VERSION..."
|
||||||
|
apt update -y
|
||||||
|
apt install -y "postgresql-${PG_VERSION}"
|
||||||
|
|
||||||
|
echo "🚀 Activation et démarrage du service PostgreSQL..."
|
||||||
|
systemctl enable postgresql
|
||||||
|
systemctl start postgresql
|
||||||
|
|
||||||
|
echo "⏳ Attente du démarrage du service PostgreSQL..."
|
||||||
|
sleep 3
|
||||||
|
|
||||||
|
echo "✅ Vérification du service..."
|
||||||
|
if ! systemctl is-active --quiet postgresql; then
|
||||||
|
echo "❌ Le service PostgreSQL ne fonctionne pas correctement."
|
||||||
|
journalctl -xeu postgresql --no-pager | tail -n 20
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "🧪 Test de connexion à PostgreSQL..."
|
||||||
|
if ! sudo -u postgres psql -c '\q' 2>/dev/null; then
|
||||||
|
echo "❌ Échec de la connexion à PostgreSQL. Vérifiez que le socket est disponible."
|
||||||
|
echo " Astuce : systemctl status postgresql"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "🔐 Génération d'un mot de passe fort pour l'utilisateur postgres..."
|
||||||
|
POSTGRES_PASSWORD=$(generate_token 20)
|
||||||
|
|
||||||
|
echo "🔧 Configuration du mot de passe de l'utilisateur postgres..."
|
||||||
|
sudo -u postgres psql -c "ALTER USER postgres WITH PASSWORD '${POSTGRES_PASSWORD}';"
|
||||||
|
|
||||||
|
echo "🔧 Configuration de l'accès local en md5..."
|
||||||
|
PG_HBA="/etc/postgresql/${PG_VERSION}/main/pg_hba.conf"
|
||||||
|
sed -i "s/^\(local\s\+all\s\+postgres\s\+\)peer/\1md5/" "$PG_HBA"
|
||||||
|
|
||||||
|
echo "♻️ Redémarrage de PostgreSQL pour appliquer les changements..."
|
||||||
|
systemctl restart postgresql
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "✅ Installation de PostgreSQL ${PG_VERSION} terminée."
|
||||||
|
echo "-------------------------------------------"
|
||||||
|
echo " Mot de passe de l'utilisateur postgres :"
|
||||||
|
echo " ${POSTGRES_PASSWORD}"
|
||||||
|
echo "-------------------------------------------"
|
||||||
|
echo " Pensez à le sauvegarder en lieu sûr."
|
||||||
Reference in New Issue
Block a user