Turgon37.apache2
Rol de Ansible Apache2
Descripción
:grey_exclamation: Antes de usar este rol, ten en cuenta que todos mis roles de Ansible están totalmente escritos y adaptados a mi infraestructura de TI. Aunque sean lo más genéricos posible, no necesariamente cubrirán tus necesidades. Te aconsejo que analices con cuidado lo que hacen y evalúes su capacidad para ser instalados de forma segura en tus servidores.
Este rol configura una instancia del daemon Apache2.
Requisitos
Requiere Ansible >= 2.4
Dependencias
Si utilizas el perfil de monitoreo Zabbix, necesitarás el rol ansible-zabbix-agent
Familia del SO
Este rol está disponible para Debian.
Características
Hasta la fecha, el rol se puede usar para:
- instalar Apache2
- configurar el archivo principal del servidor
- crear configuraciones de virtualhosts
- gestionar módulos habilitados
- anular configuraciones de algunos módulos
- elementos de monitoreo para
- Zabbix
- hechos locales
Configuración
Servidor
Todas las variables que se pueden sobrescribir están almacenadas en el archivo defaults/main.yml así como en la tabla a continuación. Para ver los valores predeterminados, consulta este archivo.
Nombre | Descripción |
---|---|
apache2__version |
Elige la versión de apache2 para instalar (según lo disponible en los repositorios del SO) Ej: 2.4.25-3+deb9u5 |
apache2__service_enabled |
Un booleano que habilita o no el servicio apache al iniciar y en tiempo de ejecución |
apache2__service_restartable |
Si es verdadero, el servicio apache se reiniciará automáticamente al cambiar la configuración (se recomienda poner en falso en producción) |
apache2__server_tokens |
Configura la verbosidad del token del servidor en las páginas de error |
apache2__server_signature |
Imprimir o no la firma del servidor en las páginas de error |
apache2__trace_enable |
Configura el método HTTP TRACE |
apache2__ssl_ciphers |
Lista los cifrados SSL disponibles, por defecto solo se configura un subconjunto recomendado |
apache2__ssl_protocols |
Lista los protocolos SSL habilitados, por defecto todos excepto SSL 2/3 |
apache2__ssl_honorciphers |
Indica al servidor que prefiera su orden de cifrado en lugar del del cliente |
apache2__log_formats |
Un diccionario que contiene todos los formatos de log disponibles en apache. |
apache2__listen_http |
Lista de puerto/host:puerto en el que apache escuchará las solicitudes http |
apache2__listen_https |
Lista de puerto/host:puerto en el que apache escuchará las solicitudes https |
Nota sobre apache2__listen_http(s), por ahora estas directivas se completan manualmente, planeé generarlas automáticamente, pero parece complicado porque los virtual hosts pueden definirse usando include_role.
La siguiente variable se aplica al servidor y se puede sobrecargar en cada virtual host:
Nombre | Descripción |
---|---|
apache2__serveradmin |
Dirección de correo electrónico opcional del administrador |
apache2__allow_override_list |
La directiva AllowOverrideList |
apache2__allow_override |
La directiva AllowOverride |
apache2__options |
La directiva Option |
Para configurar qué módulos están habilitados o no, debes declarar todos los nombres de módulo en cualquiera de las siguientes tres listas:
- apache2__modules_enabled_global
- apache2__modules_enabled_group
- apache2__modules_enabled_host
Por defecto, ningún módulo está habilitado, por lo que ten en cuenta que apache no comenzará sin que algún módulo mpm esté habilitado. Cada entrada en estas listas debe ser el nombre del módulo. En caso de que un módulo tenga un archivo '.conf' y un archivo '.load', se incluirán automáticamente siempre que sea posible. Además, si el rol contiene un archivo de plantilla en el directorio templates/modules.conf/(nombre del módulo), reemplazará cualquier archivo de configuración existente de la distribución.
Virtual hosts
Cada virtual host debe declararse con un bloque vhost. Puedes poner un bloque vhost en cualquiera de las tres listas disponibles:
- apache2__virtual_hosts_global
- apache2__virtual_hosts_group
- apache2__virtual_hosts_host
Por defecto, cada virtual host escucha en '*' y en el puerto predeterminado identificado según el estado HTTP(s). Si el motor SSL está 'ENCENDIDO', utiliza 443, de lo contrario, 80.
Solo se ha implementado un subconjunto de las directivas y secciones de apache2 en ansible, puedes ver las disponibles en los archivos directives sections. Si necesitas una directiva que no está implementada, puedes usar los elementos extra_parameters. Pero si falta un tipo de sección, necesitarás bifurcar e implementarlo en el rol.
Cada bloque vhost debe colocarse en un diccionario donde la clave será el nombre del archivo de configuración del vhost. Luego, cada vhost debe ser un diccionario que puede contener estas variables:
Nombre | Tipo | Descripción |
---|---|---|
hosts | cadena o array de cadena/diccionario | lista de interfaces en las que el vhost escuchará |
hosts[] | cadena | si un elemento de la lista de hosts es una cadena, se interpretará como "IP:PUERTO" o "X.X.X.X:X" |
hosts[].ip | cadena | si un elemento de la lista de hosts es un diccionario con clave 'ip', se interpretará como "IP" |
hosts[].port | int | si un elemento de la lista de hosts es un diccionario con clave 'port', se usará como puerto de escucha. Si esta clave no está establecida, se deducirá del protocolo HTTP (ver arriba) |
server_name | cadena | el host del vhost |
server_alias | cadena | el alias del nombre del host |
server_admin | cadena | la dirección de correo electrónico opcional del administrador |
document_root | cadena | La ruta a la carpeta del documento raíz. Este directorio se creará automáticamente, porque Apache no comenzará si falta. |
document_root_user | cadena | El propietario unix de la carpeta del documento raíz. Esto solo se aplica si la variable está definida |
document_root_group | cadena | El grupo unix de la carpeta del documento raíz. Esto solo se aplica si la variable está definida |
document_root_mode | cadena | El modo unix de la carpeta del documento raíz. Esto solo se aplica si la variable está definida. Ten cuidado de que apache aún tenga acceso a esta carpeta, al menos en modo sólo lectura |
error_log | cadena | La ruta al archivo de log de errores. El archivo de log de errores se creará en este directorio, así que asegúrate de que apache aún tenga derechos de acceso suficientes |
error_log_user | cadena | El propietario unix del directorio del log de errores |
error_log_group | cadena | El grupo unix del directorio del log de errores |
allow_override | cadena | La directiva AllowOverride |
allow_override_list | cadena | La directiva AllowOverrideList |
options | cadena | La directiva Option |
headers | array | Array de directivas de encabezado |
files_match | array de diccionarios (ver más abajo) | Contiene la definición FileMatch, cada uno debe ser un diccionario con las siguientes claves |
files_match[].regexp | cadena | La expresión regular que activa la coincidencia de archivos |
files_match[].actions | array de cadena | La lista de directivas de Apache para ejecutar cuando se active esta coincidencia de archivos |
extra_parameters | array de cadena | Cualquier directiva adicional de Apache |
https | diccionario | ver abajo para todas las subclaves https |
https.enabled | booleano | Verdadero por defecto, puede usarse para deshabilitar https y preservar configuraciones de cadena |
https.certificate_chain_file | cadena | La ruta al certificado de la cadena |
https.verify_client | cadena | El tipo de verificación del certificado del cliente a realizar |
https.verify_client_depth | int | La profundidad máxima para la verificación del certificado del cliente |
https.ca_certificate_path | cadena | La ruta al directorio del certificado CA |
https.ca_certificate_file | cadena | La ruta al archivo del certificado CA |
https.crl_path | cadena | La ruta a la carpeta CRL |
https.crl_file | cadena | La ruta al archivo CRL |
Hechos
Por defecto, los hechos locales se instalan y exponen las siguientes variables:
ansible_local.apache2.version_full
ansible_local.apache2.version_major
Ejemplo
Playbook
Úsalo en un playbook de la siguiente manera:
- hosts: all
roles:
- turgon37.apache2
Inventario
- Ejemplo de módulos de apache cargados manualmente
apache2__modules_enabled_group:
- access_compat # proporciona soporte para directivas antiguas Allow,Order que están en desuso
- alias # proporciona Alias
# - auth_basic # proporciona autenticación HTTP básica
- authn_core
# - authn_file # autenticación basada en htpasswd
- authz_core
# - authz_host # autenticación basada en ip/host
# - authz_user # autenticación basada en nombre de usuario
# - autoindex # deshabilitado, los índices están deshabilitados
- deflate # proporciona compresión Gzip
- dir # proporciona DirectoryIndex
- env # proporciona SetEnv
# - filter # proporciona FilterChain
- headers # proporciona RequestHeader
- mime
- mpm_prefork
- negotiation # gestiona el tipo de contenido
- php7.0
# - proxy
# - proxy_http
# - setenvif
- ssl # Maneja SSL
- socache_shmcb # requerido por mod_ssl
- Virtual host predeterminado 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'
- Redirección permanente simple de HTTP a 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 a 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 con documento raíz y una aplicación 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:
# Content Security Policy (CSP)
#- set Content-Security-Policy "script-src 'self'; object-src 'self'"
# Reducción de riesgos de seguridad de tipo MIME
- set X-Content-Type-Options "nosniff"
# Clickjacking
- set X-Frame-Options "DENY"
# Ataques de scripting cruzado reflejados (XSS)
- set X-XSS-Protection "1; mode=block"
- unset X-Powered-By
- Virtual host HTTPs con documento raíz y una aplicación 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