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/