図1●アクセス制御リストの設定手順
まずデフォルト・ポリシーを適用してから,特定のプロセスやファイルごとのポリシーを適用していく
 LIDSでは,通常のLinuxに比べ,格段にきめ細かなアクセス制御が行える。これは,「アクセス制御リスト(ACL=Access Control List)」と呼ぶ仕組みを用いて実現されている。

 LIDSのアクセス制御リストは,(1)ファイルに対するアクセス権限と,(2)プロセスに対する動作権限を,リスト形式で設定したものである。ACLを設定する際は,図1[拡大表示]のように,システム全体に大まかな「デフォルト・ポリシー」を適用し,それから特定のプロセスやファイルごとのポリシーを適用するという手順になる。

 LIDSでは,ファイルに対して4種類のアクセス権限(DENY,READONLY,APPEND,WRITE)を設定できる(表1)。

表1●ファイルに設定できるアクセス権限

項目名 内容
DENY あらゆるアクセスを禁止
READONLY 読み込みのみ
APPEND 読み込みと追記のみ
WRITE 読み込み,書き込み,削除

(1)DENY

 ファイルのアクセス権限をDENYに設定した場合は,ファイルに一切アクセスができなくなる。例えば,LIDSの設定ファイルが保存されている/etc/lidsディレクトリはすべてのコマンドに対してDENYに設定されている。そのため,LIDSの設定ファイルをlsコマンドで閲覧しようとしても,アクセス不可を意味するエラー・メッセージが表示されるだけである。システムの実運用時には,重要なファイルはDENYに設定しておくことが望ましい。

(2)READONLY

 アクセス権限をREADONLYに設定した場合は,読み込みのみが行える。ファイルへの書き込みは行えない。READONLYは,サーバー・アプリケーションの起動時に読み込まれる設定ファイルに対してよく使われる。例えば,Apache HTTP Server(以下,Apache)の設定ファイル(httpd.conf)をDENYに設定してデフォルトでは見えない状態にしておき,Apacheのプロセスに対してのみREADONLYに設定するなどである。

(3)APPEND

 アクセス権限をAPPENDに設定した場合は,読み込みと追記のみが可能になる。削除は行えない。例えば,Apacheのログ・ファイルをデフォルトではREADONLYに設定してから,Apacheのプロセスに対してのみAPPENDに設定したとする。こうしておけば,Apache以外のプロセスからはログの閲覧しか行えないが,Apacheのプロセスだけは追記が行える。ただし,追記はできるものの削除や上書きは不可なので,万が一,悪意を持った第三者にApacheのプロセスを乗っ取られたとしても,ログは削除されない。そのため,侵入の痕跡を消されずにすむ。

(4)WRITE

 アクセス権限をWRITEに設定した場合は,読み込みと書き込みと削除が行える。あらゆるアクセスが可能になるため,重要なファイルをWRITEに設定するのは好ましくない。

 これら4種類のアクセス権限は,通常のLinuxのパーミッションよりも優先される。コマンド実行時などプロセスからファイルに対してアクセスが行われた場合,最初に通常のLinuxのパーミッションがチェックされた後に,LIDSにより設定されたアクセス権限がチェックされる。

 そのため,例えば,LIDSでREADONLYに設定されているファイルに対し,パーミッションでは「rw(読み込みと書き込みが可能)」という権限が設定されていたとしても,プロセスからは読み込みだけしか行えない。また,LIDSでDENYに指定されているファイルやディレクトリに対しては,パーミッションで「rw」の権限が設定されていたとしても,アクセスは行えない。

ケーパビリティによりプロセスの動作を制限

図2●Linuxケーパビリティの概念
 プロセスに対する動作権限の設定は,「Linuxケーパビリティ」という仕組みを利用して行う。Linuxケーパビリティは,root権限(管理者権限)をより細かな複数の権限に分割し,各権限を個別に付与できるようにする仕組みである(図2[拡大表示])。UNIX系OS用に定義された「POSIXケーパビリティ」をLinuxに実装したものだ。

 Linuxを含むUNIX系OSでは基本的に,「ユーザーやプロセスの権限についてはroot権限と一般ユーザー権限の2種類しか用意されていないにもかかわらず,root権限にすべての権限が集中していること」がセキュリティ上の弱点だった(連載第1回参照)。この弱点を解消するために,root権限を小分けして一般ユーザー権限に与える仕組みが考え出された。それがPOSIXケーパビリティである。Linuxでは,カーネル2.4から実装された。そのため,現時点で提供されているLinuxディストリビューションのほとんどは,Linuxケーパビリティをサポートする。

 Linuxを導入したシステムにどのようなケーパビリティ(細分化された,個別の権限)が用意されているかは,/usr/include/linux/capability.hファイルに記載されている。通常のLinuxでは,29個のケーパビリティが用意されている。ケーパビリティの一例を表2に示す。

表2●通常のLinuxでサポートされているケーパビリティの例

項目名 内容
CAP_CHOWN ファイルのUIDとGIDを任意に変更することを許可する
CAP_NET_BIND_SERVICE 1024番以下のポート番号への割り当てを許可する
CAP_SYS_BOOT rebootの実行を許可する
CAP_SYS_CHROOT chrootの実行を許可する
CAP_SYS_MODULE カーネル・モジュールを追加/削除することを許可する

LIDSにおけるLinuxケーパビリティの強化点

 LIDSはこのLinuxケーパビリティを利用して,プロセスの動作権限を制御する。ただし,LIDSにおけるLinuxケーパビリティは次の2点が強化されている。

(1)ケーパビリティの種類

 通常のLinuxでは29個のケーパビリティが用意されているが,LIDSではさらに3個のケーパビリティが追加されている(表3)。

表3●LIDSで追加されたケーパビリティ

項目名 内容
CAP_HIDDEN psコマンドなどの実行時に/procからプロセスを隠せるようにする
CAP_PROTECTED killシグナルからプロセスを保護する
CAP_KILL_PROTECTED 保護されているプログラムへのkillシグナルの送信を許可する

(2)ケーパビリティの設定方法

 通常のLinuxでは,あらかじめシステムに設定されたデフォルトのケーパビリティ(これを「ケーパビリティ・バウンディング・セット」という)から,特定のケーパビリティを無効にすることで,プロセスごとのケーパビリティを設定できる。ケーパビリティ・バウンディング・セットに新たなケーパビリティを追加してプロセスごとのケーパビリティを設定することはできない。また,プロセスごとのケーパビリティの設定には,プロセスIDを用いる必要がある。

 一方,LIDSでは,ケーパビリティ・バウンディング・セットに新たなケーパビリティを追加しながら,プロセスごとのケーパビリティを設定できる。そのため,ケーパビリティ・バウンディング・セットを少なめに設定しておき,さらなる権限が必要なプロセスだけにケーパビリティを追加していけるので,不必要な権限を与えてしまう可能性を少なくできる。またLIDSでは,設定時にプロセスIDを意識しなくてよいので,より簡単に設定が行える。

 次回は,LIDSを組み込んだシステムの状態遷移について説明する予定である。


著者紹介
面 和毅(おも かずき)氏
学生時代よりUNIXに親しむ。1997年からサーバー構築およびセキュリティ全般を扱う仕事に従事,Linuxを使い始める。現在はLIDSの普及活動に注力。SELinuxコミュニティ内でのLIDS支部の立ち上げや,LIDS関連文書の日本語化,LIDSを用いたシステム構築の紹介などを行っている。