Advertisement
Guest User

Untitled

a guest
Jan 29th, 2020
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.20 KB | None | 0 0
  1. #!/usr/bin/env python
  2.  
  3. import boto3
  4. import datadog
  5. from dictdiffer import diff
  6. import deepdiff
  7. import json
  8. import pyjq
  9. import os
  10.  
  11. session = boto3.Session(
  12.   aws_access_key_id=AWS_ACCESS_KEY_ID,
  13.   aws_secret_access_key=AWS_SECRET_ACCESS_KEY
  14.   )
  15.  
  16. s3_client = session.client('s3')
  17. ecr_client = session.client('ecr')
  18.  
  19. bucket_name = os.environ['S3_BUCKET_NAME']
  20. registry_id = os.environ['ECR_REGISTRY_ID']
  21.  
  22. def json_dumps(reponse):
  23.   return json.dumps(reponse, indent=4, sort_keys=True, default=str)
  24.  
  25. def get_latest_image(repository):
  26.   images= ecr_client.describe_images(repositoryName=repository, maxResults=1000)
  27.   images_sorted = sorted(images['imageDetails'], key = lambda i: i['imagePushedAt'], reverse=True)
  28.   image_digest = images_sorted[0].get('imageDigest')
  29.  
  30.   return image_digest
  31.  
  32. def notify_datadog(repository, differences):
  33.   print('Notifying Datadog...')
  34.  
  35.   datadog_api_key = environ.get('DATADOG_API_KEY')
  36.  
  37.   if env == 'prod':
  38.     notification_mentions = '@slack-sunco-infra-notifs'
  39.   else:
  40.     notification_mentions = '@slack-datadog_integration_test'
  41.  
  42.   payload = {
  43.     'title': 'New vulnerabilies in ECR images',
  44.     'text': f'{notification_mentions} New vulnerability on last image in repository {repository}.\n'
  45.             f'Here are the new vulnerabilites:{differences}',
  46.     'priority': 'normal',
  47.     'alert_type': 'info'
  48.   }
  49.  
  50.   datadog.initialize(api_key=datadog_api_key)
  51.   event = datadog.api.Event.create(**payload)
  52.   print(event)
  53.  
  54. # Get the descriptions of all repositories in ECR
  55. repositories_description = json_dumps(ecr_client.describe_repositories())
  56.  
  57. # Get a list of all the repositories names
  58. repositories = pyjq.all('.repositories[] | .repositoryName', json.loads(repositories_description))
  59.  
  60. # Retreive scan findings reports for every repositories with a latest image scan findings
  61. for repository in repositories:
  62.   image_digest = get_latest_image(repository)
  63.  
  64.   try:
  65.     scan_description = ecr_client.describe_image_scan_findings(
  66.       registryId=registry_id,
  67.       repositoryName=repository,
  68.       imageId={
  69.         'imageDigest': image_digest
  70.       }
  71.     )
  72.  
  73.   # Continue to next iteration if an image as no scan yet
  74.   # TODO: If no scans, scan the image
  75.   except:
  76.     continue
  77.  
  78.   # Upload scan report to S3 bucket with only findings data
  79.   file_name = f"{repository}_scan_report.json"
  80.   scan_json = json_dumps(scan_description)
  81.   scan_findings = pyjq.all('.imageScanFindings | .findings[]', json.loads(scan_json))
  82.   s3_client.put_object(Bucket=bucket_name, Body=json.dumps(scan_findings), Key=file_name)
  83.  
  84.  
  85.   # Get last two versions of the scan (newly uploaded and last one)
  86.   versions = json_dumps(s3_client.list_object_versions(Bucket=bucket_name, Prefix=file_name, Delimiter="2"))
  87.   v1 = pyjq.first('.["Versions"][0]["VersionId"]', json.loads(versions))
  88.   v2 = pyjq.first('.["Versions"][1]["VersionId"]', json.loads(versions))
  89.  
  90.   # Download scan report from version 1 and version 2
  91.   scan_v1 = s3_client.get_object(Bucket=bucket_name, Key=file_name, VersionId=v1)
  92.   scan_v2 = s3_client.get_object(Bucket=bucket_name, Key=file_name, VersionId=v2)
  93.  
  94.   print(json.loads(scan_v1['Body'].read()))
  95.   # Compare the both file versions to trigger alert
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement