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

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

 権限の継承

 前回も簡単に触れましたが、LIDSではプロセスに権限を与えた際に、そのプロセスの子プロセスが持つ権限は次のようになります。

  • 親プロセスと子プロセスが同じプログラムの場合には、権限がそのまま引き継がれる
  • 親プロセスと子プロセスのプログラムが異なる場合には、ACLを設定する際に「継承(inheritance)レベル」で設定されたレベルまでの世代が親プロセスの権限を引き継ぐ

 実際にLIDS(LIDS-1系列)のソースでは、ACLによる判定を「lids_compute_acls()」という関数で計算する際に子プロセスのACLを調べ、inheritanceの値が設定されていた場合には、0になるまでPIDをさかのぼってACLを調べていくという方法を取っています。

/usr/src/linux/kernel/lids.c

559 int
560 lids_compute_acls(struct lids_task_acl *current_acl,
561            struct lids_sys_acl *new_sys_acl,
562            struct lids_task_acl *computed_acl, int protect)
563 {
564

(略)

658            sizeof(struct lids_acl));
659          if (dst_acl->inherit > 0)
660            dst_acl->inherit--;

 それでは、/etc/init.d/vsftpdに権限を与え、それを子プロセスであるstart-stop-daemonまで継承させてみましょう。継承を設定するには、lidsconfコマンドでACLを設定する際に「-i」オプションを付けます。i(inheritance)の後に、継承レベルを数字で指定します。

 例えば、今回のように/etc/init.d/vsftpdの子プロセス(継承レベル1)となるstart-stop-daemonに、/var/run/vsftpd以下に書き込み(WRITE)の権限を継承させたい場合には次のようになります。

# lidsconf -A BOOT -s /etc/init.d/vsftpd -o /var/run/vsftpd -i 1 -j WRITE

 権限の継承の問題点

 機能としては非常に分かりやすい権限の継承ですが、よく考えずに使ってしまうとセキュリティのリスクを増やす結果になりかねません。

 今回、例として使った/etc/init.d/vsftpdの場合、このスクリプトからは、

  • /sbin/start-stop-daemon
  • /bin/egrep

という2つのプログラムが起動します。両者に/var/run/vsftpdへのWRITE権限が継承されることになりますので、(継承を)望んでいないプログラム「egrep」に対しても、WRITE権限が継承されています。

 これらのプログラムがREADONLYで保護されていたとしても、何らかのバグが発見された場合に、セキュリティ上のリスクが増えてしまう可能性があります(あくまでも/var/run/vsftpdが親プロセスであったときのみに権限を与えていますので、start-stop-daemonプログラムに直接WRITE権限を与えるよりも制限は掛かっています)。

権限の継承の問題点(画像をクリックすると拡大します)

 LIDSでは、権限の継承ができる子プロセスは、READONLY以上で守られているものが対象になっているため、改ざんされる可能性がある「危険な」プログラムに権限が継承されるのを防止できます。

 しかし、子プロセスなどで起動するプログラムの数が最小限(権限が不要なプログラムには継承されない)の場合には権限の継承を行った方がよいですが、さまざまなプログラムを子プロセスとして呼び出すプログラムに関しては、プログラムに直接権限を与えた方が子プロセスとして呼び出されるプログラムにバグが発見されたときのことを考えると無難です。

 自作したプログラムやシェルスクリプトなどで、動作を完全に把握できるプログラムを対象に権限の継承を使用しましょう。

 start-stop-daemonに書き込み権限を与える

 今回はリスクを考慮してstart-stop-daemonに対して/var/run/vsftpd以下の書き込み権限を与えましょう。この権限は、vsftpdが起動する際と停止する際に必要ですので、BOOTステートとSHUTDOWNステートの両方に与えます。

 「lids=0」としてLIDSが無効の状態でシステムを起動するか、「lidsadm -S -- -LIDS」としてLFSを開き、

# lidsconf -A BOOT -s /sbin/start-stop-daemon -o /var/run/vsftpd -j WRITE
# lidsconf -A SHUTDOWN -s /sbin/start-stop-daemon -o /var/run/vsftpd -j WRITE

という2つのACLを設定しましょう。

 設定が終わったらACLを再コンパイルし、システムをSHUTDOWNステートに移行させてから、再起動します。

# lidsconf -C

# lidsadm -S -- +SHUTDOWN

# reboot

 あらためてLIDSが有効な状態で起動、ログインして「ps」コマンドなどで確認すると、今度はvsftpdが動作しているはずです。

2/3

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


Security&Trust記事一覧


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

注目のテーマ

Security & Trust 記事ランキング

本日 月間