Upgrade to Pro — share decks privately, control downloads, hide ads and more …

とらのあなラボTechConferenceVol.2_WAF-Athenaによるセキュリティ対策

 とらのあなラボTechConferenceVol.2_WAF-Athenaによるセキュリティ対策

とらのあなラボTechConferenceVol.2におけるセッション「WAF-Athenaによるセキュリティ対策」の登壇資料です。

■イベント情報
https://yumenosora.connpass.com/event/241175/

■今後のイベントについてはこちら
https://yumenosora.connpass.com/

■虎の穴ラボ 採用サイト
https://yumenosora.co.jp/tora-lab

More Decks by 虎の穴ラボ株式会社

Other Decks in Technology

Transcript

  1. Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. AWS

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

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

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

    WAF-Lambda-Athenaを連携させた 自動ブロックシステムの構築
  5. Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. アジェンダ

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

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

    • 1時間に1回起動 • 直近1時間分のログを分析 • 不審なIPアドレスをブロック!
  8. Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. AWS

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

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

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

    -- データベースの作成 create database waflogtest; AWS Athenaの簡単な紹介
  12. 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の簡単な紹介
  13. 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の簡単な紹介
  14. 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の簡単な紹介
  15. Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. 自動ブロックシステムの構成

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

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

    Lambda準備 • 実行ロールの設定 ◦ S3 ◦ Athena ◦ WAF v2 • CloudWatch Eventからの 定期実行
  18. 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
  19. 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 (起動するたびに作り直す)
  20. 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)
  21. 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')
  22. 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()
  23. 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)
  24. Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. サンプルコードと説明

    定期実行の設定 • Lambdaファンクションのトリガーを作成 • CloudWatch Eventsでスケジュールを作成して設定 定期実行される自動ブロックシステムの完成
  25. Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. 具体的なブロック例

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

    Lambdaから発行するAthenaのクエリーを変更 自由な条件でブロック対象のIPアドレスを抽出可能
  27. 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アドレスを検知してブロック
  28. 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アドレスを永続ブロック
  29. Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. まとめ

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

    17:00 ~ 17:25 静的コンテンツサーバーのリリースとキャッ シュ戦略