亚马逊AWS官方博客

使用 FortiGate 和 Amazon Lambda 自动隔离失陷主机

传统情况下,云上部署的第三方防火墙只能控制互联网方向或者 VPC 层面的流量,无法控制子网级别或者 EC2 之间的访问。一旦 EC2 被入侵或者植入病毒,又没有及时进行隔离,则很有可能波及同子网或同 VPC 的其他 EC2。通过本文您将了解到,如何使用与亚马逊云科技服务深度集成的 FortiGate 遇到此情况时可采取的操作:通过 Amazon Lambda 修改 EC2 的安全组实现免装 Agent 的 EC2“微隔离”,以免 EC2 中病毒或被控制后影响其他 EC2。

在本文中,除 FortiGate 外,我们会涉及如下亚马逊云科技服务:Amazon Lambda,Amazon API Gateway,Security Group。

在环境中,我们有两台部署在同一子网的业务 EC2 和一台 FortiGate 作为安全网关。现在我们先来创建一个修改安全组的 Lambda Function,命名为 ChangeSG,使用语言为 Python:

点击创建 Function 之后,我们需要调整 Lambda 的 Permission,如下图点击 Configuration:

在 Configuration 中找到 Permission 页签,会看到刚创建的 ChangeSG Lambda Role,点击这个 Role Name:

点击 Role Name 后会进入到 IAM 界面,进行 Permission 配置,点击 Policy Name 中的条目,并点击编辑就开始编辑 Role Policy 了。

在 Policy 中,增加如下代码段并保存:

{
			"Effect": "Allow",
			"Action": [
				"ec2:DescribeInstances",
				"ec2:ModifyInstanceAttribute",
				"ec2:DescribeSecurityGroups"
			],
			"Resource": "*"
		}

之后回到 Lambda 配置页,代码页签,移除默认代码,替换为如下代码并如下图所示,并点击 Deploy 部署代码:

import json
import boto3


ec2 = boto3.client('ec2')
ec2_resource = boto3.resource('ec2')


def lambda_handler(event, context):
    print(event)
    client_ip = event['multiValueHeaders']['srcip']
    group_name = event['multiValueHeaders']['sgname']
    
    response = ec2.describe_instances(
        Filters=[
            {
                'Name': 'private-ip-address', 
                'Values': client_ip,
            },
        ]
    )
    
    instance_id = (response['Reservations'][0]['Instances'][0]['InstanceId'])
    vpc_id = (response['Reservations'][0]['Instances'][0]['VpcId'])


    response = ec2.describe_security_groups(
        Filters=[
            {
                'Name': 'group-name',
                'Values': group_name,
            },
            {
                'Name': 'vpc-id',
                'Values': [vpc_id],
            },
        ]
    )
    group_id = response['SecurityGroups'][0]['GroupId']


    result = ec2_resource.Instance(instance_id).modify_attribute(Groups=[group_id]) 
    return {
        'statusCode': 200,
        'body': json.dumps('OK')
    }

这样 Lambda 功能代码就完成了,下一步创建一个触发器来调用 Lambda:

触发器类型为 API Gateway,创建一个新 API,类型为 REST,安全方式为 API Key:

点击添加后,我们可以看到创建好的 API Gateway:

此时这个 API Gateway 是公共访问的,确保安全和隐私,且只能由 FortiGate 调用,我们需要调整这个 API Gateway 的访问设置,将 Endpoint Type 从默认的 Regional 调整为 Private,如下图所示:

保存后,我们进入 Resource Policy,添加如下代码:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:your-aws-region:your-aws-account-number:your-API-ID/*",
            "Condition": {
                "StringEquals": {
                    "aws:sourceVpce": "your-vpc-endpoint-id"
                }
            }
        }
    ]
}

注意,这里需要将上图红框中的 your 位置改为实际 region,account,API-ID 和 Endpoint-ID。之后,我们为 ChangeSG-API 创建一个 Usage Plan 并与该 API 进行关联,并创建一个 API Key:

创建好 Lambda 和 API Gateway 之后,我们回到 EC2 配置中,创建一个安全组配置,用来在出现安全事件时隔离失陷主机。

这里我们创建一个名为 sg_no_access 的安全组,并移除所有的 Inbound 和 outbound 规则,一旦这个安全组被调用关联,则该 EC2 将无法接收和发送任何流量。

下面我们到 FortiGate 中进行安全自动化的配置。假设的场景是一旦 FortiGate 检测到病毒,则调用 Lambda 变更 EC2 的安全组配置为 sg_no_access。

在 FortiGate 中,我们在左边栏的 Security Fabric-Automation 配置中,创建一个新的自动化插件:

自动化插件命名为 Change-SG,添加一个触发器(Virus Log)

为触发器添加一个执行动作,选择 AWS Lambda

在 AWS Lambda 中将相关的 API 配置信息(URL 和 Key)填入,并填写 HTTP Header:

Srcip:%%log.srcip%% // 产生日志的源 IP

Sgname:sg_no_access //调用 sg_no_access 安全组

创建好后我们在 Add Action 处选择 API-ChangeSG 并保存。

现在我们使用其中一台 EC2 测试连通性,并访问 eicar 下载一个病毒样本。可以看到可以访问,但是下载被阻断了。

我们到 FortiGate 中查看安全事件日志,可以看到该下载行为已被阻断:

并且,在自动化插件页面,我们看到 ChangeSG 被触发了一次。

我们回到 EC2 CLI 尝试对外访问:ping 8.8.8.8 和再次执行下载动作,发现均无响应。与此同时,我们使用同子网另一台 EC2 ping 该主机也无响应。符合安全组变更的预期效果。

最后,我们希望对相关事件通过 Teams 进行告警,在 Teams 中我们创建一个 Incoming Webhook,并在 FortiGate 上的 Change-SG 自动化插件中添加一个 Teams 通知动作,填写相关 Webhook 信息(URL 和 Message)。

我们通过另一台可以联网的 EC2 再次执行病毒下载动作后,在 Teams 中收到了相关告警。

通过本示例,可以看到 FortiGate 与亚马逊云科技服务的深度集成带来的安全自动化价值。可以为用户提供实时威胁防御与告警。用户可以为安全自动化添加更多触发条件,比如针对防火墙暴力破解的 IP 隔离,EC2 对外 DNS 请求安全监控与自动隔离,针对 EC2 的入侵检测与攻击 IP 自动阻断等等场景,都可以成为本实例的延展用例。

此外,您可以在亚马逊云科技 Marketplace 中订阅并采购 FortiGate:

BYOL(Graviton):FortiGate Next-Generation Firewall (ARM64/Graviton)

BYOL:FortiGate Next-Generation Firewall (BYOL)

PAYG:FortiGate Next-Generation Firewall (PAYG)

本篇作者

岑义涛

Fortinet 亚太区产品市场总监,亚马逊云科技大使。10 年以上企业级网络安全和云服务经验。在云、网、安全融合方面有丰富的规划与实践经验。

张元涛

亚马逊云科技高级架构师。负责亚马逊云科技合作伙伴相关解决方案的建设以及合作伙伴生态合作。与合作伙伴一起,根据客户需求,分析其在技术架构层面所遇到的挑战和未来的方向,设计和落地基于亚马逊云科技平台和合作伙伴产品的架构方案。曾在知名外企以及国内领导企业任解决方案架构师。在云以及网络等领域有丰富的经验,对于公有云服务以及架构有深入的理解。