AWS Lambda

Lambdaでマネージドプレフィックスリストを使ってAWS WAFのIPSetsを自動運用してみた

はじめに

こんにちは、omkです。
前回はマネージドプレフィックスを用いてS3のIP制限を自動化しました。
今回は拠点IPでのホワイトリストを想定して、CloudFront向けのAWS WAFのIPSetsをマネージドプレフィックスリストで自動管理します。

Lambda関数

Python3で動かします。

import json
import boto3
import os

def lambda_handler(event, context):
    prefixlist = os.environ['PrefixListId']
    ipsetsname = os.environ['IPSets']

    # Get IPs From Managed Prefix List
    try:
        ec2client = boto3.client('ec2')
        response = ec2client.get_managed_prefix_list_entries(
            PrefixListId=prefixlist,
            MaxResults=100
        )
    except Exception as e:
        print(e)
        exit(1)

    ips = []
    for entry in response['Entries']:
        ips.append(entry['Cidr'])

    print(ips)

    # Change IPs on WAF IPSets
    client = boto3.client('wafv2', region_name='us-east-1')

    try:
        ipsets = client.list_ip_sets(
            Scope='CLOUDFRONT'
        )
    except Exception as e:
        print(e)
        exit(1)

    if len(ipsets) == 0:
        print("no ipsets")
        exit(0)

    print(ipsets)

    for ipset in ipsets['IPSets']:
        if ipset['Name'] == ipsetsname:
            id = ipset['Id']
            locktoken = ipset['LockToken']
            break

    if not id :
        print("no ipsets is matched to you provided")
        exit(1)

    try:
        response = client.update_ip_set(
            Name = ipsetsname,
            Scope = 'CLOUDFRONT',
            Id=id,
            Addresses=ips,
            LockToken=locktoken
        )
    except Exception as e:
        print(e)
        exit(1)

    exit(0)

以下にざっくりポイントごとにコードの説明をば。
まずは対象のマネージドプレフィックスリストに登録されたIPの一覧を取得します。

response = ec2client.get_managed_prefix_list_entries(
            PrefixListId=prefixlist,
            MaxResults=100
        )

次にWAFのクライアントを作りますが、CloudFront向けなのでリージョンを「us-east-1」で指定します。

    client = boto3.client('wafv2', region_name='us-east-1')

対象IPSetのIDとLockTokenを取得します。
これらは設定の更新時に利用します。

    for ipset in ipsets['IPSets']:
        if ipset['Name'] == ipsetsname:
            id = ipset['Id']
            locktoken = ipset['LockToken']
            break

マネージドプレフィックスのIPでIPSetを上書きします。

        response = client.update_ip_set(
            Name = ipsetsname,
            Scope = 'CLOUDFRONT',
            Id=id,
            Addresses=ips,
            LockToken=locktoken
        )

あとはWAF ACLのホワイトリストに登録して利用すればIP制限の完成です。
このLambdaをEventBridgeから定期的に実行すればマネージドプレフィックスリストの更新後に自動で適用出来ます(現状はイベント駆動できないのでスケジュールのみ)。

終わりに

という感じでマネージドプレフィックスリストのIPでAWS WAFのIP制限を実装してみました。
今のところ直接的にはセキュリティグループにしか連携できないマネージドプレフィックスですが色々使いたい用途があるので諸々のIP関連のサービスと連携できるようになると良いなと思います。

以上、お付き合いありがとうございました。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA