2done.org

Linuxメインなメモ書き。二度寝してから書く。(ご意見は Twitter あたりで。そのうちコメント欄つけます。)

MCS を試す

2010/12/31: 新規作成

 

前提条件

Fedora 14

パッケージ policycoreutils-python が必要

# yum -y install policycoreutils-python

 

はじめに

Fedora5 以降の SELinux(Referrence Policy) には MCS(Multi Category Security) と MLS(Multi Level Security)という機能があります。
ユーザを user_u や staff_u などの大きな区分ではなく、細分化してしまおう。というのが、この機能の目的です。
MCS はカテゴリ、MLS では カテゴリ + レベル をそれぞれユーザに付与します。
カテゴリは部署、レベルは役職のような物だと思って問題ありません。

同じ会社内でも、製造部・営業部・総務部などでアクセスを限定したいケース。(カテゴリ)
同じ部署内でも、平社員・課長・部長・経営者層などでアクセスを限定したいケース。(カテゴリ + レベル)
が、存在します。MCS や MLS を利用することでこれを実現出来ます。

MCS/MLS より詳しく知るためには以下が参考になります。
http://www.atmarkit.co.jp/fsecurity/rensai/selinux06/selinux01.html

 

セキュリティコンテキストを確認する

具体的に見ていきましょう。

 

ユーザのセキュリティコンテキスト

ユーザのセキュリティコンテキストは id コマンドで確認できます。

# id -Z
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

 

s0-s0:c0.c1023 の部分が MCS のラベルです。
sN は MLS で使用する Sensitivity、cN は MCS, MLS で使用する Category です。

-(ハイフォン)の前にある s0 はデフォルト値です。
-(ハイフォン)の後ろはアクセスできる上限を指定します。
※ デフォルト値はデフォルトでは、Sensitivity: s0, Category: なし として定義されていますが、変更も可能です。

mcstransd が起動している場合は、次のような表示になりますがここでは解説しません。

参考: http://d.hatena.ne.jp/ishikawa84g/20080115

# id -Z
unconfined_u:unconfined_r:unconfined_t:SystemLow-SystemHigh

 

プロセスのセキュリティコンテキスト

当然のことながらユーザだけでなくプロセスにもこれは付与されます。

# ps axZ (抜粋)
system_u:system_r:kernel_t:s0      39 ?        S      0:00 [ksnapd]
system_u:system_r:kernel_t:s0      40 ?        S      0:00 [usbhid_resumer]
system_u:system_r:kernel_t:s0     187 ?        S      0:00 [jbd2/sda3-8]
system_u:system_r:kernel_t:s0     188 ?        S      0:00 [ext4-dio-unwrit]
system_u:system_r:udev_t:s0-s0:c0.c1023 225 ?  S<s    0:00 /sbin/udevd -d
system_u:system_r:udev_t:s0-s0:c0.c1023 326 ?  S<     0:00 /sbin/udevd -d
system_u:system_r:udev_t:s0-s0:c0.c1023 328 ?  S<     0:00 /sbin/udevd -d

 

実際に使ってみる

ここでは 3つのユーザ を作成し、それぞれにカテゴリを付与します。
また、ファイルに対してもカテゴリを追加し、ユーザのカテゴリとファイルのカテゴリが一致しないと表示等ができないようにしてみます。

 

ユーザの作成と対象ファイルの作成

ユーザの作成

とりあえず、同じグループに属するユーザを3つ作成します。

# groupadd usergrp
# useradd -g usergrp user1
# useradd -g usergrp user2
# useradd -g usergrp user3
# passwd user1 << _EOF_
y7u8i9o0
y7u8i9o0
_EOF_

# passwd user2 << _EOF_
y7u8i9o0
y7u8i9o0
_EOF_

# passwd user3 << _EOF_
y7u8i9o0
y7u8i9o0
_EOF_

 

※ パスワードは適切な物を選択しましょう。

 

ファイルの作成

/tmp の下に3つのファイルを作成します。
3つのファイルは誰からでもアクセス出来るよう権限を 777 に変更しておきます。

# date > /tmp/date.txt
# echo hello > /tmp/hello.txt
# echo all > /tmp/all.txt
# chmod 777 /tmp/date.txt /tmp/hello.txt /tmp/all.txt

# ls -l /tmp/all.txt /tmp/date.txt /tmp/hello.txt
-rwxrwxrwx. 1 root root    4 Dec 24 09:55 all.txt
-rwxrwxrwx. 1 root root   29 Dec 24 09:20 date.txt
-rwxrwxrwx. 1 root root    6 Dec 24 09:20 hello.txt

# ls -Z /tmp/all.txt /tmp/date.txt /tmp/hello.txt
-rwxrwxrwx. root root unconfined_u:object_r:user_tmp_t:s0 all.txt
-rwxrwxrwx. root root unconfined_u:object_r:user_tmp_t:s0 date.txt
-rwxrwxrwx. root root unconfined_u:object_r:user_tmp_t:s0 hello.txt

 

先ほど作成したユーザでこれらのファイルの表示できるこを確認します。(略)

 

ユーザにカテゴリを付与する

作成したユーザにカテゴリを付与します。

※ SELinux User は unconfined_u とします。

# semanage login -a -S targeted -s unconfined_u -r s0-s0:c0 user1
# semanage login -a -S targeted -s unconfined_u -r s0-s0:c1 user2
# semanage login -a -S targeted -s unconfined_u -r s0-s0:c0,c1 user3

 

SELinux User と Login User が紐付けられていることを確認します。

# semanage login -l

Login Name                SELinux User              MLS/MCS Range

__default__               unconfined_u              s0-s0:c0.c1023
root                      unconfined_u              s0-s0:c0.c1023
system_u                  system_u                  s0-s0:c0.c1023
user1                     unconfined_u              s0-s0:c0
user2                     unconfined_u              s0-s0:c1
user3                     unconfined_u              s0-s0:c0,c1

 

ファイルのカテゴリを変更する

作成したファイルにカテゴリを付与します。

 

# chcon -l s0:c0 /tmp/date.txt
# chcon -l s0:c1 /tmp/hello.txt

 

カテゴリが付されていることを確認します。

# ls -Z /tmp/all.txt /tmp/date.txt /tmp/hello.txt
-rwxrwxrwx. root root unconfined_u:object_r:user_tmp_t:s0 /tmp/all.txt
-rwxrwxrwx. root root unconfined_u:object_r:user_tmp_t:s0:c0 /tmp/date.txt
-rwxrwxrwx. root root unconfined_u:object_r:user_tmp_t:s0:c1 /tmp/hello.txt

 

アクセスしてみる

user1 の場合

$ id -Z
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0
$ cat /tmp/all.txt
all
$ cat /tmp/date.txt
Fri Dec 24 09:20:36 JST 2010
$ cat /tmp/hello.txt
cat: /tmp/hello.txt: Permission denied

user2 の場合

$ id -Z
unconfined_u:unconfined_r:unconfined_t:s0-s0:c1
$ cat /tmp/all.txt
all
$ cat /tmp/date.txt
cat: /tmp/date.txt: Permission denied
$ cat /tmp/hello.txt
hello

user3 の場合

$ id -Z
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0,c1
$ cat /tmp/all.txt
all
$ cat /tmp/date.txt
Fri Dec 24 09:20:36 JST 2010
$ cat /tmp/hello.txt
hello

 

カテゴリなしの/tmp/all.txt は全てのユーザから表示ができました。
その他のファイルについてはカテゴリが一致した場合のみ表示が可能になりました。

 

audit.log を確認する

アクセス拒否のログは以下のようになります。

type=AVC msg=audit(1293150874.777:101): avc:  denied  { read } for  pid=1121 comm="cat" name="date.txt" dev=sda3 ino=12541 scontext=guest_u:guest_r:guest_t:s0 tcontext=unconfined_u:object_r:user_tmp_t:s0:c0 tclass=file
type=AVC msg=audit(1293150880.397:102): avc:  denied  { read } for  pid=1122 comm="cat" name="hello.txt" dev=sda3 ino=12542 scontext=guest_u:guest_r:guest_t:s0 tcontext=unconfined_u:object_r:user_tmp_t:s0:c1 tclass=file

どこで使うか

手頃に試すのであれば sVirt, mod_selinux あたりがオススメ