summaryrefslogtreecommitdiff
path: root/detection/vpnservices
diff options
context:
space:
mode:
Diffstat (limited to 'detection/vpnservices')
-rw-r--r--detection/vpnservices/cyberghostvpn.py183
-rw-r--r--detection/vpnservices/cyberghostvpn_serverip.py96
-rw-r--r--detection/vpnservices/cyberghostvpn_servername.py61
-rw-r--r--detection/vpnservices/geckovpn.py (renamed from detection/vpnservices/geckovpn_serverip.py)26
-rw-r--r--detection/vpnservices/hotspotvpn.py (renamed from detection/vpnservices/hotspotvpn_serverip.py)26
-rw-r--r--detection/vpnservices/ipvanishvpn.py180
-rw-r--r--detection/vpnservices/ipvanishvpn_serverip.py93
-rw-r--r--detection/vpnservices/ipvanishvpn_servername.py62
-rw-r--r--detection/vpnservices/ivacyvpn.py165
-rw-r--r--detection/vpnservices/ivacyvpn_serverip.py84
-rw-r--r--detection/vpnservices/ivacyvpn_servername.py60
-rw-r--r--detection/vpnservices/protonvpn.py (renamed from detection/vpnservices/protonvpn_serverip.py)23
-rw-r--r--detection/vpnservices/turbovpn.py (renamed from detection/vpnservices/turbovpn_serverip.py)25
-rw-r--r--detection/vpnservices/vpnunlimited.py (renamed from detection/vpnservices/vpnunlimited_serverip.py)24
-rw-r--r--detection/vpnservices/windscribevpn.py203
-rw-r--r--detection/vpnservices/windscribevpn_serverip.py111
-rw-r--r--detection/vpnservices/windscribevpn_servername.py65
17 files changed, 799 insertions, 688 deletions
diff --git a/detection/vpnservices/cyberghostvpn.py b/detection/vpnservices/cyberghostvpn.py
new file mode 100644
index 0000000..09ba1af
--- /dev/null
+++ b/detection/vpnservices/cyberghostvpn.py
@@ -0,0 +1,183 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# @Time : 2024/1/31 15:03
+# @author : yinjinagyi
+# @File : cyberghostvpn.py
+# @Function:
+import datetime
+import re
+
+import pandas as pd
+
+from tool.Functions import check_internet
+from tool.MariadbTool import MariadbUtil
+from vpn_detector import VpnDetector, ServerGroup
+
+
+class Cyberghostvpn(VpnDetector):
+ """
+
+ This class is used to detect cyberghostvpn server ip and server name
+ """
+
+ def __init__(self, start_time, end_time):
+ super().__init__(start_time, end_time)
+ self.plugin_config = self.load_config()['cyberghostvpn']
+ self.vpn_service_name = self.plugin_config['vpn_service_name']
+ self.plugin_name = self.plugin_config['plugin_name']
+ self.plugin_id = self.plugin_config['plugin_id']
+ self.confidence = self.plugin_config['confidence']
+ self.start_time = start_time
+ self.end_time = end_time
+
+
+ def find_server(self):
+ """
+ Get cyberghostvpn server ip and server name from clickhouse database
+ :return: cyberghostvpn server ip list and server name list
+ """
+ result_group = []
+
+ # start finding cyberghostvpn server name
+ cyberghostvpn_detector = CyberghostvpnServername(self.start_time, self.end_time)
+ result_group.extend(cyberghostvpn_detector.find_server())
+
+ # start finding cyberghostvpn server ip
+ cyberghostvpn_detector = CyberghostvpnServerip()
+ result_group.extend(cyberghostvpn_detector.find_server())
+
+ return result_group
+
+
+
+class CyberghostvpnServerip(VpnDetector):
+ """
+ This class is used to detect cyberghostvpn server ip
+ """
+
+ def __init__(self):
+ super().__init__('', '')
+ self.plugin_config = self.load_config()['cyberghostvpn']
+ self.plugin_name = self.plugin_config['plugin_name']
+ self.object_type = self.plugin_config['ip']['object_type']
+ # 开始时间为当前的整点时间
+ self.start_time = datetime.datetime.now().strftime("%Y-%m-%d %H:00:00")
+ self.output_file_name = self.plugin_name + '-' + self.object_type + '_' + str(self.start_time).replace(' ',
+ '_').replace(
+ ':', '')[:13] + '.csv'
+
+ self.kb_sql = self.plugin_config['ip']['kb_sql']
+ self.kb_dbname = self.config['knowledgebase']['db_name']
+ self.kb_table_name = self.config['knowledgebase']['domain_library_name']
+
+ self.mariadb = MariadbUtil(self.config['mariadb']['host'], self.config['mariadb']['port'],
+ self.config['mariadb']['user'], str(self.config['mariadb']['pswd']),
+ self.config['mariadb']['db_name'])
+ self.mariadb_dbname = self.config['mariadb']['db_name']
+ self.mariadb_ip_tb_name = self.config['mariadb']['ip_table_name']
+ self.mariadb_domain_tb_name = self.config['mariadb']['domain_table_name']
+
+
+ def find_more_servernames(self, server_name_list):
+ """
+ Find more server name from observed cyberghost server name list
+ :return: server name list
+ """
+ pattern_list = []
+ expanded_server_names = []
+
+
+ for server_name in server_name_list:
+ pattern = re.compile(r'\.(.*?)\-rack')
+ pattern_list.append(pattern.findall(server_name)[0])
+ pattern_list = set(pattern_list)
+
+ for pattern_str in pattern_list:
+ domain_list = [f"blade{str(index1)}.{pattern_str}-rack4{str(index2).zfill(2)}.nodes.gen4.ninja" for index1 in range(1, 100) for index2 in range(1, 100)]
+ expanded_server_names.extend(domain_list)
+
+ return expanded_server_names
+
+
+ def find_server(self):
+ """
+ Get cyberghostvpn server ip by resolving cyberghostvpn server name
+ :return: cyberghostvpn server ip list
+ """
+ self.kb_sql = self.kb_sql.replace("{$mariadb_dbname}", self.mariadb_dbname).replace(
+ "{$mariadb_domain_tablename}", self.mariadb_domain_tb_name)
+
+ servername_list = []
+ resolved_ip_list = []
+ try:
+ query_result = self.mariadb.query_sql(self.kb_sql)
+ finally:
+ self.mariadb.close()
+
+ if query_result:
+ servername_list = [i[0] for i in query_result]
+
+ # 判断是否能够访问外网,如果能够访问外网,则从外网获取cyberghost_servername_list的域名解析地址
+ if check_internet():
+ servername_list = self.find_more_servernames(servername_list)
+ if len(servername_list) > 0:
+ resolved_ip_list = self.resolve_dns_for_domain_list(servername_list)
+ self.logger.info('[{}] - Get {} server ip by resolving server name successfully.'.format(self.plugin_name, len(resolved_ip_list)))
+ else:
+ self.logger.info(
+ '[{}] - No cyberghost server name found from knowledge database.'.format(self.plugin_name))
+ else:
+ self.logger.info('[{}] - No internet connection, skip dns resolve.'.format(self.plugin_name))
+
+ return [ServerGroup(self.object_type, resolved_ip_list, self.output_file_name)]
+
+
+
+class CyberghostvpnServername(VpnDetector):
+ """
+
+ This class is used to detect cyberghostvpn server name
+ """
+
+ def __init__(self, start_time, end_time):
+ super().__init__(start_time, end_time)
+ self.plugin_config = self.load_config()['cyberghostvpn']
+ self.plugin_name = self.plugin_config['plugin_name']
+ self.object_type = self.plugin_config['domain']['object_type']
+ self.output_file_name = self.plugin_name + '-' + self.object_type + '_' + str(self.start_time).replace(' ', '_').replace(':', '')[:13] + '.csv'
+ self.start_time = start_time
+ self.end_time = end_time
+
+ self.sql = self.plugin_config['domain']['sql']
+
+ def find_server(self):
+ """
+ Get cyberghostvpn server name from clickhouse database
+ :return: cyberghostvpn server name list
+ """
+ self.logger.info('[{}] - Start to query cyberghostvpn server name from session record'.format(self.plugin_name))
+
+ # construct query sql
+ TIME_FILTER_PATTERN = self.config['common']['time_filter_pattern'].replace('recv_time_columnname',
+ self.config['common'][
+ 'recv_time_columnname'])
+ time_filter = TIME_FILTER_PATTERN.replace("{$start_time}", str(self.start_time)).replace("{$end_time}", str(
+ self.end_time)).replace("{$time_zone}", self.time_zone)
+ self.sql = self.sql.replace("{$db_name}", self.dbname).replace("{$table_name}", self.table_name)
+ self.sql = self.sql.replace("{$time_filter}", time_filter)
+ self.logger.info("[{}] - Sql for {}: {}".format(self.plugin_name, self.plugin_config['plugin_name'], self.sql))
+
+ # query data from clickhouse database
+ try:
+ cyberghostvpn_servername_df = pd.DataFrame(self.client.execute(self.sql))
+ finally:
+ self.client.disconnect()
+
+ if cyberghostvpn_servername_df.empty:
+ self.logger.info('[{}] - No cyberghostvpn server name found from session records'.format(self.plugin_name))
+ return []
+ cyberghostvpn_servername_list = cyberghostvpn_servername_df[0].drop_duplicates().tolist()
+ self.logger.info('[{}] - Query cyberghostvpn server name from session records successfully. {} items found'
+ .format(self.plugin_name, len(cyberghostvpn_servername_list)))
+
+ return [ServerGroup(self.object_type, cyberghostvpn_servername_list, self.output_file_name)]
diff --git a/detection/vpnservices/cyberghostvpn_serverip.py b/detection/vpnservices/cyberghostvpn_serverip.py
deleted file mode 100644
index 4505a95..0000000
--- a/detection/vpnservices/cyberghostvpn_serverip.py
+++ /dev/null
@@ -1,96 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-# @Time : 2024/1/16 20:01
-# @author : yinjinagyi
-# @File : cyberghostvpn_serverip.py.py
-# @Function:
-import re
-
-from vpn_detector import VpnDetector
-from tool.Functions import check_internet
-from tool.MariadbTool import MariadbUtil
-
-
-class CyberghostvpnServerip(VpnDetector):
- """
- This class is used to detect cyberghostvpn server ip
- """
-
- def __init__(self):
- super().__init__('', '')
- self.plugin_config = self.load_config()['cyberghostvpn_serverip']
- self.plugin_id = self.plugin_config['plugin_id']
- self.plugin_name = self.plugin_config['plugin_name']
- self.object_type = self.plugin_config['object_type']
- self.vpn_service_name = self.plugin_config['vpn_service_name']
- self.confidence = self.plugin_config['confidence']
- self.output_file_name = self.plugin_name + '_' + str(self.start_time).replace(' ', '_').replace(':', '')[:13] + '.csv'
-
- self.kb_sql = self.plugin_config['kb_sql']
- self.kb_dbname = self.config['knowledgebase']['db_name']
- self.kb_table_name = self.config['knowledgebase']['domain_library_name']
-
- self.mariadb = MariadbUtil(self.config['mariadb']['host'], self.config['mariadb']['port'],
- self.config['mariadb']['user'], str(self.config['mariadb']['pswd']),
- self.config['mariadb']['db_name'])
- self.mariadb_dbname = self.config['mariadb']['db_name']
- self.mariadb_ip_tb_name = self.config['mariadb']['ip_table_name']
- self.mariadb_domain_tb_name = self.config['mariadb']['domain_table_name']
-
-
- def find_more_servernames(self, server_name_list):
- """
- Find more server name from observed cyberghost server name list
- :return: server name list
- """
- pattern_list = []
- expanded_server_names = []
-
-
- for server_name in server_name_list:
- pattern = re.compile(r'\.(.*?)\-rack')
- pattern_list.append(pattern.findall(server_name)[0])
- pattern_list = set(pattern_list)
-
- for pattern_str in pattern_list:
- domain_list = [f"blade{str(index1)}.{pattern_str}-rack4{str(index2).zfill(2)}.nodes.gen4.ninja" for index1 in range(1, 100) for index2 in range(1, 100)]
- expanded_server_names.extend(domain_list)
-
- return expanded_server_names
-
-
- def find_server(self):
- """
- Get cyberghostvpn server ip by resolving cyberghostvpn server name
- :return: cyberghostvpn server ip list
- """
- self.kb_sql = self.kb_sql.replace("{$mariadb_dbname}", self.mariadb_dbname).replace(
- "{$mariadb_domain_tablename}", self.mariadb_domain_tb_name)
-
- servername_list = []
- resolved_ip_list = []
- try:
- query_result = self.mariadb.query_sql(self.kb_sql)
- finally:
- self.mariadb.close()
-
- if query_result:
- servername_list = [i[0] for i in query_result]
-
- # 判断是否能够访问外网,如果能够访问外网,则从外网获取cyberghost_servername_list的域名解析地址
- if check_internet():
- servername_list = self.find_more_servernames(servername_list)
- if len(servername_list) > 0:
- resolved_ip_list = self.resolve_dns_for_domain_list(servername_list)
- else:
- self.logger.info('No cyberghost server name found from knowledge database.')
- else:
- self.logger.info('Failed to resolve cyberghost vpn servername. Cannot access internet.')
-
- return resolved_ip_list
-
-
-
-
-
-
diff --git a/detection/vpnservices/cyberghostvpn_servername.py b/detection/vpnservices/cyberghostvpn_servername.py
deleted file mode 100644
index 2d9c277..0000000
--- a/detection/vpnservices/cyberghostvpn_servername.py
+++ /dev/null
@@ -1,61 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-# @Time : 2024/1/16 19:51
-# @author : yinjinagyi
-# @File : cyberghostvpn_servername.py.py
-# @Function:
-
-import sys
-sys.path.append('..')
-from vpn_detector import VpnDetector
-import pandas as pd
-
-
-class CyberghostvpnServername(VpnDetector):
- """
-
- This class is used to detect cyberghostvpn server name
- """
-
- def __init__(self, start_time, end_time):
- super().__init__(start_time, end_time)
- self.plugin_config = self.load_config()['cyberghostvpn_servername']
- self.plugin_id = self.plugin_config['plugin_id']
- self.plugin_name = self.plugin_config['plugin_name']
- self.object_type = self.plugin_config['object_type']
- self.vpn_service_name = self.plugin_config['vpn_service_name']
- self.confidence = self.plugin_config['confidence']
- self.output_file_name = self.plugin_name + '_' + str(self.start_time).replace(' ', '_').replace(':', '')[:13] + '.csv'
- self.start_time = start_time
- self.end_time = end_time
-
- self.sql = self.plugin_config['sql']
-
- def find_server(self):
- """
- Get cyberghostvpn server name from clickhouse database
- :return: cyberghostvpn server name list
- """
- self.logger.info('Start to query cyberghostvpn server name from session record')
-
- # construct query sql
- TIME_FILTER_PATTERN = self.config['common']['time_filter_pattern'].replace('recv_time_columnname', self.config['common']['recv_time_columnname'])
- time_filter = TIME_FILTER_PATTERN.replace("{$start_time}", str(self.start_time)).replace("{$end_time}", str(
- self.end_time)).replace("{$time_zone}", self.time_zone)
- self.sql = self.sql.replace("{$db_name}", self.dbname).replace("{$table_name}", self.table_name)
- self.sql = self.sql.replace("{$time_filter}", time_filter)
- self.logger.info("Sql for {}: {}".format(self.plugin_name, self.sql))
-
- # query data from clickhouse database
- try:
- cyberghostvpn_servername_df = pd.DataFrame(self.client.execute(self.sql))
- finally:
- self.client.disconnect()
-
- if cyberghostvpn_servername_df.empty:
- self.logger.info('No cyberghostvpn server name found from session records')
- return []
- cyberghostvpn_servername_list = cyberghostvpn_servername_df[0].drop_duplicates().tolist()
- self.logger.info('Query cyberghostvpn server name from session records successfully. {} items found'
- .format(len(cyberghostvpn_servername_list)))
- return cyberghostvpn_servername_list
diff --git a/detection/vpnservices/geckovpn_serverip.py b/detection/vpnservices/geckovpn.py
index 1c607d3..69e66ce 100644
--- a/detection/vpnservices/geckovpn_serverip.py
+++ b/detection/vpnservices/geckovpn.py
@@ -2,26 +2,28 @@
# -*- coding: utf-8 -*-
# @Time : 2024/1/17 14:20
# @author : yinjinagyi
-# @File : geckovpn_serverip.py
+# @File : geckovpn.py
# @Function:
import pandas as pd
-from vpn_detector import VpnDetector
+from vpn_detector import VpnDetector, ServerGroup
-class GeckovpnServerip(VpnDetector):
+
+class Geckovpn(VpnDetector):
"""
This class is used to detect geckovpn server ip
"""
def __init__(self, start_time, end_time):
super().__init__(start_time, end_time)
- self.plugin_config = self.load_config()['geckovpn_serverip']
+ self.plugin_config = self.load_config()['geckovpn']
self.plugin_id = self.plugin_config['plugin_id']
self.plugin_name = self.plugin_config['plugin_name']
self.object_type = self.plugin_config['object_type']
self.vpn_service_name = self.plugin_config['vpn_service_name']
self.confidence = self.plugin_config['confidence']
- self.output_file_name = self.plugin_name + '_' + str(self.start_time).replace(' ', '_').replace(':', '')[:13] + '.csv'
+ self.output_file_name = self.plugin_name + '-' + self.object_type + '_' + str(self.start_time).replace(' ','_').replace(':', '')[:13] + '.csv'
+
self.start_time = start_time
self.end_time = end_time
@@ -32,7 +34,7 @@ class GeckovpnServerip(VpnDetector):
Get geckovpn server ip from clickhouse database
:return: geckovpn server ip list
"""
- self.logger.info('Start to query geckovpn server ip from session records')
+ self.logger.info('[{}] - Start to query server ip from session records'.format(self.plugin_name))
# construct query sql
TIME_FILTER_PATTERN = self.config['common']['time_filter_pattern'].replace('recv_time_columnname', self.config['common']['recv_time_columnname'])
@@ -40,7 +42,7 @@ class GeckovpnServerip(VpnDetector):
self.end_time)).replace("{$time_zone}", self.time_zone)
self.sql = self.sql.replace("{$db_name}", self.dbname).replace("{$table_name}", self.table_name)
self.sql = self.sql.replace("{$time_filter}", time_filter)
- self.logger.info("Sql for {}: {}".format(self.plugin_name, self.sql))
+ self.logger.info("[{}] - Sql for {}: {}".format(self.plugin_name, self.plugin_name, self.sql))
# query data from clickhouse database
try:
@@ -49,9 +51,11 @@ class GeckovpnServerip(VpnDetector):
self.client.disconnect()
if geckovpn_serverip_df.empty:
- self.logger.info('No geckovpn server ip found from session records')
+ self.logger.info('[{}] - No server ip found from session records'.format(self.plugin_name))
return []
geckovpn_serverip_list = geckovpn_serverip_df[0].drop_duplicates().tolist()
- self.logger.info('Query geckovpn server ip from session records successfully. {} items found'
- .format(len(geckovpn_serverip_list)))
- return geckovpn_serverip_list
+ self.logger.info('[{}] - Query server ip from clickhouse database successfully. {} items found'
+ .format(self.plugin_name, len(geckovpn_serverip_list)))
+
+
+ return [ServerGroup(object_type='ip', server_list=geckovpn_serverip_list, output_file_name=self.output_file_name)]
diff --git a/detection/vpnservices/hotspotvpn_serverip.py b/detection/vpnservices/hotspotvpn.py
index 2c853bf..d28976d 100644
--- a/detection/vpnservices/hotspotvpn_serverip.py
+++ b/detection/vpnservices/hotspotvpn.py
@@ -2,14 +2,14 @@
# -*- coding: utf-8 -*-
# @Time : 2024/1/11 15:45
# @author : yinjinagyi
-# @File : hotspotvpn_serverip.py
+# @File : hotspotvpn.py
# @Function:
-from vpn_detector import VpnDetector
+from vpn_detector import VpnDetector, ServerGroup
import pandas as pd
-class HotspotvpnServerip(VpnDetector):
+class Hotspotvpn(VpnDetector):
"""
This class is used to detect hotspotvpn server ip
@@ -17,13 +17,13 @@ class HotspotvpnServerip(VpnDetector):
def __init__(self, start_time, end_time):
super().__init__(start_time, end_time)
- self.plugin_config = self.load_config()['hotspotvpn_serverip']
+ self.plugin_config = self.load_config()['hotspotvpn']
self.plugin_id = self.plugin_config['plugin_id']
self.plugin_name = self.plugin_config['plugin_name']
self.object_type = self.plugin_config['object_type']
self.vpn_service_name = self.plugin_config['vpn_service_name']
self.confidence = self.plugin_config['confidence']
- self.output_file_name = self.plugin_name + '_' + str(self.start_time).replace(' ', '_').replace(':', '')[:13] + '.csv'
+ self.output_file_name = self.plugin_name + '-' + self.object_type + '_' + str(self.start_time).replace(' ', '_').replace(':', '')[:13] + '.csv'
self.start_time = start_time
self.end_time = end_time
@@ -33,9 +33,9 @@ class HotspotvpnServerip(VpnDetector):
def find_server(self):
"""
Get hotspotvpn server ip from clickhouse database
- :return: hotspotvpn server ip list
+ :return: hotspotvpn server group
"""
- self.logger.info('Start to query hotspotvpn server ip from session records')
+ self.logger.info('[{}] - Start to query server ip from session records'.format(self.plugin_name))
# construct query sql
TIME_FILTER_PATTERN = self.config['common']['time_filter_pattern'].replace('recv_time_columnname', self.config['common']['recv_time_columnname'])
@@ -45,7 +45,7 @@ class HotspotvpnServerip(VpnDetector):
self.sql = self.sql.replace("{$time_filter}", time_filter)
self.sql = self.sql.replace("{$domain_list}", ','.join(self.masquerede_domains))
- self.logger.info("Sql for {}: {}".format(self.plugin_name, self.sql))
+ self.logger.info("[{}] - Sql for {}: {}".format(self.plugin_name, self.plugin_name, self.sql))
# query data from clickhouse database
try:
@@ -54,10 +54,12 @@ class HotspotvpnServerip(VpnDetector):
self.client.disconnect()
if hotspotvpn_serverip_df.empty:
- self.logger.info('No hotspotvpn server ip found from session records')
+ self.logger.info('[{}] - No server ip found from session records'.format(self.plugin_name))
return []
hotspotvpn_serverip_list = hotspotvpn_serverip_df[0].drop_duplicates().tolist()
- self.logger.info('Query hotspotvpn server ip from clickhouse database successfully. {} items found'
- .format(len(hotspotvpn_serverip_list)))
+ self.logger.info('[{}] - Query server ip from clickhouse database successfully. {} items found'
+ .format(self.plugin_name, len(hotspotvpn_serverip_list)))
+
+
+ return [ServerGroup(object_type='ip', server_list=hotspotvpn_serverip_list, output_file_name=self.output_file_name)]
- return hotspotvpn_serverip_list
diff --git a/detection/vpnservices/ipvanishvpn.py b/detection/vpnservices/ipvanishvpn.py
new file mode 100644
index 0000000..88f8f1f
--- /dev/null
+++ b/detection/vpnservices/ipvanishvpn.py
@@ -0,0 +1,180 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# @Time : 2024/1/30 18:20
+# @author : yinjinagyi
+# @File : ipvanishvpn.py
+# @Function:
+
+import sys
+sys.path.append('..')
+import datetime
+import pandas as pd
+from tool.Functions import check_internet
+from tool.MariadbTool import MariadbUtil
+
+from vpn_detector import VpnDetector, ServerGroup
+
+
+class Ipvanishvpn(VpnDetector):
+ """
+
+ This class is used to detect ipvanishvpn server ip and server name
+ """
+
+ def __init__(self, start_time, end_time):
+ super().__init__(start_time, end_time)
+ self.plugin_config = self.load_config()['ipvanishvpn']
+ self.vpn_service_name = self.plugin_config['vpn_service_name']
+ self.plugin_name = self.plugin_config['plugin_name']
+ self.plugin_id = self.plugin_config['plugin_id']
+ self.confidence = self.plugin_config['confidence']
+ self.start_time = start_time
+ self.end_time = end_time
+
+
+ def find_server(self):
+ """
+ Get ipvanishvpn server ip and server name from clickhouse database
+ :return: ipvanishvpn server ip list and server name list
+ """
+ result_group = []
+
+ # start finding ipvanishvpn server name
+ ipvanishvpn_detector = IpvanishvpnServername(self.start_time, self.end_time)
+ result_group.extend(ipvanishvpn_detector.find_server())
+
+ # start finding ipvanishvpn server ip
+ ipvanishvpn_detector = IpvanishvpnServerip()
+ result_group.extend(ipvanishvpn_detector.find_server())
+
+ return result_group
+
+
+class IpvanishvpnServerip(VpnDetector):
+ """
+ This class is used to detect ipvanishvpn server ip
+ """
+
+ def __init__(self):
+ super().__init__('', '')
+ self.plugin_config = self.load_config()['ipvanishvpn']
+ self.plugin_name = self.plugin_config['plugin_name']
+ self.object_type = self.plugin_config['ip']['object_type']
+ # 开始时间为当前的整点时间
+ self.start_time = datetime.datetime.now().strftime("%Y-%m-%d %H:00:00")
+ self.output_file_name = self.plugin_name + '-' + self.object_type + '_' + str(self.start_time).replace(' ', '_').replace(':', '')[:13] + '.csv'
+
+
+ self.kb_sql = self.plugin_config['ip']['kb_sql']
+ self.kb_dbname = self.config['knowledgebase']['db_name']
+ self.kb_table_name = self.config['knowledgebase']['domain_library_name']
+
+ self.mariadb = MariadbUtil(self.config['mariadb']['host'], self.config['mariadb']['port'],
+ self.config['mariadb']['user'], str(self.config['mariadb']['pswd']),
+ self.config['mariadb']['db_name'])
+ self.mariadb_dbname = self.config['mariadb']['db_name']
+ self.mariadb_ip_tb_name = self.config['mariadb']['ip_table_name']
+ self.mariadb_domain_tb_name = self.config['mariadb']['domain_table_name']
+
+
+ def find_more_servernames(self, server_name_list):
+ """
+ Find more server name from observed ipvanish server name list
+ :return: server name list
+ """
+ prefix_list = []
+ expanded_server_names = []
+
+ for server_name in server_name_list:
+ domain = server_name.strip()
+ domain_prefix = domain[:5]
+ prefix_list.append(domain_prefix)
+
+ prefix_list = set(prefix_list)
+
+ for domain_prefix in prefix_list:
+ domain_list = [f"{domain_prefix}{str(index).zfill(2)}.vpn.ipvanish.com" for index in range(100)]
+ expanded_server_names.extend(domain_list)
+
+ return expanded_server_names
+
+
+ def find_server(self):
+ """
+ Get ipvanishvpn server ip by resolving ipvanishvpn server name
+ :return: ipvanishvpn server ip list
+ """
+ self.kb_sql = self.kb_sql.replace("{$mariadb_dbname}", self.mariadb_dbname).replace("{$mariadb_domain_tablename}", self.mariadb_domain_tb_name)
+
+ servername_list = []
+ resolved_ip_list = []
+ try:
+ query_result = self.mariadb.query_sql(self.kb_sql)
+ finally:
+ self.mariadb.close()
+
+ if query_result:
+ servername_list = [i[0] for i in query_result]
+
+ # 判断是否能够访问外网,如果能够访问外网,则从外网获取ipvanish_servername_list的域名解析地址
+ if check_internet():
+ servername_list = self.find_more_servernames(servername_list)
+ if len(servername_list) > 0:
+ resolved_ip_list = self.resolve_dns_for_domain_list(servername_list)
+ self.logger.info(
+ '[{}] - Get {} server ip by resolving server name successfully.'.format(
+ self.plugin_name, len(resolved_ip_list)))
+ else:
+ self.logger.info('[{}] - No ipvanish server name found from knowledge database.'.format(self.plugin_name))
+ else:
+ self.logger.info('[{}] - No internet connection, skip dns resolve.'.format(self.plugin_name))
+
+ return [ServerGroup(self.object_type, resolved_ip_list, self.output_file_name)]
+
+
+class IpvanishvpnServername(VpnDetector):
+ """
+
+ This class is used to detect ipvanish server name
+ """
+
+ def __init__(self, start_time, end_time):
+ super().__init__(start_time, end_time)
+ self.plugin_config = self.load_config()['ipvanishvpn']
+ self.plugin_name = self.plugin_config['plugin_name']
+ self.object_type = self.plugin_config['domain']['object_type']
+ self.output_file_name = self.plugin_name + '-' + self.object_type + '_' + str(self.start_time).replace(' ', '_').replace(':', '')[:13] + '.csv'
+ self.start_time = start_time
+ self.end_time = end_time
+
+ self.sql = self.plugin_config['domain']['sql']
+
+ def find_server(self):
+ """
+ Get ipvanishvpn server name from clickhouse database
+ :return: ipvanishvpn server name list
+ """
+ self.logger.info('[{}] - Start to query ipvanishvpn server name from session record'.format(self.plugin_name))
+
+ # construct query sql
+ TIME_FILTER_PATTERN = self.config['common']['time_filter_pattern'].replace('recv_time_columnname', self.config['common']['recv_time_columnname'])
+ time_filter = TIME_FILTER_PATTERN.replace("{$start_time}", str(self.start_time)).replace("{$end_time}", str(
+ self.end_time)).replace("{$time_zone}", self.time_zone)
+ self.sql = self.sql.replace("{$db_name}", self.dbname).replace("{$table_name}", self.table_name)
+ self.sql = self.sql.replace("{$time_filter}", time_filter)
+ self.logger.info("[{}] - Sql for {}: {}".format(self.plugin_name, self.plugin_config['plugin_name'], self.sql))
+
+ # query data from clickhouse database
+ try:
+ ipvanishvpn_servername_df = pd.DataFrame(self.client.execute(self.sql))
+ finally:
+ self.client.disconnect()
+
+ if ipvanishvpn_servername_df.empty:
+ self.logger.info('[{}] - No ipvanishvpn server name found from session records'.format(self.plugin_name))
+ return []
+ ipvanishvpn_servername_list = ipvanishvpn_servername_df[0].drop_duplicates().tolist()
+ self.logger.info('[{}] - Query ipvanishvpn server name from session records successfully. {} items found'
+ .format(self.plugin_name, len(ipvanishvpn_servername_list)))
+
+ return [ServerGroup(self.object_type, ipvanishvpn_servername_list, self.output_file_name)]
diff --git a/detection/vpnservices/ipvanishvpn_serverip.py b/detection/vpnservices/ipvanishvpn_serverip.py
deleted file mode 100644
index 9a26407..0000000
--- a/detection/vpnservices/ipvanishvpn_serverip.py
+++ /dev/null
@@ -1,93 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-# @Time : 2024/1/12 10:00
-# @author : yinjinagyi
-# @File : ipvanishvpn_serverip.py
-# @Function:
-
-from vpn_detector import VpnDetector
-from tool.Functions import check_internet
-from tool.MariadbTool import MariadbUtil
-
-
-class IpvanishvpnServerip(VpnDetector):
- """
- This class is used to detect ipvanishvpn server ip
- """
-
- def __init__(self):
- super().__init__('', '')
- self.plugin_config = self.load_config()['ipvanishvpn_serverip']
- self.plugin_id = self.plugin_config['plugin_id']
- self.plugin_name = self.plugin_config['plugin_name']
- self.object_type = self.plugin_config['object_type']
- self.vpn_service_name = self.plugin_config['vpn_service_name']
- self.confidence = self.plugin_config['confidence']
- self.output_file_name = self.plugin_name + '_' + str(self.start_time).replace(' ', '_').replace(':', '')[:13] + '.csv'
-
-
- self.kb_sql = self.plugin_config['kb_sql']
- self.kb_dbname = self.config['knowledgebase']['db_name']
- self.kb_table_name = self.config['knowledgebase']['domain_library_name']
-
- self.mariadb = MariadbUtil(self.config['mariadb']['host'], self.config['mariadb']['port'],
- self.config['mariadb']['user'], str(self.config['mariadb']['pswd']),
- self.config['mariadb']['db_name'])
- self.mariadb_dbname = self.config['mariadb']['db_name']
- self.mariadb_ip_tb_name = self.config['mariadb']['ip_table_name']
- self.mariadb_domain_tb_name = self.config['mariadb']['domain_table_name']
-
-
- def find_more_servernames(self, server_name_list):
- """
- Find more server name from observed ipvanish server name list
- :return: server name list
- """
- prefix_list = []
- expanded_server_names = []
-
- for server_name in server_name_list:
- domain = server_name.strip()
- domain_prefix = domain[:5]
- prefix_list.append(domain_prefix)
-
- prefix_list = set(prefix_list)
-
- for domain_prefix in prefix_list:
- domain_list = [f"{domain_prefix}{str(index).zfill(2)}.vpn.ipvanish.com" for index in range(100)]
- expanded_server_names.extend(domain_list)
-
- return expanded_server_names
-
-
- def find_server(self):
- """
- Get ipvanishvpn server ip by resolving ipvanishvpn server name
- :return: ipvanishvpn server ip list
- """
- self.kb_sql = self.kb_sql.replace("{$mariadb_dbname}", self.mariadb_dbname).replace("{$mariadb_domain_tablename}", self.mariadb_domain_tb_name)
-
- servername_list = []
- resolved_ip_list = []
- try:
- query_result = self.mariadb.query_sql(self.kb_sql)
- finally:
- self.mariadb.close()
-
- if query_result:
- servername_list = [i[0] for i in query_result]
-
- # 判断是否能够访问外网,如果能够访问外网,则从外网获取ipvanish_servername_list的域名解析地址
- if check_internet():
- servername_list = self.find_more_servernames(servername_list)
- if len(servername_list) > 0:
- resolved_ip_list = self.resolve_dns_for_domain_list(servername_list)
- else:
- self.logger.info('No ipvanish server name found from knowledge database.')
- else:
- self.logger.info('No internet connection, skip dns resolve.')
-
- return resolved_ip_list
-
-
-
diff --git a/detection/vpnservices/ipvanishvpn_servername.py b/detection/vpnservices/ipvanishvpn_servername.py
deleted file mode 100644
index 85fd505..0000000
--- a/detection/vpnservices/ipvanishvpn_servername.py
+++ /dev/null
@@ -1,62 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-# @Time : 2024/1/11 15:45
-# @author : yinjinagyi
-# @File : ipvanishvpn_servername.py
-# @Function:
-
-import sys
-sys.path.append('..')
-from vpn_detector import VpnDetector
-import pandas as pd
-
-
-class IpvanishvpnServername(VpnDetector):
- """
-
- This class is used to detect ipvanish server name
- """
-
- def __init__(self, start_time, end_time):
- super().__init__(start_time, end_time)
- self.plugin_config = self.load_config()['ipvanishvpn_servername']
- self.plugin_id = self.plugin_config['plugin_id']
- self.plugin_name = self.plugin_config['plugin_name']
- self.object_type = self.plugin_config['object_type']
- self.vpn_service_name = self.plugin_config['vpn_service_name']
- self.confidence = self.plugin_config['confidence']
- self.output_file_name = self.plugin_name + '_' + str(self.start_time).replace(' ', '_').replace(':', '')[:13] + '.csv'
- self.start_time = start_time
- self.end_time = end_time
-
- self.sql = self.plugin_config['sql']
-
- def find_server(self):
- """
- Get ipvanishvpn server name from clickhouse database
- :return: ipvanishvpn server name list
- """
- self.logger.info('Start to query ipvanishvpn server name from session record')
-
- # construct query sql
- TIME_FILTER_PATTERN = self.config['common']['time_filter_pattern'].replace('recv_time_columnname', self.config['common']['recv_time_columnname'])
- time_filter = TIME_FILTER_PATTERN.replace("{$start_time}", str(self.start_time)).replace("{$end_time}", str(
- self.end_time)).replace("{$time_zone}", self.time_zone)
- self.sql = self.sql.replace("{$db_name}", self.dbname).replace("{$table_name}", self.table_name)
- self.sql = self.sql.replace("{$time_filter}", time_filter)
- self.logger.info("Sql for {}: {}".format(self.plugin_name, self.sql))
-
- # query data from clickhouse database
- try:
- ipvanishvpn_servername_df = pd.DataFrame(self.client.execute(self.sql))
- finally:
- self.client.disconnect()
-
- if ipvanishvpn_servername_df.empty:
- self.logger.info('No ipvanishvpn server name found from session records')
- return []
- ipvanishvpn_servername_list = ipvanishvpn_servername_df[0].drop_duplicates().tolist()
- self.logger.info('Query ipvanishvpn server name from session records successfully. {} items found'
- .format(len(ipvanishvpn_servername_list)))
-
- return ipvanishvpn_servername_list
diff --git a/detection/vpnservices/ivacyvpn.py b/detection/vpnservices/ivacyvpn.py
new file mode 100644
index 0000000..805ade1
--- /dev/null
+++ b/detection/vpnservices/ivacyvpn.py
@@ -0,0 +1,165 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# @Time : 2024/1/31 14:30
+# @author : yinjinagyi
+# @File : ivacyvpn.py.py
+# @Function:
+import datetime
+
+import pandas as pd
+
+from tool.Functions import check_internet
+from tool.MariadbTool import MariadbUtil
+from vpn_detector import VpnDetector, ServerGroup
+
+
+class Ivacyvpn(VpnDetector):
+ """
+
+ This class is used to detect ivacyvpn server ip and server name
+ """
+
+ def __init__(self, start_time, end_time):
+ super().__init__(start_time, end_time)
+ self.plugin_config = self.load_config()['ivacyvpn']
+ self.vpn_service_name = self.plugin_config['vpn_service_name']
+ self.plugin_name = self.plugin_config['plugin_name']
+ self.plugin_id = self.plugin_config['plugin_id']
+ self.confidence = self.plugin_config['confidence']
+ self.start_time = start_time
+ self.end_time = end_time
+
+ def find_server(self):
+ """
+ Get ivacyvpn server ip and server name from clickhouse database
+ :return: ivacyvpn server ip list and server name list
+ """
+ result_group = []
+
+ # start finding ivacyvpn server name
+ ivacyvpn_detector = IvacyvpnServername(self.start_time, self.end_time)
+ result_group.extend(ivacyvpn_detector.find_server())
+
+ # start finding ivacyvpn server ip
+ ivacyvpn_detector = IvacyvpnServerip()
+ result_group.extend(ivacyvpn_detector.find_server())
+
+ return result_group
+
+
+
+class IvacyvpnServerip(VpnDetector):
+ """
+
+ This class is used to detect ivacyvpn server ip
+ """
+
+ def __init__(self):
+ super().__init__('', '')
+ self.plugin_config = self.load_config()['ivacyvpn']
+ self.plugin_name = self.plugin_config['plugin_name']
+ self.object_type = self.plugin_config['ip']['object_type']
+ # 开始时间为当前的整点时间
+ self.start_time = datetime.datetime.now().strftime("%Y-%m-%d %H:00:00")
+ self.output_file_name = self.plugin_name + '-' + self.object_type + '_' + str(self.start_time).replace(' ', '_').replace(':', '')[:13] + '.csv'
+
+ self.kb_sql = self.plugin_config['ip']['kb_sql']
+ self.kb_dbname = self.config['knowledgebase']['db_name']
+ self.kb_table_name = self.config['knowledgebase']['domain_library_name']
+
+ self.mariadb = MariadbUtil(self.config['mariadb']['host'], self.config['mariadb']['port'],
+ self.config['mariadb']['user'], str(self.config['mariadb']['pswd']),
+ self.config['mariadb']['db_name'])
+ self.mariadb_dbname = self.config['mariadb']['db_name']
+ self.mariadb_ip_tb_name = self.config['mariadb']['ip_table_name']
+ self.mariadb_domain_tb_name = self.config['mariadb']['domain_table_name']
+
+
+
+
+ def find_server(self):
+ """
+ Find ivacyvpn server ip by resolving ivacyvpn server name
+ :return: server ip list
+ """
+ self.kb_sql = self.kb_sql.replace("{$mariadb_dbname}", self.mariadb_dbname).replace("{$mariadb_domain_tablename}", self.mariadb_domain_tb_name)
+
+ server_name_list = []
+ server_ip_list = []
+
+ try:
+ query_result = self.mariadb.query_sql(self.kb_sql)
+ finally:
+ self.mariadb.close()
+
+ if query_result:
+ for row in query_result:
+ server_name_list.append(row[0])
+
+ # add dc-xxx.pointtoserver.com to server_name_list
+ server_name_list.extend([f"dc-{str(index)}.pointtoserver.com" for index in range(1000)])
+ server_name_list = list(set(server_name_list))
+
+ if check_internet():
+ server_ip_list = self.resolve_dns_for_domain_list(server_name_list)
+ if server_ip_list:
+ server_ip_list = list(set(server_ip_list))
+ self.logger.info(
+ '[{}] - Get {} server ip by resolving server name successfully.'.format(self.plugin_name,
+ len(server_ip_list)))
+ else:
+ self.logger.info("[{}] - No ivacyvpn server name found from knowledge database.".format(self.plugin_name))
+ else:
+ self.logger.info("[{}] - No internet connection, skip dns resolve.".format(self.plugin_name))
+
+ return [ServerGroup(self.object_type, server_ip_list, self.output_file_name)]
+
+
+class IvacyvpnServername(VpnDetector):
+ """
+
+ This class is used to detect ivacyvpn server name
+ """
+
+ def __init__(self, start_time, end_time):
+ super().__init__(start_time, end_time)
+ self.plugin_config = self.load_config()['ivacyvpn']
+ self.plugin_name = self.plugin_config['plugin_name']
+ self.object_type = self.plugin_config['domain']['object_type']
+ self.output_file_name = self.plugin_name + '-' + self.object_type + '_' + str(self.start_time).replace(' ', '_').replace(':', '')[:13] + '.csv'
+ self.start_time = start_time
+ self.end_time = end_time
+
+ self.sql = self.plugin_config['domain']['sql']
+
+ def find_server(self):
+ """
+ Get ivacyvpn server name from clickhouse database
+ :return: ivacyvpn server name list
+ """
+ self.logger.info('[{}] - Start to query ivacyvpn server name from session record'.format(self.plugin_name))
+
+ # construct query sql
+ TIME_FILTER_PATTERN = self.config['common']['time_filter_pattern'].replace('recv_time_columnname',
+ self.config['common'][
+ 'recv_time_columnname'])
+ time_filter = TIME_FILTER_PATTERN.replace("{$start_time}", str(self.start_time)).replace("{$end_time}", str(
+ self.end_time)).replace("{$time_zone}", self.time_zone)
+ self.sql = self.sql.replace("{$db_name}", self.dbname).replace("{$table_name}", self.table_name)
+ self.sql = self.sql.replace("{$time_filter}", time_filter)
+ self.logger.info("[{}] - Sql for {}: {}".format(self.plugin_name, self.plugin_config['plugin_name'], self.sql))
+
+ # query data from clickhouse database
+ try:
+ ivacyvpn_servername_df = pd.DataFrame(self.client.execute(self.sql))
+ finally:
+ self.client.disconnect()
+
+ if ivacyvpn_servername_df.empty:
+ self.logger.info('[{}] - No ivacyvpn server name found from session records'.format(self.plugin_name))
+ return []
+ ivacyvpn_servername_list = ivacyvpn_servername_df[0].drop_duplicates().tolist()
+ self.logger.info('[{}] - Query ivacyvpn server name from session records successfully. {} items found'
+ .format(self.plugin_name, len(ivacyvpn_servername_list)))
+
+ return [ServerGroup(self.object_type, ivacyvpn_servername_list, self.output_file_name)]
diff --git a/detection/vpnservices/ivacyvpn_serverip.py b/detection/vpnservices/ivacyvpn_serverip.py
deleted file mode 100644
index 69b21a0..0000000
--- a/detection/vpnservices/ivacyvpn_serverip.py
+++ /dev/null
@@ -1,84 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-# @Time : 2024/1/17 15:25
-# @author : yinjinagyi
-# @File : ivacyvpn_serverip.py
-# @Function:
-
-import sys
-
-sys.path.append('..')
-from tool.Functions import check_internet
-from tool.MariadbTool import MariadbUtil
-from vpn_detector import VpnDetector
-
-class IvacyvpnServerip(VpnDetector):
- """
-
- This class is used to detect ivacyvpn server ip
- """
-
- def __init__(self, start_time, end_time):
- super().__init__(start_time, end_time)
- self.plugin_config = self.load_config()['ivacyvpn_serverip']
- self.plugin_id = self.plugin_config['plugin_id']
- self.plugin_name = self.plugin_config['plugin_name']
- self.object_type = self.plugin_config['object_type']
- self.vpn_service_name = self.plugin_config['vpn_service_name']
- self.confidence = self.plugin_config['confidence']
- self.output_file_name = self.plugin_name + '_' + str(self.start_time).replace(' ', '_').replace(':', '')[:13] + '.csv'
- self.start_time = start_time
- self.end_time = end_time
-
- self.kb_sql = self.plugin_config['kb_sql']
- self.kb_dbname = self.config['knowledgebase']['db_name']
- self.kb_table_name = self.config['knowledgebase']['domain_library_name']
-
- self.mariadb = MariadbUtil(self.config['mariadb']['host'], self.config['mariadb']['port'],
- self.config['mariadb']['user'], str(self.config['mariadb']['pswd']),
- self.config['mariadb']['db_name'])
-
- self.mariadb_dbname = self.config['mariadb']['db_name']
- self.mariadb_ip_tb_name = self.config['mariadb']['ip_table_name']
- self.mariadb_domain_tb_name = self.config['mariadb']['domain_table_name']
-
-
-
-
- def find_server(self):
- """
- Find ivacyvpn server ip by resolving ivacyvpn server name
- :return: server ip list
- """
- self.kb_sql = self.kb_sql.replace("{$mariadb_dbname}", self.mariadb_dbname).replace("{$mariadb_domain_tablename}", self.mariadb_domain_tb_name)
-
- server_name_list = []
- server_ip_list = []
-
- try:
- query_result = self.mariadb.query_sql(self.kb_sql)
- finally:
- self.mariadb.close()
-
- if query_result:
- for row in query_result:
- server_name_list.append(row[0])
-
- # add dc-xxx.pointtoserver.com to server_name_list
- server_name_list.extend([f"dc-{str(index)}.pointtoserver.com" for index in range(1000)])
- server_name_list = list(set(server_name_list))
-
- if check_internet():
- server_ip_list = self.resolve_dns_for_domain_list(server_name_list)
- if server_ip_list:
- server_ip_list = list(set(server_ip_list))
- else:
- self.logger.info("No ivacyvpn server name found from knowledge database.")
- else:
- self.logger.info("No internet connection, skip dns resolve.")
- return server_ip_list
-
-
-
-
-
diff --git a/detection/vpnservices/ivacyvpn_servername.py b/detection/vpnservices/ivacyvpn_servername.py
deleted file mode 100644
index 896f291..0000000
--- a/detection/vpnservices/ivacyvpn_servername.py
+++ /dev/null
@@ -1,60 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-# @Time : 2024/1/17 15:22
-# @author : yinjinagyi
-# @File : ivacyvpn_servername.py
-# @Function:
-
-import sys
-sys.path.append('..')
-from vpn_detector import VpnDetector
-import pandas as pd
-
-class IvacyvpnServername(VpnDetector):
- """
-
- This class is used to detect ivacyvpn server name
- """
-
- def __init__(self, start_time, end_time):
- super().__init__(start_time, end_time)
- self.plugin_config = self.load_config()['ivacyvpn_servername']
- self.plugin_id = self.plugin_config['plugin_id']
- self.plugin_name = self.plugin_config['plugin_name']
- self.object_type = self.plugin_config['object_type']
- self.vpn_service_name = self.plugin_config['vpn_service_name']
- self.confidence = self.plugin_config['confidence']
- self.output_file_name = self.plugin_name + '_' + str(self.start_time).replace(' ', '_').replace(':', '')[:13] + '.csv'
- self.start_time = start_time
- self.end_time = end_time
-
- self.sql = self.plugin_config['sql']
-
- def find_server(self):
- """
- Get ivacyvpn server name from clickhouse database
- :return: ivacyvpn server name list
- """
- self.logger.info('Start to query ivacyvpn server name from session record')
-
- # construct query sql
- TIME_FILTER_PATTERN = self.config['common']['time_filter_pattern'].replace('recv_time_columnname', self.config['common']['recv_time_columnname'])
- time_filter = TIME_FILTER_PATTERN.replace("{$start_time}", str(self.start_time)).replace("{$end_time}", str(
- self.end_time)).replace("{$time_zone}", self.time_zone)
- self.sql = self.sql.replace("{$db_name}", self.dbname).replace("{$table_name}", self.table_name)
- self.sql = self.sql.replace("{$time_filter}", time_filter)
- self.logger.info("Sql for {}: {}".format(self.plugin_name, self.sql))
-
- # query data from clickhouse database
- try:
- ivacyvpn_servername_df = pd.DataFrame(self.client.execute(self.sql))
- finally:
- self.client.disconnect()
-
- if ivacyvpn_servername_df.empty:
- self.logger.info('No ivacyvpn server name found from session records')
- return []
- ivacyvpn_servername_list = ivacyvpn_servername_df[0].drop_duplicates().tolist()
- self.logger.info('Query ivacyvpn server name from session records successfully. {} items found'
- .format(len(ivacyvpn_servername_list)))
- return ivacyvpn_servername_list \ No newline at end of file
diff --git a/detection/vpnservices/protonvpn_serverip.py b/detection/vpnservices/protonvpn.py
index 1f82dae..b3dac90 100644
--- a/detection/vpnservices/protonvpn_serverip.py
+++ b/detection/vpnservices/protonvpn.py
@@ -2,28 +2,27 @@
# -*- coding: utf-8 -*-
# @Time : 2024/1/29 18:49
# @author : yinjinagyi
-# @File : protonvpn_serverip.py
+# @File : protonvpn.py
# @Function:
import pandas as pd
-from vpn_detector import VpnDetector
+from vpn_detector import VpnDetector, ServerGroup
-class ProtonvpnServerip(VpnDetector):
+class Protonvpn(VpnDetector):
"""
This class is used to detect protonvpn server ip
"""
def __init__(self, start_time, end_time):
super().__init__(start_time, end_time)
- self.plugin_config = self.load_config()['protonvpn_serverip']
+ self.plugin_config = self.load_config()['protonvpn']
self.plugin_id = self.plugin_config['plugin_id']
self.plugin_name = self.plugin_config['plugin_name']
self.object_type = self.plugin_config['object_type']
self.vpn_service_name = self.plugin_config['vpn_service_name']
self.confidence = self.plugin_config['confidence']
- self.output_file_name = self.plugin_name + '_' + str(self.start_time).replace(' ', '_').replace(':', '')[
- :13] + '.csv'
+ self.output_file_name = self.plugin_name + '-' + self.object_type + '_' + str(self.start_time).replace(' ', '_').replace(':', '')[:13] + '.csv'
self.start_time = start_time
self.end_time = end_time
@@ -34,7 +33,7 @@ class ProtonvpnServerip(VpnDetector):
Get protonvpn server ip from clickhouse database
:return: protonvpn server ip list
"""
- self.logger.info('Start to query protonvpn server ip from session record')
+ self.logger.info('[{}] - Start to query protonvpn server ip from session record'.format(self.plugin_name))
# construct query sql
TIME_FILTER_PATTERN = self.config['common']['time_filter_pattern'].replace('recv_time_columnname',
@@ -45,7 +44,7 @@ class ProtonvpnServerip(VpnDetector):
self.sql = self.sql.replace("{$db_name}", self.dbname).replace("{$table_name}", self.table_name)
self.sql = self.sql.replace("{$time_filter}", time_filter)
- self.logger.info("Sql for {}: {}".format(self.plugin_name, self.sql))
+ self.logger.info("[{}] - Sql for {}: {}".format(self.plugin_name, self.plugin_name, self.sql))
# query data from clickhouse database
try:
@@ -54,10 +53,10 @@ class ProtonvpnServerip(VpnDetector):
self.client.disconnect()
if protonvpn_serverip_df.empty:
- self.logger.info('No protonvpn server ip found from session record')
+ self.logger.info('[{}] - No protonvpn server ip found from session record'.format(self.plugin_name))
return []
protonvpn_serverip_list = protonvpn_serverip_df[0].drop_duplicates().tolist()
- self.logger.info('Query protonvpn server ip from session records successfully. {} items found'
- .format(len(protonvpn_serverip_list)))
+ self.logger.info('[{}] - Query protonvpn server ip from session records successfully. {} items found'
+ .format(self.plugin_name, len(protonvpn_serverip_list)))
- return protonvpn_serverip_list
+ return [ServerGroup(object_type='ip', server_list=protonvpn_serverip_list, output_file_name=self.output_file_name)]
diff --git a/detection/vpnservices/turbovpn_serverip.py b/detection/vpnservices/turbovpn.py
index 1546985..2c5ab87 100644
--- a/detection/vpnservices/turbovpn_serverip.py
+++ b/detection/vpnservices/turbovpn.py
@@ -2,26 +2,28 @@
# -*- coding: utf-8 -*-
# @Time : 2024/1/17 18:09
# @author : yinjinagyi
-# @File : turbovpn_serverip.py
+# @File : turbovpn.py
# @Function:
import pandas as pd
-from vpn_detector import VpnDetector
+from vpn_detector import VpnDetector, ServerGroup
-class TurbovpnServerip(VpnDetector):
+
+class Turbovpn(VpnDetector):
"""
This class is used to detect turbovpn server ip
"""
def __init__(self, start_time, end_time):
super().__init__(start_time, end_time)
- self.plugin_config = self.load_config()['turbovpn_serverip']
+ self.plugin_config = self.load_config()['turbovpn']
self.plugin_id = self.plugin_config['plugin_id']
self.plugin_name = self.plugin_config['plugin_name']
self.object_type = self.plugin_config['object_type']
self.vpn_service_name = self.plugin_config['vpn_service_name']
self.confidence = self.plugin_config['confidence']
- self.output_file_name = self.plugin_name + '_' + str(self.start_time).replace(' ', '_').replace(':', '')[:13] + '.csv'
+ self.output_file_name = self.plugin_name + '-' + self.object_type + '_' + str(self.start_time).replace(' ','_').replace(':', '')[:13] + '.csv'
+
self.start_time = start_time
self.end_time = end_time
@@ -44,7 +46,7 @@ class TurbovpnServerip(VpnDetector):
self.sql = self.sql.replace("{$security_table_name}", self.plugin_config['security_table_name'])\
.replace("{$security_policy_id}", str(self.plugin_config['security_policy_id']))
- self.logger.info("Sql for {}: {}".format(self.plugin_name, self.sql))
+ self.logger.info("[{}] - Sql for {}: {}".format(self.plugin_name, self.plugin_name, self.sql))
# query data from clickhouse database
try:
@@ -53,9 +55,12 @@ class TurbovpnServerip(VpnDetector):
self.client.disconnect()
if turbovpn_serverip_df.empty:
- self.logger.info('No turbovpn server ip found from session record')
+ self.logger.error('[{}] - No turbovpn server ip found from security event. Policy id: {}.'.format(self.plugin_name, self.plugin_config['security_policy_id']))
return []
turbovpn_serverip_list = turbovpn_serverip_df[0].drop_duplicates().tolist()
- self.logger.info('Query turbovpn server ip from session records successfully. {} items found'
- .format(len(turbovpn_serverip_list)))
- return turbovpn_serverip_list
+ self.logger.info('[{}] - Query turbovpn server ip from clickhouse database successfully. {} items found'
+ .format(self.plugin_name, len(turbovpn_serverip_list)))
+
+ return [
+ ServerGroup(object_type='ip', server_list=turbovpn_serverip_list, output_file_name=self.output_file_name)]
+
diff --git a/detection/vpnservices/vpnunlimited_serverip.py b/detection/vpnservices/vpnunlimited.py
index 4aea727..f168af1 100644
--- a/detection/vpnservices/vpnunlimited_serverip.py
+++ b/detection/vpnservices/vpnunlimited.py
@@ -2,13 +2,13 @@
# -*- coding: utf-8 -*-
# @Time : 2024/1/23 10:39
# @author : yinjinagyi
-# @File : vpnunlimited_serverip.py
+# @File : vpnunlimited.py
# @Function:
-from vpn_detector import VpnDetector
+from vpn_detector import VpnDetector, ServerGroup
import pandas as pd
-class VpnunlimitedServerip(VpnDetector):
+class Vpnunlimited(VpnDetector):
"""
This class is used to detect vpnunlimited server ip
@@ -16,13 +16,15 @@ class VpnunlimitedServerip(VpnDetector):
def __init__(self, start_time, end_time):
super().__init__(start_time, end_time)
- self.plugin_config = self.load_config()['vpnunlimited_serverip']
+ self.plugin_config = self.load_config()['vpnunlimited']
self.plugin_id = self.plugin_config['plugin_id']
self.plugin_name = self.plugin_config['plugin_name']
self.object_type = self.plugin_config['object_type']
self.vpn_service_name = self.plugin_config['vpn_service_name']
self.confidence = self.plugin_config['confidence']
- self.output_file_name = self.plugin_name + '_' + str(self.start_time).replace(' ', '_').replace(':', '')[:13] + '.csv'
+ self.output_file_name = self.plugin_name + '-' + self.object_type + '_' + str(self.start_time).replace(' ','_').replace(':', '')[:13] + '.csv'
+
+
self.start_time = start_time
self.end_time = end_time
@@ -34,7 +36,7 @@ class VpnunlimitedServerip(VpnDetector):
Get vpnunlimited server ip from session records
:return: vpnunlimited server ip list
"""
- self.logger.info('Start to query vpnunlimited server ip from session records')
+ self.logger.info('[{}] - Start to query server ip from session records'.format(self.plugin_name))
# construct query sql
TIME_FILTER_PATTERN = self.config['common']['time_filter_pattern'].replace('recv_time_columnname', self.config['common']['recv_time_columnname'])
@@ -44,7 +46,7 @@ class VpnunlimitedServerip(VpnDetector):
self.sql = self.sql.replace("{$time_filter}", time_filter)
self.sql = self.sql.replace("{$domain_list}", ','.join(self.domains))
- self.logger.info("Sql for {}: {}".format(self.plugin_name, self.sql))
+ self.logger.info("[{}] - Sql for {}: {}".format(self.plugin_name, self.plugin_name, self.sql))
# query data from clickhouse database
try:
@@ -53,10 +55,10 @@ class VpnunlimitedServerip(VpnDetector):
self.client.disconnect()
if vpnunlimited_serverip_df.empty:
- self.logger.info('No vpnunlimited server ip found from session records')
+ self.logger.info('[{}] - No server ip found from session records'.format(self.plugin_name))
return []
vpnunlimited_serverip_list = vpnunlimited_serverip_df[0].drop_duplicates().tolist()
- self.logger.info('Query vpnunlimited server ip from session records successfully. {} items found'
- .format(len(vpnunlimited_serverip_list)))
+ self.logger.info('[{}] - Query server ip from clickhouse database successfully. {} items found'
+ .format(self.plugin_name, len(vpnunlimited_serverip_list)))
- return vpnunlimited_serverip_list \ No newline at end of file
+ return [ServerGroup(object_type='ip', server_list=vpnunlimited_serverip_list, output_file_name=self.output_file_name)]
diff --git a/detection/vpnservices/windscribevpn.py b/detection/vpnservices/windscribevpn.py
new file mode 100644
index 0000000..a45c4d9
--- /dev/null
+++ b/detection/vpnservices/windscribevpn.py
@@ -0,0 +1,203 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# @Time : 2024/1/31 15:23
+# @author : yinjinagyi
+# @File : windscribevpn.py
+# @Function:
+import datetime
+import re
+
+import pandas as pd
+from statsmodels.datasets import check_internet
+
+from tool.MariadbTool import MariadbUtil
+from vpn_detector import VpnDetector, ServerGroup
+
+
+class Windscribevpn(VpnDetector):
+ """
+
+ This class is used to detect windscribevpn server ip and server name
+ """
+
+ def __init__(self, start_time, end_time):
+ super().__init__(start_time, end_time)
+ self.plugin_config = self.load_config()['windscribevpn']
+ self.vpn_service_name = self.plugin_config['vpn_service_name']
+ self.plugin_name = self.plugin_config['plugin_name']
+ self.plugin_id = self.plugin_config['plugin_id']
+ self.confidence = self.plugin_config['confidence']
+ self.start_time = start_time
+ self.end_time = end_time
+
+ def find_server(self):
+ """
+ Get windscribevpn server ip and server name from clickhouse database
+ :return: windscribevpn server ip list and server name list
+ """
+ result_group = []
+
+ # start finding windscribevpn server name
+ windscribevpn_detector = WindscribevpnServername(self.start_time, self.end_time)
+ result_group.extend(windscribevpn_detector.find_server())
+
+ # start finding windscribevpn server ip
+ windscribevpn_detector = WindscribevpnServerip()
+ result_group.extend(windscribevpn_detector.find_server())
+
+ return result_group
+
+
+class WindscribevpnServerip(VpnDetector):
+ """
+
+ This class is used to detect windscribevpn server ip
+ """
+ def __init__(self):
+ super().__init__('', '')
+ self.plugin_config = self.load_config()['windscribevpn']
+ self.plugin_name = self.plugin_config['plugin_name']
+ self.object_type = self.plugin_config['ip']['object_type']
+ # 开始时间为当前的整点时间
+ self.start_time = datetime.datetime.now().strftime("%Y-%m-%d %H:00:00")
+ self.output_file_name = self.plugin_name + '-' + self.object_type + '_' + str(self.start_time).replace(' ', '_').replace(':', '')[:13] + '.csv'
+
+ self.kb_sql = self.plugin_config['ip']['kb_sql']
+ self.kb_dbname = self.config['knowledgebase']['db_name']
+ self.kb_table_name = self.config['knowledgebase']['domain_library_name']
+
+ self.mariadb = MariadbUtil(self.config['mariadb']['host'], self.config['mariadb']['port'],
+ self.config['mariadb']['user'], str(self.config['mariadb']['pswd']),
+ self.config['mariadb']['db_name'])
+ self.mariadb_dbname = self.config['mariadb']['db_name']
+ self.mariadb_ip_tb_name = self.config['mariadb']['ip_table_name']
+ self.mariadb_domain_tb_name = self.config['mariadb']['domain_table_name']
+
+
+ def find_more_servernames(self, server_name_list):
+ """
+ Find more server name from observed windscribevpn server name list
+ :return: server name list
+ """
+ prefix_list = []
+ expanded_server_names = []
+
+ pattern = re.compile(r'\D+(\d+)\.\w+\.\w+')
+ for server_name in server_name_list:
+ domain = server_name.strip()
+ match = pattern.match(domain)
+ if match:
+ numeric_part = match.group(1)
+ domain_pattern = re.sub(numeric_part, '{index}', domain)
+ prefix_list.append(domain_pattern)
+ else:
+ continue
+
+ prefix_list = set(prefix_list)
+
+ for domain_prefix in prefix_list:
+ domain_list = [re.sub(r'{index}', str(index).zfill(3), domain_prefix) for index in range(1000)]
+ expanded_server_names.extend(domain_list)
+ return expanded_server_names
+
+
+ def find_server(self):
+ """
+ Get windscribevpn server ip by resolving windscribevpn server name
+ :return: windscribevpn server ip list
+ """
+ self.kb_sql = self.kb_sql.replace("{$mariadb_dbname}", self.mariadb_dbname).replace(
+ "{$mariadb_domain_tablename}", self.mariadb_domain_tb_name)
+
+ servername_list = []
+ resolved_ip_list = []
+ try:
+ query_result = self.mariadb.query_sql(self.kb_sql)
+ finally:
+ self.mariadb.close()
+
+ if query_result:
+ servername_list = [i[0] for i in query_result]
+
+ # 判断是否能够访问外网,如果能够访问外网,则从外网获取windscribevpn_servername_list的域名解析地址
+ if check_internet():
+ servername_list = self.find_more_servernames(servername_list)
+ if len(servername_list) > 0:
+ resolved_ip_list = self.resolve_dns_for_domain_list(servername_list)
+ self.logger.info(
+ '[{}] - Get {} server ip by resolving server name successfully.'.format(
+ self.plugin_name, len(resolved_ip_list)))
+ else:
+ self.logger.info(
+ '[{}] - No windscribevpn server name found from knowledge database.'.format(self.plugin_name))
+ else:
+ self.logger.info('[{}] - No internet connection, skip dns resolve.'.format(self.plugin_name))
+
+ return [ServerGroup(self.object_type, resolved_ip_list, self.output_file_name)]
+
+
+
+class WindscribevpnServername(VpnDetector):
+ """
+
+ This class is used to detect windscribevpn server name
+ """
+
+ def __init__(self, start_time, end_time):
+ super().__init__(start_time, end_time)
+ self.plugin_config = self.load_config()['windscribevpn']
+ self.plugin_name = self.plugin_config['plugin_name']
+ self.object_type = self.plugin_config['domain']['object_type']
+ self.output_file_name = self.plugin_name + '-' + self.object_type + '_' + str(self.start_time).replace(' ',
+ '_').replace(
+ ':', '')[:13] + '.csv'
+ self.start_time = start_time
+ self.end_time = end_time
+
+ self.sql = self.plugin_config['domain']['sql']
+ self.domains = ["'" + i.strip() + "'" for i in self.plugin_config['domain']['domains'].split(',')]
+
+ def find_server(self):
+ """
+ Get windscribevpn server name from session records
+ :return: windscribevpn server name list
+ """
+ self.logger.info('[{}] - Start to query windscribevpn server name from session record'.format(self.plugin_name))
+
+ # construct query sql
+ TIME_FILTER_PATTERN = self.config['common']['time_filter_pattern'].replace('recv_time_columnname',
+ self.config['common'][
+ 'recv_time_columnname'])
+ time_filter = TIME_FILTER_PATTERN.replace("{$start_time}", str(self.start_time)).replace("{$end_time}", str(
+ self.end_time)).replace("{$time_zone}", self.time_zone)
+ self.sql = self.sql.replace("{$db_name}", self.dbname).replace("{$table_name}", self.table_name)
+ self.sql = self.sql.replace("{$time_filter}", time_filter)
+ self.sql = self.sql.replace("{$domain_list}", ','.join(self.domains))
+ self.logger.info("[{}] - Sql for {}: {}".format(self.plugin_name, self.plugin_config['plugin_name'], self.sql))
+
+ # query data from clickhouse database
+ try:
+ windscribevpn_servername_df = pd.DataFrame(self.client.execute(self.sql))
+ finally:
+ self.client.disconnect()
+
+ if windscribevpn_servername_df.empty:
+ self.logger.info('[{}] - No windscribevpn server name found from session records'.format(self.plugin_name))
+ return []
+ windscribevpn_servername_list = windscribevpn_servername_df[0].drop_duplicates().tolist()
+ self.logger.info('[{}] - Query windscribevpn server name from session records successfully. {} items found'
+ .format(self.plugin_name, len(windscribevpn_servername_list)))
+
+ return [ServerGroup(self.object_type, windscribevpn_servername_list, self.output_file_name)]
+
+
+def extract_pattern(domain):
+ pattern = re.compile(r'\D+(\d+)\.\w+\.\w+')
+
+ match = pattern.match(domain)
+ if match:
+ numeric_part = match.group(1)
+ domain_pattern = re.sub(numeric_part, '{index}', domain)
+ return domain_pattern
+ else:
+ return \ No newline at end of file
diff --git a/detection/vpnservices/windscribevpn_serverip.py b/detection/vpnservices/windscribevpn_serverip.py
deleted file mode 100644
index 2d21c06..0000000
--- a/detection/vpnservices/windscribevpn_serverip.py
+++ /dev/null
@@ -1,111 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-# @Time : 2024/1/24 15:18
-# @author : yinjinagyi
-# @File : windscribevpn_serverip.py
-# @Function:
-import re
-
-import sys
-sys.path.append('..')
-from statsmodels.datasets import check_internet
-
-from tool.MariadbTool import MariadbUtil
-from vpn_detector import VpnDetector
-
-
-class WindscribevpnServerip(VpnDetector):
- """
-
- This class is used to detect windscribevpn server ip
- """
- def __init__(self):
- super().__init__('', '')
- self.plugin_config = self.load_config()['windscribevpn_serverip']
- self.plugin_id = self.plugin_config['plugin_id']
- self.plugin_name = self.plugin_config['plugin_name']
- self.object_type = self.plugin_config['object_type']
- self.vpn_service_name = self.plugin_config['vpn_service_name']
- self.confidence = self.plugin_config['confidence']
- self.output_file_name = self.plugin_name + '_' + str(self.start_time).replace(' ', '_').replace(':', '')[:13] + '.csv'
-
- self.kb_sql = self.plugin_config['kb_sql']
- self.kb_dbname = self.config['knowledgebase']['db_name']
- self.kb_table_name = self.config['knowledgebase']['domain_library_name']
-
- self.mariadb = MariadbUtil(self.config['mariadb']['host'], self.config['mariadb']['port'],
- self.config['mariadb']['user'], str(self.config['mariadb']['pswd']),
- self.config['mariadb']['db_name'])
- self.mariadb_dbname = self.config['mariadb']['db_name']
- self.mariadb_ip_tb_name = self.config['mariadb']['ip_table_name']
- self.mariadb_domain_tb_name = self.config['mariadb']['domain_table_name']
-
-
- def find_more_servernames(self, server_name_list):
- """
- Find more server name from observed windscribe server name list
- :return: server name list
- """
- prefix_list = []
- expanded_server_names = []
-
- pattern = re.compile(r'\D+(\d+)\.\w+\.\w+')
- for server_name in server_name_list:
- domain = server_name.strip()
- match = pattern.match(domain)
- if match:
- numeric_part = match.group(1)
- domain_pattern = re.sub(numeric_part, '{index}', domain)
- prefix_list.append(domain_pattern)
- else:
- continue
-
- prefix_list = set(prefix_list)
-
- for domain_prefix in prefix_list:
- domain_list = [re.sub(r'{index}', str(index).zfill(3), domain_prefix) for index in range(1000)]
- expanded_server_names.extend(domain_list)
- return expanded_server_names
-
-
- def find_server(self):
- """
- Get windscribevpn server ip by resolving windscribevpn server name
- :return: windscribevpn server ip list
- """
- self.kb_sql = self.kb_sql.replace("{$mariadb_dbname}", self.mariadb_dbname).replace("{$mariadb_domain_tablename}", self.mariadb_domain_tb_name)
-
- servername_list = []
- resolved_ip_list = []
- try:
- query_result = self.mariadb.query_sql(self.kb_sql)
- finally:
- self.mariadb.close()
-
- if query_result:
- servername_list = [i[0] for i in query_result]
-
- # 判断是否能够访问外网,如果能够访问外网,则从外网获取windscribe_servername_list的域名解析地址
- if check_internet():
- servername_list = self.find_more_servernames(servername_list)
- if len(servername_list) > 0:
- resolved_ip_list = self.resolve_dns_for_domain_list(servername_list)
- else:
- self.logger.info('No windscribe server name found from knowledge base')
- else:
- self.logger.info('No internet access, skip to resolve windscribe server name')
-
- return resolved_ip_list
-
-
-
-def extract_pattern(domain):
- pattern = re.compile(r'\D+(\d+)\.\w+\.\w+')
-
- match = pattern.match(domain)
- if match:
- numeric_part = match.group(1)
- domain_pattern = re.sub(numeric_part, '{index}', domain)
- return domain_pattern
- else:
- return
diff --git a/detection/vpnservices/windscribevpn_servername.py b/detection/vpnservices/windscribevpn_servername.py
deleted file mode 100644
index fb90c5c..0000000
--- a/detection/vpnservices/windscribevpn_servername.py
+++ /dev/null
@@ -1,65 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-# @Time : 2024/1/24 15:08
-# @author : yinjinagyi
-# @File : windscribevpn_servername.py
-# @Function:
-
-from vpn_detector import VpnDetector
-import pandas as pd
-
-
-class WindscribevpnServername(VpnDetector):
- """
-
- This class is used to detect windscribevpn server name
- """
-
- def __init__(self, start_time, end_time):
- super().__init__(start_time, end_time)
- self.plugin_config = self.load_config()['windscribevpn_servername']
- self.plugin_id = self.plugin_config['plugin_id']
- self.plugin_name = self.plugin_config['plugin_name']
- self.object_type = self.plugin_config['object_type']
- self.vpn_service_name = self.plugin_config['vpn_service_name']
- self.confidence = self.plugin_config['confidence']
- self.output_file_name = self.plugin_name + '_' + str(self.start_time).replace(' ', '_').replace(':', '')[
- :13] + '.csv'
- self.start_time = start_time
- self.end_time = end_time
-
- self.sql = self.plugin_config['sql']
- self.domains = ["'" + i.strip() + "'" for i in self.plugin_config['domains'].split(',')]
-
- def find_server(self):
- """
- Get windscribevpn server name from session records
- :return: windscribevpn server name list
- """
- self.logger.info('Start to query windscribevpn server name from session records')
-
- # construct query sql
- TIME_FILTER_PATTERN = self.config['common']['time_filter_pattern'].replace('recv_time_columnname',
- self.config['common'][
- 'recv_time_columnname'])
- time_filter = TIME_FILTER_PATTERN.replace("{$start_time}", str(self.start_time)).replace("{$end_time}", str(
- self.end_time)).replace("{$time_zone}", self.time_zone)
- self.sql = self.sql.replace("{$db_name}", self.dbname).replace("{$table_name}", self.table_name)
- self.sql = self.sql.replace("{$time_filter}", time_filter)
- self.sql = self.sql.replace("{$domain_list}", ','.join(self.domains))
-
- self.logger.info("Sql for {}: {}".format(self.plugin_name, self.sql))
-
- # query data from clickhouse database
- try:
- windscribevpn_servername_df = pd.DataFrame(self.client.execute(self.sql))
- finally:
- self.client.disconnect()
-
- if windscribevpn_servername_df.empty:
- self.logger.info('No windscribevpn server name found from session records')
- return []
- windscribevpn_servername_list = windscribevpn_servername_df[0].drop_duplicates().tolist()
- self.logger.info('Query windscribevpn server name from session records successfully. {} items found'
- .format(len(windscribevpn_servername_list)))
- return windscribevpn_servername_list