2011-01-07 13 views

Respuesta

13

No directamente. La única forma de hacerlo es tener un método de autenticación que cree una clave (temporal) en el servidor, y luego cambie todos sus métodos para que el primer argumento sea esta clave y que todos ellos generen un error no autenticado. Por ejemplo:

exception NotAuthorisedException { 
    1: string errorMessage, 
} 

exception AuthTimeoutException { 
    1: string errorMessage, 
} 

service MyAuthService { 
    string authenticate(1:string user, 2:string pass) 
     throws (1:NotAuthorisedException e), 

    string mymethod(1:string authstring, 2:string otherargs, ...) 
     throws (1:AuthTimeoutException e, ...), 
} 

Utilizamos este método y salvar nuestras claves para una instancia de memcached asegurada con un tiempo de espera de 30 minutos para las claves para mantener todo "ágil". Se espera que los clientes que reciben un AuthTimeoutException reautoricen y vuelvan a intentar, y tenemos algunas reglas de firewall para detener los ataques de fuerza bruta.

+0

Está enviando las contraseñas en texto claro sobre el alambre? – JensG

+2

@JensG No, le gustaría enviar la contraseña en un formato encriptado y verificar esa cadena codificada del lado del servidor. Bcrypt es bueno para esto, ya que la cadena enviada a través del cable puede no coincidir exactamente con la cadena almacenada, pero cuando se comprueba con el algoritmo bcrypt todavía puede validar. –

+0

Si este es el caso, no enviaría contraseñas de texto claro, pero si un atacante puede leer la contraseña hash, podría reproducir la llamada de autenticación y obtener acceso a sus servicios. – cjungel

1

Las tareas como la autorización y los permisos no se consideran parte de Thrift, principalmente porque estas cosas están (generalmente) más relacionadas con la lógica de la aplicación que con un concepto general de RPC/serialización. Lo único que Thrift admite de inmediato es el TSASLTransport. No puedo decir mucho sobre eso yo mismo, simplemente porque nunca sentí la necesidad de usarlo.

La otra opción podría ser hacer uso de THeaderTransport que lamentablemente en el momento de la escritura solo se implementa con C++. Por lo tanto, si planea usarlo con algún otro idioma, es posible que deba invertir algún trabajo adicional. Huelga decir que aceptamos contribuciones ...

0

Un poco tarde (supongo que es muy tarde) pero modifiqué el código fuente Thrift para esto hace un par de años.

Acabo de enviar un ticket con el parche al https://issues.apache.org/jira/browse/THRIFT-4221 por esto.

Eche un vistazo a eso. Básicamente, la propuesta es agregar un enlace "BeforeAction" que hace exactamente eso.

Ejemplo Golang genera diff

+  // Called before any other action is called 
+  BeforeAction(serviceName string, actionName string, args map[string]interface{}) (err error) 
+  // Called if an action returned an error 
+  ProcessError(err error) error 
} 

type MyServiceClient struct { 
@@ -391,7 +395,12 @@ func (p *myServiceProcessorMyMethod) Process(seqId int32, iprot, oprot thrift.TP 
     result := MyServiceMyMethodResult{} 
     var retval string 
     var err2 error 
-  if retval, err2 = p.handler.MyMethod(args.AuthString, args.OtherArgs_); err2 != nil { 
+  err2 = p.handler.BeforeAction("MyService", "MyMethod", map[string]interface{}{"AuthString": args.AuthString, "OtherArgs_": args.OtherArgs_}) 
+  if err2 == nil { 
+    retval, err2 = p.handler.MyMethod(args.AuthString, args.OtherArgs_) 
+  } 
+  if err2 != nil { 
+    err2 = p.handler.ProcessError(err2) 
Cuestiones relacionadas