Hodei-Shield Agent: guía beta para Windows¶
Instala la versión 2.20.0 (Windows requiere 2.13.0 o posterior) en
Windows 10/11 o Server 2016 y posteriores, x64. Usa Windows PowerShell 5.1
como Administrador. Necesitas HTTPS a la URL de tu plataforma y a
hs-agent-releases.s3.gra.io.cloud.ovh.net, un token de inscripción (sirve
una vez; lo crea en la consola el administrador de tu organización o el de tu
MSSP), un id de agente (letras, dígitos, . _ : -; será el nombre permanente
de la máquina), la URL de la plataforma (https://…) y OpenSSL 3 (Git for
Windows lo incluye; un Windows limpio no lo trae, ver paso 2). MEASURED (medido): ejecutado en un equipo Windows limpio.
Si un paso falla, detente y escribe a info@hodeitek.com. Los informes de error van a Sentry por defecto: para desactivarlos,
crea la marca justo después de instalar el .msi (final de esta guía).
1. Descarga¶
MEASURED (con una versión publicada anterior en $V). Solo desde el almacén de versiones, nunca desde un enlace de correo o chat.
$V = '<versión>'
$B = 'https://hs-agent-releases.s3.gra.io.cloud.ovh.net'
$file = "hodei-shield-$V-x86_64.msi"
New-Item -ItemType Directory hodei-install | Out-Null; cd hodei-install
foreach ($n in $file, 'SHA256SUMS', 'SHA256SUMS.sig') { Invoke-WebRequest "$B/agent/$V/$n" -OutFile $n }
Antes de ejecutar nada, comprueba que la descarga es auténtica: verificar una versión del agente y verificar la descarga.
2. Verificar e instalar¶
El .msi lleva firma Authenticode (editor Hodeitek S.L.) y SHA256SUMS.sig es
la firma de versión (Ed25519) sobre SHA256SUMS. Guarda la clave de versión
(página independiente; su huella, no el checksum del paquete (el paquete se comprueba con SHA256SUMS), es el SHA-256 de sus 32 bytes crudos: 8b730d2fcbd90e2656bd9b3f265638f1e8e8ac2379d48b0636feb5efe5a88f07):
@'
-----BEGIN PUBLIC KEY-----
MCowBQYDK2VwAyEAEUqKd+ot7BESwk+vf6EVBKudMi6F6jmY3dJeHXfCWkQ=
-----END PUBLIC KEY-----
'@ | Set-Content -Encoding ascii hodei-shield-release.pub.pem
MEASURED: las
comprobaciones, el rechazo de ficheros alterados y una instalación correcta del
conjunto firmado 2.13.0.
& { $ErrorActionPreference = 'Stop'
if (-not (Test-Path -LiteralPath $file)) { throw "$file is not in this folder" }
$auth = Get-AuthenticodeSignature .\$file
$auth | Format-List Status, SignerCertificate, TimeStamperCertificate
if ($auth.Status -ne 'Valid' -or $auth.SignerCertificate.Subject -notmatch 'CN=Hodeitek S\.L\.') { throw 'Authenticode: not Valid or not signed by Hodeitek S.L.' }
$ssl = 'C:\Program Files\Git\usr\bin\openssl.exe'
if (-not (Test-Path -LiteralPath $ssl)) { throw "OpenSSL 3 not found at $ssl" }
if (-not (Test-Path -LiteralPath hodei-shield-release.pub.pem)) { throw 'hodei-shield-release.pub.pem is missing: write it first' }
& $ssl version
& $ssl base64 -d -A -in SHA256SUMS.sig -out SHA256SUMS.sig.raw
if ($LASTEXITCODE -ne 0) { throw 'SHA256SUMS.sig is not valid base64' }
(Get-Item SHA256SUMS.sig.raw).Length
& $ssl pkeyutl -verify -rawin -pubin -inkey hodei-shield-release.pub.pem -sigfile SHA256SUMS.sig.raw -in SHA256SUMS
if ($LASTEXITCODE -ne 0) { throw 'Signature Verification Failure: do not install' }
$want = ((Get-Content SHA256SUMS | Where-Object { $_ -match (' ' + [regex]::Escape($file) + '$') }) -split '\s+')[0]
if ($file -notmatch '\.msi$' -or -not $want) { throw "$file is not an .msi listed in SHA256SUMS" }
if ((Get-FileHash $file -Algorithm SHA256).Hash -ieq $want) { 'OK' } else { throw 'checksum mismatch: do not install' }
$p = Start-Process msiexec.exe -ArgumentList '/i', "`"$PWD\$file`"", '/qn', '/l*v', "`"$PWD\install.log`"" -Wait -PassThru
if ($p.ExitCode -ne 0) { throw "msiexec exit $($p.ExitCode): see install.log" }
}
¿No hay OpenSSL en este equipo? Un Windows recién instalado no lo trae. Instala Git for Windows (incluye OpenSSL 3 en esa ruta) o haz esta comprobación de firma en otro equipo que tenga OpenSSL 3, con los mismos tres ficheros. La firma Authenticode del instalador se comprueba aparte (
Get-AuthenticodeSignaturedebe decirValid, firmanteHodeitek S.L.): esa no te la saltes.
Debes ver 64, Signature Verified Successfully, OK. Nunca ejecutes un msiexec
suelto ni pongas el token en el instalador. El servicio espera hasta que te inscribas.
3. Configurar e inscribir¶
MEASURED. El token se teclea en un aviso y se guarda en un fichero solo para administradores.
@'
platform_url = "https://app.hodeishield.com"
state_dir = 'C:\ProgramData\Hodei-Shield\state'
'@ | Set-Content -Encoding ascii 'C:\Program Files\Hodei-Shield\Agent\hodei-shield.toml'
$ErrorActionPreference = 'Stop'
New-Item -ItemType Directory C:\ProgramData\Hodei-Shield\token -ErrorAction Stop | Out-Null
icacls C:\ProgramData\Hodei-Shield\token /inheritance:r /grant:r '*S-1-5-32-544:(OI)(CI)F' '*S-1-5-18:(OI)(CI)F'
if ($LASTEXITCODE -ne 0) { throw 'icacls failed' }
$secure = Read-Host -AsSecureString 'Enrollment token for THIS machine'
[Net.NetworkCredential]::new('', $secure).Password | Set-Content -NoNewline -Encoding ascii C:\ProgramData\Hodei-Shield\token\enroll.token
$secure.Dispose()
cd 'C:\Program Files\Hodei-Shield\Agent'
try {
Get-Content -Raw C:\ProgramData\Hodei-Shield\token\enroll.token | & '.\hodei-shield.exe' enroll --token-stdin --agent-id '<el id que anotaste para ESTA máquina>'
} finally { Remove-Item -Recurse -Force C:\ProgramData\Hodei-Shield\token }
Restart-Service hodei-shield
secret store ACL measured and ACCEPTED y enrolled as a signing producer; los ids son de ejemplo):
enrolled: producer=endpoint_agent:<your-agent-id> public_key_id=<uuid> tenant_id=<uuid>
self-update: after checking these against the console, run from an elevated prompt (Run as administrator) in the agent's install folder (<Program Files>\Hodei-Shield\Agent):
hodei-shield.exe pin-update-identity --tenant <uuid> --producer "endpoint_agent:<your-agent-id>" --public-key-id <uuid>
If the agent service is stopped, start it: Start-Service hodei-shield. If it is running and was waiting for this enrollment, it will pick it up within 5 minutes; to pick it up now: Restart-Service hodei-shield
tenant_id y el id del agente coinciden con lo que muestra la consola y ejecuta la línea pin-update-identity que imprime, tal cual, desde una consola elevada en C:\Program Files\Hodei-Shield\Agent. Registra qué inquilino e identidad pueden autorizar las futuras actualizaciones de este agente; no cambia nada más. Después, Restart-Service hodei-shield para que empiece a informar ya. El primer envío puede tardar varios minutos en Windows.
Si
falla, no reutilices el token: pide uno nuevo. Error de certificado o TLS: no añadas ningún certificado ni
desactives comprobaciones; el agente solo confía en C:\ProgramData\Hodei-Shield\state\platform-ca.pem. Envía la salida
de hodei-shield.exe diagnose a tu administrador. MEASURED (Windows 11, 2026-10-28): una instalación silenciosa sale con 1603 y Error 1925 en install.log si no ejecutas como Administrador; no se instala nada (no medido en Server). Otros fallos: resolución de problemas.
4. Comprobar en la consola¶
MEASURED. Running y self-test con salida 0 (imprime líneas INFO):
Aviso esperado: las versiones estables de macOS y Windows no se actualizan solas. Aproximadamente una vez por hora el registro muestra una línea
WARNupdate poll/apply did not succeed; continuing on current versioncon el motivoself-update is not supported on this OS by this release. Es lo esperado y no indica un problema: se actualiza instalando el paquete nuevo. (Una versión posterior lo registra una sola vez, como información.)Controles en «Error» en esta beta: algunos controles pueden aparecer como «Error» en sistemas cuyo idioma no es el inglés, o porque el agente se ejecuta sin permisos de administrador. No significa que el control esté fallando: el agente no pudo leerlo con fiabilidad y no lo cuenta como cumplido. La próxima versión beta lo corrige.
Problema conocido (OpenSSH Server en Windows): si tu servicio
sshdarranca con un fichero de configuración distinto del predeterminado (-f <ruta>en la línea de comandos del servicio) en un Windows cuyo idioma de visualización no es el inglés, los controles de SSH pueden evaluarse contraC:\ProgramData\ssh\sshd_configen lugar de tu fichero. La configuración predeterminada no se ve afectada. Se corrige en la próxima versión; mientras tanto, avísanos si usas-f.
5. Actualizar a mano¶
No te inscribas de nuevo. La versión estable 2.20.0 no aplica sola las actualizaciones de Windows:
actualiza a mano con el .msi nuevo, sin token nuevo. (Las compilaciones del canal beta pueden actualizarse
solas, solo si la política firmada de la consola aprueba el digest del MSI nuevo y un administrador ha fijado
una vez la identidad de actualización; si no, identity_unpinned; MEASURED el 2026-10-27 por Hodeitek en Windows 11,
2.17.0-beta.1 a beta.3.) MEASURED (2.12.3 a 2.12.4: configuración y estado conservados, siguiente envío aceptado). Copia la
configuración, descarga el nuevo .msi (paso 1) y ejecuta de nuevo el bloque del
paso 2 con el nuevo $V y $file. El instalador rechaza versiones anteriores (salida 1603).
Get-Service hodei-shield debe decir Running; en la carpeta del agente, version
imprime la versión nueva y self-test sale con 0. Si falta hodei-shield.toml, restaura la copia y Restart-Service hodei-shield.
6. Desinstalación¶
MEASURED. Antes, pide a tu administrador que revoque la máquina (consola:
Endpoints, el endpoint, Revoke enrolment). Usa la ruta absoluta del .msi
que guardaste. Queda: C:\ProgramData\Hodei-Shield\state (clave privada, cola, CA),
la carpeta de registros C:\Program Files\Hodei-Shield\Agent\logs (MEASURED, Windows 11 y Server 2022, 2026-10-28), Agent\hodei-shield.toml solo si lo creaste, telemetry-off y %APPDATA%\Hodei-Shield por usuario.
$msi = (Resolve-Path '<carpeta donde lo descargaste>\hodei-shield-<version>-x86_64.msi').Path
(Start-Process msiexec.exe -ArgumentList '/x', "`"$msi`"", '/qn' -Wait -PassThru).ExitCode
MEASURED, Windows 11, 2026-10-29; irreversible, solo tras revocar). La carpeta de estado está
protegida para que solo la abran Administradores, SYSTEM y la cuenta del servicio, y una carpeta protegida puede
negar el borrado incluso a un PowerShell elevado. La guarda se detiene si una carpeta fue sustituida por un enlace:
foreach ($p in 'C:\ProgramData\Hodei-Shield', 'C:\Program Files\Hodei-Shield') {
if (Test-Path -LiteralPath $p) {
if ((Get-Item -LiteralPath $p -Force).Attributes -band [IO.FileAttributes]::ReparsePoint) { throw "$p is a link: stop and ask for help" }
Remove-Item -LiteralPath $p -Recurse -Force
}
}
Remove-Item -LiteralPath "$env:APPDATA\Hodei-Shield" -Recurse -Force -ErrorAction SilentlyContinue # por usuario
New-Item -ItemType File -Force "$env:ProgramData\Hodei-Shield\telemetry-off" | Out-Null; Restart-Service hodei-shield
(MEASURED). Ayuda: info@hodeitek.com o el botón Beta de la consola.