Rebelión en la granja — investigación y laboratorio de dispositivos

Investigación sobre granjas de dispositivos y automatización completa para
levantar un laboratorio Android sobre un chasis de blades Debian.

Conclusión que ordena el repositorio: el cuello de botella nunca fue el
cómputo sino la identidad. Desde que la atestación de dispositivo pasó de
estadística a criptográfica, un servidor no puede hacerse pasar por un
teléfono — le falta una clave grabada en fábrica que ningún software produce.

Contenido:

- 01_investigacion/ — capa de identidad (verificación telefónica, eSIM,
  reputación de IP, atestación por hardware, correlación entre cuentas),
  mercado y players, stack técnico, marco legal en la UE
- 02_device_lab/ansible/ — Ansible para 16 blades: preflight de solo lectura
  que identifica el hardware por DMI, despliegue de redroid en Docker y
  control de flota por adb. Solo ansible.builtin, sin colecciones externas
- docs/ — requisitos, costes y repaso de seguridad con 11 hallazgos
- 03_charla/ — guion para HackMadrid / Hackmeeting València

Estado: la automatización está escrita pero SIN ejecutar contra hardware.
YAML validado, plantillas renderizadas en ambos modos de red y fleet.sh
comprobado con bash -n. El modelo de blade sigue sin confirmar.
This commit is contained in:
s1to 2026-08-08 19:42:14 +02:00
commit 74bfbe9437
42 changed files with 2989 additions and 0 deletions

View file

@ -0,0 +1,80 @@
# ---------------------------------------------------------------------------
# Mandos del operador. Lo que se toca normalmente está aquí.
# Los defaults internos de cada rol están en roles/<rol>/defaults/main.yml
# ---------------------------------------------------------------------------
# --- Android ---------------------------------------------------------------
# Imagen de redroid. Tags: 11.0.0-latest, 12.0.0-latest, 13.0.0-latest, 14.0.0-latest
# Android 13 es el punto dulce: memfd en vez de ashmem (un módulo de kernel menos)
# y todavía ligero.
redroid_image: "redroid/redroid:13.0.0-latest"
# RAM por instancia. 2 GB es el mínimo cómodo para Android 13.
redroid_mem_mb: 2048
# RAM que se le deja al anfitrión (Debian + Docker + margen).
redroid_host_reserve_mb: 1500
# Instancias por nodo. 0 = automático a partir de la RAM real del blade:
# (RAM_total - reserva) / redroid_mem_mb
# Con 8 GB por blade eso da 3. Súbelo a mano solo si sabes lo que haces.
redroid_instances: 0
# Tope duro por si un blade tiene mucha RAM y te comes los cores.
redroid_max_instances: 8
# Pantalla de las instancias.
redroid_width: 720
redroid_height: 1280
redroid_dpi: 320
# Sin GPU en los blades -> render por software. Con GPU pasable: "host".
redroid_gpu_mode: guest
# --- Red -------------------------------------------------------------------
# portmap -> cada Android detrás de NAT, adb en <ip_blade>:<puerto>
# Funciona en cualquier sitio. Es el default sensato.
#
# macvlan -> cada Android coge una IP REAL de la LAN a través del switch
# FlexIO del chasis. Los APKs se ven como pares de red de verdad.
# Es lo que quieres para el caso de los dos APKs de oasis_mobile.
# Ojo al gotcha documentado en el README.
redroid_network_mode: portmap
# --- solo si redroid_network_mode == macvlan ---
redroid_macvlan_network: redroid-lan
redroid_macvlan_parent: "" # p.ej. eno1 (interfaz física del blade)
redroid_macvlan_subnet: "" # p.ej. 10.0.0.0/24
redroid_macvlan_gateway: "" # p.ej. 10.0.0.1
redroid_macvlan_ip_prefix: "" # p.ej. "10.0.0." (el offset va por host en el inventario)
# --- solo si redroid_network_mode == portmap ---
# Primer puerto adb en el blade. Las instancias ocupan base, base+1, base+2...
redroid_adb_base_port: 5555
# A qué interfaz se ata adb. 0.0.0.0 = TODAS, y adb no tiene autenticación:
# quien llegue al puerto es root en el Android, y desde un contenedor privilegiado
# eso es una vía hacia el anfitrión. Ver docs/seguridad.md (hallazgo S1).
#
# Pon aquí la IP interna del blade en la red del chasis para que adb no escuche
# en nada más. Por host, en el inventario:
# blade-02: { ansible_host: 10.0.0.12, redroid_adb_bind_ip: 10.0.0.12 }
redroid_adb_bind_ip: "0.0.0.0"
# --- Rutas -----------------------------------------------------------------
redroid_base_dir: /opt/redroid
# --- Preflight -------------------------------------------------------------
# Flags de CPU que Android x86_64 necesita. Si un blade no las tiene,
# preflight lo marca como NO APTO en vez de dejarte descubrirlo a medio despliegue.
preflight_required_cpu_flags:
- sse4_2
- ssse3
- popcnt