AlmaLinux8 firewalldの設定

スポンサーリンク

firewalldを設定して不要なサービスにアクセスさせないようセキュリティを強化します。

まずインストール直後にどのようになっているか確認しておきます。デフォルトはpublicゾーンにアタッチされており、許可されているサービスとしてcockpit/dhcpv6-client/sshのみ許可されています。

# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp2s0f0
  sources:
  services: cockpit dhcpv6-client ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

public以外にも多数のゾーンが定義されています。必要に応じてpublicからその他へ適用替えすればよいのですが、基本はデフォルトのpublicのままで良いです。

# firewall-cmd --list-all-zone
block
target: %%REJECT%%
icmp-block-inversion: no
interfaces:
sources:
services:
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

dmz
target: default
icmp-block-inversion: no
interfaces:
sources:
services: ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

drop
target: DROP
icmp-block-inversion: no
interfaces:
sources:
services:
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

external
target: default
icmp-block-inversion: no
interfaces:
sources:
services: ssh
ports:
protocols:
masquerade: yes
forward-ports:
source-ports:
icmp-blocks:
rich rules:

home
target: default
icmp-block-inversion: no
interfaces:
sources:
services: cockpit dhcpv6-client mdns samba-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

internal
target: default
icmp-block-inversion: no
interfaces:
sources:
services: cockpit dhcpv6-client mdns samba-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

nm-shared
target: ACCEPT
icmp-block-inversion: no
interfaces:
sources:
services: dhcp dns ssh
ports:
protocols: icmp ipv6-icmp
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
rule priority="32767" reject

public (active)
target: default
icmp-block-inversion: no
interfaces: enp2s0f0
sources:
services: cockpit dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

trusted
target: ACCEPT
icmp-block-inversion: no
interfaces:
sources:
services:
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

work
target: default
icmp-block-inversion: no
interfaces:
sources:
services: cockpit dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

これらのゾーンを付け替える場合は以下のコマンドで実行可能です。

※デフォルトゾーンの確認
firewall-cmd --get-default-zone
public

※デフォルトゾーンの変更
firewall-cmd --set-default-zone=external
success

※ゾーンのインターフェイスを付け替える
firewall-cmd --zone=trusted --change-interface=enp2s0f0
success


デフォルトだとcockpit/dhcpv6-client/sshの3つのサービスしか許可されていませんので、必要に応じてサービス等を追加する必要があります。httpやhttpsなどは送信元を絞らずにanyで許可とする事が多いことからサービスだけを足すというやり方になります。

# firewall-cmd --add-service=http --add-service=https --permanent
# firewall-cmd --reload
# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp2s0f0
  sources:
  services: cockpit dhcpv6-client http https ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

逆に不要なサービスを削る場合はremoveします。

# firewall-cmd --remove-service=dhcpv6-client --permanent
# firewall-cmd --reload
# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp2s0f0
  sources:
  services: cockpit http https ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

これらのサービス名は以下のディレクトリで定義されています。

# ls /usr/lib/firewalld/services/
RH-Satellite-6.xml       ganglia-client.xml     ms-wbt.xml                sip.xml
amanda-client.xml        ganglia-master.xml     mssql.xml                 sips.xml
amanda-k5-client.xml     git.xml                murmur.xml                slp.xml
amqp.xml                 grafana.xml            mysql.xml                 smtp-submission.xml
amqps.xml                gre.xml                nfs.xml                   smtp.xml
apcupsd.xml              high-availability.xml  nfs3.xml                  smtps.xml
audit.xml                http.xml               nmea-0183.xml             snmp.xml
bacula-client.xml        https.xml              nrpe.xml                  snmptrap.xml
bacula.xml               imap.xml               ntp.xml                   spideroak-lansync.xml
bb.xml                   imaps.xml              nut.xml                   spotify-sync.xml
bgp.xml                  ipp-client.xml         openvpn.xml               squid.xml
bitcoin-rpc.xml          ipp.xml                ovirt-imageio.xml         ssdp.xml
bitcoin-testnet-rpc.xml  ipsec.xml              ovirt-storageconsole.xml  ssh.xml
bitcoin-testnet.xml      irc.xml                ovirt-vmconsole.xml       steam-streaming.xml
bitcoin.xml              ircs.xml               plex.xml                  svdrp.xml
bittorrent-lsd.xml       iscsi-target.xml       pmcd.xml                  svn.xml
ceph-mon.xml             isns.xml               pmproxy.xml               syncthing-gui.xml
ceph.xml                 jenkins.xml            pmwebapi.xml              syncthing.xml
cfengine.xml             kadmin.xml             pmwebapis.xml             synergy.xml
cockpit.xml              kdeconnect.xml         pop3.xml                  syslog-tls.xml
collectd.xml             kerberos.xml           pop3s.xml                 syslog.xml
condor-collector.xml     kibana.xml             postgresql.xml            telnet.xml
ctdb.xml                 klogin.xml             privoxy.xml               tentacle.xml
dhcp.xml                 kpasswd.xml            prometheus.xml            tftp-client.xml
dhcpv6-client.xml        kprop.xml              proxy-dhcp.xml            tftp.xml
dhcpv6.xml               kshell.xml             ptp.xml                   tile38.xml
distcc.xml               kube-apiserver.xml     pulseaudio.xml            tinc.xml
dns-over-tls.xml         ldap.xml               puppetmaster.xml          tor-socks.xml
dns.xml                  ldaps.xml              quassel.xml               transmission-client.xml
docker-registry.xml      libvirt-tls.xml        radius.xml                upnp-client.xml
docker-swarm.xml         libvirt.xml            rdp.xml                   vdsm.xml
dropbox-lansync.xml      lightning-network.xml  redis-sentinel.xml        vnc-server.xml
elasticsearch.xml        llmnr.xml              redis.xml                 wbem-http.xml
etcd-client.xml          managesieve.xml        rpc-bind.xml              wbem-https.xml
etcd-server.xml          matrix.xml             rquotad.xml               wsman.xml
finger.xml               mdns.xml               rsh.xml                   wsmans.xml
freeipa-4.xml            memcache.xml           rsyncd.xml                xdmcp.xml
freeipa-ldap.xml         minidlna.xml           rtsp.xml                  xmpp-bosh.xml
freeipa-ldaps.xml        mongodb.xml            salt-master.xml           xmpp-client.xml
freeipa-replication.xml  mosh.xml               samba-client.xml          xmpp-local.xml
freeipa-trust.xml        mountd.xml             samba-dc.xml              xmpp-server.xml
ftp.xml                  mqtt-tls.xml           samba.xml                 zabbix-agent.xml
galera.xml               mqtt.xml               sane.xml                  zabbix-server.xml

# cat /usr/lib/firewalld/services/https.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>Secure WWW (HTTPS)</short>
  <description>HTTPS is a modified HTTP used to serve Web pages when security is important. Examples are sites that require logins like stores or web mail. This option is not required for viewing pages locally or developing Web pages. You need the httpd package installed for this option to be useful.</description>
  <port protocol="tcp" port="443"/>
</service>

上記はサービス名で指定しましたが、ポート番号を使って指定することも可能です。

# firewall-cmd --add-port=80/tcp --add-port=443/tcp --permanent
# firewall-cmd --reload
# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp2s0f0
  sources:
  services: cockpit http https ssh
  ports: 80/tcp 443/tcp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

サービスやポート番号ではなく特定のIPアドレスからであれば全てのサービスを許可という場合にはIPアドレスを追加許可します。下記は192.168.0.0/24であれば全て許可というものです。

# firewall-cmd --add-source=192.168.0.0/24 --permanent
# firewall-cmd --reload
# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp2s0f0
  sources: 192.168.0.0/24
  services: cockpit ssh
  ports: 80/tcp 443/tcp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

逆に特定IPアドレスから拒否したい場合はdropゾーンにIPアドレスを追加することで拒否することができます。

# firewall-cmd --add-source=192.168.1.0/24 --zone=drop --permanent
# firewall-cmd --reload


上記のサービス/ポート番号、およびIPアドレスを組み合わせたルールをリッチルールと呼びます。リッチルールの書式は以下のようになります。

※特定送信元からhttpsを許可ルールを追加
firewall-cmd --add-rich-rule="rule family=ipv4 source address=192.168.2.0/24 service name=https accept" --permanent
firewall-cmd --reload

※特定送信元からtcp/22(ssh)を許可ルールを追加
firewall-cmd --add-rich-rule="rule family=ipv4 source address=192.168.1.0/24 port protocol=tcp port=22 accept" --permanent
firewall-cmd --reload

※特定送信元からhttpsを許可ルールを削除
firewall-cmd --remove-rich-rule="rule family=ipv4 source address=192.168.2.0/24 service name=https accept" --permanent
firewall-cmd --reload

firewall-cmd --list-rich-rule
rule family="ipv4" source address="192.168.2.0/24" service name="https" accept
rule family="ipv4" source address="192.168.1.0/24" port port="22" protocol="tcp" accept

ある一定期間でアクセス上限を設定することもできます。下記は1分間に60回までという制限をかけています。

※特定送信元からhttpsを許可ルールを追加
firewall-cmd --add-rich-rule="rule family=ipv4 source address=192.168.10.0/24 port protocol=tcp port=80 accept limit value=60/m" --permanent
firewall-cmd --reload
firewall-cmd --list-rich-rule
rule family="ipv4" source address="192.168.10.0/24" port port="80" protocol="tcp" accept limit value="60/m"

またIPアドレスに付いては国別のものが公開されているのでそれらを使って国内からのみアクセス可とすることもできます。下記はhttpsを国内からのみに絞る方法です。

# JP filterの作成
wget -q -O - http://nami.jp/ipv4bycc/cidr.txt.gz | gzip -d | grep "JP" | awk '{print "firewall-cmd --add-rich-rule=\"rule family=ipv4 source address="$2" service name=https accept\" --permanent"}' > /tmp/jpfilter.sh

# JP filterの有効化
/bin/sh /tmp/jpfilter.sh

# 初期化 
firewall-cmd --reload

またこれらコマンドでおこなった操作は以下のファイルに内容が記録されますので、このファイルを直接編集することでも同様です。

# cat /etc/firewalld/zones/public.xml
<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Public</short>
  <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
  <source address="192.168.0.0/24"/>
  <service name="ssh"/>
  <service name="cockpit"/>
  <port port="80" protocol="tcp"/>
  <port port="443" protocol="tcp"/>
  <rule family="ipv4">
    <source address="192.168.2.0/24"/>
    <service name="https"/>
    <accept/>
  </rule>
  <rule family="ipv4">
    <source address="192.168.1.0/24"/>
    <port port="22" protocol="tcp"/>
    <accept/>
  </rule>
  <rule family="ipv4">
    <source address="192.168.10.0/24"/>
    <port port="80" protocol="tcp"/>
    <accept>
      <limit value="60/m"/>
    </accept>
  </rule>
</zone>

参考URL:https://rin-ka.net/rich-rules-domestic/

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする