Безопасность облачного запроса от OpenWhisk

Я создаю Angular SPA с хранилищем данных Cloudant в Bluemix.

Поскольку реализация OpenMhisk в Bluemix не использует службы VCAP, я вижу 3 варианта использования OpenWhisk в качестве поставщика API для облачных запросов для моего приложения Angular:

  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 извлекал все записи в этом диапазоне времени со всеми полями и возвращал выбранные поля. В моем примере у меня есть данные землетрясения USGS в измененном формате GeoJSON.

Следуя информации из следующих статей ниже, я пришел к выводу, что могу вызывать действия командной строки 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 и selector, но также отлично подходит для функции обновления, которую мне нужно создать для заполнения моих данных!

https://www.raymondcamden.com/2016/12/23/going-serverless-with-openwhisk
Статья, на которую ссылается @csantanapr

Я что-то пропускаю?

Спасибо!

1 ответ

Я предполагаю, что вы пытаетесь получить доступ к вашей Cloudant DB напрямую из вашего углового клиентского кода из браузера.

Если вам не нужна какая-либо бизнес-логика или вы можете уйти, используя функции Cloudant (проектирование документов, представлений, сопоставление, уменьшение и т. Д.), И вы генерируете ключи Cloudant API с определенным доступом (т. Е. Запись и чтение), тогда вам не нужен сервер или бесполезная промежуточная одежда / уровень.

Но теперь давайте перейдем к реальности, большинству людей нужен этот уровень, и если вы ищете OpenWhisk, то вам повезло, это очень легко сделать.

OpenWhisk в Bluemix поддерживает учетные данные службы VCAP, но другим способом. Давайте назовем у вас Bluemix Org carlos@example.com и пространство dev что бы перевести в пространство имен OpenWhisk carlos@example.com_dev

Если вы добавите сервис Cloudant под пробелом dev в Bluemix это создаст учетные данные ключа сервиса для этой учетной записи Cloudant. Эти учетные данные дают вам супер-доступ, что означает, что вы являетесь администратором.

Если вы хотите использовать эти учетные данные Cloudant в OpenWhisk, вы можете использовать автоматическое связывание, созданное с помощью пакета cloudant. Для этого с помощью OpenWhisk CLI запустите wsk package refresh при этом будут получены учетные данные Cloudant и создан новый пакет с учетными данными, связанными в качестве параметра по умолчанию для всех действий cloudant в этом пакете. Это модифицированная версия №1 выше

Другой альтернативой является привязка учетных данных вручную к пакету или действию в качестве параметров по умолчанию, это имеет смысл, если вы не хотите использовать учетные данные администратора с расширенными возможностями и вы сгенерировали ключ Cloudant API для конкретной базы данных. Это вариант № 1 выше.

Я не рекомендовал бы помещать учетные данные в исходный код #2

Для варианта № 3 небезопасно передавать свои учетные данные как часть URL-адреса, например https://username:password@user.cloudant.com/, но передавая имя пользователя и пароль в Authorization заголовок через https защищен. Это связано с тем, что даже если вы используете безопасный транспортный протокол https, все в URI/URL-адресе не зашифровано, и это значение может увидеть любой, но передача секретов в теле или заголовке является стандартной практикой, так как это передача после установления безопасного соединения.

Затем вы создаете действия, которые используют учетные данные в качестве параметров в ваших действиях OpenWhisk для построения вашей бизнес-логики для вашего бэкэнда.

Тогда как вам получить доступ к этому бэкэнду из браузера, хорошо, что OpenWhisk имеет функцию API Gateway в экспериментальном режиме, которая позволяет вам представлять ваши действия как общедоступные API с включенным CORS.

Предоставляется только URL-адрес, ваши учетные данные как параметры по умолчанию никогда не предоставляются.

Если вы хотите увидеть пример на постах в блоге Рэймонда Камдена, где он показывает, как приложение Ionic/Angular получает доступ к своей облачной базе данных кошек https://www.raymondcamden.com/2016/12/23/going-serverless-with-openwhisk

Другие вопросы по тегам