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
サービスを起動する前にポートアクセスを設定します。