SELinux の管理スクリプト案 (CentOS 5.4) : SELinux の使い方


SELinux を管理するための設定ツール(案)

CentOS 5.4 に搭載されている SELinux について、その設定方法についてSELinux の動作モードを切り替える (CentOS 5.4)SELinux に新しい許可設定を追加する (CentOS 5.4) に記しましたけど、そういった一連の操作を支援する簡易スクリプトを考えてみました。

 

管理のために、以下の Makefile を用意します。

Makefile はタブ文字と空白文字とを明確に区別するので注意してください。

Makefile


    

そしてこれを、次のようなフォルダ構成で保存します。

保存場所はどこでも構いませんが "/var/selinux/" ディレクトリーを作成すると分りやすいかもしれません。

./

Makefile

Policy

 

これで後は、次のような形で SELinux に関する基本的な操作が可能になります。

make enforce 動作モードを Enforce に切り替えます。
make permissive 動作モードを Permissive に切り替えます。
make checkall ログ情報を表示します。ログのローテーションがされている場合には、ローテーション済みのログは対象とならないので注意します。
make check domain=name_t ドメイン名が name_t のログ情報を表示します。ログのローテーションがされている場合には、ローテーション済みのログは対象とならないので注意します。
make te domain=name_t ドメイン名 name_t に対応する TE ファイルとモジュールファイルを生成します。ログのローテーションがされている場合には、ローテーション済みのログは対象とならないので注意します。
make module domain=name_t ドメイン名 name_t に対応する TE ファイルから、モジュールファイルを生成します。TE ファイルを直接編集した場合などに利用します。
make module-install domain=name_t ドメイン名 name_t に対応するモジュールファイルをインストールします。予め make module group=name_t でモジュールファイルを生成しておく必要があります。インストール後は念のため、SELinux の動作モードを Enforcing に戻します。

 

このスクリプトを用いると、例えば httpd に関するポリシーを設定したい場合には、次のような流れになります。

ログから自動生成する場合

初めての生成で、ログから自動的に行いたい場合には、次のようにします。

make permissive

ここでいったん httpd を実際に動かして一連の操作を行います。そのあとで、引き続き次のコマンドを実行します。

make check domain=httpd_t

make te domain=httpd_t

make module-install domain=httpd_t

これで、httpd に関するポリシーを設定することができました。

ポリシーが設定されると、動作モードは自動的に Enforce に設定されます。

 

TE ファイルを手動で設定した場合

一度、ログからの自動生成を行うと、./policy ディレクトリに TE ファイルが生成されています。

以後、追加での許可設定が必要となった場合に、残された最近のログの中からルールを生成し、それを TE ファイルに追加してポリシーを適用するといった流れの場合には、次のような感じになります。

 

まず、残された最新ログの中からルールを生成します。

make check domain=httpd_t

すると、ログに残っている限りのルールが表示されるので、これをもとにして "./policy/httpd_t.te" を編集します。

編集が終わったら、次のようにしてポリシーファイルを生成して、インストールを行います。

make module domain=httpd_t

make module-install domain=httpd_t

これで、httpd に関するポリシーを設定することができました。

ポリシーが設定されると、動作モードは自動的に Enforce に設定されます。

 

ポリシー名を指定する方法

このスクリプトでは、"name" でポリシー名を指定することで、"domain" で指定したドメイン名を元にした名前ではなく、自由に名前を指定できるようにしてあります。

ドメイン名が対象のサービスとは遠い名前(たとえば gitlab が ssh_keygen_t を使う場合など)だったり、自分で te ファイルを作成したりしたときには "name" を(たとえば name=gitlab というようにして)指定すると扱いやすくなります。