みなさん、AWS WAF のログ分析やっていますでしょうか。
AWS WAF は、Web Applicationを保護する目的で、HTTPおよびHTTPSの通信内容を検査し、ルールに従って、悪意のあるリクエストを遮断するためのマネージドサービスです。
こちらにも AWS WAF の概要が紹介されていますが、AWS WAF で設定したルールが正しく機能しているかを確認したり、新しくルールを適用すべき異常な通信がないかを確認するために、WAF が出力するログを分析することは、必要不可欠な運用です。
そこで、今回は AWS WAF のログを Splunk に取り込み、分析を行っていきたいと思います。
ログの収集を行う前に
早速ログの収集を行う前に、ログの分析においては、分析がしやすいような形に整形したり、フィールドとして認識させることによって、ログの分析がしやすい形に整えてあげることが重要です。
それを『正規化』と言ったりします。
Splunk では、正規化を行うための手段として、Splunkbaseからダウンロード可能な拡張機能「App」(Splunkでは正規化に関するAppを特にAdd-onと呼んでいる)をインストールすることで、細かい設定を行わずに実現することができます。
AWS WAF 専用のAdd-onが用意されているため、これをSplunk Cloud / Splunk Enterpriseでインストールします。
「App」の「他のAppのサーチ」から、AWS WAFなどで検索してインストールしてください。
インストールが完了したら、「設定」の「ソースタイプ」を開きます。
「人気のみ表示」のチェックを外し、「AWS」を検索バーに入れ、App「TA-aws_waf」のソースタイプ「aws:waf」を確認します。
これを取り込み時に指定することで、ログの正規化が内部で行われます。
ログの収集
次にログの収集を行います。
Splunk では、主にクラウドシステムのリソースからログを収集する際に、APIを介して、HTTP Event Collector(HEC)と呼ばれるHTTPエンドポイントでログを受け取ることができます。
AWS からのログを取得する方法については、下記の記事でも紹介しているので、ご参考にください。
こちらの記事の手順にある通り、別のApp「Splunk Add on for AWS」をインストールし、ログ取り込みの設定を行います。
その際に、先程確認したソースタイプ「aws:waf」を指定します。
ログが取り込まれるまで少し待って、サーチ画面で「sourcetype="aws:waf"」として、全期間などで検索すると、ログが取り込まれていることが確認できます。
またログが取り込まれただけでなく、検索結果の左横や、各ログを開いて詳細を確認すると、ログの中身がきちんと正規化されて、フィールドとして認識されていることが分かります。
なかなか取り込みが確認できない場合は、Splunk Add on for AWS に遷移して、「健全性チェック」のS3 Input Health Details(S3経由の取り込みの場合)などで、エラー表示が出ていないか確認します。
私が試した時に出たエラーでバケットポリシーの権限設定が足りていなかったのでエラーとなっていました。
ログを分析する
ログの分析観点について、まずまとめてみます。
一般的なセキュリティ分析として、以下のような観点で見ていくことが多いと思います。
- 通常のトラフィック数を把握する(ビジネスアワーや繁忙期など通常のビジネス状態を日頃から把握しておく)
- ブロックしたトラフィック数が異常でないか分析する
- WAFのルールごとにどんなアクセスが来ていたか分析する
- どんなデバイス/ブラウザからアクセスしているか、botと思われるユーザーエージェントからアクセスされていないか
- アクセス元は海外かを分析する
- どのURIにどんなアクセスが多いかを分析する
- ブロックした時の生ログからブロックの原因となったクエリを確認する
WAFのログ分析に加えて、アプリケーションに会員サイトのようなログイン機能があれば、認証系のログもSIEMに取り込み分析できるようにしておくと、相関的に分析が可能になります。(今回のブログではWAFログに焦点を当ててます)
分析クエリとダッシュボード
Splunk で上記の観点でオペレーションができるようなクエリを書いて、ダッシュボードを作ってみました。
クエリを見ていきます。
下記では、トラフィック数を可視化するためのクエリとパネルを作成しています。
クエリを見ていただくと分かるように非常に単純なクエリ文を書いています。Splunk で使うSPL文を知らない人でも直感的に分かりそうです。
ログの種類(sourcetype)とルールID($rule_id$)を指定して、件数をカウントしています。
ルールID($rule_id$)はダッシュボード上部のフィルターで選択式の絞り込みするための記載方法になっています。
SPL Query
sourcetype="aws:waf" $rule_id$
| stats count
下記では、ルールがブロックしたトラフィック数を可視化するためのクエリとパネルを作成しています。
こちらも非常に単純なクエリですね。
アクションにブロックが追加されただけです。
SPL Query
sourcetype="aws:waf" action="BLOCKED" $rule_id$
| stats count
さらにドリルダウン機能として、パネル内をクリックすると検索画面が開き、指定した時間軸やブロックイベントの検索条件を保持したまま生ログの確認が一発でできます。
生ログを見てみると、どういった理由でルールに合致したのか(SQL Injection)、どういったリクエスト(POSTメソッド)、何がルールに引っかかったのか(「AND 1」というフォームの入力があった)が分かりました。
※他のパネルに関しても全て検索条件を引き継いだままドリルダウンが可能になっています。
下記では、許可されたトラフィック、ブロックされたトラフィックをそれぞれ時系列データとして分析するためのクエリとパネルを作成しています。
時系列を表現するための「timechart」を使っています。
SPL Query
sourcetype="aws:waf" $rule_id$
| timechart count by action
下記では、リクエストの送信元の位置情報をマップで表示するためのクエリとパネルになります。
アクションやルールIDでフィルタできるように「$action$」や「$rule_id$」を入れています。
日本以外からのアクセスが多かった場合などすぐに直感的に分かります。
SPL Query
sourcetype="aws:waf" $action$ $rule_id$
| iplocation src
| geostats latfield=lat longfield=lon count by City
下記では、UserAgentごとの件数と割合を分析するためのクエリとパネルになります。
アクセスにきているデバイスの割合はどの程度か、botが持つUserAgentからのアクセスはないかを確認することができます。
SPL Query
sourcetype="aws:waf" $action$ $rule_id$
| stats count by http_user_agent
下記では、送信元IPのリスト表示するクエリとパネルになります。
送信元IPごとの件数をカウントした後に、カウント大きい順にソートしています。
SPL Query
sourcetype="aws:waf" $action$ $rule_id$
| stats count by src
| sort - count
下記では、トラフィックの個々のリクエスト先と、許可・ブロックのアクションが分析できるクエリとパネルになります。
SPL Query
sourcetype="aws:waf" $action$ $rule_id$
| eval host=dest
| stats count by host uri_query action
| sort - count
このように、分析観点に沿って対局から見て、さらに詳細な生ログの分析に絞り込んでいくような運用ができるようになりました。
まとめ
今回はSplunkにAWS WAFのログを取り込んでログの分析を行ってみました。
ログの可視化や分析において、AWSのサービスを使って実現することも良いのですが、SIEMツールを使うと、正規化を含めログの扱いが非常に簡単になるのと、ドリルダウン機能で効率的にログの分析がはかどります。
また、AWSのログだけではなく、オンプレやマルチクラウドのログ分析が必要な方がほとんどだと思います。
そういった時に、ログ分析ツールとしてSplunkを活用してみると良さそうです。
最後に
今回つくったダッシュボードを公開しておきます。
Splunkの画面で「Apps」、「Search & Reporting」、「Create New Dashboard」に進み、
Dashboard Titleを入力して、Dashboard Studioを選択します。
コードのマークをクリックすると、ダッシュボードのソースコードを編集する画面が表示されるので、下のJSONで上書きすれば、今回ご紹介したダッシュボードができます。
ぜひ活用してみてください。
{
"visualizations": {
"viz_iFBNUWdK": {
"type": "splunk.singlevalue",
"dataSources": {
"primary": "ds_HOn92oH4"
},
"showProgressBar": false,
"showLastUpdated": false,
"hideWhenNoData": false,
"title": "ALL Traffic",
"options": {
"majorFontSize": 50
},
"eventHandlers": [
{
"type": "drilldown.linkToSearch",
"options": {
"type": "auto",
"newTab": true
}
}
]
},
"viz_ACunbUJa": {
"type": "splunk.singlevalue",
"dataSources": {
"primary": "ds_zWBSpYgI_ds_HOn92oH4"
},
"showProgressBar": false,
"showLastUpdated": false,
"hideWhenNoData": false,
"title": "Allowed Traffic",
"options": {
"majorFontSize": 50
},
"eventHandlers": [
{
"type": "drilldown.linkToSearch",
"options": {
"type": "auto",
"newTab": true
}
}
]
},
"viz_WpbCTsFq": {
"type": "splunk.singlevalue",
"dataSources": {
"primary": "ds_QleIH4ob_ds_zWBSpYgI_ds_HOn92oH4"
},
"showProgressBar": false,
"showLastUpdated": false,
"hideWhenNoData": false,
"title": "Blocked Traffic",
"options": {
"majorFontSize": 50
},
"eventHandlers": [
{
"type": "drilldown.linkToSearch",
"options": {
"type": "auto",
"newTab": true
}
}
]
},
"viz_ThKEK17k": {
"type": "splunk.pie",
"dataSources": {
"primary": "ds_4XYnxKBx"
},
"title": "Web ACLs",
"options": {
"showDonutHole": true
},
"eventHandlers": [
{
"type": "drilldown.linkToSearch",
"options": {
"type": "auto",
"newTab": true
}
}
]
},
"viz_LdY8gzWH": {
"type": "splunk.line",
"dataSources": {
"primary": "ds_faZFYbIE"
},
"title": "Traffic by Actions",
"eventHandlers": [
{
"type": "drilldown.linkToSearch",
"options": {
"type": "auto",
"newTab": true
}
}
]
},
"viz_kxCq2pZr": {
"type": "splunk.pie",
"dataSources": {
"primary": "ds_nHV5TT2b"
},
"title": "WAF Rules",
"options": {
"showDonutHole": true,
"seriesColors": [
"#FF677B",
"#DD9900",
"#7B56DB",
"#009CEB",
"#00CDAF",
"#CB2196",
"#813193",
"#0051B5",
"#008C80",
"#99B100",
"#FFA476",
"#FF6ACE",
"#AE8CFF",
"#00689D",
"#00490A",
"#465D00",
"#9D6300",
"#F6540B",
"#FF969E",
"#E47BFE"
]
},
"eventHandlers": [
{
"type": "drilldown.linkToSearch",
"options": {
"type": "auto",
"newTab": true
}
}
]
},
"viz_tEmvgIjb": {
"type": "splunk.pie",
"dataSources": {
"primary": "ds_mGIeFWPz"
},
"title": "HTTP Methods",
"options": {
"showDonutHole": true
},
"eventHandlers": [
{
"type": "drilldown.linkToSearch",
"options": {
"type": "auto",
"newTab": true
}
}
]
},
"viz_xqJDMQGh": {
"type": "splunk.pie",
"dataSources": {
"primary": "ds_wVhIOshu"
},
"title": "HTTP Versions",
"options": {
"showDonutHole": true,
"seriesColors": [
"#99B100",
"#7B56DB",
"#009CEB",
"#00CDAF",
"#DD9900",
"#FF677B",
"#CB2196",
"#813193",
"#0051B5",
"#008C80",
"#FFA476",
"#FF6ACE",
"#AE8CFF",
"#00689D",
"#00490A",
"#465D00",
"#9D6300",
"#F6540B",
"#FF969E",
"#E47BFE"
]
},
"eventHandlers": [
{
"type": "drilldown.linkToSearch",
"options": {
"type": "auto",
"newTab": true
}
}
]
},
"viz_w4TN5aYY": {
"type": "splunk.map",
"dataSources": {
"primary": "ds_1NaPvwe9"
},
"title": "Traffic Geo Location",
"options": {
"layers": [
{
"type": "bubble",
"resultLimit": 1000,
"seriesColors": [
"#7B56DB",
"#009CEB",
"#00CDAF",
"#DD9900",
"#FF677B",
"#CB2196",
"#813193",
"#0051B5",
"#008C80",
"#99B100",
"#FFA476",
"#FF6ACE",
"#AE8CFF",
"#00689D",
"#00490A",
"#465D00",
"#9D6300",
"#F6540B",
"#FF969E",
"#E47BFE"
]
}
],
"center": [
3.9474910641187506,
165.10097665638966
],
"zoom": 0.19873219981105394
},
"showProgressBar": false,
"showLastUpdated": false,
"hideWhenNoData": false,
"eventHandlers": [
{
"type": "drilldown.linkToSearch",
"options": {
"type": "auto",
"newTab": true
}
}
]
},
"viz_plNPWtVn": {
"type": "splunk.bar",
"dataSources": {
"primary": "ds_GPxs5Q3N"
},
"title": "Top 10 Rules",
"options": {
"y": "> primary | frameBySeriesNames('count')",
"seriesColors": [
"#00689D",
"#009CEB",
"#7B56DB",
"#00CDAF",
"#DD9900",
"#FF677B",
"#CB2196",
"#813193",
"#0051B5",
"#008C80",
"#99B100",
"#FFA476",
"#FF6ACE",
"#AE8CFF",
"#00490A",
"#465D00",
"#9D6300",
"#F6540B",
"#FF969E",
"#E47BFE"
]
},
"eventHandlers": [
{
"type": "drilldown.linkToSearch",
"options": {
"type": "auto",
"newTab": true
}
}
]
},
"viz_hF5suwNZ": {
"type": "splunk.bar",
"dataSources": {
"primary": "ds_MjGJ6mfV"
},
"title": "Top 10 Countries",
"options": {
"y": "> primary | frameBySeriesNames('count')",
"seriesColors": [
"#00490A",
"#7B56DB",
"#009CEB",
"#00CDAF",
"#DD9900",
"#FF677B",
"#CB2196",
"#813193",
"#0051B5",
"#008C80",
"#99B100",
"#FFA476",
"#FF6ACE",
"#AE8CFF",
"#00689D",
"#465D00",
"#9D6300",
"#F6540B",
"#FF969E",
"#E47BFE"
]
},
"eventHandlers": [
{
"type": "drilldown.linkToSearch",
"options": {
"type": "auto",
"newTab": true
}
}
]
},
"viz_e2iqxRgv": {
"type": "splunk.pie",
"dataSources": {
"primary": "ds_TwTEYjbU"
},
"title": "User Agents",
"options": {
"showDonutHole": true,
"seriesColors": [
"#dc4e41",
"#FF677B",
"#009CEB",
"#00CDAF",
"#DD9900",
"#CB2196",
"#813193",
"#0051B5",
"#008C80",
"#99B100",
"#FFA476",
"#FF6ACE",
"#AE8CFF",
"#00689D",
"#00490A",
"#465D00",
"#9D6300",
"#F6540B",
"#FF969E",
"#E47BFE"
]
},
"eventHandlers": [
{
"type": "drilldown.linkToSearch",
"options": {
"type": "auto",
"newTab": true
}
}
]
},
"viz_MGB9o50s": {
"type": "splunk.table",
"dataSources": {
"primary": "ds_gYwdLZ6z"
},
"title": "URI Hits",
"eventHandlers": [
{
"type": "drilldown.linkToSearch",
"options": {
"type": "auto",
"newTab": true
}
}
]
},
"viz_Wa0ODFCo": {
"type": "splunk.table",
"dataSources": {
"primary": "ds_1PfTyzWO"
},
"title": "Client IPs",
"options": {
"showInternalFields": false
},
"eventHandlers": [
{
"type": "drilldown.linkToSearch",
"options": {
"type": "auto",
"newTab": true
}
}
]
},
"viz_9Ibeu0sP": {
"type": "splunk.bar",
"dataSources": {
"primary": "ds_gQX7Hk94"
},
"title": "Top 10 Hosts",
"eventHandlers": [
{
"type": "drilldown.linkToSearch",
"options": {
"type": "auto",
"newTab": true
}
}
],
"options": {
"seriesColors": [
"#00CDAF",
"#465D00",
"#7B56DB",
"#009CEB",
"#DD9900",
"#FF677B",
"#CB2196",
"#813193",
"#0051B5",
"#008C80",
"#99B100",
"#FFA476",
"#FF6ACE",
"#AE8CFF",
"#00689D",
"#00490A",
"#9D6300",
"#F6540B",
"#FF969E",
"#E47BFE"
]
}
},
"viz_4x1osOmU": {
"type": "splunk.bar",
"dataSources": {
"primary": "ds_0gvjY1LE"
},
"title": "Top 10 Web ACLs",
"eventHandlers": [
{
"type": "drilldown.linkToSearch",
"options": {
"type": "auto",
"newTab": true
}
}
]
},
"viz_nE52t5zz": {
"type": "splunk.bar",
"dataSources": {
"primary": "ds_Kilft6AS"
},
"title": "Top 10 User Agents",
"options": {
"y": "> primary | frameBySeriesNames('count')",
"seriesColors": [
"#465D00",
"#7B56DB",
"#009CEB",
"#00CDAF",
"#DD9900",
"#FF677B",
"#CB2196",
"#813193",
"#0051B5",
"#008C80",
"#99B100",
"#FFA476",
"#FF6ACE",
"#AE8CFF",
"#00689D",
"#00490A",
"#9D6300",
"#F6540B",
"#FF969E",
"#E47BFE"
]
}
},
"viz_jE1D3KY0": {
"type": "splunk.table",
"dataSources": {
"primary": "ds_mxvQGpXE"
},
"title": "Block Allow Host URI",
"eventHandlers": [
{
"type": "drilldown.linkToSearch",
"options": {
"type": "auto",
"newTab": true
}
}
]
},
"viz_4QQHrAv3": {
"type": "splunk.sankey",
"options": {},
"dataSources": {
"primary": "ds_oHTHbNiT"
}
}
},
"dataSources": {
"ds_HOn92oH4": {
"type": "ds.search",
"options": {
"query": "sourcetype=\"aws:waf\" $rule_id$\n| stats count"
},
"name": "ALL Traffic"
},
"ds_zWBSpYgI_ds_HOn92oH4": {
"type": "ds.search",
"options": {
"query": "sourcetype=\"aws:waf\" action=\"ALLOWED\" $rule_id$\n| stats count"
},
"name": "Allowed Traffic"
},
"ds_jgGJYFPI": {
"type": "ds.search",
"options": {
"query": "sourcetype=\"aws:waf\"\n| fields terminatingRuleId\n| dedup terminatingRuleId"
},
"name": "Rule IDs"
},
"ds_QleIH4ob_ds_zWBSpYgI_ds_HOn92oH4": {
"type": "ds.search",
"options": {
"query": "sourcetype=\"aws:waf\" action=\"BLOCKED\" $rule_id$\n| stats count"
},
"name": "Blocked Traffic"
},
"ds_4XYnxKBx": {
"type": "ds.search",
"options": {
"query": "sourcetype=\"aws:waf\" $action$ $rule_id$\n| rex field=webaclId \"webacl/(?<acl>.*)/\"\n| stats count by acl"
},
"name": "Web ACLs"
},
"ds_faZFYbIE": {
"type": "ds.search",
"options": {
"query": "sourcetype=\"aws:waf\" $rule_id$\n| timechart count by action"
},
"name": "Traffic by Actions"
},
"ds_nHV5TT2b": {
"type": "ds.search",
"options": {
"query": "sourcetype=\"aws:waf\" $action$ $rule_id$\n| stats count by rule"
},
"name": "WAF Rules"
},
"ds_mGIeFWPz": {
"type": "ds.search",
"options": {
"query": "sourcetype=\"aws:waf\" $action$ $rule_id$\n| stats count by http_method"
},
"name": "HTTP Methods"
},
"ds_wVhIOshu": {
"type": "ds.search",
"options": {
"query": "sourcetype=\"aws:waf\" $action$ $rule_id$\n| stats count by httpRequest.httpVersion"
},
"name": "HTTP Versions"
},
"ds_1NaPvwe9": {
"type": "ds.search",
"options": {
"query": "sourcetype=\"aws:waf\" $action$ $rule_id$\n| iplocation src\n| geostats latfield=lat longfield=lon count by City"
},
"name": "Traffic Geo Location"
},
"ds_GPxs5Q3N": {
"type": "ds.search",
"options": {
"query": "sourcetype=\"aws:waf\" $action$ $rule_id$\n| top 10 rule"
},
"name": "Top 10 Rules"
},
"ds_MjGJ6mfV": {
"type": "ds.search",
"options": {
"query": "sourcetype=\"aws:waf\" $action$ $rule_id$\n| top 10 httpRequest.country"
},
"name": "Top 10 Countries"
},
"ds_TwTEYjbU": {
"type": "ds.search",
"options": {
"query": "sourcetype=\"aws:waf\" $action$ $rule_id$\n| stats count by http_user_agent"
},
"name": "User Agents"
},
"ds_gYwdLZ6z": {
"type": "ds.search",
"options": {
"query": "sourcetype=\"aws:waf\" $action$ $rule_id$\n| stats count by uri_query\n| sort - count"
},
"name": "URI Hits"
},
"ds_1PfTyzWO": {
"type": "ds.search",
"options": {
"query": "sourcetype=\"aws:waf\" $action$ $rule_id$\n| stats count by src\n| sort - count"
},
"name": "Client IPs"
},
"ds_gQX7Hk94": {
"type": "ds.search",
"options": {
"query": "sourcetype=\"aws:waf\" $action$ $rule_id$\n| eval host=dest\n| stats count by host\n| sort - count"
},
"name": "Top 10 Hosts"
},
"ds_0gvjY1LE": {
"type": "ds.search",
"options": {
"query": "sourcetype=\"aws:waf\" $action$ $rule_id$\n| rex field=webaclId \"webacl/(?<acl>.*)/\"\n| stats count by acl\n| sort - count"
},
"name": "Top 10 Web ACLs"
},
"ds_Kilft6AS": {
"type": "ds.search",
"options": {
"query": "sourcetype=\"aws:waf\" $action$ $rule_id$\n| top 10 http_user_agent"
},
"name": "Top 10 User Agents"
},
"ds_mxvQGpXE": {
"type": "ds.search",
"options": {
"query": "sourcetype=\"aws:waf\" $action$ $rule_id$\n| eval host=dest\n| stats count by host uri_query action\n| sort - count"
},
"name": "Block Allow Host URI"
},
"ds_oHTHbNiT": {
"type": "ds.search",
"options": {
"query": "sourcetype=\"aws:waf\"\n| stats count by src dest"
},
"name": "src dest"
}
},
"defaults": {
"dataSources": {
"ds.search": {
"options": {
"queryParameters": {
"latest": "$global_time.latest$",
"earliest": "$global_time.earliest$"
}
}
}
}
},
"inputs": {
"input_global_trp": {
"type": "input.timerange",
"options": {
"token": "global_time",
"defaultValue": "-24h@h,now"
},
"title": "グローバル時間範囲"
},
"input_gL37F0a5": {
"options": {
"items": [
{
"label": "ALL",
"value": "*"
},
{
"label": "ALLOWED",
"value": "ALLOWED"
},
{
"label": "BLOCKED",
"value": "BLOCKED"
}
],
"defaultValue": "*",
"token": "action"
},
"title": "アクション",
"type": "input.dropdown"
},
"input_azSKV3V2": {
"options": {
"items": ">frame(label, value) | prepend(formattedStatics) | objects()",
"defaultValue": [
"*"
],
"token": "rule_id"
},
"title": "ルールID",
"type": "input.multiselect",
"dataSources": {
"primary": "ds_jgGJYFPI"
},
"context": {
"formattedConfig": {
"number": {
"prefix": ""
}
},
"formattedStatics": ">statics | formatByType(formattedConfig)",
"statics": [
[
"ALL"
],
[
"*"
]
],
"label": ">primary | seriesByName(\"terminatingRuleId\") | renameSeries(\"label\") | formatByType(formattedConfig)",
"value": ">primary | seriesByName(\"terminatingRuleId\") | renameSeries(\"value\") | formatByType(formattedConfig)"
}
}
},
"layout": {
"type": "grid",
"options": {
"width": 1440,
"height": 960,
"gutterSize": 12
},
"structure": [
{
"item": "viz_iFBNUWdK",
"type": "block",
"position": {
"x": 0,
"y": 0,
"w": 319,
"h": 187
}
},
{
"item": "viz_LdY8gzWH",
"type": "block",
"position": {
"x": 0,
"y": 187,
"w": 984,
"h": 513
}
},
{
"item": "viz_w4TN5aYY",
"type": "block",
"position": {
"x": 0,
"y": 700,
"w": 984,
"h": 504
}
},
{
"item": "viz_4x1osOmU",
"type": "block",
"position": {
"x": 0,
"y": 1204,
"w": 481,
"h": 381
}
},
{
"item": "viz_9Ibeu0sP",
"type": "block",
"position": {
"x": 0,
"y": 1585,
"w": 735,
"h": 259
}
},
{
"item": "viz_Wa0ODFCo",
"type": "block",
"position": {
"x": 0,
"y": 1844,
"w": 735,
"h": 537
}
},
{
"item": "viz_jE1D3KY0",
"type": "block",
"position": {
"x": 0,
"y": 2381,
"w": 1440,
"h": 400
}
},
{
"item": "viz_ACunbUJa",
"type": "block",
"position": {
"x": 319,
"y": 0,
"w": 339,
"h": 187
}
},
{
"item": "viz_plNPWtVn",
"type": "block",
"position": {
"x": 481,
"y": 1204,
"w": 474,
"h": 381
}
},
{
"item": "viz_WpbCTsFq",
"type": "block",
"position": {
"x": 658,
"y": 0,
"w": 326,
"h": 187
}
},
{
"item": "viz_nE52t5zz",
"type": "block",
"position": {
"x": 735,
"y": 1585,
"w": 705,
"h": 259
}
},
{
"item": "viz_MGB9o50s",
"type": "block",
"position": {
"x": 735,
"y": 1844,
"w": 705,
"h": 537
}
},
{
"item": "viz_hF5suwNZ",
"type": "block",
"position": {
"x": 955,
"y": 1204,
"w": 485,
"h": 381
}
},
{
"item": "viz_tEmvgIjb",
"type": "block",
"position": {
"x": 984,
"y": 463,
"w": 456,
"h": 237
}
},
{
"item": "viz_ThKEK17k",
"type": "block",
"position": {
"x": 984,
"y": 0,
"w": 456,
"h": 231
}
},
{
"item": "viz_kxCq2pZr",
"type": "block",
"position": {
"x": 984,
"y": 231,
"w": 456,
"h": 232
}
},
{
"item": "viz_e2iqxRgv",
"type": "block",
"position": {
"x": 984,
"y": 935,
"w": 456,
"h": 269
}
},
{
"item": "viz_xqJDMQGh",
"type": "block",
"position": {
"x": 984,
"y": 700,
"w": 456,
"h": 235
}
},
{
"item": "viz_4QQHrAv3",
"type": "block",
"position": {
"x": 0,
"y": 2781,
"w": 1440,
"h": 400
}
}
],
"globalInputs": [
"input_global_trp",
"input_gL37F0a5",
"input_azSKV3V2"
]
},
"description": "",
"title": "AWS WAF"
}