Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
Ferramentas/GitLabGitLab/eveo7/aa-discord-audit
Ferramentas DefensivasAuditoria de ConfiguraçãoGerenciamento de Identidade e Acesso (IAM)Resposta a Incidentes
GitLabeveo7/aa-discord-audit

AA Discord Audit

Auditoria de reconciliação para a integração do Discord do Alliance Auth: encontra membros do servidor que possuem funções gerenciadas pelo AA que o Auth nunca concedeu e remove ou expulsa-os sob uma política controlada pelo operador. Aplicativo Django comunitário independente.

Ver Repositório
há 1 mêsAinda não revisado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

aa-discord-audit

Versão no PyPI Versões Python suportadas Licença: MIT

Auditoria de reconciliação para a integração Discord do Alliance Auth. Compara as atribuições reais de cargos no servidor Discord configurado contra o estado expresso no Alliance Auth (Grupos + Estado por utilizador) e fecha a lacuna pela qual moderadores podem atribuir manualmente cargos com nomes AA a utilizadores que o AA desconhece.

Estado: alpha (0.1.x). A API pública e as configurações podem ainda ser alteradas antes da versão 1.0.

Conteúdo

  • Postura de segurança
  • Como funciona
  • Requisitos
  • Instalação
  • Início rápido
  • Permissões
  • Configurações
  • Comandos de gestão
  • Auditoria periódica (Celery beat)
  • Tarefas Celery
  • Painel do operador
  • Observabilidade
  • Limitações
  • Documentação
  • Desenvolvimento

Postura de segurança

A auditoria é segura por defeito:

  • A primeira execução após a instalação está bloqueada em modo de simulação (dry-run), independentemente das configurações do operador. Para libertar o bloqueio é necessário um InitialAuditAcknowledgement explícito (apenas administrador ou shell).
  • A política predefinida é report para todas as categorias — ações destrutivas são opt-in.
  • As linhas do registo de auditoria (AuditRun, AuditFinding, AuditInvocation, ConfigChangeLog) são apenas de adição (append-only) ao nível do gestor e das instâncias; atualizações em massa update() / bulk_update() estão bloqueadas.
  • Os URLs de Webhook são tratados como credenciais e ocultados dos registos, mensagens de exceção e argv persistido.

Como funciona

Cada membro do servidor é classificado numa das seguintes categorias:

CategoriaSignificado
unknown_guestMembro do Discord que o AA desconhece completamente
linked_no_permIdentidade conhecida do AA mas sem discord.access_discord
bot_filteredConta de bot configurada — nunca é alvo de ação

O operador mapeia cada categoria para uma ação:

AçãoComportamento
reportRegistar a descoberta; sem alteração no Discord
stripRemover cargos geridos pelo AA
strip_kickRemover cargos geridos pelo AA e expulsar do servidor

O mapeamento é a configuração AA_DISCORD_AUDIT_POLICY; sobreposições por grupo e por estado aninham-se dentro de cada categoria.

Requisitos

  • Python 3.10–3.13
  • Django 4.2 ou 5.2
  • Alliance Auth 4.x ou 5.x
  • Módulo de serviço Discord do Alliance Auth (allianceauth.services.modules.discord) instalado e configurado (token do bot + servidor)

Instalação```sh

pip install aa-discord-audit

root@kitploit:~
No seu Auth `local.py`:```python
# `aa_discord_audit` must appear AFTER
# `allianceauth.services.modules.discord` so the discord module's
# models load first; `apps.ready()` raises `ImproperlyConfigured`
# otherwise.
INSTALLED_APPS += ["aa_discord_audit"]

MIDDLEWARE += [
    "aa_discord_audit.current_user.CurrentUserMiddleware",
]

Em seguida, execute as migrações:```sh python manage.py migrate aa_discord_audit

root@kitploit:~
O `CurrentUserMiddleware` é obrigatório — `apps.ready()` levanta
`ImproperlyConfigured` se estiver faltando. É o que permite que o
manipulador de sinal `ConfigChangeLog` atribua edições de admin a um usuário real
em vez de `<system>`.

## Início rápido

1. Conceda `aa_discord_audit.run_audit` à função de operador que executa
   auditorias.
2. Execute uma auditoria de simulação:   ```sh
   python manage.py audit_discord_roles --action report
  1. Revise as descobertas em Discord Audit → Audit runs no painel Auth.
  2. Libere o bloqueio da primeira execução — crie uma linha InitialAuditAcknowledgement através do admin, ou execute python manage.py audit_acknowledge_initial. Ambos requerem aa_discord_audit.run_audit e aa_discord_audit.acknowledge_initial_audit.
  3. Reexecute com a ação destrutiva de sua escolha quando estiver pronto.

Permissões

Os codinomes manage_* são divididos por raio de explosão para que um júnior com manage_bot_account_uid não possa também desarmar a auditoria editando ManagedRoleException.

Configurações

Todas as configurações são opcionais. Os padrões são seguros.```python

Action policy. Bare-string form below is shorthand for

{"default": ""}; use the nested form for per-group / per-state

overrides keyed by AA group name and state name.

AA_DISCORD_AUDIT_POLICY = { "unknown_guest": "report", "linked_no_perm": "report", # "linked_no_perm": { # "default": "strip", # "by_state": {"Guest": "report"}, # "by_group": {"Directors": "report"}, # }, }

AA-notify fan-out to permission holders.

AA_DISCORD_AUDIT_NOTIFY_ADMINS = True

Discord webhook for run summaries. Treat as a credential.

AA_DISCORD_AUDIT_WEBHOOK_URL = None

uids skipped as bot accounts (in addition to the BotAccountUid admin

table).

AA_DISCORD_AUDIT_BOT_UIDS = []

Auto-discover bot accounts by Discord nickname heuristics. Reserved

for v2; not implemented in the MVP. The startup validator raises

ImproperlyConfigured if set to True — keep this False and use the

explicit BotAccountUid admin table instead.

AA_DISCORD_AUDIT_AUTO_DISCOVER_BY_NICKNAME = False

Retention. 0 disables pruning; the validator refuses 0 unless the

acknowledged flag below is also set.

AA_DISCORD_AUDIT_RUN_RETENTION_DAYS = 180 AA_DISCORD_AUDIT_RETENTION_OPT_OUT_ACKNOWLEDGED = False

Idempotency-key TTL. When positive, prune_audit_runs releases

AuditRun.idempotency_key on rows older than the cutoff while the

row itself stays for RUN_RETENTION_DAYS. 0 (default) disables the

expiry; the key dies with the row.

AA_DISCORD_AUDIT_IDEMPOTENCY_KEY_TTL_DAYS = 0

Per-run deadline. The Celery task's soft_time_limit follows.

AA_DISCORD_AUDIT_RUN_DEADLINE_MINUTES = 60

Rolling 24h rate limit on accepted audit triggers per user.

DISABLED is an opt-out gate; refuses to take effect unless

explicitly toggled.

AA_DISCORD_AUDIT_RUN_RATE_LIMIT_PER_DAY = 5 AA_DISCORD_AUDIT_RUN_RATE_LIMIT_DISABLED = False

Discord webhook delivery tuning.

AA_DISCORD_AUDIT_WEBHOOK_TIMEOUT = 10 AA_DISCORD_AUDIT_WEBHOOK_MAX_RETRIES = 3

Opt-in: bulk PATCH role strip. Faster on large guilds; off by default

while we collect operator feedback on Discord-side rate-limit shape.

AA_DISCORD_AUDIT_USE_BULK_ROLE_STRIP = False

Periodic (Celery beat) audit. Destructive actions on the unattended

beat require this explicit opt-in, independent of the one-shot

first-run lock: a beat run carrying strip/kick is coerced to report

otherwise, with a startup warning on mismatch.

AA_DISCORD_AUDIT_BEAT_ALLOW_DESTRUCTIVE = False

Coarse global floor between beat runs, in minutes. 0 (default)

disables it — the Celery beat schedule is the primary cadence

control. A backstop against a misconfigured fast schedule

(QueueOnce only dedupes concurrent ticks, not back-to-back ones).

AA_DISCORD_AUDIT_BEAT_MIN_INTERVAL_MINUTES = 0

Pin the CLI acting user to a Django username (the "service principal"

pattern). The management command has no HTTP request, so the actor is

normally derived from the OS login; set this for clean, stable

ConfigChangeLog attribution from cron and manual CLI alike. Resolved

and permission-checked per invocation.

AA_DISCORD_AUDIT_CLI_ACTOR = None

Guild presence sampling. Requires the [metrics] extra and

aa-discord-audit's own /audit/discord/metrics scrape target.

PRESENCE_ENABLED is independent of [metrics]: even without

the extra, disabling it suppresses the background sampler task.

AA_DISCORD_AUDIT_PRESENCE_ENABLED = True

Desired presence sample cadence in minutes. Values below 5 fall

back to the default of 10.

AA_DISCORD_AUDIT_PRESENCE_SAMPLE_INTERVAL_MINUTES = 10

Gate for the members_by_group aggregate gauge. Disable if the

number of AA groups causes unacceptable cardinality.

AA_DISCORD_AUDIT_METRICS_MEMBERS_BY_GROUP = True

Gate for the members_by_role aggregate gauge. Off by default —

Discord guilds can have hundreds of roles; enable only after

reviewing role count to avoid a cardinality explosion.

AA_DISCORD_AUDIT_METRICS_MEMBERS_BY_ROLE = False

root@kitploit:~
## Comandos de gerenciamento

| Comando                  | Propósito                                                          |
|--------------------------|------------------------------------------------------------------|
| `audit_discord_roles`    | Ponto de entrada principal. `--action {report,strip,strip_kick}`.       |
| `audit_discord_roles --resume <run_id>`        | Revisitar resultados PENDING de uma execução existente.       |
| `audit_discord_roles --abandon <run_id>`       | Marcar uma execução travada como ABANDONED.                     |
| `audit_discord_roles --diff <run_id>`          | Comparar estado atual com uma execução histórica.         |
| `audit_discord_roles --explain <member_id>`    | Classificação por membro (somente leitura).             |
| `audit_discord_roles --policy-preview <json>`  | Projetar uma política hipotética.                     |
| `audit_discord_roles --from-fixture <path>`    | Reproduzir contra um snapshot JSON.                    |
| `audit_acknowledge_initial` | Liberar o bloqueio de dry-run da primeira execução a partir do console.          |
| `audit_benchmark`        | Benchmark de dimensionamento de carga sintética (veja [`docs/performance.md`](https://gitlab.com/eveo7/aa-discord-audit/-/blob/main/docs/performance.md)). |
| `prune_audit_runs`       | Poda de retenção.                                               |
| `audit_abandon_stuck_runs` | Reconciliar execuções PENDING travadas que vazaram de um worker que crashou — define como ABANDONED (veja o runbook; uma execução RUNNING travada usa `audit_discord_roles --abandon`). |

Uma execução de longa duração de ``audit_discord_roles`` reage limpa a ``SIGTERM``
e ``SIGINT``: a execução é definida como ``INTERRUPTED`` e o loop de aplicação
sai no próximo limite de descoberta para que o trabalho parcial seja
durável no registro de auditoria. ``audit_discord_roles --resume <run_id>``
retoma a execução a partir dos achados ``PENDING`` restantes.

## Auditoria periódica (Celery beat)

`audit_orphan_members` executa o mesmo pipeline de build + apply em um
agendamento que você configura no Celery beat (não é agendado por padrão).
O caminho não supervisionado é controlado por segurança:

- **Apenas relatório a menos que armada.** Uma execução do beat é coagida a `report`
  independentemente da política a menos que `AA_DISCORD_AUDIT_BEAT_ALLOW_DESTRUCTIVE`
  esteja definida — liberar o bloqueio único de primeira execução para uma execução manual via CLI
  não arma o beat. Um aviso na inicialização é acionado quando a política é
  destrutiva, mas o beat não está ativado.
- **Atribuída.** Cada execução do beat escreve um `AuditInvocation` aceito de ator do sistema
  (`triggered_by=BEAT`), para que o rastro de auditoria do auditor
  cubra também execuções não supervisionadas.
- **Auto-recuperação.** Uma execução interrompida por um limite de tempo suave ou uma queda de worker
  é reconciliada ao estado `INTERRUPTED` retomável no próximo
  tick. `AA_DISCORD_AUDIT_BEAT_MIN_INTERVAL_MINUTES` é um piso aproximado
  contra um agendamento rápido mal configurado.

## Tarefas do Celery

O pacote registra cinco tarefas sob o prefixo de nome `aa_discord_audit.*`.
Apenas as tarefas do beat precisam de um agendamento; as demais são orientadas a eventos
ou executadas sob demanda. Nenhuma é agendada para você.

| Tarefa | Como executa | O que faz |
|------|-------------|--------------|
| `aa_discord_audit.audit_orphan_members` | Celery beat — você agenda | A auditoria não supervisionada de build + apply descrita acima. Apenas relatório a menos que armada; compartilha o bloqueio `discord.user_actions.<uid>` com `update_groups` do AA. |
| `aa_discord_audit.retry_pending_kicks` | Celery beat — você agenda | Varredura limitada que reenvia expulsões adiadas por uma falha transitória do Discord, respeitando um cooldown por linha para que um membro com falha persistente não seja sobrecarregado. |
| `aa_discord_audit.process_pending_run` | Orientado a eventos — enfileirado por um lançamento web | Pega a execução `PENDING` criada por um lançamento web, define como `RUNNING` e conduz o pipeline de acordo com a flag de confirmação congelada da execução. |
| `aa_discord_audit.prune_audit_runs` | Celery beat / cron — você agenda (também um comando de gerenciamento) | Retenção: expiração de chave de idempotência e depois exclusão de linha (veja **Comandos de gerenciamento** e o runbook). |
| `aa_discord_audit.sample_guild_presence` | Celery beat — você agenda | Amostragem leve, apenas REST, das contagens de membros do servidor / online / boosts no snapshot de presença mais recente para os medidores de presença do Prometheus. Controlado por `AA_DISCORD_AUDIT_PRESENCE_ENABLED`; um guarda de salto limita um agendamento rápido mal configurado (piso `AA_DISCORD_AUDIT_PRESENCE_SAMPLE_INTERVAL_MINUTES`, padrão 10). Inativo até que tanto o extra `[metrics]` quanto uma entrada do beat estejam presentes (veja [`docs/METRICS.md`](https://gitlab.com/eveo7/aa-discord-audit/-/blob/main/docs/METRICS.md)). |

Para agendar as tarefas do beat, adicione-as a `CELERYBEAT_SCHEDULE` em seu
`local.py`, por exemplo:```python
CELERYBEAT_SCHEDULE["aa_discord_audit_sample_guild_presence"] = {
    "task": "aa_discord_audit.sample_guild_presence",
    "schedule": 600,  # seconds; honoured no finer than the sampler floor
}

Painel do operador

Montado na navegação principal do Auth como Discord Audit. Visualizações somente leitura; cada lista possui uma caixa de pesquisa no servidor que corresponde a cada linha — não apenas a página em exibição — juntamente com seus filtros suspensos:

  • Execuções de auditoria — um cartão de resumo com a postura de auditoria em toda a frota acima de uma lista classificável com badges; os detalhes por execução dividem-se em cartões ao redor da tabela por descoberta.
  • Explicação por descoberta — classificação, ação resolvida (com a política resolvida como JSON e um marcador de data), e qual camada de sobreposição (sobreposição por uid, política por grupo / por estado, ProtectedDiscordMember, bloqueio de primeira execução) decidiu o resultado.
  • Invocações — cada acionador CLI / beat incluindo tentativas recusadas, com o estado da execução exibido e o argv completo expansível. Exibe o uso de limite de taxa.
  • Log de alterações de configuração — cada edição do operador nas tabelas de configuração gerenciadas pelo operador, renderizada como um diff antes/depois no nível do campo para atualizações (JSON formatado para criação/exclusão) com um filtro de ator insensível a maiúsculas/minúsculas. A trilha de auditoria do auditor.

Iniciando uma auditoria a partir da interface web

Operadores com a permissão aa_discord_audit.run_audit veem um botão Iniciar Auditoria na página Execuções de auditoria. Clicar nele abre um modal Bootstrap que exibe o modo de política configurado (somente relatório ou destrutivo), o estado de reconhecimento inicial e um botão Confirmar Início. Enviar POSTs para /run-launch/, que cria um AuditRun PENDENTE, enfileira process_pending_run via Celery e redireciona para a página de detalhes da execução.

O caminho web espelha as barreiras de segurança da CLI:

  • Bloqueio de primeira execução. Se audit_acknowledge_initial não foi executado, o modal exibe um bloco de recusa (sem botão de envio) em vez da ação Confirmar Início. Um POST que ignora o modal (ex.: curl) é recusado no servidor, a recusa é registrada em AuditInvocation, e o operador é redirecionado com uma mensagem flash.
  • Intenção destrutiva. Se uma inicialização pode remover cargos ou expulsar membros é decidido no servidor a partir das permissões do operador e da política: was_confirmation_bypassed = user.has_perm(run_audit_destructive) and policy_has_destructive(policy). A interface não tem alternância — apenas a permissão destrutiva determina a intenção. Um operador apenas com run_audit que aciona uma inicialização contra uma política destrutiva recebe uma execução silenciosa SOMENTE RELATÓRIO (a mesma coerção que a CLI aplica sem --yes).
  • Limite de taxa por usuário. A mesma cota diária da CLI; o modal ainda abre, mas o POST retorna um flash + redirecionamento assim que a cota é gasta.

Enquanto uma execução está em um estado não terminal (PENDING, RUNNING ou INTERRUPTED), a página de detalhes da execução consulta /runs/<pk>/state.json a cada cinco segundos e atualiza o cartão State no local. A consulta pausa em guias ocultas e para assim que a execução atinge um estado terminal.

Observabilidade

Instrumentação opcional do Prometheus por trás do extra [metrics] — ausente, toda chamada de métrica resolve para um stub sem operação com custo próximo de zero. O módulo fornece uma camada de cooperar-não-depender: quando o django-prometheus está instalado, os contadores e histogramas da auditoria registram-se no prometheus_client.REGISTRY padrão e a visualização /metrics do django-prometheus os exporta junto com suas próprias séries.```sh pip install aa-discord-audit[metrics]

root@kitploit:~
As métricas de snapshot — presença na guilda e os agregados de associação por grupo/por cargo — seguem um segundo caminho: elas residem em um registro dedicado exportado pelo próprio endpoint `/audit/discord/metrics` do módulo. O coletor multiprocesso do django-prometheus lê apenas arquivos mmap e ignora coletores personalizados, portanto essas métricas precisam de seu próprio alvo de scraping. Como qualquer alvo `/metrics`, ele não é autenticado — restrinja-o no proxy reverso ou na camada de rede. Ambas as superfícies permanecem inertes sem o extra `[metrics]`.

O catálogo de métricas, o vocabulário de rótulos e as receitas Grafana estão em
[`docs/METRICS.md`](https://gitlab.com/eveo7/aa-discord-audit/-/blob/main/docs/METRICS.md)
(tradução em russo:
[`docs/METRICS.ru.md`](https://gitlab.com/eveo7/aa-discord-audit/-/blob/main/docs/METRICS.ru.md)).

## Limitações

- **Única guilda.** A auditoria reconcilia a única guilda do Discord para a qual o AA está configurado; não abrange várias guildas.
- **Apenas cargos gerenciados pelo AA.** As ações de remover/expulsar atuam sobre cargos nomeados pelo AA e associação à guilda; cargos que o AA não gerencia nunca são tocados.
- **Sem descoberta automática de apelidos.** Contas de bot são reconhecidas apenas através da tabela explícita `BotAccountUid` / `AA_DISCORD_AUDIT_BOT_UIDS` — `AA_DISCORD_AUDIT_AUTO_DISCOVER_BY_NICKNAME` está reservado para v2 e não implementado.
- **Superfície alfa.** Os nomes das configurações e a API pública podem mudar antes da versão `1.0`.

## Documentação

- [`docs/runbook.md`](https://gitlab.com/eveo7/aa-discord-audit/-/blob/main/docs/runbook.md)
  — runbook do operador: permissões do bot Discord, lista de verificação pré-voo,
  liberação do bloqueio de primeira execução, playbooks de incidentes,
  alternadores de diagnóstico.
- [`docs/performance.md`](https://gitlab.com/eveo7/aa-discord-audit/-/blob/main/docs/performance.md)
  — números de referência do `audit_benchmark` e implicações de dimensionamento.
- [`docs/METRICS.md`](https://gitlab.com/eveo7/aa-discord-audit/-/blob/main/docs/METRICS.md)
  / [`docs/METRICS.ru.md`](https://gitlab.com/eveo7/aa-discord-audit/-/blob/main/docs/METRICS.ru.md)
  — catálogo de métricas Prometheus, vocabulário de rótulos, receitas Grafana.
- Código-fonte: <https://gitlab.com/eveo7/aa-discord-audit>
- Rastreador de problemas: <https://gitlab.com/eveo7/aa-discord-audit/-/issues>
- Changelog:
  [`CHANGELOG.md`](https://gitlab.com/eveo7/aa-discord-audit/-/blob/main/CHANGELOG.md)

## Desenvolvimento```sh
make dev         # uv sync --all-groups + pre-commit install
make tests       # uv run nox -s tests
make lint        # uv run nox -s lint
make typecheck   # mypy + basedpyright
make coverage    # term + html + xml report
make package     # uv build

Toolchain é apenas uv. Comprimento da linha é 79 (Python) / 120 (Markdown).

Traduções

  • Russo

Licença

MIT — veja LICENSE.

Baixar ferramenta
CodenamePortões
aa_discord_audit.run_auditcomando de gerenciamento, tarefa (beat), run delete
aa_discord_audit.run_audit_destructiveportão de lançamento web para strip / strip_kick (separado de run_audit)
aa_discord_audit.acknowledge_initial_auditlibera o bloqueio de dry-run da primeira execução
aa_discord_audit.manage_discord_identityadmin DiscordIdentity
aa_discord_audit.manage_role_exceptionadmin ManagedRoleException
aa_discord_audit.manage_protected_memberadmin ProtectedDiscordMember
aa_discord_audit.manage_bot_account_uidadmin BotAccountUid
aa_discord_audit.manage_finding_overrideadmin FindingActionOverride
aa_discord_audit.view_auditrun (e amigos)trilha de auditoria apenas leitura no painel Auth