Vault é um gerenciador de segredos, credenciais acesso que possibilita centralizar sua autenticação e autorização.
Podendo ser utilizado como um centralizador de recursos de segurança quando relacionado a provisionamento e gestão de segreddos e credenciais, atuando como um mediador entre um providenciador de identidade e relacionando essa identidade com permissionamento para acesso aos recursos por ele gerenciado.
Por vezes é necessário em um projeto/cliente gerir mais de um ambiente de Cloud ou ainda mesmo Banco de dados. De forma geral quase todas as CLIs de clouds gerenciam credenciais de pelo menos duas formas:
- Arquivo de configuração
- Variáveis de ambientes,
O problema desses formatos é que as credenciais ficam expostas em texto plano, seja no respectivo arquivo de configuração ou ainda no histórico da linha de comando.
Dessa maneira, adversários podem ter acesso a essas credênciais o que pode resultar em um vazamento de informações, provisionamneto de recursos desnecessários, ou alteração/deleção de dados e/ou recursos dos clientes.
O desejavel durante o gerenciamento de credenciais e chaves de acesso é que existam formas de substitui-las de maneira simples gerando o mínimo de impacto nos recursos que as consomem.
Na maioria dos recursos que permitem esse tipo de utilização (como placeholders ou referenciados), são tecnologias intimamente ligadas a plataforma que habilitam essa utilização. e.g. AWS KMS and Secret Manager.
Ainda como um grande problema em empresas de desenvolvimento de soluções para terceiros, é que, em ambientes com alguma complexidade ou burocracia para obtenção de credenciais de acesso, costuma-se presenciar o compartilhamento dessas credenciais, expondo o time que o compartilha a problemas notórios:
- turn over do time integrante do projeto
- super utilização de credenciais
- credenciais genericas e permissivas
Isso dificulta a correta utilização de credenciais com escopos bem definidos, o mapeamento de aplicações que as utilizam e por fim o mais perigoso: antigos membros do projeto com conhecimento dessas credênciais.
Para evitar esse vendor lock-in (ficar preso ao provedor) é recomendado que sejam utilizadas ferramentas, tecnologias, ou técnicas que sejam agnosticas a plataforma. Permitindo assima utilização concorrente ou conjunta e.g. soluções multi-cloud.
Garantir um processo de desenvolvimento com o gerenciamento seguro de segredos e credenciais com provisionamento de escopo reduzido, com menor tempo de duração e com ciclo de vida conhecido.
- Encorajar o desenvolvimento com foco em segurança para o time e cliente
- Habilitar times e equipes a gerirem seus segredos
- Viabilizar a gestão simplificada do uso de ferramentas de segurança
- Expor a ferramentas da Hashicorp para Devs e DevOps
Ao escolher uma ferramenta de gestão de segredos, existem alguns aspectos que devem ser levado em consideração, sendo três destes, principais:
- Técnicas de criptografia suportada.
- API e integrabilidade
- Gestão simplificada
Como representantes da Hashicorp no prosente momento da criação dessa solução, a ferramenta escolhida para viabilizar a gestão e provisionamneto de secredos e credenciais será o Vault.
Instale:
- Vault
- terraform
- jq
- make
Execute a config inicial: make initial_setup
A utilização de SSL e TLS ainda é um problema para diversos desenvolvedores, e pode em muitos momentos complicar o desenvolvimento pelo não entendimento ou ainda a compreensão equivocada de utilização dessa forma de criptografia in transit.
Mesmo com tantos ataques acontecendo e sendo difundidos, diversos de nós arautos da tecnologia ainda insistimos na utilização de protocolos desassegurados, como HTTP puro.
Vault é uma ferramenta de segurança e portanto não faz sentido configura-la para fazer uma acesso inseguro, especialmente no cenário que se propoe esse repositório. Configurar um Vault com um namespace por projeto, ou um por projeto, sendo esse consumido pelos devs.
Autorizar que um snif de rede permita que uma ferramenta robusta como é o vault vaze dados de segurança é uma falha.
Portanto na configuração proposta seguiremos com o mesmo configurado para utilizar TLS e HTTPS.
-dev do Vault, para setups mais robustos favor considerar a documentação oficial da Hashicorp para configurações necessárias.
É possivel conectar o Vault com diversos provedores de Identidade, sejam elas do tipo OIDC, SSO etc.
Abaixo podemos ver um exemplo de como seria a conexão de Vault com openLDAP. A indicação sujerida considera apenas a simplicidade de setup inicial, e apenas é indicado para utilização, caso não seja possivel consumir o AD)
resource "vault_ldap_auth_backend" "ldap" {
path = "local"
url = "ldap://localserver.com:3268"
userdn = "DC=my,DC=com"
userattr = "sAMAccountName"
upndomain = "BLA.COM"
discoverdn = false
groupdn = "DC=my,DC=com"
# groupattr = "cn"
groupfilter = "(&(objectClass=group)(member:1.2.840.113556.1.4.1941:={{.UserDN}}))"
}
resource "vault_ldap_auth_backend_group" "group" {
groupname = "dba"
policies = [vault_policy.admins.name, "default"]
backend = vault_ldap_auth_backend.ldap.path
}< Consult e a documentação >
- Inicialize o Vault Server:
vault operator init - Copie os certificados pro client e export as mesmas variaveis descritas no setup
- Crie um usuário caso não tenha configurado um provedor de identidade
- Faça o deploy da cli:
make deploy_cli - Verifique as configurações no diretorio vault:
cat>>vault/var.auto.tfvars<<EOF
AWS_ACCESS_KEY_ID = ""
AWS_SECRET_ACCESS_KEY = ""
vault_addr = "https://00000"
vault_token = ""
userpass_path = "local"
EOFmake vault_config
Faça login pela CLI e utilize os comandos listados no help da mesma para começar a consumir os valores de segredo e credenciais com TTLs.
provider "vault" {
address = var.vault_addr
# Auth basend on token This can be ajusted
# to use AppRole in a CICD pipeline for example
auth_login {
path = "auth/local/login"
parameters = {
token = var.vault_token
}
}
}
data "vault_aws_access_credentials" "creds" {
type = "sts"
backend = "me"
role = format("me-adm-%s", local.env[var.environment])
}
provider "aws" {
access_key = data.vault_aws_access_credentials.creds.access_key
secret_key = data.vault_aws_access_credentials.creds.secret_key
token = data.vault_aws_access_credentials.creds.security_token
region = var.region
default_tags {
tags = {
Builder = "Terraform"
Department = " Labs"
Application = "Service Name"
Project = "Micro Infra"
Environment = local.environment[var.environment]
CostCenter = "0001 - TI - CORE"
}
}
}
data "vault_generic_secret" "cloudflare" {
path = "cloudflare/credentials"
}
provider "cloudflare" {
account_id = data.vault_generic_secret.cloudflare.data["account_id"]
api_key = data.vault_generic_secret.cloudflare.data["cloudflare_api_key"]
email = data.vault_generic_secret.cloudflare.data["cloudflare_id"]
}