diff --git a/my_deploy.sh b/my_deploy.sh index e0ae334ae4ce63356806ac3358ec49f6473a18f7..6d2ca46c5cfa983bb3ca4688ae85af515c65473b 100644 --- a/my_deploy.sh +++ b/my_deploy.sh @@ -7,7 +7,7 @@ export TFS_REGISTRY_IMAGE="http://localhost:32000/tfs/" # interdomain slice pathcomp dlt # dbscanserving opticalattackmitigator opticalcentralizedattackdetector # l3_attackmitigator l3_centralizedattackdetector l3_distributedattackdetector -export TFS_COMPONENTS="context device automation service compute monitoring webui dbscanserving opticalattackmanager opticalattackmitigator opticalattackdetector " +export TFS_COMPONENTS="context device automation service compute monitoring webui dbscanserving opticalattackmitigator" # opticalattackmanager opticalattackdetector # Set the tag you want to use for your images. export TFS_IMAGE_TAG="dev" diff --git a/proto/monitoring.proto b/proto/monitoring.proto index ea7f532bbb3aa6a9e9bcb2223f85619c5ae851f8..b7080f560004aa0d799603716d2c17e2a400ae84 100644 --- a/proto/monitoring.proto +++ b/proto/monitoring.proto @@ -109,8 +109,8 @@ message KpiDescriptorList { message SubsDescriptor{ SubscriptionID subs_id = 1; KpiId kpi_id = 2; - float sampling_duration_s = 3; - float sampling_interval_s = 4; + float monitoring_window_s = 3; + float sampling_rate_s = 4; context.Timestamp start_timestamp = 5; // used when you want something like "get the samples since X date/time" context.Timestamp end_timestamp = 6; // used when you want something like "get the samples until X date/time" // Pending add field to reflect Available Device Protocols diff --git a/src/dbscanserving/client/DbscanServingClient.py b/src/dbscanserving/client/DbscanServingClient.py index 0458deeb7465c8149ad6195956893bf2f880f49c..fd2642d92b7e692f41f1f38d2a619e1d7027afd6 100644 --- a/src/dbscanserving/client/DbscanServingClient.py +++ b/src/dbscanserving/client/DbscanServingClient.py @@ -14,11 +14,13 @@ from email.policy import default import grpc, logging -from common.Settings import get_setting +from common.Settings import get_log_level, get_setting from common.tools.client.RetryDecorator import retry, delay_exponential from common.proto.dbscanserving_pb2 import DetectionRequest, DetectionResponse from common.proto.dbscanserving_pb2_grpc import DetectorStub +log_level = get_log_level() +logging.basicConfig(level=log_level) LOGGER = logging.getLogger(__name__) MAX_RETRIES = 15 DELAY_FUNCTION = delay_exponential(initial=0.01, increment=2.0, maximum=5.0) @@ -46,7 +48,10 @@ class DbscanServingClient: @RETRY_DECORATOR def Detect(self, request : DetectionRequest) -> DetectionResponse: - LOGGER.debug('Detect request') + LOGGER.debug('Detect request with {} samples and {} features'.format( + request.num_samples, + request.num_features + )) response = self.stub.Detect(request) LOGGER.debug('Detect result: {:s}'.format(str(response))) return response diff --git a/src/monitoring/service/__main__.py b/src/monitoring/service/__main__.py index e37412fa004704d089a8e00bada8033d8abe53bd..3334a860ccd94d51390ab5f5869d25e2475084ee 100644 --- a/src/monitoring/service/__main__.py +++ b/src/monitoring/service/__main__.py @@ -45,8 +45,8 @@ def start_monitoring(): # Create Monitor Kpi Requests monitor_kpi_request = monitoring_pb2.MonitorKpiRequest() monitor_kpi_request.kpi_id.CopyFrom(kpi_id) - monitor_kpi_request.sampling_duration_s = 86400 - monitor_kpi_request.sampling_interval_s = 30 + monitor_kpi_request.monitoring_window_s = 86400 + monitor_kpi_request.sampling_rate_s = 30 events_collector._monitoring_client.MonitorKpi(monitor_kpi_request) else: # Terminate is set, looping terminates diff --git a/src/opticalattackdetector/Config.py b/src/opticalattackdetector/Config.py index ddc2843a673183117f8af8e1b1fcad3b650c6aaf..1c356766d30f30b47ca99573a7171b824850ae03 100644 --- a/src/opticalattackdetector/Config.py +++ b/src/opticalattackdetector/Config.py @@ -22,17 +22,6 @@ GRPC_SERVICE_PORT = 10006 # service settings MONITORING_INTERVAL = 10 # monitoring interval in seconds -#TODO: adjust the addresses below for the specific case -MONITORING_SERVICE_ADDRESS = 'monitoringservice' # address/name of the monitoring service -# MONITORING_SERVICE_ADDRESS = '10.99.41.20' # address/name of the monitoring service -CONTEXT_SERVICE_ADDRESS = 'contextservice' # address/name of the monitoring service -# CONTEXT_SERVICE_ADDRESS = '10.107.199.65' # address/name of the monitoring service -SERVICE_SERVICE_ADDRESS = 'serviceservice' # address/name of the service service -# SERVICE_SERVICE_ADDRESS = '10.99.234.88' # address/name of the service service -# INFERENCE_SERVICE_ADDRESS = '10.108.113.78' # address/name of the inference service -INFERENCE_SERVICE_ADDRESS = 'dbscanservingservice' # address/name of the inference service -# ATTACK_MITIGATOR_SERVICE_ADDRESS = '10.96.248.167' -ATTACK_MITIGATOR_SERVICE_ADDRESS = 'opticalattackmitigatorservice' # Prometheus settings METRICS_PORT = 9192 diff --git a/src/opticalattackdetector/service/__main__.py b/src/opticalattackdetector/service/__main__.py index c0bea72ebc9d64618cc0caced378dbc390828351..75d170de8b1363d70f9041c26a7fb791be27f17e 100644 --- a/src/opticalattackdetector/service/__main__.py +++ b/src/opticalattackdetector/service/__main__.py @@ -18,6 +18,7 @@ from celery import Celery from common.Constants import DEFAULT_GRPC_MAX_WORKERS, DEFAULT_GRPC_GRACE_PERIOD from common.Settings import get_log_level, get_metrics_port, get_setting +from common.tools.timestamp.Converters import timestamp_utcnow_to_float from opticalattackdetector.Config import ( GRPC_SERVICE_PORT, MONITORING_INTERVAL) from common.proto.context_pb2 import (Empty, @@ -79,7 +80,6 @@ def main(): metrics_port = get_metrics_port() start_http_server(metrics_port) - dbscanserving_client: DbscanServingClient = DbscanServingClient() attack_mitigator_client: OpticalAttackMitigatorClient = OpticalAttackMitigatorClient() monitoring_client: MonitoringClient = MonitoringClient() @@ -95,12 +95,13 @@ def main(): LOGGER.info('Connecting with REDIS...') REDIS_PASSWORD = get_setting('REDIS_PASSWORD') REDIS_HOST = get_setting('CACHINGSERVICE_SERVICE_HOST') - REDIS_PORT = get_setting('CACHINGSERVICE_SERVICE_PORT_REDIS') + REDIS_PORT = get_setting('CACHINGSERVICE_SERVICE_PORT') BROKER_URL = f'redis://:{REDIS_PASSWORD}@{REDIS_HOST}:{REDIS_PORT}/0' + BACKEND_URL = f'redis://:{REDIS_PASSWORD}@{REDIS_HOST}:{REDIS_PORT}/1' app = Celery( 'cybersecurity', broker=BROKER_URL, - backend=BROKER_URL + backend=BACKEND_URL ) LOGGER.info('Connected to REDIS...') @@ -110,38 +111,44 @@ def main(): alien_samples = random.randint(2, 10) # run attack detection for every service request: DetectionRequest = DetectionRequest() - request.num_samples = 300 + alien_samples + request.num_samples = 200 + alien_samples request.num_features = 20 request.eps = 100.5 request.min_samples = 5 for _ in range(200): grpc_sample = Sample() - for __ in range(20): + for __ in range(request.num_features): grpc_sample.features.append(random.uniform(0., 10.)) request.samples.append(grpc_sample) - for _ in range(100): - grpc_sample = Sample() - for __ in range(20): - grpc_sample.features.append(random.uniform(50., 60.)) - request.samples.append(grpc_sample) + # for _ in range(100): + # grpc_sample = Sample() + # for __ in range(20): + # grpc_sample.features.append(random.uniform(50., 60.)) + # request.samples.append(grpc_sample) for _ in range(alien_samples): grpc_sample = Sample() - for __ in range(20): + for __ in range(request.num_features): grpc_sample.features.append(random.uniform(5000., 6000.)) request.samples.append(grpc_sample) - response: DetectionResponse = dbscanserving_client.Detect(request) + try: + dbscanserving_client: DbscanServingClient = DbscanServingClient() + response: DetectionResponse = dbscanserving_client.Detect(request) + dbscanserving_client.close() + except Exception as e: + LOGGER.exception(e) # including KPI kpi = Kpi() kpi.kpi_id.kpi_id.uuid = kpi_id - kpi.timestamp = Timestamp() - kpi.kpi_value.int32Val = response.cluster_indices[-1] - monitoring_client.IncludeKpi(kpi) - - if -1 in response.cluster_indices: # attack detected - attack = AttackDescription() - # attack.cs_id.uuid = service.service_id.service_uuid.uuid - response: AttackResponse = attack_mitigator_client.NotifyAttack(attack) + kpi.timestamp.timestamp = timestamp_utcnow_to_float() + # kpi.kpi_value.int32Val = response.cluster_indices[-1] + kpi.kpi_value.int32Val = 1 + # monitoring_client.IncludeKpi(kpi) + + # if -1 in response.cluster_indices: # attack detected + # attack = AttackDescription() + # # attack.cs_id.uuid = service.service_id.service_uuid.uuid + # response: AttackResponse = attack_mitigator_client.NotifyAttack(attack) return 0 app.worker_main([ diff --git a/src/opticalattackmanager/Dockerfile b/src/opticalattackmanager/Dockerfile index bbd680a5a4692178a1ee5121ce0fba9c9691270c..908c4893f5178fdb01bca48d54f7641a91ca08c6 100644 --- a/src/opticalattackmanager/Dockerfile +++ b/src/opticalattackmanager/Dockerfile @@ -16,9 +16,11 @@ FROM python:3.9-slim # Install dependencies RUN apt-get --yes --quiet --quiet update && \ - apt-get --yes --quiet --quiet install wget g++ && \ + apt-get --yes --quiet --quiet install wget g++ nano && \ rm -rf /var/lib/apt/lists/* +# TODO: remove nano from installation + # Set Python to show logs as they occur ENV PYTHONUNBUFFERED=0 ENV PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python diff --git a/src/opticalattackmanager/send_task.py b/src/opticalattackmanager/send_task.py new file mode 100644 index 0000000000000000000000000000000000000000..1cf25ffea728c14c48df11c6fae93d7e0bf46078 --- /dev/null +++ b/src/opticalattackmanager/send_task.py @@ -0,0 +1,47 @@ +from celery import Celery +import random +from common.Settings import get_log_level, get_metrics_port, get_setting +from common.proto.dbscanserving_pb2 import DetectionRequest, DetectionResponse, Sample +from dbscanserving.client.DbscanServingClient import DbscanServingClient + + +dbscanserving_client: DbscanServingClient = DbscanServingClient() + +alien_samples = random.randint(2, 20) + +request: DetectionRequest = DetectionRequest() +request.num_samples = 300 + alien_samples +request.num_features = 20 +request.eps = 100.5 +request.min_samples = 5 +for _ in range(200): + grpc_sample = Sample() + for __ in range(20): + grpc_sample.features.append(random.uniform(0., 10.)) + request.samples.append(grpc_sample) +for _ in range(100): + grpc_sample = Sample() + for __ in range(20): + grpc_sample.features.append(random.uniform(50., 60.)) + request.samples.append(grpc_sample) +for _ in range(alien_samples): + grpc_sample = Sample() + for __ in range(20): + grpc_sample.features.append(random.uniform(5000., 6000.)) + request.samples.append(grpc_sample) +response: DetectionResponse = dbscanserving_client.Detect(request) + +REDIS_PASSWORD = get_setting('REDIS_PASSWORD') +REDIS_HOST = get_setting('CACHINGSERVICE_SERVICE_HOST') +REDIS_PORT = get_setting('CACHINGSERVICE_SERVICE_PORT') +BROKER_URL = f'redis://:{REDIS_PASSWORD}@{REDIS_HOST}:{REDIS_PORT}/0' +app = Celery( + 'cybersecurity', + broker=BROKER_URL, + backend=BROKER_URL +) + +service = {'context': 'admin', 'service': '23bb5c96-e377-4943-a47a-4db9c54104cc', 'kpi': '1'} +result = app.send_task('detect_attack', (service['context'], service['service'], service['kpi'])) +print('waiting for result...') +print('Result:', result.get()) \ No newline at end of file diff --git a/src/opticalattackmanager/service/__main__.py b/src/opticalattackmanager/service/__main__.py index 3652022d67250b8ae3aeab89fdeadaf7c715635a..135cb257fe1194ad7d4e6fed9a7b412f5d7022d9 100644 --- a/src/opticalattackmanager/service/__main__.py +++ b/src/opticalattackmanager/service/__main__.py @@ -129,10 +129,11 @@ def main(): REDIS_HOST = get_setting('CACHINGSERVICE_SERVICE_HOST') REDIS_PORT = get_setting('CACHINGSERVICE_SERVICE_PORT_REDIS') BROKER_URL = f'redis://:{REDIS_PASSWORD}@{REDIS_HOST}:{REDIS_PORT}/0' + BACKEND_URL = f'redis://:{REDIS_PASSWORD}@{REDIS_HOST}:{REDIS_PORT}/1' app = Celery( 'cybersecurity', broker=BROKER_URL, - backend=BROKER_URL + backend=BACKEND_URL ) LOGGER.info('Connected to REDIS...')