Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

Fernando Barbosa

January 20, 2020
Tweet

More Decks by Fernando Barbosa

Other Decks in Technology

Transcript

  1. @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?
  2. @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?
  3. // FERNANDO BARBOSA Programador YAML Go | CI/CD | Kubernetes

    | Observability Lead SRE @ QuintoAndar / carreiras.quintoandar.com.br > @fernandrone > [email protected] > fernandrone.com
  4. 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
  5. 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
  6. 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
  7. 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
  8. 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
  9. /database/roles/read1 { token: ... } CREATE USER '{{name}}'@'%' IDENTIFIED BY

    '{{password}}';GRANT SELECT ON *.* TO '{{name}}'@'%'; @fernandrone
  10. { 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
  11. 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
  12. 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
  13. 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!
  14. __ _,--="=--,_ __ / \." .-. "./ \ / ,/

    _ : : _ \/` \ \ `| /o\ :_: /o\ |\__/ `-'| :="~` _ `~"=: | \` (_) `/ .-"-. \ | / .-"-. .---{ }--| /,.-'-.,\ |--{ }---. ) (_)_)_) \_/`~-===-~`\_/ (_(_(_) ( ( Hora da ) ) DEMO ( '--------------------------------------' @fernandrone
  15. @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}}'@'%';"
  16. $ 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
  17. $ 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
  18. $ qli database list -e staging | grep -e 'docx$'

    staging-crud-docx staging-migration-docx staging-readonly-docx staging-root-docx @fernandrone
  19. $ 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
  20. $ 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
  21. 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
  22. 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
  23. • 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
  24. • 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
  25. @fernandrone __ _,--="=--,_ __ / \." .-. "./ \ /

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

    | Observability Lead SRE @ QuintoAndar / carreiras.quintoandar.com.br > @fernandrone > [email protected] > fernandrone.com