Ir para o conteúdo

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:

  1. Cento e seis padrões além do carácter de paragem, cada um com exatamente seis elementos cuja soma dá onze módulos.
  2. 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.
  3. Larguras de elemento entre um e quatro, e os cento e seis padrões todos distintos.
  4. O carácter de paragem, o único padrão com sete elementos e treze módulos.
  5. 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

  1. Trate o autocolante como publicado e decida o que lhe vai em cima perguntando quem o lê daqui a cinco anos.
  2. 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.
  3. 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.
  4. Verifique uma tabela normalizada com invariantes e uma ida e volta, porque essa classe de erro nunca falha de forma ruidosa.
  5. 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.

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.