お金をかけずにサーバーの勉強をしよう

Rocky Linux ファイアウォール

2022年8月7日

メニューへ戻る

Rocky Linux 9(RedHat Enterprise Linux 9のつもりで使っています)では、サーバープログラム(WEBサーバーとか)を立ち上げても、他のPCなどからネットワーク越しにアクセスしても繋がりません。

これは Rocky Linux 9はセキュリティを強化するためのファイアウォール設定がデフォルトで有効になっているからです。

WindowsOSにも「セキュリティが強化された Windows Defender ファイアウォール」ってプログラムがスタートメニューにありますが、あれと同じと考えておけば良いでしょう。

Rocky Linux 9では OSの netfilter(及び nftable)という機能とそれを管理するサービスの firewalld(Dynamic Firewall Manager)が動いています。

firewalld に設定を依頼するのが firewall-cmdコマンド(firewalld command line client)となっていて、関係を図にするとこんな感じです。 firewalldの図 1

やや複雑な構成になっていますが、サーバーに入ってくるネットワークのデータ(パケットといいます)をフィルタリングする機能が提供されていて firewall-cmdコマンドで設定を変えていく、と覚えておけばとりあえず OKだと思います。


前提としてネットワークから入ってくるデータは全て遮断されている所からスタートです。

その上で Rocky Linux 9のインストール直後のフィルタリング設定がどうなっているかを firewall-cmdコマンドで取ってみます。
rootでないと実行できないので sudoを使います。

[subro@RockyLinux ~]$ sudo firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens160
  sources:
  services: cockpit dhcpv6-client ssh
  ports:
  protocols:
  forward: yes
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

サービス名とポート番号(+プロトコル)で開放設定ができるんですが

サービスでは cockpit(RHELのGUI版設定ツール)・dhcpv6-client(IPv6の DHCPクライアント)・ssh(セキュアーシェル) の 3つが開放されています。
ポートでの指定はありませんでした。

サービス設定として予め登録されているものに何があるかというと、--get-servicesオプションで一覧を取れます。
(横に長過ぎるので改行しています)

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

どこかで聞いたような聞いてないような有名所は押さえられています。

サービス設定は [/usr/lib/firewalld/services]ディレクトリ以下の xmlファイルです。

例として sshのを見てみましょう。

[subro@RockyLinux ~]$ cat /usr/lib/firewalld/services/ssh.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>SSH</short>
  <description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description>
  <port protocol="tcp" port="22"/>
</service>

プロトコルが TCPで、ポートが22番を開放するって記述になっています。
これが有効になっているので、sshコマンドで外部からアクセスできるのです。

では例えば、Apacheや NGiNXなどをインストールして WEBサーバーを立ち上げたとします。
プロトコルは http[80/tcp] として、これを新たに開放するようにしてみましょう。

やり方は 2つ、サービス名 [http] で設定するか、ポート番号 [80/tcp] で設定するかのいずれかですので、両方のやり方を書いておきます。
実際やるのは片方で OKです。

サービス名の方

[subro@RockyLinux ~]$ sudo firewall-cmd --permanent --add-service=http
success

ポート番号の方

[subro@RockyLinux ~]$ sudo firewall-cmd --permanent --add-port=80/tcp
success

--permanent というオプションは何か。

netfilterはオンメモリで動いていて、このオプションを指定しない場合は現在のメモリに対して設定を行うことになりますが、それだとシャットダウン時に設定が消えてしまいます。

これを恒久的な設定にするためのオプションです。
設定後の結果を取ってみます。

[subro@RockyLinux ~]$ sudo firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens160
  sources:
  services: cockpit dhcpv6-client ssh
  ports:
  protocols:
  forward: yes
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

何も変わってません…。

--permanent オプションのために、メモリへの設定変更がされていないためです。
設定を再読込させます。

[subro@RockyLinux ~]$ sudo firewall-cmd --reload
success

改めて設定を取ってみます。

[subro@RockyLinux ~]$ sudo firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens160
  sources:
  services: cockpit dhcpv6-client http ssh
  ports: 80/tcp
  protocols:
  forward: yes
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

設定が反映されていますね。

設定項目の削除は add を remove に変えれば基本的には大丈夫でしょう。


netfilterの機能はもっと細かくて、例えばアクセス元の IPをある程度制限することもできます。

firewalldのマニュアルはこちらですので、もっとセキュリティを高めたいという場合はあたって見ると良いでしょう。
Documentation

firewalldと firewall-cmdの組み合わせではなく、nftablesサービスと nftコマンドでの設定をすることもできます。
(但しどちらか片方)

詳しくは nftコマンドから調べてみれば、情報を得られると思います。


==========
セキュリティのお勉強ではなく、単にサーバープログラムを RHEL系の Linuxで動かすだけであれば、ここに書いたレベルで OKかと思います。

この仕組みを詳しくお勉強したい場合は、netfilterのチェーンという概念まで入っていくことになります。
これ、私が受験したときの LPIC2の試験範囲でしたね。


firewalldを謳った書籍は過去にこれだけのようです。
確かに他では見たことがありません。

CentOS 7システム管理ガイド systemd/NetworkManager/Firewalld徹底攻略【電子書籍】[ デージーネット ]

価格:2,574円
(2022/8/7 11:38時点)
感想(0件)



ただこの辺のセキュリティを扱った本であれば必ず firewalldを扱っていると思います。

CentOS 8で作るネットワークサーバ構築ガイド [ サーバ構築研究会 ]

価格:4,950円
(2022/8/7 11:41時点)
感想(2件)

CentOS8実践ガイド システム管理編 [ 古賀政純 ]

価格:3,960円
(2022/8/7 11:41時点)
感想(0件)

TECHNICAL MASTER はじめてのCentOS 8 Linuxサーバエンジニア入門編 [ デージーネット ]

価格:3,300円
(2022/8/7 11:41時点)
感想(0件)