前回は,LIDSを組み込んだシステムでは,(1)ファイルに対するアクセス権限と(2)プロセスに対する動作権限(Linuxケーパビリティ)を,「アクセス制御リスト(以下,ACL)」を用いて設定することを説明した。今回は,ACLに基づいた権限制御をさらに詳しく解説する。

「システム起動時」「稼働時」「停止時」それぞれのACLを定義できる

図1●ステートフルACLの概念
「起動時」「稼働時」「停止時」それぞれにACLを定義できる
 カーネル2.6用に開発・提供されているLIDS 2系列では,システムが起動してから停止するまでを3つの状態(ステート)に分け,ステートごとにACLの設定が行える(図1[拡大表示])。これが連載第1回で述べた「ステートフルACL」である。

 具体的には,システムが起動中の「BOOTステート」,稼働中の「POSTBOOTステート」,停止中の「SHUTDOWNステート」ごとにACLの設定が行える。LIDS 1系列ではシステムに対して1つのACLだけしか設定できなかったのと比較すると,LIDS 2系列ではシステムの動作状態に適したACLを柔軟に設定できるようになった。

  • BOOTステート

     システムが起動した後,カーネルが封印(後述)されるまでの状態。このステートのACLを比較的緩く設定しておくことにより,デバイス・ドライバの組み込みやシステムで提供するサービスの起動が簡単に行える。

  • POSTBOOTステート

     システムが稼働中の状態である。POSTBOOTステートで,デフォルトのケーパビリティ(ケーパビリティ・バウンディング・セット)が有効になる。そのため,POSTBOOTステートで起動するプロセスに関しては,動作に必要なケーパビリティをきちんと設定しておく必要がある。

  • SHUTDOWNステート

     システムをシャットダウンするときの状態。SHUTDOWNステートに移行してはじめて,システムを安全に停止できる。ACLの設定を緩く設定しておくことにより,設定の保存やプロセスの停止,ディスクのアンマウント(umount)といったシステム停止時の処理が正しく行えるわけだ。

     先に述べたように,ステートフルACLの機能はLIDS 2系列から取り込まれたものだ。LIDS 1系列ではこの機能はなく,すべての状態で1つのACLだけしか設定できなかった。そのため,システムの稼働状態(LIDS 2系列でのPOSTBOOT状態)に合わせてACLを厳しく設定すると,システムの起動時にプロセスを立ち上げられなかったり,終了時にプロセスを正常に停止できなかったりした。ステートフルACLにより,この問題を解消できる。

    カーネルを封印してrootkitの侵入を防ぐ

     「LIDSを組み込んだLinuxでは,(カーネル保護機能により)カーネル・モジュールの組み込みを不可能にできる」と連載第1回に説明した。この機能は,POSTBOOTステートで使われる。ここで詳しく説明しておく。

     LIDSでは,特定のコマンドを実行することにより,カーネルに対するモジュールの組み込みと取り外しを禁止できる。禁止することを,「封をしてカギを掛ける」ことになぞらえて,カーネルの“封印(sealing)”と呼ぶ。封印以後は,モジュールの組み込みができないため,カーネル・モジュールを装ったrootkitの侵入などが防げるわけだ。

     カーネルの封印は,システム起動時(BOOTステート)の処理の一番最後に行う。システムの起動時には,カーネルがさまざまなドライバやモジュールを読み込む必要がある。こうした処理が終了してから,システム管理者がログインして手動でカーネルを封印するか,/etc/rcX.dディレクトリにスクリプトを作成して自動的にカーネルを封印する。

    再起動しないとACLの設定は変更できない

    写真1●GRUBのブート画面
    写真2●GRUBの起動画面でeキーを押して表示される画面
    写真3●さらにeキーを押して表示された画面
    「root=LABEL=/ 」に続けて「lids=0」と入力する。するとLIDSを無効にしてシステムを起動できる
     LIDSではACLが大きな役割を担う。アクセス制御はACLに基づいて行われるため,悪意を持った第三者にACLを書き換えられてしまったら,システムは無防備状態になる。そのため,LIDSを組み込んだシステムでは通常,ACLの設定は変更できない。

     それでは,どのようにしてACLを設定するのかというと,いったんシステムを再起動させてLIDSを無効にしてから行うのである。LIDSを無効にするには,システムの起動時に“lids=0”というオプションを指定する。

     例えば,ブート・ローダーにLILOを使用している場合には,

    LILO: linux lids=0

    と入力することにより,LIDSを無効にした状態でシステムを起動できる。

     GNU GRUBを使用している場合には,GRUBの起動画面(写真1[拡大表示])でeキーを押してオプションの画面(写真2[拡大表示])を表示し,さらにeキーを押して表示された画面(写真3[拡大表示])にて「lids=0」を入力することで,LIDSを無効にしてシステムを起動できる。

    「LIDS Free Session」を使えば再起動なしでACLを調整できる

     しかしながら,ACLを変更するごとにシステムを再起動しなければならないのは大変不便である。そのため,再起動なしでACLを設定できる「LIDS Free Session(以下,LFS)」が用意されている。ACLを微調整するときなどには便利な機能だが,その分慎重に利用しよう。

     LFSは,LIDSによるアクセス制御を全く受けないターミナル・セッション(コンソール)のことである。システム管理者はLFSを使えば,いつでもACLを設定できる。

     LFSを使用するためには,LIDSを組み込んだカーネルの設定項目のなかにある「LIDS Free Session」を選択してカーネルをコンパイルしておく必要がある(デフォルトでは選択されている)。この際には,後述するように,リモート・アクセスではLFSを使えないように設定しておいた方が良い。

     LFSの利用例は次の通りだ。例えば,あるプログラムが(LIDSを組み込んだシステムで)起動するようにACLを設定する手順を示す。

    (1)LFSを開く
    (2)LFSでACLを更新する
    (3)LFSを閉じる
    (4)システムでプログラムを起動し,動作を確認する
    (5)プログラムがきちんと動かない場合には(1)に戻る

     LFSを開くときには,LFS専用のパスワードの入力が必要である。このパスワードは,LIDSをインストールときに設定する。ただし,パスワードを忘れてしまったときには,再設定できる。

     LFSは便利なものの,root権限の取得者にパスワードが漏れると,システムのACLを変更されてしまう危険がある。そのため,システムを調整しているときのみにLFSを有効にしたカーネルを使用し,安定稼動後にはLFSを無効にしたカーネルを用いた方がよい。LFSを無効にするときにもカーネルの再コンパイルが必要である。そのため,LFSを有効にしたカーネルと無効にしたカーネルの両方を作成しておき,使い分けることを推奨する。

     次回(6月22日)は,Fedora Core 2にLIDSをインストールする方法を紹介する予定である。


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