DEV Community

Privacy by Design no JurisOS: Criptografia AES-256 de Ponta a Ponta com Cloak.Ecto, SQLCipher e Tailscale VPN

O setor jurídico lida diariamente com dados de altíssima sensibilidade: laudos médicos, segredos industriais, estratégias de litígio, dados bancários e informações de identificação pessoal (PII). Desenvolver um sistema como o JurisOS — que opera sob o paradigma Local-First nos desktops de secretárias e advogados — exige incorporar o conceito de Privacy by Design desde a fundação da arquitetura.

Neste artigo, vamos detalhar como construímos uma malha de defesa em profundidade no ecossistema Elixir e BEAM, utilizando criptografia AES-256-GCM tanto em repouso quanto em trânsito, para garantir conformidade rigorosa com legislações de proteção de dados (LGPD, GDPR e CCPA).

1. O Desafio da Conformidade (LGPD, GDPR e CCPA)

As leis modernas de proteção de dados exigem que os sistemas garantam a confidencialidade e a integridade das informações pessoais contra vazamentos, sejam eles acidentais (perda de um notebook) ou maliciosos (ataques de exfiltração).

Para um aplicativo desktop Local-First sincronizado com a nuvem, a superfície de ataque é dupla:

  1. O endpoint local: O disco do computador físico do usuário no escritório.
  2. O transporte e o backend central: A rede por onde os dados trafegam e o banco de dados principal (PostgreSQL) na nuvem.

Para mitigar esses vetores, o JurisOS adota a Separação de Chaves (Key Isolation) em múltiplas camadas.

2. Separação de Chaves: SQLCipher e Cloak.Ecto

Não basta confiar apenas no acesso do usuário ao sistema operacional. Se um dispositivo for furtado, o banco de dados local não pode ser montado e lido por terceiros. Para resolver isso, separamos as responsabilidades de criptografia.

Camada 1: Criptografia de Disco com SQLCipher (SQLCIPHER_KEY)

Na ponta do cliente (o aplicativo desktop empacotado via Burrito), o armazenamento local não é um SQLite padrão, mas sim o SQLCipher. Todo o arquivo .db é cifrado transparentemente utilizando AES-256.
A SQLCIPHER_KEY é gerada no momento do provisionamento da máquina e injetada no ambiente de execução. Isso protege contra ataques físicos: a extração do arquivo do disco resulta em bits indecifráveis sem a chave simétrica correta.

Camada 2: Criptografia de Nível de Campo com Cloak.Ecto (CLOAK_SECRET_KEY)

Enquanto o SQLCipher protege o contêiner físico, o Cloak.Ecto protege o conteúdo lógico. Campos críticos que contêm PII (CPF, RG, históricos médicos) e a própria Transaction Outbox de sincronização recebem uma camada adicional de AES-256-GCM a nível de aplicação.

Isso significa que mesmo um administrador de banco de dados (DBA) acessando a instância central do PostgreSQL na AWS, ou um atacante que consiga realizar um SQL Injection, verá apenas ciphertexts binários, não os dados reais.

defmodule JurisOS.Vault do
  use Cloak.Vault, otp_app: :juris_os

  @impl true
  def init(config) do
    config =
      Keyword.put(config, :aes_gcm,
        tag: "AES.GCM.V1",
        key: decode_key(System.fetch_env!("CLOAK_SECRET_KEY"))
      )

    {:ok, config}
  end

  defp decode_key(key) do
    Base.decode64!(key)
  end
end

defmodule JurisOS.Clientes.EncryptedString do
  use Cloak.Ecto.String, vault: JurisOS.Vault
end
Enter fullscreen mode Exit fullscreen mode

Na definição do Schema Ecto, mapeamos os campos sensíveis usando o nosso tipo customizado:

defmodule JurisOS.Clientes.Cliente do
  use Ecto.Schema
  import Ecto.Changeset

  schema "clientes" do
    field :nome_completo, :string
    field :documento_cpf, JurisOS.Clientes.EncryptedString
    field :dados_medicos, JurisOS.Clientes.EncryptedString

    timestamps()
  end

  # ...
end
Enter fullscreen mode Exit fullscreen mode

A CLOAK_SECRET_KEY fica estritamente na memória da BEAM. Os dados são cifrados antes de gerar o SQL de INSERT/UPDATE e decifrados logo após o SELECT, mantendo o banco de dados completamente cego quanto ao conteúdo dos campos.

3. Isolamento da Malha BEAM via Tailscale VPN

A comunicação entre os nós de desktop locais e o nó mestre na nuvem requer transporte seguro. Em vez de expor portas públicas na internet (0.0.0.0) e confiar apenas na camada TLS das requisições web, o JurisOS eleva a segurança encapsulando toda a infraestrutura em uma rede Zero Trust.

Utilizando a Tailscale VPN (baseada em WireGuard), cada estação de trabalho e o servidor AWS recebem um IP de uma sub-rede privada (ex: 100.64.0.0/10).

Os Benefícios dessa Arquitetura de Rede:

  • Superfície de Ataque Reduzida a Zero: O servidor na nuvem rejeita qualquer conexão que não venha de uma interface WireGuard. Não há portas expostas ao port scan público.
  • Comunicação Nativa Erlang Distribution: Podemos conectar os nós desktop ao cluster principal (libcluster) trafegando mensagens do ecossistema OTP através do túnel da Tailscale de forma totalmente segura.
  • Criptografia Dupla em Trânsito: Além da proteção nativa do protocolo (como WebSockets sobre WSS), os pacotes TCP/UDP são criptografados pelas chaves WireGuard ponto a ponto.

Conclusão

Proteger dados jurídicos requer mais do que apenas conformidade no papel; exige garantias algorítmicas de segurança.

Ao combinar o SQLCipher para proteção contra acesso físico indevido, o Cloak.Ecto para cegar o banco de dados central perante dados sensíveis (PII) e a Tailscale VPN para isolar completamente a comunicação de rede da internet pública, o JurisOS estabelece um estado da arte em Privacy by Design no ecossistema Elixir.

Essa arquitetura garante que, independentemente da ponta — seja no laptop offline do advogado ou no servidor AWS na nuvem —, a conformidade com a LGPD, GDPR e CCPA esteja tecnicamente assegurada desde o primeiro byte de dados inserido.

Top comments (0)