Pro Yearly is on sale from $80 to $50! »

Segurança de Banco de Dados com Vault

Segurança de Banco de Dados com Vault

Talk sobre Credenciais Dinâmicas (Dynamic Secrets) com Hashicorp Vault.

É possível gerenciar o acesso a bancos de dados para centenas de usuários e aplicações de forma segura e eficiente?

Nessa talk mostro como a ferramenta open-source Vault facilita essa tarefa através de "credenciais dinâmicas". Com ela o QuintoAndar gerencia a autenticação de 170 bancos de dados, onde cada acesso acontece com um usuário e senha temporários! Diariamente, geramos programaticamente cerca de 3000 credenciais únicas, com escopos limitados, reduzindo os riscos de vazamentos e acessos indevidos, além de dar liberdade aos times de SRE, DBA e segurança para focar sua atenção em outras áreas.

Código se encontra no GitHub:

💻 https://github.com/fernandrone/talks/tree/master/vault

D729c66a17c2f385b97bcaeabde2ff16?s=128

Fernando Barbosa

January 20, 2020
Tweet

Transcript

  1. $ segurança de banco de dados com Fernando Barbosa @fernandrone

  2. https://github.com/fernandrone/talks/tree/master/vault @fernandrone

  3. @fernandrone

  4. @fernandrone

  5. @fernandrone 000

  6. @fernandrone Todo mundo realmente precisa de acesso irrestrito a todos

    os bancos?
  7. @fernandrone Todo mundo realmente precisa de acesso irrestrito a todos

    os bancos? Todas as aplicações precisam também de acesso a todos os bancos?
  8. @fernandrone Todo mundo realmente precisa de acesso irrestrito a todos

    os bancos? Todas as aplicações precisam também de acesso a todos os bancos? Como minimizar o impacto no caso de um vazamento ou brecha?
  9. @fernandrone AUTENTICAÇÃO você é quem você diz ser?

  10. @fernandrone AUTENTICAÇÃO você é quem você diz ser? AUTORIZAÇÃO você

    pode mesmo fazer isso?
  11. // FERNANDO BARBOSA Programador YAML Go | CI/CD | Kubernetes

    | Observability Lead SRE @ QuintoAndar / carreiras.quintoandar.com.br > @fernandrone > mail@fdr.one > fernandrone.com
  12. @fernandrone AUTENTICAÇÃO você é quem você diz ser? AUTORIZAÇÃO você

    pode mesmo fazer isso?
  13. app1:pass1 @fernandrone

  14. app1:pass1 app2:pass2 @fernandrone

  15. app1:pass1 app2:pass2 user1:pass1 @fernandrone

  16. app1:pass1 app2:pass2 user1:pass1 user2:pass2 @fernandrone

  17. app1:pass1 app2:pass2 user1:pass1 user2:pass2 app1: GRANT * ON TABLE app1

    app2: GRANT * ON TABLE app2 user1: GRANT SELECT * ON * user2: GRANT * ON * @fernandrone
  18. app1:pass1 app2:pass2 user1:pass1 user2:pass2 app1: GRANT * ON TABLE app1

    app2: GRANT * ON TABLE app2 user1: GRANT SELECT * ON * user2: GRANT * ON * Gerenciar usuário de cada aplicação @fernandrone
  19. app1:pass1 app2:pass2 user1:pass1 user2:pass2 app1: GRANT * ON TABLE app1

    app2: GRANT * ON TABLE app2 user1: GRANT SELECT * ON * user2: GRANT * ON * Gerenciar usuário de cada aplicação Gerenciar usuário de cada colaborador @fernandrone
  20. app1:pass1 app2:pass2 user1:pass1 user2:pass2 app1: GRANT * ON TABLE app1

    app2: GRANT * ON TABLE app2 user1: GRANT SELECT * ON * user2: GRANT * ON * Gerenciar usuário de cada aplicação Gerenciar usuário de cada colaborador Revogar credenciais a cada vazamento ou desligamento @fernandrone
  21. app1:pass1 app2:pass2 user1:pass1 user2:pass2 app1: GRANT * ON TABLE app1

    app2: GRANT * ON TABLE app2 user1: GRANT SELECT * ON * user2: GRANT * ON * Gerenciar usuário de cada aplicação Gerenciar usuário de cada colaborador Revogar credenciais a cada vazamento ou desligamento ou a cada X dias @fernandrone
  22. << CHATO PRA CARAMBA >> @fernandrone

  23. Em vez disso, o que a gente vê acontecer... @fernandrone

  24. @fernandrone Pessoas compartilhando senhas entre times.

  25. @fernandrone Pessoas compartilhando senhas entre times. Senhas chumbadas em aplicações.

  26. @fernandrone Pessoas compartilhando senhas entre times. Senhas chumbadas em aplicações.

    Bancos com um único usuário: ‘root’
  27. O método tradicional de gerenciar credenciais INCENTIVA esse tipo de

    situação! @fernandrone
  28. Como gerenciar credenciais de forma segura sem enlouquecer? @fernandrone

  29. HashiCorp www.vaultproject.io @fernandrone

  30. Vault é uma solução open-source para gerenciamento de segredos @fernandrone

  31. banco chave-valor seguro @fernandrone

  32. banco chave-valor seguro “motor” de credenciais dinâmicas @fernandrone

  33. banco chave-valor seguro “motor” de credenciais dinâmicas @fernandrone

  34. Como o Vault resolve o nosso problema? @fernandrone

  35. @fernandrone

  36. @fernandrone

  37. /auth/kubernetes/login { role: app1, jwt: ... } @fernandrone

  38. /auth/kubernetes/login { role: app1, jwt: ... } Auth Methods @fernandrone

  39. Auth Methods { token: ... } @fernandrone

  40. /database/roles/read1 { token: ... } @fernandrone

  41. /database/roles/read1 { token: ... } @fernandrone

  42. /database/roles/read1 { token: ... } CREATE USER '{{name}}'@'%' IDENTIFIED BY

    '{{password}}';GRANT SELECT ON *.* TO '{{name}}'@'%'; @fernandrone
  43. { username: ..., password: ..., } @fernandrone

  44. { username: ..., password: ..., } Essas credenciais tem um

    TTL!! @fernandrone
  45. { username: ..., password: ..., } Essas credenciais tem um

    TTL!! Sua aplicação pode sempre estender (renovar) o TTL, até um limite máximo de 32 dias* @fernandrone *que pode ser aumentado
  46. E na hora de REVOGAR? @fernandrone

  47. DELETE USER '{{name}}' @fernandrone

  48. Gerenciar usuário de cada aplicação Gerenciar usuário de cada colaborador

    Revogar credenciais a cada vazamento ou desligamento ou a cada X dias @fernandrone
  49. Gerenciar usuário de cada aplicação Gerenciar usuário de cada colaborador

    Revogar credenciais a cada vazamento ou desligamento ou a cada X dias @fernandrone ROLES (papéis) autenticadas por um sistema externo
  50. Gerenciar usuário de cada aplicação Gerenciar usuário de cada colaborador

    Revogar credenciais a cada vazamento ou desligamento ou a cada X dias @fernandrone ROLES (papéis) autenticadas por um sistema externo Todas suas credenciais são temporárias!
  51. __ _,--="=--,_ __ / \." .-. "./ \ / ,/

    _ : : _ \/` \ \ `| /o\ :_: /o\ |\__/ `-'| :="~` _ `~"=: | \` (_) `/ .-"-. \ | / .-"-. .---{ }--| /,.-'-.,\ |--{ }---. ) (_)_)_) \_/`~-===-~`\_/ (_(_(_) ( ( Hora da ) ) DEMO ( '--------------------------------------' @fernandrone
  52. @fernandrone minikube Auth Method

  53. @fernandrone // 2 Perfis --- apiVersion: v1 kind: ServiceAccount metadata:

    name: dev namespace: default --- # Permissões somente de leitura no banco de dados "CREATE USER '{{name}}'@'%' IDENTIFIED BY '{{password}}';GRANT SELECT ON *.* TO '{{name}}'@'%';" --- apiVersion: v1 kind: ServiceAccount metadata: name: app namespace: default --- # Permissões de escrita no banco de dados "CREATE USER '{{name}}'@'%' IDENTIFIED BY '{{password}}';GRANT SELECT, CREATE, INSERT, UPDATE, DELETE, LOCK TABLES, REFERENCES ON *.* TO '{{name}}'@'%';"
  54. https://github.com/fernandrone/talks/tree/master/vault @fernandrone

  55. Como fazemos no QuintoAndar? @fernandrone

  56. @fernandrone pod

  57. @fernandrone RENOVAÇÃO das credenciais pod

  58. @fernandrone RENOVAÇÃO das credenciais pod EKS

  59. @fernandrone 1h (não-renováveis) 6h (renováveis)

  60. @fernandrone AUTENTICAÇÃO você é quem você diz ser? AUTORIZAÇÃO você

    pode mesmo fazer isso?
  61. @fernandrone

  62. 170 bancos de dados gerenciados pelo Vault (entre todos ambientes)

  63. Aproximadamente 2500 credenciais dinâmicas geradas por dia somente para aplicações

    (entre todos ambientes)
  64. $ qli login @fernandrone

  65. $ qli login If your browser doesn't open automatically, go

    to https://<redacted> Successfully logged in! You are authenticated. The token information displayed below is already stored in the token helper. Key Value --- ----- token s.bh5W9x1YwIVsZ3e9Rx token_accessor 1tyKujXB3gcxxMyNYCb token_duration 59m59s token_renewable true token_policies [default] identity_policies [sre dev] @fernandrone
  66. $ qli login If your browser doesn't open automatically, go

    to https://<redacted> Successfully logged in! You are authenticated. The token information displayed below is already stored in the token helper. Key Value --- ----- token s.bh5W9x1YwIVsZ3e9Rx token_accessor 1tyKujXB3gcxxMyNYCb token_duration 59m59s token_renewable true token_policies [default] identity_policies [sre dev] @fernandrone
  67. $ qli database list -e staging | grep -e 'docx$'

    staging-crud-docx staging-migration-docx staging-readonly-docx staging-root-docx @fernandrone
  68. $ qli database get staging-crud-docx LeaseID: database/creds/staging-crud-docx/uoBYyJsGE1ix1rzj LeaseDuration: 3600 password:

    A1a-zklUxCHcl58x username: v-stag-9mbEvSQE3 @fernandrone
  69. $ qli database get staging-crud-docx LeaseID: database/creds/staging-crud-docx/uoBYyJsGE1ix1rzj LeaseDuration: 3600 password:

    A1a-zklUxCHcl58x username: v-stag-9mbEvSQE3 @fernandrone
  70. $ qli database get staging-crud-docx LeaseID: database/creds/staging-crud-docx/uoBYyJsGE1ix1rzj LeaseDuration: 3600 password:

    A1a-zklUxCHcl58x username: v-stag-9mbEvSQE3 @fernandrone Revogado automaticamente em 1h quando expirar o login do usuário
  71. $ qli login If your browser doesn't open automatically, go

    to https://<redacted> Successfully logged in! You are authenticated. The token information displayed below is already stored in the token helper. Key Value --- ----- token s.bh5W9x1YwIVsZ3e9Rx token_accessor 1tyKujXB3gcYiMyNYC0jntRb token_duration 59m59s token_renewable true token_policies [default] identity_policies [sre dev] @fernandrone
  72. PARA SABER MAIS... @fernandrone

  73. HashiCorp Injecting Secrets into Kubernetes Pods via Vault Helm Sidecar.

    Esse documento explica como utilizar o Helm Chart oficial da HashiCorp para injetar segredos (estáticos e dinâmicos) em pods. Esses segredos são injetados como arquivos montados em um volume no container. @fernandrone
  74. utilizar o HashiCorp envconsul! “Envconsul provides a convenient way to

    launch a subprocess with environment variables populated from HashiCorp Consul and Vault. The tool is inspired by envdir and envchain, but works on many major operating systems with no runtime requirements. It is also available via a Docker container for scheduled environments.” @fernandrone
  75. • Hashicorp Kubernetes Reference Architecture. • Seth Vargo Vault on

    GKE (vault 1.2). Seth tem vários tutoriais excelentes sobre como rodar Vault na Google Cloud mas os mais recentes são de 2019. @fernandrone
  76. • Hashicorp Tutorials. • Hashicorp Concepts Seal/Unseal. É um processo

    manual, e pouco cloud-friendly. Felizmente, existe uma AutoUnseal API que suporta diferentes ferramentas de segurança. Por exemplo, veja o guia para AWS KMS. @fernandrone
  77. https://github.com/fernandrone/talks/tree/master/vault @fernandrone

  78. @fernandrone __ _,--="=--,_ __ / \." .-. "./ \ /

    ,/ _ : : _ \/` \ \ `| /o\ :_: /o\ |\__/ `-'| :="~` _ `~"=: | \` (_) `/ .-"-. \ | / .-"-. .---{ }--| /,.-'-.,\ |--{ }---. ) (_)_)_) \_/`~-===-~`\_/ (_(_(_) ( ( MUITO ) ) OBRIGADO ( '--------------------------------------'
  79. // FERNANDO BARBOSA Programador YAML Go | CI/CD | Kubernetes

    | Observability Lead SRE @ QuintoAndar / carreiras.quintoandar.com.br > @fernandrone > mail@fdr.one > fernandrone.com