2022年8月、ホームページを全面リニューアルしました! 情報を分かりやすくお伝えできるサイト作りを目指してまいります。

SlackwareでTOMOYO Linux!

TOMOYOLinuxについての詳細は、 ここ で既に説明しているが、昨今、「セキュアOS」という言葉を良く耳にする。端的に「セキュリティに強いOS」と言う事だが、セキュリティに強い機能をバンドルしたOSと言う考え方もあるが、どちらかというと既存のOSにプラグインする考え方を実現してる。もちろん、Linuxで言うとSELinuxのようにKernel-2.6系での標準仕様として盛り込まれている物もある。TOMOYO Linuxのようなセキュリティモジュールの根底には、「たとえrootでも容赦しない。」という強制アクセス制御と「ユーザやプロセスに決められた動作しか許しません。」のような最少特権のような考え方がある。この中でも、前者の強制アクセス制御を考えると、Unixというのは元々最高権限者がrootである。つまり、root権限を得たユーザはそのシステムの設定及び操作を自由に行う事が出来る。そうなってくると、 ここ で説明しているが、setuid(0)により簡単にroot権限を奪って自由に使う事が出来てしまうと恐ろしい。したがって、それを回避するには、Unixの常識を覆してroot権限を最高権限から引きずり下ろすしかない。簡単に言うと、いかにrootと言えども操作できるプロセス及びコマンドもしくは、アクセスできるディレクトリ・ファイルを制限してしまう事だ。ここいら辺は、色々なセキュアOSの当たり前の機能であるため今となっては特筆する機能でもないかもしれない。しかし、各種セキュアOSは、その操作・設定が非常に難しいという欠点がある(少なくても俺はそう思ってる)。有名どころのSELinuxにせよLIDS(リズ)にせよPolicyの設定に独特の書式で記述するため、少なくても俺は敷居が高い。そのような背景から、TOMOYO Linuxを比較すると、通常の操作からPolicyを自動的に作成して、後でそのPolicyを編集したり、独自にカスタマイズしたりする事が可能なため、特別な書式を学習する必要がない。もちろん、自動生成したPolicyをそのまま使っても良いが、カスタマイズしないと事実上実用的に不便かと思う。
実際に、現在のセキュアOSと言うかセキュアモジュールの実装形態は、以下三種類の方法がある。
1) LKM(Linux Kernel Module)
2) Kernelへ直接パッチを当ててリコンパイルする
3) LSM(Linux Security Module)
1)の方法は、プラグイン出来るkernelモジュールだ。しかし、これはrootkitで実装された方法なので、現在のKernel-2.6系では、LKMとしての実装が難しくなっている。
2)の方法は、kernelへパッチを当ててKernel-sourceをコンパイルする方法だが、TOMOYO Linuxはこの方法をとっている。
3)の方法は、LSMと言うKernel-2.6系から初めて実装された、「セキュリティモジュールをカーネルにプラグインするためのフレームワーク」とでも言うか、これに関してはSELinuxとLIDSはLSMに準拠して開発されている。
前置きが長くなったが、ここではSlackwareで TOMOYOLinux を使う方法を伝授する。すでに、Slackware-10.2のインストール方法は、 ここ で説明してるので割愛する。

インストールマシン環境)

インストールマシン : Mebiusノート HDD30GB メモリ512MB(そのうち256MBをVMwareに使用)
OS : WindowsXP Professional
仮想OS : Slackware-10.2
仮想ディスク作成ソフト : qemu-0.8.2-windows
VMwarePlayer : VMware-player-1.0.2


1.準備
1)TOMOYOLinux導入に必要なモジュール
Slackware-10.2に基本的な開発環境とかがインストールされているものとして話を進める。Slackware-10.2のインストールについては、 ここ を参照すること。前準備として必要なものは、 以下の二つのモジュールだ。

# slackpkg install ncurses

# slackpkg install glibc

2)BootloaderをLILOからGRUBへ変更する
Slackware-10.2は、DefaultでLILOがインストールされる。したがって、使いにくいので予めGRUBへ移行しよう。

# slackpkg install grub
# mkdir -p /boot/grub
# cd /boot/grub
# vi menu.lst

timeout 30
default 0

title Slackware-10.2 kernel 2.4.33
root (hd0,1)
kernel /vmlinuz-ide-2.4.33 vga=771 root=/dev/hda3 ro
savedefault
boot

マスターブートレコードにgrubをインストールする。
# grub-install /dev/hda

最後に、LILOを消す。
# slackpkg remove lilo


2.インストール

1)ツールをコンパイルする
えーと、必要なソース類は、 ここ に揃っていまふ。2006年8月現在では、 ccs-tools-1.1.3-20060713.tar.gz が最新であった。
# cd /root
# wget http://osdn.dl.sourceforge.jp/tomoyo/20841/ccs-tools-1.1.3-20060713.tar.gz 
← 一行で
# tar zxvf ccs-tools-1.1.3-20060713.tar.gz
# cd ccstools

通常、以下のmakeコマンドで必要ソースをコンパイルすることは出来る。
# make -s

図1

コンパイルが終わったら、以下のファイルがccstoolsディレクトリに有るか確認する。
* loadpolicy
* editpolicy
* savepolicy
* findtemp
* sortpolicy
* setlevel
* ccs-auditd
* make_exception.sh

make -s だけでも上記の必要ファイルはコンパイルできるが、全てのCソースをコンパイルするには、

# make -s all

でコンパイルする。しかし、実行したところ以下のようなエラーが出た。

図2

これは、readlineライブラリが無いから falshがコンパイル出来ないと言うことなので、
# slackpkg install readline

として、readlineライブラリをインストールする。そして再度、
# make -s all
で図3のように全てコンパイルできる。

図3

2)カーネルコンパイル&リンク
モジュールディレクトリを作る。元々、Slackwareインストール後は、kernel2.4.33がマウントされている。この時点では、kernel2.4系のccs-patchは、2.4.32が最新なのでkernelを2.4.32にダウングレードする。
# mkdir -p /lib/modules/2.4.32-ccs
# cd /usr/src/
# wget http://www.kernel.org/pub/linux/kernel/v2.4/linux-2.4.32.tar.gz
# tar zxvf linux-2.4.32.tar.gz
# chown -R root.root linux-2.6.16

ソースからライタブル属性を削除する。
# cd linux-2.4.32
# find -print0 | xargs -0 chmod go-w —

kernelパッチをゲットする。
# wget http://download.sourceforge.jp/tomoyo/20840/ccs-patch-1.1.3-20060713.tar.gz ← 一行で
2006年8月現在では、 ccs-patch-1.1.3-20060713.tar.gz が最新であった。以下の要領でパッチを当てる。以前のカーネルコンフィグを利用した方が利口かもね(^_-)-☆パチッ。
# tar zxvf ccs-patch-1.1.3-20060713.tar.gz
# patch -sp1 < ccs-patch-2.4.32.txt
# cp ../linux-2.4.33/.config ./
# make -s oldconfig
# make -s menuconfig

図4

「File systems」を選択して、一番下まで行けば以下の図のような設定が出てきます。

図5

とりあえず、 * や M 印を上図のように付ける。

コンパイルする
# make -s dep
# make clean
# make -s bzImage

ここで、install.shの最後の行をコメントする。
# vi arch/i386/boot/install.sh
省略
# if [ -x /bin/lilo ]; then /sbin/lilo; else /etc/lilo/install; fi

# make -s modules modules_install install
initrdを作る
# mkinitrd -o /boot/initrd.img-2.4.32-ccs 2.4.32-ccs

3)grubの編集
ACCEPTモードで学習させ、ENFORCEモードで実行させるから、grubメニューを以下のように編集する。ACCEPTモードとENFORCEモードは、 CCS=0 と CCS=1 のオプションスイッチで切り分けている。実際のイメージは、図3のようになる。

# cd /boot/grub/
# vi menu.lst

timeout 30
default 0
title Slackware-10.2 kernel 2.4.32 ACCEPT MODE
root (hd0,1)
kernel /vmlinuz-2.4.32 vga=771 root=/dev/hda3 CCS=0 ro
initrd /initrd.img-2.4.32-ccs
savedefault
boot

title Slackware-10.2 kernel 2.4.32 ENFORCE MODE
root (hd0,1)
kernel /vmlinuz-2.4.32 vga=771 root=/dev/hda3 CCS=1 ro
initrd /initrd.img-2.4.32-ccs
savedefault
boot

#title Slackware-10.2 kernel 2.4.32
#root (hd0,1)
#kernel /vmlinuz-2.4.32 vga=771 root=/dev/hda3 ro
#initrd /initrd.img-2.4.32-ccs
#savedefault
#boot

title Slackware-10.2 kernel 2.4.33
root (hd0,1)
kernel /vmlinuz-ide-2.4.33 vga=771 root=/dev/hda3 ro
savedefault
boot

図6

4)カーネルで制御できる項目のディレクトリを作成
# mkdir -p /root/security

5)ポリシーの初期設定
# vi /root/security/profile0.txt
MAC_FOR_FILE=1
# cp /root/security/profile0.txt /root/security/profile1.txt
# vi /root/security/profile1.txt

MAC_FOR_FILE=3

6)ポリシーの変更を許可するプログラムの設定
■ ポリシーを再読み込みする loadpolicy
■ ポリシーを編集する editpolicy
■ 制御レベルを変更する setleve

# vi /root/security/manager.txt
/root/ccstools/loadpolicy
/root/ccstools/editpolicy
/root/ccstools/setlevel

7)halt、rebootコマンドの編集(ポリシーの保存)
以下のファイルへ濃い青字の部分を追加する。
# vi /etc/rc.d/rc.6
省略
# Find out how we were called.
case “$0” in
*0)
command=”halt”
halt –help 2> /dev/null
/root/ccstools/savepolicy a

;;
*6)
command=reboot
;;
*)
echo “$0: call me as \”rc.0\” or \”rc.6\” please!”
exit 1
;;
省略
# Now halt (poweroff with APM or ACPI enabled kernels) or reboot.
if [ “$command” = “reboot” ]; then
echo “Rebooting.”
reboot –help 2> /dev/null
/root/ccstools/savepolicy a

reboot
else
poweroff
fi
省略

8)監査ログを取得するための準備
# mkdir -p /var/log/tomoyo
# /root/ccstools/ccs-auditd /dev/null /var/log/tomoyo/reject_log.txt

9)ログの切り出しファイル作成
# vi /etc/logrotate.d/tomoyo
/var/log/tomoyo/reject_log.txt {
  weekly
  rotate 9
  missingok
  notifempty
  nocreate
}

これで、インストールはとりあえずおしまい。


3.実際に動かしてみる
TOMOYOLinuxの使い方は、 ここ でも紹介している。したがって、ここでは実際にAccess制御が効いてるか試してみた。
一度、ACCEPT MODEで起動してコマンド入力を行ってから、再起動してENFORCE MODEで立ち上げてみた。

図7

ENFORCE MODEで立ち上げる。

図8

上図の下の方で、rootでloginしているが、/etc/hostsをcatして Operation not permitted で怒られていることが解る。

以上

コメント