dominusceo

Seding OCI Wag Edge logs to specific bucket

Jul 21st, 2025 (edited)
245
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.16 KB | Source Code | 0 0
  1. ## Goal: Send logs from OCI WAF Edge to specific bucket
  2. ## Autor: Ricardo Carrillo <[email protected]>
  3. ## Based on the architecture available on https://docs.oracle.com/en/solutions/ingest-oci-waf-logs--func-events/index.html#GUID-27D34D72-8E5A-4D09-A968-A4059906A991
  4. import oci
  5. import sys
  6. import json
  7. from oci.signer import Signer
  8. from datetime import datetime, timedelta
  9. from urllib.parse import urlencode
  10.  
  11. VALID_LOG_TYPES = {"ACCESS", "DETECT", "BLOCK"}
  12.  
  13. def get_waf_edge_logs_and_upload(region, waf_policy_ocid, compartment_ocid, log_type,
  14.                                   webapp_domain, bucket_name, namespace, custom_endpoint):
  15.  
  16.     if log_type.upper() not in VALID_LOG_TYPES:
  17.         print(json.dumps({
  18.             "error": "Invalid log type",
  19.             "valid_values": list(VALID_LOG_TYPES)
  20.         }, indent=2))
  21.         sys.exit(1)
  22.  
  23.     config = oci.config.from_file()
  24.     config["region"] = region
  25.  
  26.     signer = Signer(
  27.         tenancy=config["tenancy"],
  28.         user=config["user"],
  29.         fingerprint=config["fingerprint"],
  30.         private_key_file_location=config["key_file"],
  31.         pass_phrase=config.get("pass_phrase")
  32.     )
  33.  
  34.     ## Obtener los logs desde WAF Edge
  35.     base_endpoint = f"https://waas.{region}.oraclecloud.com"
  36.     resource_path = f"/20181116/waasPolicies/{waf_policy_ocid}/wafLogs"
  37.     now = datetime.utcnow()
  38.     today = datetime.utcnow().date()
  39.     yesterday = today - timedelta(days=1)
  40.     time_start = datetime.combine(yesterday, datetime.min.time()).isoformat() + "Z"
  41.     time_end = datetime.combine(today, datetime.min.time()).isoformat() + "Z"
  42.  
  43.     query_params = {
  44.         "logType": log_type.upper(),
  45.         "timeObservedGreaterThanOrEqualTo": time_start,
  46.         "timeObservedLessThan": time_end,
  47.         "compartmentId": compartment_ocid
  48.     }
  49.  
  50.     query_string = urlencode(query_params)
  51.     full_url = f"{base_endpoint}{resource_path}?{query_string}"
  52.  
  53.     session = oci._vendor.requests.Session()
  54.     response = session.get(full_url, auth=signer)
  55.  
  56.     if response.status_code != 200:
  57.         print(json.dumps({
  58.             "error": f"HTTP {response.status_code}",
  59.             "details": response.text
  60.         }, indent=2))
  61.         return
  62.  
  63.     logs = response.json()
  64.     json_data = json.dumps(logs, indent=2)
  65.  
  66.     ## Formato del prefijo: webapp_domain/YYYY/MM/DD/
  67.     prefix = f"{webapp_domain}/{now.strftime('%Y')}/{now.strftime('%m')}/{now.strftime('%d')}"
  68.     filename = f"{log_type.lower()}-logs-{now.strftime('%Y%m%dT%H%M%S')}.json"
  69.     object_name = f"{prefix}/{filename}"
  70.  
  71.     ## Subir al bucket
  72.     object_storage_client = oci.object_storage.ObjectStorageClient(config, signer=signer)
  73.     object_storage_client.base_client.endpoint = custom_endpoint
  74.  
  75.     put_resp = object_storage_client.put_object(
  76.         namespace_name=namespace,
  77.         bucket_name=bucket_name,
  78.         object_name=object_name,
  79.         put_object_body=json_data.encode("utf-8"),
  80.         content_type="application/json"
  81.     )
  82.  
  83.     print(json.dumps({
  84.         "message": "Logs subidos correctamente",
  85.         "bucket": bucket_name,
  86.         "object_name": object_name,
  87.         "etag": put_resp.headers.get("etag"),
  88.         "url": f"{custom_endpoint}/n/{namespace}/b/{bucket_name}/o/{object_name.replace('/', '%2F')}"
  89.     }, indent=2))
  90.  
  91. if __name__ == "__main__":
  92.     if len(sys.argv) != 8:
  93.         print("Uso:")
  94.         print("python get_waf_edge_logs_upload_custom.py <region> <waf_policy_ocid> <compartment_ocid> <log_type> <webapp_domain> <bucket_name> <namespace>")
  95.         print("Ejemplo:")
  96.         print("python get_waf_edge_logs_upload_custom.py eu-frankfurt-1 ocid1.waaspolicy... ocid1.compartment... ACCESS mywebapp mybucket mynamespace")
  97.         sys.exit(1)
  98.  
  99.     region = sys.argv[1]
  100.     waf_ocid = sys.argv[2]
  101.     compartment_ocid = sys.argv[3]
  102.     log_type = sys.argv[4]
  103.     webapp_domain = sys.argv[5]
  104.     bucket_name = sys.argv[6]
  105.     namespace = sys.argv[7]
  106.     custom_endpoint = f"https://objectstorage.{region}.oraclecloud.com"
  107.  
  108.     get_waf_edge_logs_and_upload(region, waf_ocid, compartment_ocid, log_type,
  109.                                   webapp_domain, bucket_name, namespace, custom_endpoint)
  110.  
Advertisement
Add Comment
Please, Sign In to add comment