2016-03-18 43 views
0

我正在創建應用程序,其中需要用戶的代碼nodejs,我正在使用該代碼創建lambda函數。如何限制從aws lambda 012發送http調用

例如:該代碼可以

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調用。

+0

@elssar感謝編輯:) –

+1

最安全的方法是運行在沙箱中的代碼。在npm上有幾個沙箱包可用 - https://www.npmjs.com/search?q=sandbox – elssar

+0

@elssar:沙箱看起來不錯的選擇..但我不確定從沙箱,它允許訪問/調用aws資源?像DynamoDB,其他lambda函數 –

回答

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

無法理解解決方案..你可以請添加更多信息 –

0

一種替代方法是將這些lambda放入具有受限出站訪問權限的VPC中。

+0

是的,我有這個想法。它在lambda配置它自己。在問題中,我只提到了爲簡單的http lib。實際上我想限制所有第三個庫在lambda中加載。 –

0

這聽起來像有趣的解決方案,但我發現我的問題的簡單解決方案。我將以下代碼與用戶輸入的代碼一起添加。

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

現在,如果使用的用戶嘗試包括任何第三方庫等所需(「HTTP」),那麼它不會允許實例HTTP LIB在節點代碼。

使用此解決方案我能夠阻止加載所有我不希望用戶在AWS lambda函數中使用的第三方庫。

我仍然在尋找適當的解決方案,而不是在代碼中使用該hack。

相關問題