AWS奮闘記④ ~IPSetsへの登録~

ログイン画面で不正アクセスが複数回あった場合、
そのIPアドレスからのアクセスを遮断する仕組みを
WAFと連携する形でboto3を使用してLambda(Python)で作成した。
備忘録として残す。

1.まずは、IPアドレスグループ(IP Sets)の設定を行う

2.次にAWS WAFの設定を行う

・ACLの名前入力、リソース種別を設定する。(CloudFrontかリージョンを選択する。リージョンの方は、ALB、ApiGatewayとなる)

・対象のCloudFrontを選択する

・独自のルールを作成する

・ルールの設定を行う(指定のIPアドレスによるアクセスを防ぐ設定)

・その他の設定~確認画面

 

3.Lambda(Python)のソースコード

import boto3

client = boto3.client(‘wafv2′, region_name=’us-east-1’)
scope = ‘CLOUDFRONT’
acl_name = ‘{ACL作成時の入力した名前}’
acl_id = ‘{ACL作成後にACL一覧に表示されているID}’
rule_name = ‘{ACL作成時のルール設定した名前}’
ipsets_name = ‘{IP Sets作成時のIP Setsの名前}’
ipsets_id = ‘{IP Sets作成時のIP SetsのID}’

def lambda_handler(event, context) :

# ルールでブロックしたIPアドレスを取得
responseAddips = client.get_rate_based_statement_managed_keys(
Scope = scope,
WebACLName = acl_name,
WebACLId = acl_id,
RuleName = rule_name
)
responseAddips = responseAddips[‘ManagedKeysIPV4’][‘Addresses’]

# IP SetsよりIPアドレスを取得する
IPSets = client.get_ip_set(
Name = ipsets_name,
Scope = scope,
Id = ipsets_id
)
IPSets = IPSets[‘IPSet’][‘Addresses’]

# IP Setsに登録されていないIPのリストを作成
addIPList = list(set(ipaddress) – set(IPSets))
# IPリストから重複を削除する
addIPList = list(set(addIPList))
# IPがすでにIP Setsに登録されている場合終了
if len(addIPList) == 0:
return()

# upd_ip_setは指定されたIPを置き換えるため、既存のIPリストと追加するIPリストを結合する
addIPList = IPSets + addIPList

# IP Setsを更新するためのトークンを取得
responseToken = client.get_ip_set(
Name = ipsets_name,
Scope = scope,
Id = ipsets_id
)
Token = responseToken[“LockToken”]

# IP Setsを更新
response = client.update_ip_set(
Name = ipsets_name,
Scope = scope,
Id = ipsets_id
Addresses = addIPList,
LockToken = Token
)