CLI Proxy para Cloudflare Access

Accede a recursos protegidos con Cloudflare Access Link to heading

Cloudflare Access es una solución fantástica dentro del stack de Zero Trust de Cloudflare. Permite asegurar el acceso a aplicaciones internas y recursos sin la necesidad de una VPN tradicional. En su lugar, cada solicitud a una aplicación es verificada para asegurar que proviene de un usuario autenticado y autorizado.

Cuando accedes a una aplicación protegida por Cloudflare Access a través de un navegador web, la experiencia es fluida. Cloudflare te redirige a tu proveedor de identidad para que inicies sesión. Una vez autenticado, se crea una cookie en tu navegador y puedes acceder a la aplicación sin problemas.

architecture

Pero, ¿qué sucede cuando necesitas acceder a estos recursos desde una herramienta? Aquí es donde las cosas se complican un poco.

Si únicamente necesitas hacer una petición, puedes usar el comando cloudflared access curl http://example.com. Pero si necesitas usar una herramienta, entonces necesitas:

  1. Autenticarte usando cloudflared access login http://example.com.
  2. Obtener un token de autenticación usando cloudflared access token -app=http://example.com.
  3. Incluir este token en cada una de tus solicitudes como un encabezado HTTP (cf-access-token). Puedes encontrar más detalle en su documentación oficial.

Este proceso puede ser tedioso y requiere añadir lógica adicional a tus scripts o configurar tus herramientas para que manejen estos encabezados, lo cual no siempre es sencillo o posible.

Presentando cloudflared-proxy Link to heading

Para simplificar este flujo de trabajo, he creado una nueva herramienta de código abierto: cloudflared-proxy.

cloudflared-proxy es un proxy inverso local que automatiza la autenticación de Cloudflare Access. Una vez configurado, te permite acceder a tus recursos protegidos desde cualquier herramienta sin tener que preocuparte por la gestión de tokens. Simplemente apuntas tu herramienta al puerto local del proxy, y este se encarga de añadir los encabezados de autenticación necesarios a cada solicitud.

¿Cómo Funciona? Link to heading

La herramienta utiliza cloudflared para obtener el token de autenticación para un hostname específico y luego inicia un proxy inverso local. Cuando una solicitud llega a este proxy, la herramienta le inyecta automáticamente el encabezado de autenticación de Cloudflare Access antes de reenviarla al destino final.

Características Principales Link to heading

  • Múltiples Endpoints: Puedes configurar proxies para varias aplicaciones simultáneamente.
  • Configuración Flexible: Soporta configuración mediante flags, un archivo de configuración (YAML, JSON, etc.), o variables de entorno.
  • Transparente para tus Herramientas: No necesitas modificar tus clientes o scripts. Simplemente úsalos como si el recurso estuviera disponible localmente.

Instalación y Uso Link to heading

Puedes descargar el binario directamente desde la página de Releases en GitHub.

Uso Básico Link to heading

El comando principal es run, que inicia los proxies. Puedes especificar los endpoints que quieres proteger directamente desde la línea de comandos.

El formato es [PUERTO_LOCAL:]HOSTNAME[:PUERTO_DESTINO].

Ejemplo:

./cfproxy run -e app.dominio.com

Una vez que el proxy está en funcionamiento, puedes usar tus herramientas apuntando al puerto local. Por ejemplo, con curl:

# En lugar de: curl https://app.dominio.com
# Usas:
curl http://localhost:8080

Uso con Fichero de Configuración Link to heading

Para una configuración más permanente, puedes usar un fichero YAML.

Ejemplo config.yaml:

proxies:
  - hostname: "app1.your-domain.com"
    localPort: 8080
  - hostname: "app2.your-domain.com"
    localPort: 8081
    destinationPort: 8443

Y luego ejecutar:

./cfproxy run -c /path/to/config.yaml

Conclusión Link to heading

cloudflared-proxy nace de la necesidad de simplificar el acceso a recursos protegidos por Cloudflare Access desde entornos de desarrollo y CLI. Espero que os sea tan útil como a mí. ¡No dudéis en probarla, abrir issues o contribuir al proyecto en GitHub!