Blogue ·
Uma etiqueta que sobrevive a um novo hostname
Um autocolante num servidor é um documento público. O que lá pomos, porque o código QR não guarda um URL e como a tabela do código de barras é verificada.
Por Provibr
Um autocolante num servidor é um documento público. Viaja numa carrinha de estafetas, é lido por técnicos de assistência no local que trabalham para uma empresa com quem nunca contratou nada e, mais tarde ou mais cedo, a máquina é abatida e o autocolante vai para o contentor do lixo com o chassis. Tudo o que estiver lá impresso fica, ao longo da vida da máquina, publicado.
Essa única observação decide quase tudo sobre o que uma etiqueta de centro de dados deve conter, e exclui a maior parte daquilo que as pessoas lhes põem em cima.
O que lá está, e o que não está
Três coisas: um localizador opaco, o número de revisão desta impressão, e o mesmo localizador outra vez em forma legível por uma pessoa, agrupado de quatro em quatro para que alguém o consiga escrever quando o código não quiser ler.
Não está lá: o nome do cliente, a organização, o número de série, a etiqueta de ativo, o bastidor onde está neste momento, o hostname, um logótipo, nem token nenhum de espécie alguma. Uma etiqueta é uma identidade, não é um registo.
O bastidor é aquele sobre o qual as pessoas discutem, porque escrevê-lo no autocolante é cómodo até à primeira vez que a máquina muda de sítio. A partir daí o autocolante declara com confiança uma localização errada, e uma localização errada com ar de autoridade é pior do que nenhuma. Um nível abaixo, é também por isso que uma posição de bastidor não leva autocolante: uma posição em U não é uma coisa mas uma coordenada, e deixa de significar o que significava no instante em que a unidade inicial do bastidor for corrigida.
Porque é que o código QR não guarda um URL
A predefinição para tudo o que tenha um código QR é codificar uma ligação. Nós codificamos o localizador simples, por três razões, por ordem de peso.
Um autocolante sobrevive a um hostname. Uma conta que mais tarde passe para o seu próprio domínio ficaria de outro modo com mil etiquetas impressas a apontar para um endereço que já não a serve, e ninguém reimprime mil etiquetas.
Um URL diz mais do que um localizador. Nomeia a plataforma e, no domínio próprio de um cliente, nomeia o cliente. É precisamente essa a categoria de informação de que a etiqueta é suposta estar livre: um URL não é um atalho, é um campo a mais, e é o campo com mais espectadores.
E existe exatamente um caminho de entrada. A câmara de um telemóvel, um leitor USB que escreve num campo e uma pessoa a copiar à mão produzem todos a mesma cadeia de caracteres na mesma caixa. Um URL criaria uma quarta forma que só a câmara alguma vez produz, e uma quarta forma é mais uma coisa a correr mal.
O localizador não é um token ao portador
Esta é a parte que torna seguro tudo o resto. Ter o localizador na mão não dá nada.
Uma leitura é uma ação autenticada vulgar. A porta da organização corre, a permissão de leitura é verificada, a consulta é limitada à conta e só então o servidor diz se este localizador existe aqui. Um localizador de outra conta produz exatamente a mesma resposta que um inventado por alguém: desconhecido. Um localizador revogado tem a sua própria recusa, porque isso é um facto diferente e quem tem o autocolante na mão merece saber qual dos dois é.
Também não há prefixo de fornecedor. Um esquema à frente permitiria ao software distinguir o nosso autocolante do código de barras que o fabricante já colou, e diria a quem encontrasse o autocolante a que plataforma ele pertence. A forma faz esse trabalho em silêncio: um localizador tem dezasseis caracteres de um alfabeto conhecido, e tudo o que não tenha essa forma é procurado como etiqueta de ativo ou como número de série, coisa de que o fluxo de leitura precisa de qualquer maneira para o código de barras do fabricante e para quem leia um número no chassis.
Dezasseis caracteres, e porquê dezasseis
O alfabeto é o Crockford base32: os algarismos e as letras sem I, L, O e U. O I e o L confundem-se com o algarismo um, o O com o zero; o U é retirado pela norma para evitar palavrões acidentais. Seguimo-la porque outros dois códigos deste produto já a seguem, e dois alfabetos seriam um defeito à espera do seu momento.
Dezasseis caracteres de um alfabeto de trinta e dois caracteres são oitenta bits. O comprimento não foi escolhido pela dificuldade de adivinhar, porque adivinhar não compra nada: a consulta é autorizada de qualquer forma. Foi escolhido pelas colisões. Oitenta bits tornam desprezável um duplicado ao longo de milhões de etiquetas, pelo que o índice único por baixo nunca força uma repetição que um utilizador chegue a notar. Dezasseis é também mais ou menos a cadeia mais comprida que alguém copia em quatro grupos de quatro sem se enganar.
A normalização corre sobre tudo o que entra: cortar espaços nas pontas, passar a maiúsculas, retirar espaços e hífenes, e depois converter I e L em um e O em zero. Ninguém que esteja a escrever a partir de um autocolante devia ter de saber que essas letras não existem. O U não tem conversão nenhuma, deliberadamente: nenhum algarismo se parece com ele, pelo que um U é um verdadeiro erro de escrita e pertence a uma recusa e não a uma substituição silenciosa.
Code 128, escrito à mão, e verificado em vez de acreditado
O código QR usa uma biblioteca que já estava no ficheiro de bloqueio de dependências por causa da autenticação em dois fatores: sem dependências em tempo de execução, e com um apresentador que produz SVG sem tocar numa canvas nem num DOM. Reaproveitar isso é melhor do que escrever um segundo codificador de QR.
Para o Code 128 não existia aqui pacote nenhum assim. Os candidatos que fazem o trabalho arrastam consigo uma camada de desenho pensada para uma canvas ou para um navegador, que é exatamente a coisa que um SVG apresentado no servidor não pode ter, e são duas ordens de grandeza maiores do que a coisa é na realidade. O Code 128 é pequeno: uma tabela de padrões, um carácter de início, uma soma de controlo módulo cento e três e um carácter de paragem. São umas duas centenas de linhas e nenhuma cadeia de fornecimento para uma tabela que não muda desde 1981.
O problema de copiar à mão uma tabela normalizada a partir de uma especificação é que um erro nela falha em silêncio. O SVG parece perfeito, os testes passam, e meses depois um leitor num centro de dados lê um carácter diferente. Por isso a tabela é verificada por quatro invariantes independentes e por um descodificador, tudo dentro do ficheiro de testes:
- Cento e seis padrões além do carácter de paragem, cada um com exatamente seis elementos cuja soma dá onze módulos.
- Paridade par nas barras. Todos os caracteres do Code 128 têm uma soma par ao longo das suas três barras; é essa a propriedade que um leitor usa para perceber em que sentido está a ler, e vale para os cento e seis. Um único algarismo mal escrito quebra ou isto ou a soma acima.
- Larguras de elemento entre um e quatro, e os cento e seis padrões todos distintos.
- O carácter de paragem, o único padrão com sete elementos e treze módulos.
- Um descodificador no teste que lê de volta as larguras das barras geradas e tem de recuperar a cadeia de entrada, carácter de verificação incluído.
Uma tabela que sobrevive a quatro invariantes independentes e a uma ida e volta não é «provavelmente correta», e essa distinção é toda a razão para as escrever.
Ficámos no subconjunto B em vez de mudar automaticamente. A etiqueta leva letras maiúsculas e algarismos, que o subconjunto B cobre de uma só passagem. O subconjunto C reduziria a metade os pares numéricos, mas um localizador não é uma sequência numérica, pelo que uma mudança automática seria um ramo que nunca dispara.
O esquema da folha é uma consequência do código de barras
Vinte e quatro etiquetas por folha A4, três na horizontal e oito na vertical. Esse número não é uma preferência de desenho, é aritmética que corre no sentido contrário.
Um Code 128 de dezasseis caracteres tem duzentos e onze módulos de largura: onze para o início, onze por carácter, onze para o carácter de verificação e treze para a paragem. Acrescente duas zonas de silêncio de dez módulos e precisa de duzentos e trinta e um módulos ao longo da largura. O mínimo prático para um leitor vulgar é um módulo de um quarto de milímetro, abaixo do qual a leitura passa de fiável a ocasional. São cinquenta e oito milímetros de código de barras.
Quatro colunas numa A4 dão uma etiqueta com cerca de cinquenta e dois milímetros de largura e um módulo perto de dois décimos de milímetro: uma folha que fica mais arrumada e não se lê num corredor frio. Três por oito dão uma etiqueta de setenta por trinta e sete milímetros, uma largura útil de sessenta e quatro e um módulo de 0,277 milímetros. A contagem decorre do código, e não o contrário. A página é deliberadamente cheia, com a margem dentro de cada etiqueta e não à volta da grelha, para que nenhum controlador de impressora tenha alguma vez de redimensionar seja o que for, e o redimensionamento é a única coisa que um código de barras não tolera.
Esse mínimo é uma constante no código e não um comentário, pelo que um teste mede a largura de módulo do SVG apresentado contra ele. Uma alteração de esquema que aperte demasiado o código de barras é um teste vermelho em vez de uma queixa vinda do corredor.
Uma etiqueta ativa por objeto
As reimpressões são o caso normal, pelo que é a base de dados que leva a invariante, e não o código. Dois índices únicos parciais, um para as máquinas e outro para os bastidores, que são as duas únicas coisas que levam etiqueta, permitem no máximo uma etiqueta que não tenha sido revogada. Sem eles, uma reimpressão que falhe a meio deixa dois autocolantes válidos numa máquina, e ninguém sabe dizer qual é o verdadeiro. Um segundo par mantém a revisão única por objeto, pelo que uma reimpressão conta para cima e nunca se repete. Três algarismos é o teto: o número tem de continuar legível, e mil reimpressões de uma máquina não são um problema de etiquetagem.
O que registaríamos
- Trate o autocolante como publicado e decida o que lhe vai em cima perguntando quem o lê daqui a cinco anos.
- Codifique o identificador, não uma ligação. Ele sobrevive a uma mudança de domínio, a uma mudança de marca e a uma aquisição; um URL não sobrevive a nenhuma delas.
- Torne o identificador inútil por si só, para que um autocolante perdido seja um problema de logística e não de segurança.
- Verifique uma tabela normalizada com invariantes e uma ida e volta, porque essa classe de erro nunca falha de forma ruidosa.
- Derive o esquema de impressão do menor módulo legível e fixe esse mínimo como uma constante que um teste consiga medir.
Por honestidade quanto à nossa própria posição: o trabalho de centro de dados vive atrás de um sinalizador de lançamento que está desligado por predefinição, com uma definição por organização por cima dele, pelo que isto é a descrição de um desenho e não um anúncio. Duas coisas estão explicitamente por provar. A matriz do QR não foi descodificada por uma implementação independente, porque não existe descodificador neste repositório. E nada foi impresso em papel e lido num corredor, que é o único teste que verdadeiramente conta para um código de barras. O mesmo raciocínio sobre o que um componente tem autorização para saber aparece noutros sítios aqui: as credenciais ficam no anfitrião e o agente só se liga para fora.
Do trabalho de centro de dados na Provibr. Aquilo que impede duas pessoas de marcarem a mesma unidade de bastidor está em o único limite real à ocupação de um bastidor.