ファイアウォールは直訳すると防火壁となり、外部からの不正なアクセスを遮断するための機能です。
外から降りかかる火の粉(不正アクセス)を防ぐ防火壁ということですね。
ここではファイアーウォールの解説と、よく使うコマンドについて扱います。
この記事で行うこと
1. ファイアウォールについて
前述の通り、ファイアウォールは防火壁として不正なアクセスを防いでくれるものです。
ただ、実際にはファイアウォールは事前に通すように設定された通信以外は全て遮断するようになっています。
アクセスが不正か否かは判断できないため「疑わしきは通さない」となるわけです。
このため、アクセスさせたい場所には事前に穴を開けておく必要があります。
ファイアウォールではポートの単位で穴を開ける事ができます。
1-1. ポートとは
ポートというのは簡単に言うとサーバとネットワークを繋ぐ出入り口です。
このポートは65536個存在し番号で表現されていて、各アプリケーションに割り振られています。
有名なところでいうと、SSH接続は22番ポート、HTTPは80番ポートといった具合です。
実際に割り振られているのはごく一部で、残りは空きポートとして必要に応じて使うことができます。
具体的にいうと0番から1023番までのポートは既に割り振られているので使えませんが、それ以上の番号のポートはそのポートを使うと言っているアプリケーションをインストールしていない限りは自由に使えます。
1-2. ファイアウォールの必要性
例えば、「SSH接続を使う予定がなかったので初期設定のままで放置をしていたら、そこに付け込まれて不正なアクセスを受けてしまった」ということが起きえます。
当然、使わないのであればSSHを停止しておくべきでしたが、ファイアウォールで22番ポートを閉じていたとしたらSSHが起動したままでも上記のような事は起きません。
このように転ばぬ先の杖となるのがファイアウォールとなります。
2. ファイアーウォールのコマンド解説
ファイアウォールは firewall-cmd
というコマンドで操作します。
これは Firewall Daemon Command の略で、 Firewall Daemon が firewalld と略され、更に firewalld Command が firewall-cmd と略された物と思われます。
このコマンドに何をさせたいかをオプションのような形で与えることで操作をします。
2-1. –list-all
現在のファイアウォールの設定を全て表示させるコマンドです。
以下のような表示が出ると思います。(実際にはsourcesとportsは空欄になっていますが、今回は説明のために記入しています)
[root@localhost ~]# firewall-cmd --list-all public (active) target: default icmp-block-inversion: no interfaces: enp3s0 sources: 192.168.10.0/24 services: cockpit dhcpv6-client ssh ports: 22/tcp protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
ここでは以下に注目してください。
- sources:IPアドレス単位で全ての接続を許可したい場合に設定します。例えば自宅からの接続は全て許可と言った場合です。
- services:特定のアプリケーションの接続を許可する場合に設定します。SSHを許可する、HTTPを許可する等です。
- ports:直接ポート番号を許可したい場合に設定します。この例では22/tcpが記入されていますが、これはSSHのポートです。このためservicesにsshの記載がなくてもSSH接続ができます。一時的にテストのためにとりあえずポートを開けたいといった場合に使います。恒久的に使うときはservicesに追加した方が良いです。
2-2. –add-xxxxxx=zzzzzz
許可ルールを追加します。
xxxxxxの部分には許可したいルールの種類を入れ、zzzzzzの部分には許可したいルールの内容を入れます。
例えば、servicesにHTTPを追加したい場合は以下のようになります。
[root@localhost ~]# firewall-cmd --add-service=http
こうして設定したルールはすぐに有効になりますが、サーバやファイアーウォールを再起動したり、ファイアウォールを再読込(–reload)すると消えてしまいます。
上記のコマンドに --permanent
のオプションを設定すると、逆にすぐには有効にならず、サーバやファイアーウォールを再起動したり、ファイアウォールを再読込(–reload)するとずっと有効になります。
[root@localhost ~]# firewall-cmd --add-service=http --permanent
先に一度ルールを追加して試して問題がなかった場合に --permanent
を付けて再度設定すると良いです。
2-3. –remove-xxxxxx=zzzzzz
--add-xxxxxx=zzzzzz
とは逆に許可ルールを削除します。
使い方は --add-xxxxxx=zzzzzz
と同様に、xxxxxxの部分には削除したいルールの種類を入れ、zzzzzzの部分には削除したいルールの内容を入れます。
例えば、portsから22/tcpを削除したい場合は以下のようになります。
[root@localhost ~]# firewall-cmd --remove-port=22/tcp
また --permanent
のオプションを設定するとすぐには有効にならず、再起動や再読込で有効になるという点も同じです。
[root@localhost ~]# firewall-cmd --remove-port=22/tcp --permanent
ちなみに、初期設定で「cockpit」と「dhcpv6-client」というサービスを通すルールが有効になっていますが、これは当面使わないので削除してみましょう。
2-4. –reload
ファイアウォールの設定を再読み込みします。
--permanent
オプションを付けた設定を有効にしたり、逆に --permanent
オプションを付けずに色々と試してみた設定をなかったことにするときに使います。
使い方は以下の通りです。
[root@localhost ~]# firewall-cmd --reload
再読み込みを行った後は必ず --list-all
で想定したとおりの設定になっているか確認するようにしましょう。
まとめ
今回はファイアウォールの基本的な設定について説明しました。
理論上は、全てのアプリに脆弱性がなく設定にも穴がない状態が常に維持されていればファイアウォールは不要ということになります。
ただ、人間いつミスを犯すか分からないですし、最新のアプリでも脆弱性が見つかることもあります。
リスクを軽減するためにもファイアウォールは常に確認して、不要なポートは必ず閉めるようにしましょう。