2009-02-20 10 views
16

Básicamente, mi caso es que tengo un sitio web interno que requiere un nombre de usuario y contraseña únicos para acceder (y esto no puede apagado, solo cambiado). Estoy exponiendo este sitio web a través de un proxy inverso por varias razones (ocultar el puerto, simplificar la URL, simplificar NAT, etc.).Apache2 Reverse Proxy a un punto final que requiere BasicAuth pero quiere ocultarlo del usuario

Sin embargo, lo que me gustaría hacer es ser capaz de utilizar Apache para manejar la autenticación de forma que:

  1. no tengo para dar a conocer sola contraseña para todos
  2. puedo tener múltiples nombres de usuario y contraseñas usando BasicAuth
  3. de Apache para los usuarios internos, no tiene que pedir una contraseña

EDIT: Segunda parte acerca de la autenticación más rico se ha trasladado a new question

Aquí hay más o menos lo que tengo ahora:

<VirtualHost *:80> 
    ServerName sub.domain.com 

    ProxyPass  /http://192.168.1.253:8080/endpoint 
    ProxyPassReverse/http://192.168.1.253:8080/endpoint 

    # The endpoint has a mandatory password that I want to avoid requiring users to type 
    # I.e. something like this would be nice (but does not work) 

    # ProxyPass  /http://username:[email protected]:8080/endpoint 
    # ProxyPassReverse/http://username:[email protected]:8080/endpoint 

    # Also need to be able to require a password to access proxy for people outside local subnet 
    # However these passwords will be controlled by Apache using BasicAuth, not the ProxyPass endpoint 

    # Ideas? 
</VirtualHost> 

Respuesta

20

añadir ni sobrescribir el encabezado de autorización antes de pasar cualquier solicitud a la punto final El encabezado de autorización puede ser codificado, es solo una codificación de base 64 de la cadena "nombre de usuario: contraseña" (sin las comillas).

Habilite el módulo mod_headers si aún no lo ha hecho.

RequestHeader set Authorization "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==" 

Para realizar esto condicionalmente, habilite el mod_setenvif, p. Todavía pedir la contraseña maestra en el caso de las solicitudes locales:

SetEnvIf Remote_Addr "127\.0\.0\.1" localrequest 
RequestHeader set Authorization "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==" env=!localrequest 

Ejemplo

# ALL remote users ALWAYS authenticate against reverse proxy's 
# /www/conf/passwords database 
# 
<Directory /var/web/pages/secure> 
    AuthBasicProvider /www/conf/passwords 
    AuthType Basic 
    AuthName "Protected Area" 
    Require valid-user 
</Directory> 

# reverse proxy authenticates against master server as: 
# Aladdin:open sesame (Base64 encoded) 
# 
RequestHeader set Authorization "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==" 
+0

Esto parece prometedor, pero no quiero pedir la contraseña MASTER si no son solicitudes locales, quiero que apache mantenga una lista básica de autenticación Auth y permita a los usuarios autenticar con una de varias contraseñas diferentes que el endpoint nunca ver. Esto no hace eso afaik verdad? –

+0

Simplemente use la primera variante (incondicional, es decir, sin SetEnvIf y 'localrequest'), es decir, 'RequestHeader set Authorization' Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ == ''.El proxy inverso siempre se autenticará con la contraseña maestra, y los usuarios siempre usarán las otras contraseñas para conectarse al RP. – vladr

+0

Intenté su sugerencia original utilizando SetEnvIf y tratando de hacer funcionar BasicAuth y no tuve éxito de ninguna manera. Puedo deshabilitar la contraseña a través del proxy por completo, pero no de forma condicional según el tipo de solicitud. –

3

Bueno usé su ejemplo para apuntar a dos cámaras IP usando apache proxypass. Cuando utilicé el usuario sintaxis: [email protected] y se accede a través de un iPhone Tengo un mensaje de seguridad de Safari (navegador de iPhone) así que cambié el ejemplo de trabajar bien con y iPhone 4S

<Location /camarafeliz1/ > 
     # usuario admin password 123456 
     ProxyPass   http://192.168.0.39/ 
     ProxyPassReverse http://192.168.0.39/ 
     RequestHeader set Authorization "Basic YWRtaW46MTIzNDU2==" 
</Location> 
<Location /camarafeliz3/ > 
     # usuario admin password 123456 
     ProxyPass   http://192.168.0.99/ 
     ProxyPassReverse http://192.168.0.99/ 
     RequestHeader set Authorization "Basic YWRtaW46MTIzNDU2==" 
</Location> 

y el iPhone 4s dejó de quejarse de la seguridad debido al usuario y la contraseña en el enlace.

Cuestiones relacionadas