_ SELinux
なーんとなくおぼろげにつかめてきた。
カンで書く。
- SELinux とは。 linux kernel でなんかプロセスのやることにセキュリティコンテキストベースで制限とかがかけられる。
- ls -Z とか ps Z でどいうセキュリティコンテキストのファイル/プロセスかがわかる。
- ポリシーを手動でセットしていくのは大変なので hoge.te, hoge.fc を書くことによって make で作れたりするようになってる。
- さらに reference 設定として配布されてるものがあって、かつそれは distribution が改造して適当に配布している。
- strict mode では基本全てのプロセスが何もできないのがデフォルトだけど、それは結構真剣に不便なので targeted mode とかいうヤツが普通のディストリビューションでは使われていて、それだと特定のプロセス(要はサーバ)だけできることを減らす、というような感じでできる。
- targeted で特に何も指定してないプロセスは unconfined_t とかいうのがついて、何でもできる。
- あとたぶん MLS とかいうのもある、がなんか軍とかで機密データは大佐以上がアクセス可、とかそいうヤツぽい。
- プロセスのやることを制限する書式は基本的に whitelist 方式。
さて、やりたいことは unconfined_t からほんの少しだけ権限を奪った、
つまり blacklist な感じの policy を作りたいんだけど、
あんま簡単ではなさそうなんだよな。
unconfined_domain_noaudit ってマクロが /usr/share/selinux/default/include/system/unconfined.if にあるから、
これをコピってから必要な制約だけつけないようにする、って感じかなぁ。
なんか allow kern_unconfined ~{ setpgid } とかそいうのかも
(05:19)
_ ゴルフ場 sandbox
前回までのあらすじ: SELinux はたいへん難しかった
メンテ性考えても kernel module の方が
はるかにマシなんじゃないかという結論に至り、
その方向でやってみたい。
方針としてはややこしいのを書くと
大変なことになりそうなので、
間違えようのないくらい簡単なものにする。
- setuid, setgid, setsid, setpgid は root 以外は EPERM 。
- accept, bind, listen, socket あたりは…禁止したいけど、 execution server 自身の通信ができなくなるんだよな。とりあえず保留かな。
- exec の実行回数を記録しておく。
- getpriority(1764, __NR_execve) で exec の実行回数が帰るようにしておく。
- setpriority(1764, __NR_setuid, 0) とかで EPERM な system call が実行されたかをリセットして getpriority で取得。
- setpriority(1764, __NR_getpid, pid) で setpid 。
- setpriority(1764, __NR_setpriority, 0) だけは禁止。これのカウントで exec 回数の記録が捏造されてないかをチェック。
こんな感じでどうかなぁ。
やってみよう
(22:46)