第8回 Multi Level Securityで機密ファイルを管理する

古田 真己
サイオステクノロジー株式会社
インフラストラクチャービジネスユニット
Linuxテクノロジー部
OSSテクノロジーグループ
2006/11/28

 実際の動作をテストする

 クライアントであるWindows機にはVNCをインストールしてください。今回はRealVNCを使用します。downloadページからvnc-4_1_2-x86_win32.exeを入手し、インストールします。

 RealVNCをインストールしたら、早速接続してみます。接続先には「(サーバのIPアドレス):3」を指定してみてください。 まずは、インストール時に設定した一般ユーザーでログインしてみましょう。FC6の標準的なGNOMEデスクトップが表示されたらGNOME端末から自分のセキュリティコンテキストを確認してみます。

[user@localhost ~]# id -Z
system_u:system_r:initrc_t:SystemLow-SystemHigh
[user@localhost ~]# newrole -r user_r
Authenticationg user.
パスワード(P):
system_u:user_r:user_t:SystemLow-SystemHigh is not a valid context
図8 ログイン後のセキュリティコンテキストの確認と変更

 gdmからログインするとセキュリティコンテキストは本来「user_u:user_r:user_t:SystemLow」となるはずが、「system_u:system_r:initrc_t:SystemLow-SystemHigh」となってしまい、正しくひも付かないようです。

 いったんログアウトして、rootユーザーでログインし直し、この問題の修正を行います。

[root@localhost selinux]# sestatus
SELinux status:         enabled
SELinuxfs mount:        /selinux
Current mode:          permissive
Mode from config file:      permissive
Policy version:          21
Policy from config file:     mls
[root@localhost ~]# newrole -r secadm_r
Authenticationg root.
パスワード(P):
[root@localhost ~]# getenforce
[root@localhost ~]# Permissive
図9 rootユーザーでsecadm_rにロール変更しモードを確認する

 セキュリティコンテキストを調整する

 ログインコンテキストが正しくひも付かない理由は、実はFC6のMLSポリシーのコンパイル時の設定に起因しています。

 前回まで、リファレンスポリシーのレイヤ構造、ポリシーモジュールの構成などについて触れてきました。思い出していただきたいのは次の2点です。

  1. FC5から採用されたバージョン2系のリファレンスポリシーは、「admin」「apps」「kernel」「services」「system」の5つのレイヤ構造になっており、それぞれにアプリケーションやカーネルのポリシー定義が分けられている
  2. それぞれのポリシー定義はバイナリポリシーモジュールと呼ばれる「*.pp」ファイルとして別々にコンパイルすることもできるし、ベースモジュールである「base.pp」に含めておくこともできる

 今回の問題はFC6のMLSで2.にxserverのポリシーが含まれていないことで発生しています。gdm実行時のセキュリティコンテキスト(ドメイン)を調べると「system_u:system_r:initrc_t:SystemLow-SystemHigh」になっていることが分かります。これは本来なら「system_u:object_r:xdm_t:SystemLow-SystemHigh」になるべきものです。

[root@localhost~]# ps awwxZ|grep Xorg|grep -v grep
system_u:system_r:initrc_t:SystemLow-SystemHigh 2373 tty7 Ss+ 0:01 /usr/bin/Xorg :0 -br -audit 0 -auth /var/gdm/:0.Xauth vt7
図10 gdmプロセスのセキュリティコンテキスト

 gdmは「xdm_t」ドメインでは動作していません。そのため、ログインしたユーザーに適切なドメインをひも付けてセッションを開始するという、ログイン認証プログラムとしての役割が果たせません【注2】

【注2】
SELinuxのログインは、「sshd_t」(sshd)や「xdm_t」(gdm、xdm)、「local_login_t」(login)といったログイン認証プログラムが/etc/selinux/(ポリシー名)/contexts/default_contexts ファイルを参照してログインするユーザーを取り扱うため、「initrc_t」や「unconfined_t」などログイン認証プログラムに相応しくないドメインでは正常に動作しません

 前回までの手順を参考に、MLSのポリシーソースをインストールしてこの問題を解決します。

●ポリシーソースのインストール

 まず、インストールされているポリシーのソースRPMを調べ、同じものをダウンロードします。

[root@localhost ~]# rpm -q --qf '%{sourcerpm}\n' selinux-policy-mls
selinux-policy-2.4.3-10.src.rpm
[root@localhost ~]# wget ftp://download.fedora.redhat.com/pub/fedora/linux/core/development/
source/SRPMS/selinux-policy-2.4.3-12.src.rpm
図11 ポリシーソースのダウンロード

 さらに、ポリシーを再コンパイルするために必要なパッケージを追加します。

[root@localhost ~]# yum -y install gcc rpm-build checkpolicy selinux-policy-devel
図12 必要なパッケージのダウンロード

 実際の作業は前回までに触れていますが、以下の手順を踏めばOKです。

  1. 「/usr/src/redhat/SOURCES」ディレクトリに「selinux-policy」のソースRPMを展開します
[root@localhost ~]# cd /usr/src/redhat/SOURCES
[root@localhost ~]# rpm2cpio selinux-policy-2.4.3-10.src.rpm | cpio -ivmd
図13 ソースRPMの展開
  1. SPECファイルである「selinux-policy.spec」のselinux-policy-devel用の記述を修正して、「install-src」を付け加え、そのほか細かな修正をします。筆者の環境では以下のように修正しています
[root@localhost SOURCES]# diff -u selinux-policy.spec.orig selinux-policy.spec
--- selinux-policy.spec.orig 2006-11-14 20:55:36.000000000 +0900
+++ selinux-policy.spec 2006-11-14 22:39:04.000000000 +0900
@@ -2,13 +2,13 @@
  %define polyinstatiate n
  %define monolithic n
  %if %{?BUILD_STRICT:0}%{!?BUILD_STRICT:1}
-%define BUILD_STRICT 1
+%define BUILD_STRICT 0
  %endif
  %if %{?BUILD_TARGETED:0}%{!?BUILD_TARGETED:1}
-%define BUILD_TARGETED 1
+%define BUILD_TARGETED 0
  %endif
  %if %{?BUILD_MLS:0}%{!?BUILD_MLS:1}
-%define BUILD_MLS 1
+%define BUILD_MLS 0
  %endif
  %define POLICYVER 21
  %define libsepolver 1.12.26-1
@@ -180,9 +180,10 @@

  # Install devel
  make clean
-make NAME=targeted TYPE=targeted-mcs DISTRO=%{distro} DIRECT_INITRC=y MONOLITHIC=%{monolithic} DESTDIR=%{buildroot} PKGNAME=%{name}-%{version} POLY=%4 MLS_CATS=1024 MCS_CATS=1024 install-headers install-docs
+make NAME=mls TYPE=strict-mls DISTRO=%{distro} DIRECT_INITRC=y MONOLITHIC=%{monolithic} DESTDIR=%{buildroot} PKGNAME=%{name}-%{version} POLY=%4 MLS_CATS=1024 MCS_CATS=1024 install-headers install-docs install-src
+mkdir -p %{buildroot}%{_sysconfdir}/selinux/mls/src/policy
  mkdir %{buildroot}%{_usr}/share/selinux/devel/
-mv %{buildroot}%{_usr}/share/selinux/targeted/include %{buildroot}%{_usr}/share/selinux/devel/include
+mv %{buildroot}%{_usr}/share/selinux/mls/include %{buildroot}%{_usr}/share/selinux/devel/include
  install -m 755 ${RPM_SOURCE_DIR}/policygentool %{buildroot}%{_usr}/share/selinux/devel/
  install -m 644 ${RPM_SOURCE_DIR}/Makefile.devel %{buildroot}%{_usr}/share/selinux/devel/Makefile
  install -m 644 doc/example.* %{buildroot}%{_usr}/share/selinux/devel/
図14 unified diff形式によるselinux-policy.specの変更内容
  1. 「rpmbuild -bi selinux-policy.spec」を実行し、「/var/tmp/selinux-policy-2.4.3-10-root-root/etc/selinux/mls/src」以下にソースファイルを仮インストールします
[root@localhost SOURCES]# rpmbuild -bi selinux-policy.spec
図15 ソースファイルのインストール
  1. 「/var/tmp/selinux-policy-2.4.3-10-root-root/etc/selinux/mls/src」ディレクトリを「/etc/selinux/mls/」以下に移動します
[root@localhost SOURCES]# mv /var/tmp/selinux-policy-2.4.3-10-root-root/etc/selinux/mls/src /etc/selinux/mls/
図16 ソースディレクトリの移動
  1. 再コンパイル用にMLS用の「build.conf」「modules.conf」「booleans.conf」を用意します
[root@localhost SOURCES]# cp /usr/src/redhat/SOURCES/booleans-mls.conf /etc/selinux/mls/src/policy/policy/booleans.conf
[root@localhost SOURCES]# cp /usr/src/redhat/SOURCES/modules.conf
/etc/selinux/mls/src/policy/policy/modules.conf
図17 コンフィギュレーションファイルのコピー

[root@localhost policy]# cat /etc/selinux/mls/src/policy/build.conf
TYPE=strict-mls
NAME=mls
DISTRO=redhat
MONOLITHIC=n
DIRECT_INITRC=y
MLS_SENS=16
MLS_CATS=1024
MCS_CATS=1024
図18 build.confの内容

 ここまでくれば、あとは修正、再コンパイルとポリシーの再読み込みです。

●ポリシーソースの修正と再コンパイル・インストール

 いよいよ、FC6標準のMLSポリシーを修正します。先にお伝えしたとおり、標準MLSポリシーパッケージではxserver関連のポリシー記述がまったくない状態でコンパイルされています。これは/etc/selinux/mls/src/policy/policy/modules.confを調整することで、簡単に修正できます。

# Layer: services
# Module: xserver
#
# X windows login display manager
#
xserver = base ← 「off」から「base」へ変更する(573行目)
図19 modules.confの修正

 修正するのはたったこれだけです。そして、ポリシーの再コンパイルとインストールを行います。

[root@localhost ~]# cd /etc/selinux/mls/src/policy
[root@localhost policy]# make install
[root@localhost policy]# make load
図20 ポリシーを反映する

 作業が終わったら念のため、再起動してください。

3/4

Index
Multi Level Securityで機密ファイルを管理する
  Page1
FC6のリリースとSELinux
  Page2
社内機密ファイルの運用・管理をMLSで実現
インストールとRaw Hideへのアップデート
サーバ側接続環境のセットアップ
Page3
実際の動作をテストする
セキュリティコンテキストを調整する
  Page4
システムへのログインと実行ドメインの確認
運用に合わせたポリシーの修正と変更
重要ドキュメントとユーザーの管理


Security&Trust記事一覧


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

注目のテーマ

Security & Trust 記事ランキング

本日 月間