HTTPS
Todo o tráfego passa pelo Traefik (pch_traefik, portas 80 e 443), que termina o TLS e encaminha para os contentores. Nenhum certificado é gerido à mão.
Certificados
- Fornecidos pela Let's Encrypt (desafio HTTP na porta 80), pedidos automaticamente para cada nome declarado nas etiquetas Traefik dos contentores.
- Renovados automaticamente pelo Traefik; guardados no volume
traefik_letsencrypt(acme.json). - A porta 80 redireciona para 443 para todos os nomes.
Acrescentar um nome de anfitrião: criar o registo DNS primeiro, depois acrescentar a regra Host(...) nas etiquetas do contentor em causa e recriá-lo. Se o Traefik tentou o pedido antes de o DNS existir, serve o seu « TRAEFIK DEFAULT CERT »: docker restart pch_traefik relança o pedido.
O endereço de contacto declarado à Let's Encrypt (opção acme.email no compose) é o do responsável técnico atual; a substituir por um endereço da UCP-PCH na passagem de testemunho.
Nomes servidos
| Servidor | Nome | Para |
|---|---|---|
| Produção | bemba.ucp-pch.org, ucp-pch.org | aplicação (/api, /photos → backend) |
| Produção | mariacare.ucp-pch.org, sig.ucp-pch.org | redirecionamento para bemba.ucp-pch.org |
| Produção | docubemba.ucp-pch.org | documentação |
| Pré-produção | sig-preprod.ucp-pch.org | aplicação |
| Pré-produção | kf/kc/ee.kobo.ucp-pch.org | KoboToolbox (Traefik → nginx do Kobo) |
| Pré-produção | gitlab.ucp-pch.org | GitLab |
Cabeçalhos de segurança
Colocados pelo Nginx do frontend (nginx/frontend.conf):
| Cabeçalho | Valor |
|---|---|
Strict-Transport-Security | um ano, subdomínios incluídos |
Content-Security-Policy | default-src 'self', scripts só do domínio, connect-src limitado ao domínio, ao KoboToolbox e ao Sentry |
X-Frame-Options | SAMEORIGIN |
X-Content-Type-Options | nosniff |
Referrer-Policy | strict-origin-when-cross-origin |
As versões do Nginx e do PHP não são anunciadas (server_tokens off, expose_php Off).
Verificar
curl -sI https://bemba.ucp-pch.org/ | grep -iE "strict-transport|content-security|x-frame"
curl -sv https://bemba.ucp-pch.org/ -o /dev/null 2>&1 | grep -E "issuer|expire date"
Teste externo: SSL Labs (https://www.ssllabs.com/ssltest/).
Conteúdo misto
A aplicação é servida apenas em HTTPS e chama a API por um caminho relativo (/api): nenhuma chamada em HTTP simples é possível a partir do navegador. Um serviço de terceiros em http:// seria de qualquer forma bloqueado pela CSP.