2022年8月、ホームページを全面リニューアルしました! 情報を分かりやすくお伝えできるサイト作りを目指してまいります。

LIDSで強制アクセス制御する!

SELinuxは、このサイトの ここ で取り上げて説明した。俺としては、SELinuxを熟知して自分としての実用レベルに持っていくのがかなりの至難の業と見てるのでLIDSの簡便さに注目している。
ここで説明しようとしているLIDS(Linux Intruder Detection System リズと呼んでいる)早い話、IDSだから侵入検知システムと言えそうだけど、強制アクセス制御( MAC )Mandatory Access Controlをするのが本来のこいつの機能だ。つまり、ファイルやディレクトリのパーミッションや所有権を持ってるユーザでも自分の権限で、ファイルやディレクトリを操作できないようにすることである。これに対しては、Unixで言う最高権限者rootユーザでも言えることである。詰まるところ、クラックされると言うことは、Unixで言う最高権限者 root権限を乗っ取られて悪さをされることがきわめて多い。だから、MACの概念は単純に言うと「rootでもシステムの操作は許さない」と言う概念である。確かに考え方は間違っていない。しかし、SELinuxのような制御自体が複雑な構造になっていると逆に管理者にとってはフレキシブルにサーバの中身を管理できなくなる可能性がある。現に、俺はパーミッションのど壺にはまって立ち上げたいサービスが許可されなくてひたすら悩んだ。悪人を泣かすのは心地よいけど、自分がど壺に填ってしまってはシャレにならない。LIDSの設定はSELinuxとは対照的で、

# lidsconf -A -o /root -j READONLY

みたいに設定するのでまるで、みなさんよくご存じのiptablesの書式にうり二つである。その物と言って良いほど似ている。では、SELinuxとLIDSが決定的にどこが違うかというとLIDSでは、ユーザ単位のアクセス制御ができない点である。
あと、SELinuxでは管理対象毎にラベル付けをしてから、それらの関連性を設定する必要がある。しかし、LIDSは、そんなことはお構いなしである。さらに、LIDSでは特権としての意味付けをしているのラベルを独特な言い方をしていて「ケーパビリティ」と呼んでいる。

kernel-2.4でサポートされているケーパビリティ(実際は全29種類有るが代表的なものだけを紹介する)

ケーパビリティ名意味
CAP_CHOWNファイルに対するUID及びGIDを変更することを許可
CAP_NET_BIND_SERVICE1024番以下のポートへの割り当てを許可
CAP_SYS_BOOT再起動(reboot)の実行を許可
CAP_SYS_CHROOTchrootの実行を許可
CAP_SYS_MODULEカーネルモジュールを追加・削除することを許可

LIDS固有のケーパビリティ

ケーパビリティ名意味
CAP_PROTECTEDプロセスを保護してプロセスのkillを出来なくする
CAP_KILL_PROTECTEDCAP_PROTECTEDで保護されたプロセスを強制的にkillする

それと、LIDSのIDS部分の意味としては、確かに侵入検知する。それは、コンソールへアクセスログがリアルタイムで表示されるため、セキュリティ管理的には非常に頼もしいIDSである。

LIDSは、kernelレベルのセキュリティ機能だが標準にマウントされていないのでkernelパッチとして供給される。kernelにパッチを当ててkernelメニューでLIDSの設定をしてLIDSツールをコンパイルビルドしてからconfigしたkernelをコンパイルして再構築して出来上がり。みたいな方法でセットアップする。したがって、これからそのセットアップ方法とLIDSが動作するまでを説明したい。

■ セットアップ環境:
OS : Debian Linux Sarge
kernel : kernel-2.6.14.7( kernel.orgよりダウンロード )再構築するのを前提
LIDSパッチ:lids-2.2.2-2.6.14.tar.gz
LIDSツール:lidstools-2.2.7.tar.gz

■ 失敗談:
手始めにSlackware10( kernel-2.4.31とkernel-2.6.14両方試した )でLIDSパッチを当ててkernel再構築を行ったが、どうしても旨くいかなかった。以下のエラーメッセージが出てLIDSが動作しなかった。

root@slack10:~# lidsadm -S — +LIDS
SWITCH
open: No such file or directory
lidsadm: cannot open /proc/sys/lids/locks

このメッセージが出てLIDSが動作しない。


1.kernelソースをゲットする
まず、取り急ぎLIDSの2.6系のカーネルパッチは、現状 2.6.14が最新だったのでカーネルも合わせることにする。
ここ  linux-2.6.14.7.tar.gz をゲットする。


2.LIDSパッチとLIDSツールをゲットする
ここ
 でLIDSパッチとLIDSツールをゲットする。
ここでは、lids-2.2.2-2.6.14.tar.gz 、 lidstools-2.2.7.tar.gz をゲットした。


3.kernel menuの設定
# cd /usr/src

カーネルソースを解凍する。
# tar zxvf /tmp/linux-2.6.14.7.tar.gz
# chown -R root.root linux-2.6.14.7

シンボルリンクする。
# ln -s linux-2.6.14.7 linux

LIDSパッチとLIDSツールを解凍する。
# tar zxvf /tmp/lids-2.2.2-2.6.14.tar.gz
# tar zxvf /tmp/lidstools-2.2.7.tar.gz
# chown -R root.root lids-2.2.2-2.6.14 lidstools-2.2.7

LIDSパッチを適用する。
# cd linux
# patch -p1 < ../lids-2.2.2-2.6.14/lids-2.2.2-2.6.14.patch

デバイス情報の確認。
# lspci
0000:00:00.0 Host bridge: Intel Corp. 440BX/ZX/DX – 82443BX/ZX/DX Host bridge (rev 03)
0000:00:01.0 PCI bridge: Intel Corp. 440BX/ZX/DX – 82443BX/ZX/DX AGP bridge (rev 03)
0000:00:07.0 ISA bridge: Intel Corp. 82371AB/EB/MB PIIX4 ISA (rev 02)
0000:00:07.1 IDE interface: Intel Corp. 82371AB/EB/MB PIIX4 IDE (rev 01)
0000:00:07.2 USB Controller: Intel Corp. 82371AB/EB/MB PIIX4 USB (rev 01)
0000:00:07.3 Bridge: Intel Corp. 82371AB/EB/MB PIIX4 ACPI (rev 02)
0000:00:0c.0 Multimedia audio controller: Yamaha Corporation DS1L Audio (rev 04)
0000:00:10.0 Ethernet controller: Digital Equipment Corporation DECchip 21140 [FasterNet] (rev 22)
0000:01:00.0 VGA compatible controller: Intel Corp. 82740 (i740) AGP Graphics Accelerator (rev 21)

カーネルのコンフィグ。
# make menuconfig

プロセッサタイプとネットワークデバイスの設定とLIDSパラメータの設定。
あなたが出来れば、よけいなデバイスはチェックを外せばkernel自体軽くなって全体のスループットを上げることができる。だけど、自信がなかったら止めた方が良い。

図1
図2

上図の 「 * 」 が付いてる部分はLIDSの動作に関わるので同じく設定する。


4.LIDSツールのインストール
# cd ../lidstools-2.2.7
# ./configure
# make
# make install


5.kernelのコンパイルとビルド
# cd ../linux
# make
# make clean

kernelイメージを作る。
# make bzImage

リンクする。
# make install


6.bootローダーの設定
ブートローダgrubの設定。
# cd /boot/grub
# vi menu.lst

# Sample boot menu configuration file
#

# Boot automatically after 30 secs.
timeout 30

# By default, boot the first entry.
default 0

## ## End Default Options ##

title Debian GNU/Linux, kernel 2.6.14.7
root (hd0,1)
kernel /boot/vmlinuz-2.6.14.7 root=/dev/hda2 ro
initrd /boot/initrd.img-2.6.14.7
boot

title Debian GNU/Linux, kernel 2.6.8-2-686
root (hd0,1)
kernel /boot/vmlinuz-2.6.8-2-686 root=/dev/hda2 ro
initrd /boot/initrd.img-2.6.8-2-686
boot

title Debian GNU/Linux, kernel 2.4.18-bf2.4
root (hd0,1)
kernel /boot/vmlinuz-2.4.18-bf2.4 root=/dev/hda2 ro
boot

title Debian GNU/Linux, kernel 2.4.18-bf2.4 (recovery mode)
root (hd0,1)
kernel /boot/vmlinuz-2.4.18-bf2.4 root=/dev/hda2 ro single
boot

### END DEBIAN AUTOMAGIC KERNELS LIST


7.LIDSの初期設定
一度再起動する。
# reboot

LIDSが起動時に有効になるように、ACL_DISCOVERYフラグを「 1 」にセットする。
# cd /etc/lids
# vi lids.ini

# This file contain some initial value for LIDS
#

# ACL_DISCOVERY =1 # will turn on the acl discovery
# ACL_DISCOVERY =0 # will turn off the acl discovery
#
#ACL_DISCOVERY=0
ACL_DISCOVERY=1

# end of this file,
# DO NOT DELETE THIS LINE

もう一度、再起動。
# reboot


8.LIDSの動作確認
俺の場合の初期設定は以下のようにした。
# lidsconf -L
# lidsconf -C

俺のLIDS初期設定のシェル

# cd /tmp
# vi init_lids.sh

#! /bin/sh

lidsconf -A -o /sbin -j READONLY
lidsconf -A -o /bin -j READONLY
lidsconf -A -o /boot -j READONLY
lidsconf -A -o /lib -j READONLY
lidsconf -A -o /usr -j READONLY
lidsconf -A -o /var -j READONLY
lidsconf -A -o /tmp -j READONLY
lidsconf -A -o /etc -j READONLY
lidsconf -A -o /etc/lids -j DENY
lidsconf -A -o /etc/shadow -j DENY
lidsconf -A -o /var/log -j APPEND
lidsconf -A -o /var/log/wtmp -j WRITE
lidsconf -A -s /bin/login -o /etc/shadow -j READONLY
lidsconf -A -s /bin/su -o /etc/shadow -j READONLY
lidsconf -A -s /bin/su -o CAP_SETUID -j GRANT
lidsconf -A -s /bin/su -o CAP_SETGID -j GRANT
lidsconf -A -o /root -j READONLY
lidsconf -A -o /root/.bash_history -j READONLY
lidsconf -A -s /bin/login -o /var/log/wtmp -j WRITE
lidsconf -A -s /bin/login -o /var/log/lastlog -j WRITE
lidsconf -A -s /etc/init.d/halt -o CAP_KILL -j GRANT
lidsconf -A -s /etc/init.d/halt -o CAP_NET_ADMIN -j GRANT
lidsconf -A -s /etc/init.d/halt -o CAP_SYS_ADMIN -j GRANT
lidsconf -A -o /home/mity -j READONLY
lidsconf -A -s /bin/bash -o /home/mity/.bash_history -j APPEND
lidsconf -U

# chmod 755 init_lids.sh
# ./init_lids.sh

設定確認する。
# lidsconf -L

Subject ACCESS inherit Object
————————————————————
Any file READONLY: 0 /sbin
Any file READONLY: 0 /bin
Any file READONLY: 0 /boot
Any file READONLY: 0 /lib
Any file READONLY: 0 /usr
Any file READONLY: 0 /var
Any file READONLY: 0 /tmp
Any file READONLY: 0 /etc
Any file DENY: 0 /etc/lids
Any file DENY: 0 /etc/shadow
Any file APPEND: 0 /var/log
Any file WRITE: 0 /var/log/wtmp
/bin/login READONLY: 0 /etc/shadow
/bin/su READONLY: 0 /etc/shadow
/bin/su GRANT: 0 CAP_SETUID
/bin/su GRANT: 0 CAP_SETGID
Any file READONLY: 0 /root
Any file READONLY: 0 /root/.bash_history
/bin/login WRITE: 0 /var/log/wtmp
/bin/login WRITE: 0 /var/log/lastlog
/etc/init.d/halt GRANT: 0 CAP_KILL
/etc/init.d/halt GRANT: 0 CAP_NET_ADMIN
/etc/init.d/halt GRANT: 0 CAP_SYS_ADMIN
Any file READONLY: 0 /home/mity
/bin/bash APPEND: 0 /home/mity/.bash_history

LIDSを動作させる。
# lidsadm -S — +LIDS
SWITCH
enter password:
No global capabilities have changed.

LIDSが動作中だと以下のようにディレクトリの移動もできない。
# cd /etc/lids
-su: cd: /etc/lids: No such file or directory

図3

上の図のようにコンソールにLIDSのログが出力される。


9.このままだとSSHが使えない
現状のままだと、SSHが使えないのでSSHを使える設定を行うと以下のようになる。
SSHを使えるようにするだけでも、これだけの設定を行わないといけないのはちとまいった。

LIDSを一時停止する。
# lidsadm -S — -LIDS

SSHの動作設定を以下に示す。シェルでバッチ処理してもかまわない。

lidsconf -A -s /usr/sbin/sshd -o CAP_NET_BIND_SERVICE GRANT
lidsconf -A -s /usr/sbin/sshd -o CAP_CHOWN GRANT
lidsconf -A -s /usr/sbin/sshd -o CAP_FOWNER GRANT
lidsconf -A -s /usr/sbin/sshd -o CAP_SYS_CHROOT GRANT
lidsconf -A -s /usr/sbin/sshd -o CAP_SETGID GRANT
lidsconf -A -s /usr/sbin/sshd -o CAP_SETUID GRANT
lidsconf -A -s /usr/sbin/sshd -o CAP_DAC_OVERRIDE GRANT
lidsconf -A -s /usr/sbin/sshd -o CAP_DAC_READ_SEARCH GRANT
lidsconf -A -s /usr/sbin/sshd -o CAP_SYS_TTY_CONFIG GRANT
lidsconf -A -s /usr/sbin/sshd -o /var/log/lastlog WRITE
lidsconf -A -s /usr/sbin/sshd -o /etc/shadow READONLY
lidsconf -U

設定したら必ず確認する。
# lidsconf -L

Subject ACCESS inherit Object
————————————————————
Any file READONLY: 0 /sbin
Any file READONLY: 0 /bin
Any file READONLY: 0 /boot
Any file READONLY: 0 /lib
Any file READONLY: 0 /usr
Any file READONLY: 0 /var
Any file READONLY: 0 /tmp
Any file READONLY: 0 /etc
Any file DENY: 0 /etc/lids
Any file DENY: 0 /etc/shadow
Any file APPEND: 0 /var/log
Any file WRITE: 0 /var/log/wtmp
/bin/login READONLY: 0 /etc/shadow
/bin/su READONLY: 0 /etc/shadow
/bin/su GRANT: 0 CAP_SETUID
/bin/su GRANT: 0 CAP_SETGID
Any file READONLY: 0 /root
Any file READONLY: 0 /root/.bash_history
/bin/login WRITE: 0 /var/log/wtmp
/bin/login WRITE: 0 /var/log/lastlog
/etc/init.d/halt GRANT: 0 CAP_KILL
/etc/init.d/halt GRANT: 0 CAP_NET_ADMIN
/etc/init.d/halt GRANT: 0 CAP_SYS_ADMIN
Any file READONLY: 0 /home/mity
/bin/bash APPEND: 0 /home/mity/.bash_history
/usr/sbin/sshd GRANT: 0 CAP_NET_BIND_SERVICE 22-22
/usr/sbin/sshd GRANT: 0 CAP_CHOWN
/usr/sbin/sshd GRANT: 0 CAP_FOWNER
/usr/sbin/sshd GRANT: 0 CAP_SYS_CHROOT
/usr/sbin/sshd GRANT: 0 CAP_SETGID
/usr/sbin/sshd GRANT: 0 CAP_SETUID
/usr/sbin/sshd GRANT: 0 CAP_DAC_OVERRIDE
/usr/sbin/sshd GRANT: 0 CAP_DAC_READ_SEARCH
/usr/sbin/sshd GRANT: 0 CAP_SYS_TTY_CONFIG
/usr/sbin/sshd WRITE: 0 /var/log/lastlog
/usr/sbin/sshd READONLY: 0 /etc/shadow


10.強制アクセス制御もおいしいけど・・・
強制アクセス制御もおいしいけど、単純にLIDSのコマンド操作監視モニタリング機能だけでも特筆出来ると思う。以下の図4と図5を見て欲しい。

図4

これは、SSHでLIDSがセットアップされているサーバへloginして、OpenSSLのソースパッケージをmake installしているところである。

図5

これは、LIDSがインストールされているサーバのコンソールモニタ画面である。お解りのように、リモートでloginしたユーザがOpenSSLのソースをmake installしている状況がリアルタイムでモニタリングされているのが解る。したがって、侵入者の挙動が全て解るようになっている。

以上

コメント