第1回 CMSツールをよりセキュアに導入しよう


面 和毅
サイオステクノロジー株式会社
OSSテクノロジーセンター
開発支援グループ
グループマネージャー
2007/5/23

 Zopeドメインの構成情報を考える

 では、Zopeを動作させる上でのドメイン構成を考えてみましょう。

  1. まず、プロセスやファイルにつくタイプ(プロセスの場合には特にドメインと呼びます)を決めましょう。zopeのプロセスが動作するドメインをzope_tとします。

  2. 次に、/etc/init.d/zopeのスクリプトを実行してZopeを立ち上げた際に、このzope_tドメインへと遷移するための「エントリポイント」を決めます。SELinuxでは親プロセスから子プロセスへとドメインが引き継がれますが、「Xドメインで動作していたプロセスが、プログラムhogeを実行すると、Yドメインとなって動作する」というように、ドメインの変更(遷移)を定義することができます。この際の、ドメインが遷移するきっかけとなるプログラムhogeのことをエントリポイントと呼びます。今回は、/etc/init.d/zopeを実行した際に動作する、/usr/bin/zopectlをエントリポイントとし、そのファイルに付与するタイプをzope_exec_tとします。

    図5 エントリポイント

  3. 次に、Zope関連のリソースのコンテキストを決めます。/var/lib/zope以下にZope関連のファイルが展開されますので/var/lib/zope以下をzope_var_lib_tとし、設定ファイルが置かれる/var/lib/zope/etc以下をzope_conf_tとします。

 全体的な構成情報は、図6をご確認ください。

図6 今回考えたZopeドメインの構成情報

 なお、今回は実運用で最も多く使われる可能性がある「Targetedポリシー」を想定していますので上記の構成情報でほぼ足りますが、ユーザー/ロールにまで制限をかけられる「Strictポリシー」を使用する場合には、さらにロールなどの考察が必要になってきます

 Zopeドメインを作成する

 上記で考えた構成情報に基づいて作成したzope.teファイルとzope.fcファイルを示します。

#DESC Zope
#Define zope_t domain

daemon_domain(zope)
type zope_conf_t, file_type, sysadmfile;
type zope_var_lib_t, file_type, sysadmfile;


#Allow general domain access to zope_t
general_domain_access(zope_t)
allow { zope_t initrc_t } zope_conf_t:file r_file_perms;
allow zope_t zope_conf_t:dir r_dir_perms;

allow zope_t usr_t:file { getattr read };

allow zope_t {etc_t etc_runtime_t } :file r_file_perms;
allow zope_t bin_t:dir r_dir_perms;
allow zope_t self:capability { setuid setgid dac_override dac_read_search };


read_sysctl(zope_t)


allow zope_t proc_t:file { read getattr };

# for library
allow zope_t var_lib_t:dir { getattr search };
rw_dir_create_file(zope_t zope_var_lib_t)
allow zope_t zope_var_lib_t:sock_file create_file_perms;
can_exec(zope_t zope_var_lib_t)

# for executing
allow zope_t bin_t:lnk_file read;
allow zope_t shell_exec_t:file rx_file_perms;
can_exec(zope_t bin_t)
can_network(zope_t)

# tcp port 8080 and udp port 3130 is http_cache_port_t (see net_contexts)
allow zope_t http_cache_port_t:tcp_socket name_bind;


# for reducing SELinux ignorable logs
dontaudit zope_t { boot_t tmp_t home_root_t security_t devpts_t }:dir getattr;
dontaudit zope_t sbin_t:dir search;
dontaudit zope_t usr_t:lnk_file read;
dontaudit zope_t tty_device_t:chr_file { read write };
リスト1 zope.te

# zope.fc
/usr/bin/zopectl system_u:object_r:zope_exec_t
/var/lib/zope(/.*)? system_u:object_r:zope_var_lib_t
/var/lib/zope/etc(/.*)? system_u:object_r:zope_conf_t
リスト2 zope.fc

 zope.fcファイルに関しては、見ただけで大体理解できると思います。ディレクトリ以下に再帰的にドメインを付与する際に正規表現が使用できます。なお、Targetedポリシーを想定しているため、ファイルに対して与えられるユーザー識別子/ロール識別子はそれぞれsystem_u/object_rとなっています。

 zope.teファイルに関しては、コメントを除いて上から3行目まででタイプ(ドメイン)の定義を行っています。1行目では、デーモンとして動作するドメインということでzope_tの定義を行っていますが、こちらに関してはマクロを使用しています。マクロを使用することにより、煩雑に定義/設定しなくてはならない構文を省略することができ、作業が大幅に楽になります。そのほか、allow文などの定義でも今回はマクロを多用して、簡単にzopeドメインのアクセスが定義できるようにしてあります。マクロに関しては、/etc/selinux/targeted/src/policy/macros以下にマクロがまとまっていますので、そちらを参考にしながら定義をしていくとよいでしょう。

 また、動作に支障がないレベルで権限を付与した状態でも、アクセス違反ログが出力されてしまいますので、ログの量を制限するために下4行で“dontaudit”を設定しています。この構文を用いると、この構文に当てはまるアクセス違反のログは出力されなくなります。

 例えば、一番下の行により「zope_tドメインのプロセスがtty_device_tタイプを持つキャラクタファイル(chr_file)にread/writeを行った」というアクセス違反が起きた場合のログは出力されなくなります。

 これらのzope.te/zope.fcファイルをそれぞれ、

/etc/selinux/targeted/src/policy/domains/programs/zope.te
/etc/selinux/targeted/src/policy/file_contexts/programs/zope.fc

として保存し、/etc/selinux/targeted/src/policy以下で、

# make reload

とすることにより、新しいポリシーがロードされます。なお、“make reload”だけではファイルコンテキストの再付与は行われませんので、

# make relabel

とするか、/(ルート)以下に.autorelabelというファイルをtouchコマンドで作成し、Permissiveモードで再起動を行うことにより、新しく定義したファイルコンテキストでのファイルシステムの再ラベリングが行われます。

 再ラベリングまでを行ってEnforcingモードで起動すると、zopeのプロセスがzope_tドメインで動作します。

[root@centos4 ~]# getenforce
Enforcing
[root@centos4 ~]# ps axZ | grep zope
user_u:system_r:zope_t           2888 ?        Ss     0:00 /usr/bin/python /usr/lib/zope/lib/python/zdaemon/zdrun.py -S /usr/lib/zope/lib/python/Zope2/Startup/zopeschema.xml -b 10 -d -s /var/lib/zope/var/zopectlsock -u zope -x 0,2 -z /var/lib/zope /var/lib/zope/bin/runzope
user_u:system_r:zope_t           2889 ?        S      0:43 /usr/bin/python /usr/lib/zope/lib/python/Zope2/Startup/run.py -C /var/lib/zope/etc/zope.conf
図7 zopeプロセスがzope_tドメイン下で動作している

 これにより、Zopeでセキュリティ上の問題が発生した場合にも、被害を極小化することができます。

 このポリシーの注意点

 このポリシーでは、/usr/bin/zopectlをエントリポイントとしました。従って、initrc_tが/usr/bin/zopectlを動作させた場合にはすべてzope_tドメインとなってしまいますので、「Ploneのみにドメインを付与する」ということができていません。これを解決するには、もう少しドメインを細かく設定する必要があります。

 また、/var/lib/zope以下をすべてzope_var_lib_tとしたために、zope_var_lib_tというライブラリにも実行権限を与えなくては動作しないという結果になってしまっています。これを解決するには、/var/lib/zope以下のbinディレクトリにも個別のタイプを与える必要があります。このように、ドメインをより細かく分けていくと、SELinuxのセキュリティはより強固になっていきます(その分、設定が大変になってしまいますが)。


 次回は、今回インストールしたシステムを例として、SELinuxを用いたシステムをバックアップする際に必要なTipsを紹介します。

3/3
 

Index
CMSツールをよりセキュアに導入しよう
  Page1
SELinuxは運用のステージへ
PloneをSELinuxで保護する
Ploneのインストール
SELinux外でのセキュリティの担保
  Page2
SELinux(Targeted)でのPlone/Zope
CentOS 4.4でのポリシーの編集方法
Page3
Zopeドメインの構成情報を考える
Zopeドメインを作成する
このポリシーの注意点


Profile
面 和毅(おも かずき)

サイオステクノロジー株式会社
OSSテクノロジーセンター
開発支援グループ
グループマネージャー


学生時代よりUNIXに親しむ。1997年からサーバ構築およびセキュリティ全般を扱う仕事に従事、Linuxを使い始める。

現在はLIDSの普及活動に注力。LIDSユーザ会(LIDS-JP)の立ち上げやLIDS関連文書の日本語化、LIDSを用いたシステム構築の紹介などを行っている。また、サイオステクノロジーでビジネス面でのLIDSの普及活動に注力している。

2005年12月より、LIDS Teamに参加し、LIDSの公式な開発チームの一員として活動している。

スイッチ・オン! SELinux 連載インデックス


Security&Trust フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Security & Trust 記事ランキング

本日 月間