TOMOYO Linuxをちゃんと使おう
名前だけで出オチ感があって、あまり使用・運用に関するノウハウが出てこないので、とりあえず自分で使ってみようとしたメモです。使ってみる人が増えて、もっとノウハウが増えてくれば幸せ。未だに萌系ディストリじゃないかと勘違いしてる人も多い印象だし。
いろいろと思うところあって、手軽に導入できそうなセキュリティソリューションってなんかあるっけということで、TOMOYO Linuxに思い至りました。
今回、自家用環境をDebian stretchで整備し直したので、最初からTOMOYOを有効にした状態で運用に入ってみています。ここではとりあえず導入までで、追々運用しながらenforcingするところまで行きたいです。
そもそもTOMOYO Linuxってなんだっけ?
公式ドキュメントの前書きとか、Wikipediaを参照。
セキュアOSの一種でLinux上での強制アクセス制御を実現するものです。この機能を有効にすると、あらかじめ設定もしくは学習された動作以外を制限することができ、root権限で動くプロセスであっても許可されていないものを制御することが可能です。
なので、例えば何らかの脆弱性などを突かれて「権限奪取」や「任意のコード実行」などを試みられたとしても、それがあらかじめ許可された動作でなければ拒否することが可能になります。
ちなみにTOMOYO LinuxはNTTデータが開発しているというのは有名な話ですが、DebianのTOMOYO関連パッケージのメンテナも日本の方です。
ちょっと古いけど、メンテナのやまねさんの記事にもあるように、DebianはセキュアOSに対して比較的ニュートラルなスタンスを採っています。なので、導入障壁が比較的低いTOMOYO Linuxは意義のある選択肢だと思います。
なお公式ドキュメントは結構充実していて、その分理解するのが大変ですがぜひ一読を。
まずはインストール
Debianでは公式のパッケージが提供されていますので、aptでインストールしましょう。
# apt-get install libtomoyotools3 tomoyo-tools
GRUB_CMDLINE_LINUX_DEFAULT=quiet security="tomoyo"
を追加しろというドキュメントもありますが、stretchではapt-getでインストールすると自動的に追加されます。お手軽ですね。
# /usr/lib/tomoyo/init_policy
を実行すると/etc/tomoyo以下に設定ファイルが作られるので、その後で再起動すると、それだけでTOMOYO Linuxが有効なカーネルで起動します。
ログを取るようにする
TOMOYO Linuxがアクセスを拒否したりポリシーにマッチしない動作を検知した時のログがあった方が便利です。これはtomoyo-auditdというデーモンがやってくれるので、起動してやればOKです。
イマドキの正しい作法としてはsystemdでやるべきかと思うので、
[Unit]
Description=TOMOYO Linux Auditing Daemon
[Service]
Type=forking
ExecStart=/usr/sbin/tomoyo-auditd
ExecReload=/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target
これを/etc/systemd/system/tomoyo-auditd.service
として保存しましょう。んで、
# systemctl daemon-reload
# systemctl start tomoyo-auditd.service
# systemctl enable tomoyo-auditd.service
としてやれば、tomoyo-auditdが起動して、さらにOS起動時に自動起動するようになります。
ついでにログローテートも仕込んでおけばよいでしょうか。
実際に使ってみる
# tomoyo-editpolicy
を実行すると、ポリシーエディタが起動して、デフォルトでは自動的に記録されたドメインが表示されます。詳しくは公式のドキュメントを読んで、「ドメイン」の概念と「プロファイル」「モード」の仕組みを理解しましょう。なんとなくポリシーエディタを眺めてるとわかってくるはず…。
「ドメイン」はプロセスと似たような意味合いだけどもうちょっと奥深いTOMOYO Linux固有の概念です。「モード」は大きく分けて「disabled」「learning」「permissive」「enforcing」の4つがあるのをとりあえず覚えておけばいいでしょうか。
使い方は運用とも絡むので、あらかじめ流れをイメージしておきましょう。大まかにはこんなところかなと。
- サーバの挙動を学習させて、ドメインを適切な単位でまとめたり切り離したりする
- まとめられたドメインをlearningモードに変更して、細かいアクセス要求を学習させる
- 学習したアクセス要求をパターン化してまとめる
- ある程度まとまったらpermissiveモードに変更して、漏れたポリシーがないか確認する
- 問題なさそうならそのドメインをenforcingモードにする
- 同じ作業を他のドメインでも繰り返す
どのドメインからやっていくかとかは環境や使い方によりけりですね。動作を学習させるだけでも、個々のプロセスの内部的な挙動がわかって面白いので是非動かしてみましょう。
長くなってきたのとまだこの先は模索中なので、ドメイン管理とか学習の話はまた改めて。