Inicio rápido · Primer escaneo en 2 minutos

Obtén tu primer resultado de escaneo con WAFPass hoy.

Instala la CLI de código abierto de WAFPass, descarga los controles WAF++ y escanea un archivo Terraform de ejemplo. Sin credenciales en la nube, sin caja negra: solo análisis estático sobre tu infraestructura como código.

v1.1.0
WAFPass CLI
8
Pilares
83+
Controles
Docker
Compose listo
Apache 2.0
Licencia del código

¿Prefieres un one-liner? El instalador configura la CLI y los controles por ti.

macOS / Linux curl -fsSL https://waf2p.dev/install.sh | sh
Windows irm https://waf2p.dev/install.ps1 | iex
ELIGE TU CAMINO

Una ruta clara para cada caso de uso.

Empieza con el inicio rápido de 2 minutos en CLI. Cambia de pestaña cuando estés listo para el dashboard, CI o la configuración manual.

Obtén tu primer resultado en 2 minutos

Sigue los cuatro pasos a continuación. Cada comando está diseñado para darte un resultado legible y garantizado en tu primer intento.

1

Instala el CLI

WAFPass se publica en PyPI como wafpass-core. Se recomienda Python 3.11+.

bash
$ pip install wafpass-core
$ wafpass --version
2

Descarga los controles

El catálogo de controles WAF++ contiene las 83+ reglas que WAFPass usa para evaluar tu código.

bash
$ git clone https://github.com/WAF2p/framework.git controls-src
$ cp -r controls-src/modules/controls/controls ./controls

Recomendado: clona el repositorio de controles. Alternativa: descarga el zip de controles desde la página de WAFPass y extráelo en controls/.

3

Guarda un archivo Terraform de ejemplo

Crea un main.tf mínimo. Este ejemplo deja deliberadamente un bucket S3 público para que WAFPass tenga algo que señalar.

provider "aws" {
  region = "eu-central-1"
}

resource "aws_s3_bucket" "public" {
  bucket = "wafpp-first-check-demo"
}

resource "aws_s3_bucket_public_access_block" "public" {
  bucket                  = aws_s3_bucket.public.id
  block_public_acls       = false
  block_public_policy     = false
  ignore_public_acls      = false
  restrict_public_buckets = false
}
4

Ejecuta tu primer check

Apunta WAFPass al directorio actual e imprime el resumen JSON.

bash
$ wafpass check . --output json | jq '.summary'

Deberías ver una salida como esta:

{
  "total_controls": 83,
  "passed": 81,
  "failed": 2,
  "pillars": {
    "security": { "passed": 18, "failed": 2 }
  }
}
81 aprobados — recursos que cumplieron el control
2 fallados — recursos que incumplieron un control (aquí, el bucket S3 público)
83 controles — reglas totales evaluadas en los 8 pilares WAF++

Ejecuta el dashboard completo en local

El monorepo WAF2p/pass incluye un docker-compose.yml unificado. Levanta el CLI, servidor, dashboard, PostgreSQL y Keycloak en un solo comando.

bash
$ git clone https://github.com/WAF2p/pass.git
$ cd pass
$ cp .env.example .env
$ # Edit .env — set POSTGRES_PASSWORD, WAFPASS_JWT_SECRET, etc.
$ docker compose up -d
ServicioURLDescripción
wafpass-dashboardhttp://localhost:3000Dashboard React
wafpass-serverhttp://localhost:8000API REST FastAPI
Keycloak (SSO)http://localhost:8080Proveedor de identidad (admin / admin)
postgreslocalhost:5432Base de datos PostgreSQL

Una vez los contenedores estén saludables, genera tu primera vista del dashboard con el comando demo o enviando un resultado de escaneo:

bash
$ wafpass demo # creates sample data and opens the dashboard
$ open http://localhost:3000
Ver docker-compose.yml completo
services:

  # ── PostgreSQL ────────────────────────────────────────────
  postgres:
    image: postgres:16-alpine
    restart: unless-stopped
    environment:
      POSTGRES_USER:     ${POSTGRES_USER:-wafpass}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-wafpass}
      POSTGRES_DB:       ${POSTGRES_DB:-wafpass}
    volumes:
      - postgres_data:/var/lib/postgresql/data
      - ./keycloak/init.sql:/docker-entrypoint-initdb.d/01-keycloak-db.sql:ro
    ports:
      - "${POSTGRES_PORT:-5432}:5432"
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-wafpass} -d ${POSTGRES_DB:-wafpass}"]
      interval: 5s
      timeout: 5s
      retries: 10

  # ── wafpass-server ────────────────────────────────────────
  wafpass-server:
    build:
      context: .
      dockerfile: wafpass-server/Dockerfile
    restart: unless-stopped
    depends_on:
      postgres:
        condition: service_healthy
    environment:
      DATABASE_URL:               postgresql+asyncpg://${POSTGRES_USER:-wafpass}:${POSTGRES_PASSWORD:-wafpass}@postgres:5432/${POSTGRES_DB:-wafpass}
      WAFPASS_ENV:                ${WAFPASS_ENV:-local}
      CORS_ORIGINS:               ${API_URL:-http://localhost:3000},http://wafpass-dashboard,http://cloud.waf2p
      WAFPASS_CONTROLS_DIR:       ${WAFPASS_CONTROLS_DIR:-/app/controls}
      WAFPASS_JWT_SECRET:         ${WAFPASS_JWT_SECRET:-change-me-in-production}
      WAFPASS_JWT_EXPIRE_MINUTES: ${WAFPASS_JWT_EXPIRE_MINUTES:-60}
      WAFPASS_JWT_REFRESH_DAYS:   ${WAFPASS_JWT_REFRESH_DAYS:-7}
      WAFPASS_ADMIN_USERNAME:     ${WAFPASS_ADMIN_USERNAME:-admin}
      WAFPASS_ADMIN_PASSWORD:     ${WAFPASS_ADMIN_PASSWORD:-admin}
      WAFPASS_ADMIN_ROLE:         ${WAFPASS_ADMIN_ROLE:-admin}
      WAFPASS_API_KEY:            ${WAFPASS_API_KEY:-key}
    ports:
      - "8000:8000"

  # ── Keycloak (SSO / IdP — dev mode) ──────────────────────
  keycloak:
    image: quay.io/keycloak/keycloak:26.1
    command: start-dev
    restart: unless-stopped
    depends_on:
      postgres:
        condition: service_healthy
    environment:
      KC_DB:                   postgres
      KC_DB_URL:               jdbc:postgresql://postgres:5432/${KEYCLOAK_DB:-keycloak}
      KC_DB_USERNAME:          ${KEYCLOAK_DB_USER:-keycloak}
      KC_DB_PASSWORD:          ${KEYCLOAK_DB_PASSWORD:-keycloak}
      KEYCLOAK_ADMIN:          ${KEYCLOAK_ADMIN_USER:-admin}
      KEYCLOAK_ADMIN_PASSWORD: ${KEYCLOAK_ADMIN_PASSWORD:-admin}
      KC_HTTP_ENABLED:         "true"
      KC_HOSTNAME_STRICT:      "false"
      KC_HEALTH_ENABLED:       "true"
    ports:
      - "${KEYCLOAK_PORT:-8080}:8080"
    healthcheck:
      test: ["CMD-SHELL", "curl -sf http://localhost:8080/health/ready || exit 1"]
      interval: 15s
      timeout: 5s
      retries: 20
      start_period: 60s

  # ── wafpass-dashboard ─────────────────────────────────────
  wafpass-dashboard:
    build:
      context: ./wafpass-dashboard
      dockerfile: Dockerfile
    restart: unless-stopped
    depends_on:
      - wafpass-server
    ports:
      - "3000:80"

volumes:
  postgres_data:

Añadir a CI / pre-commit

Bloquea infraestructura no conforme antes de que llegue a tu rama principal. WAFPass se ejecuta directamente sobre los archivos del repo, así que los checks en CI son rápidos y no requieren secretos en la nube.

1

Instala el hook de pre-commit

Ejecuta el script de instalación del repositorio WAFPass una vez por clonación. Después, cada git commit se verifica automáticamente.

bash
$ bash hooks/install.sh # macOS / Linux / Git Bash
$ .\hooks\install.ps1 # Windows PowerShell
2

Añade WAFPass a GitHub Actions

Usa la GitHub Action oficial de WAFPass para fallar pulls que introduzcan configuraciones erróneas. Funciona con repositorios públicos y privados.

Configurar WAFPass Action →

Configuración avanzada / manual

Instala solo los componentes que necesitas. Empieza con el CLI para CI/CD y añade servidor y dashboard cuando necesites persistencia y exploración visual.

1
Instalar wafpass CLI

Motor de evaluación principal — parsea IaC, evalúa controles, genera informes

Desde PyPI (recomendado)

bash
$ pip install wafpass-core
$ uv add wafpass-core # recommended for Python projects

Desde fuente

bash
$ git clone https://github.com/WAF2p/pass.git
$ cd pass
$ uv pip install -e . # recommended
$ pip install -e ".[pdf]" # with PDF report support

macOS (Apple M-series)

bash
$ brew install git python uv
$ git clone https://github.com/WAF2p/pass.git && cd pass
$ uv pip install -e .
$ wafpass --version # verify installation
2
Instalar wafpass-server

Capa de persistencia FastAPI — almacena ejecuciones, exenciones, hallazgos de secretos y eventos de auditoría

Desde PyPI (recomendado)

bash
$ pip install wafpass-server
$ uv add wafpass-server # recommended for Python projects

Configurar e iniciar

bash
$ cp .env.example .env # set DATABASE_URL and JWT secret
$ alembic upgrade head # apply database migrations
$ uvicorn wafpass_server.main:app --reload --port 8000

Documentación de la API disponible en http://localhost:8000/api/docs

3
Instalar wafpass-dashboard

Dashboard web React — 22+ vistas de cumplimiento, exportación de evidencias, RBAC

bash
$ git clone https://github.com/WAF2p/wafpass-dashboard.git
$ cd wafpass-dashboard
$ npm install
$ cp .env.example .env.local # set VITE_API_URL
$ npm run dev # dev server at http://localhost:5173
SOLUCIÓN DE PROBLEMAS

Problemas comunes y soluciones.

Respuestas rápidas si algo no funciona a la primera.

Controles no encontrados

Si wafpass check reporta "controls directory not found", el CLI mostrará instrucciones de descarga automáticamente. Asegúrate de que la carpeta controls/ esté junto al lugar donde ejecutas los escaneos.

Puerto ya en uso

Usa un puerto diferente para el servidor o el dashboard:

$ uvicorn wafpass_server.main:app --port 8001
$ npm run dev -- --port 5174
Errores de conexión a la base de datos

Verifica que PostgreSQL esté en ejecución y que tu DATABASE_URL sea correcta:

$ psql $DATABASE_URL -c "SELECT 1"
La compilación de Docker falla

Asegúrate de que los tres repositorios estén clonados lado a lado en el mismo directorio padre al compilar desde fuente:

$ ls -1
pass/
wafpass-server/
wafpass-dashboard/