天天看點

當函數計算遇上白名單

實際上這個世界上沒有好人和壞人,隻有做了好事的人,和做了壞事的人。

——柴靜《看見》

阿裡雲函數計算(Function Compute)是一個事件驅動的全托管 Serverless 計算服務。使用函數計算隻需編寫代碼并上傳,而無需管理伺服器等基礎設施,函數計算會準備好計算資源,并以彈性、可靠的方式運作代碼。

不久前在一個項目上使用了函數計算,需要在函數計算中調用第三方服務,第三方服務有可能會對函數計算的位址進行白名單驗證,但函數是通過彈性擴容的方式動态為函數配置設定計算資源的,是以無法提前預知通路第三方接口服務的IP位址,而且目前函數計算也沒有像阿裡雲WEB應用防火牆一樣提供回源位址清單,第三方接口需要的白名單IP要使用一些特殊手段來取得。

在阿裡雲函數計算的文檔中的“場景案例”中有一個章節就是針對這種情況的,使用的是Nginx正向代理來代理函數計算的通路請求,這種通過Nginx的代理後,第三方服務看到的将是Nginx伺服器的公網IP位址,這樣就可以解決白名單的問題。

其中Nginx的配置如下:

server{
resolver x.x.x.x;
listen 8080;
location / {
    proxy_pass http://$http_host$request_uri;
}           
}

其中resolver x.x.x.x;是DNS伺服器的位址。

這樣雖然能解決白名單的問題,但這個代理你能使用,别人也能用,這肯定不是你要看到的情況。解決的方案是對請求的目标主機名進行驗證,隻對目标第三方服務的請求進行代理,其餘的請求一律拒絕。

Nginx伺服器的配置如下:

server {

resolver x.x.x.x;

listen 8080;

location /{

if ( $http_host = ‘y.y.y.y’ ) {
  proxy_pass http://$http_host$request_uri;
  break;
}
return 403;           

用一個或者多個條件判斷對請求的http主機名進行驗證,假如請求的是第三方服務則代理發送,否則請求将被拒絕。

解決了Nginx的盜用的問題,還有一個問題要解決,就是Nginx服務的可用性問題,這個問題可以通過負載均衡SLB和來解決,架構如下:

當函數計算遇上白名單

第三方服務的防火牆需要加兩條位址,分别是兩台Nginx伺服器的公網IP。

當函數計算遇上白名單

上圖中xx.xx.125.101和xx.xx.119.208是兩台ECS的外網位址,可以将這兩個位址提供給第三方加白名單,xx.xx.227.184是函數計算的位址,這個位址無法保證固定,不能用做白名單。

這裡需要至少加兩個IP,那麼假如隻能加一條位址怎麼辦?

這就需要對架構進行一些調整了,架構如下:

當函數計算遇上白名單

需要給函數計算增加VPC内網通路接口,通路在内網的SLB負載均衡和Nginx代理,Nginx代理伺服器不配置公網IP而是通過NAT網關通路第三方接口。

為函數計算增加VPC通路接口需要進行通路授權,配置的方式是在函數計算的控制台打開服務配置。

當函數計算遇上白名單

點選修改,後可以看到網絡配置,選擇函數計算要對接的VPC和虛拟交換機。

當函數計算遇上白名單

在權限配置部分選擇建立角色,并指定系統模版授權,選擇

AliyunECSNetworkInterfaceManagementAccess ,并點選授權。

使用函數計算通路代理服務後,從阿裡雲彈性網卡控制台可以看到新增的ENI彈性網卡。

當函數計算遇上白名單

該彈性網卡位址雖然也是動态配置設定的,但位址範圍僅限于指定的虛拟交換機内。

繼續閱讀