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 コマンドを常にチェーンすることは推奨されていません。