
ファイアウォール

はじめに

第36章はじめに

ファイアウォールは、システムおよびローカル ネットワークへの受信と発信の両方のアクセスを制御するために使用されます。インターネットに接続されたコンピュータへの侵入や他の種類の攻撃が現実となっている現代のネットワークにおいて、セキュリティは重要な機能です。特定のインターフェイスを介したトラフィックや特定のネットワーク アドレスを使用したトラフィックに与える信頼レベルを制御できます。


学習目標
この章の終わりまでに、次のことができるようになります。

ファイアウォールとは何か、なぜ必要なのかを理解できます。
コマンド ラインとグラフィカル インターフェイスの両方で使用可能なツールを把握できます。
firewalldとfirewall-cmdプログラムについて説明できます。
ゾーン、ソース、サービス、ポートの操作方法を知ることができます。


ファイアウォール

ファイアウォールとは？
ファイアウォールは、すべてのネットワーク トラフィックの監視と制御を行うネットワーク セキュリティ システムです。受信と発信の両方のネットワーク接続とパケットにルールを適用し、特定の接続の信頼レベルとネットワーク トポロジに応じた、柔軟なバリア（ファイアウォールなど）を構築します。

ファイアウォールは、ハードウェア ベースでもソフトウェア ベースでもかまいません。これらは、ネットワーク ルーターだけでなく、個々のコンピュータやネットワーク ノードにもあります。多くのファイアウォールにはルーティング機能もあります。


パケット フィルタリング
ほとんどすべてのファイアウォールはパケット フィルタリングを行っています。

情報はパケット形式でネットワークを介して送信されます。これらの各パケットには次のものが含まれます。

ヘッダ
ペイロード
フッター

ヘッダーとフッターには、宛先と送信元のアドレス、パケットの種類、従うプロトコルの種類、さまざまなフラグ、ストリーム内のパケット番号、そして転送に関するその他のあらゆるメタデータに関する情報が含まれています。実際のデータはペイロードにあります。

パケット フィルタリングは、アプリケーション、トランスポート、ネットワーク、データリンクなど、ネットワーク伝送の複数の階層でパケットをインターセプトします。

ファイアウォールは、各パケットが次のことを行うための、一連のルールを確立します。

内容、アドレスなどに基づいて承認または拒否します
何らかの方法で破棄します
別のアドレスにリダイレクトします
セキュリティの理由などに関して調査をします

パケット フィルタリングの結果として行われるルールとアクションを決定するための、さまざまなユーティリティが存在します。


ファイアウォールの歴史
初期のファイアウォール（1980 年代後半に遡ります）はパケット フィルタリングに基づくものでした。各ネットワーク パケットのコンテンツを検査し、ドロップ（応答せずに破棄）、拒否、または送信しました。接続状態については管理されていませんでした。パケットは複数あるトラフィック ストリームのどれかに属しているという解釈でした。

次の世代のファイアウォールはステートフル フィルタに基づいており、パケットの接続状態も調査して、新しい接続であるか、既存の接続の一部であるか、または一部でもないのかを確認します。Dos攻撃は、この種のファイアウォールを攻撃して、過剰な負荷をかけようとします。

ファイアウォールの第3世代はアプリケーション層のファイアウォールと呼ばれ、接続で使用しているアプリケーションとプロトコルの種類を認識します。通常のフローの一部ではないものは、すべて拒否できます。


ファイアウォールのインターフェイスとツール
システムのファイアウォールの設定は、次の方法で実施できます。

/etcのさまざまな構成ファイルの編集と組み合わせて、コマンド ラインから比較的低レベルのツールを使用
堅牢なグラフィカル インターフェイスの使用。system-config-firewall、firewall-config、gufw、yastなど

ここでは、以下の理由により、低レベルのツールを使用します。

グラフィカルなツールほど頻繁には変更されません。
どちらかというとより多くの機能があります。
グラフィカルなツールは多様であり、しかもGUIに依存しています。低レベルのツールはディストリビューションによって変わることはほとんどありません。ディストリビューションにとって唯一のファミリーと言えます。

欠点は、最初は習得が難しいように思えることです。以下では、firewall-cmdとfirewall-configの両方を含む、最新のfirewalldパッケージに絞って説明します。デフォルトでそれを持たないディストリビューションの場合、演習で行うために、必要に応じてソースからインストールしてください。簡単にできます。


iptablesを使用しない理由
最近のほとんどのファイアウォールのインストールでは、実はユーザー側でiptablesパッケージを使用します。iptablesは現状、firewalldと同じく、カーネル ファイアウォールの実装コードをインターフェイスにしています。firewalldについては、後で詳しく説明します。

ここではiptablesを説明しません。有用な機能の習得に時間がかかるからです。

なお、iptablesについては、The Linux Foundationのシステム管理者シーケンスの次のコース、「LFS311-Linux for System Engineers/LFS211-Linux Networking and Administration」で詳しく説明しています。


firewalldとfirewall-cmd 
firewalldは、 Dynamic Firewall Managerと呼ばれています。ネットワーク インターフェイスや接続の信頼レベルが定義されている、ネットワーク／ファイアウォール ゾーンを利用します。これは、IPv4プロトコルとIPv6プロトコルの両方をサポートします。

さらに、構成情報のランタイムな変更と恒久的な（持続的な）変更を分け、ファイアウォール ルールを追加するためのサービスまたはアプリケーションのインターフェイスも持っています。

設定ファイルは/etc/firewalldと/usr/lib/firewalldに保存されます。/etc/firewalld内のファイルは他のディレクトリ内のファイルを上書きしますので、システム管理者が作業する必要があります。

コマンド ライン ツールは、firewall-cmdです。さらに進む前に、以下を実行することをお勧めします。

$ firewall-cmd --help
Usage: firewall-cmd [OPTIONS...]....
Status Options
  --state                 Return and print firewalld state
  --reload                Reload firewall and keep state information
  --complete-reload       Reload firewall and loose state information
  --runtime-to-permanent  Create permanent from runtime configuration....

約200行表示されて長いので、ここには書きません。

ただし、ほとんどのオプションは名前が内容を示しており、かなりわかりやすいです。サービスの1つとして、firewalldは古いiptablesを置き換えます。firewalldとiptablesの両方のサービスを同時に実行するとエラーになります。


firewalldサービスの状態
firewalldは、ファイアウォールの使用と構成を実行するサービスであり、通常の方法で有効化／無効化、開始／停止を行うことができます。

$ sudo systemctl [enable/disable] firewalld
$ sudo systemctl [start/stop] firewalld

次のいずれかの方法で現在の状態を表示できます。

$ sudo systemctl status firewalld
firewalld.service - firewalld - dynamic firewall daemon
    Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled)
    Active: active (running) since Tue 2015-04-28 12:00:59 CDT; 5min ago
  Main PID: 777 (firewalld)
...

$ sudo firewall-cmd --state
running

IPv4を使用するときに1つ以上のネットワーク インターフェイスを持っている場合は、IP転送をオンにする必要があることに注意してください。ランタイム時にこれを行うには、次のいずれかを実行します。

$ sudo sysctl net.ipv4.ip_forward=1
$ echo 1 > /proc/sys/net/ipv4/ip_forward

echoを正しく実行させるには、2番目のコマンドをrootとして実行する必要があります。ただし、これは恒久的ではありません。恒久的にするには、次の行を/etc/sysctl.confに追加する必要があります。

net.ipv4.ip_forward=1

その後、再起動します。もしくは、再起動せずに新しい設定を読み込むためには次を入力します。

$ sudo sysctl -p

  


ゾーン
firewalldはゾーンと連携して動作します。それぞれのゾーンには、信頼レベルと受信／発信パケットに対する特定の動作が定義されています。各インターフェイスは特定のゾーンに属します（通常は、NetworkManagerが該当するゾーンをfirewalldに通知します）。ゾーンは、firewall-cmdまたはfirewall-config GUIで変更できます。


ゾーンの詳細については、各ボックスをクリックして展開してください。

ゾーン

drop
すべての受信パケットは応答せずに破棄されます。発信接続のみが許可されます。

block
すべての受信ネットワーク接続が拒否されます。許可される接続は、システム内からの接続のみです。

public
ネットワーク上のコンピュータを信頼しません。意識的に選択された特定の着信接続のみが許可されます。

external
ルーターなどでマスカレードが使用されている場合に使用されます。信頼レベルは、publicゾーンと同じです。

dmz (Demilitarized Zone)
一部の（すべてではない）サービスへのアクセスを公開する場合に使用します。特定の受信接続のみが許可されます。

work
接続されたノードを（完全ではありませんが）無害であると信頼します。特定の受信接続のみが許可されます。

home
ほとんどの場合、他のネットワーク ノードを信頼しますが、許可する受信接続を選択します。

internal
workゾーンに似ています。 

trusted
すべてのネットワーク接続が許可されます。

システム インストール時に、すべてではないにしても、ほとんどのLinuxディストリビューションは、すべてのインターフェイスのデフォルトとしてpublicゾーンを選択します。

説明したいくつかのゾーンの違いは、確実なものではありません。ここで詳細に説明することはしませんが、必要以上にオープンなゾーンを使用しないでください。


ゾーン管理の例
firewall-cmdで利用可能なオプションを確認する場合：

$ firewall-cmd --help
....
Zone Options
--get-default-zone                     Print default zone for connections and interfaces
--set-default-zone=<zone>              Set default zone
--get-active-zones                     Print currently active zones
--get-zones                            Print predefined zones [P]
--get-services                         Print predefined services [P}
--get-icmptypes                        Print predefined icmptypes [P]
--get-zone-of-interface=<interface>    Print name of the zone the interface is bound to [P]
--get-zone-of-source=<source>[/<mask>] Print name of the zone the source[/mask] is bound to [P]
--list-all-zones                       List everything added for or enabled in all zones [P]
--new-zone=<zone>                      Add a new zone [P only]
--delete-zone=<zone>                   Delete an existing zone [P only]
--zone=<zone>                          Use this zone to set or query options, else default zone
                                       Usable for options marked with [Z]
--get-target                           Get the zone target [P] [Z]
--set-target=<target>                  Set the zone target [P] [Z]

デフォルト ゾーンを取得する場合：

$ sudo firewall-cmd --get-default-zone
public

現在使用されているゾーンのリストを取得する場合：

$ sudo firewall-cmd --get-active-zones
public
  interfaces: eno16777736

利用可能なすべてのゾーンをリストする場合：

$ sudo firewall-cmd --get-zones
block dmz drop external home internal public trusted work

デフォルト ゾーンをtrustedに変更し、それを元に戻す場合：

$ sudo firewall-cmd --set-default-zone=trusted
success

$ sudo firewall-cmd --set-default-zone=public
success

インターフェイスを特定のゾーンに一時的に割り当てる場合：

$ sudo firewall-cmd --zone=internal --change-interface=eno1
success

インターフェイスを特定のゾーンに恒久的に割り当てる場合：

$ sudo firewall-cmd --permanent --zone=internal --change-interface=eno1
success

これにより、ファイル/etc/firewalld/zones/internal.xmlが作成されます。

特定のインターフェイスに関連付けられたゾーンを確認する場合：

$ sudo firewall-cmd --get-zone-of-interface=eno1
public

最後に、特定のゾーンに関するすべての詳細を取得する場合：

$ sudo firewall-cmd --zone=public --list-all
public (default, active)
  interfaces: eno16777736
  sources:
  services: dhcpv6-client ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

firewalldの制御は、firewall-cmdプログラムを介して行います。より詳細な情報は次の方法で取得できます。

man firewalld-cmd


ソース管理
どのゾーンも、ネットワーク インターフェイスだけでなく、特定のネットワーク アドレスにも結び付けることができます。次の場合、パケットはそのゾーンに割り当てられます。

パケットをすでにそのゾーンに結び付けられているアドレスから取得している場合。もしそうでなければ、
パケットをそのゾーンに結び付けられたインターフェイスから取得している場合。
上記の取得方法に当てはまらないパケットは、デフォルト ゾーン（通常はpublic）に割り当てられます。

ソースをゾーンに（恒久的に）設定する場合には、次のようにします。

$ sudo firewall-cmd --permanent --zone=trusted --add-source=192.168.1.0/24
success

これは、192.168.1.xのIPアドレスを持つソースをすべてtrustedゾーンに追加することを意味します。

--remove-sourceオプションを使用すれば、以前に割り当てられたソースをゾーンから削除することができます。また、--change-sourceを使用すれば、ゾーンを変更できることも覚えておいてください。

以下を使用して、ゾーンに結び付けられたソースをリストできます。

$ sudo firewall-cmd --permanent --zone=trusted --list-sources
192.168.1.0/24

上記の両方のコマンドで、--permanentオプションを省略すると、現在のランタイム動作のみに適用されます。


サービス管理
これまで、特定のインターフェイスやアドレスをゾーンに割り当てましたが、ゾーン内でアクセスできるサービスやポートについては説明していませんでした。

これらについて利用可能なすべてのサービスは以下のコマンドで表示できます。

$ sudo firewall-cmd --get-services
RH-Satellite-6 amanda-client bacula bacula-client dhcp dhcpv6 dhcpv6-client dns ftp high-availability http https imaps ipp ipp-client ipsec kerberos kpasswd ldap ldaps libvirt libvirt-tls mdns mountd ms-wbt mysql nfs ntp openvpn pmcd pmproxy pmwebapi pmwebapis pop3s postgresql proxy-dhcp radius rpc-bind samba samba-client smtp ssh telnet tftp tftp-client transmission-client vnc-server wbem-https

また、特定のゾーンで現在利用可能なサービスを表示する場合：

$ sudo firewall-cmd --list-services --zone=public
dhcpv6-client ssh

ゾーンにサービスを追加する場合：

$ sudo firewall-cmd --permanent --zone=home --add-service=dhcp
success

$ sudo firewall-cmd --reload

--reloadを指定した2番目のコマンドは、変更を有効にするために必要です。/etc/firewalld/servicesのファイルを編集して、新しいサービスを追加することもできます。


ポート管理
ポート管理はサービス管理に非常に似ています。

$ sudo firewall-cmd --zone=home --add-port=21/tcp
success

$ sudo firewall-cmd --zone=home --list-ports
21/tcp

/etc/servicesを見ると、port 21がftpに対応していることが確認できます。

$ grep " 21/tcp" /etc/services
ftp       21/tcp


演習

課題 36.1: firewalldのインストール

🚩
以下のPDFドキュメントに埋め込まれた外部URLにアクセスする場合は、常に右クリックして新しいタブまたはウィンドウで開いてください。直接クリックしてURLを開こうとすると、コース ウィンドウ／タブが閉じます。

【【これ以降は橋本さん訳を参照】】

While most Linux distributions now have the firewalld package (which includes the firewall-cmd multi-purpose utility) avail-able, it might not be installed on your system.

First you should check to see if it is already installed, with

$ which firewalld firewall-cmd
/usr/sbin/firewalld
/usr/bin/firewall-cmd

If you fail to find the program, then you need to install with one of the following, depending on your distribution in the usual way:

$ sudo yum install firewalld
$ sudo zypper install firewalld
$ sudo apt install firewalld

If this fails, the firewalld package is not available for your distribution. In this case you will have to install from source.

To do this,  go to https://fedorahosted.org/firewalld/ and you can get the git source repository,  or you can easily download the most recent tarball.

Then you have to follow the common procedure for installing from source (using whatever the current version is):

$ tar xvf firewalld-0.3.13.tar.bz2
$ cd firewalld-0.3.13
$ ./configure
$ make
$ sudo make install

Note this source also has an uninstall target:

$ sudo make uninstall

in case you have regrets.

You will have to deal with any inadequacies that come up in the./configure step, such as missing libraries etc.  When you install from a packaging system, the distribution takes care of this for you, but from source it can be problematic. If you have run the Linux Foundation’s ready-for.sh script on your system, you are unlikely to have problems.


課題 36.2: firewall-cmdを使う

🚩
以下のPDFドキュメントに埋め込まれた外部URLにアクセスする場合は、常に右クリックして新しいタブまたはウィンドウで開いてください。直接クリックしてURLを開こうとすると、コース ウィンドウ／タブが閉じます。

Exercise 36.2: Examining firewall-cmd

We have only scratched the surface of how you can use the firewalld package.   Almost everything is done by deploying firewall-cmd which is empowered to do a large variety of tasks, using options with very clear names.

To get a sense of this, there is really no substitute for just doing:

$ firewall-cmd --help

Usage: firewall-cmd [OPTIONS...]
....
Service Options
--new-service=<service>
Add a new service [P only]
--delete-service=<service>
Delete and existing service [P only]
....

which we will not reproduce here as it is 409 lines on an RHEL 8 system.

For more detailed explanation of anything which piques your interest, doman firewall-cmd which explains things more deeply,and man firewalld which gives an overview, as well as a listing of other manpages that describe the various configuration files in /etc, and elucidate concepts such as zones and services.


課題 36.3: ゾーンにサービスを追加する

🚩
以下のPDFドキュメントに埋め込まれた外部URLにアクセスする場合は、常に右クリックして新しいタブまたはウィンドウで開いてください。直接クリックしてURLを開こうとすると、コース ウィンドウ／タブが閉じます。

Exercise 36.3: Adding Services to a Zone

Add the http and https services to the public zone and verify that they are currently listed.

Solution 36.3

$ sudo firewall-cmd  --zone=public --add-service=http
success

$ sudo firewall-cmd  --zone=public --add-service=http
ssuccess

$ sudo firewall-cmd --list-services --zone=public
dhcpv6-client http https ssh

Note if you had run

$ sudo firewall-cmd --reload
$ sudo firewall-cmd --list-services --zone=public

dhcpv6-client ssh

after adding the new services, they would disappear from the list!  This curious behavior is because we did not include the --permanent flag when adding the services, and the --reload option reloads the known persistent services only.


演習 36.4. ファイアウォールGUIを使用する

🚩
以下のPDFドキュメントに埋め込まれた外部URLにアクセスする場合は、常に右クリックして新しいタブまたはウィンドウで開いてください。直接クリックしてURLを開こうとすると、コース ウィンドウ／タブが閉じます。

Exercise 36.4: Using the firewall GUI

Each distribution has its own graphical interface for firewall administration. On Red Hat-based systems you can run firewall-config, on Ubuntu it is called gufw, and on openSUSE you can find it as part of yast on the graphical menu system.

We have concentrated on the command line approach simply because we want to be distribution-flexible.  However, for mostrelatively simple firewall configuration tasks, you can probably do them efficiently with less memorization from the GUI.

Once you launch the firewall configuration GUI, do the previous exercise of adding http and https to the public zone, and verify that it has taken effect.

Make sure you take the time to understand the graphical interface.


知識チェック

「第36章 - ファイアウォール」を完遂しました。おめでとうございます。このクイズに答えて、これまでに学んだ概念の理解度をチェックしてください。

クイズ開始

問題 36.1
次のうち、正しいものはどれですか？ 当てはまるものをすべて選択してください。

A. iptablesパッケージは、firewalldのより新しい代替品です
B. firewalldパッケージは、iptablesのより新しい代替品です
C. firewalld-cmdは非恒久的な変更のみを行うことができます
D. /etc/firewalldの構成ファイルは、/usr/lib/firewalldの構成ファイルを上書きします。


