2.7. ファイアウォールの設定
ユーザーが、Web サーバーでホストされるページにアクセスできるように、Web サーバーにはオープンポートが必要です。問題は、Red Hat Enterprise Linux のバージョンによってファイアウォールの制御方法が異なることです。Red Hat Enterprise Linux 6 以前では、iptables
を使用します。Red Hat Enterprise Linux 7 では、firewalld
を使用します。
この決定は、条件付きロジックとシステムファクトを使用して Puppet が処理するものです。この手順では、オペレーティングシステムを確認し、適切なファイアウォールコマンドを実行するステートメントを追加します。
mymodule::httpd
クラス内に以下のコードを追加します。
if versioncmp($::operatingsystemmajrelease, '6') <= 0 { exec { 'iptables': command => "iptables -I INPUT 1 -p tcp -m multiport --ports ${httpd_port} -m comment --comment 'Custom HTTP Web Host' -j ACCEPT && iptables-save > /etc/sysconfig/iptables", path => "/sbin", refreshonly => true, subscribe => Package['httpd'], } service { 'iptables': ensure => running, enable => true, hasrestart => true, subscribe => Exec['iptables'], } } elsif $operatingsystemmajrelease == 7 { exec { 'firewall-cmd': command => "firewall-cmd --zone=public --add-port=${httpd_port}/tcp --permanent", path => "/usr/bin/", refreshonly => true, subscribe => Package['httpd'], } service { 'firewalld': ensure => running, enable => true, hasrestart => true, subscribe => Exec['firewall-cmd'], } }
このコードは、以下を実行します。
-
operatingsystemmajrelease
ファクトを使用して、オペレーティングシステムが Red Hat Enterprise Linux 6 か 7 であるかを判断します。 -
Red Hat Enterprise Linux 6 を使用している場合は、
iptables
とiptables-save
を実行する実行ファイル(exec
)リソースを宣言して永続的なファイアウォールルールを追加します。httpd_port
変数は、開放するポートを定義するためにインラインで使用されます。exec
リソースの完了後に、iptables
サービスの更新をトリガーします。これを行うには、subscribe
属性が含まれるサービスリソースを定義します。この属性は、別のリソースに変更があるかどうかを確認し、ある場合は更新を実行します。この場合は、iptables
の実行可能なリソースを確認します。 -
Red Hat Enterprise Linux 7 を使用している場合は、
firewall-cmd
を実行する同様の実行可能ファイルリソースを宣言して、永続的なファイアウォールルールを追加します。また、httpd_port
変数は、開放するポートを定義するためにインラインで使用されます。exec
リソースの完了後に、firewalld
サービスの更新をトリガーしますが、subscribe
属性はfirewall-cmd
実行リソースを参照します。 -
ファイアウォールの実行可能リソースのコードには、
refreshonly ⇒ true
およびsubscribe ⇒ Package['httpd']
属性が含まれます。これにより、ファイアウォールコマンドは httpd のインストール後にのみ実行されます。これらの属性がないと、その後を実行して同じファイアウォールルールの複数のインスタンスが追加されます。
puppet apply
コマンドを再度実行して、モジュールへの変更をテストします。以下の例では、Red Hat Enterprise Linux 6 をテストしています。
# puppet apply mymodule/tests/init.pp --noop ... Notice: /Stage[main]/Mymodule::Httpd/Exec[iptables]/returns: current_value notrun, should be 0 (noop) ... Notice: /Stage[main]/Mymodule::Httpd/Service[iptables]: Would have triggered 'refresh' from 1 events ...
これらの出力通知メッセージには、subscribe
属性の結果としてのファイアウォールルール作成の実行とそれに続くサービスの更新が表示されます。
この設定は、条件付きステートメントの使用例としてのみ機能します。今後、複数のファイアウォールルールをシステムで管理する場合は、ファイアウォール用にカスタムリソースを作成することが推奨されます。実行可能リソースを使用して、多くの Bash コマンドを常にチェーンすることは推奨されていません。