前言

因為看到 GCP 沒有上任何防護,被打 DDoS 造成流量費用暴增的案例,想來盤點一下公司有哪些 domain 是沒有上 CDN (cloudfront) 保護的。

其實網頁就能查詢,但為了方便填到 Jira issue 上,所以用了 aws CLI 搭配 jq 來查詢。藉機熟悉一下 jq 的使用方式。此篇筆記非常沒有結構性,主要紀錄 jq 用法

Input 範例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
{
    "ResourceRecordSets": [
        {
            "Name": "xxzk.me.",
            "Type": "NS",
            "TTL": 172800,
            "ResourceRecords": [
                {
                    "Value": "ns-1769.awsdns-29.co.uk."
                },
                {
                    "Value": "ns-1182.awsdns-19.org."
                }
            ]
        },
        {
            "Name": "google.xxzk.me.",
            "Type": "CNAME",
            "TTL": 300,
            "ResourceRecords": [
                {
                    "Value": "google.com"
                }
            ]
        },
        {
            "Name": "sub.xxzk.me.",
            "Type": "CNAME",
            "TTL": 300,
            "ResourceRecords": [
                {
                    "Value": "use-cloudfront.net"
                }
            ]
        },
    ]
}

附件 - shell script

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/bin/bash

set -e

ZONE_ID=$1

[[ "$ZONE_ID" == "" ]] && echo "Usage: $0 <zone-id>" && exit 1

## Type 是 CNAME 且 Value 包含 cloudfront 的 DNS record
# JQ_QUERY='
# (.ResourceRecordSets[]? | select(.Type =="CNAME") | select(.ResourceRecords[].Value | contains("cloudfront")) 
# | [.Name, .ResourceRecords[].Value] | @csv)
# '


## ===== 備用 JQ_QUERY =====

## Type 是 CNAME 且 Value 「不」包含 cloudfront 的 DNS record

# JQ_QUERY='
# (.ResourceRecordSets[]? | select(.Type =="CNAME") | select(.ResourceRecords[].Value | contains("cloudfront") | not) 
# | [.Name, .ResourceRecords[].Value] | @csv)
# '

## -----------------

# -r: raw output
aws route53 list-resource-record-sets --hosted-zone-id $ZONE_ID | jq -r "$JQ_QUERY"

參考資料