
नेटवर्क फ्लो को पहचानकर्ताओं में हैश करने के लिए एक खुला मानक, जिसे "Community IDs" भी कहा जाता है।
जब विभिन्न मॉनिटरिंग अनुप्रयोगों (जैसे Zeek और Suricata) से फ्लो डेटा संसाधित किया जाता है, तो अक्सर एक डेटासेट से दूसरे में तेज़ी से पिवट करना वांछनीय होता है। हालाँकि आवश्यक फ्लो टुपल जानकारी आमतौर पर डेटासेट में मौजूद होती है, ऐसे "joins" का विवरण थकाऊ हो सकता है, विशेष रूप से कॉर्नर केसों में। यह spec "कम्युनिटी आईडी" फ्लो हैशिंग का वर्णन करता है, जो किसी दिए गए नेटवर्क फ्लो का प्रतिनिधित्व करने वाले एक स्ट्रिंग पहचानकर्ता के उत्पादन को मानकीकृत करता है, ताकि पिवट एक साधारण स्ट्रिंग तुलना तक सीमित हो जाए।
function community_id_v1(ipaddr saddr, ipaddr daddr, port sport, port dport, int proto, int seed=0)
{
# Get seed and all tuple parts into network byte order
seed = pack_to_nbo(seed); # 2 bytes
saddr = pack_to_nbo(saddr); # 4 or 16 bytes
daddr = pack_to_nbo(daddr); # 4 or 16 bytes
sport = pack_to_nbo(sport); # 2 bytes
dport = pack_to_nbo(dport); # 2 bytes
# Abstract away directionality: flip the endpoints as needed
# so the smaller IP:port tuple comes first.
saddr, daddr, sport, dport = order_endpoints(saddr, daddr, sport, dport);
# Produce 20-byte SHA1 digest. "." means concatenation. The
# proto value is one byte in length and followed by a 0 byte
# for padding.
sha1_digest = sha1(seed . saddr . daddr . proto . 0 . sport . dport)
# Prepend version string to base64 rendering of the digest.
# v1 is currently the only one available.
return "1:" + base64(sha1_digest)
}
function community_id_icmp(ipaddr saddr, ipaddr daddr, int type, int code, int seed=0)
{
port sport, dport;
# ICMP / ICMPv6 endpoint mapping directly inspired by Zeek
sport, dport = map_icmp_to_ports(type, code);
# ICMP is IP protocol 1, ICMPv6 would be 58
return community_id_v1(saddr, daddr, sport, dport, 1, seed);
}
कम्युनिटी आईडी एक अतिरिक्त फ्लो पहचानकर्ता है और इसे मॉनिटर्स द्वारा पहले से समर्थित मौजूदा फ्लो पहचान तंत्रों को प्रतिस्थापित करने की आवश्यकता नहीं है। हालाँकि, यदि वांछित हो, तो मॉनिटर को केवल कम्युनिटी आईडी लॉग करने के लिए कॉन्फ़िगर करना ठीक है।
कम्युनिटी आईडी की गणना मॉनिटर द्वारा फ्लो उत्पन्न करते समय की जा सकती है, या बाद के चरण में मौजूदा फ्लो रिकॉर्ड में भी जोड़ी जा सकती है, बशर्ते उक्त रिकॉर्ड सभी आवश्यक फ्लो एंडपॉइंट जानकारी प्रदान करते हों।
कम्युनिटी आईडी में टकराव, हालाँकि अवांछनीय हैं, घातक नहीं माने जाते, क्योंकि उपयोगकर्ता के पास अभी भी फ्लो समय जानकारी और संभवतः मॉनिटर की मूल आईडी तंत्र (उम्मीद है कि कम्युनिटी आईडी से अधिक सशक्त) होगी, जिससे अस्पष्टता दूर की जा सके।
हैशिंग तंत्र कम्युनिटी आईडी उपयोग के "डोमेन" पर अतिरिक्त नियंत्रण सक्षम करने के लिए सीडिंग का उपयोग करता है। सीड का डिफ़ॉल्ट मान 0 है, इसलिए यह तंत्र रास्ते से हट जाता है और उन ऑपरेटरों के संचालन को प्रभावित नहीं करता जो इसमें रुचि नहीं रखते।
आईडी के संस्करण 1 में, हैश एल्गोरिदम SHA1 है। भविष्य के हैश संस्करण इसे बदल सकते हैं या अतिरिक्त कॉन्फ़िगरेशन की अनुमति दे सकते हैं।
बाइनरी 20-बाइट SHA1 परिणाम को base64-एन्कोड किया जाता है, ताकि सामान्य ASCII-आधारित SHA1 प्रस्तुति की तुलना में आउटपुट की मात्रा कम हो। यह मानता है कि प्राथमिक चिंता स्थान है, गणना समय नहीं, और यह बाद के संस्करण में कॉन्फ़िगर करने योग्य हो सकता है।
परिणामी फ्लो आईडी में एक संस्करण संख्या शामिल होती है, जो अंतर्निहित कम्युनिटी आईडी कार्यान्वयन को स्पष्ट करती है। यह उपयोगकर्ताओं को यह सुनिश्चित करने की अनुमति देता है कि वे समान चीज़ों की तुलना कर रहे हैं, साथ ही एल्गोरिदम में भविष्य के बदलावों का समर्थन भी करता है। उदाहरण के लिए, जब एक मॉनिटर के आईडी संस्करण में VLAN आईडी शामिल होते हैं लेकिन दूसरे के नहीं, तो हैश मान तुलना विश्वसनीय रूप से विफल होनी चाहिए। इस सुविधा का एक अधिक जटिल रूप कार्यान्वयन संस्करण के अतिरिक्त कॉन्फ़िगरेशन सेटिंग्स को कैप्चर करने की भी अनुमति दे सकता है।
वर्तमान संस्करण योजना केवल हैश मान के साथ ":" उपसर्ग जोड़ती है, जिससे वर्तमान संस्करण 1 में कुछ इस प्रकार प्राप्त होता है:
1:hO+sN4H+MG5MY/8hIrXPqc4ZQz0=
हैश इनपुट 32-बिट सीमाओं पर संरेखित होता है। फ्लो टुपल घटक होस्ट हार्डवेयर के बावजूद क्रम को मानकीकृत करने के लिए नेटवर्क बाइट ऑर्डर (बिग-एंडियन) का उपयोग करते हैं।
हैश इनपुट को फ्लो टुपल से दिशात्मकता हटाने के लिए क्रमबद्ध किया जाता है: यदि आवश्यक हो तो एंडपॉइंट्स को बदल दें, ताकि संख्यात्मक रूप से छोटा IP:port टुपल पहले आए। यदि IP पते बराबर हैं, तो पोर्ट निर्णय करते हैं। उदाहरण के लिए, निम्नलिखित नेटफ्लो 5-टुपल समान कम्युनिटी आईडी हैश बनाते हैं, क्योंकि दोनों को क्रम 10.0.0.1, 127.0.0.1, 1234, 80 में क्रमबद्ध किया जाता है।
इस संस्करण में निम्नलिखित प्रोटोकॉल और फ़ील्ड शामिल हैं:
TCP / UDP / SCTP:
IP src / IP dst / IP proto / source port / dest port
ICMPv4 / ICMPv6:
IP src / IP dst / IP proto / ICMP type + "counter-type" or code
ICMP type और code का सटीक प्रबंधन Zeek से लिया गया है; कार्यान्वयन यहाँ देखें:
अन्य IP-आधारित प्रोटोकॉल:
IP src / IP dst / IP proto
उपरोक्त वर्तमान में नेस्टिंग (IP in IP, v6 over v4, आदि) तथा VLAN और MPLS जैसे एनकैप्सुलेशन को संभालने के तरीके को शामिल नहीं करता है।
यदि कोई नेटवर्क मॉनिटर उपरोक्त प्रोटोकॉल संयोजनों में से किसी का भी समर्थन नहीं करता है, तो वह फ्लो आईडी के लिए सुरक्षित रूप से एक खाली स्ट्रिंग (या कोई अन्य गैर-टकराव वाला मान) रिपोर्ट कर सकता है।
v1 को एक प्रोटोटाइप मानें। समुदाय से प्रतिक्रिया, विशेष रूप से आईडी के कार्यान्वयनकर्ताओं और परिचालन उपयोगकर्ताओं से, अत्यधिक सराहनीय है। कृपया GitHub प्रोजेक्ट https://github.com/corelight/community-id-spec पर सीधे issues बनाएँ, या Christian Kreibich ([email protected]) से संपर्क करें।
Victor Julien, Johanna Amann और Robin Sommer को उपयोगी चर्चा और प्रतिक्रिया के लिए, तथा सभी कार्यान्वयनकर्ताओं और समर्थकों को बहुत धन्यवाद।
pycommunityid पैकेज में एक संपूर्ण कार्यान्वयन उपलब्ध है। इसमें विभिन्न प्रोटोकॉल के लिए सही गणना सत्यापित करने हेतु अनेक परीक्षण शामिल हैं। हम नए कार्यान्वयनों के मार्गदर्शन के लिए इसकी अनुशंसा करते हैं।
इस रिपॉज़िटरी में community-id.py स्क्रिप्ट के माध्यम से एक छोटा कार्यान्वयन भी उपलब्ध है, जिसमें हैश किए गए मानों का बाइट लेआउट भी शामिल है (देखें packet_get_comm_id())। आरंभ करने के लिए --help और make.sh देखें:
$ ./community-id.py --help
usage: community-id.py [-h] [--seed NUM] PCAP [PCAP ...]
Community flow ID reference
positional arguments:
PCAP PCAP packet capture files
optional arguments:
-h, --help show this help message and exit
--seed NUM Seed value for hash operations
--no-base64 Don't base64-encode the SHA1 binary value
--verbose Show verbose output on stderr
समस्या निवारण के लिए, कार्यान्वयन base64 ऑपरेशन को छोड़ने का समर्थन करता है, और SHA1 हैश गणना में जाने वाले बाइट्स के सटीक अनुक्रम के बारे में अतिरिक्त विवरण प्रदान कर सकता है।
इस रेपो में baseline निर्देशिका में डेटासेट हैं, जो यह सत्यापित करने में आपकी सहायता करते हैं कि आपका कम्युनिटी आईडी कार्यान्वयन सही ढंग से कार्य करता है।
कम्युनिटी आईडी के पहलुओं पर GitHub के माध्यम से यहाँ चर्चा करने के लिए स्वतंत्र महसूस करें: https://github.com/corelight/community-id-spec/issues