Shinyproxy: Exécutez shinyproxy sur https (443) uniquement

Créé le 21 déc. 2018  ·  25Commentaires  ·  Source: openanalytics/shinyproxy

Salut,

J'ai essayé de configurer ShinyProxy sur https uniquement. Cela semble possible selon la documentation - https://www.shinyproxy.io/security/#https -ssl-tls

Notez que lorsque seul https est disponible (c'est-à-dire qu'aucune redirection depuis http configurée dans nginx), il est nécessaire d'ajouter ce qui suit au fichier application.yml afin d'utiliser les en-têtes de transfert :
serveur:
useForwardHeaders : vrai

Le problème est que lors de la configuration avec https uniquement, l'entrée NGINX et OpenID, le schéma https n'est pas transmis de l'entrée NGINX au conteneur ShinyProxy, ce qui provoque à son tour un certain nombre de problèmes avec OpenId. À savoir:

  • L'URL de retour que shinyproxy génère pour OpenID sur https est générée avec http

La raison pour laquelle cela se produit est due au fait que ShinyProxy utilise les codes par défaut ici - spring-security DefaultOAuth2AuthorizationRequestResolver.java # L141

bug

Commentaire le plus utile

J'ai réussi à le réparer.
Ce code

 server:
      useForwardHeaders: true

doit être à l'extérieur proxy:

Tous les 25 commentaires

@garyallenkt Avez-vous pu contourner ce problème ?
Merci!

Des mises à jour sur ce problème ?

OpenAnalytics a fait un excellent travail pour aider à résoudre ce problème.

Vous devriez pouvoir obtenir la dernière version de ShinyProxy (2.3.0) et suivre la documentation mise à jour ici - https://www.shinyproxy.io/security/#https -ssl-tls

Bonne chance.

Salut @garyallenkt ,

Merci pour votre réponse rapide. J'ai essayé avec la dernière version mais le problème persiste dans mon cas. J'intègre l'ensemble du shinyproxy dans Iframe. Pour se connecter, le serveur redirige la connexion HTTPS vers la connexion HTTP qui n'est pas autorisée par la majorité des navigateurs. Savez-vous comment je peux régler ça ?

Salutations

@fmichielssen

J'utilise un fork de Telethon kids repo et ils utilisent également 2.3.0, mais juste pour être sûr, j'ai également extrait l'image d'openanalytics. Pour votre référence, voici mes configs.

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

et 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;
    }
  }
}

Une éventuelle mise à jour à ce sujet ? @garyallenkt @fmichielssen

J'ai réussi à le réparer.
Ce code

 server:
      useForwardHeaders: true

doit être à l'extérieur proxy:

server est en effet un bloc de niveau supérieur et non à l'intérieur de proxy

Malheureusement, j'ai le même problème avec shinyproxy 2.3.1

J'ai ce bloc en dehors du bloc proxy dans le fichier application.yml

serveur:
useForwardHeaders : vrai

et j'ai configuré le proxy Nginx exactement comme décrit dans la documentation. J'ai aussi (pour tester si je venais de faire une erreur stupide de ngnix en installant un serveur Apache et si j'avais exactement le même problème).

Mes blocs de configuration Nginx sont :

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;
     }

}

Est-ce que quelqu'un a une idée de ce qui ne va pas ? ou même des réflexions sur la façon de le réparer?

Quelle est l'erreur ? Pouvez-vous partager vos fichiers de configuration comme je l'ai fait ? Peut-être je peux vous aider

@greenspray merci d'avoir jeté un coup d'œil! Je suis vraiment perplexe à ce sujet ! Mon Nginx le configure dans le commentaire ci-dessus, et voici à quoi ressemble mon application.yml :

Mis à part le changement de port et l'ajout de la ligne d'en-tête serverforward, j'ai essayé de tout conserver exactement tel qu'il a été installé. J'ai même testé cela avec le proxy brillant 2.3.0 car cela semblait fonctionner pour tout le monde sur ce fil, mais cela avait le même problème.

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

J'ai également testé en utilisant Apache comme serveur Web à la place, et j'ai le même problème. Mes deux théories actuelles sont que quelque chose ne va pas avec la configuration de mon application.yml , ou parce que je ne comprends pas bien le proxy / proxy inverse, quelque chose dans mon bloc proxy permet la redirection vers http.

@Claire-Kelley quelle est votre erreur exacte ?

@greenspray9 Je ne reçois pas d'erreur ! Cela fonctionne parfaitement pour que lorsque je vais sur mon site Web, je puisse voir la page de connexion proxy brillante et qu'elle soit servie via HTTPS (c'est le comportement souhaité). Le problème est que lorsque je me connecte (en utilisant une authentification simple pour le moment), la page commence à être servie via HTTP (pas HTTPS - c'est le problème !)

@ckelley-ct Désolé, je n'ai aucune expérience avec le type de connexion que vous souhaitez. Peut-être y a-t-il une sorte de redirection qui se produit?

J'ai le même problème, avez-vous trouvé une solution ?

@HEPBO3AH oui je l'ai fait - pour moi le problème était avec l'image non sécurisée (la ligne logo-url : http://www.openanalytics.eu/sites/www.openanalytics.eu/themes/oa/logo.png dans le exemple de code ci-dessus). Si vous la remplacez par une image diffusée via https ou la supprimez, le problème est résolu.

@HEPBO3AH @ckelley-ct Pour info, nous avons déplacé l'image vers https://www.openanalytics.eu/shinyproxy/logo.png

J'ai réussi à créer le proxy inverse avec nginx et à me connecter en toute sécurité à l'aide d'une authentification simple, mais une fois que j'ai essayé d'utiliser openid, cela échoue car il utilise http comme protocole de rappel :

https://login.microsoftonline.com/9ac05e7d-e6a1-433a-9801-a60642903c2b/oauth2/authorize?response_type=code&client_id=d1abf394-b312-4717-a1c4-daaeee4f3b28&scope=openid%02bqV91&stater=5ZERpj0b3b28&scope=openid%20bqV1abf394-b312-4717-a1c4-daaeee4f3b28&scope=openid%02bqV91&stater=5ZE //52.152.166.27/login/oauth2/code/shinyproxy&nonce=EhOFxVuVRksPOxd0hG-CKPDd2s78bhFIzSSC_PPU5-Q

obtenir l'erreur AADSTS50011 : l'URL de réponse spécifiée dans la demande ne correspond pas aux URL de réponse configurées pour l'application : 'd1abf394-b312-4717-a1c4-daaeee4f3b28'.

Ceci est mon application.yml pour shinyproxy 2.4.0, le proxy brillant 2.3.1 semble fonctionner à partir de 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

J'ai réussi à créer le proxy inverse avec nginx et à me connecter en toute sécurité à l'aide d'une authentification simple, mais une fois que j'ai essayé d'utiliser openid, cela échoue car il utilise http comme protocole de rappel :

https://login.microsoftonline.com/9ac05e7d-e6a1-433a-9801-a60642903c2b/oauth2/authorize?response_type=code&client_id=d1abf394-b312-4717-a1c4-daaeee4f3b28&scope=openid%02bqV91&stater=5ZERpj0b3b28&scope=openid%20bqV1abf394-b312-4717-a1c4-daaeee4f3b28&scope=openid%02bqV91&stater=5ZE //52.152.166.27/login/oauth2/code/shinyproxy&nonce=EhOFxVuVRksPOxd0hG-CKPDd2s78bhFIzSSC_PPU5-Q

obtenir l'erreur AADSTS50011 : l'URL de réponse spécifiée dans la demande ne correspond pas aux URL de réponse configurées pour l'application : 'd1abf394-b312-4717-a1c4-daaeee4f3b28'.

même erreur pour moi avec 2.4

Salut @danielfm123 , @roberts2727 donc avec ShinyProxy 2.4 la configuration suivante ne fonctionnera plus :

server:
    useForwardHeaders: true

à la place, vous devez utiliser :

server:
  forward-headers-strategy: native

Pouvez-vous indiquer si cela résout le problème pour vous ?

Problème résolu! Merci Monsieur.

Oui, ça marche mais tue le paquet DT

ShinyProxy 2.4 la conf suivante

Cela vaudrait-il la peine de le mentionner sur https://www.shinyproxy.io/security/?

Salut @shosaco, ceci est déjà ajouté à notre nouveau site Web : https://www.shinyproxy.io/documentation/security/#forward -headers . L'URL vers laquelle vous pointez est un reste de l'ancien site Web, que j'ai maintenant nettoyé.

Cette page vous a été utile?
0 / 5 - 0 notes