CentOS8で構築する自宅サーバ:Firewallで不正アクセスをブロック

日本zoneの追加

以前、Firewallの設定を行いましたが、OSのバグでうまくいきませんでした。

今朝、CentOSをアップデートしてみると…

[root@ace zeke]# dnf info nftables
メタデータの期限切れの最終確認: 0:00:06 時間前の 2020年04月16日 07時28分13秒 に 実施しました。
インストール済みパッケージ
名前         : nftables
エポック     : 1
バージョン   : 0.9.0
リリース     : 14.el8_1.1
Arch         : x86_64
サイズ       : 851 k
ソース       : nftables-0.9.0-14.el8_1.1.src.rpm
リポジトリー : @System
repo から    : BaseOS
概要         : Netfilter Tables userspace utillites
URL          : http://netfilter.org/projects/nftables/
ライセンス   : GPLv2
説明         : Netfilter Tables userspace utilities.
:
省略
:
[root@ace zeke]#

おっ、Firewall関係のパッケージがアップデートされていますよ。設定に再挑戦です。

[root@ace zeke]# firewall-cmd --list-all-zones
:
省略
:
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp0s3
  sources:
  services: dns ftp irc
  ports: 5500-5501/tcp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:


trusted (active)
  target: ACCEPT
  icmp-block-inversion: no
  interfaces:
  sources: 192.168.1.0/24 2001:2c0:cd03:ca00::/64 fe80::/64
  services:
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
:
省略
:
[root@ace zeke]#

今の設定に、日本からのアクセスのゾーンを追加して、サービスを振り分けます。

[root@ace ~]# firewall-cmd --permanent --new-zone=japan
success
[root@ace ~]# firewall-cmd --permanent --zone=japan --add-service=dns
success
[root@ace ~]# firewall-cmd --permanent --zone=japan --add-service=ftp
success
[root@ace ~]# firewall-cmd --permanent --zone=japan --add-service=irc
success
[root@ace ~]# firewall-cmd --permanent --zone=japan --add-service=ssh
success
[root@ace ~]# firewall-cmd --permanent --zone=japan --add-port=5500-5501/tcp
success
[root@ace ~]# firewall-cmd --permanent --zone=japan --add-source=::/0
success
[root@ace ~]# wget -P /tmp https://ipv4.fetus.jp/jp.txt
--2020-04-16 06:59:42--  https://ipv4.fetus.jp/jp.txt
ipv4.fetus.jp (ipv4.fetus.jp) をDNSに問いあわせています... 2401:2500:102:3043:153:126:214:91, 153.126.214.91
ipv4.fetus.jp (ipv4.fetus.jp)|2401:2500:102:3043:153:126:214:91|:443 に接続して います... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 特定できません [text/plain]
`/tmp/jp.txt' に保存中

jp.txt                  [ <=>                ]  43.70K  --.-KB/s 時間 0.05s

2020-04-16 06:59:42 (810 KB/s) - `/tmp/jp.txt' へ保存終了 [44748]

[root@ace ~]# firewall-cmd --permanent --new-ipset=JAPAN --type=hash:net
success
[root@ace ~]# firewall-cmd --permanent --ipset=JAPAN --add-entries-from-file=/tmp/jp.txt
success
[root@ace ~]# firewall-cmd --permanent --info-ipset=JAPAN
JAPAN
  type: hash:net
  options:
  entries: 1.0.16.0/20 1.0.64.0/18 1.1.64.0/18 1.5.0.0/16 1.21.0.0/16 1.33.0.0/16
:
省略
:
[root@ace ~]# firewall-cmd --permanent --zone=japan --add-source=ipset:JAPAN
success
[root@ace ~]# firewall-cmd --reload
success
[root@ace ~]#

[root@ace ~]# firewall-cmd --list-all-zones
:
省略
:
japan (active)
  target: default
  icmp-block-inversion: no
  interfaces:
  sources: ::/0 ipset:JAPAN
  services: dns ftp irc ssh
  ports: 5500-5501/tcp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:


public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp0s3
  sources:
  services: dns ftp irc
  ports: 5500-5501/tcp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:


trusted (active)
  target: ACCEPT
  icmp-block-inversion: no
  interfaces:
  sources: 192.168.1.0/24 2001:2c0:cd03:ca00::/64 fe80::/64
  services:
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
:
省略
:
[root@ace ~]#
  1. japanゾーンを作成
  2. 従来のサービス+sshサービスをjapanゾーンに追加
  3. ::0(IPv6のIPアドレスすべて)からの接続を許可
  4. https://ipv4.fetus.jp/jp.txtを取得
  5. JAPANという名前でipsetを作成
  6. ipsetにjp.txtの内容を登録
  7. ipsetからの接続を許可
  8. firewallを更新

という手順で、Firewallを設定しました。これで、日本以外からssh接続できなくなりました!

でも、IPリストが長いので、「firewall-cmd –reload」コマンドで時間がかかるようになりました。

日本のIPアドレスリストは、更新しなくてはいけませんが、IPv4アドレスはすでに枯渇しているので、割当の変更は殆どないと思います。困ったときに考えましょう。

今回は、sshを登録しましたが、他にもftp,pop3,imap,submissionなどの認証が必要なサービスについて制限をかけることを考えています。

しつこく辞書攻撃(パスワード破り)をされると、何百万回に一回は突破されることもあるかもしれないので。

今回はこちらのページを参考にさせていただきました。

Firewallの設定変更

firewalldでエラーが出るようになりました。

[root@ace zeke]# cat /var/log/firewalld
:
省略
:
2020-04-16 06:37:33 ERROR: Invalid option: 'AllowZoneDrifting=yes'
2020-04-16 06:37:36 WARNING: AllowZoneDrifting is enabled. This is considered an insecure configuration option. It will be removed in a future release. Please consider disabling it now.

[root@ace zeke]#

メッセージに従って、設定を変更します。

[root@ace zeke]# cp -p /etc/firewalld/firewalld.conf /etc/firewalld/firewalld.conf.orig
[root@ace zeke]# vi /etc/firewalld/firewalld.conf
[root@ace zeke]# diff /etc/firewalld/firewalld.conf /etc/firewalld/firewalld.conf.orig
85c85
< AllowZoneDrifting=no
---
> AllowZoneDrifting=yes
[root@ace zeke]#

[root@ace zeke]# systemctl restart firewalld
[root@ace zeke]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor p>
   Active: active (running) since Sun 2020-05-10 14:40:56 JST; 8s ago
     Docs: man:firewalld(1)
 Main PID: 10475 (firewalld)
    Tasks: 3 (limit: 12535)
   Memory: 22.3M
   CGroup: /system.slice/firewalld.service
           tq10475 /usr/libexec/platform-python -s /usr/sbin/firewalld --nofork>
           mq12142 /usr/sbin/nft --echo --handle add element inet firewalld JAP>

 5月 10 14:40:56 ace.lo.zeke.ne.jp systemd[1]: Starting firewalld - dynamic fir>
 5月 10 14:40:56 ace.lo.zeke.ne.jp systemd[1]: Started firewalld - dynamic fire>
[root@ace zeke]#

オプションをAllowZoneDrifting=noに変更して、再起動をかけてみました。

AllowZoneDriftingってなに?

firewalldのオプションのAllowZoneDriftingですが、以下のようなことのようです。

japan (active)
  target: default
  icmp-block-inversion: no
  interfaces:
  sources: ::/0 ipset:JAPAN
  services: ssh
  ports:
:
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp0s3
  sources:
  services: dns ftp irc
  ports: 5500-5501/tcp
:

このような2つのゾーンがあって、国内のIPアドレスからインターフェースenp0s3に対して、ssh接続した場合、japanゾーンに従って接続可能です。

同様に国内のIPアドレスからインターフェースenp0s3に対して、ftp接続した場合、japanゾーンには該当しませんが、publicゾーンには該当するので、それに従って接続可能となる、このことを、「AllowZoneDrifting」といっているようです。

逆に、AllowZoneDrifting=noと設定すると、国内のIPアドレスからインターフェースenp0s3に対して、ssh接続しかできなくなります。

よって、AllowZoneDrifting=yesのときと同じ動作にするためには、

japan (active)
  target: default
  icmp-block-inversion: no
  interfaces:
  sources: ::/0 ipset:JAPAN
  services: dns ftp irc ssh
  ports: 5500-5501/tcp
:
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp0s3
  sources:
  services: dns ftp irc
  ports: 5500-5501/tcp
:

このように、japanゾーンに許可するサービスをすべて書かなければいけません。

冗長だけど、わかりやすい記述になるのではないでしょうか?

Kindle Unlimited入会で無料で読めます!

コメント