簡體   English   中英

來自 OpenWhisk 的 cloudant 查詢的安全性

[英]Security of cloudant query from OpenWhisk

我正在使用 Bluemix 上的 Cloudant 數據存儲構建一個 Angular SPA。

由於 OpenWhisk 的 Bluemix 實現不使用 VCAP 服務,因此我看到了 3 個選項來使用 OpenWhisk 作為我的 api 提供程序來為我的 Angular 應用程序進行 cloudant 查詢:

  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 Client -> 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 引用的文章

我是否忽略了什么?

謝謝!

我假設您想要做的是直接從瀏覽器的角度客戶端代碼訪問您的 Cloudant 數據庫。

如果您不需要任何業務邏輯,或者您可以通過使用 Cloudant 功能(設計文檔、視圖、映射、縮減等)來擺脫困境,並且您正在生成具有特定訪問權限(即寫入與讀取)的 Cloudant API 密鑰,那么您就不需要服務器或無服務器中間件/層。

但現在讓我們現實一點,大多數人都需要該層,如果您正在尋找 OpenWhisk,那么您很幸運,這很容易做到。

Bluemix 上的 OpenWhisk 支持 VCAP 服務憑證,但方式不同。 讓我們命名您有一個 Bluemix Org carlos@example.com和 space dev ,它將轉換為 OpenWhisk 名稱空間carlos@example.com_dev

如果您在 Bluemix 中的 space 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM