Restrinja Apache para permitir solo el acceso mediante SSL para algunos directorios

34

Tengo un servidor Apache 2.2 con un certificado SSL que aloja varios servicios a los que solo se debe acceder mediante SSL.

es decir: https : //myserver.com/topsecret/ debería permitirse, mientras que http : //myserver.com/topsecret/ debería denegarse o, idealmente, redirigirse a https. http://myserver.com/public no debería tener esta restricción, y debería funcionar usando http o https.
La decisión de permitir / denegar http se toma en el directorio de nivel superior y afecta a todo el contenido que se encuentra debajo.

¿Hay alguna directiva que se pueda colocar en la configuración de Apache para volver a acceder de esta manera?

DrStalker
fuente

Respuestas:

38

La directiva SSLRequireSSL es lo que está buscando.

Dentro de su <VirtualHost>nivel superior o si no está utilizando hosts virtuales:

<Directory /topsecret>
  SSLRequireSSL
</Directory>

O en .htaccess:

SSLRequireSSL
Thomas
fuente
1
¡Bienvenido a Server Fault! Realmente preferimos que las respuestas tengan contenido, no indicadores al contenido. Teóricamente, esto puede responder la pregunta, sin embargo, sería preferible incluir aquí las partes esenciales de la respuesta y proporcionar el enlace para referencia. ¡Gracias!
Chris S
8
Ok, he actualizado mi publicación de cinco años con un ejemplo :)
Thomas
1
Para ser justos, tener 5 años o no, el razonamiento es que el vínculo al que apunta puede desaparecer, haciendo que su respuesta sea totalmente o completamente inútil para alguien que viene a buscar la información más tarde. Así que en realidad voté su comentario sarcástico (honesto), pero también estoy totalmente de acuerdo en que la respuesta debe tener algún contexto para que siga siendo útil. Especialmente porque está marcado como la respuesta correcta.
Craig
No creo que la comunidad SO / SF fuera tan estricta con solo un enlace y las respuestas "lmgtfy" en ese entonces. Pero estoy de acuerdo; una edición retroactiva tiene sentido en cualquier momento.
Thomas
¿A qué archivo de configuración agregaría esa declaración de directiva?
dan carter
8

En la configuración global puede usar:

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

Del mismo modo, podría usar un archivo .htaccess en el primer directorio del árbol de directorios seguro:

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

Ese último también podría colocarse dentro de una directiva de directorio en la configuración de host global o virtual.

Chris S
fuente
Redirigir HTTP a HTTPS te abre a ciertos tipos de ataques MiTM. Solo una advertencia.
Craig
1

Alternativamente, puede usar el lenguaje del lado del servidor para realizar el procesamiento por usted, en lugar de usar las opciones de configuración de Apache (si, tal vez, no tiene acceso a la configuración del servidor).

Por ejemplo, con PHP:

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

(aunque solo tenga en cuenta: si está utilizando ISAPI en Microsoft IIS, si la solicitud no se enruta a través de HTTPS, el valor de la variable $ _SERVER ['HTTPS'] estará "desactivado")

Magsol
fuente
0

Suponiendo que está utilizando las directivas de VirtualHost,

Coloque una directiva de directorio en el host virtual no ssl que niega el acceso.

Luego, coloque una directiva de Directorio en el servidor virtual SSL que otorga acceso.


fuente
0

Siempre he hecho este mod_rewrite en un archivo .htaccess, aunque también deberías poder hacerlo dentro de tu archivo de configuración principal.

Aquí hay una guía con algunas formas de hacer que esto suceda: Smart HTTP y HTTPS RewriteRule Redirects

Jason Wadsworth
fuente