デバイスのセキュリティ強化

TOMOYO LinuxのSYAORANファイルシステムにインスパイアされ、

新文法
allowdev -root <パス or ファイルシステム名>;
を追加。

概要

allowdev -root <パス or ファイルシステム名>;
は、<パス or ファイルシステム名>がデバイスを格納するディレクトリであることを指定する。(ファイルシステム名は後述するすごく特殊な場合に対応するため)

1)
allow ファイル/ディレクトリ名 パーミッション;
とした場合、
ファイル/ディレクトリ名のうち、デバイス(chr_file,blk_file)については、
デフォルトでは、アクセスを許可しない。
2)
ファイル/ディレクトリ名 が、allowdev -rootで指定されたパス以下にある場合のみ、chr_file, blk_fileのアクセスが許可される。

例:

globalセクションに
allowdev -root /dev;
と記述。

httpd_tセクションに
allow /var/www/html s,r;
→ /var/www/htmlにたとえデバイスがあっても、アクセスは許可されない

allow /dev/null r,w;
→ /dev/nullは、「/dev/」の子なので、/dev/nullデバイスファイルに、r,wアクセスできる。
ただし、wは許可されるが、生成消去は、allowpriv devcreateを記述しない限り許可されない。

特殊な場合に対応も可能

chrootしていて、/chroot/devにデバイスを格納している場合。
allowdev -root /chroot/dev;
とglobalもしくは、/chroot/devにアクセスするドメインに追加。
さらに xattrに対応してないファイルシステムにデバイスが格納されることがあったら。
例えば、fatにデバイスを格納する時。
allowdev -root fat;
とする。

設定の複雑さへの影響

普通,デバイスを格納するのは、/devのみ。
globalに、allowdev -root /devと書いておけば、
ユーザは何もする必要がない。
chrootしているときは、/dev以外にデバイスを格納することもありえる。
その場合は、ユーザはglobalに一行追加する必要がある。

セキュリティへの影響

「/dev以外にデバイスを作られると困る」問題(id:himainu:20060119)を解決可。デバイスがある場所は「/devだけ」という設定をすることができ、
余計な場所にデバイスを作られない。

依然、特権を持つプロセス(allowpriv allが設定されていて、SELinuxのアクセス制御を受けないプロセス)は、へんなところにデバイスを作れちゃう。(/dev以外の場所にもデバイスが作れる)。
しかし、他のプロセスは、このようなデバイスにアクセスできないので、大丈夫。

実装

実装完了したが、途中でやり直して時間が無駄になった…
XMLのSimplified Policy仕様書ファイルに、「条件分岐」を盛りこもうとして失敗しやりなおし。XMLにロジックを入れるのは良くないのかも。