Configuração

Configuração

SSH-Frontière utiliza um ficheiro TOML para declarar os domínios, ações, níveis de acesso, argumentos e tokens de autenticação.

Localização

Caminho por predefinição: /etc/ssh-frontiere/config.toml

Override (por ordem de prioridade):

  1. --config <path> na linha command= do authorized_keys
  2. Variável de ambiente SSH_FRONTIERE_CONFIG
  3. Caminho por predefinição

Permissões recomendadas: root:forge-runner 640 (adapte o grupo à conta de serviço utilizada).

Estrutura do ficheiro

[global]                              # Parâmetros gerais
[domains.<id>]                        # Domínios funcionais
  [domains.<id>.actions.<id>]         # Ações autorizadas
    [domains.<id>.actions.<id>.args]  # Argumentos nomeados (opcional)
[auth]                                # Autenticação RBAC (opcional)
  [auth.tokens.<id>]                  # Tokens com segredo, nível e tags

Secção [global]

ChaveTipoPredefiniçãoDescrição
log_filestringobrigatórioCaminho do ficheiro de log JSON
default_timeoutinteiro300Timeout por predefinição em segundos
max_stdout_charsinteiro65536Limite stdout (64 Ko)
max_stderr_charsinteiro16384Limite stderr (16 Ko)
max_output_charsinteiro131072Hard limit global (128 Ko)
max_stream_bytesinteiro10485760Limite de volume streaming (10 Mo)
timeout_sessioninteiro3600Timeout de sessão keepalive
max_auth_failuresinteiro3Tentativas de auth antes do lockout
ban_commandstring""Comando de ban IP (placeholder {ip})
log_commentsboolfalseRegistar as linhas # do cliente
expose_session_idboolfalseMostrar o UUID da sessão no banner

As chaves log_level, default_level e mask_sensitive são aceites pelo parser para compatibilidade com configurações antigas, mas já não são utilizadas.

Secção [domains]

Um domínio é um perímetro funcional (ex.: forgejo, infra, notify). Cada domínio contém ações autorizadas.

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

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

Cada ação aceita as seguintes chaves: description (obrigatório), level (obrigatório), execute (obrigatório), timeout (opcional, override do global), tags (opcional), max_body_size (opcional, predefinição 65536 octetos — limitado para o protocolo +body).

Níveis de confiança

Hierarquia estrita: read < ops < admin

NívelUtilização
readConsulta: healthcheck, status, list
opsOperações correntes: backup, deploy, restart
adminTodas as ações + administração

Argumentos

Os argumentos são declarados como um dicionário TOML:

[domains.forgejo.actions.deploy.args]
tag = { type = "enum", values = ["latest", "stable", "canary"], default = "latest" }
CampoTipoDescrição
typestring"enum" ou "string"
valueslistaValores autorizados (para enum)
defaultstringValor por predefinição (torna o argumento opcional)
sensitiveboolSe true, mascara nos logs
freeboolSe true, aceita qualquer valor sem restrição

Placeholders no execute

PlaceholderDescrição
{domain}Nome do domínio (sempre disponível)
{nome_arg}Valor do argumento correspondente

Tags de visibilidade

Os tags filtram horizontalmente o acesso às ações. Uma ação sem tags é acessível por todos. Uma ação com tags só é acessível pelas identidades cujos tags tenham pelo menos um tag em comum.

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

Secção [auth] (opcional)

A autenticação RBAC permite a elevação de privilégios via challenge-response:

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

[auth.tokens.runner-ci]
secret = "b64:c2VjcmV0LXJ1bm5lci1jaQ=="   # Segredo em base64
level = "ops"                               # Nível concedido
tags = ["forgejo"]                          # Tags de visibilidade

O segredo deve ser prefixado por b64: e codificado em base64. Para gerar um segredo:

echo -n "meu-segredo-aleatorio" | base64
# bWV1LXNlZ3JlZG8tYWxlYXRvcmlv

Validação no carregamento

A configuração é validada integralmente a cada carregamento (fail-fast). Em caso de erro, o programa termina com o código 129. Validações:

Exemplo 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 = "Salvaguarda a configuração Forgejo"
level = "ops"
timeout = 600
execute = "sudo /usr/local/bin/backup-config.sh {domain}"

[domains.forgejo.actions.deploy]
description = "Implementação com tag de versão"
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 = "Infraestrutura do servidor"

[domains.infra.actions.healthcheck]
description = "Verificação de saúde"
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 um guia detalhado com todos os casos de utilização, consulte o guia de configuração completo no repositório.


Seguinte: Implementação — colocar em produção.