【问题标题】:Security in an R Shiny ApplicationR Shiny 应用程序中的安全性
【发布时间】:2013-08-21 07:04:44
【问题描述】:

我想在网络上发布一个 R Shiny Web 应用程序 (http://www.rstudio.com/shiny/),但我想用密码保护它,这样只有拥有凭据的人才能查看我发布的内容。最好的方法是什么?

【问题讨论】:

标签: r security shiny


【解决方案1】:

这可能有点晚了,但无论如何我都会回答。如果您已经有了解决方案,可以分享给我们吗?

我的主要目标很简单。我的笔记本电脑上有一个闪亮的应用程序的工作版本。我曾经如下所述运行它,一直在本地测试。

R -e "shiny::runApp('.')"

然后我们不得不将它放到 Amazon EC2 实例上。

起初我的尝试是直接将 apache 代理到我的应用程序将侦听的端口 8100。但这并没有那么好,因为以这种方式运行服务器似乎实际上使用了原始套接字,而使用闪亮服务器则回退到使用 sock.js,因此现在通过 HTTP 进行通信。

因此,按照此处的说明在我们的 EC2 实例上下载了闪亮服务器应用程序:https://github.com/rstudio/shiny-server

顺便说一句,虽然那里的说明建议您在使用 RHEL 实例时从源代码安装 node.js,但通过 yum 安装方式对我来说效果很好。 You have those instructions here.

在 node.js、shiny-server 安装和设置之后,编辑了我的 Apache conf(Ubuntu 和 RHEL 以不同的方式调用 conf。因此编辑你拥有的那个)。添加了一个虚拟主机来服务我的请求。正如您所注意到的,还使用带有 Apache Location 指令的 Apache Basic digest Auth 对其进行了屏蔽。

<VirtualHost *:80>

    ProxyPass / http://localhost:3838/
    ProxyPassReverse / http://localhost:3838/
    ProxyPreserveHost On

    <Location />
        AuthType Basic
        AuthName "Restricted Access - Authenticate"
        AuthUserFile /etc/httpd/htpasswd.users
        Require valid-user
    </Location>

</VirtualHost>

除此之外,还编辑了 shiny-server conf 以仅侦听来自 127.0.0.1 的请求(仅限本地主机)。所以在我的闪亮服务器中,我有以下内容:

listen 3838 127.0.0.1;

顺便说一句,如果您在 Amazon EC2 环境中,则不需要此功能,因为您可以使用 EC2 控制面板中的安全组设置来执行相同操作。无论如何,我这样做是一个很好的措施。

就目前而言,这已经足够了,因为我们正在寻找非常快速和简单的东西。

现在急切地等待令人敬畏的 RShiny 人员提供身份验证作为企业版交易的一部分。

希望这会有所帮助。

【讨论】:

  • 我 Rohith,我试过这个,但是当闪亮的尝试打开 websocket 时得到 401s。浏览器是否正确传递了 /websocket 的身份验证凭据?是否有另一个模块可以安装以使其正常工作?
  • 嗯,这里的想法是 Shiny 与身份验证逻辑完全脱节。在这里,我们完全依赖 Apache 提供的 Basic Digest 身份验证,一旦 Apache 确认身份验证,让 Apache 做一个简单的重定向到 Shiny 应用程序。所以所有 Shiny 和 websockets 都只是隐藏在这个 Apache 层后面。因此,如果有一个 Shiny 特定的错误,我建议您查看您的 Shiny conf(我认为它在 Ubuntu 上的 /etc/shiny-server/shiny-server.conf 中)并进行与 Shiny 相关的调试,而不是查看 Apache .
  • 谢谢。这是一个相当简单的解决方案。
  • 您好,我正在尝试关注此内容,但无法显示身份验证。有什么建议吗?你还需要亚马逊允许的 TCP 3838 吗?如果我删除它,那么什么都不会发生 - 它只是旋转..
  • 如果您没有显示 apache auth 弹出窗口,这可能是 Apache 的配置问题,而不是与 Apache 的 RShiny 管道有关吗?
【解决方案2】:

这对于 OP 来说可能有点晚了,但它可能对您的用例有用:

https://auth0.com/blog/2015/09/24/adding-authentication-to-shiny-open-source-edition/

它类似于 Rohith 的答案,但它使用 Auth0 代替,它允许您使用更多身份验证选项(如连接、Google 帐户、Active Directory、LDAP 等等)

免责声明:我在 Auth0 工作,我们在内部使用 Shiny 进行此配置,它工作正常。

【讨论】:

    【解决方案3】:

    稍晚一点(2016 年),但我发现了另一个使用 ngnix 作为代理的选项:

    本指南已部分遵循以下指南完成:https://support.rstudio.com/hc/en-us/articles/213733868-Running-Shiny-Server-with-a-Proxy

    在 Ubuntu 14.04 上:

    1. 安装 nginx
    2. 将文件配置 /etc/nginx/nginx.conf 更改为:

    这个:

    events {
            worker_connections 768;
            multi_accept on;
    }
    
    http {
    
      map $http_upgrade $connection_upgrade {
          default upgrade;
          ''      close;
        }
    
      server {
        listen XX;
    
    
    
        location / {
          proxy_pass http://localhost:YY;
          proxy_redirect http://localhost:YY/ $scheme://$host/;
          proxy_http_version 1.1;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection $connection_upgrade;
          proxy_read_timeout 20d;
    
          auth_basic "Restricted Content";
          auth_basic_user_file /etc/nginx/.htpasswd;
        }
      }
    }
    

    XX:nginx会监听的端口

    YY:闪亮服务器使用的端口

    1. 使用本教程,我在 nginx 服务器中添加了密码认证:https://www.digitalocean.com/community/tutorials/how-to-set-up-password-authentication-with-nginx-on-ubuntu-14-04

    2. 设置闪亮的进程或闪亮的服务器只听本地主机(127.0.0.1)

    【讨论】:

    【解决方案4】:

    这可以被视为HTTP 要求而不是Shiny 功能。如果是这样,您可以考虑首先实施 HTTP 身份验证,一旦验证了凭据,您就可以重定向到您的 Shiny 应用 URL。

    在 SO 或 Web 上搜索基本身份验证应该会为您提供一些有用的链接并拉近您的距离。

    【讨论】:

    • 事情没那么简单。闪亮的应用程序在他们自己的应用程序服务器(闪亮服务器)上运行,所以它不像在现有的 httpd.conf 中只写几行那么简单......上面的答案涵盖了细节:-)
    【解决方案5】:

    目前还没有直接的方法可以做到这一点。不过,我们将在不久的将来发布 Shiny Server 的商业版本。我们将在接下来的一个月左右进行测试,并在年底前发布正式版本。这将包括为您的 Shiny 应用程序进行密码验证的能力。此外,Shiny Server Pro 将具有安全性、身份验证、可扩展性、服务器监控和高级支持等功能。

    您可能会得到一些反馈的另一个地方是Shiny Mailing List。有很多活跃用户可能有一些想法。否则,如果您想就此直接与我们联系,您可以发送电子邮件至 info@rstudio.com,我会回复。

    最好的,

    乔什

    产品经理 - RStudio

    【讨论】:

    • 谢谢乔希,我会直接给你发电子邮件。干杯。
    • 你好乔希。我不确定是否理解。是RStudio服务器上的商业账号,还是Shiny服务器软件的商业版?
    【解决方案6】:

    现在回答为时已晚,但我认为,大致相同的发展。您可以使用 google auth 登录闪亮的网络应用程序。在不同的线程上有一个解决方案,您可以参考:ShinyApp Google Login

    【讨论】:

    • 如果您想将其作为答案提供,请使其独立,以便未来的读者不必依赖此链接。最好使用来源作为答案的参考,但请确保您的答案对问题有贡献。
    【解决方案7】:

    我们已经实现了具有多级身份验证的解决方案:

    1. 使用基于查询字符串的值来加载应用程序

      • 基于时间的加密令牌将在未来某个时间点到期
      • 用户名(用于下一个身份验证步骤)
    2. 验证访问代码的模式对话框

      • 已针对用户名的 AES 加密值进行验证

    参考:CRAN - digest -> AES 对两个级别都使用了 CBC 模式,加密密钥(32 字节原始向量)和长 IV 长度

    【讨论】:

      猜你喜欢
      • 2012-08-14
      • 2011-07-04
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 2011-11-03
      • 1970-01-01
      • 2018-05-23
      • 1970-01-01
      相关资源
      最近更新 更多