ODCTour18 LAD Stateless Microservice Security via JWT and ......JSon Web Tokens (JWT) #RESTSecurity...
Transcript of ODCTour18 LAD Stateless Microservice Security via JWT and ......JSon Web Tokens (JWT) #RESTSecurity...
OD
CTo
ur18
LA
D
#RESTSecurity @otaviojava @tomitribe
Stateless Microservice Security via JWT and MicroProfile
∙ Otávio Santana @otaviojava∙ Tomitribe
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
D Otávio Santana∙Senior Software Engineer at Tomitribe
∙Java Champion & Developer Champion
∙Duke’s Choice Award 2016 y 2017
∙Apache and Eclipse Commiter
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
D
“Lo mejor de los standares es que terminas teniendo muchas opciones por escoger.”
- Andrew S. Tanenbaum
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
D
“Lo mejor de los standares es que terminas teniendo muchas opciones por escogerThe nice
thing about standards is you have so many to choose from.”
- Andrew S. Tanenbaum
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
DOpciones de seguridad para Microservicios● Más allá de Basic Auth
● Teoría de OAuth 2.0
● Introducción a JWT
● Eclipse Microprofile
● Demo
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
DLínea Base
1000 usuariosx 3 TPS 4 saltos
3000 TPSfrontend
12000 TPS
backend
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
D
Basic Auth(y sus problemas)
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
DMensaje en Basic AuthPOST /painter/color/object HTTP/1.1Host: localhost:8443Authorization: Basic c25vb3B5OnBhc3M=User-Agent: curl/7.43.0Accept: */*Content-Type: application/jsonContent-Length: 45
{"color":{"b":255,"g":0,"name":"blue","r":0}}
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
DBasic Auth
Password Sent3000 TPS(HTTP+SSL)
username+passwordBase64 (no auth)
(LDAP)
12000 TPS(HTTP)
3000 TPS
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
DBasic Auth
Password Sent3000 TPS(HTTP+SSL)
username+passwordBase64
username+passwordBase64
15000 TPS(LDAP)
Password Sent12000 TPS(HTTP)
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
DBasic Auth
Password Sent3000 TPS(HTTP+SSL)
username+passwordBase64
Lista Blanca de IP
3000 TPS(LDAP)
12000 TPS(HTTP)
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
D
“Dame toda la información delsalario de José.” “No se quien
eres,…
pero por supuesto!”
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
DAtaque de fuerza bruta: Basic Auth
Passwordválidos3000 TPS
(HTTP+SSL)Lista
Blanca IP
9000 TPS(LDAP)
12000 TPS(HTTP)
Passwordsinválidos6000 TPS
(HTTP+SSL)
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
D
OAuth 2.0(y sus problemas)
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
D
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
D
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
D
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
D
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
DOAuth 2 - Password Grant
(LDAP)
(Repositorio de Token)
Verificación de
Password
Generación deToken
Post /oauth2/tokenHost: api.superbliz.ioUser-Agent: curl/7.43.0Accept: */*Content-Type: application/x-www-form-urlencodedContent-Length: 54grand_type=password&username=snoopy&password=woodstock
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
DOAuth 2 - Password Grant
(LDAP)Verificación
dePassword
Generación deToken
(Repositorio de Token)
Post /oauth2/tokenHost: api.superbliz.ioUser-Agent: curl/7.43.0Accept: */*Content-Type: application/x-www-form-urlencodedContent-Length: 54grand_type=password&username=snoopy&password=woodstock
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
DMensaje OAuth 2.0
POST /painter/color/object HTTP/1.1Host: api.superbiz.ioAuthorization: Bearer 2YotnFZFEjr1zCsicMWpAAUser-Agent: curl/7.43.0Accept: */*Content-Type: application/jsonContent-Length: 45
{"color":{"r":0,"g":0,"b":255,"name":"blue"}}
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
DMensaje OAuth 2.0
POST /painter/color/palette HTTP/1.1Host: api.superbiz.ioAuthorization: Bearer 2YotnFZFEjr1zCsicMWpAAUser-Agent: curl/7.43.0Accept: */*Content-Type: application/jsonContent-Length: 45
{"color":{"r":0,"g":255,"b":0,"name":"green"}}
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
DMensaje OAuth 2.0
POST /painter/color/select HTTP/1.1Host: api.superbiz.ioAuthorization: Bearer 2YotnFZFEjr1zCsicMWpAAUser-Agent: curl/7.43.0Accept: */*Content-Type: application/jsonContent-Length: 44
{"color":{"r":255,"g":0,"b":0,"name":"red"}}
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
DMensaje OAuth 2.0
POST /painter/color/fill HTTP/1.1Host: api.superbiz.ioAuthorization: Bearer 2YotnFZFEjr1zCsicMWpAAUser-Agent: curl/7.43.0Accept: */*Content-Type: application/jsonContent-Length: 49
{"color":{"r":0,"g":255,"b":255,"name":"yellow"}}
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
DMensaje OAuth 2.0
POST /painter/color/stroke HTTP/1.1Host: api.superbiz.ioAuthorization: Bearer 2YotnFZFEjr1zCsicMWpAAUser-Agent: curl/7.43.0Accept: */*Content-Type: application/jsonContent-Length: 49
{"color":{"r":255,"g":200,"b":255,"name":"orange"}}
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
D
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
DOAuth 2 - Refresh Grant
(LDAP)
VerificaciónPassword
GeneraciónToken
(Repositorio de Token)
Post /oauth2/tokenHost: api.superbliz.ioUser-Agent: curl/7.43.0Accept: */*Content-Type: application/x-www-form-urlencodedContent-Length: 54grand_type=password&username=snoopy&password=woodstock
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
DOAuth 2 - Refresh Grant
(LDAP)
VerificaciónPassword
GeneraciónToken
(Repositorio de Token)
Post /oauth2/tokenHost: api.superbliz.ioUser-Agent: curl/7.43.0Accept: */*Content-Type: application/x-www-form-urlencodedContent-Length: 54grand_type=password&username=snoopy&password=woodstock
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
DPar anterior
∙ Access Token 2YotnFZFEjr1zCsicMWpAA
∙ Refresh Token tGzv3JOkF0XG5Qx2TlKWIA
Nuevo Par
∙ Access Token
6Fe4jd7TmdE5yW2q0y6W2w
∙ Refresh Token hyT5rw1QNh5Ttg2hdtR54e
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
DMensaje OAuth 2.0
POST /painter/color/palette HTTP/1.1Host: api.superbiz.ioAuthorization: Bearer 6Fe4jd7TmdE5yW2q0y6W2wUser-Agent: curl/7.43.0Accept: */*Content-Type: application/jsonContent-Length: 46
{"color":{"r":0,"g":255,"b":0,"name":"green"}}
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
DMensaje OAuth 2.0
POST /painter/color/select HTTP/1.1Host: api.superbiz.ioAuthorization: Bearer 6Fe4jd7TmdE5yW2q0y6W2wUser-Agent: curl/7.43.0Accept: */*Content-Type: application/jsonContent-Length: 44
{"color":{"r":255,"g":0,"b":0,"name":"red"}}
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
DMensaje OAuth 2.0
POST /painter/color/fill HTTP/1.1Host: api.superbiz.ioAuthorization: Bearer 6Fe4jd7TmdE5yW2q0y6W2wUser-Agent: curl/7.43.0Accept: */*Content-Type: application/jsonContent-Length: 49
{"color":{"r":0,"g":255,"b":255,"name":"yellow"}}
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
D
¿Qué hemos logrado?
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
D
Ahora tenemos más passwords(al menos tus dispositivos los tienen)
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
DTerminología de nuevo…
∙ Password Grant???
∙ Logging in
∙ Token?
∙ Un password ligeramente ofuscado
∙ Equivalente a un HTTP session ID mejorado levemente
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
DOAuth 2
Request enviados(Authorization: Bearer …)
3000 TPS(HTTP+SSL)
3000 TPS(Verificacione
sde tokens)
Password enviados (post oauth2/token …)
1000/daily(HTTP+SSL)
OAuth 2
(LDAP)
4 saldos12000 TPS
backend
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
D
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
D
“Quién es 6Fe4jd7TmdE5yW2q0y6W2w
???????” “No tengo idea.Pregúntale al servidor de
tokens.”
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
DOAuth 2
Tokens enviados3000 TPS(HTTP+SSL)
3000 TPS(verificación
token)
Password Envidados
1000/daily(HTTP+SSL)
OAuth 2
(LDAP)
12000 TPS
(Verificación token)
8 Saldos
24000 TPSbackend
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
DOAuth 2
3000 TPS(Verificación
token)
(LDAP)
12000 TPS
(Verificacióntoken)
55% del tráfico total
Tokens enviados3000 TPS(HTTP+SSL)
Password Envidados
1000/daily(HTTP+SSL)
OAuth 2
8 Saldos
24000 TPSbackend
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
DOAuth 2
Puntero Puntero
Estado
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
D
Access TokenPuntero de Acceso?
Llave primaria de Acceso?
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
D
OAuth 2.0Algoritmo de intercambio de
passwords de alta frecuencia?
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
D OAuth 2.0+
JSon Web Tokens (JWT)
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
DJSon Web Token
∙ Pronunciado “YOT”∙ JSON map con data de usuario∙ Códificado Base64∙ Firmado digitalmente (RSA-SHA256, HMAC-SHA512, etc)∙ Mecanismo de expiración
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
DPreviamente un Access Token
∙ 6Fe4jd7TmdE5yW2q0y6W2w
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
DAccess Token ahora (JWT)
∙ eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbi10eXBlIjoiYWNjZXNzLXRva2VuIiwidXNlcm5hbWUiOiJzbm9vcHkiLCJhbmltYWwiOiJiZWFnbGUiLCJpc3MiOiJodHRwczovL2RlbW8uc3VwZXJiaXouY29tL29hdXRoMi90b2tlbiIsInNjb3BlcyI6WyJ0d2l0dGVyIiwibWFucy1iZXN0LWZyaWVuZCJdLCJleHAiOjE0NzQyODA5NjMsImlhdCI6MTQ3NDI3OTE2MywianRpIjoiNjY4ODFiMDY4YjI0OWFkOSJ9.DTfSdMzIIsC0j8z3icRdYO1GaMGl6j1I_2DBjiiHW9vmDz8OAw8Jh8DpO32fv0vICc0hb4F0QCD3KQnv8GVM73kSYaOEUwlW0k1TaElxc43_Ocxm1F5IUNZvzlLJ_ksFXGDL_cuadhVDaiqmhct098ocefuv08TdzRxqYoEqYNo
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
DNuevo Access Token∙ header (JSON > Base64 URL Encoded)
∙ Describe como la firma (signature) del token puede ser verificada
∙ payload (JSON > Base64 URL Encoded)∙ Json map de información que desees incluir
∙ Campo estándar como el de Expiración
∙ signature (Binary > Base64 URL Encoded)∙ La firma digital
∙ Hecha exclusivamente por el endpoint: /oauth2/token
∙ Si es RSA puede ser verificado por cualquier persona
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
D∙ { "alg": “RS256", "typ": “JWT" }∙ {
"token-type": "access-token", "username": "snoopy", "animal": "beagle", "iss": "https://demo.superbiz.com/oauth2/token", "scopes": [ “twitter”, "mans-best-friend" ], "exp": 1474280963, "iat": 1474279163, "jti": "66881b068b249ad9"}
∙ DTfSdMzIIsC0j8z3icRdYO1GaMGl6j1I_2DBjiiHW9vmDz8OAw8Jh8DpO32fv0vICc0hb4F0QCD3KQnv8GVM73kSYaOEUwlW0k1TaElxc43_Ocxm1F5IUNZvzlLJ_ksFXGDL_cuadhVDaiqmhct098ocefuv08TdzRxqYoEqYNo
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
D
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
D
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
D
Ligero pero con alto impacto en la arquitectura
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
D
¿Qué tenemos hasta el momento?
(repaso)
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
D
(LDAP) Data completadel usuario desde
ldap
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
D
(LDAP)
Generación deAccess Token
(pointer)
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
D
(LDAP)
Ambos seinsertan en
BD
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
D
(LDAP)
Envío del Access Token (pointer) hacia el cliente
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
D Resultado final
cliente permanece con el Pointer Server almacena State
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
D
¿Qué podemos hacer ahora?(hola JWT!)
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
D
(LDAP) Data completadel usuario desde
ldap
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
D
(LDAP)
La data se representaen JSON
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
D
(LDAP)
JSON es firmadoRSA-SHA 256
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
D
(LDAP)
Se inserta solamente el
pointer en DB
(para revocaciones)
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
D
(LDAP)
Envío del Access Token (estado) hacia el cliente
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
D
Servidor almacena el Puntero
Cliente permanece con el Estado
Resultado obtenido
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
D
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
DOAuth 2 - Password Grant
(LDAP)
(RepositorioToken ID)
VerificaPassword
GeneraToken
Firmado (Signed)
Post /oauth2/tokenHost: api.superbliz.ioUser-Agent: curl/7.43.0Accept: */*Content-Type: application/x-www-form-urlencodedContent-Length: 54grand_type=password&username=snoopy&password=woodstock
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
DOAuth 2 - Password Grant
(LDAP)
VerificaPassword
(RepositorioToken ID)
GeneraToken
Firmado (Signed)
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
DMensaje OAuth 2.0 con JWT
POST /painter/color/palette HTTP/1.1Host: api.superbiz.ioAuthorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbi10eXBlIjoiYWNjZXNzLXRva2VuIiwidXNlcm5hbWUiOiJzbm9vcHkiLCJhbmltYWwiOiJiZWFnbGUiLCJpc3MiOiJodHRwczovL2RlbW8uc3VwZXJiaXouY29tL29hdXRoMi90b2tlbiIsInNjb3BlcyI6WyJ0d2l0dGVyIiwibWFucy1iZXN0LWZyaWVuZCJdLCJleHAiOjE0NzQyODA5NjMsImlhdCI6MTQ3NDI3OTE2MywianRpIjoiNjY4ODFiMDY4YjI0OWFkOSJ9.DTfSdMzIIsC0j8z3icRdYO1GaMGl6j1I_2DBjiiHW9vmDz8OAw8Jh8DpO32fv0vICc0hb4F0QCD3KQnv8GVM73kSYaOEUwlW0k1TaElxc43_Ocxm1F5IUNZvzlLJ_ksFXGDL_cuadhVDaiqmhct098ocefuv08TdzRxqYoEqYNo
User-Agent: curl/7.43.0Accept: */*Content-Type: application/jsonContent-Length: 46{"color":{"b":0,"g":255,"r":0,"name":"green"}}
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
DOAuth 2 + JWT
Tokens enviados
3000 TPS(HTTP+SSL)
0.55 TPS(Verificaciones refresh token)
OAuth 2
(LDAP)
4 saltos12000 TPS
backend
3000 TPS(verifica firma)
12000 TPS(verifica firma)
Password enviados (post oauth2/token …)
1000/daily(HTTP+SSL)
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
D
“No!”
“Dame toda la información delsalario de José.”
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
D
“Claro!”
“Dame toda la información delsalario de José.”
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
DOAuth 2 + JWT
Envío deTokens válidos3000 TPS(HTTP+SSL)
IPwhitelisting
0.55 TPS(verifica refresh token)
Password enviados1000/daily(HTTP+SSL)
(LDAP)
4 saltos12000 TPS
backend
9000 TPS(verifica firma)
12000 TPS(verifica firma)
Token inválidos6000 TPS(HTTP+SSL)
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
D
https://connect2id.com/products/nimbus-jose-jwt
Librería JWT
https://github.com/jwtk/jjwthttps://github.com/auth0/java-jwt
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
D
Eclipse MicroProfile
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
DMicroProfile
∙ Comunidad Open-Source de la fundación Eclipse∙ Enfocada en Microservicios bajo JavaEE∙ Generadora de: Specificaciones, API y TCK.∙ Implementado por diferentes entidades
http://microprofile.io/
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
DMicroProfile JWT
MicroProfile 2.0
JAX-RS 2.1JSON-P 1.1CDI 2.0
Config 1.3
FaultTolerance
1.1
JWTRBAC 1.1
HealthCheck 1.0Metrics 1.1
Open Tracing 1.1
Open API 1.0
Rest Client 1.1
JSON-B 1.0
JWTRBAC 1.1
https://microprofile.io/project/eclipse/microprofile-jwt-auth/
Standares de Seguridad● OAuth 2.0● OpenID Connect● JSON Web Tokens
(JWT)
Tecnologías Java● JAX-RS ● CDI ● JSON-P.
Demo
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
D
#RESTSecurity @otaviojava @tomitribe
OD
CTo
ur18
LA
DMoviefun Diagrama de Despliegue
Gateway
Gracias