seguridad y wsdl
hice un web Service usando jpa, ejb3 y jax-ws en una aplicación empresarial, el web service lo tengo en el proyecto web y de servidor utilizo glassfish, quiero ponerle seguridad a mi web service y la primer cosa que me dijeron que hiciera fue que concatenara en el wsdl la contraseña, yo me lo imagino que es asi "https://path/path/path?wsdl&password="contraseña" pero realmente solo me lo estoy imaginando por que no se, y que en caso de que no lleve el password no se pueda consumir el webservice, espero y alguien me pueda dar una orientación o me pueda pasar un enlace donde venga un ejemplo, y pues de antemano muchas gracias.
- Inicie sesión o regístrese para enviar comentarios
agrega dos campos
Mejor agrega dos campos a los métodos de tu web service: usuario y password ("password" solito no significa nada). Lo primero que debe hacer tu método es validar usuario/password.
Poner un password en el URL es una pésima idea para cualquier tipo de servicio.
pregunto
y valido los campos cada vez que ejecute un WebMethod? o pongo un thread que lo este haciendo siempre? o un Timer Service? o que me recomiendas o me recomiendan los que lean esto, y tengo mas dudas, como si debo usar un web service con estado o sin estado? y la otra donde es mejor que este el web service en el modulo de ejb o en el web?
dudas
entonces cuales son las cosas que debería de cuidar en mi web service para que sea realmente seguro, es que he visto muchas cosas investigando en Internet, llevo dos semana investigando sobre seguridad y pues no encuentro algo concreto donde me digan cuida estas 4 cosas de tu web service usa estos 4 métodos o políticas y tu web service sera totalmente seguro. en ningún lado.
pero de todos modos
pero de todos modos si me pudiera pasar un enlace a una pagina o un tutorial o si solo me dice por donde buscar la forma de hacer lo de pasar esos parámetros con el wsdl y que valide se lo agradecería bastante. mas que todo una orientación.
HTTP Basic Auth
Puesto que JAX-WS está basado en servlets, mi sugerencia es que empieces con basic access authentication.
pues no
La seguridad es un proceso. Es algo que debes integrar en el diseño de tus aplicaciones. Tú quieres una receta "nomás haz estos sencillos 4 pasos y tu app será completamente segura", eso no existe. Si alguien te lo ofrece, es un fraude.
La autenticación más básica que existe es usuario+password. Integra eso en tu servicio, recibiendo esos dos argumentos en tus métodos. Cada vez que alguien invoque el servicio, debes autenticar primero su usuario y password, y solamente continuar si es un usuario válido.
Los web services deben ser stateless. No debes guardar nada de estado en el servicio porque el mismo objeto será utilizado en varias invocaciones simultáneas.
No entiendo cómo quieres validar usuarios en un thread o timer. Es evidente que los validas en cada invocación.
Ponles usuario+password y ponle un certificado a tu web server para habilitar SSL con las opciones de seguridad más recientes (puro TLS, habilitar solamente ciertos algoritmos, etc).
Un web service es un punto de entrada a una aplicación. Es una manera de publicar una API, via web; lo pones en el módulo web y de ahí se comunicará internamente con todo lo que necesitas.
como vez en cuanto seguridad este ejemplo
En otro web service que hice, como tenia que controlar quien se conectaba lo que hice fue que
1.-cuando se conecte a mi web service un nuevo cliente se crea una httpsession la cargo con datos que el mismo cliente envía y esa sesion la guarda en un list.
2.-si el cliente no envía esos datos, no entra.
3.-si el cliente no lo tenemos capturado en un xml donde tenemos a todos los clientes autorizados, tampoco entra.
4.- cada vez que mi cliente invoca un webMethod, se verifica que el cliente siga estando en mi xml y en su session en mi list, si no esta en alguna de las dos el cliente no puede continuar consumiendo el web service.
5.-aparte de eso el cliente envía por la cabecera un usuario y contraseña que se valida al momento de que comienza a consumir el web service el cliente, bueno aquí me imagino que eso también se debería de validar cada vez que el cliente invoque un webmethod de ws.
6.-hicimos una aplicación sencilla que lo que hace es traerme la lista de sesiones mostrármela en una tabla y desde ahí manipular las sesiones de esa lista y permitir o no el consumo de mi web service.
6.-y mi compañero le agrego lo del certificado SSL, pero realmente no sabemos como funciona eso de los certificados solo seguimos los pasos de un tutorial.
coincido con eso, pero ....
si yo también coincido con que enviar la contraseña y el usuario concatenado en el wsdl no es la mejor forma, pero así me lo piden y por alguna razón que no entiendo no lo quieren de otra manera, entonces este web service lo tengo que hacer que reciba esos datos y los valide, yo no haré el cliente solo estoy haciendo el webservice. y pues ojala y me pudieran pasar un ejemplo, un tutorial, un enlace a una pagina donde venga eso o una explicación de como recibir en mi web service esos datos que se concatenaron en el wsdl.
responsabilidad
Pero es tu responsabilidad como programador explicar por qué es un problema de seguridad. Y para eso debes entender por qué lo es. Cuando en el futuro cercano le metan un gol al cliente porque la seguridad del WS está mal hecha, a quién le van a echar la culpa? Van a decir "ah sí bueno es que así lo pedimos entonces ni modo"? O van a decir que es culpa de quien lo haya programado?
Lo que dices de la sesión tampoco suena muy bueno. Cómo validas que la sesión sigue siendo válida? Por la IP de origen? Qué pasa entonces si un atacante logra invocar el WS desde esa IP (o falsifica la IP, sabiendo cuál es la IP de origen de algún cliente legítimo)? Si de todas maneras el cliente envía usuario y password en cada invocación, para qué guardas la sesión? Suena como algo innecesariamente complicado y además superfluo. Elimina todo ese manejo de la sesión en la descripción del servicio que haces y te darás cuenta que todo sigue funcionando igual, la sesión no sirve de nada.
asi lo quieren
bueno los chavos que están desarrollando los clientes no son muy flexibles ellos así lo quieren no lo quieren de otra manera, no les pareció otro tipo de formas como el de que me envíen el password y usuario por la cabecera solo quieren de esa forma, por el wsdl.
y pues la sesion en el otro web service aparte la utilizamos para otras cosas, mi web service tiene que identificar a cada cliente no todos los clientes que se conectan a mi ws entran a la misma base de datos en el mismo servidor y en mi sesion guardo ip y mac address, usuario S.O. , ip del servidor de la bd, nombre de la base de datos y demás cosas.
Re: concatenara en el wsdl la contraseña
Si, a pesar de las recomendaciones, quieres recibir peticiones de tipo
(1), tendrás casi casi que reescribir la implementación de JAX-WS que estés utilizando o crear un servlet que sirva el WSDL y los XSD correspondientes (si aplica) y maneje mensajes SOAP. ¡Menuda tarea! Si terminas, no dudes en compartirnos la experiencia. ¡Ja! :-P
Notas
seguiré buscando
bueno es que para los que estoy haciendo el WS ellos ya tienen otros webService en producción, solo que hechos en php y no se creo que en .net, y así reciben ellos usuario y contraseña en el wsdl y me están pidiendo lo mismo.
suerte
Suerte implementando ese anti-patrón. Como dice jpaul, nos cuentas cómo le hiciste...