Exemplo n.º 1
0
def getClient(findingArn: str):
    FindingId=findingArn.split("/")[3]
    DetectorId=findingArn.split("/")[1]
    targetAccount=findingArn.split("/")[0].split(":")[4]

    session=account_session.get_session(targetAccount, os.environ['TargetAccountSecurityRoleName']) 
    client = session.client('guardduty')
    return(client, DetectorId, FindingId) 
def lambda_handler(event, context):

    SecurityTagKey = os.environ['SecurityTagKey']
    TargetAccountSecurityRoleName = os.environ['TargetAccountSecurityRoleName']
    BlockPolicyArn = os.environ['BlockPolicyArn']

    if event['detail-type'] == "GuardDuty Finding":
        finding = event["detail"]
    elif event['detail-type'] == "Security Hub Findings - Custom Action":
        finding = security_hub.getFinding(event)

    else:
        raise Exception("Neither GuardDuty nor SecurityHub event")

    event_id = finding['id']
    targetAccount = finding["accountId"]
    principle_id = finding["resource"]["accessKeyDetails"]["userName"]
    principle_type = finding["resource"]["accessKeyDetails"]["userType"]

    session = account_session.get_session(
        targetAccount, os.environ['TargetAccountSecurityRoleName'])

    logger.info(
        f"GuardDuty Duty event {event_id} triggers checking principle {principle_type} of type {principle_type} in account {targetAccount}"
    )
    client = session.client('iam')

    if principle_type == "AssumedRole":
        response = client.get_role(RoleName=principle_id)

        if 'Tags' in response['Role']:
            for t in response['Role']['Tags']:
                if t['Key'] == SecurityTagKey:
                    logger.info(
                        f"Security exception defined with tag {SecurityTagKey}. Skipping blocking {principle_id} of type {principle_type} in account {targetAccount}"
                    )
                    return

        client.attach_role_policy(RoleName=principle_id,
                                  PolicyArn=BlockPolicyArn)
    else:
        response = client.get_user(UserName=principle_id)

        if 'Tags' in response['User']:
            for t in response['User']['Tags']:
                if t['Key'] == SecurityTagKey:
                    logger.info(
                        f"Security exception defined with tag {SecurityTagKey}. Skipping blocking {principle_id} of type {principle_type} in account {targetAccount}"
                    )
                    return
        client.attach_user_policy(UserName=principle_id,
                                  PolicyArn=BlockPolicyArn)

    guard_duty.archiveGuardDutyFinding(finding["arn"])

    notify.sendNotification(
        f"Attached deny policy to principle {principle_id} of type {principle_type} in account {targetAccount}. Guard Duty finding id {event_id} archived."
    )
Exemplo n.º 3
0
def lambda_handler(event, context):

    logger.info(f"recieved event: {json.dumps(event)}")

    SecurityTagKey = os.environ['SecurityTagKey']
    region = os.environ['AWS_REGION']
    targetAccount = event["account"]

    session = account_session.get_session(
        targetAccount, os.environ['TargetAccountSecurityRoleName'])

    # check for security exeption
    client = session.client('resourcegroupstaggingapi')
    paginator = client.get_paginator('get_resources')
    pages = paginator.paginate(TagFilters=[{
        'Key': SecurityTagKey,
    }],
                               ResourceTypeFilters=[event["resourseType"]])

    for page in pages:
        for res in page['ResourceTagMappingList']:
            if event["resourceId"] in res['ResourceARN']:
                logger.info(
                    f"Security exception defined with tag {SecurityTagKey}. Skipping {event['resourceId']} of type {event['resourseType']}"
                )
                return

    # execute automation
    if "AutomationDocumentName" in event:
        client = boto3.client('ssm')
        response = client.start_automation_execution(
            DocumentName=event['AutomationDocumentName'],
            Parameters=event['AutomationParameters'],
            TargetLocations=[{
                "Accounts": [targetAccount],
                "Regions": [region]
            }])

        notify.sendNotification(
            f"Triggered incident response in account {event['account']}, SSM document {event['AutomationDocumentName']} with id {response['AutomationExecutionId']} and input parameters "
            + json.dumps(event['AutomationParameters']))
def lambda_handler(event, context):
    
    AllowedNetworkRangeIPv4=os.environ['AllowedNetworkRangeIPv4']
    AllowedNetworkRangeIPv6=os.environ['AllowedNetworkRangeIPv6']
    SecurityTagKey=os.environ['SecurityTagKey']

    if event['source'] == "aws.config":
             sg_id=event["detail"]["resourceId"]
             targetAccount=event["account"]
    else: 
        raise Exception('Unknown event source. Supported only aws.config')
    
    session=account_session.get_session(targetAccount, os.environ['TargetAccountSecurityRoleName']) 
    
    logger.info(f"Checking security group {sg_id} in account {targetAccount}")
    client = session.client('ec2')
    response = client.describe_security_groups(GroupIds=[ sg_id ])
    
    if "Tags" in response['SecurityGroups'][0]:    
         for t in response['SecurityGroups'][0]['Tags']:
             if t['Key'] == SecurityTagKey:
                 logger.info(f"Security exception defined with tag {SecurityTagKey}. Skipping security group {sg_id} to confine") 
                 return
    
    for p in response['SecurityGroups'][0]['IpPermissions']:
        for r in p['IpRanges']:
            if r["CidrIp"] == "0.0.0.0/0":
                client.revoke_security_group_ingress(IpPermissions=[p], GroupId=sg_id)
                r["CidrIp"]=AllowedNetworkRangeIPv4
                client.authorize_security_group_ingress(IpPermissions=[p], GroupId=sg_id)
        for r in p['Ipv6Ranges']:
            if r["CidrIpv6"] == "::/0":
                client.revoke_security_group_ingress(IpPermissions=[p], GroupId=sg_id)
                r["CidrIpv6"]=AllowedNetworkRangeIPv6
                client.authorize_security_group_ingress(IpPermissions=[p], GroupId=sg_id)
    
    notify.sendNotification(f"Confined security group {sg_id} in account id {targetAccount} to safe CIDR")
def lambda_handler(event, context):

    SecurityTagKey = os.environ['SecurityTagKey']
    TargetAccountSecurityRoleName = os.environ['TargetAccountSecurityRoleName']

    if event['detail-type'] == "GuardDuty Finding":
        finding = event["detail"]
    elif event['detail-type'] == "Security Hub Findings - Custom Action":
        finding = security_hub.getFinding(event)

    else:
        raise Exception("Neither GuardDuty nor SecurityHub event")

    i_id = finding["resource"]["instanceDetails"]["instanceId"]
    targetAccount = finding["accountId"]
    event_id = finding['id']

    logger.info(
        f"GuardDuty Duty event {event_id} triggers checking instance {i_id} in account {targetAccount}"
    )

    session = account_session.get_session(
        targetAccount, os.environ['TargetAccountSecurityRoleName'])

    client = session.client('ec2')
    ec2 = client.describe_instances(InstanceIds=[i_id])
    if "Tags" in ec2['Reservations'][0]['Instances'][0]:
        for t in ec2['Reservations'][0]['Instances'][0]["Tags"]:
            if t['Key'] == SecurityTagKey:
                logger.info(
                    f"Security exception defined with tag {SecurityTagKey}. Skipping Isolation of instance {i_id} in account {targetAccount}"
                )
                return

    secGrName = f"secIsolation-{event_id}"
    vpcID = ec2['Reservations'][0]['Instances'][0]["VpcId"]
    # Check if isolation security group already exists
    try:
        r = client.describe_security_groups(Filters=[{
            'Name': 'group-name',
            'Values': [secGrName]
        }, {
            'Name': 'vpc-id',
            'Values': [vpcID]
        }])
        secGrId = r['SecurityGroups'][0]['GroupId']
        logger.info(f'Found existing isolation Sec Group {secGrId}')
    except:
        r = client.create_security_group(Description='security isolation',
                                         GroupName=secGrName,
                                         VpcId=vpcID)
        secGrId = r['GroupId']
        client.revoke_security_group_egress(IpPermissions=[{
            "IpProtocol":
            "-1",
            "IpRanges": [{
                "CidrIp": "0.0.0.0/0"
            }],
            "Ipv6Ranges": [],
            "PrefixListIds": [],
            "UserIdGroupPairs": []
        }],
                                            GroupId=secGrId)
        logger.info(f'Created new isolation Sec Group {secGrId}')

    for eni in ec2['Reservations'][0]['Instances'][0]['NetworkInterfaces']:
        client.modify_network_interface_attribute(
            NetworkInterfaceId=eni["NetworkInterfaceId"], Groups=[secGrId])

    guard_duty.archiveGuardDutyFinding(finding["arn"])

    notify.sendNotification(
        f"Isolation security group {secGrId} created and attached to instance {i_id} in account {targetAccount}. Guard Duty finding id {event_id} archived"
    )