2017-07-07 88 views
0

我試圖讓CORS根據我們系統中存在的客戶列出的域名白名單。我們有一個白色標籤的產品,讓我們的公司CNAME將定製域添加到我們的系統中。我們需要通過在Access-Control-Allow-Origin: http://some.custom.domain標題中添加來自HaProxy的響應,允許動態地允許Origin來自任何這些自定義域。HaProxy動態列表/地圖

我一直在閱讀有關從haproxy加載列表/地圖的不同方式,但我只是沒有解決的最佳實施。我已經想出了大概3種可能的方式,但我想看看是否有其他人也有一些洞察力。我的選項到目前爲止:

  1. 存儲一個map我可以找到添加標題時可用的域。如何填充此映射文件是目前的問題。我想我可以在啓動時通過LUA進行API調用來創建文件?或者它可能是一個NFS掛載的文件?每次將新域添加到我們的系統時,我們都必須重新加載,無論是通過相同的api調用還是直接轉到套接字上的地圖api。

  2. 使用LUA從現場請求通過HAProxy的每一個任務的API來驗證,如果在Origin傳遞的域名是合法的,並添加標題。有可能使用Memcached的最少開銷假設我們可以找到一個LUA用於memcached的客戶端庫。

  3. 可能實施某種基於DNS的解決方案,我們運行我們自己的DNS服務器來解析這些自定義域,並讓HaProxy對此進行查找。我不知道這是否可行,我只是知道haproxy具有DNS功能。奇怪的是,我們實際上並不想解決知識產權問題,我們只是想要一個「是」或「否」的答案。

是否有其他人知道這個問題的明顯解決方案?我正在尋找易於實現的方法,但最終將請求本身的開銷降至最低,因爲這需要在每個請求上發生,並且標頭爲Origin

任何洞察讚賞!

回答

0

1 /地圖解決方案:
我認爲最簡單,最有效的解決辦法是將現有的域存儲在一個地圖。 然後,您可以使用set mapadd map,通過HAProxy套接字更新地圖。每當域更改時,無需在此重新加載。

2/LUA溶液:
這是可能還使用這樣的功能與LUA做到這一點:

core.register_action("validate_origin", {"http-req"}, function(txn) 
    local origin= txn.http:req_get_headers()headers["origin"][0] 
    local sock = core.tcp() 
    sock:connect("<API-IP>", <API-PORT>) 
    sock:send("GET /api?validate=".. origin .. " HTTP/1.1\r\n Host:www\r\n ") 
    domain = sock:receive("*a") 
    sock:close() 
    txn:set_var("txn.allow_origin", domain) 
end) 

HAProxy的CONF在前端中的問題:

http-request capture hdr("Origin") len 128 
http-request lua.validate_origin if { capture.req.hdr(0) -m found } 
http-response add-header Access-Control-Allow-Origin %[var(txn.allow_origin)] if { capture.req.hdr(0) -m found } 

該解決方案引入了更多開銷,因爲HAProxy必須依賴於每個CORS請求的外部資源(並可能等待它)。

+0

雅我選擇了列表方法。實際上我有LUA註冊一個任務,在啓動時從API加載列表併爲每個域寫入一個ACL。謝謝! – brad