Shinyproxy: Execute brilhanteproxy somente em https (443)

Criado em 21 dez. 2018  ·  25Comentários  ·  Fonte: openanalytics/shinyproxy

Oi,

Tentei configurar o ShinyProxy apenas em https. Isso parece possível de acordo com a documentação - https://www.shinyproxy.io/security/#https -ssl-tls

Observe que quando apenas https está disponível (ou seja, sem redirecionamentos de http configurado no nginx), é necessário adicionar o seguinte ao application.yml para usar cabeçalhos de encaminhamento:
servidor:
useForwardHeaders: true

O problema é que, ao configurar apenas com https, entrada NGINX e OpenID, o esquema https não é transmitido da entrada NGINX para o contêiner ShinyProxy, o que por sua vez causa vários problemas com OpenId. Nomeadamente:

  • O URL de retorno que o Glossproxy gera para OpenID em https é gerado com http

A razão pela qual isso acontece é devido ao ShinyProxy usar os códigos padrão aqui - spring-security DefaultOAuth2AuthorizationRequestResolver.java # L141

bug

Comentários muito úteis

Conseguiu consertar.
Este código

 server:
      useForwardHeaders: true

precisa estar fora de proxy:

Todos 25 comentários

@garyallenkt Você conseguiu contornar esse problema?
Obrigado!

Alguma atualização para esse problema ?

O OpenAnalytics fez um ótimo trabalho ajudando a resolver isso.

Você deve conseguir obter a versão mais recente do ShinyProxy (2.3.0) e seguir a documentação atualizada aqui - https://www.shinyproxy.io/security/#https -ssl-tls

Boa sorte.

Olá @garyallenkt ,

Obrigado por sua resposta rápida. Tentei com a versão mais recente, mas o problema persiste no meu caso. Estou incorporando todo o BrightProxy ao Iframe. Para fazer o login, o servidor redireciona a conexão HTTPS para a conexão HTTP que não é permitida pela maioria dos navegadores. Você sabe como posso consertar isso?

Cumprimentos

@fmichielssen

Estou usando um fork do Telethon kids repo e eles usam 2.3.0 também, mas só para ter certeza também puxei a imagem do openanalytics. Para sua referência, aqui estão minhas configurações.

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

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

Qualquer atualização possível sobre isso? @garyallenkt @fmichielssen

Conseguiu consertar.
Este código

 server:
      useForwardHeaders: true

precisa estar fora de proxy:

server é de fato um bloco de nível superior e não está dentro de proxy

Infelizmente, estou tendo o mesmo problema com o GlossProxy 2.3.1

Eu tenho este bloco fora do bloco proxy no arquivo application.yml

servidor:
useForwardHeaders: true

e eu tenho o proxy Nginx configurado exatamente conforme descrito na documentação. Eu também (para testar se eu apenas cometi algum erro idiota do ngnix ao configurar um servidor Apache e tive exatamente o mesmo problema).

Meus blocos de configuração Nginx são:

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

}

Alguém tem alguma ideia sobre o que pode estar errado? ou mesmo pensamentos sobre como consertar isso?

Qual é o erro? Você pode compartilhar seus arquivos de configuração como eu fiz? Talvez eu possa te ajudar

@greenspray, obrigado por dar uma olhada! Eu realmente estou tão perplexo com isso! Meu Nginx o configura no comentário acima, e é assim que meu application.yml se parece:

Além de alterar a porta e adicionar a linha de cabeçalho serverforward, tentei manter tudo exatamente como estava instalado. Eu até testei isso com o proxy brilhante 2.3.0, já que parecia estar funcionando para todos neste tópico, mas tinha o mesmo 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

Eu também testei usando o apache como servidor da web, e estou com o mesmo problema. Minhas duas teorias atuais são que algo está errado com minha configuração de application.yml, ou porque eu não entendo proxy / proxy reverso, algo em meu bloco de proxy está permitindo o redirecionamento para http.

@ Claire-Kelley qual é o seu erro exato?

@ greenspray9 Não estou recebendo um erro! Funciona perfeitamente para que quando eu vá ao meu site eu possa ver a página de login do proxy brilhante e é servido por HTTPS (este é o comportamento desejado). O problema é que quando eu faço login (usando autenticação simples por enquanto) a página começa a ser servida por HTTP (não HTTPS - este é o problema!)

@ ckelley-ct Desculpe, não tenho experiência com o tipo de login que você deseja. Talvez haja algum tipo de redirecionamento acontecendo?

Eu tenho o mesmo problema, vocês encontraram uma solução?

@ HEPBO3AH sim, eu fiz - para mim, o problema era com a imagem insegura (a linha logo-url: http://www.openanalytics.eu/sites/www.openanalytics.eu/themes/oa/logo.png no código de exemplo acima). Se você alterar isso para uma imagem veiculada por https ou removê-la, o problema será resolvido.

@ HEPBO3AH @ ckelley-ct FYI, mudamos a imagem para https://www.openanalytics.eu/shinyproxy/logo.png

Consegui fazer o proxy reverso com nginx e logar com segurança usando autenticação simples, mas uma vez que tento usar openid ele falha porque usa http como protocolo de retorno de chamada:

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

obtendo erro AADSTS50011: O URL de resposta especificado na solicitação não corresponde aos URLs de resposta configurados para o aplicativo: 'd1abf394-b312-4717-a1c4-daaeee4f3b28'.

Este é o meu application.yml para brilhanteproxy 2.4.0, o brilhante proxy 2.3.1 parece funcionar no 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

Consegui fazer o proxy reverso com nginx e logar com segurança usando autenticação simples, mas uma vez que tento usar openid ele falha porque usa http como protocolo de retorno de chamada:

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

obtendo erro AADSTS50011: O URL de resposta especificado na solicitação não corresponde aos URLs de resposta configurados para o aplicativo: 'd1abf394-b312-4717-a1c4-daaeee4f3b28'.

mesmo erro para mim com 2.4

Olá @ danielfm123 , @ roberts2727 então com ShinyProxy 2.4 a seguinte configuração não funcionará mais:

server:
    useForwardHeaders: true

em vez disso, você deve usar:

server:
  forward-headers-strategy: native

Você pode relatar se isso resolve o problema para você?

Problema resolvido! Obrigado senhor.

Sim, funciona, mas mata o pacote DT

ShinyProxy 2.4 a seguinte conf

Vale a pena mencionar isso em https://www.shinyproxy.io/security/?

Olá @shosaco, isto já foi adicionado ao nosso novo site: https://www.shinyproxy.io/documentation/security/#forward -headers. O URL para o qual você está apontando é um resto do site antigo, que agora limpei.

Esta página foi útil?
0 / 5 - 0 avaliações