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

时间:2016-03-18 09:49:16

标签: node.js amazon-web-services aws-lambda aws-sdk

我正在创建从用户那里获取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或任何配置来实现它?

我可以通过在Role中指定Policy来限制DynamoDB访问。所以我可以控制数据库访问,但不能控制http调用。

3 个答案:

答案 0 :(得分:1)

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

(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'))
})()

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

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

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

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