第3回 権限を最小化するLinuxカーネルケーパビリティ

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

 ケーパビリティの調整方法

 プロセスを最初に起動した際にデフォルトとなるケーパビリティバウンディングセットの調整について説明します。32ビット列でONにしたいケーパビリティを1、OFFにしたいケーパビリティを0として並べて整数にした値をechoなどを用いて、/proc/sys/kernel/cap-boundに書き込みます。

 例えば、CAP_CHOWNとCAP_KILLをOFFにして、残りすべてをONにする場合には、

"11111111 11111111 11111111 11011110" = "0xFFFFFFDE" = 2147483614

となりますので、

# echo 2147483614 > /proc/sys/kernel/cap-bound

とします。

 一方、プロセスケーパビリティセットの調整は、libcapに含まれる「getpcap(ケーパビリティを見る)」「setpcap(ケーパビリティをセットする)」というコマンドを使う必要があります。

 具体的にはrootユーザーで、

# setpaps '=eip cap_chown,cap_sys_chroot-eip' プロセスID

のようにプロセスIDを指定し、実効(e)、継承(i)、許可(p)をそれぞれ指定してケーパビリティを調整します。なお、ケーパビリティを調整する際にプロセスIDを指定する必要があります。

 この際、許可ケーパビリティセットから一度ケーパビリティを削除してしまうと、再び付け加えることができません。例えば、許可ケーパビリティセットからCAP_CHOWNを削除してしまった場合には、そのプロセスは2度とCAP_CHOWNを持つことができなくなってしまいます。そのため、実際にはケーパビリティ調整は、「必要なケーパビリティ以外を削除する」という方式を取っていきます。

 LIDSを用いた場合のケーパビリティの調整方法

 LIDSを用いると、プロセスのケーパビリティをより直感的に調整できるようになります。

 まず、ケーパビリティバウンディングセットですが、LIDSではLIDSの設定ファイルが入る/etc/lidsディレクトリ以下に「lids.[ステート].cap」というファイルを置きます。ステートに関しては次回で説明します。

 例として、通常のシステム運用時に使用される「lids.postboot.cap」ファイルを見てみましょう。

-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_KILL_PROTECTED
カーネル2.4.32用のLIDSで使用されるlids.postboot.cap

 それぞれのケーパビリティの左側に「+」「-」が付いています。「+」「-」は、そのケーパビリティをケーパビリティバウンディングセットで「ON」「OFF」にするという意味になります。このようにケーパビリティバウンディングセットの設定が非常に分かりやすくなっています。

 また、各プロセスに与えるケーパビリティセットの調整も簡単になっています。LIDSを用いると、実効、継承、許可のケーパビリティセットを特に意識せずに行えるため、設定がより簡単になります。設定は、「必要なケーパビリティを、必要なプロセスに与える」という方法になります。

 具体的には「lidsconf」コマンドを用いて、

lidsconf -A -s "プロセスのプログラム名" -o "ケーパビリティ" -j GRANT

と指定します。実際の実効ケーパビリティセットは、上のように与えたケーパビリティとケーパビリティバウンディングセットの論理和になります。

 次回は、LIDSの「ステート」という概念とLIDS-1系列で使用できるTDE/TPE/Sandboxを見ていきます。

4/4
 

Index
権限を最小化するLinuxカーネルケーパビリティ
  Page1
権限を切り分けるPOSIXケーパビリティ
Linuxカーネルケーパビリティ
  Page2
ケーパビリティチェック
LIDSによるケーパビリティの拡張
ファイルに対するアクセス制御のフロー
  Page3
ケーパビリティの実態
Page4
ケーパビリティの調整方法
LIDSを用いた場合のケーパビリティの調整方法


Profile
面 和毅(おも かずき)

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

 学生時代よりUNIXに親しむ。1997年からサーバ構築およびセキュリティ全般を扱う仕事に従事、Linuxを使い始める。

 現在はLIDSの普及活動に注力。LIDSユーザ会(LIDS-JP)の立ち上げやLIDS関連文書の日本語化、LIDSを用いたシステム構築の紹介などを行っている。また、サイオステクノロジーでビジネス面でのLIDSの普及活動に注力している。

 2005年12月より、LIDS Teamに参加し、LIDSの公式な開発チームの一員として活動している。

Security&Trust記事一覧


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

注目のテーマ

Security & Trust 記事ランキング

本日 月間