ホームページをfirewalldで国内とCloudFrontからのみアクセス可能にしたい

どもども。ギークフィードのクラウドサーバー管理担当、ippeiです。

某VPS上で動かしているwordpressサーバーが最近海外からの攻撃的アクセスを受けるようになってしまったので、

firewalldでのアクセス制御をすることにしました。

 

このwordpressサーバーがちょっと曲者で、全部で5,60のwordpressが乗っていますが、

CloudFrontのオリジンとして使用しているものもあります。(このホームページとか)

単純に日本だけアクセス許可としてしまうと、CloudFront経由でのアクセスができなくなってしまいます。

 

なので、CloudFrontのグローバルIPも許可することがミソになります。

というわけでやっていきましょう。

 

目次

日本国内のIPリストを作る

国内のIPリストを作成するシェルスクリプトが以下です。

/root/iptables

以下に配置する想定です。

 

#!/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ディレクトリに配置する想定です。

 

#!/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コマンドでちょちょいと設定するだけです。

以下に従って実行してみましょう。

 

# 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の定期実行用追記

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書いてました。

圧倒的に書くスピードが早くなったけど、若干行間の感じとかが好みじゃない。。

ブログ執筆数を増やしていきたいので、今後はこのスタイルでやっていきます!

 

参考にさせていただいたリンク

firewalldで国内IPのみ許可

この記事が気に入ったら
いいね ! しよう

Twitter で

【採用情報】一緒に働く仲間を募集しています

採用情報
ページトップへ