9月末または10月のリリースが予定されているFreeBSD 9.
- 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を使ったプログラミング例を紹介していきます。