Scripts pour gestion d'un serveur mail
This commit is contained in:
20
notes/server-mail/README.md
Normal file
20
notes/server-mail/README.md
Normal file
@@ -0,0 +1,20 @@
|
||||
|
||||
|
||||
|
||||
---
|
||||
|
||||
# **📌 Résumé des Scripts**
|
||||
| **Script** | **Action** | **Exemple d'utilisation** |
|
||||
|----------------------|-----------------------------------------------|--------------------------|
|
||||
| `install_mailserver.sh` | Installer Postfix/Dovecot + ajouter un domaine | `bash install_mailserver.sh domain.top` |
|
||||
| `add_domain.sh` | Ajouter un domaine | `bash add_domain.sh domain2.top` |
|
||||
| `add_user.sh` | Ajouter un utilisateur | `bash add_user.sh user@domain.top "password"` |
|
||||
| `add_alias.sh` | Ajouter un alias | `bash add_alias.sh contact@domain2.top user@domain.top` |
|
||||
| `add_forward.sh` | Ajouter une redirection | `bash add_forward.sh contact@domain.top user@domain2.top` |
|
||||
| `list_domains.sh` | Lister les domaines | `bash list_domains.sh` |
|
||||
| `list_users.sh` | Lister les utilisateurs | `bash list_users.sh` |
|
||||
| `list_aliases.sh` | Lister les alias/redirections | `bash list_aliases.sh` |
|
||||
| `del_user.sh` | Supprimer un utilisateur | `bash del_user.sh user@domain.top` |
|
||||
| `del_alias.sh` | Supprimer un alias | `bash del_alias.sh contact@domain2.top` |
|
||||
| `del_domain.sh` | Supprimer un domaine | `bash del_domain.sh domain2.top` |
|
||||
|
||||
18
notes/server-mail/scripts/add_alias.sh
Normal file
18
notes/server-mail/scripts/add_alias.sh
Normal file
@@ -0,0 +1,18 @@
|
||||
#!/bin/bash
|
||||
|
||||
POSTFIX_ALIASES="/etc/postfix/virtual_aliases"
|
||||
|
||||
if [[ -z "$1" || -z "$2" ]]; then
|
||||
echo "Usage: $0 <alias> <cible>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
ALIAS=$1
|
||||
TARGET=$2
|
||||
|
||||
echo "$ALIAS $TARGET" >> $POSTFIX_ALIASES
|
||||
|
||||
postmap $POSTFIX_ALIASES
|
||||
systemctl reload postfix
|
||||
|
||||
echo "Alias $ALIAS ajouté vers $TARGET 🎉"
|
||||
53
notes/server-mail/scripts/add_domain.sh
Normal file
53
notes/server-mail/scripts/add_domain.sh
Normal file
@@ -0,0 +1,53 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Définition des variables
|
||||
MAILDIR="/var/mail/vhosts"
|
||||
POSTFIX_CONFIG="/etc/postfix/virtual_domains"
|
||||
USER_VMAIL="vmail"
|
||||
GROUP_VMAIL="vmail"
|
||||
|
||||
# Vérifier si le script est exécuté en root
|
||||
if [[ $EUID -ne 0 ]]; then
|
||||
echo "❌ Ce script doit être exécuté en tant que root."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Vérifier si un domaine a été passé en paramètre
|
||||
if [[ -z "$1" ]]; then
|
||||
echo "Usage: $0 <domaine>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
DOMAIN=$1
|
||||
|
||||
# Vérifier si le domaine est déjà enregistré
|
||||
if grep -q "^$DOMAIN$" "$POSTFIX_CONFIG"; then
|
||||
echo "⚠️ Le domaine $DOMAIN est déjà configuré dans Postfix."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "🔹 Ajout du domaine : $DOMAIN"
|
||||
echo "$DOMAIN" >> "$POSTFIX_CONFIG"
|
||||
|
||||
# Création du répertoire pour le domaine
|
||||
DOMAIN_DIR="$MAILDIR/$DOMAIN"
|
||||
if [[ ! -d "$DOMAIN_DIR" ]]; then
|
||||
echo "📁 Création du dossier mail pour $DOMAIN"
|
||||
mkdir -p "$DOMAIN_DIR"
|
||||
chown -R "$USER_VMAIL:$GROUP_VMAIL" "$DOMAIN_DIR"
|
||||
chmod -R 770 "$DOMAIN_DIR"
|
||||
else
|
||||
echo "⚠️ Le dossier $DOMAIN_DIR existe déjà."
|
||||
fi
|
||||
|
||||
# Recharger Postfix pour appliquer les changements
|
||||
echo "🔄 Rechargement de Postfix..."
|
||||
systemctl reload postfix
|
||||
|
||||
# Vérification de la bonne prise en compte
|
||||
if systemctl is-active --quiet postfix; then
|
||||
echo "✅ Domaine $DOMAIN ajouté avec succès et Postfix rechargé 🎉"
|
||||
else
|
||||
echo "❌ Erreur : Postfix ne fonctionne pas correctement après la mise à jour."
|
||||
exit 1
|
||||
fi
|
||||
21
notes/server-mail/scripts/add_forward.sh
Normal file
21
notes/server-mail/scripts/add_forward.sh
Normal file
@@ -0,0 +1,21 @@
|
||||
#!/bin/bash
|
||||
|
||||
POSTFIX_ALIASES="/etc/postfix/virtual_aliases"
|
||||
|
||||
if [[ -z "$1" || -z "$2" ]]; then
|
||||
echo "Usage: $0 <adresse_source> <adresse_cible1> [adresse_cible2] ..."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
SOURCE=$1
|
||||
shift # Supprime le premier argument (l'adresse source)
|
||||
TARGETS="$@"
|
||||
|
||||
echo "Ajout de la redirection de $SOURCE vers $TARGETS"
|
||||
|
||||
echo "$SOURCE $TARGETS" >> $POSTFIX_ALIASES
|
||||
|
||||
postmap $POSTFIX_ALIASES
|
||||
systemctl reload postfix
|
||||
|
||||
echo "Redirection de $SOURCE vers $TARGETS ajoutée"
|
||||
29
notes/server-mail/scripts/add_user.sh
Normal file
29
notes/server-mail/scripts/add_user.sh
Normal file
@@ -0,0 +1,29 @@
|
||||
#!/bin/bash
|
||||
|
||||
DOVECOT_USERS="/etc/dovecot/users"
|
||||
MAILDIR="/var/mail/vhosts"
|
||||
|
||||
if [[ -z "$1" ]]; then
|
||||
echo "Usage: $0 <adresse email>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
EMAIL=$1
|
||||
DOMAIN=$(echo $EMAIL | cut -d@ -f2)
|
||||
USER=$(echo $EMAIL | cut -d@ -f1)
|
||||
|
||||
# Vérifier si l'utilisateur existe déjà
|
||||
if grep -q "^$EMAIL:" "$DOVECOT_USERS"; then
|
||||
echo "Erreur : L'utilisateur $EMAIL existe déjà."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Ajouter l'utilisateur sans mot de passe
|
||||
echo "$EMAIL:" >> "$DOVECOT_USERS"
|
||||
|
||||
# Création du répertoire de messagerie
|
||||
mkdir -p "$MAILDIR/$DOMAIN/$USER"
|
||||
chown -R vmail:vmail "$MAILDIR/$DOMAIN/$USER"
|
||||
chmod -R 770 "$MAILDIR/$DOMAIN/$USER"
|
||||
|
||||
echo "Utilisateur $EMAIL créé avec succès. Utilisez 'generate_password.sh $EMAIL' pour lui assigner un mot de passe."
|
||||
20
notes/server-mail/scripts/del_alias.sh
Normal file
20
notes/server-mail/scripts/del_alias.sh
Normal file
@@ -0,0 +1,20 @@
|
||||
#!/bin/bash
|
||||
|
||||
POSTFIX_ALIASES="/etc/postfix/virtual_aliases"
|
||||
|
||||
if [[ -z "$1" ]]; then
|
||||
echo "Usage: $0 <alias>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
ALIAS=$1
|
||||
|
||||
echo "Suppression de l'alias : $ALIAS"
|
||||
|
||||
# Supprimer l'entrée de l'alias
|
||||
sed -i "/^$ALIAS /d" $POSTFIX_ALIASES
|
||||
|
||||
postmap $POSTFIX_ALIASES
|
||||
systemctl reload postfix
|
||||
|
||||
echo "Alias $ALIAS supprimé"
|
||||
23
notes/server-mail/scripts/del_domain.sh
Normal file
23
notes/server-mail/scripts/del_domain.sh
Normal file
@@ -0,0 +1,23 @@
|
||||
#!/bin/bash
|
||||
|
||||
MAILDIR="/var/mail/vhosts"
|
||||
POSTFIX_CONFIG="/etc/postfix/virtual_domains"
|
||||
|
||||
if [[ -z "$1" ]]; then
|
||||
echo "Usage: $0 <domaine>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
DOMAIN=$1
|
||||
|
||||
echo "Suppression du domaine : $DOMAIN"
|
||||
|
||||
# Supprimer le domaine du fichier de Postfix
|
||||
sed -i "/^$DOMAIN$/d" $POSTFIX_CONFIG
|
||||
|
||||
# Supprimer les boîtes mail associées
|
||||
rm -rf $MAILDIR/$DOMAIN
|
||||
|
||||
systemctl reload postfix
|
||||
|
||||
echo "Domaine $DOMAIN supprimé"
|
||||
23
notes/server-mail/scripts/del_user.sh
Normal file
23
notes/server-mail/scripts/del_user.sh
Normal file
@@ -0,0 +1,23 @@
|
||||
#!/bin/bash
|
||||
|
||||
DOVECOT_USERS="/etc/dovecot/users"
|
||||
MAILDIR="/var/mail/vhosts"
|
||||
|
||||
if [[ -z "$1" ]]; then
|
||||
echo "Usage: $0 <adresse mail>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
EMAIL=$1
|
||||
DOMAIN=$(echo $EMAIL | cut -d@ -f2)
|
||||
USER=$(echo $EMAIL | cut -d@ -f1)
|
||||
|
||||
echo "Suppression de l'utilisateur : $EMAIL"
|
||||
|
||||
# Supprimer l'entrée du fichier des utilisateurs
|
||||
sed -i "/^$EMAIL:/d" $DOVECOT_USERS
|
||||
|
||||
# Supprimer le répertoire de la boîte mail
|
||||
rm -rf $MAILDIR/$DOMAIN/$USER
|
||||
|
||||
echo "Utilisateur $EMAIL supprimé"
|
||||
83
notes/server-mail/scripts/generate_password.sh
Normal file
83
notes/server-mail/scripts/generate_password.sh
Normal file
@@ -0,0 +1,83 @@
|
||||
# Récupérer le nom d’hôte complet (FQDN)
|
||||
SERVER_NAME=$(hostname -f) # Privilégier hostname -f
|
||||
|
||||
# Vérifier si le FQDN est vide (cas rare)
|
||||
if [[ -z "$SERVER_NAME" ]]; then
|
||||
SERVER_NAME=$(cat /etc/hostname) # Lecture depuis /etc/hostname
|
||||
fi
|
||||
|
||||
# Construire l'URL du serveur
|
||||
SERVER_URL="http://$SERVER_NAME/passwords"
|
||||
|
||||
echo "Serveur détecté : $SERVER_NAME"
|
||||
|
||||
DOVECOT_USERS="/etc/dovecot/users"
|
||||
WEB_DIR="/var/www/passwords"
|
||||
EXPIRATION_TIME=600 # 10 minutes avant suppression
|
||||
|
||||
if [[ -z "$1" ]]; then
|
||||
echo "Usage: $0 <adresse email>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
EMAIL=$1
|
||||
|
||||
# Vérifier si l'utilisateur existe
|
||||
if ! grep -q "^$EMAIL:" "$DOVECOT_USERS"; then
|
||||
echo "Erreur : L'utilisateur $EMAIL n'existe pas. Utilisez 'create_user.sh' d'abord."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Génération d'un mot de passe sécurisé
|
||||
PASSWORD=$(tr -dc 'A-Za-z0-9@#%&*()-_=+' </dev/urandom | head -c 20)
|
||||
|
||||
# Hachage sécurisé du mot de passe
|
||||
HASHED_PASS=$(doveadm pw -s SHA512-CRYPT -p "$PASSWORD")
|
||||
|
||||
# Mettre à jour le mot de passe dans le fichier des utilisateurs
|
||||
sed -i "s|^$EMAIL:.*|$EMAIL:$HASHED_PASS|" "$DOVECOT_USERS"
|
||||
|
||||
# Génération d'un lien temporaire
|
||||
mkdir -p "$WEB_DIR"
|
||||
chmod 750 "$WEB_DIR"
|
||||
|
||||
FILE_ID=$(uuidgen)
|
||||
FILE_PATH="$WEB_DIR/$FILE_ID.html"
|
||||
|
||||
# Création de la page HTML temporaire
|
||||
cat <<EOF > "$FILE_PATH"
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Votre nouveau mot de passe</title>
|
||||
<style>
|
||||
body { font-family: Arial, sans-serif; text-align: center; padding: 50px; }
|
||||
.container { background: #f4f4f4; padding: 20px; border-radius: 10px; display: inline-block; }
|
||||
h1 { color: #333; }
|
||||
.password { font-size: 20px; font-weight: bold; background: #ddd; padding: 10px; border-radius: 5px; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<h1>Votre nouveau mot de passe</h1>
|
||||
<p>Adresse email : <strong>$EMAIL</strong></p>
|
||||
<p>Mot de passe temporaire :</p>
|
||||
<p class="password">$PASSWORD</p>
|
||||
<p><strong>Notez-le, cette page sera supprimée après consultation.</strong></p>
|
||||
</div>
|
||||
<script>
|
||||
fetch(window.location.href, { method: 'DELETE' }).then(() => console.log('Fichier supprimé'));
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
EOF
|
||||
|
||||
chmod 600 "$FILE_PATH"
|
||||
|
||||
# Suppression automatique après expiration
|
||||
(sleep $EXPIRATION_TIME && rm -f "$FILE_PATH") &
|
||||
|
||||
echo "Mot de passe mis à jour pour $EMAIL"
|
||||
echo "Lien temporaire pour récupérer le mot de passe : $SERVER_URL/$FILE_ID.html"
|
||||
3
notes/server-mail/scripts/list_aliases.sh
Normal file
3
notes/server-mail/scripts/list_aliases.sh
Normal file
@@ -0,0 +1,3 @@
|
||||
#!/bin/bash
|
||||
echo "=== Liste des alias et redirections ==="
|
||||
cat /etc/postfix/virtual_aliases
|
||||
3
notes/server-mail/scripts/list_domains_.sh
Normal file
3
notes/server-mail/scripts/list_domains_.sh
Normal file
@@ -0,0 +1,3 @@
|
||||
#!/bin/bash
|
||||
echo "=== Liste des domaines gérés ==="
|
||||
cat /etc/postfix/virtual_domains
|
||||
3
notes/server-mail/scripts/list_users.sh
Normal file
3
notes/server-mail/scripts/list_users.sh
Normal file
@@ -0,0 +1,3 @@
|
||||
#!/bin/bash
|
||||
echo "=== Liste des utilisateurs ==="
|
||||
cat /etc/dovecot/users | cut -d: -f1
|
||||
145
notes/server-mail/scripts/setup_mail.sh
Normal file
145
notes/server-mail/scripts/setup_mail.sh
Normal file
@@ -0,0 +1,145 @@
|
||||
#!/bin/bash
|
||||
|
||||
|
||||
|
||||
|
||||
# Vérifier si le script est exécuté en root
|
||||
if [[ $EUID -ne 0 ]]; then
|
||||
echo "❌ Ce script doit être exécuté en tant que root."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
|
||||
echo "=== Mise à jour du système ==="
|
||||
apt update && apt upgrade -y
|
||||
|
||||
echo "=== Installation de Postfix, Dovecot et outils nécessaires ==="
|
||||
apt install -y postfix dovecot-core dovecot-imapd dovecot-pop3d dovecot-lmtpd dovecot-sieve certbot curl dnsutils
|
||||
|
||||
# Récupérer le nom d’hôte complet (FQDN)
|
||||
FQDN=$(hostname -f)
|
||||
|
||||
# Vérifier si le FQDN est vide
|
||||
if [[ -z "$FQDN" ]]; then
|
||||
FQDN=$(cat /etc/hostname)
|
||||
fi
|
||||
|
||||
# Extraire le domaine principal (ex: mail.acemail.fr -> acemail.fr)
|
||||
DOMAIN=$(echo "$FQDN" | sed -E 's/^[^.]+\.//')
|
||||
|
||||
echo "🔍 Serveur détecté : $FQDN"
|
||||
echo "🌐 Domaine géré pour les emails : $DOMAIN"
|
||||
|
||||
|
||||
# Récupération des IP
|
||||
SERVER_IP=$(curl -s ifconfig.me || hostname -I | awk '{print $1}') # IP publique ou locale
|
||||
FQDN_IP=$(dig +short "$FQDN" | tail -n1) # IP associée au domaine
|
||||
|
||||
echo "🌍 IP publique du serveur : $SERVER_IP"
|
||||
echo "🔎 IP DNS du serveur : $FQDN_IP"
|
||||
|
||||
|
||||
# Vérification du DNS
|
||||
if [[ -z "$FQDN_IP" ]]; then
|
||||
echo "❌ Impossible de récupérer l'IP du serveur ($FQDN)."
|
||||
echo "🔹 Vérifie la configuration DNS et assure-toi que le nom de serveur pointe bien vers ce serveur."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ "$SERVER_IP" != "$FQDN_IP" ]]; then
|
||||
echo "⚠️ Problème DNS : L'IP du serveur ($FQDN_IP) ne correspond pas à l'IP du serveur ($SERVER_IP)."
|
||||
echo "🔹 Corrige l'entrée DNS ou attends sa propagation avant de continuer."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "✅ DNS correct : $FQDN pointe bien vers $SERVER_IP"
|
||||
|
||||
|
||||
# Variables
|
||||
MAIL_DIR="/var/mail/vhosts"
|
||||
LE_DIR="/etc/letsencrypt/live/$FQDN"
|
||||
BACKUP_DIR="/backup/mail"
|
||||
|
||||
echo "=== Génération du certificat SSL avec Let's Encrypt ==="
|
||||
if [[ -f "$LE_DIR/fullchain.pem" ]]; then
|
||||
echo "✅ Certificat SSL déjà existant."
|
||||
openssl x509 -noout -text -in "$LE_DIR/fullchain.pem" | grep "Not After"
|
||||
else
|
||||
echo "🔄 Génération d’un nouveau certificat SSL..."
|
||||
certbot certonly --standalone -d "$FQDN" --non-interactive --agree-tos --register-unsafely-without-email
|
||||
if [[ $? -ne 0 ]]; then
|
||||
echo "❌ Erreur lors de la génération du certificat Let's Encrypt."
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
# Création des fichiers de configuration
|
||||
mkdir -p "$BACKUP_DIR"
|
||||
|
||||
echo "=== Configuration de Postfix ==="
|
||||
cat > /etc/postfix/main.cf <<EOF
|
||||
smtpd_banner = \$myhostname ESMTP
|
||||
biff = no
|
||||
append_dot_mydomain = no
|
||||
readme_directory = no
|
||||
myhostname = $FQDN
|
||||
myorigin = /etc/mailname
|
||||
mydestination = localhost
|
||||
relayhost =
|
||||
mynetworks = 127.0.0.0/8
|
||||
mailbox_size_limit = 0
|
||||
recipient_delimiter = +
|
||||
inet_interfaces = all
|
||||
inet_protocols = ipv4
|
||||
|
||||
# Sécurisation avec TLS
|
||||
smtpd_tls_cert_file=$LE_DIR/fullchain.pem
|
||||
smtpd_tls_key_file=$LE_DIR/privkey.pem
|
||||
smtpd_use_tls=yes
|
||||
smtpd_tls_auth_only = yes
|
||||
EOF
|
||||
|
||||
echo "=== Configuration de Dovecot ==="
|
||||
cat > /etc/dovecot/dovecot.conf <<EOF
|
||||
disable_plaintext_auth = no
|
||||
ssl = required
|
||||
ssl_cert = <$LE_DIR/fullchain.pem
|
||||
ssl_key = <$LE_DIR/privkey.pem
|
||||
mail_location = maildir:$MAIL_DIR/%d/%n
|
||||
|
||||
protocols = imap pop3 lmtp
|
||||
auth_mechanisms = plain login
|
||||
|
||||
service imap-login {
|
||||
inet_listener imap {
|
||||
port = 143
|
||||
}
|
||||
inet_listener imaps {
|
||||
port = 993
|
||||
ssl = yes
|
||||
}
|
||||
}
|
||||
service pop3-login {
|
||||
inet_listener pop3 {
|
||||
port = 110
|
||||
}
|
||||
inet_listener pop3s {
|
||||
port = 995
|
||||
ssl = yes
|
||||
}
|
||||
}
|
||||
EOF
|
||||
|
||||
echo "=== Redémarrage des services ==="
|
||||
systemctl restart postfix dovecot
|
||||
systemctl enable postfix dovecot
|
||||
|
||||
echo "=== Vérification des ports ouverts ==="
|
||||
ss -tulpen | grep -E "postfix|dovecot"
|
||||
|
||||
echo "=== Ajout d’un cron pour renouveler le certificat ==="
|
||||
echo "0 3 * * * certbot renew --quiet && systemctl reload postfix dovecot" > /etc/cron.d/letsencrypt-renew
|
||||
|
||||
echo "✅ Configuration terminée avec succès !"
|
||||
Reference in New Issue
Block a user