LIDS Part2

面 和毅

LIDS Part2



LIDS の起動

前回にパッチを当てて作成したカーネルで立ち上げるて、LIDS が有効に なった状態を簡単に見てみました。 LIDS が有効になると、設定ファイルなどの変更が(ACL にもよりますが)出来な くなります。 LIDS のカーネルで起動した後に、設定を変更したい場合には、後で述べるLFS を使用するか、(面倒ですが)再起動して、lilo プロンプトなどで

 lilo: linux security=0
のオプションを付けて起動してください。



LIDSの設定ファイル

LIDSとlidstoolsをインストールすると、以下の4つのファイルができます。
/etc/lids/lids.cap LIDS の権限ファイル
/etc/lids/lids.conf LIDS ACLの設定ファイル
/etc/lids/lids.pw LIDS パスワードファイル(LFS用)
/etc/lids/lids.net LIDS でネットワーク通知を行う場合の設定ファイル
これらのファイルがある/etc/lids ディレクトリは、LIDS によって保護されて いて、DENY の設定になっています。つまり、root ユーザーからも見えないわけ ですので、root 権限を乗っ取られても安全になっています。

ただし、最初に''lidsconf -P'' コマンドでlids.pwファイルを作成しておかない と、LIDS の設定変更を行うときに、再起動が必要になってしまいます。



lids.cap

LIDS のケーパビリティについて記述されているファイルです。

-0:CAP_CHOWN
-1:CAP_DAC_OVERRIDE
-2:CAP_DAC_READ_SEARCH
-3:CAP_FOWNER
-4:CAP_FSETID
-5:CAP_KILL
-6:CAP_SETGID
-7:CAP_SETUID
-8:CAP_SETPCAP
-9:CAP_LINUX_IMMUTABLE
-10:CAP_NET_BIND_SERVICE
-11:CAP_NET_BROADCAST
-12:CAP_NET_ADMIN
-13:CAP_NET_RAW
-14:CAP_IPC_LOCK
-15:CAP_IPC_OWNER
-16:CAP_SYS_MODULE
-17:CAP_SYS_RAWIO
-18:CAP_SYS_CHROOT
-19:CAP_SYS_PTRACE
-20:CAP_SYS_PACCT
-21:CAP_SYS_ADMIN
-22:CAP_SYS_BOOT
-23:CAP_SYS_NICE
-24:CAP_SYS_RESOURCE
-25:CAP_SYS_TIME
-26:CAP_SYS_TTY_CONFIG
-27:CAP_MKNOD
-28:CAP_LEASE
-29:CAP_HIDDEN
-30:CAP_INIT_KILL
カーネルを封印した後の、システムが持っているケーパビリティが記述されてい ます。頭に"-"が付いているものは、そのケーパビリティが無効になっていると 言うことを意味しています。
lidstools をインストールした直後では、全てのケーパビリティが無効になって います。 特に必要でない限り、全てのケーパビリティを無効にしておいて、必要なプログ ラムに対してのみケーパビリティを与えて行くと言う方が良いので、このファイ ルを編集することはないと思います。

注意

lidstools-0.5.1 では、バグがあって、既にObsolete になっている

-30:CAP_INIT_KILL
がlids.cap に設定されてしまっています。そこで、ここの箇所を

-30:CAP_KILL_PROTECTED
-31:CAP_PROTECTED
にvi などで変更してください。 変更後には、LIDS に設定ファイルをリロードさせる必要があります。



lids.conf

LIDS ACL の設定ファイルです。

#
# 	This file is auto generated by lidsconf 
#	Please do not modify this file by hand
#
0:0::1:0:279073:769:/sbin:0-0
0:0::1:0:459697:769:/bin:0-0
0:0::1:0:623857:769:/boot:0-0
0:0::1:0:459698:769:/lib:0-0
0:0::1:0:295489:769:/usr:0-0
0:0::1:0:213409:769:/etc:0-0
0:0::0:0:757129:769:/etc/lids:0-0
0:0::0:0:214110:769:/etc/shadow:0-0
0:0::3:0:328374:769:/var/log:0-0
0:0::7:0:330098:769:/var/log/wtmp:0-0
459811:769:/bin/login:1:0:214110:769:/etc/shadow:0-0
459841:769:/bin/su:1:0:214110:769:/etc/shadow:0-0
459811:769:/bin/login:7:0:328375:769:/var/log/lastlog:0-0
705903:769:/etc/rc.d/rc:16:-1:-1:30:CAP_KILL_PROTECTED:0-0
705903:769:/etc/rc.d/rc:16:-1:-1:12:CAP_NET_ADMIN:0-0
705903:769:/etc/rc.d/rc:16:-1:-1:21:CAP_SYS_ADMIN:0-0
903043:769:/etc/rc.d/init.d/halt:16:-1:-1:30:CAP_KILL_PROTECTED:0-0
903043:769:/etc/rc.d/init.d/halt:16:-1:-1:21:CAP_SYS_ADMIN:0-0
903043:769:/etc/rc.d/init.d/halt:16:-1:-1:17:CAP_SYS_RAWIO:0-0
903043:769:/etc/rc.d/init.d/halt:16:-1:-1:12:CAP_NET_ADMIN:0-0
35648:769:/usr/sbin/sshd:1:0:214110:769:/etc/shadow:0-0
0:0::1:0:508953:769:/root:0-0
35648:769:/usr/sbin/sshd:16:0:22-22:10:CAP_NET_BIND_SERVICE:0-0
145448:770:/usr/X11R6/bin/XF86_SVGA:16:0:-1:17:CAP_SYS_RAWIO:0-0
395220:769:/usr/bin/ssh:16:0:0-1024:10:CAP_NET_BIND_SERVICE:0-0
このファイルは、直接読むとわかりにくいですが
395220:769:/usr/bin/ssh:16:0:0-1024:10:CAP_NET_BIND_SERVICE:0-0
上記で、
395220 inode 番号
769 デバイス番号。後述
/usr/bin/ssh Subect(制限されたオブジェクトにアクセスするプログラム。後述)
0-0 時間制限。これは、時間制限されてないことを意味する。後述
CAP_NET_BIND_SERVICE これは、プログラムに与えられた権限。後述
となっています。

デバイス番号は、メジャー番号とマイナー番号の組合せになっています。例えば

769 = 00000011 00000001
ですから、上記は
メジャー番号 = 3
マイナー番号 = 1
の意味です。私のPCでは、
brw-rw----    1 root     disk       3,   1 May  6  1998 /dev/hda1
ですから、これは/dev/hda1を表しています。

このファイルも、直接編集しないで下さい。



lids.pw

LFS(LIDS Free Session) になるときに必要なパスワードファイルです。RipeMD-160 で暗号化されたパスワードが書きこまれています。



lids.net

カーネル設定時に を選ぶと、メールを使っててセキュリティアラートを送ることが可能になり ます。/etc/lids/lids.net で、メール送信の際のパラメータを設定します。

MAIL_SWITCH= 1                   ##alert を送る機能をON にしている
MAIL_RELAY=172.16.1.2:25         ##SMTP サーバーとポート番号
MAIL_SOURCE=lids.honto.info      ##source machine。ehloの時に使用する
MAIL_FROM= LIDS_ALERT@honto.info ##メールのFrom
MAIL_TO= omok@honto.info         ##メールの送り先
MAIL_SUBJECT= LIDS ALert         ##メールのタイトル

上記は、自分の環境のところの例です。ただし、この機能ではwarning などのプラ イオリティによってメールを送るなど、細かな設定が出来ないので、 LIDS の機能を使ってメールを送るよりも、logcheck などで設定されたほうが良いと思います。


LFS(LIDS Free Session)

LIDS が有効になっているカーネルで起動しているときには、前述したとおり、 /etc/lids ディレクトリが見えなくなってしまっています。しかし、 LIDS を初期導入しているときや、保護のオプションをためして微調整 したいときなどに、いちいちLIDS を無効にした状態で再起動するので は、手間が掛かってしまいます。

そのようなときには、LIDS Free Session (LFS) を使用することにより、LIDS が有効なカーネルでも、LIDS の設定が可能になります。LFS とは、 LIDS の制限が無いセッションです。LFS を開始するには、lidsadm コ マンドを用いて

lidsadm -S -- -LIDS

と入力します。

--enter password:
パスワードを聞いてくるので、lidstoolsをインストールした際に入力した(あるいは、手動でlidsconf -P コマ ンドを用いて設定した)パスワードを入力します。 このLFS を使うには、LIDS パッチを当てたカーネルの設定で

CONFIG_LIDS_ALLOW_SWITCH
を選んでおく必要があります。このLFS を使わなければ、LIDS をオフに するためにシステムを再起動する必要があるので、当然このオプションを使わな い方がシステムのセキュリティは上がります。システムの最終調整が終わった後 は、LFS を無効にしておいた方が安全でしょう。



カーネルの封印

Linux では、LKM(Loadable Kernel Module) など、カーネルを動的に変更する機能を使用することができま す。例として、Linux のiptables でファイアーウォールを作るときに、LKM を使用して様々な機能を動的に組み込んでおけるようにしておくと、拡張性に優 れたシステムになります。 しかし、LKM はまた、セキュリティ上で好ましくない状態ももたらします。LKM を用いたrootkitの存在なども指摘されています(下記参照)。

heroin http://www.securityfocus.com/archive/1/7758/1997-10-05/1997-10-11/0
adore http://www.team-teso.net/releases/adore-0.42.tgz
これらは、LKM を用いてファイル自身やプロセスを隠してしまい、管理者から見 付けにくくするものです。LKM はカーネル空間で動いているため、ユーザーから は何が起きているのかを見ることができません。

(詳しくは、下記を参照してください: http://www.atmarkit.co.jp/fsecurity/rensai/rootkit04/rootkit02.html)

したがって、不用意にLKM オプションを選択しないほうが、セキュリティ上では 好ましいことになります。

LIDS を用いることによって、この種のrootkit の侵入を防ぐことがで きます。LIDS では、``lidsadm -I'' コマンドを用いてカーネルモジュールを Load/Unloadすることができないようにすることができます。このことをカーネルの''封印''と呼びます。

カーネルを封印した後は、LKM は動いているカーネルにモジュールを加えたり、 外したりすることが出来なくなります。これにより、封印後のrootkit の読み込 みを防ぐことができます。

しかし、実際にはサーバーを起動するときにNIC やSCSI カード、ppp などをモ ジュールとして組み込みたい場合があると思います。そのため、サーバー起動後 の全てのモジュールが読み込まれた後にカーネルを封印するため、/etc/rcX.d/ 以下に封印のためのスクリプトを記述し、最後に起動するように設定する必要が あります。

起動から、カーネル封印までの流れは、図1になります。

図 1: Linuxの起動から、カーネル封印を経てログインまでの流れ
\includegraphics[width=12cm,clip]{/home/omok/doc/lids_part2/LKM_lids.ps}

具体的には、/etc/rc2.d/S99sealingとして

#!/bin/sh

case "$1" in 
	start) /sbin/lidsadm -I ;;
	stop)  ;;
	*)	echo "Usage: $0 start" >&2; exit 1 ;;
esac
exit 0;
としておけば良いでしょう。

また、カーネルを封印すると、その後のシステムのケーパビリティが /etc/lids/lids.cap ファイルに記述されているグローバルなケーパビリティに セットされます。これにより、カーネル封印後に起動されるプログラムに関して は、特に権限を有効/無効にしない限り、グローバルなケーパビリティ(つまり、 /etc/lids/lids.cap) が付加されることになります。 特に変更していない限り、/etc/lids/lids.cap ファイルでは全てのケーパビリ ティが無効にされているため、カーネル封印後に起動されるプログラムは、ケーパビリティを持っていません。



LIDS の管理および設定コマンド



lidsadm について

LIDS を有効にして起動した後に、LIDS を管理するためにlidsadm コマンドを使 用します。このコマンドで、LIDS を有効・無効にしたり、カーネルを封印した り、LIDS の状態を見ることができます。

``lidsadm -h'' で使用方法を見てみましょう。

lidsadm version 0.5.1 for LIDS project
       Huagang Xie 
       Philippe Biondi 

Usage: lidsadm -[S|I] -- [+|-][LIDS_FLAG] [...]
       lidsadm -V
       lidsadm -h

Commands:
       -S  To submit a password to switch some protections
       -I  To switch some protections without submitting password (sealing time)
       -V  To view current LIDS state (caps/flags)
       -v  To show the version
       -h  To list this help 

Available capabilities:
           CAP_CHOWN chown(2)/chgrp(2)
    CAP_DAC_OVERRIDE DAC access
 CAP_DAC_READ_SEARCH DAC read
          CAP_FOWNER owner ID not equal user ID
          CAP_FSETID effective user ID not equal owner ID
            CAP_KILL real/effective ID not equal process ID
          CAP_SETGID set*gid(2)
          CAP_SETUID set*uid(2)
         CAP_SETPCAP transfer capability
 CAP_LINUX_IMMUTABLE immutable and append file attributes
CAP_NET_BIND_SERVICE binding to ports below 1024
   CAP_NET_BROADCAST broadcasting/listening to multicast
       CAP_NET_ADMIN interface/firewall/routing changes
         CAP_NET_RAW raw sockets
        CAP_IPC_LOCK locking of shared memory segments
       CAP_IPC_OWNER IPC ownership checks
      CAP_SYS_MODULE insertion and removal of kernel modules
       CAP_SYS_RAWIO ioperm(2)/iopl(2) access
      CAP_SYS_CHROOT chroot(2)
      CAP_SYS_PTRACE ptrace(2)
       CAP_SYS_PACCT configuration of process accounting
       CAP_SYS_ADMIN tons of admin stuff
        CAP_SYS_BOOT reboot(2)
        CAP_SYS_NICE nice(2)
    CAP_SYS_RESOURCE setting resource limits
        CAP_SYS_TIME setting system time
  CAP_SYS_TTY_CONFIG tty configuration
           CAP_MKNOD mknod operation
           CAP_LEASE taking leases on files
          CAP_HIDDEN hidden process
  CAP_KILL_PROTECTED kill protected programs
       CAP_PROTECTED Protect the process from signals

Available flags:
                LIDS de-/activate LIDS locally (the shell & childs)
         LIDS_GLOBAL de-/activate LIDS entirely
         RELOAD_CONF reload config. file and inode/dev of protected programs
            POSTBOOT de-/activate LIDS learning mode
            SHUTDOWN de-/activate LIDS learning mode
       ACL_DISCOVERY de-/activate LIDS learning mode
コマンドの使用方法は、下記になります。
lidsadm -S 保護機能のいくつかを解除・ロックするときに使用。パスワード が必要
lidsadm -I カーネルを封印するときに使用するコマンド。パスワードは、必 要無し
lidsadm -V LIDS の状態(ケーパビリティや、フラグ)を見るコマンド
lidsadm -v lidstools のバージョンを表示する
ケーパビリティについては、後述します。

lidsconf について

lidsconf を使って、実際のLIDS の管理とLIDSのアクセス制御リスト(ACL)の設 定をします。古いバージョ ンのLIDS では、lidsconf コマンドの役割がlidsadm コマンドに含まれていましたが、 現在は、lidsconf コマンドとして独立しています。

``lidsconf -h'' で使用方法を見てみましょう。

lidsconf version 0.5.1 for the LIDS project
       Huagang Xie 
       Philippe Biondi 

Usage: lidsconf -A [acl_type] [-s subject] -o object [-d] [-t from-to] [-i level] -j ACTION
       lidsconf -D [acl_type] [-s file] [-o file] 
       lidsconf -Z [acl_type]
       lidsconf -U
       lidsconf -L [acl_type] [-e]
       lidsconf -P
       lidsconf -v
       lidsconf -[h|H]

Commands:
       -A,--add	To add an entry
       -D,--delete	To delete an entry
       -Z,--zero	To delete all entries 
       -U,--update	To update dev/inode numbers
       -L,--list	To list all entries 
       -P,--passwd	To encrypt a password with RipeMD-160
       -v,--version	To show the version
       -h,--help	To list this help 
       -H,--morehelp	To list this help with CAP/SOCKET name

subject: -s,--subject subj
       can be any program, must be a file
object: -o,--object [obj]
       can be a file, directory or Capability, Socket Name
ACTION: -j,--jump
       DENY     deny access
       READONLY read only
       APPEND   append only
       WRITE    writable
       GRANT    grant capability to subject
       IGNORE   ignore any permissions set on this object
       DISABLE  disable some extersion feature
OPTION:
      -d,--domain	The object is an EXEC Domain
      -i,--inheritance Inheritance level
      -t,--time	Time dependency
      -e,--extended	Extended list
lidsconf コマンドの使用方法は、以下のようになります。

lidsconf -A ACL のエントリに新たに書き加える
lidsconf -D ACL のエントリから削除する
lidsconf -Z ACL のエントリを全て削除する
lidsconf -U /etc/lids/lids.conf のinode テーブルを更新する。
シ ステムのファイルを変更したときに、inode が変わった場合に必要になる
lidsconf -L 現在のACL のエントリを表示する
lidsconf -P LFS(LIDS Free Session) 用のパスワードを設定する
lidsconf -v lidstool のバージョンを表示する
lidsconf -h help の表示
lidsconf -H help と一緒にSOCKET・CAP の名前も表示する
lidsconf コマンドで権限を設定するときは、LIDS が無効になっているか、LFS になっている必要があります。

以下、LFS 状態の時のプロンプトは、わかりやすいように''lfs#''で示します。


LIDS ACLの表示

LIDS はACL を/etc/lids/lids.confファイルに保存します。しかし、 こ のファイルは、そのままでは少し読みにくいです。 現 在のACL を表示したい場合には、lidsconf -L コマンドを使用します

lfs# lidsconf -L

LIST
                Subject   ACCESS  inherit time        Object
----------------------------------------------------------------------------
               Any file  READONLY:  0  0000-0000                 /sbin 0
               Any file  READONLY:  0  0000-0000                  /bin 0
               Any file  READONLY:  0  0000-0000                 /boot 0
               Any file  READONLY:  0  0000-0000                  /lib 0
               Any file  READONLY:  0  0000-0000                  /usr 0
               Any file  READONLY:  0  0000-0000                  /etc 0
               Any file      DENY:  0  0000-0000             /etc/lids 0
               Any file      DENY:  0  0000-0000           /etc/shadow 0
               Any file    APPEND:  0  0000-0000              /var/log 0
               Any file     WRITE:  0  0000-0000         /var/log/wtmp 0
             /bin/login  READONLY:  0  0000-0000           /etc/shadow 0
                /bin/su  READONLY:  0  0000-0000           /etc/shadow 0
             /bin/login     WRITE:  0  0000-0000      /var/log/lastlog 0
           /etc/rc.d/rc     GRANT: -1  0000-0000         CAP_KILL_PROTECTED 0
           /etc/rc.d/rc     GRANT: -1  0000-0000         CAP_NET_ADMIN 0
           /etc/rc.d/rc     GRANT: -1  0000-0000         CAP_SYS_ADMIN 0
  /etc/rc.d/init.d/halt     GRANT: -1  0000-0000         CAP_KILL_PROTECTED 0
  /etc/rc.d/init.d/halt     GRANT: -1  0000-0000         CAP_SYS_ADMIN 0
  /etc/rc.d/init.d/halt     GRANT: -1  0000-0000         CAP_SYS_RAWIO 0
  /etc/rc.d/init.d/halt     GRANT: -1  0000-0000         CAP_NET_ADMIN 0
         /usr/sbin/sshd  READONLY:  0  0000-0000           /etc/shadow 0
               Any file  READONLY:  0  0000-0000                 /root 0
         /usr/sbin/sshd     GRANT:  0  0000-0000  CAP_NET_BIND_SERVICE 22-220
/usr/X11R6/bin/XF86_SVGA     GRANT:  0  0000-0000         CAP_SYS_RAWIO 0
           /usr/bin/ssh     GRANT:  0  0000-0000  CAP_NET_BIND_SERVICE 0-10240

上記の意味は、それぞれ

Subject 制限されたオブジェクトにアクセスしようとする、プログラム
ACCESS 与えられた権限
inherit ケーパビリティの継承設定。-1はunlimited(無制限)。詳細は後述。
time ACL の時間設定。特定の時間にACL を有効にする。cron を動かすと きなどに使用。詳細は後述。
Object ACL によって規定されるファイルやケーパビリティ


LIDS ACL について

LIDS ACLには、

の二つがあります。

また、ACL を設定するときには、前章で述べたとおり二つの要素

があります。

例1

lfs# lidsconf -A -o /var/log/messages APPEND

上の例では、/var/log/messages というファイルにたいして、読み取りと追加がで きるようにしています。

例2

lfs# lidsconf -A -s /usr/sbin/httpd -o CAP_NET_BIND_SERVICE -j GRANT

上の例では、Apache のプロセス(httpd )に、 CAP_NET_BIND_SERVICE のケーパビリティをあ たえています。

これらの書式は、ipchains/iptables の設定になれている人であれば、書式が似 ているので理解しやすいと思います。


LIDS 設定ファイルの再読み込み

/etc/lids 以下にあるLIDS の設定ファイルは、基本的に起動時にのみ読み込ま れます。``lidsconf'' でACL を追加/削除しても、稼働中のシステム上には反映 されません。しかし、追加のACL がきちんと動くかどうかを確認したいことがあ ると思います。その時には、現在動いているカーネルに設定ファイルを再読み込 みさせることが可能です。

lfs# lidsadm -S -- +RELOAD_CONF

ただし、このオプションを使うためにはLIDS カーネルをコンパイルするときに

が選択されている必要があります。しかし、このオプションを選ぶと、LIDS が 稼働中に設定を再読み込みさせることが可能になるため、セキュリティの強度は、 やや弱くなります。

システムに最適な設定を試している間のみ、このオプションを有効にしておき、 本番稼働するときには無効にしたカーネルを使用することを、お薦めします。



次回予告

以上で、今回は終りです。次回は、ファイルの制限と、ケーパビリティについて説明します。



Kazuki Omo 平成15年12月24日