
Un firewall de egreso para cargas de trabajo no confiables.
Los trabajos de CI, los agentes de codificación con IA y los contenedores en sandbox pueden realizar solicitudes salientes arbitrarias. Una dependencia comprometida, una inyección de prompt o un paso de compilación malicioso pueden exfiltrar secretos, comunicarse con un servidor externo o abrir una reverse shell. La mayoría de los equipos no tienen ninguna visibilidad sobre lo que sale de sus cargas de trabajo, y mucho menos alguna forma de detenerlo.
iron-proxy es un proxy de egreso MITM con un servidor DNS integrado que se sitúa entre tu carga de trabajo no confiable e internet. Aplica una política de denegación por defecto en el límite de la red, de modo que la carga de trabajo solo puede alcanzar los dominios que permitas explícitamente. Los secretos reales nunca entran en el sandbox. Las cargas de trabajo usan tokens de proxy, e iron-proxy los sustituye por credenciales reales en el egreso, lo que significa que una carga de trabajo comprometida puede exfiltrar un token que no sirve para nada fuera del proxy.
Un solo binario. Un solo archivo de configuración YAML.
169.254.169.254, fd00:ec2::254 y fd20:ce::254) y loopback se deniegan por defecto; se pueden sobrescribir mediante proxy.upstream_deny_cidrs o IRON_PROXY_UPSTREAM_DENY_CIDRS.HTTP_PROXY, HTTPS_PROXY o ajustes de SOCKS5.SET ROLE en la sesión de upstream y rechaza los intentos del cliente de mutar el rol (SET ROLE, set_config('role', ...), bloques DO, etc.) mediante un recorrido del AST de SQL. Se combina con la seguridad a nivel de fila de PostgreSQL para ofrecer aislamiento de datos por inquilino cuando la aplicación se conecta como un usuario de cuenta de servicio compartida. Requiere que PgBouncer (si se usa) se ejecute en pool_mode = session — los modos de agrupación transaction o statement reasignan silenciosamente los backends entre consultas y anularían la política. Consulta docs.iron.sh para más detalles.Diseñado para pipelines de CI, GitHub Actions, agentes de IA (Claude Code, Cursor, Codex) y cualquier entorno donde ejecutes código en el que no confías plenamente.
Las imágenes de Docker están disponibles en Docker Hub y los binarios precompilados para Linux/macOS (amd64/arm64) están en GitHub Releases.
O compila desde el código fuente:```bash go build -o iron-proxy ./cmd/iron-proxy
## Inicio rápido```bash
cd examples/docker-compose
docker compose up
Esto inicia iron-proxy y un cliente de demostración que envía cinco solicitudes a través del proxy. Revisa los registros para ver las solicitudes permitidas, bloqueadas y con secretos reescritos:```bash docker compose logs proxy
Cada solicitud produce una entrada de auditoría JSON estructurada:```json
{
"host": "httpbin.org",
"method": "GET",
"path": "/headers",
"action": "allow",
"status_code": 200,
"duration_ms": 142,
"request_transforms": [
{ "name": "allowlist", "action": "continue" },
{
"name": "secrets",
"action": "continue",
"annotations": { "swapped": [{ "secret": "OPENAI_API_KEY", "locations": ["header:Authorization"] }] }
}
]
}
Las solicitudes rechazadas incluyen un campo rejected_by y se registran en el nivel WARN. Consulte
Formato del registro de auditoría para conocer el esquema completo.
iron-proxy finaliza TLS generando certificados hoja sobre la marcha, firmados por
una CA que usted proporciona. Los contenedores cliente deben confiar en esta CA.```bash
mkdir -p certs
openssl genrsa -out certs/ca.key 4096
openssl req -x509 -new -nodes
-key certs/ca.key
-sha256 -days 3650
-subj "/CN=iron-proxy CA"
-addext "basicConstraints=critical,CA:TRUE"
-addext "keyUsage=critical,keyCertSign"
-out certs/ca.crt
### 2. Crear una red de Docker
iron-proxy necesita una IP fija para que los contenedores puedan apuntar su DNS hacia él:```bash
docker network create --subnet=172.20.0.0/24 iron-proxy
Crea un archivo env con tus secretos (mantenlo fuera del control de versiones):```bash echo "OPENAI_API_KEY=sk-real-key" > .env
| `-s` | `--server` | `SERVER` | `http://localhost:8080` | URL del servidor de escaneo |
| `-t` | `--token` | `TOKEN` | - | Token de autenticación |
| `-o` | `--output` | `FILE` | - | Guardar resultados en archivo |
| `-f` | `--format` | `FORMAT` | `json` | Formato de salida (json, yaml, table) |
| `-v` | `--verbose` | - | `false` | Habilitar registro detallado |
| `-q` | `--quiet` | - | `false` | Suprimir salida no esencial |
| `--timeout` | - | `SECONDS` | `30` | Tiempo de espera de solicitud |
| `--retry` | - | `COUNT` | `3` | Número de reintentos |
| `--insecure` | - | - | `false` | Omitir verificación de certificado TLS |
### Ejemplos de Uso
```bash
# Escanear un solo objetivo
scanner scan --target https://example.com
# Escanear múltiples objetivos desde un archivo
scanner scan --file targets.txt --output results.json
# Escanear con autenticación
scanner scan --target https://example.com --token YOUR_API_TOKEN
# Escanear con formato de salida personalizado
scanner scan --target https://example.com --format yaml --output results.yaml
# Escaneo detallado con tiempo de espera personalizado
scanner scan --target https://example.com --verbose --timeout 60
# Escanear con reintentos e inseguro
scanner scan --target https://example.com --retry 5 --insecure
POST /api/v1/scan
Content-Type: application/json