# ---------------------------------------------------------------------- # OMEGAKUBE — Configuration de sécurité renforcée Apache (.htaccess) # ---------------------------------------------------------------------- # 1. Désactiver l'exploration des répertoires (Directory Browsing) Options -Indexes # 2. Masquer les informations du serveur ServerSignature Off # 3. Restriction d'accès aux fichiers sensibles, cachés et de données # A. Bloquer les fichiers commençant par un point (comme .git, .env, .htaccess) Require all denied Order allow,deny Deny from all # Exception explicite pour le fichier security.txt du dossier .well-known Require all granted Order deny,allow Allow from all # B. Bloquer les extensions sensibles (Configuration, scripts, logs, bases de données) Require all denied Order allow,deny Deny from all # C. Protection intelligente des fichiers .json # On bloque TOUS les .json du serveur par défaut, SAUF ceux situés dans assets/data/ Require all granted Require all denied # Sécurité de secours pour les versions d'Apache très anciennes Order allow,deny Deny from all # 4. Exécution CGI activée par assets/python/.htaccess (plus fiable que FilesMatch racine) # 5. En-têtes de sécurité HTTP (Recommandations Mozilla Observatory) # HSTS (Strict-Transport-Security) : Force l'utilisation du HTTPS pour le domaine et les sous-domaines (durée 1 an) Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" # X-Frame-Options : Interdit le chargement du site dans une iframe (protection Clickjacking) Header always set X-Frame-Options "DENY" # X-Content-Type-Options : Force le navigateur à respecter le type MIME envoyé (protection contre le sniffing de contenu) Header always set X-Content-Type-Options "nosniff" # Referrer-Policy : Ne transmet le referer complet que pour les origines de confiance (HTTPS vers HTTPS interne) Header always set Referrer-Policy "strict-origin-when-cross-origin" # Permissions-Policy : Restreint l'utilisation de fonctionnalités matérielles du navigateur pour la vie privée Header always set Permissions-Policy "geolocation=(), microphone=(), camera=()" # Content-Security-Policy (CSP) : Contrôle les sources d'où le site peut charger ses scripts, styles et médias. Header always set Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' https://unpkg.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com; img-src 'self' https://cdn.discordapp.com data:; frame-src 'self' https://www.youtube.com https://www.youtube-nocookie.com; connect-src 'self'" # X-XSS-Protection : Filtre XSS existant dans les anciens navigateurs (mode blocage actif) Header always set X-XSS-Protection "1; mode=block" # 6. Règles de réécriture d'URL (mod_rewrite) RewriteEngine On # A. Redirection HTTPS automatique et robuste (compatible reverse proxies comme Cloudflare) RewriteCond %{HTTPS} off [OR] RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] # B. Pare-feu applicatif de base (WAF) contre les attaques par injection courantes RewriteCond %{QUERY_STRING} concat.*\( [NC,OR] RewriteCond %{QUERY_STRING} union.*select [NC,OR] RewriteCond %{QUERY_STRING} (<|%3C).*script.*(>|%3E) [NC,OR] RewriteCond %{QUERY_STRING} base64_encode.*\( [NC,OR] RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR] RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2}) RewriteRule ^(.*)$ - [F,L] # C. Redirection des pages inexistantes ou dossiers sans fichier index vers une page 404 personnalisée # Si le fichier demandé n'existe pas RewriteCond %{REQUEST_FILENAME} !-f # Et s'il ne s'agit pas d'un dossier RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^ pages/404.php [L] # Si le dossier demandé n'a aucun fichier d'index valide (index.html ou index.php) RewriteCond %{REQUEST_FILENAME} -d RewriteCond %{REQUEST_FILENAME}/index.html !-f RewriteCond %{REQUEST_FILENAME}/index.php !-f RewriteRule ^ pages/404.php [L] # 7. Pages d'erreur Apache natives (fallback de sécurité si mod_rewrite est absent) ErrorDocument 404 /pages/404.php ErrorDocument 403 /pages/404.php