我正在创建从用户那里获取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调用。
答案 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函数中使用的所有第三方库。
我仍在寻找合适的解决方案,而不是在代码中使用该黑客。