CentOSなどのlinuxサーバにおいて、セキュリティを強化するのにfirewalldが有効です。アクセス元が固定IPアドレスを使用していれば、そのIPアドレスに許可設定を実施すればよいのですが、動的IPアドレスであるのが一般的です。つまりアクセス制限を実施しても、次にアクセスする際には別のIPアドレスに変わってしまい、アクセスできなくなります。そこで、せめて日本国内のIPアドレスに制限して、アクセス制限を実施する方法を紹介します。
なお、日本国内に限定したからといって決して「安全」であるとは限らない事、あらかじめ申し伝えておきます。その理由は、日本にも悪さをする人はいますし、日本国内のPCがウィルスなどに感染して、そこから攻撃を受ける可能性もあります。しかし私の経験上、変なアクセスはほぼなくなるので、海外に開放している場合よりだいぶマシにはなります。
海外からのアクセスを拒否、ブロックし日本国内からのみ許可する設定
早速、具体的に設定する方法を記載します。まず、日本のIPのリストを https://ipv4.fetus.jp/jp.txt よりダウンロードします。
以下のコマンドを実行して、domestic(国内) ゾーンを作成します。
# firewall-cmd --permanent --new-zone=domestic
次に、domestic 用の ipset を作成し、そこにIPアドレスリストファイルを流し込み、 ipset を domestic ゾーンに適用します。
# firewall-cmd --permanent --new-ipset=domestic --type=hash:net
# firewall-cmd --permanent --ipset=domestic --add-entries-from-file=jp.txt
# firewall-cmd --permanent --zone=domestic --add-source=ipset:domestic
作成したdomesticゾーンにサービスを適用します。ここではSSHのみ許可します。
# firewall-cmd --permanent --add-service=ssh --zone=domestic
# firewall-cmd --reload
設定に問題がないか、以下のコマンドで確認します。
<アクティブになっているゾーンの確認>
# firewall-cmd --get-active-zones
(実行結果の例)
domestic ←設定したdomesticゾーンが有効になっている
sources: ipset:domestic ←アクセス元はipsetで定義
public ←publicゾーンも有効になっている
interfaces: enp2s0
<domesticゾーンの設定を確認>
# firewall-cmd --list-all --zone=domestic
(実行結果の例)
domestic (active) ←アクティブ(有効)になっている
target: default
icmp-block-inversion: no
interfaces:
sources: ipset:domestic ←アクセス元はipsetで定義
services: ssh ←sshのサービスを許可
ports:
protocols:
forward: no
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
<domesticゾーンに設定されているipsetの詳細を確認>
# firewall-cmd --permanent --ipset=domestic --get-entries
(実行結果の例)
1.0.16.0/20
1.0.64.0/18
1.1.64.0/18
…
(以下略)
このような形で、日本のIPアドレスが全て列記
最後に、自宅からなど日本国内から実際にSSHでアクセスできるか確認します。海外からの確認は難しいのですが、もしAWSをご利用の場合は、アクセス元がUS(アメリカ合衆国)になるので、動作確認ができると思います。
設定の確認は目視も必要ですが、実際にアクセスしてみて問題ないかを確認することも必要です。私もちゃんと設定できていると思っていても、ちょっとした見間違いや勘違いで、実際にアクセスすると出来ない事が良くあります。次で紹介する項目も含めてしっかり確認するようにしましょう!
海外からの攻撃が遮断されているか確認する
さて、前項でSSHは日本国内からのアクセスに限定したわけですが、ここでいくつか注意点があります。
<注意点1:publicゾーンのSSHの設定>
どうすればよい?CentOSのFirewallを無効・停止せず設定する方法で紹介している通り、初期設定のルールを無効にしていれば良いのですが、もしそちらを設定していなければ、標準でSSHはpublicゾーンで許可されていますので、今回の設定をしても通過してしまいます。domesticの設定を実施した後は、publicゾーンに同じルールが存在しないか確認しましょう。
<注意点2:ドロップログを出力する設定>
Firewallでブロックされたかどうかを確認するには、ドロップログを出力するように設定し、ログファイルでアクセスが拒否されているかを確認します。ドロップログを出力する設定は、
# firewall-cmd --set-log-denied=all
# firewall-cmd --get-log-denied
のコマンドで設定します。allの代わりに、unicast、broadcast、multicast、off というオプションもあって、broadcastやmulticastのログが多くて嫌な場合は、unicastにすれば良いです。
なお、上記のいずれも設定後は、以下のreloadコマンドを忘れずに!
# firewall-cmd --reload
これを実行すると、/var/log/messagesファイルにドロップされたログが出力されます。
<注意点3:IPアドレスのリストは日々更新されている>
日本のIPのリストをダウンロードしてきましたが、IPアドレスのリストは日々更新されています。日本のIPアドレスは2億個近くあるので、ピンポイントでこのリストから外れている、ということは滅多にないと思いますが、可能性としては0ではありません。定期的に最新のリストに更新するようにしましょう。自動で更新する方法を紹介しているサイトもあります。
私個人的には、半年 or 1年に1回程度更新すればよいのではないかと考えています。
HTTPでの利用が推奨されるケース
ここで一つ海外からのアクセスを制限し、日本国内からに限定した方がよいケースを、事例を用いて紹介します。それは、HTTP(HTTPS)のアクセスで、管理者サイトや明らかに日本からのみしか閲覧しないページなどです。
管理者サイトは、本来であれば、管理者がアクセスしうる固定IPアドレスを設定するのが望ましいですが、動的IPアドレスで変わってしまう場合もあるので、世界に開放するよりまだ安全な日本からのみ開放する、という考えになります。
次に、日本からのみしか閲覧しないページですが、例えば、国内で開催する検定試験やセミナーといった日本国内向けのサイトでは、海外からもアクセス可能にしておく理由は少ないと思います。そのようにある程度用途が限定できるサイトは、国内限定にした方がよりセキュアになります。
ただしこれにはデメリットもあり、検索サイトのロボットは基本的には海外からやってくるので、検索にヒットしないなどの弊害も考えられます。身内や仲間内にしか公開しないサイトであれば問題ないですね。
アクセス元を制限するとセキュアになる反面、グーグルにヒットしなくなるというデメリットもあります。これらが問題がないことを確認して設定するようにしましょう。
セキュアなサーバ構築はアクセス制限から
ここまで海外からのアクセスを制限し、日本国内からのみアクセス許可を設定する方法を述べてきました。基本的にアクセスしうるIPアドレスが少ないほど、安全にサーバを運用できますので、これをしっかり守って、セキュアなサーバ構築を実施ください。
私は、インターネット側にファイアウォールが存在していても、Linuxサーバ側でもfirewalldを有効にし、2重にアクセス制限を実施しています。
それぞれ同じポートが開いているので意味が無いように思われますが、イントラ側に悪いサーバ(ウィルスに感染したサーバ)がいる可能性もあります。また、何かの設定時に誤って開放してしまう場合もあると思います。その時に2重になっていれば、どちらかでブロックしてくれますので、私は設定しておいた方が良いと考えます。手間はかかりますが、是非設定を実施ください。
今回はここまでです。最後までお読みいただきありがとうございました。