====== Apache ====== ---- Les exemples de commandes sont donnés pour Debian/Ubuntu. ---- ===== Installation ===== ==== Ubuntu ==== === Installation paquet === sudo apt-get install apache2 === Vérification version === apachectl -v ==== Redhat/CentOS ==== === Installation paquet === sudo dnf install httpd === Démarrage / Activation === sudo systemctl start httpd sudo systemctl enable httpd === Vérification version === httpd -v ---- [[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 //a2ensite//) | | /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 //a2enmod//) | === 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 : sestatus tail -f /var/log/audit/audit.log sudo chcon -R -t httpd_sys_content_t /var/www/html/ ---- [[all:bibles:linux:serveur:apache|Haut de page]] ===== Configuration sites web ===== Les fichiers .conf du répertoire /etc/apache2/sites-available sont explorés dans l'ordre alphabétique. ==== Exemples ==== === http === 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 === https === Attention de penser à activer le module ssl avec la commande\\ //sudo a2enmod ssl// 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 ==== Sécurisation ==== === Redirection du http sur le https === ServerName www.site.com ErrorLog ${APACHE_LOG_DIR}/site.error.log CustomLog ${APACHE_LOG_DIR}/site.access.log combined Redirect permanent / https://site.com/ === Interdire l'accès direct par l'adresse IP === ServerName xxx.xxx.xxx.xxx Deny from all ServerName xxx.xxx.xxx.xxx Deny from all === VirtualHost par défaut === Dans l'exemple suivant on bloque l'accès pour les url non prévues. ErrorLog ${APACHE_LOG_DIR}/default-http.error.log CustomLog ${APACHE_LOG_DIR}/default-http.access.log combined Require all denied 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 Require all denied ==== Commandes ==== sudo apache2ctl -M ⇒ liste les modules Apache chargés sudo a2enmod ⇒ activation module sudo a2ensite ⇒ 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 En cas de problème penser à vérifier qu'il n'y a pas un firewall qui bloque le flux. ---- [[all:bibles:linux:serveur:apache|Haut de page]] ===== Utilisation SSL ===== ==== Activation ==== === Ubuntu === sudo a2enmod ssl === Redhat/CentOS === sudo dnf install mod_ssl ==== Double authentification ==== Ajouter une directive //SSLProxyMachineCertificateFile// 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 === cd /etc/ssl sudo openssl genrsa -out cle-privee.pem 2048 === Générer une demande de signature de certificat (Certificat Signing Request) === sudo openssl req -new -key cle-privee.pem -out demande-csr.pem Attention de bien répondre avec l’URL www.site.com pour le champ «Common Name» === Visualiser le résultat === openssl req -text -noout -in demande-csr.pem === Générer le certificat auto-signé pour 365 jours === sudo openssl x509 -req -days 365 -in demande-csr.pem -signkey cle-privee.pem -out certificat.pem === Visualiser certificat === openssl x509 -noout -text -in certificat.pem ==== Générer un certificat signé par une autorité bidon ==== === Générer la Clé Privée de la CA === openssl genrsa -out ca.key 2048 === Créer un Certificat pour la CA === openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.crt === Créer la Clé Privée pour le Serveur === openssl genrsa -out serveur.key 2048 === Créer une Demande de Signature de Certificat (CSR) pour le Serveur === openssl req -new -key serveur.key -out serveur.csr Attention de bien répondre avec l’URL www.site.com ou l'adresse IP pour le champ «Common Name» === Signer le Certificat du Serveur avec la CA factice === openssl x509 -req -in serveur.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out serveur.crt -days 365 -sha256 * Si besoin de générer un certificat avec SAN (Subject Alternative Names), il suffit d'ajouter l'option **-extfile ** pour pointer sur un fichier avec les infos : 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 === Combiner la Clé Privée et le Certificat du Serveur === cat serveur.key serveur.crt > serveur.pem === 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. sudo cp ca.crt /usr/local/share/ca-certificates/ sudo update-ca-certificates ==== Générer un certificat Let's Encrypt ==== === Installation certbot === * Sur Ubuntu 16.04 : 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 * Sur Ubuntu 20.04 : 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 * Sur Redhat 9 sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm sudo dnf install certbot python3-certbot-apache === Génération certificat === sudo certbot --apache certonly 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. === Génération certificat pour plusieurs url === sudo certbot --apache certonly –d url1,url2,... === Renouvellement certificat === sudo certbot --standalone certonly -d url1,url2,... certbot renouvelle automatiquement les certificats à l'aide de la crontab (voir le fichier /etc/cron.d/certbot) === Liste === sudo certbot certificates === Suppression === sudo certbot delete --cert-name === 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 --standalone à la commande certbot pour qu'il gère lui-même le port 80 sudo certbot -q renew --dry-run --standalone ==== Vérification connexion SSL ==== openssl s_client -connect @IP:port ==== 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 === ssl-cert-check -d /etc/letsencrypt/live/*/*.pem === Vérification certificat site distant === ssl-cert-check -n -p 443 -s ---- [[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 ,