最終回 Heartbeat+独自ドメインでセキュアな世界のその先へ


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


 自動生成されたポリシーを調整する

 次に、上記で作成されたポリシーを調整します。

  1. /root/policiesディレクトリで、

    # sh heartbeat.sh

    を実行し、heartbeat.ppファイルを作成します。

    [root@primary policies]# sh heartbeat.sh
    Compiling targeted heartbeat module
    /usr/bin/checkmodule: loading policy configuration from tmp/heartbeat.tmp
    /usr/bin/checkmodule: policy configuration loaded
    /usr/bin/checkmodule: writing binary representation (version 6) to tmp/heartbeat.mod
    Creating targeted heartbeat.pp policy package
    rm tmp/heartbeat.mod.fc tmp/heartbeat.mod
    /sbin/restorecon reset /usr/lib/heartbeat/heartbeat context system_u:object_r:lib_t:s0->system_u:object_r:heartbeat_exec_t:s0
    図10 heartbeat.shを実行する

  2. system-config-selinuxの「Policy Module」で「Add」を選択します。新しいモジュールとして、「heartbeat.pp」を選択します。

    図11 heartbeat.ppを選択

  3. Heartbeatがロードされます。

    図12 Heartbeatのポリシーモジュールがロードされている

  4. ルールを追加するために、/var/log/audit/audit.logにSELinux関係のログを出力させます。

    # setenforce 0

    でPermissiveモードにし、

    # /etc/init.d/heartbeat start

    でHeartbeatを起動します。HeartbeatからApache/MySQLが起動されたのをcrm_monコマンドで確認してから、Webブラウザで実際にサンプルのサイトが出力されるのを確認します。

    図13 サンプルサイトが表示されていることを確認(クリックで拡大します)

  5. /var/log/audit/audit.logに出力されたログから、audit2allowコマンドで追加のポリシーを作成します。

    # cat /var/log/audit/audit.log | audit2allow -R > /root/policies/heartbeat.add

    として、追加のポリシー(heartbeat.add)を作成します。heartbeat_tドメインに関する項だけを残し、それ以外は削除します。

  6. heartbeat.addの中身をheartbeat.teファイルに追加します。このとき、重複している項目(typeの宣言文など)もありますので、重複がないように調整します。

  7. 「system-config-selinux」の「Policy Module」の項でHeartbeatを選択した状態で「Remove」ボタンを押し、Heartbeatモジュールをアンロードします。

  8. 一度古いheartbeat.ppファイルとtmpディレクトリを削除したあと、

    # sh ./heartbeat.sh

    を実行して、audit2allowによるポリシーが加わったheartbeat.ppファイルを再作成します。

  9. 「Add」ボタンを押して、新しいheartbeat.ppファイルをロードします。

  10. コマンドラインから、

    # setenforce 1

    として、Enforcingモードで画面が出力されることを確認します。また、“pstree -Z”コマンドで、Heartbeatが親プロセスとなっているツリーのドメインを確認します。
[root@primary ~]# pstree -Z | grep hear
  |-heartbeat(`root:system_r:heartbeat_t')
  |   |-attrd(`root:system_r:heartbeat_t')
  |   |-ccm(`root:system_r:heartbeat_t')
  |   |-cib(`root:system_r:heartbeat_t')
  |   |-crmd(`root:system_r:heartbeat_t')
  |   |   |-pengine(`root:system_r:heartbeat_t')
  |   |   `-tengine(`root:system_r:heartbeat_t')
  |   |-heartbeat(`root:system_r:heartbeat_t')
  |   |-heartbeat(`root:system_r:heartbeat_t')
  |   |-heartbeat(`root:system_r:heartbeat_t')
  |   |-lrmd(`root:system_r:heartbeat_t')
  |   |-mgmtd(`root:system_r:heartbeat_t')
  |   |-pingd(`root:system_r:heartbeat_t')
  |   `-stonithd(`root:system_r:heartbeat_t')
  |-httpd(`root:system_r:heartbeat_t')
  |   |-httpd(`root:system_r:heartbeat_t')
  |   |-httpd(`root:system_r:heartbeat_t')
  |   |-httpd(`root:system_r:heartbeat_t')
  |   |-httpd(`root:system_r:heartbeat_t')
  |   |-httpd(`root:system_r:heartbeat_t')
  |   |-httpd(`root:system_r:heartbeat_t')
  |   |-httpd(`root:system_r:heartbeat_t')
  |   `-httpd(`root:system_r:heartbeat_t')
  |-mysqld_safe(`root:system_r:heartbeat_t')
  |   `-mysqld(`root:system_r:heartbeat_t')
  |       |-{mysqld}(`root:system_r:heartbeat_t')
  |       |-{mysqld}(`root:system_r:heartbeat_t')
  |       |-{mysqld}(`root:system_r:heartbeat_t')
  |       |-{mysqld}(`root:system_r:heartbeat_t')
  |       |-{mysqld}(`root:system_r:heartbeat_t')
  |       |-{mysqld}(`root:system_r:heartbeat_t')
  |       |-{mysqld}(`root:system_r:heartbeat_t')
  |       |-{mysqld}(`root:system_r:heartbeat_t')
  |       `-{mysqld}(`root:system_r:heartbeat_t')
図14 Heartbeatツリーの様子

 図14を見ると分かりますが、現状では、httpdなどHeartbeatから実行されるプロセスも、すべてheartbeat_tドメインで動作しています。これでは、Apacheがhttpd_tドメインで動作していませんので、httpd_tで動作しているApacheを前提としたほかのプログラムにも影響を与えてしまう可能性があります。

 このように、SELinuxが出力するログから、audit2allowコマンドを使って生成されたポリシーを、何も考えずにそのまま追加してしまうと、意図しない動作をすることがあります。

 子プロセスを各ドメインへ遷移させるには

 それでは、このようなことが起きないようにするにはどうすればよいのでしょうか。Heartbeatが起動するデーモンを、それぞれ自身のドメインで動作させるためには、「ドメイン遷移」を起こさせて、各ドメインに子プロセスが遷移するようにすればOKです。

 「ドメイン遷移」についての詳しい説明は、連載「SE-PostgreSQLによるセキュア・データベース構築」の第2回、「データベース強制アクセス制御をカスタマイズする」に詳しく説明がされていますが、簡単にいうと親プロセスが、あるプログラムをexecveする際に、別のドメインに遷移するというものです。

 これを利用して、heartbeat_tドメインからhttpd_t/mysqld_tドメインへと遷移するように、下記の遷移ルールを考えます。

図15 ドメイン遷移ルールを考える
  1. heartbeat_tドメインは、heartbeat_initrc_exec_httpd2_tタイプのファイル(/etc/init.d/httpd_hb2)を実行して、httpd_tドメインを生成します。
  2. heartbeat_tドメインは、heartbeat_initrc_exec_mysqld2_tタイプのファイル(/etc/init.d/mysqld_hb2)を実行して、mysqld_tドメインを生成します。
      このように動作させるため、

    # cp -p /etc/init.d/httpd /etc/init.d/httpd_hb2
    # cp -p /etc/init.d/mysqld /etc/init.d/mysqld_hb2


    として、Heartbeatが実行する起動スクリプトとして、元の起動スクリプトをコピーします。
      また、/var/lib/heartbeat/crm/cib.xmlファイル内の2カ所を書き換えて、httpd_hb2/mysqld_hb2スクリプトを用いて起動/停止を行うように設定を変更します。
36: </primitive>
37:   <primitive id="apache" class="lsb" type="httpd_hb2">
38:    <instance_attributes id="ia_apache">
39:      <attributes>
40:        <nvpair id="ia_apache_configfile" name="configfile" value ="/etc/httpd/conf/httpd.conf"/>
--------------------------------------------------
75:   </instance_attributes>
76: </primitive>
77:   <primitive id="mysql" class="lsb" provider="heartbeat" type="my sqld_hb2">
78:           <operations>
図16 cib.xmlの赤字で示した部分を修正する

2/3

Index
Heartbeat+独自ドメインでセキュアな世界のその先へ
  Page1
Heartbeat用の独自ドメインの設定
Heartbeat用のひな型の作成
Page2
自動生成されたポリシーを調整する
子プロセスを各ドメインへ遷移させるには
  Page3
ドメイン遷移の設定
業務アプリケーションでもスイッチ・オンは怖くない!


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


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

注目のテーマ

Security & Trust 記事ランキング

本日 月間