2011-06-25 12 views
10

मेरे उपयोगकर्ताओं की गोपनीयता का सम्मान करने के लिए मैं nginx लॉग फ़ाइलों में उनके आईपी पते को अनामित करने की कोशिश कर रहा हूं।nginx में आईपी लॉगिंग अनामित?

एक तरीका यह है के लिए एक कस्टम लॉग प्रारूप को परिभाषित किया जाएगा, इसलिए जैसे:

log_format noip '127.0.0.1 - [$time_local] ' 
    '"$request" $status $body_bytes_sent ' 
    '"$http_referer" "$http_user_agent" $request_time'; 

इस विधि दो कमियां है: मैं दो उपयोगकर्ताओं के बीच भेद नहीं कर सकते और भू स्थान उपकरण का उपयोग नहीं कर सकते हैं।

सबसे अच्छी बात आईपी पते को कम करने के लिए होगी (87.12.23.5587.12.23.1 बन जाएगा)।

क्या nginx config scripting का उपयोग करके इसे प्राप्त करने की कोई संभावना है?

धन्यवाद।

+0

संबंधित (Apache): nginx के वर्तमान संस्करण में आप इसे इस तरह से करने की अनुमति देता http://serverfault.com/q/343031/75968 – cweiske

उत्तर

13

भले ही पहले से ही एक स्वीकृत उत्तर है, समाधान मान्य नहीं है।

nginx log_format निर्देश है, जो http के संदर्भ है है। इसका मतलब है, log_format केवल कॉन्फ़िगरेशन फ़ाइल के http {} अनुभाग में सेट (वैध) हो सकता है, सर्वर अनुभागों के भीतर नहीं!

दूसरी ओर हम एक अगर निर्देश है, जो सर्वर और स्थान के संदर्भ है की है।

तो हम नहीं उपयोग कर सकते हैं "अगर" और एक सर्वर अनुभाग के भीतर "log_format" (जो स्वीकार कर लिया समाधान के भीतर किया जाता है)

तो अगर नहीं उपयोगी यहाँ भी अगर बुराई है (http://wiki.nginx.org/IfIsEvil)! हम जो कुछ http संदर्भ क्योंकि केवल वहाँ log_format एक वैध तरीके से परिभाषित किया जा सकता पर काम कर रहा है की जरूरत है, और इस सर्वर संदर्भ है, जहां हमारे आभासी मेजबान परिभाषित कर रहे हैं के बाहर ही जगह है ...

सौभाग्य है मानचित्र nginx के भीतर सुविधा! नक्शा कुछ मानों को नए मानों में रीमेप कर रहा है (चर के भीतर सुलभ है जिसे लॉग_फॉर्मेट निर्देश में उपयोग किया जा सकता है)। और अच्छा संदेश: यह नियमित अभिव्यक्तियों के साथ भी काम करता है।

तो चलिए हमारे आईपीवी 4 और आईपीवी 6 पते को अनामित पते में मैप करें। यह 3 चरणों में किया जाना चाहिए, क्योंकि नक्शा लौटाए गए मूल्यों को जमा नहीं कर सकता है, यह केवल तारों या चरों को वापस कर सकता है, दोनों का संयोजन नहीं।

तो, सबसे पहले हम आईपी का हिस्सा लेते हैं जिसे हम लॉगफाइल में रखना चाहते हैं, दूसरा नक्शा वह भाग देता है जो अनामित भाग का प्रतीक है, और तीसरा नक्शा नियम उन्हें एक साथ फिर से मानचित्रित करता है।

यहां नियमों को जो http {} संदर्भ में जाने हैं:

map $remote_addr $ip_anonym1 { 
default 0.0.0; 
"~(?P<ip>(\d+)\.(\d+)\.(\d+))\.\d+" $ip; 
"~(?P<ip>[^:]+:[^:]+):" $ip; 
} 

map $remote_addr $ip_anonym2 { 
default .0; 
"~(?P<ip>(\d+)\.(\d+)\.(\d+))\.\d+" .0; 
"~(?P<ip>[^:]+:[^:]+):" ::; 
} 

map $ip_anonym1$ip_anonym2 $ip_anonymized { 
default 0.0.0.0; 
"~(?P<ip>.*)" $ip; 
} 

log_format anonymized '$ip_anonymized - $remote_user [$time_local] ' 
    '"$request" $status $body_bytes_sent ' 
    '"$http_referer" "$http_user_agent"'; 

access_log /var/log/nginx/access.log anonymized; 

अपने nginx.conf कॉन्फ़िग फ़ाइल को यह जोड़ने के बाद, अपने nginx फिर से लोड करने याद है। यदि आप "अनामित" लॉग प्रारूप का उपयोग कर रहे हैं (यह access_log निर्देश का प्रारूप पैरामीटर है) तो आपकी लॉग फ़ाइलों में अब एनीमाइज्ड आईपी पते होना चाहिए।

+1

पर समाधान देखें! धन्यवाद! मैंने आपके लिए स्वीकृत उत्तर बदल दिया है। – endzeit

+1

उत्कृष्ट उत्तर – mate64

+0

क्या कस्टम लॉग_फॉर्मैट के साथ त्रुटि लॉग को अनामित करना संभव है? या केवल एक्सेस लॉग कर सकते हैं? – tschale

0

मुझे लगता है कि, एक अच्छा और व्यावहारिक समाधान आपकी लॉग फ़ाइलों को घुमाने से पहले आईपी को अनामित करना है (जिसे आपको दैनिक करना चाहिए)। अपाचे के लिए इस कार्य के लिए बहुत सी स्क्रिप्ट उपलब्ध हैं, और चूंकि लॉग प्रारूप कम से कम समान है, इसलिए उन्हें बॉक्स से बाहर काम करना चाहिए या आसानी से समायोज्य होना चाहिए। बेशक, आप अभी भी 24 घंटे या उससे कम के लिए पूर्ण आईपी स्टोर करते हैं, लेकिन यह वर्षों से चारों ओर बिछाने से बेहतर है।

+3

यह आईपी के स्टोर करने के लिए जर्मनी में अवैध है। – mate64

1

आप सर्वर ब्लॉक के अंदर नियमित अभिव्यक्तियों के साथ एक अतिरिक्त कथन या लुआ मॉड्यूल के बिना आईपी को अनामित करने के लिए एक कथन का उपयोग कर सकते हैं।

nginx.conf

server { 
    if ($remote_addr ~ (\d+).(\d+).(\d+).(\d+)) { 
     set $ip_anym $1.$2.0.1; 
    } 
    log_format main '[$time_local] $ip_anym "$request" $status $body_bytes_sent $request_time "$http_referer" "$http_user_agent"';  

    access_log /var/log/access.log main; 
    .... 
} 

हम आईपी अनाम बना देते हैं और एक नया चर के लिए असाइन करें अंदर $ ip_anym जो हम तो मूल $ REMOTE_ADDR बजाय लॉग प्रारूप के अंदर उपयोग कर सकते हैं कहा जाता है। ऊपर दिए गए उदाहरण में हम आईपी पते के पहले और दूसरे भाग को संरक्षित करते हैं, यदि आप केवल आईपी के अंतिम भाग को प्रतिस्थापित करना चाहते हैं तो आप $ 1. $ 2. $ 3.1 का भी उपयोग कर सकते हैं।

+1

सर्वर संदर्भ के भीतर log_format की अनुमति नहीं है (आपको इसे यहां उपयोग करने के लिए चेतावनी भी मिलती है)। एक संभावित समाधान http संदर्भ के भीतर "मानचित्र" और "log_format" का उपयोग करना है। Http://www.mbr-is.com/central-anonymized-ip-addresses-for-nginx-for-all-virtual-hosts/ –

3

स्वीकृत उत्तर थोड़ा फूला हुआ लगता है।

map $remote_addr $remote_addr_anon { 
    ~(?P<ip>\d+\.\d+\.\d+)\. $ip.0; 
    ~(?P<ip>[^:]+:[^:]+):  $ip::; 
    default      0.0.0.0; 
}