Slide 1

Slide 1 text

Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. AWS WAFを用いたセキュリティ対策 虎の穴ラボ エンジニアリングマネージャー 松尾 陽祐 T O R A N O A N A L a b

Slide 2

Slide 2 text

Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. 自己紹介 松尾陽祐 ● 2017/11入社 ● エンジニアリングマネージャー 虎の穴ラボへの入社理由 ● 自社プロダクトの開発がしたい! ● どうせ転職するなら好きな業界で! 趣味 ● ラブライブ!プロジェクト全般 ● 22/7

Slide 3

Slide 3 text

Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. 自己紹介 ● 昭和60年生まれ ● 新卒でソフトハウスへ入社 ○ C++やJavaを利用した開発に従事 ● 独立系SIerへ転職 ○ Javaを利用した大規模Webサービス開発 ○ リーダー業務、マネージメント業務を経験 ● 虎の穴ラボへ転職(病的にオタクだったので) ○ 虎の穴ラボ全体のマネージャー

Slide 4

Slide 4 text

Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. 今日のテーマ WAF-Lambda-Athenaを連携させた 自動ブロックシステムの構築

Slide 5

Slide 5 text

Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. アジェンダ ● 自動ブロックシステムの構成 ● AWS WAFの紹介 ● AWS Athenaの紹介 ● 自動ブロックシステムの説明 ○ サービス構成 ○ サンプルコード説明 ○ 具体的なアクセスブロック例 ● まとめ

Slide 6

Slide 6 text

Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. 自動ブロックシステムの構成

Slide 7

Slide 7 text

Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. 自動ブロックシステムの構成 通常のWAFルールでは防げない 特殊な条件によるブロックを行う ● WAFのアクセスログをS3へ格納 ● LambdaでAthenaのクエリを実行 ● 分析結果からセキュリティルールを WAFへ設定

Slide 8

Slide 8 text

Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. 自動ブロックシステムの構成 ● 1時間に1回起動 ● 直近1時間分のログを分析 ● 不審なIPアドレスをブロック!

Slide 9

Slide 9 text

Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. AWS WAFの紹介

Slide 10

Slide 10 text

Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. AWS WAFの紹介 WAF(ウェブアプリケーションファイアウォール) ● 一般的な攻撃パターンのブロック(SQLインジェクション、XSSなど) ● 最新の攻撃パターンのブロック ○ 先日のLog4j脆弱性(CVE-2021-44228)は、なんと1日で対応! ● ルールのカスタマイズ ○ 独自ルールの作成 (HTTPリクエストに応じたブロックルール等) ○ マネージドルールの ON / OFF ● ログの保存

Slide 11

Slide 11 text

Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. WAFのログはS3へ格納可能 2021/11/15のアップデートで、WAFのログを直接S3へ格納可能に! ● 従来はKinesis Firehoseを経由してS3へ格納 ● アップデートにより、WAFの設定で直接S3へ格納可能に変更 ● WAFでブロックしていないアクセスも保存 → 実質的なアクセスログ AWS WAFの紹介

Slide 12

Slide 12 text

Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. AWS Athenaの紹介

Slide 13

Slide 13 text

Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. AWS Athenaの簡単な紹介 AWS Athena ● AWS S3に格納されたデータをSQLで分析 ● サーバーレスで稼働 ● クエリの実行が高速 料金 : スキャンされたデータ 1 TB あたり 5.00USD

Slide 14

Slide 14 text

Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. AthenaによるWAFログ分析 データベースの作成 -- データベースの作成 create database waflogtest; AWS Athenaの簡単な紹介

Slide 15

Slide 15 text

Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. AthenaによるWAFログ分析 テーブルの作成 -- テーブルの作成 create external table if not exists waflog2022032506 ( `timestamp` bigint, formatVersion int, -- 省略 httpRequest struct < clientIp: string, country: string, headers: array < struct < name: string, value: string > >, uri: string, args: string, httpVersion: string, httpMethod: string, requestId: string > ) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' LOCATION 's3://xxxxxxxxxxxxxx-bucket/log/2022/03/25/06/'; 必要な項目をカラムとして定義 項目の詳細は以下を参照 https://docs.aws.amazon.com/ja_jp/waf /latest/developerguide/logging.html LOCATIONにはS3のバケットを記載 再帰的に参照するため、「xx/2021/11/」と定義 すればひと月分のテーブルが作成可能 ※サンプルでは2022/03/25 15時台(UTC) AWS Athenaの簡単な紹介

Slide 16

Slide 16 text

Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. AthenaによるWAFログ分析 クエリによる抽出 -- 抽出クエリ select from_unixtime(timestamp/1000, 'Asia/Tokyo') AS JST, httprequest.clientip, httprequest.country, httprequest.uri from waflog2022032506; ほぼ通常のSQLで WAFのログを参照可能 AWS Athenaの簡単な紹介

Slide 17

Slide 17 text

Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. AthenaによるWAFログ分析 クエリによる抽出 -- 抽出クエリ select httprequest.clientip, count(*) as requestcount from waflog2022032506 where httprequest.uri like '%customer%' and httprequest.country <> 'JP' group by httprequest.clientip order by requestcount desc; SQLで記述できるため ● WHERE句での絞り込み ○ URIのlike検索 ○ COUNTRYでの絞込み ● GROUP BY句での集計 ○ アクセス回数の集計 ○ HAVINGによる条件 など、様々な方法で分析可能 AWS Athenaの簡単な紹介

Slide 18

Slide 18 text

Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. サービスを組み合わせて作る セキュリティ対策

Slide 19

Slide 19 text

Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. サービス概要

Slide 20

Slide 20 text

Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. 自動ブロックシステムの構成 通常のWAFルールでは防げない 特殊な条件によるブロックを行う ● WAFのアクセスログをS3へ格納 ● LambdaでAthenaのクエリを実行 ● 分析結果からセキュリティルールを WAFへ設定

Slide 21

Slide 21 text

Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. 自動ブロックシステムの構成 WAF準備 ● ログをS3へ保存するよう設定 ● ブロック対象を管理するIP setsを 作成 ● 上記IP setsをもとにブロックを行う WebACL(ウェブアクセスコントロー ルリスト)を作成

Slide 22

Slide 22 text

Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. 自動ブロックシステムの構成 Lambda準備 ● 実行ロールの設定 ○ S3 ○ Athena ○ WAF v2 ● CloudWatch Eventからの 定期実行

Slide 23

Slide 23 text

Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. サンプルコードと説明

Slide 24

Slide 24 text

Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. サンプルコードと説明 def exec_athena_query(query, db, output): athena_client = boto3.client("athena", region_name="xxxxxxxxxxxx") res = athena_client.start_query_execution( QueryString=query, QueryExecutionContext={"Database": db, "Catalog": "xxxxxxxxxx"}, ResultConfiguration={"OutputLocation": output}, ) query_exec_id = res["QueryExecutionId"] query_exec_status = "" # queryの結果を待機 while (query_exec_status != "SUCCEEDED") and (query_exec_status != "FAILED"): query_status = athena_client.get_query_execution(QueryExecutionId=query_exec_id) query_exec_status = query_status["QueryExecution"]["Status"]["State"] return query_exec_id LambdaからAthenaで クエリを実行する関数 ● AWS SDK for Python (Boto3) ● パラメータのクエリを実行 ● 結果はoutputのパスへ出力 ○ [QueryExecutionId].csv ○ [QueryExecutionId].csv.metadata

Slide 25

Slide 25 text

Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. サンプルコードと説明 def lambda_handler(event, context): today = datetime.datetime.now() database = "waflogtest" s3_output = "s3://xxxxxxxxxxxxxx/xxxxxxxxx/xxxxx/xxxxxxxx" s3_bucket = "xxxxxxxxxxxxxxxx" # テーブルドロップ query = "drop table waflog_temp;" exec_athena_query(query, database, s3_output) メイン処理 ● 参照DB、処理結果のアウトプット 先を定義 ● 分析用一時テーブルをDROP (起動するたびに作り直す)

Slide 26

Slide 26 text

Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. サンプルコードと説明 メイン処理 ● 分析用一時テーブルの作成 ● Athena用のクエリを文字列で定 義 ● サンプルでは、起動した時間の1 時間前のものをテーブル化 # CREATE文作成 query = "CREATE EXTERNAL TABLE IF NOT EXISTS waflog_temp(\n" query += "`timestamp` bigint,\n" # 中略 query = "ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'\n" query = "LOCATION 's3://xxxxxxxxxxxxxxxxx/xxxx/%s/%s/%s/%s/';" % ( format(today.year, "04"), format(today.month, "02"), format(today.day, "02"), format(today.hour - 1, "02"), ) exec_athena_query(query, database, s3_output)

Slide 27

Slide 27 text

Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. サンプルコードと説明 メイン処理 ● 例として以下のクエリを実行 ○ customer を含むURI ○ 国外アクセス ○ 回数が100回以上 ● 結果CSVファイルをリード ● 以下のような形式になるよう整形 xxx.xxx.xxx.xxx/32 xxx.xxx.xxx.xxx/32 xxx.xxx.xxx.xxx/32 ※ .0/24等で範囲ブロックも可能 # ブロック対象抽出クエリ実行 query = "select clientIp from waflog_temp \n" query += "where httprequest.uri like '%customer%' and \n" query += "httprequest.country <> 'JP' \n" query += "group by httprequest.clientip \n" query += "having requestcount> 100; \n" res = exec_athena_query(query, database, s3_output) # 結果抽出 整形 s3_client = boto3.client('s3') output_csv = "xxxxx/xxxxx/xxxxxxxx/" + res + ".csv" output_metadata = output_csv + '.metadata' csv = s3_client.get_object(Bucket = s3_bucket, Key = output_csv) raw_list = str(csv['Body'].read().decode('utf-8')) lines=raw_list.splitlines() ip_list = [s.replace('"','') + '/32' for s in lines] ip_list.remove('clientIp/32')

Slide 28

Slide 28 text

Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. サンプルコードと説明 メイン処理 ● 準備してあるIP sets(サンプルで は [Deny-IP]の定義を取得 ● 今回の抽出対象から上記を除外 ● 追加対象がなければ処理終了 # 現在のブロックIPを取得 waf_client = boto3.client('wafv2') IPSets = waf_client.get_ip_set( Name='Deny-IP', Scope='REGIONAL', Id='xxxxxxxxxxxxxxxxxxxxxxxxxxxx' ) IPSets = IPSets['IPSet']['Addresses'] addIPList = list(set(ip_list) - set(IPSets)) addIPList = list(set(addIPList)) if len(addIPList) == 0: return()

Slide 29

Slide 29 text

Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. サンプルコードと説明 メイン処理 ● WAFのIP sets更新等トークンの 取得 ● 更新実施 ● 不要になった結果ファイル削除 # 登録実施 responseToken = waf_client.get_ip_set( Name='Deny-IP', Scope='REGIONAL', Id='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' ) Token = responseToken["LockToken"] response = waf_client.update_ip_set( Name='Deny-IP', Scope='REGIONAL', Id=''xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'', Addresses=addIPList, LockToken=Token ) # S3のファイル削除 s3_client.delete_object(Bucket = s3_bucket, Key = output_csv) s3_client.delete_object(Bucket = s3_bucket, Key = output_metadata)

Slide 30

Slide 30 text

Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. サンプルコードと説明 定期実行の設定 ● Lambdaファンクションのトリガーを作成 ● CloudWatch Eventsでスケジュールを作成して設定 定期実行される自動ブロックシステムの完成

Slide 31

Slide 31 text

Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. 具体的なブロック例 ※とらのあなが実施しているものとは異なります

Slide 32

Slide 32 text

Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. 具体的なブロック例 Lambdaから発行するAthenaのクエリーを変更 自由な条件でブロック対象のIPアドレスを抽出可能

Slide 33

Slide 33 text

Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. サービスを組み合わせて作るセキュリティ対策 ● アクセス数上位10ユーザー を対象 ● [/item/]を含むURIへのアク セスが、それ以外より多い ユーザーを抽出 select ip_address from ( select httprequest.clientIp as ip_address, count(*) as access_sum, sum(case when httprequest.uri like '%/item/%' then 1 else 0 end) as item_sum, sum(case when httprequest.uri not like '%/item/%' then 1 else 0 end) as other_sum from waflog_temp group by httprequest.clientIp order by count(*) desc limit 10 ) where item_sum > other_sum; アクセスするURIの詳細から不審なIPアドレスを検知してブロック

Slide 34

Slide 34 text

Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. サービスを組み合わせて作るセキュリティ対策 ● [NoUserAgent_HEADER] ルールによってブロックされ たIPアドレス ● その回数が3回以上 IPアドレスごと止めるのに有 効 select httprequest.clientip from waflog_temp, UNNEST(ruleGroupList) t(groupList) where action = 'BLOCK' and groupList.terminatingRule.ruleId = 'NoUserAgent_HEADER' group by httprequest.clientip,groupList.terminatingRule.ruleId having count(*) > 3 order by count(*) desc limit 100; マネージドルールでBLOCKされたIPアドレスを永続ブロック

Slide 35

Slide 35 text

Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. まとめ

Slide 36

Slide 36 text

Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. まとめ ● WAF単体で様々なアクセスの制限が可能 ● WAFのフルログはS3へ出力可能 ● Lambda - Athenaとの連携によって、 独自基準でのアクセス制限が可能

Slide 37

Slide 37 text

Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. ご清聴ありがとうございました

Slide 38

Slide 38 text

Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. 次のセッション 17:00 ~ 17:25 静的コンテンツサーバーのリリースとキャッ シュ戦略