diff --git a/scripts/server-httpd/setup_httpd.sh b/scripts/server-httpd/setup_httpd.sh index cbd270d..8b3ffd5 100644 --- a/scripts/server-httpd/setup_httpd.sh +++ b/scripts/server-httpd/setup_httpd.sh @@ -13,13 +13,18 @@ update_system echo "=== Installation d'Apache et des outils nécessaires ===" apt install -y apache2 curl dnsutils certbot python3-certbot-apache -# Activer et démarrer Apache +# Activer et démarrer Apache uniquement si ce n'est pas déjà fait echo "=== Activation et démarrage d'Apache ===" -systemctl enable apache2 -systemctl start apache2 +systemctl is-enabled apache2 || systemctl enable apache2 +systemctl is-active --quiet apache2 || systemctl start apache2 -# Activer les modules nécessaires -a2enmod rewrite ssl headers +# Activer les modules nécessaires uniquement s'ils ne le sont pas déjà +MODULES=(rewrite ssl headers http2 socache_shmcb proxy proxy_http setenvif) +for MODULE in "${MODULES[@]}"; do + if ! a2query -m "$MODULE" >/dev/null 2>&1; then + a2enmod "$MODULE" + fi +done systemctl reload apache2 # Récupérer le FQDN @@ -29,22 +34,27 @@ echo "🔍 Serveur détecté : $FQDN" # Vérification DNS check_dns "$FQDN" -# Configurer le VirtualHost +# Configurer le VirtualHost uniquement si ce n'est pas déjà fait echo "=== Configuration du Virtual Host pour $FQDN ===" -./add_domain.sh "$FQDN" -EXIT_CODE=$? - -if [[ $EXIT_CODE -ne 0 ]]; then - echo "❌ Échec de la configuration du serveur ($FQDN). Code erreur : $EXIT_CODE" - exit $EXIT_CODE +if ! grep -q "ServerName $FQDN" /etc/apache2/sites-available/*.conf; then + ./add_domain.sh "$FQDN" + EXIT_CODE=$? + if [[ $EXIT_CODE -ne 0 ]]; then + echo "❌ Échec de la configuration du serveur ($FQDN). Code erreur : $EXIT_CODE" + exit $EXIT_CODE + fi fi -# Configuration SSL +# Configuration SSL uniquement si nécessaire setup_ssl "$FQDN" # Sécurisation des accès echo "=== Sécurisation des accès ===" -cat <<EOF > /etc/apache2/conf-available/security.conf +SECURITY_CONF="/etc/apache2/conf-available/security.conf" +# Vérifier si le fichier existe et contient déjà la configuration +if [ ! -f "$SECURITY_CONF" ]; then + echo "Création de $SECURITY_CONF avec les paramètres de sécurité." + cat <<EOF > "$SECURITY_CONF" <Directory /> AllowOverride None Require all denied @@ -54,23 +64,99 @@ cat <<EOF > /etc/apache2/conf-available/security.conf Require all denied </FilesMatch> EOF -a2enconf security + a2enconf security + systemctl reload apache2 + echo "Configuration de sécurité appliquée et rechargement d'Apache." +else + echo "Le fichier $SECURITY_CONF existe déjà. Aucune modification nécessaire." +fi + +# Vérifier si le fichier de configuration existe +if [ -f "$SECURITY_CONF" ]; then + # Vérifier si les directives sont déjà présentes pour éviter les doublons + if ! grep -q "Header always unset X-Powered-By" "$SECURITY_CONF"; then + echo "Ajout des directives de sécurité HTTP à $SECURITY_CONF." + cat <<EOF >> "$SECURITY_CONF" # Renforcement des en-têtes HTTP -echo "=== Renforcement des en-têtes HTTP ===" -cat <<EOF >> /etc/apache2/conf-available/security.conf ServerTokens Prod ServerSignature Off TraceEnable Off Header always unset X-Powered-By EOF + echo "Configuration mise à jour et rechargement d'Apache." + else + echo "Les directives de sécurité HTTP sont déjà présentes. Aucune modification nécessaire." + fi +else + echo "Erreur : le fichier $SECURITY_CONF n'existe pas. Assurez-vous que la configuration de sécurité est en place." +fi -# Activer HTTP Strict Transport Security (HSTS) -echo "Header always set Strict-Transport-Security \"max-age=31536000; includeSubDomains; preload\"" >> /etc/apache2/sites-available/default-ssl.conf +# Activer HTTP Strict Transport Security (HSTS) uniquement si nécessaire +SSL_CONF="/etc/apache2/sites-available/default-ssl.conf" +if ! grep -q "Strict-Transport-Security" "$SSL_CONF"; then + echo "Header always set Strict-Transport-Security \"max-age=31536000; includeSubDomains; preload\"" >> "$SSL_CONF" +fi -# Limitation de la taille des requêtes + +# Activation de l'OCSP Stapling uniquement si nécessaire +echo "=== Activation de l'OCSP Stapling ===" +# Vérifier si le fichier de configuration SSL existe +if [ -f "$SSL_CONF" ]; then + # Vérifier si l'option est déjà activée pour éviter les doublons + if ! grep -q "^SSLUseStapling on" "$SSL_CONF"; then + echo "Ajout des directives OCSP Stapling à $SSL_CONF." + cat <<EOF >> "$SSL_CONF" + +# Configuration OCSP Stapling +SSLUseStapling on +SSLStaplingResponderTimeout 5 +SSLStaplingReturnResponderErrors off +SSLStaplingCache shmcb:/var/run/ocsp(128000) +EOF + systemctl reload apache2 + echo "Configuration OCSP Stapling mise à jour et rechargement d'Apache." + else + echo "OCSP Stapling est déjà activé. Aucune modification nécessaire." + fi +else + echo "Erreur : le fichier $SSL_CONF n'existe pas. Assurez-vous que le module SSL est bien installé." +fi + +# Désactivation des chiffres faibles et renforcement TLS +echo "=== Renforcement de la configuration SSL/TLS ===" + +SSL_MOD_CONF="/etc/apache2/mods-available/ssl.conf" + +# Vérifier si le fichier de configuration SSL existe +if [ -f "$SSL_MOD_CONF" ]; then + # Vérifier si la configuration est déjà appliquée pour éviter les doublons + if ! grep -q "^SSLProtocol -all +TLSv1.2 +TLSv1.3" "$SSL_MOD_CONF"; then + echo "Ajout des directives SSL/TLS sécurisées à $SSL_MOD_CONF." + cat <<EOF >> "$SSL_MOD_CONF" + +# Renforcement de la configuration SSL/TLS +SSLProtocol -all +TLSv1.2 +TLSv1.3 +SSLCipherSuite TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256 +SSLHonorCipherOrder on +SSLCompression off +SSLSessionTickets off +EOF + systemctl reload apache2 + echo "Configuration SSL/TLS mise à jour et rechargement d'Apache." + else + echo "La configuration SSL/TLS est déjà sécurisée. Aucune modification nécessaire." + fi +else + echo "Erreur : le fichier $SSL_MOD_CONF n'existe pas. Assurez-vous que le module SSL est bien installé." +fi + + +# Limitation de la taille des requêtes (éviter les doublons) echo "=== Limitation de la taille des requêtes ===" -echo "LimitRequestBody 10485760" >> /etc/apache2/conf-available/security.conf +if ! grep -q "LimitRequestBody" "$SECURITY_CONF"; then + echo "LimitRequestBody 10485760" >> "$SECURITY_CONF" +fi # Vérifier la configuration avant rechargement echo "=== Vérification de la configuration Apache ===" @@ -80,14 +166,14 @@ if [[ $? -ne 0 ]]; then exit 1 fi -# Appliquer des permissions sécurisées +# Appliquer des permissions sécurisées (éviter les erreurs si déjà appliquées) echo "=== Sécurisation des permissions des fichiers de configuration ===" -chmod 640 /etc/apache2/sites-available/* -chmod 640 /etc/apache2/conf-available/* -chown root:root /etc/apache2/sites-available/* -chown root:root /etc/apache2/conf-available/* +chmod 640 /etc/apache2/sites-available/* 2>/dev/null +chmod 640 /etc/apache2/conf-available/* 2>/dev/null +chown root:root /etc/apache2/sites-available/* 2>/dev/null +chown root:root /etc/apache2/conf-available/* 2>/dev/null # Rechargement final d'Apache systemctl reload apache2 -echo "✅ Installation et sécurisation d'Apache terminées !" +echo "✅ Installation et sécurisation d'Apache terminées !" \ No newline at end of file