Menu Close

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 は semanage、を変数 httpd_port としてを使用して実行し、リッスンできる 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 サービスを起動する前にポートアクセスを設定します。