EC2 不能 0.0.0.0/0 說多痛就有多痛

#ami #aws #cidr #nodejs #route-53 #security-group #vpc #vpc-endpoint

身為一個 PHP Developer,開了一台 ec2 instance,當然馬上就是進去:

有時為了資安,所以 outbound 再也單純設成 0.0.0.0/0,而本篇文章是記錄我想的到的解法

2022/6/18:調整關於 Lambda 維護 Prefix List 的描述



Instance 啟動後要安裝的套件

上面提到的指令會用到這些 domain:

如果去 dig 他們,會發現每一個 domain 都對到多個 IP,我們需要把每一個 IP 加到 outbound rules。
只是說這些 IP 可能會不斷調整…



有幾個解法:

  1. 把連線到這些網域的事情提早做完:Pre-built image

  2. 寫一支 Lambda 去維護 Security Group 的 outbound(AWS IP Range、DNS query)

  3. 免費的 Gateway Endpoint for S3 / Dynamodb

  4. Interface Endpoint

第一個選項就是要寫 Packer 來打包 AMI
第二個選項會遇到 rules per security group 預設只有 60 條,必須要申請提高到 200 再搭配 Prefix List
第三個選項是免費的,但僅限於 S3 / Dynamodb
第四個選項則是每使用一個 AWS 端點,就要建一個以上的 Interface Endpoint(為了HA就要在每個AZ都建立),太貴



AWS IP Range

我只需要用 region = ap-northeast-1 & service = AMAZON 來篩選便會得到 170 組 CIDR,
再把這些 CIDR 全部加到 Prefix list 並掛進 Security group 即可

    {
      "ip_prefix": "13.34.37.64/27",
      "region": "ap-southeast-4",
      "service": "AMAZON",
      "network_border_group": "ap-southeast-4"
    }



在 Lambda 裡面做 DNS Query

可以用 nodejs 的 DNS library 做查詢,並且用 AWS SDK 把查詢到的 IP 寫回 Prefix List

Lambda:每分鐘執行一次的話,一個月是執行 43200 次,總共是 0.06 USD
Route53:每次執行查詢 20 個 domain,一個月總共查詢 864000 次,總共約 0.3 USD



不知道到底呼叫了哪些 Domain…

可以打開 Route 53 Public DNS Query Logging
流量小的話可以存到 Cloudwatch 直接看;
流量大的話還是存到 S3 再用 Lambda 或 jq 處理一下吧