Tetsuo Handa
from-****@I-lov*****
2007年 4月 1日 (日) 15:05:35 JST
熊猫です。 ログイン後の操作を制限する手順についての構想です。 TOMOYO Linux 1.3.2 以降が対象です。方針としては、 (1)ログイン後のドメインを keep_domain に指定することで 原則としてドメイン遷移が発生しないようにする。 (2)権限を分けたい資源にアクセスする場合には no_keep_domain に指定することでドメインを遷移させる。 (3)「実行を許可するプログラム群」「読み込みを許可するファイル群」 「書き込みを許可するファイル群」「読み書きを許可するファイル群」 等をそれぞれ path_group を用いて定義する。 です。 以下、 SSH ログイン後の操作を制限する場合で考えます。 ssh サーバ( /usr/sbin/sshd )は例外ポリシーで initialize_domain /usr/sbin/sshd という指定が行われていると思うので <kernel> /usr/sbin/sshd というドメインで動作します。 ログインシェルを /bin/bash と仮定すると、ログインシェルは <kernel> /usr/sbin/sshd /bin/bash というドメインで動作します。 そのため、このドメインについて例外ポリシーで keep_domain <kernel> /usr/sbin/sshd /bin/bash という指定を行うことで 原則としてドメイン遷移が発生しないようにします。 次に、ログイン後にどのようなコマンドの実行を許可するかを決めます。ここでは、 /bin/cat /bin/ls /bin/ln /bin/mv /bin/mkdir /bin/rmdir /usr/bin/passwd だけを許可するものとします。この場合、例外ポリシーで path_group executable_for_ssh_login /bin/cat path_group executable_for_ssh_login /bin/ls path_group executable_for_ssh_login /bin/ln path_group executable_for_ssh_login /bin/mv path_group executable_for_ssh_login /bin/mkdir path_group executable_for_ssh_login /bin/rmdir path_group executable_for_ssh_login /usr/bin/passwd というグループを定義します。そして、ドメインポリシーで <kernel> /usr/sbin/sshd /bin/bash というドメインに対して 1 @executable_for_ssh_login というアクセス許可を与えます。 次に、ログイン後にどのようなファイルの読み書きを許可するかを決めます。 ここでは、ホームディレクトリ以下のファイルの読み書きを許可するものとします。 この場合、例外ポリシーで path_group read-writable_for_ssh_login /home/\*/\* path_group read-writable_for_ssh_login /home/\*/\*/\* path_group read-writable_for_ssh_login /home/\*/\*/\*/\* path_group read-writable_for_ssh_login /root/\* path_group read-writable_for_ssh_login /root/\*/\* path_group read-writable_for_ssh_login /root/\*/\*/\* というグループを定義し、ドメインポリシーで <kernel> /usr/sbin/sshd /bin/bash というドメインに対して 6 @read-writable_for_ssh_login というアクセス許可を与えます。 新規作成や削除や移動等も許可する必要がある場合は allow_create @read-writable_for_ssh_login allow_unlink @read-writable_for_ssh_login allow_rename @read-writable_for_ssh_login @read-writable_for_ssh_login if path1.parent.ino=path2.parent.ino allow_link @read-writable_for_ssh_login @read-writable_for_ssh_login if path1.parent.ino=path2.parent.ino allow_symlink @read-writable_for_ssh_login 等も追加します。ディレクトリの作成や削除を許可するには path_group modifiable_dir_for_ssh_login /home/\*/\*/ path_group modifiable_dir_for_ssh_login /home/\*/\*/\*/ path_group modifiable_dir_for_ssh_login /root/\*/ path_group modifiable_dir_for_ssh_login /root/\*/\*/ のようにグループ(パス名が / で終わっていることに注意してください)を定義し、 allow_mkdir @modifiable_dir allow_rmdir @modifiable_dir allow_rename @modifiable_dir @modifiable_dir if path1.parent.ino=path2.parent.ino 等を追加します。ディレクトリのハードリンクは作成できないので allow_link @modifiable_dir @modifiable_dir という指定は無意味です。 ここで、学習モード(MAC_FOR_FILE=1)を指定して学習させます。 学習させると、 /usr/bin/passwd コマンドの実行により <kernel> /usr/sbin/sshd /bin/bash ドメインに対して /etc/shadow へのアクセスが発生します。 しかし、 <kernel> /usr/sbin/sshd /bin/bash ドメインから /etc/shadow へのアクセスは認めたくないので、 /etc/shadow への アクセスを行う必要がある /usr/bin/passwd は別ドメインで動作させます。 別ドメインに遷移させるためには、例外ポリシーで no_keep_domain /usr/bin/passwd from <kernel> /usr/sbin/sshd /bin/bash と指定します。これにより、 <kernel> /usr/sbin/sshd /bin/bash ドメインから /usr/bin/passwd コマンドが実行された場合には <kernel> /usr/sbin/sshd /bin/bash /usr/bin/passwd ドメインへ遷移するようになります。 <kernel> /usr/sbin/sshd /bin/bash ドメインから /etc/shadow に一致するアクセス許可( /etc/\* 等も含む)を 削除するのを忘れないでください。 <kernel> /usr/sbin/sshd /bin/bash ドメインから /etc/shadow にアクセスできてしまうと root でログインして /bin/cat /etc/shadow のような操作ができるようになってしまいます。 次に、確認モード(MAC_FOR_FILE=2)を指定して確認します。 TOMOYO_VERBOSE=1 を指定しておき、必要なアクセス許可が学習されていることを確認してください。 必要に応じてアクセス許可の追加と削除を行います。 最後に、強制モード(MAC_FOR_FILE=3)を指定します。 以上で、 SSH ログイン後に行える操作を制限できるようになるはずです。 /bin/ln コマンドを用いてホームディレクトリ以下に /etc/shadow へのシンボリックリンクを 作成しても( TOMOYO ではシンボリックリンクを解決したパス名でアクセスの可否を判断するので) /bin/cat コマンドでシンボリックリンク経由でアクセスされることはありません。また、 /etc/shadow に一致するようなアクセス許可を allow_link や allow_rename 等で与えないように することにより、 /bin/cat コマンドでホームディレクトリ経由でアクセスされることもありません。 その他、 RESTRICT_MOUNT=3 を指定すれば、 mount --bind /etc/ ~/ のような操作も禁止できます。 以上、構想でした。「ここはこういう風にした方が良いんじゃないか」等ご意見をお待ちしております。 手順がまとまったらドキュメントの一部としてHTML化したいと思います。