AWS バックエンドで異なるアクセスニーズを持つ 2 つのマイクロフロントエンドを保護する方法

AWS バックエンドで異なるアクセスニーズを持つ 2 つのマイクロフロントエンドを保護する方法
AWS バックエンドで異なるアクセスニーズを持つ 2 つのマイクロフロントエンドを保護する方法

AWS マイクロフロントエンド アーキテクチャにおけるセキュリティとアクセシビリティのバランス

安全でスケーラブルなクラウド アーキテクチャの設計には、多くの場合、アクセシビリティとアクセス制限のバランスが必要になります。 AWS セットアップには、独自のアクセス要件を持つ 2 つのマイクロフロントエンドがあります。 FE-A は特定の静的 IP に制限する必要がありますが、FE-B はパブリックにアクセスできる必要があります。これらのニーズに同時に対処することは課題となる可能性があります。 😅

EC2 でセキュリティ グループを構成するときに問題が発生します。 0.0.0.0 へのアクセスを許可すると、両方のフロントエンドがパブリックにアクセスできるようになり、FE-A のセキュリティが危険にさらされます。一方、単一の静的 IP へのアクセスを制限すると、FE-B のパブリック アベイラビリティが拒否されます。これにより、オープン性とセキュリティの間で複雑なバランスをとる必要があります。

IP 範囲を動的に更新する Lambda 関数は実行可能に思えるかもしれませんが、追加のオーバーヘッドが発生するため、長期的な最適なソリューションではありません。たとえば、時間の経過とともにコストと複雑さが増加する可能性があります。さらに、セキュリティ グループの頻繁な更新の管理は煩雑であり、エラーが発生しやすい可能性があります。

これらの要件を満たすコスト効率の高いソリューションを見つけることが重要です。目標は、不必要な複雑さを導入することなく、FE-B がグローバルにアクセス可能な状態を維持しながら、FE-A を保護することです。 AWS のベストプラクティスを使用してこれを達成する方法を見てみましょう。 🚀

指示 使用例
waf_client.create_web_acl このコマンドは、AWS で Web アプリケーション ファイアウォール (WAF) WebACL を作成するために使用されます。 IP アドレスやその他の条件に基づいて、Application Load Balancer などのリソースへのアクセスを制御するためのルールとアクションを定義するのに役立ちます。
waf_client.associate_web_acl WebACL を Application Load Balancer などの特定の AWS リソースに関連付けます。これにより、定義されたアクセス ルールがリソースにリンクされ、適用されます。
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 のunittest ライブラリの一部。これは、新しい単体テストを作成するための基本クラスであり、コードの個々の部分の構造化されたテストを可能にします。
SampledRequestsEnabled 分析のためにルールに一致するリクエストのサンプルをキャプチャできるようにする WAF ルール内の設定。これは、ルール構成のデバッグと最適化に役立ちます。
DefaultAction リクエストが WebACL のどのルールにも一致しない場合に実行するアクション (許可またはブロックなど) を指定します。これにより、一致しないトラフィックに対するフォールバック動作が保証されます。

AWS でマイクロフロントエンドを保護するための戦略

最初のスクリプトは、AWS ウェブ アプリケーション ファイアウォールの機能を利用します (WAF) 2 つのマイクロフロントエンドに個別のアクセス ポリシーを適用します。 WebACL を作成すると、特定の IP ルールが FE-A に適用され、指定されたアドレスからのトラフィックのみが許可されます。 静的IP、それが閉鎖されたシステムのままであることを保証します。 FE-B の場合、別のルールによりパブリック アクセスが許可されます。このアプローチでは、アプリケーション層でのアクセス制御が集中化されるため、基盤となる EC2 セキュリティ グループを変更せずにトラフィックを効率的に管理するのに最適です。たとえば、FE-A をオフィス ネットワークに制限しながら、FE-B がグローバルにアクセスできるようにして、企業のセキュリティとユーザーの利便性の両方に対応できます。 🌍

次に、WebACL は Application Load Balancer (ALB) に関連付けられ、ALB を通過するすべてのトラフィックがこれらのルールに従ってフィルタリングされるようにします。コマンド waf_client.create_web_acl ルールを定義する上で極めて重要ですが、 waf_client.associate_web_acl WebACL をリソースにリンクします。この設定は拡張性が高く、最小限の労力で新しい IP の追加やアクセス ポリシーの変更などの将来の調整が可能になります。 CloudWatch メトリクスなどのモニタリング機能もルールの有効性を追跡し、トラフィック パターンに関する貴重な洞察を提供します。

対照的に、Lambda ベースのソリューションは EC2 セキュリティ グループ ルールを動的に更新します。このスクリプトは、AWS リージョンに固有の IP 範囲を取得し、セキュリティ グループ内のイングレス ルールとして構成します。機能 ec2.authorize_security_group_ingress 許可される IP 範囲を追加または更新することで、FE-A の厳密な制御を維持しながら、FE-B がパブリックにアクセスできるようになります。このアプローチは、クラウドベースの開発セットアップや本社の移転など、IP 要件が頻繁に変化する環境で特に役立ちます。たとえば、新しいブランチ オフィスが設立された場合、手動介入なしでその IP をホワイトリストに自動的に追加できます。 🏢

Lambda 関数とスケジュールされた CloudWatch イベントを組み合わせると、これらの更新が毎日自動化され、管理オーバーヘッドが削減されます。このアプローチでは複雑さが増しますが、トラフィックをきめ細かく制御できます。スクリプトに含まれる単体テストは機能を検証し、エラーを引き起こすことなくセキュリティ ルールが正しく適用されていることを確認します。 WAF と Lambda のどちらを選択しても、どちらの方法もコスト効率と柔軟性を優先し、パブリック アクセスと制限付きアクセスの必要性のバランスをとります。最終的に、これらのソリューションは、堅牢なセキュリティを維持しながら、さまざまな要件を満たす AWS の多用途性を実証します。 🔒

アクセス要件が異なる 2 つのマイクロフロントエンドの 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 のマイクロフロントエンド アプリケーションのセキュリティとアクセシビリティの最適化

マイクロフロントエンド アーキテクチャにおける制限付きアクセスとパブリック アクセスのバランスをとるという課題に対処するもう 1 つの効果的な方法は、AWS Amplify の統合機能を活用することです。 Amplify は、バックエンド API を安全に構成するためのツールを提供しながら、ホスティングとデプロイメントを簡素化します。 FE-A の場合、AWS API Gateway を使用してバックエンド API エンドポイントを特定の IP に制限することで、ネットワーク アクセス制御を実装できます。この設定により、事前定義された静的 IP のみがバックエンドと対話できるようになりますが、FE-B のエンドポイントはパブリック アクセスに対して制限されないままにすることができます。これにより、セキュリティが強化されるだけでなく、Amplify の CI/CD ワークフローとシームレスに統合されます。 🌐

もう 1 つの考慮事項は、カスタムのオリジン アクセス ポリシーで Amazon CloudFront を使用することです。 CloudFront は、URL パスに基づいてトラフィックを適切なバックエンドにルーティングし、マイクロフロントエンドのゲートキーパーとして機能します。 FE-A トラフィックは、IP 制限または特定のヘッダーをチェックするオリジンリクエストポリシーを使用して、CloudFront を通じてフィルタリングできます。たとえば、FE-A を通じて内部ツールを導入している企業は、エンドユーザーが FE-B をグローバルに利用できるようにしながら、IP 範囲フィルターを追加できます。このアプローチは、特にグローバルな分散を必要とするアプリケーションの場合、スケーラビリティとパフォーマンスの両方を最適化します。 🚀

最後に、ユーザー認証に AWS Cognito を実装すると、セキュリティ層がさらに追加されます。 FE-A は、特定のロールまたはグループによるユーザー認証を必要とするログイン システムの背後でロックできます。一方、FE-B は、パブリック アクセスに対してより軽量な認証メカニズムを使用するか、まったく使用しないことができます。認証とネットワーク アクセス制限を組み合わせることで、各マイクロ フロントエンドのニーズに合わせた堅牢なセキュリティ モデルを実現します。この戦略は、手頃な価格でスケーラブルで安全なクラウド ソリューションを求めているスタートアップ企業や中小企業にとって特に効果的です。 🔐

AWS マイクロフロントエンド アーキテクチャのセキュリティに関するよくある質問

  1. 特定の IP の API エンドポイントへのアクセスを制限するにはどうすればよいですか?
  2. 使用 API Gateway resource policies エンドポイントに許可される IP 範囲を定義します。
  3. フロントエンドのグローバルな可用性を確保する最善の方法は何ですか?
  4. を使用してデプロイします AWS Amplify コンテンツ配信ネットワークとして Amazon CloudFront を使用します。
  5. 動的環境の IP 更新を自動化できますか?
  6. はい、使用します Lambda function セキュリティ グループまたは WAF ルールで IP 範囲を動的に取得および更新します。
  7. FE-B のパブリック アクセスに影響を与えずに FE-A を保護することは可能ですか?
  8. 組み合わせる WAF FE-A の場合はルール、FE-B の場合は無制限のセキュリティ グループ設定です。
  9. AWS Cognito はマイクロフロントエンドのセキュリティをどのように強化しますか?
  10. AWS Cognito はユーザー認証を管理し、特定のフロントエンドに対するロールベースのアクセスを許可します。

安全なマイクロフロントエンドアクセスのための効果的なソリューション

マイクロフロントエンドのバックエンドを保護するには、カスタマイズされたアプローチが必要です。 AWS は、トラフィックの効果的な管理に役立つ WAF、API Gateway、CloudFront などのツールをいくつか提供しています。 FE-A の IP フィルタリングや FE-B のオープン アクセスなどの構成は、アクセシビリティとセキュリティのバランスをとるために重要です。これらのツールにより、プロセスがシームレスかつ信頼性の高いものになります。 🔐

動的 IP 管理用の Lambda 関数などの自動化された方法を使用すると、コストを管理しながら柔軟性がさらに高まります。ネットワークレベルのセキュリティとアプリケーション層の対策を組み合わせることで、あらゆる規模のビジネスに適した堅牢なソリューションが保証されます。これにより、ユーザー エクスペリエンスを損なうことなく、最適化されたバックエンド セキュリティを実現できます。 🌟

AWS バックエンドセキュリティに関する参考資料とリソース
  1. AWS Web アプリケーション ファイアウォール (WAF) の詳細については、AWS の公式ドキュメントを参照してください。 AWS WAF
  2. IP フィルタリング用の API Gateway リソース ポリシーを構成する方法については、AWS ガイドで説明しています。 APIゲートウェイのリソースポリシー
  3. 安全なコンテンツ配信のための Amazon CloudFront の機能を以下で理解します。 Amazon CloudFront
  4. Lambda を使用して IP 更新を自動化する方法については、AWS Lambda ドキュメントをご覧ください。 AWSラムダ
  5. セキュリティグループによる EC2 インスタンスの保護の詳細については、以下を参照してください。 EC2セキュリティグループ