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

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

 前回「ファイルACLを用いたアクセス制御」では、LIDSの特徴であるファイルACLによる強制アクセス制御(MAC)とその実装について見ました。今回は、LIDSの特徴の2つ目である「Linuxカーネルケーパビリティ」を見ていきましょう。

 権限を切り分けるPOSIXケーパビリティ

 通常、UNIXにおけるプロセスは、一般ユーザー権限で動くか、特権(root権限)で動くかの2種類しかありません。プロセスに特権が必要となるのは、Apacheなどのサービスがポート1024番未満のいわゆる「特権ポート」をプロセスで使用する場合や、pingやsnortなどのように生(raw)ソケットをイーサネットデバイスに対してオープンし生のIPデータトラフィックを見る場合、あるいはntpdなどでシステムの時刻を設定する場合などです。

 しかし、プロセスに特権をすべて与えてしまうことにより新たな問題が生じてきます。動作しているプロセスに脆弱性があった場合に、不正な操作によりプロセスが持っている権限を取得されてしまう可能性があるのです。この結果、悪意のあるユーザーにコンピュータのすべてを自由にできる特権を奪われてしまうことになります。

 この問題は随分前からUNIXでは指摘されており、これを解決する方法として「ケーパビリティ(POSIX Capability)」という提案がPOSIX(Portable Operating System Interface for UNIX:IEEEによるUNIXの標準アプリケーション・インターフェイス仕様)のドラフト1003.1eに提出されました。

 これは、特権をさらに細分化したケーパビリティと呼ばれる単位で取り扱えるようにし、プロセスに特権すべてを与えるのではなく、最小限のケーパビリティを与えて必要な処理を行わせようというものです。これにより、プロセスにもし脆弱性が発見されて悪用されたとしても、そのプロセスが必要とする最小限のケーパビリティしか奪われないため、被害の範囲を狭めることが可能になります。

 POSIXケーパビリティに関する詳しい説明は以下のテキストを参照してください。

Linux Capabilities FAQ 0.2
ftp://www.kernel.org/pub/linux/libs/security/linux-privs/kernel-2.4/capfaq-0.2.txt

 Linuxカーネルケーパビリティ

 このPOSIXケーパビリティは、Linux上では「Linuxカーネルケーパビリティ」としてカーネル2.4から採用されています。最新のカーネル2.4.32では29種類のケーパビリティ(表1)が定義されています。

番号 ケーパビリティ名 番号 ケーパビリティ名
0
CAP_CHOWN
15
CAP_IPC_OWNER
1
CAP_DAC_OVERRIDE
16
CAP_SYS_MODULE
2
CAP_DAC_READ_SEARCH
17
CAP_SYS_RAWIO
3
CAP_FOWNER
18
CAP_SYS_CHROOT
4
CAP_FSETID
19
CAP_SYS_PTRACE
5
CAP_KILL
20
CAP_SYS_PACCT
6
CAP_SETGID
21
CAP_SYS_ADMIN
7
CAP_SETUID
22
CAP_SYS_BOOT
8
CAP_SETPCAP
23
CAP_SYS_NICE
9
CAP_LINUX_IMMUTABLE
24
CAP_SYS_RESOURCE
10
CAP_NET_BIND_SERVICE
25
CAP_SYS_TIME
11
CAP_NET_BROADCAST
26
CAP_SYS_TTY_CONFIG
12
CAP_NET_ADMIN
27
CAP_MKNOD
13
CAP_NET_RAW
28
CAP_LEASE
14
CAP_IPC_LOCK
表1 カーネル2.4.32でのケーパビリティ一覧

 またカーネル2.6.14.4では新たにログ監査に使うAUDIT機能関連のケーパビリティ「29 CAP_AUDIT_WRITE」と「30 CAP_AUDIT_CONTROL」の2つが追加されて31種類となっています。

 それぞれのケーパビリティに関する詳しい説明は、カーネルソース内の/usr/src/linux/include/capability.hファイルにコメントとして載っています。また、「man capabilities」としてケーパビリティに関するマニュアルを読むこともできます。代表的なケーパビリティに関しての説明を表2に示します。

ケーパビリティ名 説明
CAP_CHOWN ファイルのUID とGID を任意に変更することを許可する
CAP_DAC_OVERRIDE ファイルの読込み、書き込みと実行権限のチェックをバイパスする
CAP_NET_ADMIN さまざまなネットワークに関係する操作(ルーティングテーブルの変更など)を許可する
CAP_NET_BIND_SERVICE 1024 番以下のポート番号へのバインディングを許可する
CAP_NET_RAW RAWソケットとPACKETソケットの使用を許可する
CAP_SYS_CHROOT chroot(2)をコールすることを許可する
CAP_SYS_TIME システムクロックの変更を許可する
表2 代表的なケーパビリティ

1/4

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


Security&Trust記事一覧


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

注目のテーマ

Security & Trust 記事ランキング

本日 月間