Outils pour utilisateurs

Outils du site


all:bibles:linux:serveur:apache

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
all:bibles:linux:serveur:apache [2024/11/14 16:12] – [Générer un certificat signé par une autorité bidon] omeylhocall:bibles:linux:serveur:apache [2025/02/12 11:09] (Version actuelle) – [Fichier de configuration] omeylhoc
Ligne 1: Ligne 1:
 +====== Apache ======
 +
 +----
 +
 +<note>Les exemples de commandes sont donnés pour Debian/Ubuntu.</note>
 +
 +----
 +
 +===== Installation =====
 +
 +==== Ubuntu ====
 +
 +=== Installation paquet ===
 +
 +<code bash>
 +sudo apt-get install apache2
 +</code>
 +
 +=== Vérification version ===
 +
 +<code bash>
 +apachectl -v
 +</code>
 +
 +==== Redhat/CentOS ====
 +
 +=== Installation paquet ===
 +
 +<code bash>
 +sudo dnf install httpd
 +</code>
 +
 +=== Démarrage / Activation ===
 +
 +<code bash>
 +sudo systemctl start httpd
 +sudo systemctl enable httpd
 +</code>
 +
 +=== Vérification version ===
 +
 +<code bash>
 +httpd -v
 +</code>
 +
 +----
 +
 +[[all:bibles:linux:serveur:apache|Haut de page]]
 +
 +===== Configuration générale apache =====
 +
 +==== Ubuntu ====
 +
 +=== Fichiers/Répertoires ===
 +
 +| /etc/apache2/apache2.conf  | Fichier de configuration générale  |
 +| /etc/apache2/ports.conf  | Fichier contenant les ports à écouter, par défaut 80 (http) et 443 (https)  |
 +| /etc/apache2/sites-available  | Répertoire contenant les fichiers de conf pour les sites disponibles  |
 +| /etc/apache2/sites-enabled  | Répertoire contenant les liens vers fichiers de conf pour les sites activés (par <color #7092be>//a2ensite//</color>) |
 +| /etc/apache2/mods-available  | Répertoire contenant les fichiers de conf des modules Apache disponibles  |
 +| /etc/apache2/mods-enabled  | Répertoire contenant les liens vers les modules Apache activés (par <color #7092be>//a2enmod//</color> |
 +
 +=== Paramètres par défaut ===
 +
 +  * User : www-data
 +  * Group : www-data
 +
 +==== Redhat/CentOS ====
 +
 +=== Fichiers/Répertoires ===
 +
 +| /etc/httpd/conf/httpd.conf  | Fichier de configuration générale  |
 +| /etc/httpd/conf.d  | Répertoire contenant les fichiers de conf pour les sites disponibles  |
 +| /etc/httpd/conf.modules.d  | Répertoire contenant les fichiers de conf avec les modules Apache à charger  |
 +
 +=== Paramètres par défaut ===
 +
 +  * User : apache
 +  * Group : apache
 +
 +=== selinux ===
 +
 +En cas de problème de droits (Erreur 403) vérifier si selinux est activé, vérifier les logs et changer les droits des fichiers :
 +
 +<code bash>
 +sestatus
 +tail -f /var/log/audit/audit.log
 +sudo chcon -R -t httpd_sys_content_t /var/www/html/
 +</code>
 +
 +----
 +
 +[[all:bibles:linux:serveur:apache|Haut de page]]
 +
 +===== Configuration sites web =====
 +
 +<note important>Les fichiers .conf du répertoire <color #00a2e8>/etc/apache2/sites-available</color> sont explorés dans l'ordre alphabétique.</note>
 +
 +==== Exemples ====
 +
 +=== http ===
 +
 +<code apache>
 +<VirtualHost *:80>
 +        ServerName www.site.com
 +        ServerAlias site.com
 +        DocumentRoot "/var/www/html/site"
 +        
 +        ErrorLog ${APACHE_LOG_DIR}/site.error.log
 +        CustomLog ${APACHE_LOG_DIR}/site.access.log combined
 +</VirtualHost>
 +</code>
 +
 +=== https ===
 +
 +<note important>Attention de penser à activer le module ssl avec la commande\\
 +<color #7092be>//sudo a2enmod ssl//</color></note>
 +
 +<code apache>
 +<IfModule mod_ssl.c>
 +        <VirtualHost *:443>
 +                ServerName www.site.com
 +                ServerAlias site.com
 +                DocumentRoot "/var/www/html/site"
 +
 +                ErrorLog ${APACHE_LOG_DIR}/site.error.log
 +                CustomLog ${APACHE_LOG_DIR}/site.access.log combined
 +
 +                SSLEngine on
 +                SSLCertificateFile    /etc/ssl/certs/ssl-cert-snakeoil.pem
 +                SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
 +        </VirtualHost>
 +</IfModule>
 +</code>
 +
 +==== Sécurisation ====
 +
 +=== Redirection du http sur le https ===
 +
 +<code apache>
 +<VirtualHost *:80>
 +        ServerName www.site.com
 +        
 +        ErrorLog ${APACHE_LOG_DIR}/site.error.log
 +        CustomLog ${APACHE_LOG_DIR}/site.access.log combined
 +        
 +        Redirect permanent / https://site.com/
 +</VirtualHost>
 +</code>
 +
 +=== Interdire l'accès direct par l'adresse IP ===
 +
 +<code apache>
 +<VirtualHost *:80>
 +        ServerName xxx.xxx.xxx.xxx
 +        <Directory />
 +                Deny from all
 +        </Directory>
 +</VirtualHost>
 +
 +<VirtualHost *:443>
 +        ServerName xxx.xxx.xxx.xxx
 +        <Directory />
 +                Deny from all
 +        </Directory>
 +</VirtualHost>
 +</code>
 +
 +=== VirtualHost par défaut ===
 +
 +Dans l'exemple suivant on bloque l'accès pour les url non prévues.
 +
 +<code apache>
 +<VirtualHost _default_:80>
 +        ErrorLog ${APACHE_LOG_DIR}/default-http.error.log
 +        CustomLog ${APACHE_LOG_DIR}/default-http.access.log combined
 +        <Directory /var/www/html>
 +            Require all denied
 +        </Directory>
 +</VirtualHost>
 +
 +<IfModule mod_ssl.c>
 +    <VirtualHost _default_:443>
 +        ErrorLog ${APACHE_LOG_DIR}/default-https.error.log
 +        CustomLog ${APACHE_LOG_DIR}/default-https.access.log combined
 +
 +        SSLEngine on
 +        SSLCertificateFile    /etc/ssl/certs/ssl-cert-snakeoil.pem
 +        SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
 +        <Directory /var/www/html>
 +            Require all denied
 +        </Directory>
 +    </VirtualHost>
 +</IfModule>
 +</code>
 +
 +==== Commandes ====
 +
 +<code bash>
 +sudo apache2ctl -M                ⇒ liste les modules Apache chargés
 +sudo a2enmod <module>             ⇒ activation module 
 +sudo a2ensite <fichier>           ⇒ activation site 
 +sudo apachectl configtest         ⇒ test de la configuration
 +sudo systemctl reload apache2     ⇒ recharge la configuration Apache
 +sudo systemctl restart apache2    ⇒ redemarre le service Apache 
 +</code>
 +
 +<note tip>En cas de problème penser à vérifier qu'il n'y a pas un firewall qui bloque le flux.</note>
 +
 +----
 +
 +[[all:bibles:linux:serveur:apache|Haut de page]]
 +
 +===== Utilisation SSL =====
 +
 +==== Activation ====
 +
 +=== Ubuntu ===
 +
 +<code bash>
 +sudo a2enmod ssl
 +</code>
 +
 +=== Redhat/CentOS ===
 +
 +<code bash>
 +sudo dnf install mod_ssl
 +</code>
 +
 +==== Double authentification ====
 +
 +Ajouter une directive <color #7092be>//SSLProxyMachineCertificateFile//</color> pour pointer sur le fichier contenant le certificat du client.
 +
 +==== Générer un certificat autosigné ====
 +
 +=== Installer openssl ===
 +
 +  sudo apt-get install openssl
 +
 +=== Générer une clef privée ===
 +
 +<code bash>
 +cd /etc/ssl
 +sudo openssl genrsa -out cle-privee.pem 2048
 +</code>
 +
 +=== Générer une demande de signature de certificat (Certificat Signing Request) ===
 +
 +<code bash>
 +sudo openssl req -new -key cle-privee.pem -out demande-csr.pem
 +</code>
 +  
 +<note important>Attention de bien répondre avec l’URL www.site.com pour le champ «Common Name»</note>
 +
 +=== Visualiser le résultat ===
 +
 +<code bash>
 +openssl req -text -noout -in demande-csr.pem
 +</code>
 +
 +=== Générer le certificat auto-signé pour 365 jours ===
 +
 +<code bash>
 +sudo openssl x509 -req -days 365 -in demande-csr.pem -signkey cle-privee.pem -out certificat.pem
 +</code>
 +  
 +=== Visualiser certificat ===
 +
 +<code bash>
 +openssl x509 -noout -text -in certificat.pem
 +</code>
 +
 +==== Générer un certificat signé par une autorité bidon ====
 +
 +=== Générer la Clé Privée de la CA ===
 +
 +<code bash>
 +openssl genrsa -out ca.key 2048
 +</code>
 +
 +=== Créer un Certificat pour la CA ===
 +
 +<code bash>
 +openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.crt
 +</code>
 +
 +=== Créer la Clé Privée pour le Serveur ===
 +
 +<code bash>
 +openssl genrsa -out serveur.key 2048
 +</code>
 +
 +=== Créer une Demande de Signature de Certificat (CSR) pour le Serveur ===
 +
 +<code bash>
 +openssl req -new -key serveur.key -out serveur.csr
 +</code>
 +
 +<note important>Attention de bien répondre avec l’URL www.site.com ou l'adresse IP pour le champ «Common Name»</note>
 +
 +=== Signer le Certificat du Serveur avec la CA factice ===
 +
 +<code bash>
 +openssl x509 -req -in serveur.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out serveur.crt -days 365 -sha256
 +</code>
 +
 +  * Si besoin de générer un certificat avec SAN (Subject Alternative Names), il suffit d'ajouter l'option **-extfile <fichier.ext>** pour pointer sur un fichier avec les infos :
 +
 +<code>
 +authorityKeyIdentifier=keyid,issuer
 +basicConstraints=CA:FALSE
 +keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
 +subjectAltName = @alt_names
 +[alt_names]
 +IP.1 = 13.36.137.5
 +IP.2 = 10.1.3.23
 +IP.3 = 127.0.0.1
 +DNS.1 = localhost
 +DNS.2 = e2e-r23-ngrfid
 +</code>
 +
 +=== Combiner la Clé Privée et le Certificat du Serveur ===
 +
 +<code bash>
 +cat serveur.key serveur.crt > serveur.pem
 +</code>
 +
 +=== Installer le Certificat CA sur les Clients (si nécessaire) ===
 +
 +Pour que les clients reconnaissent le certificat auto-signé comme "fiable", il faut installer le fichier ca.crt sur chaque client ou application qui se connectera au serveur.
 +
 +<code bash>
 +sudo cp ca.crt /usr/local/share/ca-certificates/
 +sudo update-ca-certificates
 +</code>
 +
 +==== Générer un certificat Let's Encrypt ====
 +
 +=== Installation certbot ===
 +
 +  * Sur Ubuntu 16.04 :
 +
 +<code bash>
 +sudo apt-get install software-properties-common
 +sudo add-apt-repository ppa:certbot/certbot
 +sudo apt-get update
 +sudo apt-get install python-certbot-apache
 +</code>
 +
 +  * Sur Ubuntu 20.04 : 
 +
 +<code bash>
 +sudo snap install core 
 +sudo snap install --classic certbot
 +sudo ln -s /snap/bin/certbot /usr/bin/certbot
 +sudo apt-get install python3-certbot-apache
 +</code>
 +
 +  * Sur Redhat 9
 +
 +<code bash>
 +sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm
 +sudo dnf install certbot python3-certbot-apache
 +</code>
 +
 +=== Génération certificat ===
 +
 +  sudo certbot --apache certonly
 +  
 +<note tip>L'option certonly évite la modification automatique des fichiers de conf. Il faut donc les modifier manuellement pour indiquer les chemins vers les fichiers contenant les clefs.</note>
 +
 +=== Génération certificat pour plusieurs url ===
 +
 +  sudo certbot --apache certonly –d url1,url2,...
 +
 +=== Renouvellement certificat ===
 +
 +  sudo certbot  --standalone  certonly -d url1,url2,...
 +  
 +<note tip>certbot renouvelle automatiquement les certificats à l'aide de la crontab (voir le fichier <color #00a2e8>/etc/cron.d/certbot</color>)</note>
 +
 +=== Liste ===
 +
 +  sudo certbot certificates
 +
 +=== Suppression ===
 +
 +  sudo certbot delete --cert-name <nom>
 +
 +=== Laisser le port 80 fermé ===
 +
 +Pour ne pas laisser le port 80 ouvert :
 +
 +  * Supprimer la ligne Listen 80 du fichier /etc/apache2/ports.conf
 +  * ajouter l'option <nowiki>--standalone</nowiki> à la commande certbot pour qu'il gère lui-même le port 80
 +
 +<code bash>
 +sudo certbot -q renew --dry-run --standalone
 +</code>
 +
 +==== Vérification connexion SSL ====
 +
 +<code bash>
 +openssl s_client -connect @IP:port
 +</code>
 +
 +==== Vérification expiration certificat ====
 +
 +Il est possible d'utiliser le script [[https://github.com/Matty9191/ssl-cert-check|ssl-cert-check]] pour vérifier l'expiration des certificats.
 +
 +=== Vérification certificat local ===
 +
 +<code bash>
 +ssl-cert-check -d /etc/letsencrypt/live/*/*.pem
 +</code>
 +
 +=== Vérification certificat site distant ===
 +
 +<code bash>
 +ssl-cert-check -n -p 443 -s <url>
 +</code>
 +
 +----
 +
 +[[all:bibles:linux:serveur:apache|Haut de page]]
 +
 +===== Sécurisation des entêtes http =====
 +
 +==== Source ====
 +
 +[[https://geekflare.com/http-header-implementation/]]\\
 +[[https://developers.google.com/web/fundamentals/security/csp]]\\
 +[[https://developer.mozilla.org/fr/docs/Web/HTTP/Headers]]
 +
 +==== Paramètres ====
 +
 +=== Strict-Transport-Security ===
 +
 +Force la communication en utilisant HTTPS au lieu de HTTP.
 +
 +=== X-Frame-Options ===
 +
 +Indique si le navigateur est autorisé à afficher une page dans un <frame>, <iframe> ou <object>.
 +
 +  * DENY : interdiction complète
 +  * SAMEORIGIN : autorise uniquement depuis le même site
 +  * ALLOW-FROM : autorise depuis un site donné
 +
 +=== X-Content-Type-Options ===
 +
 +Désactive le repérage MIME et force le navigateur à utiliser le type donné dans Content-Type.
 +
 +=== X-XSS-Protection ===
 +
 +Active le filtrage de script intersite.
 +
 +=== Content-Security-Policy ===
 +
 +Contrôle les ressources que l'agent utilisateur est autorisé à charger pour une page donnée.
 +
 +Paramètres :
 +
 +  * default-src : valeur par défaut des directives de récupération qui ne sont pas définies explicitement.
 +  * script-src : sources valides pour les fichiers JavaScript.
 +  * img-src : sources valides pour les images et les favicons.
 +  * media-src : sources valides pour les ressources média des éléments <audio> et <video>.
 +  * frame-src : sources valides pour les éléments qui représentent des contextes de navigation imbriqués, tels que <frame> et <iframe>.
 +  * font-src : sources valides pour les polices de caractères chargées depuis @font-face.
 +  * style-src : sources valides pour les feuilles de styles.
 +
 +Valeurs :
 +  * 'self' : uniquement depuis le même site
 +  * 'unsafe-inline' : à éviter
 +  * 'unsafe-eval' : à éviter
 +  * data:  : à éviter
 +  * domaine.xx : uniquement depuis un domaine
 +  * *.domaine.xx : depuis tous les sous domaines
 +  * %%https://domaine.xx%% : uniquement en https depuis le domaine
 +  * %%https://*.domaine.xx%% : uniquement en https depuis tous les sous domaines
 +  
 +=== X-Permitted-Cross-Domain-Policies ===
 +
 +Spécifie si un fichier de règlementation interdomaines (crossdomain.xml) est autorisé. Ce fichier peut définir une règle pour accorder aux clients (comme Adobe Flash Player, Adobe Acrobat, Microsoft Silverlight ou Apache Flex) la permission de gérer des données entre domaines qui seraient autrement restreintes à cause de Same-Origin Policy.
 +
 +=== Referrer-Policy ===
 +
 +Indique quelles informations de provenance envoyées dans l'en-tête Referer doivent être incluses dans les requêtes effectuées.
 +
 +=== Expect-CT ===
 + 
 +Permet de contrôler de manière stricte ou non l'adhérence aux règles de transparence des certificats, permettant ainsi de limiter les utilisations frauduleuses du certificat associé au site grâce à une vérification publique.
 +
 +==== Implémentation ====
 +
 +<code bash>
 +sudo a2enmod headers
 +sudo systemctl reload apache2
 +</code>
 +
 +<code apache>
 +Header always set Strict-Transport-Security "max-age=15552001; includeSubDomains;"
 +Header always append X-Frame-Options SAMEORIGIN
 +Header set X-Content-Type-Options nosniff
 +Header set X-XSS-Protection "1; mode=block"
 +Header set Content-Security-Policy "default-src 'self' 'unsafe-inline' *.lab.acs.altran.fr; script-src 'self' 'unsafe-inline' 'unsafe-eval' *.lab.acs.altran.fr"
 +Header set X-Permitted-Cross-Domain-Policies "none"
 +Header set Referrer-Policy "no-referrer"
 +Header set Expect-CT 'enforce, max-age=43200'
 +</code>
 +
 +==== Debug====
 +
 +Pour trouver ce qui cloche lorsque la page ne s'affiche plus correctement, utiliser les outils de developpement Web du navigateur (Appuyer sur les touches <key>Ctrl</key><key>Shift</key><key>I</key>).
 +
 +<note tip>Ne pas oublier de vider le cache du navigateur si les modifications ne semble pas prises en compte.</note>
 +
 +==== Vérification ====
 +
 +  * [[https://gf.dev/secure-headers-test]]
 +  * [[https://observatory.mozilla.org/]]
 +  * [[https://www.ssllabs.com/ssltest/]]
 +
 +----
 +
 +[[all:bibles:linux:serveur:apache|Haut de page]]
 +
 +===== Restriction d'accès =====
 +
 +==== Directives ====
 +
 +<code apache>
 +<Directory /var/www/html>
 +    AuthName 'Private'
 +    AuthType Digest
 +    AuthDigestDomain /
 +    AuthDigestProvider file
 +    AuthUserFile /var/www/data/.htdigest
 +    Require valid-user
 +</Directory>
 +
 +</code>
 +
 +==== Activation auth_digest ====
 +
 +  sudo a2enmod auth_digest
 +
 +==== Création fichier htdigest ====
 +
 +  htdigest -c /var/www/data/.htdigest 'Private' 'vfc-training'
 +
 +----
 +
 +[[all:bibles:linux:serveur:apache|Haut de page]]
 +
 +===== Reverse Proxy =====
 +
 +==== Module supplémentaires ====
 +
 +<code bash>
 +sudo a2enmod proxy proxy_http
 +</code>
 +
 +==== Fichier de configuration ====
 +
 +<code apache>
 +<IfModule mod_ssl.c>
 +        # site avec 2 chemins d'accès vers 2 machines différentes   
 +        <VirtualHost *:443>
 +                ServerName site.fr
 +                ErrorLog ${APACHE_LOG_DIR}/site.error.log
 +                CustomLog ${APACHE_LOG_DIR}/site.access.log combined
 +
 +                ProxyPreserveHost On
 +                ProxyRequests Off
 +                ProxyVia Off
 +                ProxyPass /chemin1 https://@IP1:port1/
 +                ProxyPassReverse /chemin1 https://@IP1:port1
 +                ProxyPass /chemin2 https://@IP2:port2/
 +                ProxyPassReverse /chemin2 https://@IP2:port2
 +
 +                SSLEngine on
 +                SSLCertificateFile    /etc/ssl/certs/ssl-cert-snakeoil.pem
 +                SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
 +                SSLProxyEngine On
 +                SSLProxyCheckPeerCN Off
 +                SSLProxyCheckPeerName Off
 +                SSLProxyCheckPeerExpire off
 +                SSLProxyVerify none
 +        </VirtualHost>
 +        # websocket avec rewrite
 +        <VirtualHost *:443>
 +                ServerName domaine2.fr
 +                ErrorLog ${APACHE_LOG_DIR}/domaine2.error.log
 +                CustomLog ${APACHE_LOG_DIR}/domaine2.access.log combined
 + 
 +                ProxyPreserveHost On
 +                ProxyRequests Off
 +                ProxyVia Off
 +                ProxyPass / https://xxx.xxx.xxx.xxx:port2/
 +                ProxyPassReverse / https://xxx.xxx.xxx.xxx:port2/
 + 
 +                RewriteEngine On
 +                RewriteCond %{HTTP:Upgrade} =websocket [NC]
 +                RewriteRule ^/(.*)    wss://xxx.xxx.xxx.xxx:port2/$1 [P,L]
 + 
 +                SSLEngine on
 +                SSLCertificateFile    /etc/ssl/certs/ssl-cert-snakeoil.pem
 +                SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
 +                SSLProxyEngine On
 +                SSLProxyCheckPeerCN Off
 +                SSLProxyCheckPeerName Off
 +                SSLProxyCheckPeerExpire off
 +                SSLProxyVerify none
 +        </VirtualHost>        
 +</IfModule>
 +</code>
 +
 +<note tip>La redirection vers le serveur n'est pas obligatoirement en https (si dans le cadre d'un réseau interne). Le tunnel crypté peut s'arrêter au reverse proxy.</note>
 +
 +==== Dépannage ====
 +
 +=== [proxy:error] Permission denied: AH00957 ===
 +
 +Sur Redhat SELinux bloque la connexion, il faut passer la commande suivante :
 +
 +<code bash>
 +sudo setsebool -P httpd_can_network_connect 1
 +</code>
 +
 +----
 +
 +[[all:bibles:linux:serveur:apache|Haut de page]]