【问题标题】:Security of cloudant query from OpenWhisk来自 OpenWhisk 的 cloudant 查询的安全性
【发布时间】:2017-05-20 17:31:45
【问题描述】:

我正在使用 Bluemix 上的 Cloudant 数据存储构建一个 Angular SPA。

由于 OpenWhisk 的 Bluemix 实现不使用 VCAP 服务,我看到 3 个选项可以使用 OpenWhisk 作为我的 Angular 应用程序的云查询的 api 提供程序:

  1. 按照此处所示的传递凭据的模式:https://github.com/IBM-Bluemix/openwhisk-visionapp(顺便说一句非常有趣的方法)
  2. 包括凭据,就像我在本地运行一样,如下所示:https://github.com/IBM-Bluemix/nodejs-cloudant/blob/master/app.js
  3. 使用此处所示的 http API:https://docs.cloudant.com/api.html(突出显示传递凭据的安全问题。

由于我的服务不是为了发布(它是为了我自己的应用程序),我认为选项 2 是我的“万恶之源”选择。我错过了什么吗?我的想法是,虽然对更改很脆弱,但它是最安全的,因为凭据不会公开传递。无服务器基础设施将不得不被黑客入侵......

提前致谢!

(冗长)更新:(提前道歉)

我已经走得更远了,但仍然没有答案 - 现在卡在执行中。

澄清一下,我的目标是让应用程序从 Angular 客户端 -> OpenWhisk -> Cloudant 流出。

在这个最简单的用例中,我想传递一个 startTime 参数和一个 endTime 参数,让 OpenWhisk 获取该时间范围内的所有记录以及所有字段,然后传回选定的字段。在我的示例中,我有经过修改的 GeoJSON 格式的 USGS 地震数据。

根据以下文章中的信息,我得出结论,我可以调用 wsk 命令行操作并使用我在 Javascript 函数中设置的绑定,因此不会将我的凭据传递给数据库。这为我提供了一定程度的安全性(仍然质疑我的 OpenWhisk 操作的其余端点),但我认为一旦我的示例运行起来,我就会考虑其中的一部分。

我的命令行(有效): wsk action invoke /my@orgname.com_mybluemixspace/mycfAppName/exec-query-find --blocking --result --param dbname perils --param query {\"selector\":{\"_id\":{\"$gt\":0},\"properties.time\":{\"$gt\":1484190609500,\"$lt\":1484190609700}}}

这会成功返回以下内容:
{ "docs": [ { "_id": "eq1484190609589", "_rev": "1-b4fe3de75d9c5efc0eb05df38f056a65", "dbSaveTime": 1.484191201099e+12, "fipsalpha": "AK", "fipsnumer": "02", "geometry": { "coordinates": [ -149.3691, 62.5456, 0 ], "type": "Point" }, "id": "ak15062242", "properties": { "alert": null, "cdi": null, "code": "15062242", "detail": "http://earthquake.usgs.gov/earthquakes/feed/v1.0/detail/ak15062242.geojson", "dmin": null, "felt": null, "gap": null, "ids": ",ak15062242,", "mag": 1.4, "magType": "ml", "mmi": null, "net": "ak", "nst": null, "place": "45km ENE of Talkeetna, Alaska", "rms": 0.5, "sig": 30, "sources": ",ak,", "status": "automatic", "time": 1.484190609589e+12, "title": "M 1.4 - 45km ENE of Talkeetna, Alaska", "tsunami": 0, "type": "earthquake", "types": ",geoserve,origin,", "tz": -540, "updated": 1.484191127265e+12, "url": "http://earthquake.usgs.gov/earthquakes/eventpage/ak15062242" }, "type": "Feature" } ] }

我在 OpenWhisk(如下)中创建的操作返回内部服务器错误。我将输入值传递为
{ "startTime": "1484161200000", "endTime": "1484190000000" }

这是我的操作代码:

`var openWhisk = require('openwhisk');
var ow = openWhisk({
    api_key:'im really a host'
});

function main(params) {

  return new Promise(function(resolve, reject) {
  ow.actions.invoke({
    actionName:'/my@orgname.com_mybluemixspace/mycfAppName/exec-query-find',
    blocking:true,
    parameters:{
      dbname: 'perils',
      query:  {
        "selector": {
          "_id": {
            "$gt": 0
          },
          "properties.time": {
            "$gt": params.startTime,
            "$lt": params.endTime
          }
        }
      }
    }
    }).then(function(res) {
            //get the raw result
            var raw = res.response.result.rows;
            //lets make a new one
            var result = [];
            raw.forEach(function(c) {
                result.push({id:c.docs._id, time:c.docs.properties.time, title:c.docs.properties.title});
            });
            resolve({result:result});
        });
    });
}`

以下是我的研究的链接: http://infrastructuredevops.com/08-17-2016/news-openwhisk-uniq.html
由于使用了 exec-query-find 和选择器语法用法,因此很有用,但对于我需要构建以填充数据的更新功能也很酷!

https://www.raymondcamden.com/2016/12/23/going-serverless-with-openwhisk
@csantanapr 引用的文章

我是否忽略了什么?

谢谢!

【问题讨论】:

    标签: ibm-cloud cloudant openwhisk ibm-cloud-functions


    【解决方案1】:

    我假设您尝试做的是直接从浏览器中的 Angular 客户端代码访问您的 Cloudant DB。

    如果您不需要任何业务逻辑,或者您可以通过使用 Cloudant 功能(设计文档、视图、地图、reduce 等)来摆脱困境,并且您正在生成具有特定访问权限的 Cloudant API 密钥(即 write vs . 阅读),那么您就不需要服务器或无服务中间件/层。

    但现在让我们变得现实,大多数人都需要该层,如果您正在寻找 OpenWhisk,那么您很幸运,这很容易做到。

    Bluemix 上的 OpenWhisk 支持 VCAP 服务凭证,但方式不同。 假设您有一个 Bluemix Org carlos@example.com 和空间 dev,它们将转换为 OpenWhisk 命名空间 carlos@example.com_dev

    如果您在 Bluemix 中的空间 dev 下添加 Cloudant 服务,这将为此 Cloudant 帐户生成服务密钥凭证。此凭据为您提供超级权限,这意味着您是管理员。

    如果您想在 OpenWhisk 中使用此 Cloudant 凭证,您可以使用使用 cloudant 包生成的自动绑定。 要使用 OpenWhisk CLI 执行此操作,请运行 wsk package refresh,这将提取 Cloudant 凭据并创建一个新包,并将凭据绑定为该包下所有 Cloudant 操作的默认参数。这是上面#1的修改版本

    另一种选择是将凭据手动绑定到包或操作作为默认参数,当您不想使用超级管理员凭据并且为特定数据库生成 Cloudant API 密钥时,这很有意义。这是上面的选项#1。

    我不建议将凭据放在源代码 #2 中

    对于选项 #3,不安全的是将您的凭据作为 URL 的一部分传递,例如 https://username:password@user.cloudant.com,但通过 https 传递 Authorization 标头中的用户名和密码是安全的。 这是因为即使您使用安全传输 https,URI/URL 中的所有内容都未加密,任何人都可以看到该值,但在正文或标头中传递秘密是标准做法,因为这是在建立安全连接后传输。

    然后,您创建在 OpenWhisk 操作中使用凭证作为参数的操作,以便为您的后端构建业务逻辑。

    那么如何从浏览器访问此后端,OpenWhisk 有一个实验性的 API 网关功能,允许您将您的操作公开为启用 CORS 的公共 API。

    只有一个 url 是公开的,你的凭据作为默认参数永远不会公开。

    如果您想查看 Raymond Camden 博客文章中的示例,他展示了 Ionic/Angular 应用程序访问他的 Cloudant 猫数据库 https://www.raymondcamden.com/2016/12/23/going-serverless-with-openwhisk

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-16
      • 2011-02-24
      相关资源
      最近更新 更多