23.3. SELinux の起動とログイン

Turbolinux 10 Server で SELinux カーネルを起動するには、はじめに通常のカーネルで起動したシステムにログインし、root ユーザーで以下のコマンドを実行します。これにより、デフォルトのポリシーファイルに基づき、システムに存在するファイルに対して、タイプが付与されます。この処理は、しばらく時間がかかります。

# fixfiles relabel

また、SELinux には、enforcing と permissive と呼ばれる 2 つの動作モードがあります。enforcing が通常のモードであり、SELinux が機能している状態です。permissive は、本来であれば拒否すべきリソースへのアクセスを許可し、ログのみを出力するモードです。ログは /var/log/messages ファイルに記録されます。このモードは、ポリシーファイルを設定するときのデバッグ目的として利用されます。permissive モードでプログラムを動作させ、その間に拒否されたリソースをログで確認すれば、そのドメイン(プロセス)を SELinux 対応するために何の設定が足りないのかを把握することができます。デフォルトのモードは、/etc/sysconfig/selinux で指定されています。

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#       enforcing - SELinux security policy is enforced.
#       permissive - SELinux prints warnings instead of enforcing.
#       disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of these two values:
#       targeted - Only targeted network daemons are protected.
#       strict - Full SELinux protection.
SELINUXTYPE=strict

SELINUX の値を permissive に変更すれば、permissive モードで起動します。なお、モードの変更は、起動後に setenforce コマンドで切り替えることもできます。

次に、SELinux カーネルを有効にするために、ブートオプション selinux=1 を指定してシステムを再起動します。以下のように /boot/grub/grub.conf のカーネルパラメータに selinux=1 を追記するか、もしくは GRUB の起動画面から指定することもできます(第2章 参照)。

title Turbolinux
kernel (hd0,0)/boot/vmlinuz root=0802 selinux=1
initrd (hd0,0)/boot/initrd

起動すると、以下のログイン画面が表示されます。一見すると、通常のログイン画面と同じようですが、SELinux ではログインプログラムも変更されています。

Turbolinux Server 10.0 (Celica)
Linux 2.6.8-0.17smp on an i686 (localhost)
VC: vc/1

localhost login: root
Password:
Your default context is root:sysadm_r:sysamd_t.

Do you want to choose a different one? [n]y
[1] root:sysadm_r:sysamd_t
[2] root:staff_r:staff_t
[3] root:webmaster_r:webmaster_t
Enter number of choice: 2
Last login: Tue Sep 14 15:10:08 on tty1
Welcome to Turbolinux
[localhost root]#

ユーザー名とパスワードを入力すると、デフォルトのコンテキスト root:sysadm_r:sysamd_t が表示されます。このように root には、sysadm_r というロールがデフォルトで設定されます。また、この権限でログインしたシェルには、sysamd_t というドメインが付与されます。

次に、ユーザーが他のロールでもログイン可能な場合は、デフォルト以外のロールでログインするかどうかを問われます。そのまま[Enter]キーを押すと、デフォルトのロールでログインしますが、y を入力するとロールを選択することができます。ここでは、2 を選択し、staff_r ロールでログインしています。

staff_r は一般ユーザーのために用意されたロールです。したがって、このユーザーは、root でログインしたにもかかわらず、SELinux の RBAC 機能が働くため、通常の root ユーザーの権限はありません。試しに、/etc/shadow ファイルを参照してみます。

# less /etc/shadow
audit(1095144227.134:0) avc:  denied  { getattr } for  pid=1503 exec=/usr/bin/le
ss path=/etc/shadow dev=sda2 ino=426087 scontext=root:staff_r:staff_t tcontext=s
ystem_u:object_r:shadow_t tclass=file
audit(1095144227.134:0) avc:  denied  { getattr } for  pid=1503 exec=/usr/bin/le
ss path=/etc/shadow dev=sda2 ino=426087 scontext=root:staff_r:staff_t tcontext=s
ystem_u:object_r:shadow_t tclass=file
/etc/shadow: Permission denied

上記のようにエラーメッセージが出力され、アクセスを拒否されます。次にシステム管理者用のロールである sysadm_r でログインし直すか、もしくは、以下のように newrole コマンドを実行してロールを切り替えます。sysadm_r は、システムに対するほとんどの管理権限が付与されています。

# newrole -r sysadm_r
Authentication root.
Password:

これで、sysadm_r に切り替わりました。getcon コマンドを実行すると、現在のロールを確認できます。

# getcon
root:sysadm_r:sysamd_t

上記のように表示されれば、sysadm_r でログインしています。この権限でログインしたシェルには、sysamd_t というドメインが付与されます。もう一度、/etc/shadow を参照すると、今度はファイルの内容を参照できるはずです。

また、モードの切り替えは setenforce コマンドで行えます。引数に 0 を指定すると permissive モードとなり、1 を指定すると enforcing モードに切り替わります。また、現在のモードは getenforce コマンドで確認することができます。

# getenforce
enforcing
# setenforce 0
# getenforce
permissive

先ほど、ロール staff_t で拒否された /etc/shadow ファイルを permissive モードで参照してみます。permissive あれば、拒否すべきアクセスでも実際には許可しますので、ファイルの内容を参照することができます。ただし、/var/log/messages にはアクセスを拒否したログが残ります。

# getcon
root:sysadm_r:sysamd_t
# newrole -r staff_r
Authentication root.
Password:
# getcon
# root:staff_r:staff_t
# less /etc/shadow

このように、SELinux では、デフォルトですべてのアクセスが拒否に設定されているため、各ドメインがアクセス可能なタイプをポリシーファイルで明示的に設定しなければなりません。許可されていないリソースへのアクセスは、SElinux が備える TE や RBAC の機能により拒否されます。したがって、SELinux の運用に至っては、ドメイン、タイプの定義、またドメインへのタイプの割り当てやロールへのドメインの割り当てなど、ポリシーファイルの定義が非常に重要な作業となります。しかし、ポリシーファイルの設定は、SELinux だけでなく Linux システムに対する十分な知識が必要です。また、セキュリティポリシーは、各システムにより異なるため、そのシステムに適切なポリシーファイルの設定が必要です。本ガイドでは、SELinux の基本的な動作の仕組みを紹介しましたが、ポリシーファイルの設定については触れていません。ポリシーファイルを定義するには、一般的に以下の手順を踏む必要があります。

  1. リソースへのタイプを付与

  2. TE(TypeEnforcement)の設定(ドメインがアクセス可能なタイプの指定)

  3. ポリシーファイルへの反映(テキスト形式のポリシーファイルをバイナリファイルへ変換)

  4. permissive モードでソフトウェアを動作させ、アクセスが拒否されたリソースをログで確認。必要であれば許可する設定を追加

  5. ここまでの作業を繰り返す

  6. enforcing モードに切り替え、動作確認

ティップ

Turbolinux 10 Server の初期設定では、代表的なネットワークサービスである BIND、Apache、Postfix の基本的な機能のみ SELinux 環境下で動作するように、あらかじめポリシーファイルの設定がされています。その他のサービスを運用する場合には、適宜ポリシーファイルの設定が必要になります。