03-comment-je-travaille/guides/dsn-ovh.md

DNS OVH - Sous-domaines (Ubuntu + Apache)

Objectif : mettre en place des sous-domaines sur un VPS OVH avec Ubuntu + Apache + Symfony, en visant un certificat wildcard et des logs exploitables.

Périmètre technique

  • Ubuntu (voir inputs/legacy/deployment.md)
  • Apache 2.4 + PHP-FPM
  • Certbot (Let's Encrypt)

1) DNS OVH (minimum)

  • A @ -> IPv4 du VPS
  • AAAA @ -> IPv6 du VPS (si dispo)
  • A * -> IPv4 du VPS (wildcard)
  • AAAA * -> IPv6 du VPS (wildcard, si dispo)

Notes :

  • Le wildcard ne couvre pas le domaine racine. Le record @ reste obligatoire.
  • Un record explicite (ex: api) est prioritaire sur le wildcard.
  • Si un sous-domaine doit pointer ailleurs, crĂ©ez un enregistrement explicite dans le DNS.

Nettoyage DNS (OVH)

Objectif : éviter les doublons quand le wildcard est en place.

Vous pouvez supprimer les enregistrements explicites qui ne font que dupliquer le wildcard, par exemple :

  • www A/AAAA (dĂ©jĂ  couvert par *)
  • www TXT de redirection OVH (type 1|... ou 3|...)

Garder :

  • les MX / SPF / DMARC
  • ownercheck (validation OVH)

2) Stratégie Apache (vhosts)

Mix recommandé

  • Vhost principal : telaria.dev + doc.telaria.dev + help.telaria.dev (mĂŞme activation).
  • Vhost dĂ©diĂ© : api.telaria.dev (activable/dĂ©sactivable via a2ensite/a2dissite).
  • Vhost wildcard : capte les sous-domaines non dĂ©clarĂ©s (logs centralisĂ©s).

Le wildcard sert de filet de sécurité : tous les sous-domaines exotiques tomberont dans ses logs.

Exemple (vhosts)

Convention recommandée : un fichier par vhost dans /etc/apache2/sites-available/. Possible de mettre plusieurs vhosts dans un seul fichier, mais cela désactive/active tout le bloc d'un coup.

  1. Domaine racine + sous-domaines “inclus”
# /etc/apache2/sites-available/telaria.dev.conf
<VirtualHost *:80>
  ServerName telaria.dev
  ServerAlias doc.telaria.dev help.telaria.dev
  RewriteEngine On
  RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</VirtualHost>

<VirtualHost *:443>
  ServerName telaria.dev
  ServerAlias doc.telaria.dev help.telaria.dev
  DocumentRoot /var/www/codexia/public

  <Directory /var/www/codexia/public>
    AllowOverride None
    Require all granted
    FallbackResource /index.php
  </Directory>

  <FilesMatch \.php$>
    SetHandler proxy:unix:/var/run/php/php8.5-fpm.sock|fcgi://telaria.dev
  </FilesMatch>

  SSLEngine on
  SSLCertificateFile /etc/letsencrypt/live/telaria.dev/fullchain.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/telaria.dev/privkey.pem

  ErrorLog ${APACHE_LOG_DIR}/telaria.dev-error.log
  CustomLog ${APACHE_LOG_DIR}/telaria.dev-access.log combined
</VirtualHost>
  1. Wildcard (catch-all)
# /etc/apache2/sites-available/wildcard.telaria.dev.conf
<VirtualHost *:80>
  ServerName wildcard.telaria.dev
  ServerAlias *.telaria.dev
  RewriteEngine On
  RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</VirtualHost>

<VirtualHost *:443>
  ServerName wildcard.telaria.dev
  ServerAlias *.telaria.dev
  DocumentRoot /var/www/codexia/public

  <Directory /var/www/codexia/public>
    AllowOverride None
    Require all granted
    FallbackResource /index.php
  </Directory>

  <FilesMatch \.php$>
    SetHandler proxy:unix:/var/run/php/php8.5-fpm.sock|fcgi://wildcard.telaria.dev
  </FilesMatch>

  SSLEngine on
  SSLCertificateFile /etc/letsencrypt/live/telaria.dev/fullchain.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/telaria.dev/privkey.pem

  ErrorLog ${APACHE_LOG_DIR}/wildcard-error.log
  CustomLog ${APACHE_LOG_DIR}/wildcard-access.log combined
</VirtualHost>
  1. Sous-domaine avec logs dédiés (ex: api)
# /etc/apache2/sites-available/api.telaria.dev.conf
<VirtualHost *:80>
  ServerName api.telaria.dev
  RewriteEngine On
  RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</VirtualHost>

<VirtualHost *:443>
  ServerName api.telaria.dev
  DocumentRoot /var/www/codexia/public

  <Directory /var/www/codexia/public>
    AllowOverride None
    Require all granted
    FallbackResource /index.php
  </Directory>

  <FilesMatch \.php$>
    SetHandler proxy:unix:/var/run/php/php8.5-fpm.sock|fcgi://api.telaria.dev
  </FilesMatch>

  SSLEngine on
  SSLCertificateFile /etc/letsencrypt/live/telaria.dev/fullchain.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/telaria.dev/privkey.pem

  ErrorLog ${APACHE_LOG_DIR}/api.telaria.dev-error.log
  CustomLog ${APACHE_LOG_DIR}/api.telaria.dev-access.log combined
</VirtualHost>

Activer les sites :

sudo a2ensite telaria.dev.conf
sudo a2ensite wildcard.telaria.dev.conf
sudo a2ensite api.telaria.dev.conf
sudo systemctl reload apache2

3) Logs par sous-domaine

Un vhost par sous-domaine, avec ses propres CustomLog/ErrorLog. Le vhost wildcard sert de filet et centralise tous les sous-domaines exotiques.

Note : %v ajoute le nom du vhost dans la ligne, mais ne crée pas un fichier par sous-domaine.

4) Certificat wildcard (DNS-01 OVH)

Principe : un seul certificat pour telaria.dev + *.telaria.dev.

  1. Installer le plugin DNS OVH
sudo apt install python3-certbot-dns-ovh
  1. Créer les credentials OVH
# /etc/letsencrypt/ovh.ini
# Valeurs a creer dans l'API OVH (tokens)
dns_ovh_endpoint = ovh-eu
# dns_ovh_application_key = ...
# dns_ovh_application_secret = ...
# dns_ovh_consumer_key = ...
sudo chmod 600 /etc/letsencrypt/ovh.ini
  1. Demander le certificat
sudo certbot certonly --dns-ovh --dns-ovh-credentials /etc/letsencrypt/ovh.ini \
  -d telaria.dev -d "*.telaria.dev"
  1. Pointer Apache vers /etc/letsencrypt/live/telaria.dev/ (voir vhosts ci-dessus)

Renouvellement :

sudo certbot renew --dry-run

5) Port 80 (HTTP)

  • RecommandĂ© de garder le port 80 ouvert pour rediriger vers HTTPS.
  • NĂ©cessaire si vous utilisez la validation HTTP-01.
  • Vous pouvez fermer le port 80 si vous acceptez des erreurs HTTP et si la gestion de certificats est 100% DNS-01.

6) HSTS et sécurité des sous-domaines

  • HSTS ne s'applique qu'après une première visite HTTPS (ou preload).
  • Avec DNS + vhost wildcard, imposez une allowlist cĂ´tĂ© Symfony (trusted hosts).
  • Objectif : permissif au niveau serveur, restrictif au niveau applicatif.

Exemple (Symfony, allowlist stricte) :

# config/packages/framework.yaml
framework:
  trusted_hosts:
    - '^codexia\\.dev$'
    - '^api\\.codexia\\.dev$'
    - '^doc\\.codexia\\.dev$'
    - '^help\\.codexia\\.dev$'

Conseil : pour les sous-domaines inconnus, renvoyer 404/421 et journaliser.

7) Vérifications rapides

sudo apachectl -t -D DUMP_VHOSTS
curl -I https://api.telaria.dev
curl -I http://api.telaria.dev

Assistant documentaire

Posez une question sur la documentation. Les réponses citent leurs sources — un clic ouvre le document à gauche.

Loading…
Loading the web debug toolbar…
Attempt #