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 &amp;&amp; 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 を使用している場合は、iptablesiptables-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 コマンドを常にチェーンすることは推奨されていません。