CentOS 5.4 に搭載されている SELinux について、その設定方法についてSELinux
の動作モードを切り替える (CentOS 5.4) や SELinux
に新しい許可設定を追加する (CentOS 5.4) に記しましたけど、そういった一連の操作を支援する簡易スクリプトを考えてみました。
管理のために、以下の Makefile を用意します。
Makefile はタブ文字と空白文字とを明確に区別するので注意してください。
Makefile
AUDIT_LOG = /var/log/audit/audit.log
AUDIT2ALLOW = audit2allow
SEMODULE = semodule
GETENFORCE = getenforce
SETENFORCE =
setenforce
SAVE_DIR = ./policy
DOMAIN_NAME = ${domain}
DOMAIN_LABEL = `echo ${DOMAIN_NAME} | sed 's/_t$$//' | sed
's/[^a-zA-Z0-9]//g'`
usage:
@echo "Usage: make check
domain=name"
@echo "Usage: make module domain=name"
@echo "Usage:
make module-install domain=name"
checkall:
$(AUDIT2ALLOW) -i
$(AUDIT_LOG)
check:
grep ":$(DOMAIN_NAME):" $(AUDIT_LOG) |
$(AUDIT2ALLOW)
module:
cd $(SAVE_DIR)
$(CHECKMODULE) -M -m
-o $(SAVE_DIR)/$(DOMAIN_LABEL).mod $(SAVE_DIR)/$(DOMAIN_LABEL).te >
/dev/null
$(SEPACKAGE) -o $(SAVE_DIR)/$(DOMAIN_LABEL).pp -m
$(SAVE_DIR)/$(DOMAIN_LABEL).mod > /dev/null
$(MAKE) module-check
te:
(cd $(SAVE_DIR); grep ":$(DOMAIN_NAME):" $(AUDIT_LOG) |
$(AUDIT2ALLOW) -M $(DOMAIN_LABEL) > /dev/null)
$(MAKE) module-check
module-check:
@echo
@echo Generated policy:
@echo
@cat
$(SAVE_DIR)/$(DOMAIN_LABEL).te
@echo
@echo Next: make
module-install domain=$(DOMAIN_NAME)
@echo
module-install:
$(SEMODULE) -i $(SAVE_DIR)/$(DOMAIN_LABEL).pp
$(MAKE) enforce
enforce:
$(SETENFORCE) Enforcing
permissive:
$(SETENFORCE)
Permissive
mode:
$(GETENFORCE)
そしてこれを、次のようなフォルダ構成で保存します。
保存場所はどこでも構いませんが "/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 に設定されます。