第10回 ACL設定のステップバイステップ

面 和毅
サイオステクノロジー株式会社
インフラストラクチャービジネスユニット
Linuxテクノロジー部
OSSテクノロジーグループ
シニアマネージャ
2006/9/8

 本連載では、これまでLIDSのACLを設定する際に必要となる知識を紹介してきました。今回から実際のアプリケーションを例にして、ACL/ケーパビリティを設定する方法を紹介します。

 今回も説明のためにVMwareイメージを用いて解説します。実際に手元で設定ファイルなどを確認したい場合には以下のURLからVMwareイメージをダウンロードしてください。

【atmarkIT VMware Images】
http://www.selinux.gr.jp/LIDS-JP/atmarkit.html

 VMwareイメージのアップデート

 いままで使用してきたVMwareイメージを、aptを用いてアップデートする方法を説明します。更新だけでなくパッケージを追加する場合も同様の手順で作業を行います。

1.rootでログインし、LFSを開く

# lidsadm -S -- -LIDS
SWITCH
enter password:

2.aptコマンドでアップデートする

# apt-get update ; apt-get upgrade -y

3.inodeが変更されている可能性があるので、inode情報を整合する(ここでは/root/scripts以下のスクリプトを用います)

# /root/scripts/lids.update.sh

4.LFSを閉じる

# lidsadm -S -- +LIDS
SWITCH
enter password:

 ここで注意が必要です。loginやtty関連のファイルがアップデートされると、LIDS-2系列では/root/scripts/lids.update.shを実行しても更新情報が不足していることがあります。そのため、loginやssh(リモートから作業を行っているとき)などのファイルがアップデートされた場合には、/root/scriptsディレクトリに移動し、

# cd /root/scripts
# ./install.sh

としてACLの再インストールをしておいた方がよいでしょう。

 vsftpdを使ってのACLを設定してみる

 例としてvsftpdを用いてACLの設定方法を見てみましょう。せっかくですから、vsftpdを(LIDS-1系列のみですが)サンドボックス化してからACL/ケーパビリティを設定したいと思います。以下、サンプルのVMwareイメージを用います。

1.VMwareイメージを起動する際に、ブートプロンプトで「lids=0」としてLIDSを無効化する

2.vsftpdパッケージをインストールする(aptコマンドを使用)

# apt-get install vsftpd

3./etc/vsftpd.confファイルを修正する

 サンプルとして「ローカルユーザーでのログインを許可」と「ftpクライアントからのファイルのアップロードを許可」を行いたいので、/etc/vsftpd.confファイルにある以下の2つの設定のコメントを外します。

# Uncomment this to allow local users to log in.
local_enable=YES
#
# Uncomment this to enable any form of FTP write command.
write_enable=YES

4.ACLを設定する

 ACL設定の例として、以下のようなシェルスクリプト(/root/scripts/services/lids.vsftpd.sh)を作成します。

#!/bin/sh
#Sandboxing ― (A)
/sbin/lidsconf -A -s /usr/sbin/vsftpd -o LIDS_SANDBOX -j ENABLE
#Hide vsftpd.conf file except vsftpd itself ― (B)
/sbin/lidsconf -A -o /etc/vsftpd.conf -j DENY
/sbin/lidsconf -A BOOT -s /usr/sbin/vsftpd -o /etc/vsftpd.conf -j READONLY
#need to READONLY whole linked libraries ― (C)
/sbin/lidsconf -A BOOT -s /usr/sbin/vsftpd -o /lib/libwrap.so.0 -j READONLY
/sbin/lidsconf -A BOOT -s /usr/sbin/vsftpd -o /lib/libnsl.so.1 -j READONLY
/sbin/lidsconf -A BOOT -s /usr/sbin/vsftpd -o /lib/libpam.so.0 -j READONLY
/sbin/lidsconf -A BOOT -s /usr/sbin/vsftpd -o /lib/libdl.so.2 -j READONLY
/sbin/lidsconf -A BOOT -s /usr/sbin/vsftpd -o /lib/libresolv.so.2 -j READONLY
/sbin/lidsconf -A BOOT -s /usr/sbin/vsftpd -o /lib/libutil.so.1 -j READONLY
/sbin/lidsconf -A BOOT -s /usr/sbin/vsftpd -o /lib/libcap.so.1 -j READONLY
/sbin/lidsconf -A BOOT -s /usr/sbin/vsftpd -o /usr/lib/i686/cmov/libssl.so.0.9.7 -j READONLY
/sbin/lidsconf -A BOOT -s /usr/sbin/vsftpd -o /usr/lib/i686/cmov/libcrypto.so.0.9.7 -j READONLY
/sbin/lidsconf -A BOOT -s /usr/sbin/vsftpd -o /lib/libc.so.6 -j READONLY
/sbin/lidsconf -A BOOT -s /usr/sbin/vsftpd -o /lib/ld-linux.so.2 -j READONLY

#for BIND ftp port ― (D)
/sbin/lidsconf -A BOOT -s /usr/sbin/vsftpd -o CAP_NET_BIND_SERVICE 21 -j GRANT
/sbin/lidsconf -A POSTBOOT -s /usr/sbin/vsftpd -o CAP_NET_BIND_SERVICE 20,21 -j GRANT
#for logging ― (E)
/sbin/lidsconf -A -s /usr/sbin/vsftpd -o /var/log/vsftpd.log -j APPEND

#for changing UID/GID when it run from service ― (F、G)
/sbin/lidsconf -A POSTBOOT -s /usr/sbin/vsftpd -o CAP_SETUID -j GRANT
/sbin/lidsconf -A POSTBOOT -s /usr/sbin/vsftpd -o CAP_SETGID -j GRANT

 最初に/usr/sbin/vsftpdをサンドボックス化しています(A)。

 次に、/etc/vsftpd.confは設定ファイルであり重要なファイルなので、すべてのステート(GLOBAL)でDENYとして、vsftpd以外のプログラムからは完全に見えないようにします(B)。また、vsftpdは起動する際に/etc/vsftpd.confを参照するので、BOOTステートでREADONLYのアクセス権限を与えます。

 vsftpdをサンドボックス化したため、vsftpdが使用しているライブラリに対してBOOTステートで読み込み権限を与える必要があります。lddコマンドを用いてライブラリを調べ、それらに読み込み権限を与えます(C)。

# ldd /usr/sbin/vsftpd

 このコマンドで出力されたファイルに対して、BOOTステートで読み込み権限を与えていきます。

 vsftpdがポート20と21を使用するため、vsftpdに20、21番ポートをバインドできるようにケーパビリティを与えます(D)。通常、コントロールコネクションは起動して21番ポートをバインドして待ち受けているため、BOOTステートで21番ポートを使用できるようにします。また、実際にftpサーバを使用する際には、データコネクションとして20番ポートを使用することになりますので、POSTBOOTステートで20番ポートを使用できるようにします。

 vsftpdが/var/log/vsftpd.logにログを出力します。そのため、vsftpdに対して/var/log/vsftpd.logファイルへの書き込み権限を与えます(E)。

 vsftpdはFTPクライアントからの接続を受け、ログイン認証を通過した後に、子プロセスの実効Userを変更して生成します。そこで、POSTBOOTステートでvsftpdに対しCAP_SETUIDとCAP_SETGIDのケーパビリティを与えます(F)。

 今回はanonymous ftpを許可しています。anonymousでログインした際にvsftpdがchrootを行えるように、POSTBOOTステートでCAP_SYS_CHROOTを与えます(G)。

 これでvsftpdの主な設定が終わりました。シェルスクリプトを実行してACLを反映し、コンパイルしてから、システムを再起動しましょう。今度はLIDSが有効な状態(REBOOTプロンプトで何も指定しない)で起動します。

# /root/scripts/services/lids.vsftpd.sh
# lidsconf -C

# reboot

5.vsftpdに対してエラーが表示される

 再起動後にログインしてvsftpdのプロセスを確認すると、vsftpdが動作していないことが分かります。/var/log/syslogを確認すると、vsftpdに対して次のようなエラーが出力されています。

Aug3 12:35:21 localhost kernel: LIDS:start-stop-daemon (dev 3:1 inode 80331) pid 740 ppid 1 uid/gid (0/0) on (null tty) : Attempt to open /var/run/vsftpd/vsftpd.pid for writing, flag = 33346

 このエラーによれば、「start-stop-daemonが/var/run/vsftpd/vsftpd.pidを書き込もうとしたので拒否した」となっています。start-stop-daemonは/etc/init.d/vsftpdで呼び出されていますので、システム起動時に/etc/init.d/vsftpdから呼び出されたstart-stop-daemonプログラムがPIDファイル(/var/run/vsftpd/vsftpd.pid)を作成しようとしてエラーになっているようです。

 従って、この部分のACLを追加する必要があります。これには、

  • start-stop-daemonプログラムに権限を直接与える
  • /etc/init.d/vsftpdプログラムに権限を与え、そのプログラムから呼び出された子プロセスに権限を継承させる

という2通りのやり方があります。

1/3

Index
ACL設定のステップバイステップ
Page1
VMwareイメージのアップデート
vsftpdを使ってのACLを設定してみる
  Page2
権限の継承
権限の継承の問題点
  Page3
vsftpdの動作テストをする


Security&Trust記事一覧


Security&Trust フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Security & Trust 記事ランキング

本日 月間