diff --git a/bin/expl_create_vhost.sh b/bin/expl_create_vhost.sh new file mode 100755 index 0000000..37204a0 --- /dev/null +++ b/bin/expl_create_vhost.sh @@ -0,0 +1,248 @@ +#!/bin/bash +##---------------------------------------------------------------------- +# Script : expl_create_vhost.sh +# Auteur : Doug Le Tough +# Date : 22-07-2017 +# Version : 1.0.0 +# Objet : Création d'un VHOST sur le rproxy et sur l'hôte du backend +# Le rproxy comme le backend sont considérés être des serveurs +# Apache +# +# ---------------------------------------------------------------------- +# Mise a jour : +# +# 1.0.0 22/07/2017 - Doug Le Tough - Cre : Mise en production +# +# ---------------------------------------------------------------------- +# Dependances : Aucune +# +# +#------------------------------------------------------------------------------------------------------------------ +# Liste des options et arguments: +# +# @OPT: o:domain:domain:1/1:::: +# @OPT: f:backend_host:backend_host:1/1:::: +# @OPT: o:backend_port:backend_port:1/1:::: +# @OPT: f:enable_vhost:enable_vhost:1/1:false::: +# +#------------------------------------------------------------------------------------------------------------------ +# Liste des erreurs: +# +# 2 | erreur | stop | ${ERROR} +# +#------------------------------------------------------------------------------------------------------------------ +# Liste des paramètres de configuration définis dans le fichier de configuration du script: +# +# RPROXY_VHOST_TEMPLATE=rproxy_template.conf +# REMOTE_VHOST_TEMPLATE=backend_template.conf +# DEHYDRATED_DOMAIN_LIST=/etc/dehydrated/domains.txt +# HTTPD_PATH=/etc/httpd/sites-available +# +#------------------------------------------------------------------------------------------------------------------ +## +## Syntaxe : +## -------- +## +## prompt> expl_create_vhost.sh -domain [-backend_host ] -backend_port [-enable_vhost true] +## +## ex: expl_create_vhost.sh -domain pad.tetalab.org -backend_host jimmy.local.tetalab.org -backend_port 9001 +## +## Prérequis: +## ---------- +## - Le script doit être executé par l'utilisateur asr sur le rproxy (sousetsuken) +## +## Fonctionnement: +## --------------- +## Crée le fichier de configuration sur le rproxy à partir du fichiers modèle local_site_template.conf +## ainsi que le fichier de configuration sur l'hôte du backend à partir du fichier modèle remote_site_template.conf. +## +## Les deux fichiers modèles sont situés dans le répertoire NC_EXPL_MOD. +## +## Le paramètre backend_host est facultatif car certaines applications n'ont pas besoin de passer par un vhost +## (cas de etherpad-light). +## +## Le paramètre enable_vhost est facultatif. Si passé à true, le vhost sera activé sur le rprox comme sur le backend. +## Dans le cas contraire le vhost sera activé sur aucun des deux serveurs. +## +## Remarque importante: Ce script ne redémarre *PAS* les serveurs Apache. +## +##----------------------------------------------------------------------------------------------------------------- +#------------------------------------------------------------------------------------------------------------------ +# Initialisation de l'environement +#------------------------------------------------------------------------------------------------------------------ + +if [ "${USER}" != "asr" ]; then + ERROR="Seul l'utilisateur asr peut utiliser ce script" + echo -e "\033[91m${ERROR}\033[0m" + exit 1 +fi + +source /etc/profile.d/tetalab.sh + +if [ ! -f ${NC_EXPL_CFG}/init.conf ]; then + echo "Le fichier d'initialisation du socle \${NC_EXPL_CFG}/init.conf n'éxiste pas !" + echo "Arrêt du script par sécurité" + exit 250 +fi + +source ${NC_EXPL_CFG}/init.conf + +IP_ADDR=$(host ${domain} | rev | cut -d' ' -f1 | rev) +IS_PRESENT=$(grep -E ^${DOMAIN}$ ${DEHYDRATED_DOMAIN_LIST} | wc -l) +REMOTE_HTTP_PATH=${backend_host}:${HTTPD_PATH} +REPLACE_DOMAIN="s/SITE_NAME/${domain}/g" +REPLACE_HOST="s/SITE_HOST/${backend_host}/g" +REPLACE_IP_ADDR="s/SITE_IP/${IP_ADDR}/g" +REPLACE_SITE_PORT="s/SITE_PORT/${backend_port}/" + +#------------------------------------------------------------------------------------------------------------------ +# Fonctions +#------------------------------------------------------------------------------------------------------------------ + +function check_port +{ + if [ ! ${backend_port} -gt 0 ] 2>/dev/null || [ ! ${backend_port} -lt 65535 ] 2>/dev/null; then + ERROR="Le numéro de port doit être compris entre 0 et 65535" + fct_erreur 2 + fi +} + +function check_templates +{ + if [ ! -r ${RPROXY_VHOST_TEMPLATE} ]; then + ERROR="${RPROXY_VHOST_TEMPLATE} n'existe pas ou n'est pas lisible" + fct_erreur 2 + fi + + if [ ! -r ${REMOTE_VHOST_TEMPLATE} ]; then + ERROR="${REMOTE_VHOST_TEMPLATE} n'existe pas ou n'est pas lisible" + fct_erreur 2 + fi +} + + +function create_rproxy_conf +{ + fct_message "Création de la configuration du rproxy:" -color rose + fct_message " * Domaine: ${domain}" + fct_message " * Hôte : ${backend_host}" + fct_message ' * Port: ${backend_port}' + sed -s ${REPLACE_DOMAIN} ${RPROXY_VHOST_TEMPLATE} > ${NC_EXPL_TMP}/${domain}.conf_${SH_SESSION_ID}.tmp + RET_VAL=$? + if [ ! ${RET_VAL} -eq 0 ]; then + ERROR="Erreur lors de la création de la configuration du rproxy (1)" + fct_erreur 2 + fi + sed -i ${REPLACE_HOST} ${NC_EXPL_TMP}/${domain}.conf_${SH_SESSION_ID}.tmp + RET_VAL=$? + if [ ! ${RET_VAL} -eq 0 ]; then + ERROR="Erreur lors de la création de la configuration du rproxy (2)" + fct_erreur 2 + fi + sed -i ${REPLACE_SITE_PORT} ${NC_EXPL_TMP}/${domain}.conf_${SH_SESSION_ID}.tmp + RET_VAL=$? + if [ ! ${RET_VAL} -eq 0 ]; then + ERROR="Erreur lors de la création de la configuration du rproxy (3)" + fct_erreur 2 + fi + fct_message "Installation de la configuration du rproxy vers ${HTTPD_PATH}/${domain}.conf" -color rose + sudo cp ${NC_EXPL_TMP}/${domain}.conf_${SH_SESSION_ID}.tmp ${HTTPD_PATH}/${domain}.conf + RET_VAL=$? + if [ ! ${RET_VAL} -eq 0 ]; then + ERROR="Erreur lors de l'installation de la configuration du rproxy" + fct_erreur 2 + fi + fct_message "Application des droits sur ${HTTPD_PATH}/${domain}.conf" -color rose + sudo chown root: ${HTTPD_PATH}/${domain}.conf + RET_VAL=$? + if [ ! ${RET_VAL} -eq 0 ]; then + ERROR="Erreur lors de l'application des droits." + fct_erreur 2 + fi + fct_message "Application des permissions sur ${HTTPD_PATH}/${domain}.conf" -color rose + sudo chmod 644 ${HTTPD_PATH}/${domain}.conf + RET_VAL=$? + if [ ! ${RET_VAL} -eq 0 ]; then + ERROR="Erreur lors de l'application des permissions" + fct_erreur 2 + fi +} + +function create_backend_conf +{ + fct_message "Création de la configuration du backend:" -color rose + sed -s ${REPLACE_DOMAIN} ${REMOTE_TEMPLATE_FILE} > ${NC_EXPL_TMP}/${domain}.conf_${SH_SESSION_ID}.tmp + RET_VAL=$? + if [ ! ${RET_VAL} -eq 0 ]; then + ERROR="Erreur lors de la création de la configuration du backend (1)" + fct_erreur 2 + fi + sed -i ${REPLACE_IP_ADDR} ${NC_EXPL_TMP}/${domain}.conf_${SH_SESSION_ID}.tmp + RET_VAL=$? + if [ ! ${RET_VAL} -eq 0 ]; then + ERROR="Erreur lors de la création de la configuration du backend (2)" + fct_erreur 2 + fi + sed -i ${REPLACE_SITE_PORT} ${NC_EXPL_TMP}/${domain}.conf_${SH_SESSION_ID}.tmp + RET_VAL=$? + if [ ! ${RET_VAL} -eq 0 ]; then + ERROR="Erreur lors de la création de la configuration du backend (3)" + fct_erreur 2 + fi + fct_message "Installation de la configuration du backend sur ${backend_host}" -color rose + scp ${NC_EXPL_TMP}/${domain}.conf_${SH_SESSION_ID}.tmp ${HOST}:/tmp/${domain}.conf + RET_VAL=$? + if [ ! ${RET_VAL} -eq 0 ]; then + ERROR="Erreur lors de l'installation de la configuration du backend (1)" + fct_erreur 2 + fi + ssh ${backend_host} "sudo mv /tmp/${domain}.conf ${HTTPD_PATH}/${domain}.conf" + RET_VAL=$? + if [ ! ${RET_VAL} -eq 0 ]; then + ERROR="Erreur lors de l'installation de la configuration du backend (2)" + fct_erreur 2 + fi + fct_message "Application des droits sur le fichier de configuration du backend" + ssh ${HOST} "sudo chown root: ${HTTPD_PATH}/${domain}.conf" + RET_VAL=$? + if [ ! ${RET_VAL} -eq 0 ]; then + ERROR="Erreur lors de l'application des droits sur la configuration du backend" + fct_erreur 2 + fi + fct_message "Application des permissions sur le fichier de configuration du backend" + ssh ${HOST} "sudo chmod 644 ${HTTPD_PATH}/${domain}.conf" + RET_VAL=$? + if [ ! ${RET_VAL} -eq 0 ]; then + ERROR="Erreur lors de l'application des permissions sur la configuration du backend" + fct_erreur 2 + fi +} + +function add_domain +{ + if [ ${IS_PRESENT} -eq 0 ]; then + fct message "Ajout du domaine ${domain} aux domaines dont les certificats sont gérés par dehydrated" -color rose + sudo echo ${domain} >> ${DEHYDRATED_DOMAIN_LIST} + RET_VAL=$? + if [ ! ${RET_VAL} -eq 0 ]; then + ERROR="Erreur lors de l'ajout du domaine dans ${DEHYDRATED_DOMAIN_LIST}" + fct_erreur 2 + fi + else + fct_message "${domain} fait déjà partie de la liste des domaines gérés par dehydrated" -color jaune + fi +} + +#----------------------------------------------------------------------- +# Traitement +#----------------------------------------------------------------------- + +check_port +check_templates +create_rproxy_conf +if [ "${#backend_host}" -gt 0 ]; then + create_backend_conf +fi +add_domain + +fct_erreur 0 diff --git a/bin/expl_deploy_socle.sh b/bin/expl_deploy_socle.sh index 3bb12cc..c3d443b 100755 --- a/bin/expl_deploy_socle.sh +++ b/bin/expl_deploy_socle.sh @@ -37,7 +37,7 @@ ## ## Prérequis: ## ---------- -## - Le script doit être executé avec les droits root +## - Le script doit être executé par l'utilisateur asr ## ## Fonctionnement: ## --------------- diff --git a/conf/expl_create_vhost.conf b/conf/expl_create_vhost.conf new file mode 100644 index 0000000..a3ca50a --- /dev/null +++ b/conf/expl_create_vhost.conf @@ -0,0 +1,4 @@ +RPROXY_VHOST_TEMPLATE=rproxy_template.conf +REMOTE_VHOST_TEMPLATE=backend_template.conf +DEHYDRATED_DOMAIN_LIST=/etc/dehydrated/domains.txt +HTTPD_PATH=/etc/httpd/sites-available diff --git a/install.sh b/install.sh index 8131498..5f56bf7 100755 --- a/install.sh +++ b/install.sh @@ -79,6 +79,11 @@ RET_VAL=$? if [ ! ${RET_VAL} -eq 0 ]; then exit_on_error "Erreur lors de la création du fichier de profile" fi +chmod +x ${PROFILE_DIR}/${PROFILE_FILE} +RET_VAL=$? +if [ ! ${RET_VAL} -eq 0 ]; then + exit_on_error "Erreur lors de l'application des permissions sur ${PROFILE_DIR}/${PROFILE_FILE}" +fi continue_on_ok # Installation des fichiers de configuration diff --git a/mod/backend_template.conf b/mod/backend_template.conf new file mode 100644 index 0000000..5bc129b --- /dev/null +++ b/mod/backend_template.conf @@ -0,0 +1,13 @@ + + ServerName SITE_NAME + ServerAdmin bofh@tetalab.org + DocumentRoot /var/www/SITE_NAME + RemoteIPHeader X-Forwarded-For + RemoteIPInternalProxy 192.168.122.0/24 + + AllowOverride All + Require all granted + + ErrorLog /var/log/httpd/SITE_NAME.error.log + CustomLog /var/log/httpd/SITE_NAME.access.log combined + diff --git a/mod/rproxy_template.conf b/mod/rproxy_template.conf new file mode 100644 index 0000000..15c66c9 --- /dev/null +++ b/mod/rproxy_template.conf @@ -0,0 +1,36 @@ + + # ReverseProxy with https redirect template + # + # Written by Doug Le Tough + # + # Usage: + # sed -s 's/SITE_NAME/example.com/g' site_template.conf > example.org.conf + # sed -i 's/SITE_HOST/hostname.local.tetalab.org/g' example.org.conf + # + Define FQDN SITE_NAME + Define HOST SITE_HOST + Define HOST_PORT SITE_PORT + ServerName ${FQDN} + ### All HTTP requests are converted to HTTPS requests + + RewriteEngine On + RewriteCond %{HTTPS} off + RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} + + ErrorLog "/var/log/httpd/${FQDN}_error.log" + CustomLog "/var/log/httpd/${FQDN}_access.log" Combined + + + Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains" + ServerName ${FQDN} + ProxyPreserveHost On + SSLEngine on + SSLCertificateFile /etc/dehydrated/certs/${FQDN}/cert.pem + SSLCertificateKeyFile /etc/dehydrated/certs/${FQDN}/privkey.pem + SSLCertificateChainFile /etc/dehydrated/certs/${FQDN}/fullchain.pem + RequestHeader set X_FORWARDED_PROTO 'https' + ProxyPass / http://${HOST}:${HOST_PORT}/ + ProxyPassReverse / http://${HOST}:${HOST_PORT}/ + ErrorLog "/var/log/httpd/${FQDN}_error.log" + CustomLog "/var/log/httpd/${FQDN}_access.log" Combined + diff --git a/msg/expl_create_vhost.msg b/msg/expl_create_vhost.msg new file mode 100644 index 0000000..1b5ec49 --- /dev/null +++ b/msg/expl_create_vhost.msg @@ -0,0 +1 @@ +2 | erreur | stop | ${ERROR}