Ir para o conteúdo

Blogue ·

Uma exportação que se pode verificar

Uma exportação de dados como tarefa duradoura: um ficheiro temporário renomeado, um sha256 no recibo, uma senha de uso único e uma pasta em dois papéis.

Por Provibr

O artigo 20 do regulamento europeu de proteção de dados dá a uma pessoa o direito de receber os seus dados. Numa plataforma de alojamento isso não é um ficheiro pequeno. Uma exportação de organização lê cerca de setenta secções, cada uma limitada a vinte e cinco mil linhas, e demora minutos em vez de milissegundos.

Até há pouco a nossa era construída dentro de uma ação de servidor: um pedido web montava o conjunto em memória e devolvia-o como uma única cadeia na resposta. Isso funciona até à conta em que deixa de funcionar, e essa conta é justamente a que mais precisa dela.

É uma tarefa, e só há um caminho

Uma exportação é agora uma operação duradoura com quatro fases: em fila, a recolher, a empacotar, pronta. Um trabalhador no portal apanha-a a cada trinta segundos, tranca uma linha, constrói as secções, escreve o ficheiro e devolve uma senha.

Quatro números seguram o conjunto inteiro, e cada um é uma decisão e não um valor por omissão.

LimiteValorPorquê esse
Linhas por secção25.000Acima disso é um relatório e não um pedido de acesso, e o corte é nomeado em vez de escondido
Ligação de descarga24 horasTempo bastante para levantar, pouco para que uma ligação antiga numa caixa valha algo
O ficheiro em disco7 diasÉ uma cópia completa de tudo o que guardamos, e não deve tornar-se um arquivo
O registo do que foi entregue90 diasA prova de que um direito foi exercido sobrevive ao ficheiro que produziu

O antigo caminho síncrono não ficou como atalho para contas pequenas, e isso foi uma decisão deliberada e não preguiça.

Dois caminhos são duas verdades. Qual dos dois corre dependeria de uma estimativa feita à partida, e a estimativa que aqui conta é esta conta é pequena, que é exatamente o que não se pode saber antes de ter contado as secções. Se falhar, a exportação cai no caminho onde não há rede.

Dois caminhos são também dois géneros de prova. A linha de auditoria, o recibo com uma soma de verificação lá dentro e a lista de secções truncadas só existem no caminho da tarefa. Uma exportação pequena seria entregue em silêncio sem nada disso, e a pergunta o que entregámos em março teria uma resposta que depende do tamanho que a conta tinha na altura.

O preço é mais um clique, e esse clique ia existir de qualquer modo: o trabalho demorado pertence à gaveta de tarefas, e é lá que está agora, com uma barra de progresso em vez de um navegador que fica dois minutos sem fazer nada.

Onde o código teve de viver

Os construtores mudaram-se da aplicação web para o pacote que detém os acessos à base de dados. Isso não foi arrumação. A imagem do portal copia o portal e os pacotes partilhados e não copia a pasta web, portanto uma importação que chega a web/lib compila em local e falta em produção. É uma fronteira medida e não uma questão de estilo.

A operação de exportação tem ainda o tipo de recurso account, e é o primeiro sem módulo. Qualquer outra operação duradoura trata de um servidor, um agente, uma peça de equipamento ou uma automatização, e cada um deles cai sob um módulo de permissões que decide quem a pode ver. Uma exportação de conta não cai sob ninguém: o conjunto de permissões de um membro traz direitos e não identidade. A visibilidade responde-se perguntando se quem olha é quem a pediu, e o canal em direto devolve falso para todos os outros.

Um ficheiro temporário e depois uma renomeação

O ficheiro é escrito como <nome>.part e depois renomeado para o seu lugar. Uma renomeação dentro da mesma pasta é atómica, portanto quem lê nunca pode apanhar meio ficheiro, e meio ficheiro é pior do que ficheiro nenhum: traz uma soma de verificação que não bate certo e nada que diga porquê.

A soma de verificação é um sha256 dos bytes e vai ao lado do tamanho no recibo. É isso que torna a exportação verificável em vez de apenas entregue. Quem tiver o ficheiro daqui a um ano ainda pode mostrar que é o ficheiro que produzimos.

A pasta é um ponto de montagem pendurado em dois contentores: de leitura e escrita no portal, que escreve, e só de leitura na aplicação web, que serve. Dois processos, dois papéis, uma pasta.

Essa montagem esquece-se com facilidade, e esquecê-la produz um quadro de avaria muito próprio e muito confuso. A tarefa diz pronta. A descarga responde 410. Nada no registo diz pasta errada, porque do ponto de vista de cada um dos dois processos tudo funcionou. Por isso o código avisa uma vez, em voz alta, se a pasta não estiver configurada, e o recurso de reserva é um caminho ao lado do repositório e não a pasta temporária do sistema: um ficheiro ali desaparece num reinício, e então uma linha que diz pronta para descarregar aponta para nada.

A senha é de uso único, e uso único é uma só instrução

A ligação de descarga leva uma senha válida por vinte e quatro horas, enquanto o ficheiro em si fica sete dias.

São precisos os dois limites. Só o uso único deixaria uma senha utilizável durante meses enquanto ninguém lhe tocasse. Só a validade tornava-a reutilizável durante um dia por qualquer pessoa que veja o endereço: um registo de intermediário, um historial de navegação, uma caixa partilhada. Quem chega tarde pede uma exportação nova, e isso custa um minuto e dá uma cópia fresca e correta em vez de uma ligação que anda uma semana perdida num correio.

O ferrolho que impõe mesmo o uso único não é a marca temporal. É uma única instrução condicional: atualiza a linha, põe a hora de descarga, onde a hora de descarga ainda esteja vazia. Dois pedidos simultâneos com a mesma senha tocam juntos exatamente uma linha e o segundo recebe zero. Verificar e depois escrever seriam duas instruções e portanto duas ocasiões de alguém se meter pelo meio.

A senha sozinha também não chega. Quem chama passa a pessoa autenticada, e essa tem de ser quem pediu a exportação, e por isso essa rota corre sob a regra de sessão e não sob a das senhas. E a verificação de propriedade vem antes de qualquer outra recusa: quem não devia ter a senha também não deve aprender com ela se a exportação expirou ou já foi levantada.

Sete dias para o ficheiro são curtos de propósito. O ficheiro é uma cópia completa de tudo o que guardamos sobre uma pessoa ou uma organização, e enquanto existe é um segundo sítio onde tudo isso vive. Uma cópia de segurança leva-o consigo, e a cuidadosa lista permitida que decide o que entra numa exportação fez o seu trabalho no momento em que o ficheiro foi escrito e depois já não protege nada. Não é de todo um prazo de conservação dos próprios dados, que estão na base de dados com as suas regras. É o prazo de uma cópia.

Truncar é uma verificação em aberto e não uma nota de rodapé

Cada secção para nas vinte e cinco mil linhas. Uma secção que bateu nesse teto é nomeada no envelope e aparece no recibo como verificação em aberto: algo sobre o qual se espera que quem lê atue, ao lado do resultado e não enterrado nele. Uma exportação que parasse em silêncio no teto seria uma resposta a um pedido de acesso incompleta sem o dizer, e isso é pior do que uma recusa.

Medido com uma conta que levava vinte e cinco mil e cinco linhas numa secção: a secção foi truncada, a verificação em aberto apareceu, e uma segunda tentativa na mesma ligação respondeu 410.

Uma tabela deixada de fora de propósito, com a razão ao lado

Nem tudo entra, e a lista do que fica de fora traz uma justificação escrita por tabela em vez de uma frase de política no topo.

O exemplo mais claro é o livro de consumo da monitorização. Ali estão três tabelas: os baldes horários, a linha de limites e a linha por verificação enviada por baixo. As duas primeiras entram, porque o que um pedido de acesso quer saber é quanto foi medido para mim e a que tinha direito a minha conta, e é exatamente isso que essas duas dizem. A terceira são centenas de milhares de linhas por mês com os mesmos totais, e é administração do nosso envio em vez de algo que a clientela introduziu.

Esse raciocínio tem data. Se esse livro vier um dia a suportar uma linha de fatura, a omissão tem de ser pesada de novo, porque a linha de prova por trás de um lançamento é um género de dado diferente de um registo de expedição. Escrever isso ao lado da exceção é a diferença entre uma decisão e um hábito.

Outras duas tabelas ficam de fora pela mesma razão: a administração por tentativa debaixo de uma medição devida e os próprios ticks de planeamento. Ambas dizem algo sobre a forma como nós o executámos e nada sobre a pessoa que pergunta.

Como se vê de fora

Alguém pede os seus dados. Aparece um cartão na gaveta de tarefas com uma barra de progresso. Uns minutos depois há um aviso, uma ligação de descarga que funciona uma vez e um recibo que nomeia o tamanho, a soma de verificação e tudo o que ficou cortado. Sete dias depois o ficheiro já não está lá e o registo do que foi entregue fica noventa dias.

Nada disso é notável, e é esse o objetivo. Notável é o que falta: nenhum caminho em que o mesmo pedido produza outro género de prova, nenhum ficheiro que se possa ler enquanto está meio escrito, e nenhuma ligação que continue a funcionar depois de usada.

Do trabalho de plataforma da Provibr. Porque a vista de operações lê linhas existentes e nunca escreve de volta está em projetar, nunca substituir, e porque aqui uma barra de progresso se recusa a prever um fim está em uma barra de progresso que se recusa a adivinhar.

Comece com um host e um agente

Crie uma conta, instale o agente com um único comando e ligue o seu primeiro host Proxmox. O período experimental dura 14 dias e não pede quaisquer dados de pagamento.