2.8. SELinux の設定

SELinux は、デフォルトで HTTP サーバーへの標準以外のアクセスを制限します。カスタムポートを定義する場合は、SELinux がアクセスを付与できる設定を追加する必要があります。

Puppet には、ブール値やモジュールなどの一部の SELinux 機能を管理するリソースタイプが含まれます。ただし、semanage コマンドを実行してポート設定を管理する必要があります。このツールは policycoreutils-python パッケージの一部で、Red Hat Enterprise Linux システムにはデフォルトではインストールされていません。

mymodule::httpd クラス内に以下のコードを追加します。

  exec { 'semanage-port':
    command => "semanage port -a -t http_port_t -p tcp ${httpd_port}",
    path => "/usr/sbin",
    require => Package['policycoreutils-python'],
    before => Service['httpd'],
    subscribe => Package['httpd'],
    refreshonly => true,
  }
  package { 'policycoreutils-python':
    ensure => installed,
  }

このコードは、以下を実行します。

  • require ⇒ Package['policycoreutils-python'] 属性は、コマンドの実行前に policycoreutils-python がインストールされていることを確認します。
  • Puppet は httpd_port を変数として使用して semanage を実行し、Apache のリッスンが許可される TCP ポートのリストにカスタムポートを追加します。
  • before ⇒ Service ['httpd'] により、httpd サービスを起動する前にこのコマンドが実行されます。SELinux コマンドの前に httpd が起動すると、SELinux はポートへのアクセスを拒否し、サービスの起動に失敗します。
  • SELinux 実行可能ファイルリソースのコードには refreshonly ⇒ true および subscribe ⇒ Package['httpd'] の属性が含まれます。これにより、SELinux コマンドは、httpd のインストール後にのみ実行されます。これらの属性がないと、その後実行に失敗します。これは、ポートがすでに有効化されていることを SELinux が認識し、エラーを報告するためです。

puppet apply コマンドを再度実行して、モジュールへの変更をテストします。

# puppet apply mymodule/tests/init.pp --noop
...
Notice: /Stage[main]/Mymodule::Httpd/Package[policycoreutils-python]/ensure: current_value absent, should be present (noop)
...
Notice: /Stage[main]/Mymodule::Httpd/Exec[semanage-port]/returns: current_value notrun, should be 0 (noop)
...
Notice: /Stage[main]/Mymodule::Httpd/Service[httpd]/ensure: current_value stopped, should be running (noop)
...

Puppet は、最初に policycoreutils-python をインストールしてから、httpd サービスを起動する前にポートアクセスを設定します。