tawasuyu

sergio/takana

> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…

⎇ main recipes/chrony.toml TOML · 96 líneas · 6.1 KB Historia crudo

busybox sale de las 24 build-deps: ya no viaja en NINGUNA imagen b53d91edf · Sergio ·

1# chrony 4.9 — el reloj. `targets.toml` lo declara como raíz del perfil `servidor` con un motivo que
2# no es comodidad: sin NTP un reloj que deriva rompe la validación de certificados TLS y la de firmas
3# con expiración, y falla con errores que NO dicen «la hora», dicen «firma inválida». Era una de las
4# tres `wanted` que el grafo contaba como deuda del perfil.
5#
6# El `configure` de chrony NO ES AUTOTOOLS: es un script a mano que ni siquiera acepta
7# `--build`/`--host` (los imprime como «Unrecognized option» y sigue). Por eso esta receta no lleva
8# la línea `--build=$CBUILD --host=$CHOST` que llevan todas las demás; lo que sí acepta —y es su
9# equivalente— es `--host-system`/`--host-machine`, que se pinean para que la detección no salga de
10# `uname` del lab.
11#
12# ⚠ TODO `--without-*` DE ACÁ ABAJO ESTÁ POR LA MISMA RAZÓN, Y NO ES PROLIJIDAD. El `configure` de
13# chrony PRUEBA el entorno para casi todo (`try_nettle=1`, `try_gnutls=1`, `try_libcap=-1`,
14# `try_seccomp=-1`, `try_editline=1`…): lo que encuentre instalado en el LAB cambia el binario. Y el
15# lab NO entra en `hash_inputs` — dos labs distintos sellarían bytes distintos en la MISMA dirección
16# del store sin que nada lo note. Fijar cada palanca convierte eso en una decisión de la receta, que
17# sí entra en el hash. Enumeradas:
18#
19#   --without-nettle --without-gnutls --without-nss --without-tomcrypt --disable-nts
20#       NTS (NTP sobre TLS) necesita nettle o gnutls, y NINGUNA de las dos está en el corpus. Se
21#       apaga a propósito y queda anotado: subir NTS es su propia unidad de trabajo —entra un árbol
22#       de criptografía entero— no algo que se resuelve de paso. Mientras tanto chronyd hace NTP
23#       clásico, que es lo que la caja necesita para que TLS no falle por la hora.
24#   --disable-readline --without-editline
25#       el editor de línea de `chronyc`. Ni readline ni editline están en el corpus; sin fijarlo, un
26#       lab que las tuviera cambiaría el binario.
27#   --without-seccomp
28#       el filtro de syscalls (`--enable-scfilter`) viene apagado de fábrica, pero el probe de
29#       libseccomp corre igual. Sin scfilter, encontrarla no aporta nada y sí mueve el hash.
30#
31# `libcap` SÍ entra como dep, y es la decisión contraria a las de arriba: chronyd suelta privilegios
32# (`--disable-privdrop` NO se pasa) y para eso necesita `cap_*`. Declararla como dep la vuelve
33# presente-por-contrato en vez de presente-por-suerte-del-lab, que es exactamente el mismo problema
34# visto del otro lado. El `libcap` del corpus publica sólo `.a` (`SHARED=no`), así que enlaza
35# estático y no deja NEEDED colgante.
36#
37# **`--with-user` se deja en `root`.** Lo natural sería `chrony`, pero un chronyd que hace `setuid`
38# a un usuario que no existe en `/etc/passwd` no arranca, y la distro todavía no crea usuarios de
39# servicio. Cambiarlo va junto con esa decisión, no antes.
40#
41# **Consecuencia medida de apagar la criptografía:** el binario sale `-SECHASH`, o sea que para la
42# autenticación simétrica por clave sólo queda MD5. No es un descuido: `sechash` (SHA-2 y CMAC) se
43# implementa contra nettle/gnutls/nss/tomcrypt, las mismas que no están. Lo que el binario SÍ trae,
44# comprobado corriéndolo: `+CMDMON +REFCLOCK +RTC +PRIVDROP +IPV6`, es decir que `libcap` entró de
45# verdad — `cap_set_proc`/`cap_from_text` están en el ELF — y chronyd suelta privilegios.
46#
47# La reproducibilidad ya la trae upstream: el `NTP_ERA_SPLIT` —que por default es «hace 50 años»
48# calculado con `date` en tiempo de configure— respeta `SOURCE_DATE_EPOCH`, que el lab exporta. Sin
49# eso el binario cambiaría cada día sin tocar la receta.
50name    = "chrony"
51version = "4.9"
52license = "GPL-2.0-only"
53
54[source]
55tarball = "https://chrony-project.org/releases/chrony-4.9.tar.gz"
56sha256  = "4924c6f530105bcd5b9e9e33c48a2ae1bfd889222c8480bc41601110efc864d0"
57
58[build]
59compiler = "zig-cc"
60target   = "x86_64-linux-musl"
61link     = "static"
62flags    = []
63
64[build.phases]
65configure = './configure --host-system=Linux --host-machine=x86_64 --prefix=/usr --sysconfdir=/etc --sbindir=/usr/sbin --bindir=/usr/bin --without-nettle --without-gnutls --without-nss --without-tomcrypt --disable-nts --disable-readline --without-editline --without-seccomp'
66compile   = 'make -j"$(nproc)"'
67install   = "make install DESTDIR=/out"
68
69[deps]
70build = ["binutils", "make", "pkgconf", "libcap"]
71
72# ── EL SERVICIO QUE ESTE PAQUETE TRAE (SDD 30) ──────────────────────────────────────────────────
73# Fuera de `hash_inputs`: declarar esto NO re-hashea chrony.
74#
75# ⚠ SIN HORA NO HAY TLS NI FIRMAS, y el síntoma no se parece a la causa: los certificados salen
76# «not yet valid» o «expired», el ACME falla, y todo apunta al servidor web. Una caja de Hetzner
77# arranca con la hora del reloj virtual y sin nadie que la corrija: `netup` pone la red y ahí
78# termina su trabajo. Por eso `perfil.servidor` lo declara desde que nació (§6.2).
79#
80# `-n` (foreground, para arje) y `-u chrony`… NO: el binario ajusta el reloj del sistema, que es
81# capability de root, y bajar de privilegio necesita una cuenta y un `driftfile` suyos. Corre como
82# root, que es lo que hace en la práctica cualquier distro sin un `chrony` user preparado.
83#
84# ⚠ La CONFIG es del sitio: a qué servidores NTP se pregunta es una decisión de quien administra la
85# caja (pool público, el del proveedor, uno propio). El servicio sale 78 nombrando el fichero en vez
86# de inventarse un pool — una caja que se sincroniza contra un servidor que nadie eligió es peor que
87# una sin hora, porque nadie lo mira.
88[[service]]
89label      = "chronyd"
90id         = "01M2EKDA00CHR0NYD7K2X4M9V3"
91exec       = "/bin/busybox"
92argv = ["sh", "-c", "test -f /etc/chrony.conf || { echo 'chronyd: falta /etc/chrony.conf — a qué servidores NTP se pregunta es decisión del sitio, no del paquete' >&2; exit 78; }; mkdir -p /var/lib/chrony; exec /usr/sbin/chronyd -n -f /etc/chrony.conf"]
93envp       = [["PATH", "/usr/sbin:/usr/bin:/sbin:/bin"], ["HOME", "/root"], ["USER", "root"]]
94networking = "full"
95cgroup     = "arje.slice/chronyd"
96restart    = { initial_ms = 1000, max_ms = 30000 }