Ir al contenido

Blog ·

La etiqueta sobrevive al cambio de nombre de host

Una pegatina en un servidor es un documento público. Qué ponemos en ella, por qué el código QR no lleva ninguna URL y cómo se verifica una tabla de códigos.

Por Provibr

Una pegatina en un servidor es un documento público. Viaja en la furgoneta de un mensajero, la lee el personal de manos remotas de una empresa con la que nunca se ha firmado nada y, con el tiempo, la máquina se retira y la pegatina acaba en un contenedor junto con el chasis. Todo lo impreso en ella queda, a lo largo de la vida de la máquina, publicado.

Esa sola observación decide casi todo lo que debe contener una etiqueta de centro de datos, y descarta casi todo lo que la gente pone en ellas.

Qué lleva y qué no

Tres cosas: un localizador opaco, el número de revisión de esta impresión, y el mismo localizador otra vez en forma legible por una persona, agrupado de cuatro en cuatro para que alguien pueda teclearlo cuando el código no quiera escanearse.

No lleva: el nombre del cliente, la organización, el número de serie, la etiqueta de activo, el rack en el que vive ahora mismo, el nombre de host, un logotipo, ni un token de ningún tipo. Una etiqueta es una identidad, no una ficha.

El rack es el que la gente discute, porque escribirlo en la pegatina resulta cómodo hasta justo la primera vez que una máquina se mueve. Entonces la pegatina afirma con seguridad una ubicación equivocada, y una ubicación equivocada que parece autorizada es peor que ninguna. Un nivel más abajo, esa es también la razón de que una posición de rack no lleve pegatina: una posición U no es una cosa sino una coordenada, y deja de significar lo que significaba en cuanto se corrige la unidad inicial del rack.

Por qué el código QR no lleva ninguna URL

Lo predeterminado en cualquier cosa que lleve un código QR es codificar un enlace. Nosotros codificamos el localizador pelado, por tres razones en orden de peso.

Una pegatina sobrevive a un nombre de host. Una cuenta que más adelante se mude a su propio dominio tendría si no mil etiquetas impresas apuntando a una dirección que ya no la atiende, y nadie reimprime mil etiquetas.

Una URL dice más que un localizador. Nombra la plataforma y, en el dominio propio de un cliente, nombra al cliente. Esa es precisamente la categoría de información de la que se supone que la etiqueta está libre: una URL no es un atajo, es un campo de más, y es el campo con más espectadores.

Y hay exactamente un camino de entrada. La cámara de un teléfono, un escáner USB que teclea en un campo y una persona copiando a mano producen la misma cadena en la misma casilla. Una URL crearía una cuarta forma que solo produce la cámara, y una cuarta forma es una cuarta cosa que puede salir mal.

El localizador no es un token al portador

Esta es la parte que hace segura a toda la demás. Tener el localizador no da nada.

Un escaneo es una acción autenticada corriente. Se ejecuta la puerta de organización, se comprueba el permiso de lectura, la consulta queda acotada a la cuenta y solo entonces dice el servidor si este localizador existe aquí. Un localizador de otra cuenta produce exactamente la misma respuesta que uno inventado: desconocido. Uno revocado recibe su propia negativa, porque ese es un hecho distinto y quien tiene la pegatina en la mano merece saber cuál de los dos es.

Tampoco hay prefijo de fabricante. Un esquema por delante permitiría al software distinguir nuestra pegatina del código de barras que el fabricante ya pegó, y le diría a cualquiera que encuentre la pegatina a qué plataforma pertenece. La forma hace ese trabajo en silencio: un localizador son dieciséis caracteres de un alfabeto conocido, y todo lo que no tenga esa forma se busca como etiqueta de activo o como número de serie, cosa que el flujo de escaneo necesita de todos modos para el código de barras del fabricante y para quien lee un número del chasis.

Dieciséis caracteres, y por qué dieciséis

El alfabeto es Crockford base32: los dígitos y las letras sin la I, la L, la O y la U. La I y la L se confunden con el dígito uno, y la O con el cero; la U la descarta el estándar para evitar palabrotas accidentales. Lo seguimos porque otros dos códigos de este producto ya lo hacen, y dos alfabetos serían un fallo esperando su momento.

Dieciséis caracteres de un alfabeto de treinta y dos son ochenta bits. La longitud no se eligió por lo difícil de adivinar, porque adivinar no compra nada: la búsqueda se autoriza igualmente. Se eligió por las colisiones. Ochenta bits hacen que un duplicado entre millones de etiquetas sea despreciable, así que el índice único de debajo nunca fuerza un reintento que un usuario llegue a notar. Dieciséis es además más o menos la cadena más larga que alguien copia en cuatro grupos de cuatro sin equivocarse.

La normalización se aplica a todo lo que entra: recortar, pasar a mayúsculas, quitar espacios y guiones, y después mapear la I y la L al uno y la O al cero. Nadie que teclee desde una pegatina debería tener que saber que esas letras no están. La U deliberadamente no tiene mapeo: ningún dígito se le parece, así que una U es un error de tecleo genuino y le corresponde una negativa y no una sustitución silenciosa.

Code 128, escrito a mano y verificado en vez de creído

El código QR usa una biblioteca que ya estaba en el fichero de bloqueo para la autenticación en dos factores: sin dependencias en tiempo de ejecución y con un renderizador que produce SVG sin tocar un canvas ni un DOM. Reutilizar eso gana a escribir un segundo codificador de QR.

Para Code 128 no había aquí ningún paquete así. Los candidatos que hacen el trabajo arrastran una capa de dibujo pensada para un canvas o para un navegador, que es justo lo único que un SVG renderizado en el servidor no puede tener, y son dos órdenes de magnitud más grandes de lo que la cosa realmente es. Code 128 es pequeño: una tabla de patrones, un carácter de inicio, una suma de control módulo ciento tres y un carácter de parada. Eso son un par de cientos de líneas y ninguna cadena de suministro para una tabla que no ha cambiado desde 1981.

El problema de teclear una tabla estándar a partir de una especificación es que un error en ella falla en silencio. El SVG se ve perfecto, las pruebas pasan, y meses después un escáner en un centro de datos lee un carácter distinto. Así que la tabla se verifica con cuatro invariantes independientes y un decodificador, todo dentro del fichero de pruebas:

  1. Ciento seis patrones además del carácter de parada, cada uno de exactamente seis elementos que suman once módulos.
  2. Paridad par en las barras. Todo carácter de Code 128 tiene una suma par en sus tres barras; esa es la propiedad que usa un escáner para deducir en qué sentido está leyendo, y se cumple en los ciento seis. Un solo dígito mal tecleado rompe o bien esto o bien la suma anterior.
  3. Anchuras de elemento entre uno y cuatro, y los ciento seis patrones distintos entre sí.
  4. El carácter de parada, el único patrón con siete elementos y trece módulos.
  5. Un decodificador dentro de la prueba que lee de vuelta las anchuras de barra generadas y tiene que recuperar la cadena de entrada, carácter de control incluido.

Una tabla que sobrevive a cuatro invariantes independientes y a una ida y vuelta no es «probablemente correcta», y esa distinción es toda la razón para escribirlas.

Nos quedamos en el subconjunto B en lugar de cambiar automáticamente. La etiqueta lleva letras mayúsculas y dígitos, que el subconjunto B cubre en una sola pasada. El subconjunto C reduciría a la mitad los pares numéricos, pero un localizador no es una tirada de dígitos, así que un cambio automático sería una rama que no se dispara nunca.

La disposición de la hoja es una consecuencia del código de barras

Veinticuatro etiquetas por página A4, tres a lo ancho y ocho a lo alto. Ese número no es una preferencia de diseño, es una aritmética que corre en el otro sentido.

Un Code 128 de dieciséis caracteres mide doscientos once módulos de ancho: once para el inicio, once por carácter, once para el carácter de control y trece para la parada. Añadiendo dos zonas mudas de diez módulos hacen falta doscientos treinta y un módulos a lo ancho. El suelo práctico para un escáner corriente es un módulo de un cuarto de milímetro, por debajo del cual la lectura pasa de fiable a ocasional. Eso son cincuenta y ocho milímetros de código de barras.

Cuatro columnas en un A4 dan una etiqueta de unos cincuenta y dos milímetros de ancho y un módulo cercano a dos décimas de milímetro: una hoja que parece más ordenada y que no se lee en un pasillo frío. Tres por ocho da una etiqueta de setenta por treinta y siete milímetros, un ancho útil de sesenta y cuatro y un módulo de 0,277 milímetros. El recuento se deriva del código, y no al revés. La página está deliberadamente llena, con el margen dentro de cada etiqueta en vez de alrededor de la cuadrícula, de modo que el controlador de la impresora nunca tenga que escalar nada, y escalar es lo único que un código de barras no tolera.

Ese suelo es una constante en el código fuente y no un comentario, así que una prueba mide contra ella la anchura de módulo del SVG renderizado. Un cambio de disposición que estreche demasiado el código de barras es una prueba en rojo en vez de una queja desde el pasillo.

Una sola etiqueta activa por objeto

Las reimpresiones son el caso corriente, así que el invariante lo lleva la base de datos y no el código. Dos índices únicos parciales, uno para máquinas y otro para racks, que son las dos únicas cosas que llevan etiqueta, permiten como mucho una etiqueta que no haya sido revocada. Sin ellos, una reimpresión que falla a medias deja dos pegatinas válidas en una misma máquina, y nadie puede decir cuál es la buena. Un segundo par mantiene la revisión única por objeto, así que una reimpresión cuenta hacia arriba y nunca se repite. Tres dígitos es el techo: el número tiene que seguir siendo legible, y mil reimpresiones de una máquina no son un problema de etiquetado.

Lo que apuntaríamos

  1. Tratar la pegatina como publicada, y decidir qué va en ella preguntándose quién la lee dentro de cinco años.
  2. Codificar el identificador, no un enlace. Sobrevive a un cambio de dominio, a un cambio de marca y a una adquisición; una URL no sobrevive a ninguno de los tres.
  3. Hacer que el identificador no valga nada por sí solo, para que una pegatina perdida sea un problema de logística y no de seguridad.
  4. Verificar una tabla normativa con invariantes y una ida y vuelta, porque esa clase de error nunca falla de forma ruidosa.
  5. Derivar la disposición de impresión del módulo legible más pequeño, y fijar ese suelo como una constante que una prueba pueda medir.

Por honestidad sobre nuestra propia posición: el trabajo de centro de datos está detrás de un interruptor de despliegue apagado por defecto, con un ajuste por organización por encima, así que esto es la descripción de un diseño y no un anuncio. Hay dos cosas explícitamente sin demostrar. La matriz QR no ha sido decodificada por una implementación independiente, porque en este repositorio no hay decodificador. Y no se ha impreso nada en papel ni se ha escaneado en un pasillo, que es la única prueba que de verdad cuenta para un código de barras. El mismo razonamiento sobre lo que a un componente le está permitido saber aparece en otros sitios de aquí: las credenciales se quedan en el host, y el agente solo conecta hacia fuera.

Del trabajo de centro de datos en Provibr. Lo que impide que dos personas reclamen la misma unidad de rack está en el único límite real a la ocupación de un rack.

Empiece con un host y un agente

Cree una cuenta, instale el agente con un solo comando y conecte su primer host de Proxmox. El periodo de prueba dura 14 días y no pide ningún dato de pago.