$30 off During Our Annual Pro Sale. View Details »

You Shall Not Pass - Autenticação na era da Internet

Lucas Santos
February 28, 2019

You Shall Not Pass - Autenticação na era da Internet

Lucas Santos

February 28, 2019
Tweet

More Decks by Lucas Santos

Other Decks in Programming

Transcript

  1. You Shall Not Pass!
    Autenticação em APIs Node.js

    View Slide

  2. Lucas Santos
    /khaosdoctor @_staticvoid
    lsantos.me
    @khaosdoctor
    Lead Solutions Architect

    View Slide

  3. /khaosdoctor @_staticvoid
    lsantos.me
    @khaosdoctor
    obarra.co
    trainingcenter.io
    2018.abcdevelopers.org

    View Slide

  4. O que é a web?

    View Slide

  5. Por definição, a web é um
    lugar aberto

    View Slide

  6. Muito aberto

    View Slide

  7. /khaosdoctor @_staticvoid
    lsantos.me
    @khaosdoctor

    View Slide

  8. Mas isso é bom!

    View Slide

  9. Sempre?

    View Slide

  10. Métodos de
    autenticação
    - Basic
    - Digest
    - One Time Pass (TOTP)
    - Request Signing
    - Cookies
    - OAuth
    - OpenID
    - JWT
    - e mais...

    View Slide

  11. /khaosdoctor @_staticvoid
    lsantos.me
    @khaosdoctor
    O triângulo da autenticação
    Seguro
    Simples Rápido

    View Slide

  12. HTTP Basic
    Authorization
    O modelo mais básico
    - Simples: 5
    - Rápido: 5
    - Seguro: 0

    View Slide

  13. /khaosdoctor @_staticvoid
    lsantos.me
    @khaosdoctor

    View Slide

  14. /khaosdoctor @_staticvoid
    lsantos.me
    @khaosdoctor
    HTTP Basic
    - Autenticação através de um header HTTP chamado Authorization
    - Usuário e senha transmitidos em base64
    - Concatenação das credenciais em username:password

    View Slide

  15. /khaosdoctor @_staticvoid
    lsantos.me
    @khaosdoctor
    HTTP Basic: Fluxo
    Client:
    - Envia uma requisição com o Header
    Authorization: Basic
    - Usuário e senhas em encoding base64
    separados por ":"
    - Inclui o usuário no header após Basic
    - Envia a request
    - Se receber um outro header
    WWW-Authenticate vai chamar um prompt
    para login
    Server:
    - Deve responder com o header
    WWW-Authenticate para logins inválidos

    View Slide

  16. Prós - Muito simples e fácil de
    implementar
    - Funciona como um meio básico

    View Slide

  17. Contras
    - A cada request o usuário e
    senha são enviados
    - Usuário e senha não são
    criptografados
    - Não existe meio de deslogar o
    usuário
    - Não é trivial expirar as
    credenciais
    - Usuário ou senha não podem
    conter ":"
    - Nenhuma segurança se estiver
    em sites HTTP (sem SSL)

    View Slide

  18. HTTP Digest
    Authorization
    O modelo não tão básico
    - Simples: 2
    - Rápido: 0
    - Seguro: 2

    View Slide

  19. /khaosdoctor @_staticvoid
    lsantos.me
    @khaosdoctor

    View Slide

  20. /khaosdoctor @_staticvoid
    lsantos.me
    @khaosdoctor
    HTTP Digest
    - Próximo do HTTP Basic
    - Não envia as credenciais em texto puro
    - Precisa de um Nonce, username, senha, realm produzindo um MD5

    View Slide

  21. /khaosdoctor @_staticvoid
    lsantos.me
    @khaosdoctor
    HTTP Digest: fluxo
    1. Cliente faz uma requisição para o server,
    que responde com 401 e um nonce
    2. Cliente pega o nonce e monta um hash
    MD5(user:realm:password:nonce)
    a. Cliente pode incluir outras
    informações como URI
    b. Cliente pode gerar um nonce
    próprio
    3. Server compara o MD5 enviado com sua
    própria versão gerada com o usuário
    encontrado

    View Slide

  22. Prós
    - Não trafega seus dados em
    texto plano
    - Exige um pouco mais de
    trabalho para conseguir
    credenciais
    - Evita (um pouco) rainbow
    tables, por conta do nonce

    View Slide

  23. Contras
    - Muito demorada se comparada
    com utilização em HTTP do
    Basic
    - Vulnerável a ataques
    Man-in-the-middle
    - Um dos dados sensíveis do
    usuário precisa ser reversível
    - Aumenta o número de requests
    - MD5 não é seguro

    View Slide

  24. Cookies
    Direto do forno
    - Simples: 0
    - Rápido: 1
    - Seguro: 4

    View Slide

  25. /khaosdoctor @_staticvoid
    lsantos.me
    @khaosdoctor

    View Slide

  26. /khaosdoctor @_staticvoid
    lsantos.me
    @khaosdoctor
    Cookies
    - Foi o método padrão de autenticação por muito tempo
    - Armazenamento de sessão do lado do servidor
    - Utilização de cookies para armazenar o ID desta sessão
    - O ID da sessão é enviado a cada request

    View Slide

  27. /khaosdoctor @_staticvoid
    lsantos.me
    @khaosdoctor
    Cookies: fluxo
    1. Aplicação envia um post com usuário e
    senha para o servidor
    2. Servidor autentica usuário e cria uma
    sessão no banco de dados
    3. Servidor envia header Set-Cookie para o
    client com o ID da sessão
    4. Todas as requisições subsequentes são
    feitas com o cookie

    View Slide

  28. Prós - Não trafega credenciais de
    usuários, só o ID da sessão

    View Slide

  29. Contras
    - Armazenado no computador
    - Cria um estado em um
    protocolo Stateless
    - O cookie pode ser roubado
    facilmente
    - Não funciona bem para SPAs
    - Não escala bem no server
    - Requer armazenamento em
    banco de sessões

    View Slide

  30. OAuth
    Para todos os amiguinhos
    - Simples: 0
    - Rápido: 2
    - Seguro: 5

    View Slide

  31. /khaosdoctor @_staticvoid
    lsantos.me
    @khaosdoctor

    View Slide

  32. /khaosdoctor @_staticvoid
    lsantos.me
    @khaosdoctor
    OAuth: Open Authorization Protocol
    - Permite que uma aplicação se autentique em um servidor como se fosse um
    usuário
    - Muito utilizado quando temos que ter terceiros usando nossas APIs (Facebook,
    Twitter)
    - Comum em APIs públicas
    - Delega autorização por escopo

    View Slide

  33. /khaosdoctor @_staticvoid
    lsantos.me
    @khaosdoctor
    OAuth: Fluxo
    - Define 4 papéis:
    - Dono do recurso (usuário)
    - Cliente
    - Servidor de recurso
    - Servidor de autorização
    1. A aplicação solicita autorização
    2. Usuário concede autorização
    3. Aplicação recebe uma concessão
    4. Aplicação requisita um token usando sua
    identidade e a concessão do usuário
    5. Servidor emite um token de acesso
    6. Aplicação usa o token para requisitar
    qualquer dado

    View Slide

  34. Prós
    - Se você é o cliente, a segurança
    é delegada para outra pessoa
    - Autorização por escopo
    - Permissionamento em partes
    pelo usuário
    - Facilidade de acesso de APIs de
    terceiros
    - Uma vez logado, não é
    necessário logar novamente

    View Slide

  35. Contras
    - Se você é o cliente, o sistema de
    autenticação está em poder de
    terceiros
    - Complicada implementação
    - Provedores diferentes possuem
    modelos diferentes de
    autenticação
    - Níveis de privilégios podem
    criar muito overhead na
    aplicação

    View Slide

  36. Autenticações via
    Tokens

    View Slide

  37. Token JWT
    A salvação
    - Simples: 3
    - Rápido: 4
    - Seguro: 5

    View Slide

  38. /khaosdoctor @_staticvoid
    lsantos.me
    @khaosdoctor

    View Slide

  39. /khaosdoctor @_staticvoid
    lsantos.me
    @khaosdoctor
    JWT - JSON Web Token
    - Token leve, mas com toda a informação necessária
    - Mutável, sendo possível adicionar mais dados no login
    - Diminui a quantidade de informação que o servidor precisa buscar
    - Consiste em um cabeçalho, um payload e uma assinatura
    - Enviado através do header Authorization com o tipo Bearer

    View Slide

  40. /khaosdoctor @_staticvoid
    lsantos.me
    @khaosdoctor
    JWT - Fluxo
    1. Usuário requisita o token
    em um POST com suas
    credenciais
    2. Servidor valida e retorna o
    token
    3. A cada requisição o token
    deve ser reenviado

    View Slide

  41. /khaosdoctor @_staticvoid
    lsantos.me
    @khaosdoctor
    JWT Anatomia

    View Slide

  42. /khaosdoctor @_staticvoid
    lsantos.me
    @khaosdoctor
    JWT Anatomia
    Base64(header)
    Base64(payload)
    HMAC(base64(header).base64(payload), secret)

    View Slide

  43. Prós
    - O token é leve
    - Reduz a quantidade de
    chamadas que devem ser feitas
    ao servidor
    - Não é suscetível a Man in the
    Middle
    - Possui todas as informações do
    usuário
    - Extensível
    - Controle de expiração simples
    - Controle de escopo
    - Pode ser usado entre serviços

    View Slide

  44. Contras
    - Dificulta mitigação de XSS
    - Aumenta o tamanho da request
    - Single point of failure no secret
    - Não é possível gerenciar
    clientes a partir do servidor
    - Tamanho do token tende a
    crescer com o tamanho dos
    dados

    View Slide

  45. /khaosdoctor @_staticvoid
    lsantos.me
    @khaosdoctor
    Demo

    View Slide

  46. Passport

    View Slide

  47. Outras formas de
    autenticação

    View Slide

  48. /khaosdoctor @_staticvoid
    lsantos.me
    @khaosdoctor
    OpenID
    - Usa um provedor de identidade para poder validar um usuário
    - "Logar com..."
    - Permite SSO utilizando comunicação entre aplicações

    View Slide

  49. /khaosdoctor @_staticvoid
    lsantos.me
    @khaosdoctor
    OpenID: Fluxo

    View Slide

  50. /khaosdoctor @_staticvoid
    lsantos.me
    @khaosdoctor
    TOTP - Time Based One-time Passwords
    - Senhas de uso único
    - Baseadas em tempo
    - Utilizadas como 2FA
    - Geralmente acessadas em outro dispositivo

    View Slide


  51. /khaosdoctor @_staticvoid
    lsantos.me
    @khaosdoctor
    - https://stackoverflow.com/questions/9534602/what-is-the-difference-between-digest-and-basic-aut
    hentication
    - https://stackoverflow.com/questions/2384230/what-is-digest-authentication
    - https://en.wikipedia.org/wiki/Digest_access_authentication
    - https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication
    - https://blog.risingstack.com/web-authentication-methods-explained/
    - https://medium.com/@vivekmadurai/different-ways-to-authenticate-a-web-application-e8f3875c25
    4a
    - https://www.digitalocean.com/community/tutorials/uma-introducao-ao-oauth-2-pt
    - https://medium.com/trainingcenter/jwt-usando-tokens-para-comunica%C3%A7%C3%A3o-eficiente-
    cf0551c0dd99
    - https://github.com/khaosdoctor/web-authentication-methods
    - https://medium.freecodecamp.org/how-time-based-one-time-passwords-work-and-why-you-should-
    use-them-in-your-app-fdd2b9ed43c3

    View Slide

  52. Obrigado!
    /khaosdoctor @_staticvoid
    lsantos.me
    @khaosdoctor

    View Slide