如何限制从 aws lambda 进行 http 调用

how to restrict making http calls from aws lambda

我正在创建从用户那里获取 nodejs 代码的应用程序,我正在使用该代码动态创建 lambda 函数。

例如:代码可以是

var http = require('http');

exports.handler = function(event, context) {
  console.log('start request to ' + event.url)
  http.get('http://##someapi', function(res) {
    console.log("Any Response : " + res.statusCode);
  }).on('error', function(e) {
    console.log("Error from API : " + e.message);
  });

  console.log('end request to ' + event.url)
  context.done(null);
}

但是我想限制 http/https 从该代码进行的调用,因为我无法控制用户传递的代码。

那么有什么方法可以限制它,比如某种 ROLE 或 POLICY 或任何配置来实现它?

我可以通过在角色中指定策略来​​限制 DynamoDB 访问。所以我可以控制数据库访问但不能控制 http 调用。

一种替代方法是,将这些 lambda 放在出站访问受限的 VPC 中。

这听起来很有趣,但我找到了解决我的问题的简单方法。我正在添加以下代码以及用户输入的代码。

var require = function(){
    return "You are not allowed to do this operation";
}

现在,如果使用过的用户尝试包含任何第 3 方库,例如 required('http') ,那么它将不允许在节点代码中实例化 http 库。

使用此解决方案,我能够阻止加载我不希望用户在 AWS lambda 函数中使用的所有第 3 方库。

我仍在寻找合适的解决方案,而不是在代码中使用该 hack。

只需在用户代码前添加以下内容:

(function(){
  function onlyAWS (module) {
    var isAWS = /amazonaws.com$/i
    var orig = module.request
    module.request = function restrictedRequest (opts, done) {
      if (typeof opts === 'string') opts = require('url').parse(opts)
      if (isAWS.test(opts.host || opts.hostname)) {
        return orig.call(module, opts, done)
      } else {
        throw new Error('No HTTP requests allowed')
      }
    }
  }

  onlyAWS(require('http'))
  onlyAWS(require('https'))
})()