Shinyproxy: Ejecute shinyproxy solo en https (443)

Creado en 21 dic. 2018  ·  25Comentarios  ·  Fuente: openanalytics/shinyproxy

Hola,

He intentado configurar ShinyProxy solo en https. Esto parece posible según la documentación: https://www.shinyproxy.io/security/#https -ssl-tls

Tenga en cuenta que cuando solo https está disponible (es decir, no hay redirecciones desde http configuradas en nginx), es necesario agregar lo siguiente al archivo application.yml para poder usar encabezados de reenvío:
servidor:
useForwardHeaders: verdadero

El problema es que cuando se configura solo con https, entrada de NGINX y OpenID, el esquema https no pasa de la entrada de NGINX al contenedor ShinyProxy, lo que a su vez causa una serie de problemas con OpenId. A saber:

  • La URL de retorno que genera shinyproxy para OpenID en https se genera con http

La razón por la que esto sucede se debe a que ShinyProxy usa los códigos predeterminados aquí: spring-security DefaultOAuth2AuthorizationRequestResolver.java # L141

bug

Comentario más útil

Se las arregló para arreglarlo.
Este codigo

 server:
      useForwardHeaders: true

debe estar fuera de proxy:

Todos 25 comentarios

@garyallenkt ¿
¡Gracias!

¿Alguna actualización sobre este tema?

OpenAnalytics hizo un gran trabajo para ayudar a resolver esto.

Debería poder obtener la última versión de ShinyProxy (2.3.0) y seguir la documentación actualizada aquí: https://www.shinyproxy.io/security/#https -ssl-tls

La mejor de las suertes.

Hola @garyallenkt ,

Gracias por tu pronta respuesta. Probé con la última versión pero el problema persiste en mi caso. Estoy incrustando todo el shinyproxy en Iframe. Para iniciar sesión, el servidor redirige la conexión HTTPS a la conexión HTTP que no está permitida por la mayoría de los navegadores. ¿Sabes cómo puedo solucionar esto?

Saludos

@fmichielssen

Estoy usando una bifurcación del repositorio de niños de Telethon y ellos también usan 2.3.0, pero solo para estar seguro, también extraje la imagen de openanalytics. Para su referencia, aquí están mis configuraciones.

docker_compose.yaml

version: "3.6"
services:
  nginx:
    image: nginx:alpine
    container_name: tki_nginx
    restart: on-failure
    networks:
      - tki-net
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./data/certbot/conf:/etc/letsencrypt
      - ./data/certbot/www:/var/www/certbot
    ports:
      - 80:80
      - 443:443
    command: "/bin/sh -c 'while :; do sleep 6h & wait $${!}; nginx -s reload; done & nginx -g \"daemon off;\"'"
    depends_on:
      - shinyproxy

  certbot:
    image: certbot/certbot
    container_name: certbot
    restart: on-failure
    volumes:
      - ./data/certbot/conf:/etc/letsencrypt
      - ./data/certbot/www:/var/www/certbot
    entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'"

  influxdb:
    image: influxdb:1.7.3-alpine
    container_name: tki_influxdb
    restart: on-failure
    volumes:
      - ./run_first_time.sh:/home/run_first_time.sh
      - type: volume
        source: shinyproxy_usage
        target: /var/lib/influxdb
        volume:
          nocopy: true
    networks:
      - tki-net
    ports:
      - 8083:8083
      - 8086:8086

  shinyproxy:
    depends_on:
      - influxdb
    image: openanalytics/shinyproxy
    container_name: open_analytics_shinyproxy
    restart: on-failure
    networks:
      - tki-net
    volumes:
      - ./application.yml:/opt/shinyproxy/application.yml
      - /var/run/docker.sock:/var/run/docker.sock
    expose:
      - 8080


networks:
  tki-net:
    name: tki-net

volumes:
  shinyproxy_usage:

application.yaml

proxy:
  title: Lorem ipsum

  hide-navbar: true
  landing-page: /
  heartbeat-rate: 10000
  heartbeat-timeout: 600000
  port: 8080
  docker:
    internal-networking: true
  authentication: openid
  openid:
    auth-url: https://lorem-ipsum.auth0.com/authorize
    token-url: https://lorem-ipsumauth0.com/oauth/token
    jwks-url: https://lorem-ipsum.auth0.com/.well-known/jwks.json
    client-id: SUPERCOOL
    client-secret: SUPERCOOLSECRET

  server:
      useForwardHeaders: true
  specs:
  - id: lorem_ipsum
    display-name: Lorem Ipsum
    description:  
    container-cmd: ["R", "-e", "shiny::runApp('/root/app')"]
    container-image: lorem/ipsum
    container-network: tki-net
    container-env:
      user: "shiny"
      environment:
        - APPLICATION_LOGS_TO_STDOUT=false
  usage-stats-url: http://influxdb:8086/write?db=shinyproxy_usagestats

y nginx.conf

worker_processes 1;
events {
  worker_connections 1024;
}

http {
  sendfile on;
  upstream tki_shinyproxy {
    server open_analytics_shinyproxy:8080;
  }


  server {
    listen 80;
    server_name example.org;
    server_tokens off;
  }

  server {
    listen 443;
    server_name example.org;
    server_tokens off;

    ssl on;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;


    # SSL 
    ssl_certificate /etc/letsencrypt/live/example.org/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.org/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;


    location / {
      proxy_pass http://tki_shinyproxy;

      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
      proxy_read_timeout 600s;

      proxy_redirect off;
      proxy_set_header Host $http_host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
    }
  }
}

¿Alguna posible actualización sobre esto? @garyallenkt @fmichielssen

Se las arregló para arreglarlo.
Este codigo

 server:
      useForwardHeaders: true

debe estar fuera de proxy:

server es de hecho un bloque de nivel superior y no está dentro de proxy

Desafortunadamente, tengo el mismo problema con shinyproxy 2.3.1

Tengo este bloque fuera del bloque de proxy en el archivo application.yml

servidor:
useForwardHeaders: verdadero

y tengo el proxy Nginx configurado exactamente como se describe en la documentación. Yo también (para probar si acabo de cometer un error tonto de ngnix configuré un servidor Apache y tuve exactamente el mismo problema).

Mis bloques de configuración de Nginx son:

server {
  listen                80;
  server_name           mydomain.com;
  rewrite     ^(.*)     https://$server_name$1 permanent;
}

server {
  listen                443 ssl;
  server_name           mydomain.com;
  access_log            /var/log/nginx/shinyproxy.access.log;
  error_log             /var/log/nginx/shinyproxy.error.log error;

  ssl on;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

  ssl_certificate      <path to crt>
  ssl_certificate_key   <path to key> 

   location / {
       proxy_pass          http://127.0.0.1:3600/;

       proxy_http_version 1.1;
       proxy_set_header Upgrade $http_upgrade;
       proxy_set_header Connection "upgrade";
       proxy_read_timeout 600s;

       proxy_redirect    off;
       proxy_set_header  Host             $http_host;
       proxy_set_header  X-Real-IP        $remote_addr;
       proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
       proxy_set_header  X-Forwarded-Proto $scheme;
     }

}

¿Alguien tiene alguna idea sobre lo que podría estar mal? o incluso pensamientos sobre cómo solucionarlo?

Cual es el error? ¿Puedes compartir tus archivos de configuración como lo hice yo? Tal vez yo pueda ayudarte

@greenspray ¡ gracias por echar un vistazo! ¡Realmente estoy tan perplejo con esto! Mi Nginx lo configuró en el comentario anterior, y así es como se ve mi application.yml:

Aparte de cambiar el puerto y agregar la línea de encabezado serverforward, he intentado mantener todo exactamente como estaba instalado. Incluso probé esto con el proxy brillante 2.3.0 ya que parecía funcionar para todos en este hilo, pero tenía el mismo problema.

proxy:
  title: My Title
  logo-url: http://www.openanalytics.eu/sites/www.openanalytics.eu/themes/oa/logo.png
  landing-page: /
  heartbeat-rate: 10000
  heartbeat-timeout: 60000
  port: 3600
  authentication: simple
  admin-groups: scientists
  users:
  - name: jack
    password: password1
    groups: scientists
  - name: jeff
    password: password1
    groups: mathematicians
  # Docker configuration
  docker:
    cert-path: /home/none
    url: http://localhost:2375
    port-range-start: 20000
  specs:
  - id: 01_hello
    display-name: Hello Application
    description: Application which demonstrates the basics of a Shiny app
    container-cmd: ["R", "-e", "shinyproxy::run_01_hello()"]
    container-image: openanalytics/shinyproxy-demo
    access-groups: [scientists, mathematicians]

server:
  useForwardHeaders: true

logging:
  file:
    shinyproxy3.log

También probé usando apache como servidor web en su lugar, y tengo el mismo problema. Mis dos teorías actuales son que algo está mal con la configuración de mi application.yml, o que debido a que no entiendo el proxy / proxy inverso, algo en mi bloque de proxy está permitiendo la redirección a http.

@ Claire-Kelley, ¿cuál es tu error exacto?

@ greenspray9 ¡No recibo ningún error! Funciona perfectamente, de modo que cuando voy a mi sitio web puedo ver la página de inicio de sesión del proxy brillante y se sirve a través de HTTPS (este es el comportamiento deseado). El problema es que cuando inicio sesión (usando autenticación simple por ahora) la página comienza a ser servida a través de HTTP (no HTTPS, ¡este es el problema!)

@ ckelley-ct Lo siento, no tengo experiencia con el tipo de inicio de sesión que desea. ¿Quizás está ocurriendo algún tipo de redireccionamiento?

Tengo el mismo problema, ¿encontraste una solución?

@ HEPBO3AH sí, lo hice, para mí el problema fue con la imagen insegura (la línea logo-url: http://www.openanalytics.eu/sites/www.openanalytics.eu/themes/oa/logo.png en el código de ejemplo anterior). Si cambia eso a una imagen servida a través de https o la elimina, el problema se resuelve.

@ HEPBO3AH @ ckelley-ct FYI, hemos movido la imagen a https://www.openanalytics.eu/shinyproxy/logo.png

Logré hacer el proxy inverso con nginx e iniciar sesión de forma segura usando autenticación simple, pero una vez que intento usar openid falla porque usa http como protocolo de devolución de llamada:

https://login.microsoftonline.com/9ac05e7d-e6a1-433a-9801-a60642903c2b/oauth2/authorize?response_type=code&client_id=d1abf394-b312-4717-a1c4-daaeee4f3b28&scope=openid%20email&state=5ZEbvVrVKBGpwId02I91SNRN-oPSbqkSR9oOlj7PRRQ%3D&redirect_uri=http : //52.152.166.27/login/oauth2/code/shinyproxy&nonce=EhOFxVuVRksPOxd0hG-CKPDd2s78bhFIzSSC_PPU5-Q

obteniendo el error AADSTS50011: La URL de respuesta especificada en la solicitud no coincide con las URL de respuesta configuradas para la aplicación: 'd1abf394-b312-4717-a1c4-daaeee4f3b28'.

Esta es mi aplicación.yml para shinyproxy 2.4.0, shiny proxy 2.3.1 parece funcionar desde microsoft edge

proxy:
  title: Open Analytics Shiny Proxy
  logo-url: https://www.openanalytics.eu/shinyproxy/logo.png
  landing-page: /
  heartbeat-rate: 10000
  heartbeat-timeout: 60000
  port: 8080
  authentication: openid
  admin-groups: scientists
  #bind-address: 127.0.0.1
  # Example: 'simple' authentication configuration
  users:
  - name: jack
    password: password
    groups: scientists
  - name: jeff
    password: password
    groups: mathematicians
  # Example: 'openid' authentication configuration
  openid:
    auth-url: https://login.microsoftonline.com/9ac05e7d-e6a1-433a-9801-a60642903c2b/oauth2/authorize
    token-url: https://login.microsoftonline.com/9ac05e7d-e6a1-433a-9801-a60642903c2b/oauth2/token
    jwks-url: https://login.microsoftonline.com/common/discovery/keys
    client-id: d1abf394-b312-4717-a1c4-daaeee4f3b28
    client-secret: xxx
  # Docker configuration
  docker:
    container-backend: docker
    port-range-start: 20000
    container-protocol: https
  specs:
  - id: euler
    display-name: Euler's number
    #container-cmd: ["R", "-e", "shiny::runApp('/root/euler')"]
    container-image: euler
    access-groups: scientists


server:
    useForwardHeaders: true

logging:
  file:
    shinyproxy.log

Logré hacer el proxy inverso con nginx e iniciar sesión de forma segura usando autenticación simple, pero una vez que intento usar openid falla porque usa http como protocolo de devolución de llamada:

https://login.microsoftonline.com/9ac05e7d-e6a1-433a-9801-a60642903c2b/oauth2/authorize?response_type=code&client_id=d1abf394-b312-4717-a1c4-daaeee4f3b28&scope=openid%20email&state=5ZEbvVrVKBGpwId02I91SNRN-oPSbqkSR9oOlj7PRRQ%3D&redirect_uri=http : //52.152.166.27/login/oauth2/code/shinyproxy&nonce=EhOFxVuVRksPOxd0hG-CKPDd2s78bhFIzSSC_PPU5-Q

obteniendo el error AADSTS50011: La URL de respuesta especificada en la solicitud no coincide con las URL de respuesta configuradas para la aplicación: 'd1abf394-b312-4717-a1c4-daaeee4f3b28'.

mismo error para mí con 2.4

Hola @ danielfm123 , @ roberts2727 así que con ShinyProxy 2.4 la siguiente configuración ya no funcionará:

server:
    useForwardHeaders: true

en su lugar tienes que usar:

server:
  forward-headers-strategy: native

¿Puede informarnos si esto le resuelve el problema?

¡Problema resuelto! Gracias Señor.

Sí, funciona pero mata el paquete DT

ShinyProxy 2.4 la siguiente conf

¿Valdría la pena mencionar eso en https://www.shinyproxy.io/security/?

Hola @shosaco, esto ya está agregado a nuestro nuevo sitio web: https://www.shinyproxy.io/documentation/security/#forward -headers. La URL a la que apunta es un resto del sitio web anterior, que ahora limpié.

¿Fue útil esta página
0 / 5 - 0 calificaciones