どもども。ギークフィードのクラウドサーバー管理担当、ippeiです。
某VPS上で動かしているwordpressサーバーが最近海外からの攻撃的アクセスを受けるようになってしまったので、
firewalldでのアクセス制御をすることにしました。
このwordpressサーバーがちょっと曲者で、全部で5,60のwordpressが乗っていますが、
CloudFrontのオリジンとして使用しているものもあります。(このホームページとか)
単純に日本だけアクセス許可としてしまうと、CloudFront経由でのアクセスができなくなってしまいます。
なので、CloudFrontのグローバルIPも許可することがミソになります。
というわけでやっていきましょう。
目次
日本国内のIPリストを作る
国内のIPリストを作成するシェルスクリプトが以下です。
/root/iptables
以下に配置する想定です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#!/bin/bash COUNTRYLIST='JP' wget -q http://ftp.apnic.net/stats/apnic/delegated-apnic-latest -O /root/iptables/delegated-apnic-latest :> /root/iptables/jpip for country in $COUNTRYLIST do for ip in `cat delegated-apnic-latest | grep "apnic|$country|ipv4|"` do COUNTRY=`echo $ip | awk -F"|" '{ print $2 }'` IPADDR=`echo $ip | awk -F"|" '{ print $4 }'` TMPCIDR=`echo $ip | awk -F"|" '{ print $5 }'` FLTCIDR=32 while [ $TMPCIDR -ne 1 ]; do TMPCIDR=$((TMPCIDR/2)) FLTCIDR=$((FLTCIDR-1)) done echo "$IPADDR/$FLTCIDR" >> /root/iptables/jpip done done |
最初のCOUNTRYLISTの値を、’JP NZ AU’などとすることで複数の国を指定可能です。
/root/iptables/jpip
にIPリストのファイルが作成されます。
CloudFrontのグローバルIPリストを作る
続いてCloudFrontのIPリストを作成します。
こちらも同じ/root/iptablesディレクトリに配置する想定です。
1 2 3 4 5 6 7 8 9 10 11 12 |
#!/bin/bash wget -q https://ip-ranges.amazonaws.com/ip-ranges.json -O /root/iptables/ip-ranges.json rm -f /root/iptables/cloudfront_ip json=$(cat ip-ranges.json | jq ".prefixes") json=$(echo $json | jq 'map(select( .["service"] == "CLOUDFRONT"))') len=$(echo $json | jq length) for i in $( seq 0 $(($len - 1)) ); do row=$(echo $json | jq .[$i]) ip_prefix=$(echo $row | jq -r ".ip_prefix") echo $ip_prefix >> /root/iptables/cloudfront_ip done |
AWSは各サービスのグローバルIPをjson形式で公開しています。
このページをスクレイピングすることで、特定サービスのIPリストを取得できます。
記事執筆時には、CloudFrontのipv4グローバルIPが68個ありました。
これらは世界中のエッジサーバーのIPも含まれます。
/root/iptables/cloudfront_ip
にIPリストのファイルが作成されます。
firewalldにIPリストをフィルターとして設定する
ここまできたら、あとはfirewalldコマンドでちょちょいと設定するだけです。
以下に従って実行してみましょう。
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 38 39 40 41 |
# domestic(国内)というゾーンを作成します。 firewall-cmd --permanent --new-zone=domestic # domestic という ipset を作成して type を hash:net にします。 firewall-cmd --permanent --new-ipset=domestic --type=hash:net # 上記で作った国内のIPリストファイルをこの ipset に読み込みます。 firewall-cmd --permanent --ipset=domestic --add-entries-from-file=/root/iptables/jpip # この ipset に国内IPリストが読み込まれているか確認します。 firewall-cmd --permanent --info-ipset=domestic # 読み込まれた ipset をこのゾーンに適用します。 firewall-cmd --permanent --zone=domestic --add-source=ipset:domestic # 同様に、cloudfrontという ipset を作成します。 firewall-cmd --permanent --new-ipset=cloudfront --type=hash:net # 上記で作ったCloudFrontのIPリストファイルをこの ipset に読み込みます。 firewall-cmd --permanent --ipset=cloudfront --add-entries-from-file=/root/iptables/cloudfront_ip # この ipset にcloudfrontIPリストが読み込まれているか確認します。 firewall-cmd --permanent --info-ipset=cloudfront # 読み込まれた ipset をこのゾーンに適用します。 firewall-cmd --permanent --zone=domestic --add-source=ipset:cloudfront # ゾーン publicでこれまでhttp, httpsのアクセス制御を行っている場合、 # ゾーン public から http と https を除外します。 firewall-cmd --permanent --zone=public --remove-service=http firewall-cmd --permanent --zone=public --remove-service=https # ゾーン domestic に http と https を追加します。 firewall-cmd --permanent --zone=domestic --add-service=http firewall-cmd --permanent --zone=domestic --add-service=https #firewalldのリロード firewall-cmd --reload |
これにて設定完了です。
海外からの不正アクセスを防ぎつつ、CloudFrontからは世界中のアクセスを受け入れることができます。
TIPS: 定期的に更新をしよう
このAWSのグローバルIPリストは定期的に更新されます。
基本的には追加だけだと思いますが、その対策として定期的にこのフィルターも更新しましょう。
やりかたは簡単で、上記のスクリプトに下の行を追加するだけです。
CloudFrontの定期実行用追記
1 2 3 |
firewall-cmd --permanent --ipset=cloudfront --add-entries-from-file=/root/iptables/cloudfront_ip firewall-cmd --permanent --zone=domestic --add-source=ipset:cloudfront firewall-cmd --reload |
追記できたら、crontabに登録します。
更新頻度も低いので月イチとかで良さそうです。
1 0 1 * */root/iptables/cloudfrontip.sh
rootユーザーの実行権限をつけるのを忘れずに。
まとめ
- 各国のIPリストを公開しているところから国内IPリストを作ろう
- AWSの各サービスのグローバルIPリストからCloudFrontのIPリストを作ろう
- firewalldのipsetを作ってフィルターをかけよう
- AWSのグローバルIPは更新されるから定期実行がオススメ
雑記
今回初めてwordpressのビジュアルエディタで執筆してみました。
今までは全部html書いてました。
圧倒的に書くスピードが早くなったけど、若干行間の感じとかが好みじゃない。。
ブログ執筆数を増やしていきたいので、今後はこのスタイルでやっていきます!
参考にさせていただいたリンク
- 組織内のIPv4アドレス(EIP)を自動通知してコスト削減する - 2024-12-03
- 組織内のAWSコスト最適化のためにやっている7つのこと - 2024-12-01
- Amazon Connect Contact Lens + iPaaSで生成AI活用&他サービス連携を簡単に実現!– Amazon Connect アドベントカレンダー 2024 - 2024-12-01
- AWS Step Functionsの基本を再学習しました - 2024-09-23
- Amazon SESでバウンスメールを管理する - 2024-07-07