如何保护 AWS 后端上具有不同访问需求的两个微前端

Microfrontend

平衡 AWS 微前端架构中的安全性和可访问性

设计安全且可扩展的云架构通常涉及平衡可访问性和受限访问。在您的 AWS 设置中,您有两个具有独特访问要求的微前端。 FE-A 需要限制为特定的静态 IP,而 FE-B 应可公开访问。同时满足这些需求可能会带来挑战。 😅

在 EC2 中配置安全组时会出现挑战。如果您允许访问 0.0.0.0,则两个前端都可以公开访问,从而损害 FE-A 的安全性。另一方面,限制对单个静态 IP 的访问会拒绝 FE-B 的公共可用性。这在开放性和安全性之间产生了复杂的平衡行为。

虽然动态更新 IP 范围的 Lambda 函数似乎可行,但它会带来额外的开销,并且不是最佳的长期解决方案。例如,随着时间的推移,它可能会增加成本和复杂性。此外,管理安全组的频繁更新可能很麻烦且容易出错。

找到满足这些要求的经济高效的解决方案至关重要。目标是保护 FE-A,同时确保 FE-B 在全球范围内保持可访问性,而不会引入不必要的复杂性。让我们探讨如何使用 AWS 最佳实践来实现这一目标。 🚀

命令 使用示例
waf_client.create_web_acl 此命令用于在 AWS 中创建 Web 应用程序防火墙 (WAF) WebACL。它有助于定义规则和操作,用于根据 IP 地址或其他条件控制对应用程序负载均衡器等资源的访问。
waf_client.associate_web_acl 将 WebACL 与特定 AWS 资源(例如 Application Load Balancer)关联。这会将定义的访问规则链接到资源以进行强制执行。
ec2.authorize_security_group_ingress 向 AWS EC2 中安全组的入口(入站流量)规则添加新规则。此命令定义用于访问关联资源的允许的 IP 范围和协议。
requests.get 从指定的 URL 获取数据。在此上下文中,它检索包含 AWS IP 范围的 JSON 数据以动态配置安全组规则。
patch 来自 Python 的 unittest.mock 库的装饰器,用于在测试期间用模拟对象替换代码中的真实对象。这可确保测试独立运行,而无需进行实际的 AWS API 调用。
VisibilityConfig WAF WebACL 创建过程中的参数。它配置监控和指标选项,例如启用 CloudWatch 指标和采样请求。
IPSetReferenceStatement 在 WAF 规则中用于引用预定义的 IPSet。这有助于根据规则配置指定允许或阻止哪些 IP 地址或范围。
unittest.TestCase Python 单元测试库的一部分。它是创建新单元测试的基类,支持对代码各个部分进行结构化测试。
SampledRequestsEnabled WAF 规则中的一种设置,允许捕获与规则匹配的请求样本以进行分析。这有助于调试和优化规则配置。
DefaultAction 指定当请求与 WebACL 中的任何规则都不匹配时要采取的操作(例如,允许或阻止)。这确保了不匹配流量的回退行为。

使用 AWS 保护微前端的策略

第一个脚本利用 AWS Web 应用程序防火墙的功能 ()为两个微前端实施不同的访问策略。通过创建 WebACL,特定的 IP 规则将应用于 FE-A,以仅允许来自指定的流量 ,确保它仍然是一个封闭的系统。对于 FE-B,有单独的规则允许公共访问。这种方法将访问控制集中在应用程序层,非常适合在不修改底层 EC2 安全组的情况下有效管理流量。例如,您可以将 FE-A 限制为办公网络,同时允许 FE-B 保持全局可访问性,从而满足公司安全性和用户便利性。 🌍

然后,WebACL 与应用程序负载均衡器 (ALB) 关联,确保根据这些规则过滤通过 ALB 的所有流量。命令 是定义规则的关键,同时 将 WebACL 链接到资源。此设置具有高度可扩展性,并且允许将来进行调整,例如以最小的努力添加新 IP 或修改访问策略。 CloudWatch 指标等监控功能还可以跟踪规则的有效性,从而提供有关流量模式的宝贵见解。

相比之下,基于 Lambda 的解决方案会动态更新 EC2 安全组规则。此脚本获取特定于您的 AWS 区域的 IP 范围,并将它们配置为安全组中的入口规则。功能 添加或更新允许的 IP 范围,使 FE-B 能够公开访问,同时保持对 FE-A 的严格控制。这种方法在 IP 要求频繁变化的环境中特别有用,例如基于云的开发设置或不断变化的公司办公室。例如,如果新设立分支机构,您可以自动将其IP添加到白名单中,无需人工干预。 🏢

Lambda 函数与计划的 CloudWatch 事件相结合,每天自动执行这些更新,从而减少管理开销。虽然这种方法增加了复杂性,但它提供了对流量的细粒度控制。脚本中包含的单元测试验证功能,确保正确应用安全规则而不会引入错误。无论您选择 WAF 还是 Lambda,这两种方法都优先考虑成本效率和灵活性,平衡公共访问和受限访问的需求。最终,这些解决方案展示了 AWS 在满足不同需求同时保持强大安全性方面的多功能性。 🔒

保护具有不同访问要求的两个微前端的 AWS 后端

方法 1:使用 AWS WAF(Web 应用程序防火墙)和安全组进行访问控制

# Step 1: Define IP restrictions in AWS WAF
# Create a WebACL to allow only specific IP ranges for FE-A and public access for FE-B.
import boto3
waf_client = boto3.client('wafv2')
response = waf_client.create_web_acl(    Name='MicroFrontendAccessControl',    Scope='REGIONAL',    DefaultAction={'Allow': {}},    Rules=[        {            'Name': 'AllowSpecificIPForFEA',            'Priority': 1,            'Action': {'Allow': {}},            'Statement': {                'IPSetReferenceStatement': {                    'ARN': 'arn:aws:wafv2:region:account-id:ipset/ipset-id'                }            },            'VisibilityConfig': {                'SampledRequestsEnabled': True,                'CloudWatchMetricsEnabled': True,                'MetricName': 'AllowSpecificIPForFEA'            }        },        {            'Name': 'AllowPublicAccessForFEB',            'Priority': 2,            'Action': {'Allow': {}},            'Statement': {'IPSetReferenceStatement': {'ARN': 'arn:aws:wafv2:region:account-id:ipset/ipset-id-for-public'}},            'VisibilityConfig': {                'SampledRequestsEnabled': True,                'CloudWatchMetricsEnabled': True,                'MetricName': 'AllowPublicAccessForFEB'            }        }    ],    VisibilityConfig={        'SampledRequestsEnabled': True,        'CloudWatchMetricsEnabled': True,        'MetricName': 'MicroFrontendAccessControl'    })
print("WebACL created:", response)
# Step 2: Associate the WebACL with your Application Load Balancer
response = waf_client.associate_web_acl(    WebACLArn='arn:aws:wafv2:region:account-id:webacl/webacl-id',    ResourceArn='arn:aws:elasticloadbalancing:region:account-id:loadbalancer/app/load-balancer-name')
print("WebACL associated with Load Balancer:", response)

使用 Lambda 函数进行动态更新来保护访问

方法 2:使用 Lambda 函数动态更新安全组

# Import required modules
import boto3
import requests
# Step 1: Fetch public IP ranges for your region
def get_ip_ranges(region):
    response = requests.get("https://ip-ranges.amazonaws.com/ip-ranges.json")
    ip_ranges = response.json()["prefixes"]
    return [prefix["ip_prefix"] for prefix in ip_ranges if prefix["region"] == region]
# Step 2: Update the security group
def update_security_group(security_group_id, ip_ranges):
    ec2 = boto3.client('ec2')
    permissions = [{"IpProtocol": "tcp", "FromPort": 80, "ToPort": 80, "IpRanges": [{"CidrIp": ip} for ip in ip_ranges]}]
    ec2.authorize_security_group_ingress(GroupId=security_group_id, IpPermissions=permissions)
# Step 3: Lambda handler
def lambda_handler(event, context):
    region = "us-west-2"
    security_group_id = "sg-0123456789abcdef0"
    ip_ranges = get_ip_ranges(region)
    update_security_group(security_group_id, ip_ranges)
    return {"statusCode": 200, "body": "Security group updated successfully"}

使用单元测试验证配置

方法 3:为 Lambda 函数和 WebACL 配置添加单元测试

import unittest
from unittest.mock import patch
class TestSecurityConfigurations(unittest.TestCase):
    @patch("boto3.client")
    def test_update_security_group(self, mock_boto3):
        mock_ec2 = mock_boto3.return_value
        ip_ranges = ["192.168.0.0/24", "203.0.113.0/24"]
        update_security_group("sg-0123456789abcdef0", ip_ranges)
        mock_ec2.authorize_security_group_ingress.assert_called()
    def test_get_ip_ranges(self):
        region = "us-west-2"
        ip_ranges = get_ip_ranges(region)
        self.assertIsInstance(ip_ranges, list)
if __name__ == "__main__":
    unittest.main()

优化 AWS 中微前端应用程序的安全性和可访问性

解决微前端架构中平衡受限访问和公共访问挑战的另一种有效方法是利用 AWS Amplify 的集成功能。 Amplify 简化了托管和部署,同时提供了安全配置后端 API 的工具。对于 FE-A,您可以通过使用 AWS API Gateway 将其后端 API 终端节点限制为特定 IP 来实施网络访问控制。此设置确保只有预定义的静态 IP 才能与后端交互,而 FE-B 的端点可以不受公共访问限制。这不仅增强了安全性,而且还与 Amplify 的 CI/CD 工作流程无缝集成。 🌐

另一个考虑因素是将 Amazon CloudFront 与自定义源访问策略结合使用。 CloudFront 可以根据 URL 路径将流量路由到适当的后端,充当微前端的看门人。可以使用检查 IP 限制或特定标头的源请求策略通过 CloudFront 过滤 FE-A 流量。例如,通过 FE-A 部署内部工具的企业可以添加 IP 范围过滤器,同时使 FE-B 在全球范围内可供最终用户使用。这种方法优化了可扩展性和性能,特别是对于需要全球分发的应用程序。 🚀

最后,实施 AWS Cognito 进行用户身份验证增加了额外的安全层。 FE-A 可以锁定在需要特定角色或组的用户身份验证的登录系统后面,而 FE-B 可以使用较轻的身份验证机制或根本不使用身份验证机制来进行公共访问。通过结合身份验证和网络访问限制,您可以实现针对每个微前端的需求量身定制的强大安全模型。该策略对于寻求经济实惠、可扩展且安全的云解决方案的初创公司和中小企业特别有效。 🔐

  1. 如何限制特定 IP 对 API 端点的访问?
  2. 使用 定义端点允许的 IP 范围。
  3. 确保前端全球可用性的最佳方法是什么?
  4. 部署它使用 使用 Amazon CloudFront 作为内容交付网络。
  5. 我可以为动态环境自动更新 IP 吗?
  6. 是的,使用 在安全组或 WAF 规则中动态获取和更新 IP 范围。
  7. 是否可以在不影响 FE-B 公共访问的情况下保护 FE-A 的安全?
  8. 结合 FE-A 的规则和 FE-B 的无限制安全组设置。
  9. AWS Cognito 如何增强微前端安全性?
  10. AWS Cognito 管理用户身份验证并允许对特定前端进行基于角色的访问。

确保微前端后端的安全需要采用量身定制的方法。 AWS 提供了 WAF、API Gateway 和 CloudFront 等多种工具,可以帮助有效管理流量。 FE-A 的 IP 过滤和 FE-B 的开放访问等配置对于平衡可访问性和安全性至关重要。这些工具使该过程无缝且可靠。 🔐

使用自动化方法(例如用于动态 IP 管理的 Lambda 函数)可以进一步提高灵活性,同时控制成本。将网络级安全性与应用程序层措施相结合,可确保提供适合各种规模企业的强大解决方案。这使您能够在不影响用户体验的情况下实现优化的后端安全性。 🌟

  1. 通过访问官方 AWS 文档了解有关 AWS Web 应用程序防火墙 (WAF) 的更多信息: AWS 网络应用防火墙
  2. 在 AWS 指南中探索如何配置用于 IP 过滤的 API Gateway 资源策略: API网关资源策略
  3. 要了解 Amazon CloudFront 安全内容交付的功能,请访问: 亚马逊云前
  4. 在 AWS Lambda 文档中了解如何使用 Lambda 自动执行 IP 更新: AWS Lambda
  5. 有关使用安全组保护 EC2 实例的更多信息,请参阅: EC2 安全组