如何安全地将 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 项目中的主要内容,如果未能解决你的问题,请参考以下文章
在已出版的 bookdown 书中包含托管在私有服务器中的 Shiny 应用程序
如何启用 (https) SSL 证书 AWS EC2 托管站点