Precinto
Precinto sanea el support bundle antes de que cruce el perímetro y emite un manifiesto firmado de lo que hizo y de lo que no pudo inspeccionar. Corre en tu máquina, sin red, sin credenciales y sin telemetría.
No dice: «este paquete ya no contiene secretos». Nadie puede decir eso, y un producto que lo prometa está mintiendo.
Dice: «este paquete fue procesado por la política X versión Y, con estas transformaciones y estas limitaciones comprobables».
La diferencia entre esas dos frases es el producto entero. La primera es una promesa que nadie puede sostener. La segunda es un hecho que un tercero puede verificar por su cuenta, sin confiar en nosotros.
Verificar un precinto Instalar Licencia Código Contacto
No es una preferencia de arquitectura ni una postura: es una imposibilidad de la alternativa.
Nadie puede mandar su paquete lleno de datos sensibles a un servicio en la nube para preguntarle si contiene datos sensibles. La circularidad obliga a que la herramienta viva del lado del cliente. Por eso Precinto no tiene versión alojada, no tiene cuenta, no tiene panel y no va a tenerlos.
La misma lógica se aplica al verificador de esta web: valida la firma dentro de tu navegador, con la aritmética de curva incluida en la propia página. Podés desconectar la red, guardarla y seguir usándola.
Un solo archivo de Python, sin dependencias más allá de cryptography para la firma. No hay servicio, no hay demonio, no hay puerto a la escucha, no hay proceso residente.
git clone https://github.com/hernaninverso/precinto.git && cd precinto
python3 precinto.py keygen --out claves
python3 precinto.py scan support-bundle.tar.gz \
--profile perfiles/atlassian-dc.json \
--out salida --sign claves/private.pem
Sale una copia saneada y un manifest.json. Códigos de salida: 0 pasa · 3 requiere revisión humana · 4 bloqueado.
socket.socket, create_connection y getaddrinfo anulados, y falla si algo intenta usarlos.| Situación | Qué pasa |
|---|---|
| Una credencial reconocida por una regla exacta | Se reemplaza por un pseudónimo estable |
| Una cadena ambigua, de alta entropía | Se enmascara igual y se marca con <REVISAR:…>. La revisión decide si se restaura, no si se tapa: dejar el valor en claro mientras alguien decide era dejarlo salir |
| Un formato que no se puede inspeccionar con garantías | El archivo se bloquea entero. No sale |
| Una traza de diagnóstico legítima | Queda intacta. Anonimizar destruyendo el diagnóstico no sirve a nadie |
El mismo valor produce el mismo token dentro de un paquete: el equipo de soporte sigue viendo que «este usuario aparece en cuatro archivos» sin ver quién es. Otra ejecución usa otra sal, así que dos paquetes no se pueden cruzar ni revertir por diccionario. La sal es efímera y no se guarda en ningún lado.
Verificar una firma contra la clave que viaja dentro del mismo archivo es circular: demuestra que nadie lo alteró, pero cualquiera pudo firmarlo con su propia clave. Por eso Precinto devuelve NO PROBADA en ese caso, con código de salida 3, y nunca la palabra «verificada».
Para probar la procedencia hace falta la clave pública del emisor obtenida por un canal independiente del archivo. Es una distinción incómoda de explicar y fácil de omitir — y omitirla es exactamente cómo una herramienta de verificación termina certificando lo que no puede.
Y hay tres cosas más que una firma válida no demuestra, dichas antes de que las pregunte nadie:
.tar.gz y lo comprueba; sin ese paso, un manifiesto en verde puede viajar junto a cualquier otro archivo.| Sobre el banco sintético de canarios | |
|---|---|
| Canarios plantados, en 14 clases | 17 |
| Neutralizados — reemplazados por pseudónimo | 16 |
| Retenidos — su archivo se bloqueó entero | 1 |
| Escapados — presentes en la copia sin marcar | 0 |
| Comprobaciones de regresión (Python + verificador web) | 75 |
El banco está en el repositorio y se regenera con semilla fija: cualquiera reproduce estos números en su máquina en menos de un minuto. Y el desglose distingue estados en vez de decir «contenido / no contenido», porque un banco binario se felicita a sí mismo — la primera versión de éste informaba 100% sin haber medido nada.
Estos números son de un banco sintético, no de datos reales. Miden que los detectores encuentran lo que se les plantó; no miden qué encontrarían en tus paquetes, que es la única pregunta que importa. Por eso el paso siguiente con un fabricante es correrlo sobre su corpus, en su máquina.
| Si vos… | Entonces… |
|---|---|
| Lo corrés en tu infraestructura, para tus propios paquetes | AGPL-3.0. No pagás nada y no hablás con nadie. |
| Lo auditás, lo modificás, lo integrás con tus herramientas | AGPL-3.0. Igual. |
| Lo usás en una consultoría, sobre el paquete de tu cliente | AGPL-3.0. Igual. |
| Lo redistribuís dentro de tu producto propietario | Licencia comercial, por producto. Distribución ilimitada aguas abajo. |
El hecho por el que se cobra no es usar la herramienta: es redistribuirla dentro de un producto cerrado. Es el esquema de wolfSSL y de Qt, y los departamentos de compras ya saben leerlo.
La versión abierta es completa: no hay funciones recortadas, ni un motor distinto, ni una edición mutilada para forzar la compra. Si el proyecto dejara de mantenerse, lo que está publicado sigue sirviendo. Y la licencia comercial no apaga el software si no se renueva — la renovación habilita versiones y reglas nuevas, nunca es un interruptor sobre lo ya instalado. Poner un interruptor comercial dentro de infraestructura desconectada sería justo el tipo de cosa que este proyecto existe para no hacer.
Para una licencia comercial, para reportar un fallo o para decirme que el enfoque está equivocado: precinto@eleata.io, o un asunto en el repositorio.
Si me escribís porque tu producto genera paquetes de diagnóstico, decime cuál es y te mando el perfil de partida para tu formato. No hace falta que me mandes ningún paquete — de hecho, preferiría que no lo hicieras.
Si tu documentación le pide al cliente que revise el paquete antes de mandártelo, ya conocés el problema: ese pedido es lento, manual y propenso a error, y el que lo paga en horas es tu equipo de soporte cuando el paquete llega tarde o incompleto.
Precinto se integra después de tu generador de paquetes, con un perfil calibrado para tu formato. El cliente final no incorpora un proveedor privilegiado más: recibe una actualización tuya. Hay perfiles de partida para nueve productos en perfiles/, sin calibrar contra paquetes reales — eso se hace con tus datos, en tu máquina.