Compare commits

..

40 Commits

Author SHA1 Message Date
48c26f9f84 Actualiser scripts/server-postgres/create_pg_role.sh
passage par un script temporaire
2025-05-19 05:22:16 +00:00
70facd85f3 sql sécurisé - pgpassword 2025-04-07 07:29:46 +02:00
5eda1c002e autoconfirmation pour iinstall curl 2025-04-07 07:07:19 +02:00
24a45fecf3 respect du standard pour l'installation de postgres 2025-04-06 19:38:21 +02:00
1b758b6161 définir la timezone 2025-04-05 06:23:52 +02:00
b75afa7df8 eviter de deamnder plusieurs fois le mdp 2025-04-04 07:12:37 +02:00
58b6a44819 amélioration de la créaton des db et role 2025-04-04 00:30:51 +02:00
8e882c7756 update script postgres 2025-03-31 22:32:48 +02:00
b8808e4219 add lychee_install script 2025-03-30 23:52:47 +02:00
5375a48bfd amélioration 2025-03-24 13:40:04 +01:00
4936d3c8e7 améiloration de la gestion du mot d epasse 2025-03-24 13:34:05 +01:00
3d64c538af chmod +x 2025-03-24 12:24:53 +01:00
d9c2e20402 create script create_role for pg 2025-03-24 12:23:51 +01:00
12cbbd0a6a add create_db for pg 2025-03-24 12:21:19 +01:00
bd74da92ff ajout script pour postgres 2025-03-24 12:16:58 +01:00
5e663d8925 listing update 2025-03-24 00:43:14 +01:00
2f0831aa09 configuraiton des modules opcache et apcu 2025-03-23 21:55:54 +01:00
cad29cdc71 demande si on créé la page info.php 2025-03-23 21:49:17 +01:00
eabf6c042e ajout de sqlite3 2025-03-23 21:35:15 +01:00
ca73246a47 correction 2025-03-23 21:29:09 +01:00
1b7173b824 suppression du timer 2025-03-23 17:38:31 +01:00
bc57514c0d create scripts 'mdns' and 'set_root_password'
edit for secure create_db.sh
2025-03-23 17:27:49 +01:00
9b29b85fb2 scripts pour mysql 2025-03-22 11:52:23 +01:00
4ee5bcc04f erreur sur le current user 2025-03-22 08:10:19 +01:00
164c69f580 correction pour utilisation avec sudo 2025-03-22 08:08:19 +01:00
00c1c9562b syntaxt error "sudo" 2025-03-22 08:04:30 +01:00
a8cd67f38c add script set-persmissions-www dans server-httpd 2025-03-22 07:55:04 +01:00
285e332a9f ajout 2025-03-22 00:19:53 +01:00
0d46cf7752 suppression de systemd-resolved 2025-03-20 08:07:55 +01:00
a3ecc212dd ajout d'une configuration pour faire du NAT entre WAN et LAN 2025-03-20 08:06:55 +01:00
506dfb1086 choix de l'interface et de l'interface IP 2025-03-20 07:27:41 +01:00
f22cf0bff7 demander sur quelle IP le DHCP va porter 2025-03-20 06:58:33 +01:00
917f3a68bb correciton de l récupération des IP 2025-03-20 01:11:04 +01:00
579631df00 amélioration de la découverte du nom de domaine. amelioration de l'efficacité de la recherche du domaine 2025-03-14 13:17:48 +01:00
680b9a2af9 amélioration de l'interacetion et de la proposition de recherhe 2025-03-14 13:14:54 +01:00
bf8b686477 précision sur l'utilisation de gti 2025-03-14 08:42:53 +01:00
86583798f5 détail dans l'installation 2025-03-14 08:35:01 +01:00
4c1ca83681 correction syntaxique 2025-03-14 08:28:22 +01:00
cdd5b93432 update licence 2025-03-14 08:18:25 +01:00
400b22d821 suprresion d'un script de correction 2025-03-14 08:14:08 +01:00
37 changed files with 1738 additions and 284 deletions

View File

@@ -1,9 +0,0 @@
MIT License
Copyright (c) 2024 Cédrix
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

View File

@@ -20,7 +20,7 @@ Les contributions sont les bienvenues ! Si vous avez des suggestions, des correc
6. **Pousser votre branche** : `git push origin ma-nouvelle-branche` 6. **Pousser votre branche** : `git push origin ma-nouvelle-branche`
7. **Créer une Pull Request** 7. **Créer une Pull Request**
Pour plus de détails, veuillez lire le fichier [CONTRIBUTING.md](contribute.md). Pour plus de détails, veuillez lire le fichier [CONTRIBUTING.md](CONTRIBUTING.md).
## Code de Conduite ## Code de Conduite
@@ -28,7 +28,7 @@ Pour garantir un environnement ouvert et accueillant, nous avons adopté un code
## Licence ## Licence
Ce projet est sous licence MIT. Voir le fichier [LICENSE](LICENSE) pour plus de détails. Voir le fichier [LICENCE](LICENCE.md) et [LICENCE en Français](LICENCE_FR.md) pour plus de détails.
## Remerciements ## Remerciements

View File

@@ -1,49 +0,0 @@
# Contribuer au Projet
Merci de votre intérêt pour contribuer à ce projet ! Vos contributions sont essentielles pour améliorer ce dépôt de notes techniques. Voici quelques lignes directrices pour vous aider à démarrer.
## Comment Contribuer
1. **Fork le dépôt** : Cliquez sur le bouton "Fork" en haut à droite de la page pour créer une copie de ce dépôt dans votre compte Git (GitHub, GitLab, Gitea ...).
2. **Cloner votre fork** : Clonez le dépôt forké sur votre machine locale.
```bash
git clone https://xxxx/votre-utilisateur/votre-repo.git
```
3. **Créer une branche** : Créez une nouvelle branche pour votre fonctionnalité ou correction.
```bash
git checkout -b ma-nouvelle-branche
```
4. **Faire des modifications** : Apportez vos modifications ou ajoutez de nouvelles notes techniques dans la structure de dossiers appropriée.
5. **Commits** : Faites des commits de vos modifications avec des messages clairs et concis.
```bash
git add .
git commit -m "Ajouter une nouvelle note sur [sujet]"
```
6. **Pousser votre branche** : Poussez votre branche vers votre dépôt forké.
```bash
git push origin ma-nouvelle-branche
```
7. **Créer une Pull Request** : Allez sur la page de votre dépôt forké et cliquez sur "New Pull Request". Décrivez vos modifications dans la description de la Pull Request.
## Lignes Directrices pour les Contributions
- **Clarté et précision** : Assurez-vous que vos notes sont claires, précises et faciles à suivre.
- **Formatage** : Utilisez le format Markdown pour rédiger vos notes. Utilisez des titres, des sous-titres, des listes et du code formaté pour une meilleure lisibilité.
- **Consistance** : Suivez le même style et les mêmes conventions que les autres notes du dépôt.
- **Licences et droits d'auteur** : Assurez-vous que votre contribution n'enfreint aucun droit d'auteur. Mentionnez les sources si vous vous basez sur des travaux existants.
## Suggestions et Discussions
Si vous avez des idées, des suggestions ou des questions, n'hésitez pas à ouvrir une issue. Nous encourageons les discussions et le brainstorming pour améliorer ce projet.
## Code de Conduite
En contribuant à ce projet, vous acceptez de respecter notre [Code de Conduite](code_of_conduct.md). Veuillez lire ce document pour comprendre les comportements que nous attendons et ceux que nous n'acceptons pas.
Merci de votre contribution !

View File

@@ -1,4 +1,7 @@
all_inclusive
common common
server-dhcp server-dhcp
server-httpd server-httpd
server-mail server-mail
server-mariadb
server-postgres

View File

@@ -1,19 +0,0 @@
#!/bin/bash
# Basé sur un travail de Cédric Abonnel / Cédrix sous licence CC BY-NC 4.0
LICENSE="Basé sur un travail de Cédric Abonnel / Cédrix sous licence CC BY-NC 4.0"
# Recherche récursive de tous les fichiers contenant un shebang #!/bin/bash
find . -type f -exec grep -l "^#!/bin/bash" {} \; | while read -r file; do
echo "Traitement du fichier : $file"
# Vérifie si la deuxième et troisième ligne contiennent une mention de licence
sed -i.bak -e '2,3d' "$file"
# Insère la nouvelle licence après le shebang
sed -i "2i # $LICENSE" "$file"
echo "Licence mise à jour dans : $file"
done
echo "Mise à jour terminée."

View File

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

View File

@@ -16,9 +16,9 @@ Consulter le document d'[installation](INSTALL.md).
## 🤝 Contribution ## 🤝 Contribution
Vous pouvez ajouter de nouveaux scripts en respectant la structure existante et en documentant leur fonctionnement. Vous pouvez ajouter de nouveaux scripts en respectant la structure existante et en documentant leur fonctionnement.
Consulter le document de [contribution](CONTRIBUTING.md) pour plus d'informations. Consulter le document de [contribution](../CONTRIBUTING.md) pour plus d'informations.
## 📜 Licence ## 📜 Licence
Ce projet est sous licence [MIT](LICENSE). 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).

View File

@@ -0,0 +1 @@
lychee_install.sh

View 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 à linterface web pour finaliser la configuration : http://${IP}"

View File

@@ -1,2 +1,3 @@
common_utils.sh common_utils.sh
setup_debian.sh setup_debian.sh
setup_mdns.sh

View File

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

View File

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

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

View File

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

View File

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

View File

@@ -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>"
# 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
# 2⃣ Test mDNS (Multicast DNS / Avahi)
if command_exists avahi-resolve; then
HOSTNAME_MDNS=$(avahi-resolve -a "$IP" 2>/dev/null | awk '{print $2}')
if [ -n "$HOSTNAME_MDNS" ]; then
echo "✅ mDNS (Avahi): $HOSTNAME_MDNS"
exit 0
fi
else
echo "⚠ mDNS non disponible (avahi-resolve absent)"
fi
# 3⃣ Vérification du cache ARP
if command_exists arp; then
HOSTNAME_ARP=$(arp -a | grep "$IP" | awk '{print $1}')
if [ -n "$HOSTNAME_ARP" ]; then
echo "✅ ARP: $HOSTNAME_ARP"
exit 0
fi
else
echo "⚠ ARP non disponible"
fi
# 4⃣ Vérification via NetBIOS (Windows/Samba)
if command_exists nmblookup; then
HOSTNAME_NETBIOS=$(nmblookup -A "$IP" 2>/dev/null | grep -m1 '<00>' | awk '{print $1}')
if [ -n "$HOSTNAME_NETBIOS" ]; then
echo "✅ NetBIOS: $HOSTNAME_NETBIOS"
exit 0
fi
else
echo "⚠ NetBIOS non disponible (nmblookup absent)"
fi
# 5⃣ Scan réseau avec Nmap pour identifier l'hôte
if command_exists nmap; then
HOSTNAME_NMAP=$(nmap --dns-servers "$DNS_SERVER" -sP "$IP" 2>/dev/null | grep "Nmap scan report" | awk '{print $5}')
if [ -n "$HOSTNAME_NMAP" ]; then
echo "✅ Nmap: $HOSTNAME_NMAP"
exit 0
fi
else
echo "⚠ Nmap non disponible"
fi
echo "❌ Aucune correspondance trouvée."
exit 1 exit 1
fi
SEARCH_TERM="$1"
# Détection du nom de domaine
if [[ -f /etc/resolv.conf ]]; then
DOMAIN=$(awk '/^search / {print $2; exit} /^domain / {print $2; exit}' /etc/resolv.conf)
fi
# Alternative si resolv.conf n'existe pas ou est vide
if [[ -z "$DOMAIN" ]]; then
DOMAIN=$(hostname --domain 2>/dev/null) # Essayer avec hostname
if [[ -z "$DOMAIN" ]]; then
DOMAIN=$(nmcli -t -f IP4.DOMAIN dev show | head -n 1) # Essayer avec nmcli
fi
fi
# Vérifier qu'on a bien trouvé un domaine
if [[ -z "$DOMAIN" ]]; then
echo "Erreur: Impossible de détecter le nom de domaine."
exit 1
fi
# Si l'entrée ne contient pas un point, on ajoute le domaine détecté
if [[ ! "$SEARCH_TERM" =~ \. ]]; then
SEARCH_TERM="$SEARCH_TERM.$DOMAIN"
fi
# Vérification si l'entrée est une adresse IP
if [[ "$SEARCH_TERM" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
RESULTS=$(grep -E "/$SEARCH_TERM\$" "$FILE")
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

View File

@@ -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 while (( CURRENT_IP_INT <= END_INT )); do
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 fi
echo "✅ Première IP disponible : $NEXT_IP" (( CURRENT_IP_INT++ ))
exit 0 done
echo "❌ Plus aucune IP disponible dans la plage définie."
exit 1

View File

@@ -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 else
echo "Erreur : L'adresse IP $IP_SERVEUR n'est pas dans un réseau privé." OPTIONS+=("$IFACE_CLEAN (Pas d'IP)")
exit 1 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
read -rp "Aucune IP détectée sur $INTERFACE. Veuillez entrer une IP à utiliser : " IP_SAISIE
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"

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

View File

@@ -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
View 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
View File

View 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}"

View 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
View File

View File

@@ -0,0 +1,4 @@
check_mysql_secure.sh
create_db.sh
set_root_password.sh
setup_mariadb.sh

View 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

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

View 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

View File

@@ -0,0 +1,164 @@
#!/bin/bash
# Basé sur un travail de Cédric Abonnel / Cédrix sous licence CC BY-NC 4.0
# Importer les fonctions communes
source "$(dirname "$0")/../common/common_utils.sh"
# Vérifier si le script est exécuté en root
check_root
# Mise à jour du système
update_system
PASS_FILE=~/mariadb_root_password.txt
DEBIAN_CNF=/etc/mysql/debian.cnf
MARIADB_CNF=/etc/mysql/mariadb.conf.d/50-server.cnf
echo "=== Installation de MariaDB ==="
apt install -y mariadb-server mariadb-client
echo "=== Activation et démarrage de MariaDB ==="
systemctl enable mariadb
systemctl start mariadb
echo "=== Configuration du bind-address pour bloquer les connexions externes ==="
if grep -q "^bind-address" $MARIADB_CNF; then
sed -i 's/^bind-address.*/bind-address = 127.0.0.1/' $MARIADB_CNF
else
echo "bind-address = 127.0.0.1" >> $MARIADB_CNF
fi
echo "=== Activation du log binaire et purge automatique des anciens logs ==="
if ! grep -q "^log-bin" "$MARIADB_CNF"; then
cat >> "$MARIADB_CNF" <<EOL
# Journalisation binaire activée pour la réplication et la sécurité
log-bin = /var/log/mysql/mariadb-bin
expire_logs_days = 7
EOL
fi
echo "=== Vérification et création du répertoire pour les binlogs ==="
mkdir -p /var/log/mysql
chown mysql:mysql /var/log/mysql
chmod 750 /var/log/mysql
systemctl restart mariadb
echo "=== Gestion du mot de passe administrateur ==="
# Fonction de recherche dans un fichier cnf ou conf
get_password_from_cnf() {
local file=$1
if [[ -f "$file" ]]; then
PASSWORD=$(grep -m1 'password\s*=' "$file" | sed -E 's/.*password\s*=\s*//;s/"//g')
if [[ -n "$PASSWORD" ]]; then
echo "$PASSWORD"
return 0
fi
fi
return 1
}
# Générer ou récupérer le mot de passe root MariaDB
if [[ -f "$PASS_FILE" ]]; then
DB_ROOT_PASSWORD=$(grep 'root password:' "$PASS_FILE" | awk '{print $3}')
echo "Mot de passe root existant récupéré."
else
# Tentative de récupération depuis /etc/mysql/debian.cnf
DB_ROOT_PASSWORD=$(get_password_from_cnf "/etc/mysql/debian.cnf")
if [[ -n "$DB_ROOT_PASSWORD" ]]; then
echo "Mot de passe root récupéré depuis /etc/mysql/debian.cnf"
else
# Tentative dans d'autres fichiers .cnf ou .conf connus
for file in /etc/mysql/*.cnf /etc/mysql/conf.d/*.cnf /etc/my.cnf /etc/my.cnf.d/*.cnf; do
DB_ROOT_PASSWORD=$(get_password_from_cnf "$file")
if [[ -n "$DB_ROOT_PASSWORD" ]]; then
echo "Mot de passe root trouvé dans $file"
break
fi
done
fi
# Si toujours pas de mot de passe trouvé, demander ou générer
if [[ -z "$DB_ROOT_PASSWORD" ]]; then
echo -n "Entrez un mot de passe root pour MariaDB ou le mot de passe existant (laisser vide pour générer automatiquement) : "
read -r -s USER_PASSWORD
echo
if [[ -n "$USER_PASSWORD" ]]; then
DB_ROOT_PASSWORD="$USER_PASSWORD"
echo "Mot de passe root défini par l'utilisateur."
else
DB_ROOT_PASSWORD=$(generate_token 64)
echo "Mot de passe root généré automatiquement."
echo "root password: $DB_ROOT_PASSWORD" > "$PASS_FILE"
chmod 600 "$PASS_FILE"
echo "Mot de passe root sauvegardé dans $PASS_FILE."
fi
fi
fi
echo "=== Sécurisation de MariaDB ==="
mysql -u root -p"$DB_ROOT_PASSWORD" <<EOF
-- Définir le mot de passe root correctement
ALTER USER 'root'@'localhost' IDENTIFIED BY '$DB_ROOT_PASSWORD';
-- Supprimer les utilisateurs anonymes
DELETE FROM mysql.user WHERE User='';
-- Supprimer tout accès root externe ou d'autres users externes
DELETE FROM mysql.user WHERE Host NOT IN ('localhost', '127.0.0.1', '::1');
-- Supprimer la base de test si elle existe
DROP DATABASE IF EXISTS test;
-- Supprimer les droits sur la base de test
DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';
-- Recharger les privilèges
FLUSH PRIVILEGES;
EOF
echo "=== Mise à jour de /etc/mysql/debian.cnf pour les scripts de maintenance ==="
cat > /etc/mysql/debian.cnf <<EOL
[client]
host = localhost
user = root
password = $DB_ROOT_PASSWORD
socket = /run/mysqld/mysqld.sock
[mysql_upgrade]
host = localhost
user = root
password = $DB_ROOT_PASSWORD
socket = /run/mysqld/mysqld.sock
EOL
chmod 600 /etc/mysql/debian.cnf
echo "=== Vérification de la présence de PHP ==="
if command -v php >/dev/null 2>&1; then
PHP_VERSION=$(php -r 'echo PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')
echo "PHP version détectée : $PHP_VERSION"
echo "=== Installation de php-mysql pour PHP $PHP_VERSION ==="
apt install -y php${PHP_VERSION}-mysql
echo "=== Redémarrage d'Apache si installé ==="
if systemctl list-units --type=service | grep -q apache2; then
systemctl restart apache2
echo "Apache redémarré"
fi
echo "=== Redémarrage de PHP-FPM si installé ==="
if systemctl list-units --type=service | grep -q php${PHP_VERSION}-fpm; then
systemctl restart php${PHP_VERSION}-fpm
echo "PHP-FPM redémarré"
fi
else
echo "PHP n'est pas installé. Installation de MariaDB terminée sans liaison PHP."
fi
echo "=== Fin de l'installation et sécurisation de MariaDB ==="

View File

@@ -0,0 +1,3 @@
create_pg_db.sh
create_pg_role.sh
setup-postgres.sh

View 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."

View 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 nest 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 denregistrer 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."

View 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."