LIDS Part1

面 和毅

LIDS Part1



LIDS

Linux/Unix では、rootアカウントに権限が全て集中しています。これにより、 BufferOverfolowなどによりroot権限で悪意のプログラムなどを動作させられて しまうとシステム全体が危険に晒されてしまう恐れがあります。

これに対する解の一つとして、LIDS(Linux Intruder Detection System)が作ら れました。これは、Kernelにパッチをあてる事により、rootアカウントにも制限 を掛けて、必要なプログラムのみが必要なファイルを操作できるようにするものです。

LIDSを有効にしたカーネルで起動する事により、以下のような機能が使用できます。

  1. ポートスキャンの検出。これは、カーネルコンパイル時に指定するオプションですが、これを指定する事により、nmapなどからのポートスキャンをsyslogに残す事が出来ます。
  2. ファイルアクセス制限。各ファイルやディレクトリに対して、read/write/append/denyの制限を設ける事が出来ます。
  3. プロセス毎に出来る事の制限。これにより、「/usr/local/bin/httpdは、Port80のみをネットワークで使用できる」などの制限が出来ます。
  4. LKM(LinuxKernelModule)の読み込み制限。NICドライバや、ディスク、ファ イルシステムなどのモジュール読み込みを、カーネルを封印(seal)してし まう事により、不可能にすることが出来ます。これにより、Kernelモジュールとしてロードされてしまうタイプのトロイの木馬を防ぐ事が出来ます。

LIDSの機能の中で、ファイルアクセス制限は、カーネル起動後すぐに有効になり ます。



LIDS の起動

LIDS のパッチを当てて作成したカーネルで立ち上げると、自動的にLIDS が有効に なります。プロセス毎の制限や、LKM の読み込み制限は、カーネルを封印(seal)する ことにより、有効になりますが、起動した時点では、カーネルは封印されていま せん。 LIDS が有効になると、設定ファイルなどの変更が(ACL にもよりますが)出来な くなります。 LIDS のカーネルで起動した後に、設定を変更したい場合には、後で述べるLFS を使用するか、lilo プロンプトなどで

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



LIDS のインストール

LIDS のパッチ及びツールは、

http://www.lids.org

からダウンロードできます。現在の最新カーネル2.4.24に対応している物はまだ ありませんが、カーネル2.4.23 に対応しているものが

http://www.roedie.nl/downloads/lids/lids-2.4/linux-2.4.23-lids-1.1.2.patch.bz2
からダウンロード出来ます。こちらを2.4.24 に適用することが出来ます。

また、lids の設定のために、lidstoolsをダウンロードしてあげる必要があります。 最新のものが

http://www.lids.org/download/lidstools/lidstools-0.5.1.tar.gz

からダウンロードできます。

[hoge@localhost hoge]$ cd work/lids
[hoge@localhost hoge]$ tar -xvzf ../src/lids/lidstools-0.5.1.tar.gz
[hoge@localhost lids]$ ls
lidstools-0.5.1
[hoge@localhost lids]$ cd lidstools-0.5.1/
[hoge@localhost lidstools-0.5.1]$ ls
acl_discovery  config.h.in    CREDITS     Makefile       README
aclocal.m4     config.log     depcomp     Makefile.am    src
AUTHORS        config.status  doc         Makefile.in    stamp-h1
ChangeLog      configure      example     missing
compile        configure.ac   INSTALL     mkinstalldirs
config.h       COPYING        install-sh  NEWS
[omok@svlog lidstools-0.5.1]$



kernelにパッチをあてる

lidstools はconfigure 時に、パッチが当たっていて、LIDS を選択しているカー ネルソース を要求するので、最初にカーネルにパッチをあてて、LIDS を選択し ておきます。

patching file Documentation/Configure.help
patching file arch/alpha/config.in
patching file arch/alpha/defconfig
patching file arch/arm/defconfig
patching file arch/cris/defconfig
patching file arch/i386/config.in
patching file arch/i386/defconfig
patching file arch/i386/kernel/ioport.c
patching file arch/i386/kernel/ptrace.c
patching file arch/i386/kernel/vm86.c
patching file arch/ia64/config.in
patching file arch/ia64/defconfig
patching file arch/m68k/defconfig
patching file arch/mips/config.in
patching file arch/mips64/config.in
patching file arch/mips64/defconfig
patching file arch/parisc/config.in
patching file arch/parisc/defconfig
patching file arch/ppc/config.in
patching file arch/ppc/defconfig
patching file arch/s390/config.in
patching file arch/s390/defconfig
patching file arch/s390x/defconfig
patching file arch/sh/config.in
patching file arch/sh/defconfig
patching file arch/sparc/config.in
patching file arch/sparc/defconfig
patching file arch/sparc64/config.in
patching file fs/buffer.c
patching file fs/dcache.c
patching file fs/exec.c
patching file fs/namei.c
patching file fs/namespace.c
patching file fs/open.c
patching file fs/proc/base.c
patching file fs/proc/root.c
patching file fs/quota.c
patching file fs/read_write.c
patching file fs/readdir.c
patching file fs/super.c
patching file include/linux/capability.h
patching file include/linux/lids.h
patching file include/linux/lidsext.h
patching file include/linux/lidsif.h
patching file include/linux/rmd160.h
patching file include/linux/sched.h
patching file include/linux/sysctl.h
patching file include/linux/tty.h
patching file init/main.c
patching file kernel/Config.in
patching file kernel/Makefile
patching file kernel/exit.c
patching file kernel/fork.c
patching file kernel/klids.c
patching file kernel/ksyms.c
patching file kernel/lids.c
patching file kernel/lids_logs.c
patching file kernel/lids_mail_script.c
patching file kernel/lids_net.c
patching file kernel/lids_syslog_script.c
patching file kernel/ptrace.c
patching file kernel/rmd160.c
patching file kernel/signal.c
patching file kernel/sys.c
patching file kernel/sysctl.c
patching file net/core/rtnetlink.c
patching file net/ipv4/Makefile
patching file net/ipv4/af_inet.c
patching file net/ipv4/lids_check_scan.c
patching file net/ipv4/netfilter/ip_queue.c
patching file net/ipv4/proc.c
patching file net/ipv4/tcp_ipv4.c
patching file net/ipv4/udp.c
patching file net/ipv6/af_inet6.c
patching file net/ipv6/netfilter/ip6_queue.c
patching file net/socket.c
/usr/src/linuxでmake menuconfigをしてみると、LIDSの項目が増えている事が分かります。
図 1: Linux Intruder Detection Systemの項目が追加されている。
\includegraphics[width=10cm,clip]{/home/omok/doc/lids_part1/LIDS1.ps}
LIDSの項目の中には、いろいろとオプションがあります。
図 2: Linux Intruder Detection System内のオプション。
\includegraphics[width=10cm,clip]{/home/omok/doc/lids_part1/LIDS2.ps} \includegraphics[width=10cm,clip]{/home/omok/doc/lids_part1/LIDS3.ps} \includegraphics[width=10cm,clip]{/home/omok/doc/lids_part1/LIDS4.ps}


kernel のオプション

CONFIG_LIDS_HANGUP ここで”yes”を選ぶと、プログラムがルール違反を起こすたびに、LIDSはプログラムがその時使用しているコンソールをハングアップしようとします。
 注意:もし、LIDS ACLがきちんとセットアップされていない状態で、この
    オプションを選んだ場合には、linuxのコンソールからロックアウト
    されてしまいます。
CONFIG_LIDS_SA_EXEC_UP ここで”yes”を選ぶと、LIDSが封印(lidsadm -I)される前に実行された保護されていないプログラムについて、セキュリティアラートを生成します。 これは、bootプロセスがセキュアかどうかをチェックするのを助けてくれます。 これはまた、もし弱点が利用されて保護されていないプログラムがbootプロセスに付け足された際に警告を出してくれます。
DONFIG_LIDS_NO_EXEC_UP このオプションにより、封印される前にLIDSは保護されていないプログラムを実行することを拒否します。不完全なlids.confでシステムを起動することを防止できる点に注意してください。
CONFIG_LIDS_INIT_CHILDREN_LOCK ここで”yes”を選ぶと、init children lock機能のために必要なコードがコンパイルされます。その後、lidsadmで
(+LOCK_INIT_CHILDREN)
を行って有効に出来ます。これはinitが親になっているkillプロセスや、起動している物に対してkillコマンドを発行した際に、それが誰からのものでも妨げます。 これは、どんなユーザーでもストップさせない(DOSとか)、あるいは、新しい設定ファイルを読み込ませた際にリロードさせない(restartや、kill -HUP)を意味します。 “yes”を選んで使うと、セキュリティが強化されます。
CONFIG_LIDS_NO_FLOOD_LOG ここで”yes”を選ぶと、LIDSは同じメッセージを同時にたくさん流すことを止めようとします。 “yes”を選ぶと、セキュリティが強化されます。
CONFIG_LIDS_FLOOD_EVENT_THRESHOLD これは、
     CONFIG_LIDS_FLOOD_EVENT_INTERVAL
で定義されている値のインターバルの間でログを取る、同じイベントの最大数です。 これは、他のケースと同様に、様々に異なる、"exec() before LIDS sealing"のアラート問題を補正するためのものです。
CONFIG_LIDS_FLOOD_EVENT_INTERVAL これは、LIDSログが同じイベントであふれてしまうかもしれないインターバルの値です。
CONFIG_LIDS_PORT_SCAN_DETECTOR ここで”yes”を選ぶと、LIDSはカーネルにポートスキャナー検知器を組み込みます。誰かがマシンにポートスキャンを掛けてきたときに、LIDSは必要なメッセージをログとしてレポートします。これは多くのポートスキャナー、nmap, satan, sscanや、その他の多くの 方法のハーフオープンスキャンを検知します。 LIDSによりrawソケットがdisableになっているとき(snifferのdisable)、これはユーザースペースのポートスキャナー検知器として、完全にソケットを使わないものとして置き換えることが出来ます。 “yes”を選ぶと、セキュリティが強化されます。
CONFIG_LIDS_TIMEOUT_AFTER_FLOOD これは、二つの異なるセキュリティアラートの間の最小間隔(秒)です。 セキュリティアラートが起きたあと、このタイムアウト時間を過ぎない限りアラートはログに残りません。(最初のアラートが、flood warningの場合を除きます)
CONFIG_LIDS_ALLOW_SWITCH ここで”yes”を選ぶと、LIDSをオンにしたりオフにしたり切り替えることが出来ます。(LFS)  注意:’lidsconf -P’でパスワードを設定する必要があります。 “no”を選ぶと、セキュリティが強化されます。
CONFIG_LIDS_RESTRICT_MODE_SWITCH このオプションを選択すると、指定されたターミナルタイプからのみのモード切替を許可します。
CONFIG_LIDS_MODE_SWITCH_CONSOLE Linux Consoleからのモード切替を許可します。
CONFIG_LIDS_MODE_SWITCH_SERIAL シリアルConsoleからのモード切替を許可します。
CONFIG_LIDS_MODE_SWITCH_PTY PTYからのモード切替を許可します。
CONFIG_LIDS_MAX_TRY ここで、モードを切り替えるときの、パスワードの試行回数を与えます。 少ないほうが、よりシステムをセキュアにします。
CONFIG_LIDS_TTW_FAIL ここで、モードを切り替えるときの、試行回数以上パスワードを失敗した後の待ち時間(秒)を指定します。 多いほうが、よりシステムをセキュアにします。
CONFIG_LIDS_REMOTE_SWITCH コンソールを通じてログオンしていないユーザーにLIDS のon/offの許可を与えたいときに、ここで”yes”を選びます。 もしコンソールへアクセスできるなら、このオプションをdisableにして、リモートユーザーがパスワードを知っていてもLIDSをoffに出来ないようにしておきたいでしょう。 “no”を選ぶと、セキュリティが強化されます。
CONFIG_LIDS_ALLOW_ANY_PROG_SWITCH ここで”yes”を選ぶと、/sbin/lidsadm以外のプログラムに、/proc/sys/lids/locksへのfeedを許可することになります。  注意:*このオプションは選択しないように強くお奨めします。Yesと答え     ないでください! * これがなんの役に立つかどうかは、わかりません。:) “no”を選びましょう。
CONFIG_LIDS_RELOAD_CONF ここで”yes”を選ぶと、configファイルを再読み込みする為に必要なコードをコンパイルします。lidsadmに
+RELOAD_CONF
を与えたときに、LIDSは/etc/lids.confを再読み込みし、特別なプログラム(/sbin/lidsadmと、設定によりLIDSが隠している全てのプログラム)のdev/inodeナンバーを再読み込みします。 再読み込み時にエラーが発生すると、エラーがすぐに表示され、すぐに直せるために、startup時にカーネルがパニックを起こさないように出来ます。
CONFIG_LIDS_SA_THROUGH_NET LIDSからセキュリティアラートをネットワークを通じて、カーネルからダイレクトに、ユーザースペースのプログラム(特に、メーラープログラム)を何も介さずにリモートマシンに送りたいときに、ここで”yes”を選んでください。 Mailで送信したり、UDPデーターグラムでリモートに死すログや、http POSTや、その他どんなものでも送ることが出来ます。 Expect風の擬似スクリプト言語が、コミュニケーションプロトコル(メールなど)の為に提供されています。 下記のものは、接続時に重要なパラメーターです。より詳しいhelpは、各々のhelpを見てください。 まず提供しなければいけないもの
  1. リモートマシンのIPアドレス
  2. TCP/UDPポートの接続
メーラースクリプトを選んだ場合には
  1. 送信元のマシン名
  2. 送信ユーザー名
  3. 受信先のメールアドレス
  4. メールのSubject
もし、自作のスクリプトを使う場合(或いは、リモートsyslogなどを提供する場合)
  1. ソケットタイプ(TCP/UDP)
  2. スクリプトのパス
CONFIG_LIDS_HIDE_KLIDS ここで”yes”を選ぶと、klidsカーネルスレッドは/procに現れません。(従ってpsやtopにも現れません)そして、ネットワークコネクションも、netstatには現れません。 その上、klidsネットワークエラー(接続できないなど)は、syslogに記録されずに捨てられます。
CONFIG_LIDS_NET_MAX_TRIES セキュリティアラートが、接続できないなど(ファイアーウォールのせいなど)、或いはプロトコルエラー(リモートのsendmailがメールを許可しないなど)の理由で送信できないときに何回再送信するかの回数です。この回数の試行後、たとえ送信されなかったとしても(幾つかの判らない理由(プロトコルエラーや、経路途中でのIPスタック欠損など)でメッセージが送信されずにキューに残っている場合)メッセージは削除されます。 もし全てのメッセージを残しておきたいのであれば、ここに大きな数字を入れて、適切なスリープ時間を与えましょう
CONFIG_LIDS_NET_TIMEOUT Klidsがセキュリティアラートの送信に失敗したとき、リトライまで何秒待つかを指定します。
CONFIG_LIDS_MSGQUEUE_SIZE セキュリティアラートは、メッセージキューに入れられます。新しいメッセージがキューに入るように、ここのメッセージサイズを入れます。 メーラー擬似スクリプトにあるサイズを使いましょう


該当する箇所の.configファイルを抜き出すと、

#
# Linux Intrusion Detection System
#
CONFIG_LIDS=y
CONFIG_LIDS_MAX_INODE=256
CONFIG_LIDS_MAX_SACL=256
CONFIG_LIDS_MAX_OACL=256
# CONFIG_LIDS_HANGUP is not set
CONFIG_LIDS_SA_EXEC_UP=y
# CONFIG_LIDS_NO_EXEC_UP is not set
CONFIG_LIDS_NO_FLOOD_LOG=y
CONFIG_LIDS_TIMEOUT_AFTER_FLOOD=60
CONFIG_LIDS_ALLOW_SWITCH=y
# CONFIG_LIDS_RESTRICT_MODE_SWITCH is not set
CONFIG_LIDS_MAX_TRY=3
CONFIG_LIDS_TTW_FAIL=3
# CONFIG_LIDS_ALLOW_ANY_PROG_SWITCH is not set
CONFIG_LIDS_RELOAD_CONF=y
CONFIG_LIDS_PORT_SCAN_DETECTOR=y
CONFIG_LIDS_SA_THROUGH_NET=y
# CONFIG_LIDS_HIDE_KLIDS is not set
CONFIG_LIDS_NET_MAX_TRIES=3
CONFIG_LIDS_NET_TIMEOUT=30
CONFIG_LIDS_MSGQUEUE_SIZE=16
CONFIG_LIDS_MAIL_SCRIPT=y
# CONFIG_LIDS_DEBUG is not set
となっています。以上のLIDSの箇所を選択したら、通常通り(私はrootでカーネルの作業を行います)
make dep
make clean
make bzImage
make modules 
make modules_install
で、カーネルとモジュールを作り直します。作成されたカーネルを
cp /usr/src/linux/arch/i386/boot/bzImage /boot/vmlinuz-2.4.24.lids
cp /usr/src/linux/System.map /boot/System.map-2.4.24.lids
ln -s /boot/System.map-2.4.24.lids /boot/System.map
vi /boot/grub/grub.conf (grubの場合)
などして、新しいカーネルをインストールします。



lidstoolsのコンパイル

次に、lidstoolsをコンパイルしてインストールしておきます。lidstools-0.5.1に移動して、configure, makeをし、suでrootになってmake installします。

[omok@localhost lidstools-0.5.1]$ ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for gawk... gawk
checking whether make sets ${MAKE}... yes
checking for gcc... gcc
checking for C compiler default output... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables... 
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for style of include used by make... GNU
checking dependency style of gcc... gcc
checking how to run the C preprocessor... gcc -E
checking for /usr/src/linux/include/linux/kernel.h... yes
checking for /usr/src/linux/kernel/fork.c... yes
checking for /usr/src/linux/include/linux/version.h... yes
checking for /usr/src/linux/include/asm/ptrace.h... yes
Getting Kernel Version
ok
ok
KERNEL is 2.4
checking for /usr/src/linux/kernel/lids.c... yes
checking for ANSI C header files... yes
checking for sys/types.h... yes
checking for sys/stat.h... yes
checking for stdlib.h... yes
checking for string.h... yes
checking for memory.h... yes
checking for strings.h... yes
checking for inttypes.h... yes
checking for stdint.h... yes
checking for unistd.h... yes
checking whether sys/types.h defines makedev... yes
checking fcntl.h usability... yes
checking fcntl.h presence... yes
checking for fcntl.h... yes
checking limits.h usability... yes
checking limits.h presence... yes
checking for limits.h... yes
checking for stdlib.h... (cached) yes
checking for string.h... (cached) yes
checking sys/file.h usability... yes
checking sys/file.h presence... yes
checking for sys/file.h... yes
checking termio.h usability... yes
checking termio.h presence... yes
checking for termio.h... yes
checking for unistd.h... (cached) yes
checking for gcc option to accept ANSI C... none needed
checking for an ANSI C-conforming const... yes
checking whether struct tm is in sys/time.h or time.h... time.h
checking for stdlib.h... (cached) yes
checking for working malloc... yes
checking whether time.h and sys/time.h may both be included... yes
checking sys/time.h usability... yes
checking sys/time.h presence... yes
checking for sys/time.h... yes
checking for unistd.h... (cached) yes
checking for alarm... yes
checking for working mktime... yes
checking return type of signal handlers... void
checking whether lstat dereferences a symlink specified with a trailing slash... yes
checking whether stat accepts an empty string... no
checking for memset... yes
checking for realpath... yes
checking for strchr... yes
checking for /etc/lids/lids.conf... yes
checking for /etc/lids/lids.cap... yes
checking for /etc/lids/lids.conf... (cached) yes
checking for /etc/lids/lids.cap... (cached) yes
checking for /etc/lids/lids.conf... (cached) yes
checking for /etc/lids/lids.cap... (cached) yes
checking for /etc/lids/lids.conf... (cached) yes
checking for /etc/lids/lids.cap... (cached) yes
checking for /etc/lids/lids.net... yes
checking for /etc/lids/lids.ini... no
checking for /etc/lids/lids.pw... yes
configure: creating ./config.status
config.status: creating Makefile
config.status: creating src/Makefile
config.status: creating config.h
config.status: config.h is unchanged
config.status: executing depfiles commands
[omok@localhost lidstools-0.5.1]$
[omok@localhost lidstools-0.5.1]$ make
make  all-recursive
make[1]: 入ります ディレクトリ `/home/omok/work/lidstools-0.5.1'
Making all in src
make[2]: 入ります ディレクトリ `/home/omok/work/lidstools-0.5.1/src'
source='rmd160.c' object='rmd160.o' libtool=no \
depfile='.deps/rmd160.Po' tmpdepfile='.deps/rmd160.TPo' \
depmode=gcc /bin/sh ../depcomp \
gcc -DHAVE_CONFIG_H -I. -I. -I..     -I/usr/src/linux/include -DCONFIG_LIDS -c `test -f 'rmd160.c' || echo './'`rmd160.c
source='sig_rmd160.c' object='sig_rmd160.o' libtool=no \
depfile='.deps/sig_rmd160.Po' tmpdepfile='.deps/sig_rmd160.TPo' \
depmode=gcc /bin/sh ../depcomp \
gcc -DHAVE_CONFIG_H -I. -I. -I..     -I/usr/src/linux/include -DCONFIG_LIDS -c `test -f 'sig_rmd160.c' || echo './'`sig_rmd160.c
source='time.c' object='time.o' libtool=no \
depfile='.deps/time.Po' tmpdepfile='.deps/time.TPo' \
depmode=gcc /bin/sh ../depcomp \
gcc -DHAVE_CONFIG_H -I. -I. -I..     -I/usr/src/linux/include -DCONFIG_LIDS -c `test -f 'time.c' || echo './'`time.c
source='lids_capflag.c' object='lids_capflag.o' libtool=no \
depfile='.deps/lids_capflag.Po' tmpdepfile='.deps/lids_capflag.TPo' \
depmode=gcc /bin/sh ../depcomp \
gcc -DHAVE_CONFIG_H -I. -I. -I..     -I/usr/src/linux/include -DCONFIG_LIDS -c `test -f 'lids_capflag.c' || echo './'`lids_capflag.c
gcc  -I/usr/src/linux/include -DCONFIG_LIDS   -o lidsadm -static lidsadm.o read_pw.o rmd160.o sig_rmd160.o time.o lids_capflag.o  
source='lidsconf.c' object='lidsconf.o' libtool=no \
depfile='.deps/lidsconf.Po' tmpdepfile='.deps/lidsconf.TPo' \
depmode=gcc /bin/sh ../depcomp \
gcc -DHAVE_CONFIG_H -I. -I. -I..     -I/usr/src/linux/include -DCONFIG_LIDS -c `test -f 'lidsconf.c' || echo './'`lidsconf.c
gcc  -I/usr/src/linux/include -DCONFIG_LIDS   -o lidsconf  lidsconf.o read_pw.o rmd160.o sig_rmd160.o time.o lids_capflag.o  
make[2]: 出ます ディレクトリ `/home/omok/work/lidstools-0.5.1/src'
make[2]: 入ります ディレクトリ `/home/omok/work/lidstools-0.5.1'
make[2]: 出ます ディレクトリ `/home/omok/work/lidstools-0.5.1'
make[1]: 出ます ディレクトリ `/home/omok/work/lidstools-0.5.1'
[omok@localhost lidstools-0.5.1]$
make が無事に終わったら、suでrootになって、make installします。
[hoge@localhost lidstools-0.5.1]$ su
Password:
[root@svlog lidstools-0.5.1]# make install
Making install in src
make[1]: Entering directory `/home/omok/work/lidstools-0.5.1/src'
make[2]: Entering directory `/home/omok/work/lidstools-0.5.1/src'
/bin/sh ../mkinstalldirs /sbin
  /usr/bin/install -c lidsadm /sbin/lidsadm
  /usr/bin/install -c lidsconf /sbin/lidsconf
/bin/sh ../mkinstalldirs /usr/local/man/man8
mkdir /usr/local/man
mkdir /usr/local/man/man8
 /usr/bin/install -c -m 644 ./lidsadm.8 /usr/local/man/man8/lidsadm.8
 /usr/bin/install -c -m 644 ./lidsconf.8 /usr/local/man/man8/lidsconf.8
make[2]: Leaving directory `/home/omok/work/lidstools-0.5.1/src'
make[1]: Leaving directory `/home/omok/work/lidstools-0.5.1/src'
make[1]: Entering directory `/home/omok/work/lidstools-0.5.1'
make[2]: Entering directory `/home/omok/work/lidstools-0.5.1'
make[2]: Nothing to be done for `install-exec-am'.
/bin/sh ./mkinstalldirs /etc/lids
mkdir /etc/lids
 /usr/bin/install -c -m 644 example/lids.conf /etc/lids/lids.conf
 /usr/bin/install -c -m 644 example/lids.cap /etc/lids/lids.cap
 /usr/bin/install -c -m 644 example/lids.boot.conf
	/etc/lids/lids.boot.conf
 /usr/bin/install -c -m 644 example/lids.boot.cap
	/etc/lids/lids.boot.cap
 /usr/bin/install -c -m 644 example/lids.postboot.conf
	/etc/lids/lids.postboot.c
onf
 /usr/bin/install -c -m 644 example/lids.postboot.cap
	/etc/lids/lids.postboot.ca
p
 /usr/bin/install -c -m 644 example/lids.shutdown.conf
	/etc/lids/lids.shutdown.c
onf
 /usr/bin/install -c -m 644 example/lids.shutdown.cap
	/etc/lids/lids.shutdown.ca
p
 /usr/bin/install -c -m 644 example/lids.net /etc/lids/lids.net
 /usr/bin/install -c -m 644 example/lids.ini /etc/lids/lids.ini
 /usr/bin/install -c -m 644 example/lids.pw /etc/lids/lids.pw
make  install-data-hook
make[3]: Entering directory `/home/omok/work/lidstools-0.5.1'
( [ 1 -eq 1 ] && /sbin/lidsconf -U ; true)
Using ACL FILE: /etc/lids/lids.conf
UPDATE
         effective capability = 0x00000000

object file /sbin was (3:2 inode 80483) instead of (3:3
	843659). corrected.
object file /bin was (3:2 inode 80481) instead of (3:3
	859881). corrected.
object file /boot was (3:2 inode 112673) instead of (3:1 2). corrected.
object file /lib was (3:2 inode 16098) instead of (3:3
	178475). corrected.
object file /usr was (3:2 inode 32194) instead of (3:3
	340705). corrected.
object file /etc was (3:2 inode 48289) instead of (3:3
	259585). corrected.
object file /etc/lids was (8:2 inode 17382) instead of (3:3
	1136876). corrected.
object file /etc/shadow was (3:2 inode 52620) instead of (3:3
	260619). corrected
.
object file /var/log was (3:5 inode 38153) instead of (3:3
	292041). corrected.
object file /var/log/wtmp was (3:5 inode 38172) instead of (3:3
	292105). correct
ed.
subject file /bin/login was (3:2 inode 84684) instead of (3:3
	859967). corrected
.
object file /etc/shadow was (3:2 inode 52620) instead of (3:3
	260619). corrected
.
subject file /bin/su was (3:2 inode 81032) instead of (3:3
	859960). corrected.
object file /etc/shadow was (3:2 inode 52620) instead of (3:3
	260619). corrected
.
( [ 1 -eq 1 ] && /sbin/lidsconf -P ; true)
MAKE PASSWD
enter new password:
ここで、LFS(LIDS Free Session。説明は後述) 用のパスワードを聞いてくるので、好きな物をいれます。
reenter new password:
再度パスワードを聞かれますので、入力します。
wrote password to /etc/lids/lids.pw
make[3]: Leaving directory `/home/omok/work/lidstools-0.5.1'
make[2]: Leaving directory `/home/omok/work/lidstools-0.5.1'
make[1]: Leaving directory `/home/omok/work/lidstools-0.5.1'
これで、lidstoolsのインストールは完了です。



再起動前のルール設定

以下の作業は、rootで行います。

再起動時に最低限必要なルールを設定してあげます。以下のルールは RedHat Linux9用です。

/sbin/lidsconf -A -o /sbin			-j READONLY
/sbin/lidsconf -A -o /bin			-j READONLY

/sbin/lidsconf -A -o /usr			-j READONLY
/sbin/lidsconf -A -o /lib			-j READONLY

/sbin/lidsconf -A -o /etc			-j READONLY
/sbin/lidsconf -A -o /usr/local/etc		-j READONLY
/sbin/lidsconf -A -o /etc/shadow		-j DENY
/sbin/lidsconf -A -o /etc/grub.conf		-j DENY
/sbin/lidsconf -A -o /boot/grub/grub.conf	-j DENY

/sbin/lidsconf -A -s /bin/login -o /etc/shadow	-j READONLY
/sbin/lidsconf -A -s /usr/bin/vlock -o /etc/shadow	-j READONLY
/sbin/lidsconf -A -s /bin/su -o /etc/shadow	-j READONLY
/sbin/lidsconf -A -s /bin/su -o CAP_SETUID	-j GRANT
/sbin/lidsconf -A -s /bin/su -o CAP_SETGID	-j GRANT

/sbin/lidsconf -A -o /boot			-j READONLY

/sbin/lidsconf -A -o /root			-j READONLY
/sbin/lidsconf -A -o /bin/bash -o /root/.bash_history	-j READONLY

/sbin/lidsconf -A -o /var/log			-j APPEND
/sbin/lidsconf -A -s /bin/login -o /var/log/wtmp	-j WRITE
/sbin/lidsconf -A -s /bin/login -o /var/log/lastlog	-j WRITE
/sbin/lidsconf -A -s /bin/init -o /var/log/wtmp		-j WRITE
/sbin/lidsconf -A -s /bin/init -o /var/log/lastlog	-j WRITE
/sbin/lidsconf -A -s /bin/halt -o /var/log/wtmp		-j WRITE
/sbin/lidsconf -A -s /bin/halt -o /var/log/lastlog	-j WRITE
/sbin/lidsconf -A -s /etc/rc.d/rc.sysint  -o /var/log/wtmp -i 1	-j WRITE
/sbin/lidsconf -A -s /etc/rc.d/rc.sysint  -o /var/log/lastlog -i 1	-j WRITE

/sbin/lidsconf -A -s /sbin/hwlock  -o /etc/adjtime 	-j WRITE

/sbin/lidsconf -A -s /sbin/init  -o CAP_KILL_PROTECTED 	-j GRANT
/sbin/lidsconf -A -s /sbin/init  -o CAP_KILL 	-j GRANT

/sbin/lidsconf -A -s /etc/rc.d/init.d/halt -o CAP_KILL_PROTECTED -i 1 	-j GRANT
/sbin/lidsconf -A -s /etc/rc.d/init.d/halt -o CAP_KILL -i 1 	-j GRANT
/sbin/lidsconf -A -s /etc/rc.d/init.d/halt -o CAP_NET_ADMIN -i 1 	-j GRANT
/sbin/lidsconf -A -s /etc/rc.d/init.d/halt -o CAP_SYS_ADMIN -i 1 	-j GRANT

/sbin/lidsconf -A -s /sbin/update -o CAP_SYS_ADMIN 	-j GRANT

/sbin/lidsconf -A -o /etc/lids			-j DENY 

/sbin/lidsconf -A -o /home/omok			-j READONLY

/sbin/lidsconf -A -s /bin/init -o /etc/initrunlvl		-j APPEND

最後に、設定ファイルを更新して、反映させます。

lidsconf -U


LIDS カーネルの、簡単なテスト

新しいカーネルで立ち上げると、色々な設定が読み込めないなどのエラーが出て来ます。 更に、外部からsshでログインしようとすると、正しいパスワードを入力しても
hoge@earth:~$ ssh -l hoge 172.16.0.1
hoge@172.16.0.1's password:
Permission denied, please try again.
となります。また、サーバーのコンソール上には
LIDS: sshd (dev  3:1 inode 66355) pid 1441 pid 10054 uid/gid (0/0) on (null tty): access hidden file /etc/shadow
となっています。つまり、/etc/shadowファイルが隠されているため、外部からはログイ ンできないようになっています。

また、サーバーコンソールからログインして、

cd /root
cp /tmp/test .
として、ファイルを書き込もうとしても、/rootディレクトリがread属性になっているため
cp: cannot create regular file 'test': Operation not permitted
となって、書き込みは出来ません。

また、この状態(カーネル封印前)で

cd /lib/modules/2.4.24/kernel/net/ipv4/netfilter
insmod ip_conntrack.o
とやると、モジュールは読み込めますが、LIDS によってカーネルを封印すると、
lidsadm -I
insmod ip_conntrack_irc.o
LIDS: insmod (dev 3:1 inode 161764) pid 1496 ppid 1443 uid/gid (0/0) on (vc/1) violated CAP_SYS_MODULE
ip_conntrack_irc.o: create_module: Operation not permitted
となり、カーネルにモジュールをロードできない事が分かります。

また、このとき、他のPCからnmapでスキャンを掛けると

LIDS: (undetermined program) pid 0 ppid 0 uid/gid (0/0) on (null tty) : Port scan detected: 172.16.0.100 scanned 26 closed ports including 0 ports < 1024)  - logging disabled for (60)s
というメッセージがコンソール上に表示されます。

以上で、第一回は終了です。次回は、LIDS の各種設定ファイルにと、lids の設 定コマンドについて説明します。


Kazuki Omo 平成15年12月23日