Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
AA Discord Audit — Auditoría de conciliación para la integración de Discord de Alliance Auth: encuentra miembros del gremio que tienen roles gestionados por AA que Auth nunca concedió y les quita los roles o los expulsa bajo una política controlada por el operador. Aplicación Django comunitaria independiente. | Kitploit
Herramientas/GitLabGitLab/eveo7/aa-discord-audit
Herramientas DefensivasAuditoría de ConfiguraciónGestión de Identidad y Acceso (IAM)Respuesta a Incidentes
GitLabeveo7/aa-discord-audit

AA Discord Audit

Ver Repositorio
49hace 2 mesesAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →

Acerca de

Auditoría de conciliación para la integración de Discord de Alliance Auth: encuentra miembros del gremio que tienen roles gestionados por AA que Auth nunca concedió y les quita los roles o los expulsa bajo una política controlada por el operador. Aplicación Django comunitaria independiente.

Compartir

aa-discord-audit

PyPI version Supported Python versions License: MIT

Auditoría de conciliación para la integración de Discord de Alliance Auth. Compara las asignaciones reales de roles en el gremio de Discord configurado con el estado expresado en Alliance Auth (Grupos + Estado por usuario) y cierra la brecha mediante la cual los moderadores pueden asignar manualmente roles nombrados por AA a usuarios que AA no conoce.

Estado: alpha (0.1.x). La API pública y la configuración pueden aún cambiar antes de 1.0.

Contenido

  • Postura de seguridad
  • Cómo funciona
  • Requisitos
  • Instalación
  • Inicio rápido
Permisos
  • Configuración
  • Comandos de gestión
  • Auditoría periódica (Celery beat)
  • Tareas de Celery
  • Panel de operador
  • Observabilidad
  • Limitaciones
  • Documentación
  • Desarrollo
  • Postura de seguridad

    La auditoría es segura por defecto:

    • La primera ejecución después de la instalación está bloqueada en modo de prueba (dry-run) independientemente de la configuración del operador. Liberar el bloqueo requiere un InitialAuditAcknowledgement (solo administrador o shell).
    • La política predeterminada es report para cada categoría — las acciones destructivas son opt-in.
    • Las filas del registro de auditoría (AuditRun, AuditFinding, AuditInvocation, ConfigChangeLog) son de solo añadido (append-only) a nivel de manager e instancia; las operaciones masivas update() / bulk_update() están bloqueadas.
    • Las URL de webhook se tratan como credenciales y se redactan de los registros, mensajes de excepción y argv persistido.

    Cómo funciona

    Cada miembro del gremio se clasifica en una categoría:

    CategoríaSignificado
    unknown_guestMiembro de Discord que AA no conoce
    linked_no_permIdentidad conocida por AA pero carece de discord.access_discord
    bot_filteredCuenta de bot configurada — nunca se actúa sobre ella

    El operador asigna cada categoría a una acción:

    AcciónComportamiento
    reportRegistrar el hallazgo; sin cambios del lado de Discord
    stripEliminar roles gestionados por AA
    strip_kickEliminar roles gestionados por AA y luego expulsar del gremio

    El mapeo es la configuración AA_DISCORD_AUDIT_POLICY; las anulaciones por grupo y por estado se anidan dentro de cada categoría.

    Requisitos

    • Python 3.10–3.13
    • Django 4.2 o 5.2
    • Alliance Auth 4.x o 5.x
    • El módulo de servicio Discord de Alliance Auth (allianceauth.services.modules.discord) instalado y configurado (token del bot + gremio)

    Instalación```sh

    pip install aa-discord-audit

    root@kitploit:~
    En tu 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",
    ]
    

    Luego ejecuta las migraciones:```sh python manage.py migrate aa_discord_audit

    root@kitploit:~
    El `CurrentUserMiddleware` es obligatorio: `apps.ready()` lanza `ImproperlyConfigured` si falta. Es lo que permite que el manejador de señales `ConfigChangeLog` atribuya las ediciones de administración a un usuario real en lugar de `<system>`.
    
    ## Inicio rápido
    
    1. Otorga `aa_discord_audit.run_audit` al rol de operador que ejecuta las auditorías.
    2. Ejecuta una auditoría de prueba en seco:   ```sh
       python manage.py audit_discord_roles --action report
    
    1. Revise los hallazgos en Discord Audit → Audit runs en el panel de Auth.
    2. Libere el bloqueo de primera ejecución — cree una fila InitialAuditAcknowledgement a través del admin, o ejecute python manage.py audit_acknowledge_initial. Ambos requieren aa_discord_audit.run_audit y aa_discord_audit.acknowledge_initial_audit.
    3. Vuelva a ejecutar con la acción destructiva de su elección cuando esté listo.

    Permisos

    Nombre clavePuertas
    aa_discord_audit.run_auditcomando de gestión, tarea beat, ejecutar eliminación
    aa_discord_audit.run_audit_destructivepuerta de lanzamiento web para strip / strip_kick (separada de run_audit)
    aa_discord_audit.acknowledge_initial_auditlibera el bloqueo de primera ejecución en seco
    aa_discord_audit.manage_discord_identityadmin de DiscordIdentity
    aa_discord_audit.manage_role_exceptionadmin de ManagedRoleException
    aa_discord_audit.manage_protected_memberadmin de ProtectedDiscordMember
    aa_discord_audit.manage_bot_account_uidadmin de BotAccountUid
    aa_discord_audit.manage_finding_overrideadmin de FindingActionOverride
    aa_discord_audit.view_auditrun (y amigos)registro de auditoría de solo lectura en el panel de Auth

    Los nombres clave manage_* están divididos por radio de explosión, de modo que un junior con manage_bot_account_uid no pueda también desarmar la auditoría editando ManagedRoleException.

    Configuración

    Todas las configuraciones son opcionales. Los valores predeterminados son 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 gestión
    
    | Comando                  | Propósito                                                          |
    |--------------------------|------------------------------------------------------------------|
    | `audit_discord_roles`    | Punto de entrada principal. `--action {report,strip,strip_kick}`.       |
    | `audit_discord_roles --resume <run_id>`        | Re-examinar hallazgos PENDIENTES de una ejecución existente.       |
    | `audit_discord_roles --abandon <run_id>`       | Marcar una ejecución atascada como ABANDONADA.                     |
    | `audit_discord_roles --diff <run_id>`          | Comparar el estado actual con una ejecución histórica.         |
    | `audit_discord_roles --explain <member_id>`    | Clasificación por miembro (solo lectura).             |
    | `audit_discord_roles --policy-preview <json>`  | Proyectar una política hipotética.                     |
    | `audit_discord_roles --from-fixture <path>`    | Reproducir contra una instantánea JSON.                    |
    | `audit_acknowledge_initial` | Liberar el bloqueo de primera ejecución en seco desde la consola.          |
    | `audit_benchmark`        | Benchmark de dimensionamiento de carga sintética (ver [`docs/performance.md`](https://gitlab.com/eveo7/aa-discord-audit/-/blob/main/docs/performance.md)). |
    | `prune_audit_runs`       | Poda de retención.                                               |
    | `audit_abandon_stuck_runs` | Reconciliar ejecuciones PENDIENTES atascadas filtradas por un trabajador bloqueado — las cambia a ABANDONADAS (ver el runbook; una ejecución RUNNING atascada usa `audit_discord_roles --abandon`). |
    
    Una ejecución prolongada de ``audit_discord_roles`` reacciona limpiamente a ``SIGTERM``
    y ``SIGINT``: la ejecución se cambia a ``INTERRUPTED`` y el bucle de aplicación
    sale en el siguiente límite de hallazgo para que el trabajo parcial sea
    duradero en el rastro de auditoría. ``audit_discord_roles --resume <run_id>``
    retoma la ejecución desde los hallazgos ``PENDING`` restantes.
    
    ## Auditoría periódica (Celery beat)
    
    `audit_orphan_members` ejecuta el mismo pipeline de construcción + aplicación en una
    programación que usted conecta en Celery beat (no está programado por defecto).
    La ruta no supervisada está controlada por seguridad:
    
    - **Solo informe a menos que esté armado.** Una ejecución beat se fuerza a `report`
      independientemente de la política a menos que `AA_DISCORD_AUDIT_BEAT_ALLOW_DESTRUCTIVE`
      esté establecido — liberar el bloqueo de primera ejecución única para una ejecución CLI manual
      no arma el beat. Una advertencia de inicio se dispara cuando la política es
      destructiva pero el beat no ha optado por ello.
    - **Atribuido.** Cada ejecución beat escribe un `AuditInvocation` aceptado de actor del sistema
      (`triggered_by=BEAT`), por lo que el rastro de auditoría del auditor
      cubre también las ejecuciones no supervisadas.
    - **Auto-reparación.** Una ejecución varada por un límite de tiempo suave o un
      bloqueo del trabajador se reconcilia al estado `INTERRUPTED` reanudable en el siguiente
      tick. `AA_DISCORD_AUDIT_BEAT_MIN_INTERVAL_MINUTES` es un piso grueso
      contra una programación rápida mal configurada.
    
    ## Tareas de Celery
    
    El paquete registra cinco tareas bajo el prefijo de nombre `aa_discord_audit.*`.
    Solo las tareas beat necesitan una programación; el resto son controladas por eventos
    o se ejecutan bajo demanda. Ninguna está programada para usted.
    
    | Tarea | Cómo se ejecuta | Qué hace |
    |------|-------------|--------------|
    | `aa_discord_audit.audit_orphan_members` | Celery beat — usted lo programa | La auditoría de construcción + aplicación no supervisada descrita anteriormente. Solo informe a menos que esté armado; comparte el bloqueo `discord.user_actions.<uid>` con `update_groups` de AA. |
    | `aa_discord_audit.retry_pending_kicks` | Celery beat — usted lo programa | Barrido acotado que re-despacha expulsiones diferidas por una falla transitoria de Discord, respetando un enfriamiento por fila para que un miembro con fallos persistentes no sea golpeado repetidamente. |
    | `aa_discord_audit.process_pending_run` | Controlado por eventos — encolado por un lanzamiento web | Toma la ejecución `PENDING` que creó un lanzamiento web, la cambia a `RUNNING` y conduce el pipeline contra la bandera de confirmación congelada de la ejecución. |
    | `aa_discord_audit.prune_audit_runs` | Celery beat / cron — usted lo programa (también un comando de gestión) | Retención: expiración de clave de idempotencia luego eliminación de filas (ver **Comandos de gestión** y el runbook). |
    | `aa_discord_audit.sample_guild_presence` | Celery beat — usted lo programa | Muestra ligera, solo REST, de recuentos de miembros / en línea / impulsos del gremio en la instantánea de presencia más reciente para los indicadores de presencia de Prometheus. Controlado por `AA_DISCORD_AUDIT_PRESENCE_ENABLED`; un guardia de salto limita una programación rápida mal configurada (piso `AA_DISCORD_AUDIT_PRESENCE_SAMPLE_INTERVAL_MINUTES`, predeterminado 10). Inerte hasta que tanto el extra `[metrics]` como una entrada beat estén presentes (ver [`docs/METRICS.md`](https://gitlab.com/eveo7/aa-discord-audit/-/blob/main/docs/METRICS.md)). |
    
    Para programar las tareas beat, agréguelas a `CELERYBEAT_SCHEDULE` en su
    `local.py`, por ejemplo:```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
    }
    

    Panel del operador

    Montado bajo la navegación principal de Auth como Discord Audit. Vistas de solo lectura; cada lista tiene un cuadro de búsqueda del lado del servidor que coincide en todas las filas — no solo en la página visible — junto con sus filtros desplegables:

    • Ejecuciones de auditoría — una tarjeta de resumen con la postura de auditoría en toda la flota sobre una lista etiquetada y ordenable; el detalle por ejecución se divide en tarjetas alrededor de la tabla por hallazgo.
    • Explicación por hallazgo — clasificación, acción resuelta (con la política resuelta como JSON y un marcador de fecha), y qué capa de anulación (anulación por uid, política por grupo/por estado, ProtectedDiscordMember, bloqueo de primera ejecución) decidió el resultado.
    • Invocaciones — cada disparador CLI/beat incluyendo intentos rechazados, con el estado de ejecución visible y el argv completo expandible. Muestra el uso del límite de tasa.
    • Registro de cambios de configuración — cada edición del operador a las tablas de configuración gestionadas por el operador, representada como una diferencia antes/después a nivel de campo para actualizaciones (JSON con formato bonito para creación/eliminación) con un filtro de actor que no distingue mayúsculas/minúsculas. La pista de auditoría del auditor.

    Iniciar una auditoría desde la interfaz web

    Los operadores con el permiso aa_discord_audit.run_audit ven un botón Launch Audit en la página Audit runs. Al hacer clic se abre un modal de Bootstrap que muestra el modo de política configurado (solo informe o destructivo), el estado de reconocimiento inicial y un botón Confirm Launch. El envío de POST a /run-launch/, que crea un AuditRun PENDIENTE, encola process_pending_run a través de Celery y redirige a la página de detalle de la ejecución.

    La ruta web refleja las puertas de seguridad de la CLI:

    • Bloqueo de primera ejecución. Si no se ha ejecutado audit_acknowledge_initial, el modal muestra un bloque de rechazo (sin botón de envío) en lugar de la acción Confirm Launch. Un POST que evita el modal (por ejemplo, curl) es rechazado en el servidor, el rechazo se registra en AuditInvocation, y el operador es redirigido con un mensaje flash.
    • Intención destructiva. Si un lanzamiento puede eliminar roles o expulsar miembros se decide en el servidor según los permisos del operador y la política: was_confirmation_bypassed = user.has_perm(run_audit_destructive) and policy_has_destructive(policy). La interfaz no tiene interruptor — el permiso destructivo solo determina la intención. Un operador solo con run_audit que activa un lanzamiento contra una política destructiva obtiene una ejecución silenciosa de solo INFORME (la misma coerción que aplica la CLI sin --yes).
    • Límite de tasa por usuario. La misma cuota diaria que la CLI; el modal aún se abre pero el POST devuelve un flash + redirección una vez que se agota la cuota.

    Mientras una ejecución está en un estado no terminal (PENDING, RUNNING o INTERRUPTED), la página de detalle de la ejecución consulta /runs/<pk>/state.json cada cinco segundos y actualiza la tarjeta de Estado en su lugar. La consulta se pausa en pestañas ocultas y se detiene tan pronto como la ejecución alcanza un estado terminal.

    Observabilidad

    Instrumentación opcional de Prometheus detrás del extra [metrics] — si está ausente, cada llamada de métrica se resuelve en un stub sin operación a un costo casi nulo. El módulo incluye una capa de cooperación sin dependencia: cuando django-prometheus está instalado, los contadores e histogramas de la auditoría se registran en el prometheus_client.REGISTRY predeterminado y la vista /metrics de django-prometheus los exporta junto con sus propias series.```sh pip install aa-discord-audit[metrics]

    root@kitploit:~
    Los gauges de instantáneas — presencia del gremio y los agregados de membresía por grupo/por rol — siguen un segundo camino: residen en un registro dedicado exportado por el endpoint `/audit/discord/metrics` del propio módulo. El recolector multiproceso de django-prometheus solo lee archivos mmap y omite los colectores personalizados, por lo que estos gauges necesitan su propio objetivo de recolección. Como cualquier objetivo `/metrics`, no está autenticado — restrínjalo en el proxy inverso o en la capa de red. Ambas superficies permanecen inactivas sin el extra `[metrics]`.
    
    El catálogo de métricas, el vocabulario de etiquetas y las recetas de Grafana se encuentran en
    [`docs/METRICS.md`](https://gitlab.com/eveo7/aa-discord-audit/-/blob/main/docs/METRICS.md)
    (traducción al ruso:
    [`docs/METRICS.ru.md`](https://gitlab.com/eveo7/aa-discord-audit/-/blob/main/docs/METRICS.ru.md)).
    
    ## Limitaciones
    
    - **Un solo gremio.** La auditoría reconcilia el único gremio de Discord contra el que está configurado AA; no abarca múltiples gremios.
    - **Solo roles gestionados por AA.** Las acciones de despojar/expulsar actúan sobre roles con nombre AA y la membresía del gremio; los roles que AA no gestiona nunca se tocan.
    - **Sin autodescubrimiento de apodos.** Las cuentas de bot se reconocen solo a través de la tabla explícita `BotAccountUid` / `AA_DISCORD_AUDIT_BOT_UIDS` — `AA_DISCORD_AUDIT_AUTO_DISCOVER_BY_NICKNAME` está reservado para v2 y no implementado.
    - **Superficie alfa.** Los nombres de configuración y la API pública pueden cambiar antes de `1.0`.
    
    ## Documentación
    
    - [`docs/runbook.md`](https://gitlab.com/eveo7/aa-discord-audit/-/blob/main/docs/runbook.md) — manual del operador: permisos del bot de Discord, lista de verificación previa al vuelo, liberación del bloqueo de primera ejecución, guías de incidentes, interruptores de diagnóstico.
    - [`docs/performance.md`](https://gitlab.com/eveo7/aa-discord-audit/-/blob/main/docs/performance.md) — números de referencia de `audit_benchmark` e implicaciones de dimensionamiento.
    - [`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 de Prometheus, vocabulario de etiquetas, recetas de Grafana.
    - Código fuente: <https://gitlab.com/eveo7/aa-discord-audit>
    - Seguimiento de incidencias: <https://gitlab.com/eveo7/aa-discord-audit/-/issues>
    - Registro de cambios: [`CHANGELOG.md`](https://gitlab.com/eveo7/aa-discord-audit/-/blob/main/CHANGELOG.md)
    
    ## Desarrollo```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
    

    La cadena de herramientas es solo uv. La longitud de línea es 79 (Python) / 120 (Markdown).

    Traducciones

    • Русский

    Licencia

    MIT — consulte LICENSE.

    Descargar herramienta