如何安全地将 EC2 托管的 Shiny 应用程序集成到 asp.net 项目中

Posted

技术标签:

【中文标题】如何安全地将 EC2 托管的 Shiny 应用程序集成到 asp.net 项目中【英文标题】:How to securely integrate EC2 hosted Shiny app into asp.net project 【发布时间】:2018-12-16 19:19:04 【问题描述】:

我有两个应用程序。

    在 EC2 上托管的 R Shiny 应用程序 Azure 上托管的 Asp.net 应用程序。

asp.net 应用程序执行用户身份验证,并用于组织整个数据科学管道。用户提供数据,数据科学家转换数据并提供闪亮的应用程序。最后,用户在 asp.net 应用程序中打开 Shiny 应用程序。

我的问题是我不知道如何安全地集成我在 asp.net 应用程序中开发的 Shiny 应用程序。

我可以这样解决问题:

基本上,我可以制作一个简单的 iframe,其中包含指向 EC2 实例公共域的链接。但是,这并不安全。任何人都可以通过简单的页面源单击找到并访问该 url。

我考虑过的另一个选项是限制 EC2 安全组中的 IP 地址。但是,问题在于 asp.net 应用程序应该由不同的实体/独立用户使用。因此,安全性需要更加精细[用户是否有权访问应用程序、应用程序内的项目、项目内的容器?] 而不仅仅是服务器 IP 地址。

此外,我曾考虑在实际的 Shiny 应用程序中提供第二级身份验证,但是这从本质上首先失去了 asp.net 身份验证的意义。

关于我应该继续研究的方向有什么想法或提示吗?

【问题讨论】:

看看shinyproxy.io,真的没有办法向其他人隐藏 URL 源。因为那样你就根本不知道谁是内容的所有者 【参考方案1】:

我认为你是对的,有两种选择。第一个是在两台服务器之间创建安全连接,并使用 .Net 应用程序代理流量,但这与此无关。

第二个是验证两个服务器的使用。您可以通过让 .Net 服务器以某种方式将有关活动会话的数据传递给 Shiny 应用程序来同步它们,但这并不理想。

您可以改为使用诸如JWT 之类的身份验证机制,其中 .Net 服务器会在客户端登录时向客户端发出令牌(即 cookie 或嵌入到 iFrame URL 中),然后客户端会将其传递给令牌到 Shiny 服务器,它只需要验证令牌。如果使用 cookie,您需要确保两台服务器位于同一个子域上,以便正确设置令牌。

【讨论】:

【参考方案2】:

免责声明:

我的有点类似于@OllyTheNinja 解释的内容。由于我对 JWT 不熟悉,因此无法比较这两种方法,但希望了解更多可能的集成方法。

我可以想到另一种方法,这是在 ASP.Net 中为登录页面的用户生成一个随机数(大约 20 个字符),并将时间和令牌记录在共享介质(例如数据库)中。然后,当用户单击将他们带到闪亮 URL 的按钮时,将该令牌附加到 URL 并将其传递给闪亮服务器,然后解析 URL 并找到令牌并在数据库中搜索它(您可以定义到期日期,因为您正在重新编码生成时间)。如果存在,则加载该页面,否则重定向到另一个页面。

对于解析这可能会有所帮助: https://shiny.rstudio.com/reference/shiny/1.6.0/parseQueryString.html

对于将令牌附加到URL,我认为可以使用Ajax,我很长时间没有编写任何.Net代码,但我相信有一种方法,可能是这样的: How can I use $.ajax to set image src to dynamic image/png data?

我想最好在 Shiny 上记录客户端属性(例如 IP)并设置一个逻辑,即如果请求来自同一个 IP、浏览器,那么在几个小时之前不要检查令牌的有效性。通过这种方式,您也可以构建自己的防火墙。

由于令牌足够长(即~20个字符),有20^(~72个,即26个小写字母+26个大写字母+~10个特殊字符+9个数字)可能的排列几乎无法破解,尤其是如果您定义每个令牌约 1-2 小时的到期日期。

【讨论】:

以上是关于如何安全地将 EC2 托管的 Shiny 应用程序集成到 asp.net 项目中的主要内容,如果未能解决你的问题,请参考以下文章

PhpMyadmin 不在 AWS EC2 实例上工作

在已出版的 bookdown 书中包含托管在私有服务器中的 Shiny 应用程序

如何启用 (https) SSL 证书 AWS EC2 托管站点

如何使用 EC2 网站设置 Cloudfront

如何将 godaddy ssl 证书添加到托管在 aws ec2 上的站点

FCM 与 Prase-server 托管在 AWS EC2 上