當前位置:
首頁 > 最新 > nginScript系列:使用nginScript掩蔽用戶隱私數據

nginScript系列:使用nginScript掩蔽用戶隱私數據

這是nginScript系列文章的第四篇,將介紹如何使用nginScript掩蔽用戶隱私數據。查看第一篇「nginScript簡介」,第二篇「使用nginScript將客戶端重定向到新伺服器」,查看第三篇「通過TCP負載均衡和Galera集群來擴展MySQL」。

2016年10月,歐洲聯盟法院規定將IP地址歸為「個人信息」,於是IP地址進入了數據保護指令和一般性數據保護條例的保護範圍。對於很多網站來說,這意味著如果數據離開了歐盟管轄的地區,那麼對這些數據進行歸檔和分析就面臨著法規上的挑戰。對於進入美國的數據,西歐隱私盾協議提供了一定程度的保護,但仍然面臨私權組織和政府的法律質疑。

不過,保護日誌里的隱私數據並不是EU獨有的問題。對於像IOS/ICE 27001這樣的安全認證組織,將數據移出安全區域也會破壞認證的合規性。

在這篇文章里,我們介紹一些簡單的方案用於處理NGINX Plus和NGINX的日誌文件,這樣它們就可以安全地導出到外部,不會暴露所謂的個人識別信息(Personal Identification Information)。

無效的方式

保護數據最簡單的辦法是在導出數據之前把IP地址信息剔除掉。通過標準的Linux命令行工具就能做到這點,不過日誌分析系統希望日誌文件具有標準的格式,缺少IP欄位會導致無法導入日誌。即使日誌成功導入,如果分析系統依賴IP地址來追蹤用戶行為,那麼分析結果的準確性就會大打折扣。

另外一種可能的辦法是,使用隨機的假IP地址替換原來的值,這樣就可以保持完整的日誌文件,但是這樣仍然會影響日誌分析結果的質量,因為IP地址是假的。

掩蔽客戶端IP地址

最好的解決方案是使用一種叫作數據掩蔽的技術對真實的IP地址進行轉換,既不會暴露用戶身份信息,又能夠用於分析用戶網站活動行為。數據掩蔽演算法為給定值生成不可逆的偽隨機值,同一個IP地址總是能被轉換成同樣的偽隨機值。

你可以在NGINX和NGINX Plus中使用nginScript模塊來實現IP地址掩蔽。nginScript是為NGINX和NGINX Plus專門實現的JavaScript,專門為伺服器端的使用場景而設計。在記錄請求消息時,我們通過執行一小段JavaScript代碼來掩蔽客戶端的IP地址。

為掩蔽IP地址配置NGINX和NGINX Plus

log_format指令指定了哪些信息會顯示在訪問日誌里。NGINX和NGINX Plus提供了默認的日誌格式,叫作combined,用它生成的日誌可以被大多數日誌處理工具處理。

我們創建一個新的日誌格式masked,除了第一個欄位與combined不一樣,其他的都一樣,我們使用$remote_addr_masked代替$remote_addr。我們的JavaScript代碼會計算這個變數,為每一個客戶端IP地址生成一個掩蔽值。

log_format masked $remote_addr_masked - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" ;

為了讓NGINX和NGINX Plus以這種格式生成訪問日誌,我們在server配置塊里使用access_log指令指定了masked格式。

js_include mask_ip_uri.js; js_set $remote_addr_masked maskRemoteAddress; server { listen 80; access_log /var/log/nginx/access.log; access_log /var/log/nginx/access_masked.log masked; location / { return 200 "$remote_addr -> $remote_addr_masked"; #只用於測試 } }

因為我們打算使用nginScript掩蔽客戶端IP地址,所以我們使用js_include指令指定JavaScript代碼的位置。js_set指令指定了一個JavaScript函數,這個函數會在計算$remote_addr_masked變數時被調用。

我們使用了兩個access_log指令。第一個使用了默認的日誌格式,它生成的訪問日誌是給管理員使用的,用於日常的運維。第二個指定了masked格式。於是,我們為每個請求生成兩個訪問日誌——一個用於系統管理和運維,一個用於導出。

最後,location配置塊使用return指令定義了一個非常簡單的返回結果,表示數據掩蔽功能是有效的。在生產環境,這裡一般會包含一個proxy_pass指令,將請求重定向到後端的伺服器上。

用於IP地址掩蔽的nginScript代碼

我們使用了三個簡單的JavaScript函數來生成掩蔽過的IP地址。被依賴的函數要出現在前面,所以我們按照它們的先後順序逐個說明。

數據掩蔽的本質在於使用一種單向的散列演算法來轉換客戶端IP地址。在我們的例子里,我們使用FNV-1a散列演算法,這種演算法緊湊、快速,而且具有很好的分布特徵。它返回32位的整數(與IPv4地址一樣的大小),非常適合用於表示IP地址。fnv32a函數實現了FNV-1a演算法。

i2ipv4函數將32位整數轉換成IPv4格式。它接收由fnv32a()生成的散列值,並將其轉換成適當的格式。IPv4地址和IPv6地址都用IP4v的格式來表示。

最後,我們使用js_set指令指定了maskRemoteAddress()函數,它接受一個單獨的參數req,req表示HTTP請求對象。req的remoteAddress屬性包含了客戶端IP地址。

function fnv32a(str) { var hval = 2166136261; for (var i = 0; i

> 16) & 255; var octet3 = (i >> 8) & 255; var octet4 = i & 255; return octet1 + "." + octet2 + "." + octet3 + "." + octet4; } function maskRemoteAddress(req) { return i2ipv4(fnv32a(req.remoteAddress)); }IP地址掩蔽

做好配置之後,我們向伺服器發出一個簡單的請求,然後檢查返回的響應並查看訪問日誌。

$ curl http://localhost/ 127.0.0.1 -> 8.163.209.30 $ sudo tail --lines=1 /var/log/nginx/access*.log ==> /var/log/nginx/access.log /var/log/nginx/access_masked.log 8.163.209.30 $ sudo tail --lines=1 /var/log/nginx/access*.log ==> /var/log/nginx/access.log /var/log/nginx/access_masked.log

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 推酷 的精彩文章:

新姿勢!用自然靈活的波紋曲線來柔化你的設計
由MathType想到的一些事
使用 IoC 反轉控制的三種設計模式
定時任務發展史
為了擴大產品的影響力,這些手機廠商的營銷方式讓節操碎了一地

TAG:推酷 |

您可能感興趣

Social Listening+Text Mining=走進用戶的心?
Beyerdynamic Aventho Wireless:追蹤用戶的聽力狀況
Roger Ver遭Bitcoin.com用戶起訴
Twitter 模仿 Snapchat?為吸引用戶,鞏固復甦之路
Branch.io漏洞將Tinder,Shopify,Yelp用戶暴露於XSS攻擊下
微軟開始通過Windows Security Alerts鼓勵更多用戶利用OneDrive備份
Oculus上線My Privacy Center,讓用戶清楚哪些隱私數據被收集
FB及Cambridge Analytica因用戶數據泄露事件面臨訴訟
因竊取用戶數據 Stylish從Firefox與Chrome下架
iTunes終於登陸Microsoft Store,iPhone用戶的流暢新選擇
Leap Motion展示Project North Star最新用戶界面
Oculus上線My Privacy Center,讓用戶更清楚哪些隱私數據被收集
Snapchat為Android版帶來改造 但用戶用需root許可權
「圖」部分三星用戶已嘗鮮Samsung Experience 10 Launcher
Google 正式將 Android Wear 更名為 Wear OS,希望兼顧更多的 iPhone 用戶
Cointelegraph警告用戶小心欺詐行為
Windows 10 Redstone 4將把Cortana變成互動式用戶手冊
在Exchange Server中重置用戶密碼
用戶現可用Opera的加密貨幣錢包發送CryptoKitties
IMDb 用戶總結《Avengers : Infinity War》每位角色的上場時間