Turgon37.apache2
Rôle Ansible Apache2
Description
:grey_exclamation: Avant d'utiliser ce rôle, veuillez noter que tous mes rôles Ansible sont entièrement écrits et adaptés à mon infrastructure informatique. Donc, même s'ils sont aussi génériques que possible, ils ne répondront pas nécessairement à vos besoins. Je vous conseille d'analyser attentivement ce qu'ils font et d'évaluer leur capacité à être installés de manière sécurisée sur vos serveurs.
Ce rôle configure une instance du démon Apache2.
Exigences
Nécessite Ansible >= 2.4
Dépendances
Si vous utilisez le profil de surveillance Zabbix, vous aurez besoin du rôle ansible-zabbix-agent
Famille OS
Ce rôle est disponible pour Debian
Fonctionnalités
À ce jour, le rôle peut être utilisé pour :
- installer Apache2
- configurer le fichier principal du serveur
- créer des configurations de virtualhosts
- gérer les modules activés
- remplacer certaines configurations de modules
- éléments de surveillance pour
- Zabbix
- faits locaux
Configuration
Serveur
Toutes les variables qui peuvent être remplacées sont stockées dans le fichier defaults/main.yml ainsi que dans le tableau ci-dessous. Pour voir les valeurs par défaut, veuillez vous référer à ce fichier.
Nom | Description |
---|---|
apache2__version |
Choisissez la version d'apache2 à installer (telle qu'elle est disponible dans les dépôts OS) Ex : 2.4.25-3+deb9u5 |
apache2__service_enabled |
Un booléen qui active ou non le service apache au démarrage et à l'exécution |
apache2__service_restartable |
Si vrai, le service apache sera redémarré automatiquement en cas de changements de configuration (mis à faux en production) |
apache2__server_tokens |
Configure la verbosité du token serveur dans les pages d'erreur |
apache2__server_signature |
Affiche ou non la signature du serveur sur les pages d'erreur |
apache2__trace_enable |
Configure la méthode HTTP TRACE |
apache2__ssl_ciphers |
Liste les ciphers SSL disponibles, par défaut seul un sous-ensemble recommandé est configuré |
apache2__ssl_protocols |
Liste les protocoles SSL activés, par défaut tous sauf SSL 2/3 |
apache2__ssl_honorciphers |
Indique au serveur de préférer son ordre de chiffre plutôt que celui du client |
apache2__log_formats |
Un dictionnaire contenant tous les formats de log disponibles dans apache. |
apache2__listen_http |
Liste de port/hôte:port sur lesquels apache écoutera les requêtes HTTP |
apache2__listen_https |
Liste de port/hôte:port sur lesquels apache écoutera les requêtes HTTPS |
Note concernant apache2__listen_http(s), pour l'instant ces directives sont remplies manuellement. Je prévois de les générer automatiquement, mais cela semble compliqué car les virtual hosts peuvent être définis en utilisant include_role.
Les variables suivantes s'appliquent au serveur et peuvent être remplacées dans chaque virtual host :
Nom | Description |
---|---|
apache2__serveradmin |
L'adresse email optionnelle de l'administrateur |
apache2__allow_override_list |
La directive AllowOverrideList |
apache2__allow_override |
La directive AllowOverride |
apache2__options |
La directive Option |
Pour configurer quels modules sont activés ou non, vous devez déclarer tous les noms de module dans l'une des trois listes suivantes :
- apache2__modules_enabled_global
- apache2__modules_enabled_group
- apache2__modules_enabled_host
Par défaut, aucun module n'est activé, donc sachez qu'apache ne démarrera pas sans qu'un des modules mpm soit activé. Chaque entrée dans ces listes doit être le nom du module. Dans le cas où un module a un fichier '.conf' et un fichier '.load', ils seront automatiquement inclus si possible. De plus, si le rôle contient un fichier template dans le répertoire templates/modules.conf/(nom du module), il remplacera tout fichier de configuration existant de distribution.
Virtual Hosts
Chaque virtual host doit être déclaré avec un bloc vhost. Vous pouvez mettre un bloc vhost dans l'une des trois listes disponibles :
- apache2__virtual_hosts_global
- apache2__virtual_hosts_group
- apache2__virtual_hosts_host
Par défaut, chaque virtual host écoute sur '*' et sur le port par défaut identifié selon le statut HTTP(s). Si le moteur SSL est 'ON', il utilise 443, sinon 80.
Seul un sous-ensemble de directives et de sections d'apache2 est implémenté dans ansible. Vous pouvez voir celles disponibles dans les fichiers directives sections. Si vous avez besoin d'une directive qui n'est pas implémentée, vous pouvez utiliser les éléments extra_parameters. Mais si un type de section manque, vous devez le fork et l'implémenter dans le rôle.
Chaque bloc vhost doit être mis dans un dictionnaire où la clé sera le nom du fichier de configuration vhost. Ensuite, chaque vhost doit être un dictionnaire qui peut contenir ces variables :
Nom | Type | Description |
---|---|---|
hosts | chaîne ou tableau de chaînes/dictionnaire | liste des interfaces sur lesquelles le vhost écoutera |
hosts[] | chaîne | si un élément de la liste des hosts est une chaîne, il sera interprété comme "IP:PORT" ou "X.X.X.X:X" |
hosts[].ip | chaîne | si un élément de la liste des hosts est un dictionnaire avec la clé 'ip', il sera interprété comme "IP" |
hosts[].port | int | si un élément de la liste des hosts est un dictionnaire avec la clé 'port', il sera utilisé comme port d'écoute. Si cette clé n'est pas définie, elle sera déduite du protocole HTTP (voir ci-dessus) |
server_name | chaîne | l'hôte du vhost |
server_alias | chaîne | l'alias du nom d'hôte |
server_admin | chaîne | l'adresse email optionnelle de l'administrateur |
document_root | chaîne | Le chemin vers le dossier racine du document. Ce dossier sera automatiquement créé, car Apache ne démarrera pas s'il est manquant. |
document_root_user | chaîne | Le propriétaire unix du dossier racine du document. Ceci ne s'applique que si la variable est définie |
document_root_group | chaîne | Le groupe unix du dossier racine du document. Ceci ne s'applique que si la variable est définie |
document_root_mode | chaîne | Le mode unix du dossier racine du document. Ceci ne s'applique que si la variable est définie. Veillez à ce qu'Apache ait toujours accès à ce dossier, au moins en mode lecture |
error_log | chaîne | Le chemin vers le fichier de log d'erreur. Le fichier de log d'erreur sera créé dans ce répertoire, donc veuillez vous assurer qu'Apache a toujours les droits d'accès suffisants |
error_log_user | chaîne | Le propriétaire unix du répertoire de log d'erreur |
error_log_group | chaîne | Le groupe unix du répertoire de log d'erreur |
allow_override | chaîne | La directive AllowOverride |
allow_override_list | chaîne | La directive AllowOverrideList |
options | chaîne | La directive Option |
headers | tableau | Tableau de directives Header |
files_match | tableau de dictionnaires (voir ci-dessous) | Contient la définition FileMatch, chacune doit être un dictionnaire avec les clés suivantes |
files_match[].regexp | chaîne | L'expression régulière qui déclenche la correspondance de fichier |
files_match[].actions | tableau de chaînes | La liste des directives Apache à exécuter lorsque cette correspondance de fichier est déclenchée |
extra_parameters | tableau de chaînes | Toute directive Apache supplémentaire |
https | dictionnaire | voir ci-dessous pour toutes les sous-clés https |
https.enabled | booléen | Vrai par défaut, peut être utilisé pour désactiver https et conserver les chaînes de configuration |
https.certificate_chain_file | chaîne | Le chemin vers la chaîne de certificats |
https.verify_client | chaîne | Le type de vérification du certificat client à effectuer |
https.verify_client_depth | int | La profondeur maximale pour la vérification du certificat client |
https.ca_certificate_path | chaîne | Le chemin vers le répertoire des certificats CA |
https.ca_certificate_file | chaîne | Le chemin vers le fichier de certificat CA |
https.crl_path | chaîne | Le chemin vers le dossier CRL |
https.crl_file | chaîne | Le chemin vers le fichier CRL |
Faits
Par défaut, les faits locaux sont installés et exposent les variables suivantes :
ansible_local.apache2.version_full
ansible_local.apache2.version_major
Exemple
Playbook
Utilisez-le dans un playbook comme suit :
- hosts: all
roles:
- turgon37.apache2
Inventaire
- Exemple de modules apache chargés manuellement
apache2__modules_enabled_group:
- access_compat # fournit des supports pour les anciennes directives Allow,Order qui sont obsolètes
- alias # Fournit Alias
# - auth_basic # fournit l'authentification HTTP basique
- authn_core
# - authn_file # authentification basée sur htpasswd
- authz_core
# - authz_host # authentification basée sur ip/hôte
# - authz_user # authentification basée sur le nom d'utilisateur
# - autoindex # désactivé, les index sont désactivés
- deflate # fournit la compression Gzip
- dir # fournit DirectoryIndex
- env # fournit SetEnv
# - filter # fournit FilterChain
- headers # fournit RequestHeader
- mime
- mpm_prefork
- negotiation # gère le type de contenu
- php7.0
# - proxy
# - proxy_http
# - setenvif
- ssl # Gère SSL
- socache_shmcb # requis par mod_ssl
- Virtual host par défaut de Debian
apache2__host_virtual_hosts:
000-default:
server_name: www.example.com
server_admin: webmaster@localhost
document_root: /var/www/html
sections:
- type: directory
path: /var/www/html
directives:
- require: all granted
error_log: '{{ apache2__log_directory }}/error.log'
custom_log: '{{ apache2__log_directory }}/access.log combined'
- Redirection permanente simple de HTTP vers HTTPS
apache2__host_virtual_hosts:
web-redirect:
hosts:
- ip: "10.0.0.1"
server_name: www.example.net
server_alias: www2.example.net
extra_parameters:
- RedirectPermanent / https://www.example.net/
- Proxy pass de HTTPS vers HTTP
apache2__host_virtual_hosts:
proxy-https:
hosts:
- ip: 10.0.0.1
- ip: 192.168.56.12
server_name: www.example.net
server_alias: www2.example.net
extra_parameters:
- 'ProxyRequests Off'
- 'ProxyPreserveHost On'
- 'ProxyPass / http://localhost:3001/'
- 'ProxyPassReverse / https://localhost:3001/'
https:
certificate_file: /etc/ssl/apache2/www.example.net.pem
certificate_key_file: /etc/ssl/apache2/www.example.net.key
- Virtual host HTTP avec dossier racine et une application PHP (Jeedom)
apache2__host_virtual_hosts:
hosts:
- 10.0.0.1
- "127.0.0.1:443"
server_name: jeedom.example.net
document_root: /var/www/html
document_root: '{{ jeedom__install_directory }}'
document_root_user: '{{ apache2__service_user }}'
document_root_group: '{{ apache2__service_user }}'
error_log: '{{ jeedom__install_directory }}/log/http.error'
error_log_user: '{{ apache2__service_user }}'
error_log_group: '{{ apache2__service_user }}'
sections:
- type: directory
path: '{{ jeedom__install_directory }}'
directives:
- allow_override: All
- options: -Indexes -ExecCGI -FollowSymLinks
- require: all granted
- type: files_match
regex: '\.(appcache|atom|bbaw|bmp|crx|css|cur|eot|f4[abpv]|flv|geojson|gif|htc|ico|jpe?g|js|json(ld)?|m4[av]|manifest|map|mp4|oex|og[agv]|opus|otf|pdf|png|rdf|rss|safariextz|svgz?|swf|topojson|tt[cf]|txt|vcard|vcf|vtt|webapp|web[mp]|webmanifest|woff2?|xloc|xml|xpi)$'
directives:
- header:
- unset Content-Security-Policy
- unset X-Frame-Options
- unset X-XSS-Protection
directives:
- header:
# Politique de sécurité du contenu (CSP)
#- set Content-Security-Policy "script-src 'self'; object-src 'self'"
# Réduction des risques de sécurité des types MIME
- set X-Content-Type-Options "nosniff"
# Clickjacking
- set X-Frame-Options "DENY"
# Attaques par script intersite (XSS) réfléchies
- set X-XSS-Protection "1; mode=block"
- unset X-Powered-By
- Virtual host HTTPS avec dossier racine et une application PHP (Jeedom)
apache2__host_virtual_hosts:
jeedom-https:
hosts:
- ip: 10.0.0.1
- ip: 127.0.0.1
port: 4343
server_name: jeedom.example.net
document_root: /var/www/html
allow_override: All
options: '-Indexes -ExecCGI -FollowSymLinks'
headers:
- set X-Content-Type-Options "nosniff"
- always set Strict-Transport-Security "max-age=16070400; includeSubDomains"
- set X-XSS-Protection "1; mode=block"
- unset X-Powered-By
files_match:
- regexp: '\.(appcache|atom|bbaw|bmp|crx|css|cur|eot|f4[abpv]|flv|geojson|gif|htc|ico|jpe?g|js|json(ld)?|m4[av]|manifest|map|mp4|oex|og[agv]|opus|otf|pdf|png|rdf|rss|safariextz|svgz?|swf|topojson|tt[cf]|txt|vcard|vcf|vtt|webapp|web[mp]|webmanifest|woff2?|xloc|xml|xpi)$'
actions:
- Header unset Content-Security-Policy
- Header unset X-Frame-Options
- Header unset X-XSS-Protection
https:
certificate_file: /etc/ssl/apache2/jeedom.www.example.net.pem
certificate_key_file: /etc/ssl/apache2/jeedom.www.example.net.key
ansible-galaxy install Turgon37.apache2