FreeBSD Daily Topics

2011年9月6日Capsicumを知る - カーネルの再構築と最初のプログラミング

9月末または10月のリリースが予定されているFreeBSD 9.0-RELEASEには新しいセキュリティ機能「Capsicum」が登場します。FDTではしばらく概念的な説明や、実際の実装例などを紹介して「Capsicum」の機能を紹介していきます。

How to setup Capsicum?

Capsicumはデフォルトのカーネルでは有効になっていません。9.0-RELEASEではかわるかもしれませんが、少なくとも9-CURRENTでは無効になっています。Capsicumを利用するには最新の9-CURRENTで次のカーネルオプションを指定してカーネルを再構築する必要があります。

Capsicumを有効にするためのカーネルオプションファイル - たとえば/sys/amd64/conf/CAPSとして用意しておく
include GENERIC

ident           CAPS

# enable Capsicum
options         CAPABILITIES
options         CAPABILITY_MODE
カーネルの再構築
cd /usr/src/
make KERNCONF=CAPS buildkernel
make KERNCONF=CAPS installkernel
reboot

Capsicumが有効になると、sysctl(8)コマンドで次のように機能を確認できます。

% sysctl -a | grep capa     
kern.features.security_capabilities: 1
kern.features.security_capability_mode: 1
%

まず最初に、テキストファイルを開くだけの簡単なプログラムを作成してCapsicumの動作を理解していきます。まず、カレントディレクトリに/COPYRIGHTファイルをコピーしてきて読み書きできるようにパーミッションを変更します。

cp /COPYRIGHT ./
chmod u+w ./COPYRIGHT

次のようなソースコードを作成します。これを「open.c」として保存します。先ほど用意したテキストファイルをオープンして、ファイルディスクリプタを表示するだけのプログラムです。

#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <err.h>
#include <errno.h>
#include <sysexits.h>

int
main(void)
{
	int fd;

	fd = open("COPYRIGHT", O_RDWR);
	if (-1 == fd)
		err(EX_NOPERM, "open error: %d", errno);

	printf("open succeed: %d\n", fd);

	return 0;
}

次のようにコンパイルして実行します。期待通りの動きをしていることを確認できます。

% clang open.c
% ./a.out
open succeed: 3
% 

次に、⁠open.c」でファイルをオープンする前に「cap_enter();」を実行するプログラムを「open-cap.c」として作成します。新しくファイルを開く前にケーパビリティモードに入るわけです。

#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <err.h>
#include <errno.h>
#include <sysexits.h>
#include <sys/capability.h>

int
main(void)
{
	int fd;

	cap_enter();  // この行に注目。ケーパビリティモードに入ります。

	fd = open("COPYRIGHT", O_RDWR);
	if (-1 == fd)
		err(EX_NOPERM, "open error: %d", errno);

	printf("open succeed: %d\n", fd);

	return 0;
}

このプログラムをコンパイルして実行すると、次のようにエラーが表示されます。ケーパビリティモードに入った以上、新しいファイルディスクリプタを作成することは、もはやできなくなったわけです。

% clang open-cap.c 
% ./a.out         
a.out: open error: 94: Not permitted in capability mode
%

これがCapsicumの提供するケーパビリティの基本的な使い方です。この場合、1行追加するだけでこの機能を利用できます。あとは、ケーパビリティモードに入るまえに、利用することになるすべてのファイルディスクリプタを権限を指定して用意するようにすれば、Capsicumを使ったセキュリティ強化の実装が完了するという仕組みです。

プログラミングはFreeBSDのユーザランドのコマンドなどを参考にしながら、オンラインマニュアルを読んでいけば大抵事足りますので、いろいろ試してみてください。以降何回か、Capsicumを使ったプログラミング例を紹介していきます。

おすすめ記事

記事・ニュース一覧