Files
computer-playbook/roles/sys-svc-compose/tasks/02_stack_host_prep.yml
kevinveenbirkenbachandClaude Opus 5.5 d89c74feab feat(security): harden PHP services and proxy response headers
Proxy:
- server_tokens off, X-Powered-By stripped from upstream responses,
  HSTS max-age raised to one year.
- No global X-Content-Type-Options: under nosniff, ORB (step 3.4)
  blocks no-cors cross-origin responses typed text/html, e.g. tracking
  beacons answered with an empty 204.

PHP (CVE-2026-109618, CVE-2026-109619):
- New role sys-svc-compose-php installs a shared ini (expose_php Off,
  session.upload_progress.enabled 0, fatal_error_backtraces 0 for
  PHP 8.5, interim memory_limit -1) and a PHP-FPM [www] drop-in
  (pm.max_requests = PHP_FPM_MAX_REQUESTS) once per stack host,
  before 04_files renders any compose file.
- The host file names carry a sha1 prefix of the controller-side
  source, so a content change alters every PHP app's compose.yml and
  recreates it, also on remote deploys where compose_volumes cannot
  read the stack host file and hashes the path instead.
- 20 PHP roles mount the ini as a compose/swarm config into their
  image's scan dir; moodle, nextcloud and shopware also mount the FPM
  drop-in. Magento keeps its own pool: its php-fpm.conf has no
  include= and is rendered without notify.
- Joomla's php-upload.ini now loads as zzz-joomla-uploads.ini so its
  own memory_limit wins: the media API compares Content-Length with
  toBytes(memory_limit) and rejects every upload at -1.

TODOs record the memory_limit revert condition and accepted
trade-offs, Akaunting on PHP 8.1, FusionDirectory on PHP 7.4 and the
public Keycloak admin console.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-21 21:03:38 +02:00

23 lines
765 B
YAML

---
- name: "📁 Create sys-svc-compose dirs (with parents) for '{{ application_id }}'"
file:
path: "{{ item.value }}"
state: directory
mode: "0755"
with_dict: "{{ lookup('container', application_id, 'directories') }}"
- name: "🛡️ Ensure PHP hardening assets are installed"
ansible.builtin.include_role:
name: sys-svc-compose-php
- name: "📂 Include git-repo based installation routines for '{{ application_id }}'."
include_tasks: "03_repository.yml"
when: compose_repository_pull | bool
- name: "📂 Include file management routines for '{{ application_id }}'."
include_tasks: "04_files.yml"
- name: "✅ Ensure CA trust assets are installed (only when needed)"
ansible.builtin.include_role:
name: sys-svc-compose-ca