ある日、本番サーバーにたくさんの不正ログインを試みた形跡がみられました!その時の記事がこちら。
怖い!どうしよう!IPを調べたところ、全て海外からのアクセスだったので、ひとまず海外からのログインリクエストは全て遮断する方法を探しました。たくさん調べた中で、こちらの記事がとても参考になりました。よし、firewalldを使って対策しよう!と決めました。実際にどのファイルをどう修正したのか、記録します。
firewalldでの海外不正アクセス対策の手順
全体像のイメージは以下の通り。国内からのリクエストの場合と、海外からのリクエストの場合で検証内容を変更し、接続可能・拒否判定を行います。
対策対象サーバーにログイン
まずはサーバーにログインしてください。普通にいつも通り。
現在の設定状況を確認する
以下コマンドでfirewalldをスタート。
# systemctl start firewalld
その後、現在の設定一覧を確認します。
# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: cockpit dhcpv6-client http ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
特に何も制限を設けていないことがわかりました。
許可する接続を設定
まずはhttp接続を許可する設定をします。
# firewall-cmd --permanent --zone=public --add-service=http
Warning: ALREADY_ENABLED: http
success
すでに許可されていたようですが、完了。
続いて、httpsも許可しましょう。
# firewall-cmd --permanent --zone=public --add-service=https
success
アクセスを拒否するIPの設定
では続いて、海外からのリクエストを拒否していきます。まずはフォルダ作成から。
# mkdir /root/iptables
続いて、上で作った階層にシェルを作り、中身を用意していきます。
# vi /root/iptables/jpip_setup.sh
シェルの中身はこんな感じ。APNICのソースを使って、日本国内のIPかどうかを判定できるようにします。そしてその中身はjpipファイルの中に。
#!/bin/bash
COUNTRYLIST='JP'
curl -s -o /root/iptables/delegated-apnic-latest http://ftp.apnic.net/stats/apnic/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
完了したら、ファイルへのアクセス権限を変更しましょう。
# chmod 700 /root/iptables/jpip_setup.sh
シェルを実行します。
# /root/iptables/jpip_setup.sh
firewalldの設定
続いて、firewalldに設定を入れていきます。デフォルトで「public」という設定があるのですが、今回は「domestic」という名前の日本国内ゾーン設定を新規で作成します。日本国内からのリクエストはfirewallに到達した時、「domestic」ゾーン設定の通って、許可・拒否判定をしますが、海外からのリクエストはfirewallに到達した時、「public」ゾーンの設定を通って許可・拒否判定が行われます。
日本国内用のdomesticゾーン設定を作成
コマンドはこんな感じ。新規のゾーン設定を作成し、先ほど作成したjpipファイルを許可IPとして設定します。
# firewall-cmd --permanent --new-zone=domestic
success
# firewall-cmd --permanent --new-ipset=domestic --type=hash:net
success
# firewall-cmd --permanent --ipset=domestic --add-entries-from-file=/root/iptables/jpip
success
では、今の段階で設定を見てみましょう。
# firewall-cmd --permanent --info-ipset=domestic
domestic
type: hash:net
options:
entries:
「domestic」という名前のゾーン設定ができました!詳細を追加していきましょう。
# firewall-cmd --permanent --zone=domestic --add-source=ipset:domestic
success
# firewall-cmd --permanent --zone=domestic --add-service=http
success
# firewall-cmd --permanent --zone=domestic --add-service=https
success
# firewall-cmd --reload
success
#
ここまででdomesticゾーン設定が完成。日本国内からのリクエストはここを通ることになります。
public設定を変更
海外からのリクエストが通るpublic設定を変更します。接続拒否の設定をします。
# firewall-cmd --permanent --zone=public --remove-service=http
success
# firewall-cmd --permanent --zone=public --remove-service=https
success
これで完成です!海外からのhttpリクエスト、httpsリクエストを全て拒否する設定をしました。
firewalldをリロード
設定変更が完了したので、firewalldをリロードします。
# firewall-cmd --reload
success
#
これで、海外からのリクエスト拒否が完成しました!
コメント