以下では、Fedora Core 5にTOMOYO Linux 1.2を導入する手順を解説します。この手順書に従って操作すれば、TOMOYO Linuxの基本的な機能を理解し、簡単な設定と運用が行えるようになります。
導入の流れは以下の通りです。
Fedora Core 5は、インストール時のデフォルトでSELinuxが有効になっています。本来TOMOYO LinuxとSELinuxは共存が可能ですが、Fedora Core 5の場合、うまく共存できない例が報告されています。現状では、Fedora Core 5でTOMOYO Linuxを使用する際にはSELinuxを無効にすることをお勧めします。
現在SELinuxが有効になっているかどうかは、getenforceコマンドで確認できます。
# getenforce
Enforcing
上記のように、"Enforcing"が表示されればSELinuxは有効になっています。
Linuxの起動時にSELinuxを無効にするには、SELinuxの設定ファイルである/etc/selinux/configの"SELINUX="の行を以下のように編集します。
SELINUX=disabled
編集が終わったらLinuxを再起動します。
# reboot
再度getenforceコマンドを実行し、"Disabled"が表示されることを確かめてください。
# getenforce
Disabled
TOMOYO LinuxはLinuxカーネルへのパッチとして提供されており、本来はLinuxカーネルのソースコードにパッチを適用する作業が必要になります。しかしFedora Core 5の場合は、TOMOYO Linuxのパッチを当てたコンパイル済みカーネルパッケージが提供されているので、今回はそれを利用します。
まずはパッケージをダウンロードします。
# wget http://osdn.dl.sourceforge.jp/tomoyo/21518/kernel-2.6.18-1.2200_FC5_tomoyo_1.2.i586.rpm
次に、ダウンロードしてきたパッケージをインストールします。
# rpm --install kernel-2.6.18-1.2200_FC5_tomoyo_1.2.i586.rpm
この際特にメッセージは表示されませんが、インストールに成功すれば/etc/grub.confに以下の記述が追加されているはずです。
title Fedora Core (2.6.18-1.2200_FC5_tomoyo_1.2) root (hd0,0) kernel /vmlinuz-2.6.18-1.2200_FC5_tomoyo_1.2 ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.18-1.2200_FC5_tomoyo_1.2.img
今後カーネルの選択を行いやすくするために、/etc/grub.confの"timeout="と"hiddenmenu"の行をコメントアウトしておきます。
#timeout=5
#hiddenmenu
カーネルの次は、TOMOYO Linuxのツールをインストールします。ツールには、ポリシーの管理を行うプログラムが収録されています。
カーネルと同様、Fedora Core 5にはコンパイル済みのtarballが用意されていますので、それをダウンロードします。ツールは/root/ccstoolsディレクトリに置くことにします。
# cd /root # wget http://osdn.dl.sourceforge.jp/tomoyo/21518/ccs-tools-1.2-i386-FC5.tar.gz
ダウンロードしてきたファイルを解凍すればツールのインストールは終了です。
# tar zxf ccs-tools-1.2-i386-FC5.tar.gz
TOMOYO Linuxには多くの機能があり、どの機能をON/OFFにするのかの設定をプロファイルとよびます。プロファイルは/root/security/profile$INDEX.txt($INDEXは整数)というファイルに保存し、TOMOYO Linuxのカーネルの引数でどのプロファイルを用いるかを指定することができます。
今回はファイルに対するアクセス制御の機能のみを利用するため、そのためのプロファイルを2つ(1つは自動学習モード、もう1つは強制アクセス制御モード)用意します。
まず、プロファイルやその他の設定ファイルを保存するためのディレクトリをつくります。
# mkdir /root/security # cd /root/security
そして、/root/securityに、profile0.txtとprofile1.txtというファイルを作成します。
# cat > profile0.txt << EOF MAC_FOR_FILE=1 EOF # cat > profile1.txt << EOF MAC_FOR_FILE=3 EOF
MAC_FOR_FILE=1が「ファイルに対するアクセスの自動学習モード」であり、MAC_FOR_FILE=3が「ファイルに対する強制アクセス制御モード」です。自動学習モードでおこなったアクセスを元に、強制アクセス制御モードでアクセス制御をおこなう、というのが基本的な運用の流れです。
カーネルの読み込み時にどのプロファイルを使用するかは、カーネルの引数で指定します。カーネルにCCS=$INDEXという引数を与えて起動すると、/root/security/profile$INDEX.txtというプロファイルを読み込みます。
それでは、TOMOYO Linuxの起動モードの設定をおこないましょう。
カーネルのインストール時にも一部確認しましたが、/etc/grub.conf全体は以下のようになっているはずです。
# grub.conf generated by anaconda # # Note that you do not have to rerun grub after making changes to this file # NOTICE: You have a /boot partition. This means that # all kernel and initrd paths are relative to /boot/, eg. # root (hd0,0) # kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00 # initrd /initrd-version.img #boot=/dev/sda default=0 #timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz #hiddenmenu title Fedora Core (2.6.18-1.2200_FC5_tomoyo_1.2) root (hd0,0) kernel /vmlinuz-2.6.18-1.2200_FC5_tomoyo_1.2 ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.18-1.2200_FC5_tomoyo_1.2.img title Fedora Core (2.6.18-1.2200_FC5) root (hd0,0) kernel /vmlinuz-2.6.18-1.2200_FC5 ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.18-1.2200_FC5.img
今回はprofile0.txtを読み込むモードとprofile1.txtを読み込むモード2つを選択したいので、TOMOYO Linuxカーネルの項目を2つにして、それぞれのタイトルと引数を変えます。引数のCCSは大文字でなければいけないことに注意してください。
# grub.conf generated by anaconda # # Note that you do not have to rerun grub after making changes to this file # NOTICE: You have a /boot partition. This means that # all kernel and initrd paths are relative to /boot/, eg. # root (hd0,0) # kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00 # initrd /initrd-version.img #boot=/dev/sda default=0 #timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz #hiddenmenu title Fedora Core (2.6.18-1.2200_FC5_tomoyo_1.2) ACCEPT MODE root (hd0,0) kernel /vmlinuz-2.6.18-1.2200_FC5_tomoyo_1.2 ro root=/dev/VolGroup00/LogVol00 CCS=0 initrd /initrd-2.6.18-1.2200_FC5_tomoyo_1.2.img title Fedora Core (2.6.18-1.2200_FC5_tomoyo_1.2) ENFORCE MODE root (hd0,0) kernel /vmlinuz-2.6.18-1.2200_FC5_tomoyo_1.2 ro root=/dev/VolGroup00/LogVol00 CCS=1 initrd /initrd-2.6.18-1.2200_FC5_tomoyo_1.2.img title Fedora Core (2.6.18-1.2200_FC5) root (hd0,0) kernel /vmlinuz-2.6.18-1.2200_FC5 ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.18-1.2200_FC5.img
"ACCEPT MODE"がprofile0.txtを読み込む自動学習モード、"ENFORCE MODE"がprofile1.txtを読み込む強制アクセス制御モードです。
TOMOYO Linuxのポリシーの作成は、先ほどカーネルの起動オプションで設定した自動学習モードでおこなえますが、 その前にいくつか準備が必要です。 この準備作業はTOMOYO Linuxのカーネルではなく、必ず通常のカーネルで行ってください。 TOMOYO Linuxのカーネルで準備作業を行っても、シャットダウン時に設定が上書きされてしまいます。
現在動作中のカーネルの情報を出力するには、unameコマンドを使います。
# uname --kernel-release
2.6.18-1.2200_FC5
上記のように、kernel-releaseに"tomoyo"が含まれていなければOKです。
ポリシーの作成準備は以下の流れでおこないます。
ポリシーの設定ファイルは、プロファイルと同様にすべて/root/securityディレクトリに置きます。
ポリシーを変更することができるプログラムを、/root/security/manager.txtというファイルで指定します。ccs-toolsの中の3つのプログラムを以下のように指定してください。
# cat > /root/security/manager.txt << EOF /root/ccstools/loadpolicy /root/ccstools/editpolicy /root/ccstools/setlevel EOF
TOMOYO Linuxの動作中、ポリシーはメモリ上に置かれています。電源が切れる直前のポリシーをファイルに保存するため、シャットダウンスクリプトの中で/root/ccstools/savepolicyが実行されるように修正を加えます。
Fedora Core 5のシャットダウンスクリプトは/etc/rc.d/init.d/haltです。haltの最後の行は以下のようになっているはずです。
exec $command $HALTARGS
このコマンドの直前にsavepolicyを実行するように変更します。
/root/ccstools/savepolicy a
exec $command $HALTARGS
savepolicyの引数"a"は、すべてのポリシーを保存するオプションです。
TOMOYO Linuxのログは、アクセスが許可された要求のログと、アクセスが拒否された要求のログの2種類に分けることができます。今回は、アクセス拒否ログのみを保存する設定を行います。
ログを保存するには、ccs-toolsのccs-auditdというデーモンプログラムを使用します。アクセス拒否ログのみを保存する設定でccs-auditdをLinuxの起動時に実行するには、/etc/rc.d/rc.localの末尾に以下の1行を追加します。
/root/ccstools/ccs-auditd /dev/null /var/log/tomoyo/reject_log.txt
この設定では、/var/log/tomoyo/reject_log.txtにアクセス拒否ログが保存されます。ログを保存するディレクトリをあらかじめ作っておきます。
# mkdir /var/log/tomoyo
ポリシー生成の前には、以下の4種類の例外を設定しておく必要があります。
以上の4種類の例外ポリシーを自動的に生成するスクリプトmake_exception.shが、ccs-toolsに用意されています。make_exception.shを使って例外ポリシーを生成して保存するには以下のようにします。
# /root/ccstools/make_exception.sh > /root/security/exception_policy.txt
以上でTOMOYO Linuxを使うための基本的な設定は終わりです。
それでは、TOMOYO Linuxにポリシーを学習させましょう。 今回は、ログイン後の以下の操作をTOMOYO Linuxに学習させることにします。
まずは学習モードで起動するために、Linuxを再起動します。
# reboot
カーネルの選択画面で"ACCEPT MODE"を選択してEnterを押します。
rootでログインし、上記の操作を行います。
一見普通のLinuxと変わりなく操作できますが、裏ではTOMOYO Linuxがアクセス許可を監視し、操作ごとにポリシーとしてメモリ上に記憶しています。
生成されたポリシーの参照・編集には、ccs-toolsのeditpolicyを用います。
editpolicyを起動すると、TOMOYO Linuxが学習したドメイン遷移が表示されます。
ドメイン遷移はプロセスの親子関係をそのまま反映しており、どのプロセスからどのプロセスが実行されたのかを見て取ることができます。
ドメイン遷移の中から、mingettyを探してみてください。
/sbin/mingetty下の/bin/login以下では、ログインしてからのプロセス実行履歴が分かります。その中からさらに、/usr/bin/headコマンドを探してみてください。headコマンドの行でEnterキーを押すと、以下の画面が表示されます。
これは先ほどの操作で学習したポリシーで、
<kernel> /sbin/mingetty /bin/login /bin/bash /usr/bin/headというドメイン(赤下線)には/etc/passwdへの読み込みアクセス(青下線)を許可する
ということを意味しています。
このようにTOMOYO Linuxでは、絶対パスを用いたプロセスの実行履歴を用いてドメイン分けを行っており、同じコマンドであっても、実行履歴により区別されたアクセス制御を行うことができます。また、ドメインにおけるファイルに対するアクセス許可は、通常のLinuxにおけるファイルに対するパーミッションと同様の3種類(読み込み・書き込み・実行)の他に、ファイルの新規作成・削除・名前変更なども設定できます。
学習モードで学習されたポリシーはシャットダウン時にファイルに保存され、次回の起動時には自動的に読み込まれます。実際の運用では、再起動を含めて許可したい操作を何回か学習させ、ポリシーエディタで不要なアクセス許可を除いていく、という操作を繰り返します。
それでは、先ほど自動学習したポリシーを使って、強制アクセス制御を行います。Linuxを再起動し、今度は"ENFORCE MODE"のカーネルでLinuxを起動してください。このモードでは、TOMOYO Linuxは起動時にポリシーの読み込みを行い、ポリシーに含まれない操作を拒否します。
rootでログインした後、以下の操作を行ってみます。
図中の赤下線のコマンドは先ほど学習モードで行った操作ですので、問題なく実行できます。逆に青下線のコマンドはエラーになります。
エラーになった操作のログは、ccs-toolsのccs-auditdによって/var/log/tomoyo/reject_log.txtに保存されています。
#2006-08-07 16:12:29# pid=1677 uid=0 gid=0 euid=0 egid=0 suid=0 sgid=0 fsuid=0 fsgid=0 <kernel> /sbin/mingetty /bin/login /bin/bash 1 /usr/bin/tail #2006-08-07 16:12:29# pid=1677 uid=0 gid=0 euid=0 egid=0 suid=0 sgid=0 fsuid=0 fsgid=0 <kernel> /sbin/mingetty /bin/login /bin/bash 4 /usr/bin/tail #2006-08-07 16:12:38# pid=1678 uid=0 gid=0 euid=0 egid=0 suid=0 sgid=0 fsuid=0 fsgid=0 <kernel> /sbin/mingetty /bin/login /bin/bash /usr/bin/head 4 /etc/shadow #2006-08-07 16:12:45# pid=1692 uid=0 gid=0 euid=0 egid=0 suid=0 sgid=0 fsuid=0 fsgid=0 <kernel> /sbin/mingetty /bin/login /bin/bash /bin/tcsh 1 /bin/date