ケーパビリティはlinuxカーネル2.4から採用されました。一般的な「特権(uid=0)」を約30種類の「ケーパビリティ」と呼ばれるものに分割し、それぞれをプロセスに割り当てられるようにすることで、プロセスが不要な権限を持たないようにする考え方です。
カーネル2.6では以下の表9のように分割されています。
CAP_CHOWN
CAP_DAC_OVERRIDE
CAP_DAC_READ_SEARCH
CAP_FOWNER
CAP_FSETID
CAP_KILL
CAP_SETGID
CAP_SETUID
CAP_SETPCAP
CAP_LINUX_IMMUTABLE
CAP_NET_BIND_SERVICE
CAP_NET_BROADCAST
CAP_NET_ADMIN
CAP_NET_RAW
CAP_IPC_LOCK
CAP_IPC_OWNER
CAP_SYS_MODULE
CAP_SYS_RAWIO
CAP_SYS_CHROOT
CAP_SYS_PTRACE
CAP_SYS_PACCT
CAP_SYS_ADMIN
CAP_SYS_BOOT
CAP_SYS_NICE
CAP_SYS_RESOURCE
CAP_SYS_TIME
CAP_SYS_TTY_CONFIG
CAP_MKNOD
CAP_LEASE
CAP_AUDIT_WRITE
CAP_AUDIT_CONTROL
表9:カーネル2.6でのケーパビリティの状況
例えばhttpdにPort80番を使用させたい場合には、今までは特権ポート(1023番以下のポート)を使用するためにuid=0で動作させる必要がありました。しかしケーパビリティを活用することで、図2のように「CAP_NET_BIND_SERVICE」というケーパビリティを与えるだけでよくなります。
図2:ケーパビリティを付与した例
このようにプログラムにケーパビリティを設定する場合、通常のLinuxではlibcapパッケージに含まれる「getpcap/setpcap」コマンドを使用します。しかしこのコマンドは使用方法が意外に面倒なことがあります。それに比べてLIDSでは以下のコマンドを実行するだけで済むため、非常に直観的にプロセスにケーパビリティを割り当てることができます。
lidsconf -A -s /usr/sbin/httpd -o CAP_NET_BIND_SERVICE 80 -j GRANT
|