gioser

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…

TOML 1572Shell 203Rust 109Markdown 993728 Sutichaykuna

⎇ main scripts/harkaq/harkaq-farm-setup.sh Shell · 68 siq'ikuna · 3.8 KB Ñawpa willay ch'uya

takana: el worker pasa a /opt/takana y takana-farm.service aacee245d · Sergio ·

1#!/bin/sh
2# harkaq-farm-setup.sh <ip> — deja un worker de la granja listo para barrer con harkaq.
3#
4# La granja es el compilador continuo (SDD 16 §4.8), así que esto tiene que ser reproducible y
5# no un copy-paste. Idempotente: re-correrlo sobre un worker ya provisto no rompe nada.
6#
7# Precondición dura: la golden 408909310 (kernel 6.17 ⇒ Landlock ABI 7). Con la vieja (6.8, ABI 4)
8# el barrido correría y daría `SinEvidencia` en TODO — que es lo que D7 manda y lo que no sirve
9# para medir. Por eso lo primero que hace es verificar el ABI y abortar si no llega.
10set -eu
11
12IP="${1:?uso: harkaq-farm-setup.sh <ip>}"
13KEY="${SSH_KEY:-$HOME/.ssh/github5}"
14REMOTE="${REMOTE:-/opt/takana}"
15SSH="ssh -i $KEY -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o BatchMode=yes"
16HERE="$(cd "$(dirname "$0")" && pwd)"
17
18echo "== 1/4 verificando el ABI (gate: >=7 o no hay evidencia)"
19abi=$($SSH "root@$IP" 'python3 -c "
20import ctypes; libc=ctypes.CDLL(\"libc.so.6\",use_errno=True)
21print(libc.syscall(444,None,0,1))"' 2>/dev/null | tr -d '\r')
22echo "   kernel: $($SSH "root@$IP" uname -r 2>/dev/null)  →  Landlock ABI = $abi"
23if [ "${abi:-0}" -lt 7 ]; then
24    echo "   ABORTO: ABI $abi < 7 ⇒ el kernel no audita denegaciones. Todos los veredictos"
25    echo "           saldrían SinEvidencia. ¿El worker salió de la golden 408909310?"
26    exit 4
27fi
28
29echo "== 2/4 copiando y compilando las piezas"
30$SSH "root@$IP" "mkdir -p /root/.cache/harkaq $REMOTE/scripts/harkaq"
31scp -q -i "$KEY" -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
32    "$HERE"/harkaq-uapi.h "$HERE"/harkaq-audit.c "$HERE"/harkaq-exec.c \
33    "$HERE"/harkaq-policy.sh "$HERE"/harkaq-verdict.py "$HERE"/harkaq-suggest.py \
34    "$HERE"/harkaq-base-closure.py "$HERE"/fase2-barrido.sh \
35    "root@$IP:$REMOTE/scripts/harkaq/"
36# harkaq-uapi.h no es una comodidad: el worker tiene headers 6.8 sobre kernel 6.17 y NO define
37# ni AUDIT_LANDLOCK_ACCESS. Sin él el lector filtraría por un número que no conoce y vería cero
38# denegaciones — el falso `Hermetico` de D9, por headers viejos (§4.8).
39$SSH "root@$IP" "cd $REMOTE/scripts/harkaq && chmod +x *.sh *.py &&
40    gcc -O1 -Wall -o /root/.cache/harkaq/harkaq-audit harkaq-audit.c &&
41    gcc -O1 -Wall -static -o /root/.cache/harkaq/harkaq-exec harkaq-exec.c &&
42    echo '   compiladas ✓'"
43
44echo "== 3/4 derivando el runtime base DEL ROOTFS DEL WORKER"
45# El runtime base es POR ROOTFS (§4.3) — derivarlo del rootfs del worker, no copiar el del
46# laptop: los sonames de las libs (libz.so.1.3.2, …) dependen de la versión de Alpine que tenga.
47$SSH "root@$IP" "cd $REMOTE &&
48    python3 scripts/harkaq/harkaq-base-closure.py .dev-fs/alpine \
49        /bin/sh /bin/busybox /bin/bash /bin/coreutils /usr/bin/env 2>/dev/null \
50        > /root/.cache/harkaq/base.policy
51    printf 'ro /usr/lib/os-release\n' >> /root/.cache/harkaq/base.policy
52    # Sondas de compilador de Alpine: se DENIEGAN y se clasifican (D3). Concederlas dejaría a
53    # zig/configure usar el gcc de Alpine por detrás — justo lo que la campaña matar-gcc caza.
54    for p in /usr/bin/gcc /usr/bin/ldd /usr/bin/c89 /usr/bin/c99 /usr/bin/cpp /usr/bin/getent; do
55        printf '# expect %s\n' \"\$p\" >> /root/.cache/harkaq/base.policy
56    done
57    echo \"   runtime base: \$(grep -c '^ro ' /root/.cache/harkaq/base.policy) reglas + \$(grep -c '^# expect' /root/.cache/harkaq/base.policy) esperadas\""
58
59echo "== 4/4 comprobando la cadena de evidencia de punta a punta"
60$SSH "root@$IP" "cd $REMOTE && cargo build -q -p takana-cli 2>/dev/null || true; ls target/debug/hammer >/dev/null 2>&1 && echo '   hammer-cli listo ✓' || echo '   OJO: falta target/debug/hammer (cargo build -p takana-cli)'"
61
62cat <<EOF
63
64listo. En el worker:
65  cd $REMOTE
66  export HARKAQ_BIN=/root/.cache/harkaq HARKAQ_BASE=/root/.cache/harkaq/base.policy
67  scripts/harkaq/fase2-barrido.sh recipes/zlib.toml recipes/bzip2.toml ...
68EOF