Segurança & tenant
Como o resource autentica o painel, isola tenants e qual o threat model.
Camada 1 — Bearer token
Toda request HTTP precisa do header de autorização:
Authorization: Bearer <Config.ServerLinkToken>Aceita-se também x-api-key: <token> como fallback para integrações legadas — comportamento idêntico, mesma comparação constant-time. Tokens diferentes do configurado retornam 401.
local function resolveLinkToken(req)
local h = req.headers["authorization"] or req.headers["Authorization"]
if type(h) == "string" then
local bearer = h:match("^[Bb]earer%s+(%S+)%s*$")
if bearer and bearer ~= "" then return bearer end
end
return req.headers["x-api-key"]
endCamada 2 — tenant slug
Além do token, toda request exige o header:
x-tenant-id: <Config.TenantSlug>Se o header faltar ou não bater com Config.TenantSlug, o resource retorna 400 mesmo com token válido. Isso impede que um token vazado seja usado contra outro tenant (defesa em profundidade).
Camada 3 — slug embutido no JWT
No painel, o JWT de acesso inclui tenantId + tenantSlug. O middleware do Nest compara contra o tenant carregado do banco — token com slug "antigo" cai em Token tenant mismatch e exige refresh.
Quando você muda o slug em Configurações → Branding, o backend revoga todas as sessões e reemite tokens novos para a sessão atual. Outros dispositivos vão para login.
Threat model
- Token vazado — atacante consegue ler dados desse tenant específico (não outros). Mitigação: rotacione o
serverLinkTokenvia painel. - Servidor FX comprometido — o atacante já tem acesso ao banco completo. O resource Lua só expõe o que o banco já tem; não há escalada de privilégio.
- Painel comprometido — atacante consegue ler tenants que tem JWT válido.
AuditLogregistra toda mudança relevante; pode usar para forensics. - Sniffer na rede — coloque o FXServer atrás de HTTPS (NGINX/Caddy fazendo TLS termination na frente da porta 30120).
Permissões no painel
Cada tenant tem cargos (Role) com permissões granulares. Cargos padrão criados no register:
Owner— recebe todas as permissões.
Permissões existentes:
users.ban·users.unbaneconomy.resetstaff.managebranding.editgarage.edit·inventory.viewanalytics.view·logs.viewmodules.manage
Auditoria
Toda ação administrativa relevante (mudança de branding, ban, mudança de permissão) entra na tabela AuditLog. O Live Feed do painel mescla esses eventos com os do FXServer em ordem cronológica.