Configuracion

Configuracion

SSH-Frontière utiliza un archivo TOML para declarar los dominios, acciones, niveles de acceso, argumentos y tokens de autenticacion.

Ubicacion

Ruta por defecto: /etc/ssh-frontiere/config.toml

Override (por orden de prioridad):

  1. --config <ruta> en la linea command= de authorized_keys
  2. Variable de entorno SSH_FRONTIERE_CONFIG
  3. Ruta por defecto

Permisos recomendados: root:forge-runner 640 (adapte el grupo a la cuenta de servicio utilizada).

Estructura del archivo

[global]                              # Parametros generales
[domains.<id>]                        # Dominios funcionales
  [domains.<id>.actions.<id>]         # Acciones autorizadas
    [domains.<id>.actions.<id>.args]  # Argumentos con nombre (opcional)
[auth]                                # Autenticacion RBAC (opcional)
  [auth.tokens.<id>]                  # Tokens con secreto, nivel y tags

Seccion [global]

ClaveTipoDefectoDescripcion
log_filestringobligatorioRuta del archivo de log JSON
default_timeoutentero300Timeout por defecto en segundos
max_stdout_charsentero65536Limite stdout (64 Ko)
max_stderr_charsentero16384Limite stderr (16 Ko)
max_output_charsentero131072Hard limit global (128 Ko)
max_stream_bytesentero10485760Limite de volumen en streaming (10 Mo)
timeout_sessionentero3600Timeout de sesion keepalive
max_auth_failuresentero3Intentos de auth antes de lockout
ban_commandstring""Comando de ban de IP (placeholder {ip})
log_commentsboolfalseRegistrar las lineas # del cliente
expose_session_idboolfalseMostrar el UUID de sesion en el banner

Las claves log_level, default_level y mask_sensitive son aceptadas por el parser para compatibilidad con configuraciones antiguas, pero ya no se utilizan.

Seccion [domains]

Un dominio es un perimetro funcional (ej.: forgejo, infra, notify). Cada dominio contiene acciones autorizadas.

[domains.forgejo]
description = "Forge Git infrastructure"

[domains.forgejo.actions.backup-config]
description = "Respalda la configuracion"
level = "ops"
timeout = 600
execute = "sudo /usr/local/bin/backup-config.sh {domain}"
max_body_size = 65536       # Limite body (64 Ko, opcional)

Cada accion acepta las siguientes claves: description (obligatorio), level (obligatorio), execute (obligatorio), timeout (opcional, override del global), tags (opcional), max_body_size (opcional, defecto 65536 bytes — limitado para el protocolo +body).

Niveles de confianza

Jerarquia estricta: read < ops < admin

NivelUso
readConsulta: healthcheck, status, list
opsOperaciones habituales: backup, deploy, restart
adminTodas las acciones + administracion

Argumentos

Los argumentos se declaran como un diccionario TOML:

[domains.forgejo.actions.deploy.args]
tag = { type = "enum", values = ["latest", "stable", "canary"], default = "latest" }
CampoTipoDescripcion
typestring"enum" o "string"
valueslistaValores autorizados (para enum)
defaultstringValor por defecto (hace el argumento opcional)
sensitiveboolSi true, se enmascara en los logs
freeboolSi true, acepta cualquier valor sin restriccion

Placeholders en execute

PlaceholderDescripcion
{domain}Nombre del dominio (siempre disponible)
{nombre_arg}Valor del argumento correspondiente

Tags de visibilidad

Los tags filtran horizontalmente el acceso a las acciones. Una accion sin tags es accesible para todos. Una accion con tags solo es accesible para las identidades cuyos tags tengan al menos un tag en comun.

[domains.forgejo.actions.deploy]
# ...
tags = ["forgejo", "deploy"]

Seccion [auth] (opcional)

La autenticacion RBAC permite la elevacion de privilegios mediante challenge-response:

[auth]
challenge_nonce = false              # true = modo nonce anti-replay

[auth.tokens.runner-ci]
secret = "b64:c2VjcmV0LXJ1bm5lci1jaQ=="   # Secreto en base64
level = "ops"                               # Nivel otorgado
tags = ["forgejo"]                          # Tags de visibilidad

El secreto debe tener el prefijo b64: y estar codificado en base64. Para generar un secreto:

echo -n "mi-secreto-aleatorio" | base64
# bWktc2VjcmV0by1hbGVhdG9yaW8=

Validacion al cargar

La configuracion se valida integramente en cada carga (fail-fast). En caso de error, el programa se detiene con el codigo 129. Validaciones:

Ejemplo completo

[global]
log_file = "/var/log/ssh-frontiere/commands.json"
default_timeout = 300
max_stdout_chars = 65536
max_stderr_chars = 16384
max_output_chars = 131072
timeout_session = 3600
max_auth_failures = 3

[domains.forgejo]
description = "Forge Git infrastructure"

[domains.forgejo.actions.backup-config]
description = "Respalda la configuracion Forgejo"
level = "ops"
timeout = 600
execute = "sudo /usr/local/bin/backup-config.sh {domain}"

[domains.forgejo.actions.deploy]
description = "Despliegue con tag de version"
level = "ops"
timeout = 300
execute = "sudo /usr/local/bin/deploy.sh {domain} {tag}"

[domains.forgejo.actions.deploy.args]
tag = { type = "enum", values = ["latest", "stable", "canary"], default = "latest" }

[domains.infra]
description = "Infraestructura del servidor"

[domains.infra.actions.healthcheck]
description = "Verificacion de salud"
level = "read"
timeout = 30
execute = "/usr/local/bin/healthcheck.sh"

[auth]
challenge_nonce = false

[auth.tokens.runner-ci]
secret = "b64:c2VjcmV0LXJ1bm5lci1jaQ=="
level = "ops"
tags = ["forgejo"]

Para una guia detallada con todos los casos de uso, consulte la guia de configuracion completa en el repositorio.


Siguiente: Despliegue — poner en produccion.