CentOS7.1 64bit firewalldによるアクセス制御

CentOS7.1 64bit firewalldによるアクセス制御

当サイトでCentOS7.1 64bitへのインストール方法を紹介しているパッケージに関するfirewalldの設定を、以下に示します。

firewalldでは、アクセス制御の設定をゾーン別に行うようになっており、ネットワークインターフェイスにゾーンを割り当てることで、アクセス制御の使い分けができるようになっています。

ここでは、デフォルトのゾーンとなるpublicゾーンに対して、アクセス制御を行っていきます。

以下の各コマンドで、プロンプトが「#」で開始しているものはrootユーザーでの実行、「$」で開始しているものは一般ユーザーでの実行となります。

firewalldのインストール

firewalldのインストール

firewalldはCentOS7.1 64bitのインストールを「CentOS-7-x86_64-Minimal-1503-01.iso」から行った場合は、デフォルトでインストールされています。

firewalldがインストールされていない場合、以下のコマンドを実行してfirewalldのインストールを行います。

# yum install firewalld

firewalldのサービスを起動

以下のコマンドを実行して、firewalldのサービスを起動することができます。

# systemctl start firewalld.service

尚、サービス名は以下のコマンドで確認することができます。

# rpm -ql firewalld | grep systemd /usr/lib/systemd/system/firewalld.service

firewalldのサービスを自動で起動させる

firewalldのサービスは、インストール時点で自動で起動するようになっています。

自動起動設定の状態は、以下のコマンドで確認できます。

# systemctl is-enabled firewalld.service enabled

※自動起動する設定になっている場合は「enabled」、なっていない場合は「disabled」と表示されます。

自動起動する設定になっていない場合、以下のコマンドで自動で起動するように設定できます。

# systemctl enable firewalld.service

自動起動しないようにしたい場合は、以下のコマンドを実行します。

# systemctl disable firewalld.service

Apacheへの外部からのアクセスを許可

HTTPでの外部からのアクセスは、iptablesによってデフォルトでは拒否されています。CentOS7になってiptablesの設定にはfirewalldを使用するようになっていますので、HTTPでの外部からのアクセスが可能となるようfirewalldの設定を行います。

設定前の状態

アクセスを許可する前のfirewalldの設定内容を、以下のコマンドで確認します。

※この例はデフォルトの設定内容になっています。

# firewall-cmd --list-all public (default, active) interfaces: enp0s3 sources: services: dhcpv6-client ssh ports: masquerade: no forward-ports: icmp-blocks: rich rules:

サービス名によるアクセス許可の設定

HTTPでの外部アクセスを許可する設定を追加するには、以下のようなコマンドを実行します。

※アクセス元のIPアドレス等、別途制限が必要なものがある場合は、そのオプションの指定を追加してください。

# firewall-cmd --permanent --add-service=http
  • 「–permanent」を指定すると、OSの再起動後も設定が有効になります。ただし設定を有効化するには、firewalldのサービスの再起動(restart)を行うか、設定の再読み込み(reload)を行う必要があります。
  • 「–permanent」を指定しないと、設定はすぐに有効になりますが、OSの再起動後に設定が無効の状態に戻ります。
  • これは以下に示す設定ファイルへの書き込み有無で変わります。(「–permanent」を指定すると、設定ファイルへの書き込みが行われます。)
  • 「–add-service」を使用して、サービス「http」にアクセス許可を与えるようにしています。このサービス名は、ディレクトリ「/usr/lib/firewalld/services」にあるファイル「http.xml」を参照するようになっています。

尚、独自のサービスの設定を行いたい場合は、ディレクトリ「/usr/lib/firewalld/services」へのXMLファイルの追加や編集を行うのではなく、ディレクトリ「/etc/firewalld/services」に同じフォーマットのXMLファイルを追加すると、優先して使用されるようになっています。

設定を有効化するため、以下のコマンドを実行してリロードを行います。

# firewall-cmd --reload

アクセスを許可した後のfirewalldの設定内容は、以下のようになります。

# firewall-cmd --list-all public (default, active) interfaces: enp0s3 sources: services: dhcpv6-client http ssh ports: masquerade: no forward-ports: icmp-blocks: rich rules:

firewalldのゾーン「public」の設定内容は、ファイル「/etc/firewalld/zones/public.xml」に保存されます。

「/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>, <,service name='dhcpv6-client'/>, <,service name='http'/>, <,service name='ssh'/>, <,/zone>,

尚、追加したアクセス許可の設定を削除するには、以下のようなコマンドを実行します。

# firewall-cmd --permanent --remove-service=http
  • 「–permanent」を指定しないと、設定ファイル「/etc/firewalld/zones/public.xml」には、アクセス許可の設定が残ったままとなり、OSの再起動後にはアクセス許可が行われた状態に戻ります。完全に削除するには「–permanent」を指定します。

削除の設定を有効化するには、以下のコマンドを実行してリロードを行います。

# firewall-cmd --reload

ポートによるアクセス許可の設定

上記ではサービスを指定してアクセス許可を行いましたが、以下のようにポートを指定することも可能です。

# firewall-cmd --permanent --add-port=80/tcp

設定を有効化するため、以下のコマンドを実行してリロードを行います。

# firewall-cmd --reload

ポートで指定した場合のfirewalldの設定内容は、以下のようになります。

# firewall-cmd --list-all public (default, active) interfaces: enp0s3 sources: services: dhcpv6-client ssh ports: 80/tcp masquerade: no forward-ports: icmp-blocks: rich rules:

ポートで指定した場合の設定ファイル「/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>, <,service name='dhcpv6-client'/>, <,service name='ssh'/>, <,port protocol='tcp' port='80'/>, <,/zone>,

尚、追加したアクセス許可の設定を削除するには、以下のようなコマンドを実行します。

# firewall-cmd --permanent --remove-port=80/tcp

削除の設定を有効化するには、以下のコマンドを実行してリロードを行います。

# firewall-cmd --reload

設定後の状態

参考までにアクセスを許可した後のiptablesの設定内容も記載しておきます。

# iptables -L -n --line-number Chain INPUT (policy ACCEPT) num target prot opt source destination 1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED 2 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 3 INPUT_direct all -- 0.0.0.0/0 0.0.0.0/0 4 INPUT_ZONES_SOURCE all -- 0.0.0.0/0 0.0.0.0/0 5 INPUT_ZONES all -- 0.0.0.0/0 0.0.0.0/0 6 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 7 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain FORWARD (policy ACCEPT) num target prot opt source destination 1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED 2 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 3 FORWARD_direct all -- 0.0.0.0/0 0.0.0.0/0 4 FORWARD_IN_ZONES_SOURCE all -- 0.0.0.0/0 0.0.0.0/0 5 FORWARD_IN_ZONES all -- 0.0.0.0/0 0.0.0.0/0 6 FORWARD_OUT_ZONES_SOURCE all -- 0.0.0.0/0 0.0.0.0/0 7 FORWARD_OUT_ZONES all -- 0.0.0.0/0 0.0.0.0/0 8 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 9 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT) num target prot opt source destination 1 OUTPUT_direct all -- 0.0.0.0/0 0.0.0.0/0 Chain FORWARD_IN_ZONES (1 references) num target prot opt source destination 1 FWDI_public all -- 0.0.0.0/0 0.0.0.0/0 [goto] 2 FWDI_public all -- 0.0.0.0/0 0.0.0.0/0 [goto] Chain FORWARD_IN_ZONES_SOURCE (1 references) num target prot opt source destination Chain FORWARD_OUT_ZONES (1 references) num target prot opt source destination 1 FWDO_public all -- 0.0.0.0/0 0.0.0.0/0 [goto] 2 FWDO_public all -- 0.0.0.0/0 0.0.0.0/0 [goto] Chain FORWARD_OUT_ZONES_SOURCE (1 references) num target prot opt source destination Chain FORWARD_direct (1 references) num target prot opt source destination Chain FWDI_public (2 references) num target prot opt source destination 1 FWDI_public_log all -- 0.0.0.0/0 0.0.0.0/0 2 FWDI_public_deny all -- 0.0.0.0/0 0.0.0.0/0 3 FWDI_public_allow all -- 0.0.0.0/0 0.0.0.0/0 Chain FWDI_public_allow (1 references) num target prot opt source destination Chain FWDI_public_deny (1 references) num target prot opt source destination Chain FWDI_public_log (1 references) num target prot opt source destination Chain FWDO_public (2 references) num target prot opt source destination 1 FWDO_public_log all -- 0.0.0.0/0 0.0.0.0/0 2 FWDO_public_deny all -- 0.0.0.0/0 0.0.0.0/0 3 FWDO_public_allow all -- 0.0.0.0/0 0.0.0.0/0 Chain FWDO_public_allow (1 references) num target prot opt source destination Chain FWDO_public_deny (1 references) num target prot opt source destination Chain FWDO_public_log (1 references) num target prot opt source destination Chain INPUT_ZONES (1 references) num target prot opt source destination 1 IN_public all -- 0.0.0.0/0 0.0.0.0/0 [goto] 2 IN_public all -- 0.0.0.0/0 0.0.0.0/0 [goto] Chain INPUT_ZONES_SOURCE (1 references) num target prot opt source destination Chain INPUT_direct (1 references) num target prot opt source destination Chain IN_public (2 references) num target prot opt source destination 1 IN_public_log all -- 0.0.0.0/0 0.0.0.0/0 2 IN_public_deny all -- 0.0.0.0/0 0.0.0.0/0 3 IN_public_allow all -- 0.0.0.0/0 0.0.0.0/0 Chain IN_public_allow (1 references) num target prot opt source destination 1 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 ctstate NEW 2 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 ctstate NEW Chain IN_public_deny (1 references) num target prot opt source destination Chain IN_public_log (1 references) num target prot opt source destination Chain OUTPUT_direct (1 references) num target prot opt source destination

CentOS6と比べて設定が細かくなっています。CentOS7でもiptablesコマンドによる設定は可能ですが、この細かさを考えるとfirewalldを使用したほうがやり易そうです。

SSLによるアクセス許可を追加

SSLを使用したHTTPSでの外部アクセスを許可する設定を追加するには、以下のようなコマンドを実行します。

※アクセス元のIPアドレス等、別途制限が必要なものがある場合は、そのオプションの指定を追加してください。

# firewall-cmd --permanent --add-service=https

サービスではなくポートで指定を行う場合は、以下のようなコマンドを実行します。

# firewall-cmd --permanent --add-port=443/tcp

設定を有効化するため、以下のコマンドを実行してリロードを行います。

# firewall-cmd --reload

サービスで指定した場合のfirewalldの設定内容は、以下のようになります。

# firewall-cmd --list-all public (default, active) interfaces: enp0s3 sources: services: dhcpv6-client http https ssh ports: masquerade: no forward-ports: icmp-blocks: rich rules:

サービスで指定した場合の設定ファイル「/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>, <,service name='dhcpv6-client'/>, <,service name='http'/>, <,service name='ssh'/>, <,service name='https'/>, <,/zone>,

MySQLへの外部からのアクセスを許可

firewalldによるアクセス制御の詳細につきましては、上記のApacheへの外部からのアクセスを許可する際の設定をご参照ください。

ここではMySQLの場合の設定を抜粋して紹介していきます。

サービス名によるアクセス許可の設定

MySQLへの外部アクセスを許可する設定を追加するには、以下のようなコマンドを実行します。

※アクセス元のIPアドレス等、別途制限が必要なものがある場合は、そのオプションの指定を追加してください。

# firewall-cmd --permanent --add-service=mysql
  • 「–permanent」を指定して、OSの再起動後も設定が有効になるようにします。
  • 「–add-service」を使用して、サービス「mysql」にアクセス許可を与えるようにしています。このサービス名は、ディレクトリ「/usr/lib/firewalld/services」にあるファイル「mysql.xml」を参照するようになっています。

設定を有効化するため、以下のコマンドを実行してリロードを行います。

# firewall-cmd --reload

アクセスを許可した後のfirewalldの設定内容は、以下のようになります。

※この例はデフォルトの設定に、HTTP、HTTPSでの外部アクセス許可が既に追加済みの内容になっています。

# firewall-cmd --list-all public (default, active) interfaces: enp0s3 sources: services: dhcpv6-client http https mysql ssh ports: masquerade: no forward-ports: icmp-blocks: rich rules:

firewalldのゾーン「public」の設定内容は、ファイル「/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>, <,service name='dhcpv6-client'/>, <,service name='http'/>, <,service name='ssh'/>, <,service name='https'/>, <,service name='mysql'/>, <,/zone>,

ポートによるアクセス許可の設定

上記ではサービスを指定してアクセス許可を行いましたが、以下のようにポートを指定することも可能です。

# firewall-cmd --permanent --add-port=3306/tcp

設定を有効化するため、以下のコマンドを実行してリロードを行います。

# firewall-cmd --reload

ポートで指定した場合のfirewalldの設定内容は、以下のようになります。

# firewall-cmd --list-all public (default, active) interfaces: enp0s3 sources: services: dhcpv6-client http https ssh ports: 3306/tcp masquerade: no forward-ports: icmp-blocks: rich rules:

ポートで指定した場合の設定ファイル「/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>, <,service name='dhcpv6-client'/>, <,service name='http'/>, <,service name='ssh'/>, <,service name='https'/>, <,port protocol='tcp' port='3306'/>, <,/zone>,

PostgreSQLへの外部からのアクセスを許可

firewalldによるアクセス制御の詳細につきましては、上記のApacheへの外部からのアクセスを許可する際の設定をご参照ください。

ここではPostgreSQLの場合の設定を抜粋して紹介していきます。

サービス名によるアクセス許可の設定

PostgreSQLへの外部アクセスを許可する設定を追加するには、以下のようなコマンドを実行します。

※アクセス元のIPアドレス等、別途制限が必要なものがある場合は、そのオプションの指定を追加してください。

# firewall-cmd --permanent --add-service=postgresql
  • 「–permanent」を指定して、OSの再起動後も設定が有効になるようにします。
  • 「–add-service」を使用して、サービス「postgresql」にアクセス許可を与えるようにしています。このサービス名は、ディレクトリ「/usr/lib/firewalld/services」にあるファイル「postgresql.xml」を参照するようになっています。

設定を有効化するため、以下のコマンドを実行してリロードを行います。

# firewall-cmd --reload

アクセスを許可した後のfirewalldの設定内容は、以下のようになります。

※この例はデフォルトの設定に、HTTP、HTTPSでの外部アクセス許可が既に追加済みの内容になっています。

# firewall-cmd --list-all public (default, active) interfaces: enp0s3 sources: services: dhcpv6-client http https postgresql ssh ports: masquerade: no forward-ports: icmp-blocks: rich rules:

firewalldのゾーン「public」の設定内容は、ファイル「/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>, <,service name='postgresql'/>, <,service name='dhcpv6-client'/>, <,service name='http'/>, <,service name='ssh'/>, <,service name='https'/>, <,/zone>,

ポートによるアクセス許可の設定

上記ではサービスを指定してアクセス許可を行いましたが、以下のようにポートを指定することも可能です。

# firewall-cmd --permanent --add-port=5432/tcp

設定を有効化するため、以下のコマンドを実行してリロードを行います。

# firewall-cmd --reload

ポートで指定した場合のfirewalldの設定内容は、以下のようになります。

# firewall-cmd --list-all public (default, active) interfaces: enp0s3 sources: services: dhcpv6-client http https ssh ports: 5432/tcp masquerade: no forward-ports: icmp-blocks: rich rules:

ポートで指定した場合の設定ファイル「/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>, <,service name='dhcpv6-client'/>, <,service name='http'/>, <,service name='ssh'/>, <,service name='https'/>, <,port protocol='tcp' port='5432'/>, <,/zone>,

firewalldによるアクセス制御については、以上です。