Limiter Apache pour n'autoriser que l'accès à l'aide de SSL pour certains répertoires

34

J'ai un serveur Apache 2.2 avec un certificat SSL hébergeant plusieurs services qui ne devraient être accessibles que via SSL.

Par exemple, https : //myserver.com/topsecret/ devrait être autorisé, tandis que http : //myserver.com/topsecret/ devrait être refusé ou, dans l'idéal, redirigé vers https. http://myserver.com/public ne devrait pas avoir cette restriction et devrait fonctionner en utilisant http ou https.
La décision d'autoriser / refuser http est prise dans le répertoire de niveau supérieur et affecte tout le contenu situé en dessous.

Existe-t-il une directive pouvant être placée dans la configuration Apache pour restreindre l'accès de cette manière?

DrStalker
la source

Réponses:

38

La directive SSLRequireSSL est ce que vous recherchez.

Au sein de votre <VirtualHost>ou au plus haut niveau si vous n'utilisez pas d'hôtes virtuels:

<Directory /topsecret>
  SSLRequireSSL
</Directory>

Ou dans .htaccess:

SSLRequireSSL
Thomas
la source
1
Bienvenue sur Server Fault! Nous préférons vraiment que les réponses aient un contenu, pas des indicateurs de contenu. Cela peut théoriquement répondre à la question, mais il serait préférable d’inclure ici les parties essentielles de la réponse et de fournir le lien à titre de référence. Merci!
Chris S
8
Ok, j'ai mis à jour mon article de cinq ans avec un exemple :)
Thomas
1
Pour être honnête, âgé de 5 ans ou non, le raisonnement est que le lien que vous indiquez peut disparaître, rendant votre réponse presque totalement ou totalement inutile à quelqu'un qui viendrait chercher l'information plus tard. J'ai donc voté pour votre commentaire sournois (honnête), mais je suis également totalement d'accord pour dire que la réponse devrait avoir un contexte pour rester utile. Surtout que c'est marqué comme la bonne réponse.
Craig
Je ne pense pas que la communauté SO / SF était aussi stricte à propos du "juste un lien" et des réponses "lmgtfy" à l'époque. Mais je suis d'accord une modification rétroactive est logique à tout moment.
Thomas
A quel fichier de configuration ajouterais-je cette instruction?
dan carter
8

Dans la configuration globale, vous pouvez utiliser:

<IfModule mod_rewrite.c>
   RewriteEngine On
   RewriteCond %{HTTPS} !on
   RewriteRule .* https://%{HTTP_HOST}/%{REQUEST_URI} [R=301,L,QSA]
</IfModule>

De même, vous pouvez utiliser un fichier .htaccess dans le premier répertoire de l’arborescence de répertoires sécurisée:

<IfModule mod_rewrite.c>
   RewriteEngine On
   RewriteCond %{HTTPS} !on
   RewriteRule .* https://%{HTTP_HOST}/%{REQUEST_URI} [R=301,L,QSA]
</IfModule>

Ce dernier pourrait également être placé dans une directive directory dans la configuration d'hôte global ou virtuel.

Chris S
la source
La redirection de HTTP vers HTTPS vous ouvre certains types d'attaques MiTM. Juste un avertissement.
Craig
1

Vous pouvez également utiliser le langage côté serveur pour effectuer le traitement à votre place, plutôt que d'utiliser les options de configuration d'Apache (si vous n'avez peut-être pas accès à la configuration du serveur).

Par exemple, avec PHP:

if (!isset($_SERVER['HTTPS'])) {
  // put your redirect here
  header('Location: http://myserver.com/public');
}

(Attention, si vous utilisez ISAPI sur Microsoft IIS, si la requête n'est pas acheminée via HTTPS, la valeur de la variable $ _SERVER ['HTTPS'] sera "off")

Magsol
la source
1

Quelqu'un a mentionné SSLRequireSSL mais je ne pense pas que cela fonctionne par lui-même et je n'ai pas trouvé d'exemple réussi avec cela. La méthode recommandée est https://wiki.apache.org/httpd/RedirectSSL Je l'ai appliqué et cela fonctionne bien!

Robert
la source
0

En supposant que vous utilisez les directives VirtualHost,

Placez une directive Directory dans le virtualhost non-ssl refusant l'accès.

Ensuite, placez une directive Directory dans l'accès virtuel ssl virtualhost.


la source
0

J'ai toujours fait ce mod_rewrite dans un fichier .htaccess, bien que vous devriez pouvoir le faire aussi dans votre fichier de configuration principal.

Voici un guide avec quelques moyens pour y parvenir: Smart HTTP et HTTPS RewriteRule Redirects

Jason Wadsworth
la source