SELinuxで組み込み機器のセキュリティを高める(後編) ―― 組み込み機器にSELinuxを適用する
● 設定手順
さて,実際にlighttpdに「httpd_t」ドメインを付与して動作させてみましょう.HTMLページを/opt/wwwに公開すると仮定して,このページを公開できるところまで設定します.設定するための一般的な手順は,図4のようになります.この手順に沿って設定していきましょう.
1) 設定の下書き
まず,大まかに設定を書き上げます.つまり,ドメイン付与のための最低限の設定を行うとともに,アクセスすると分かっているファイルやポートに対してアクセス許可設定を記述します.筆者がこの段階で作成した設定をリスト2に示します.今回は,「httpd_t」というドメインを作るので,ファイル名はsimplified_policy/httpd_t.spです.
2 domain httpd_t;
3 program /usr/sbin/lighttpd;
4 include common-relaxed.sp;
5 include daemon.sp;
6 allow /opt/www/** r,s;
7 allow /etc/lighttpd/** r,s;
8 allow /var/log/lighttpd/** r,w,s;
9 allow /usr/lib/lighttpd/** r,s,x;
10 allownet -protocol tcp -port 80 server;
11 }
便宜上,行番号を振っている.
リスト2の2~5行目は定型的な設定です.ほかのアプリケーションでも同じようになります.ドメインhttpd_tを,実行ファイル/usr/sbin/lighttpdから起動するプログラムに付与します.そして,デーモン・プログラムに共通するアクセス許可を与えています.
6~9行目は,lighttpdがアクセスすると予想されるファイルを列挙しています.Webページのコンテンツと設定ファイルに読み込みアクセスを許可しています.ログ・ファイルには書き込みを許可し,ライブラリには読み込み実行を許可しています.ここで忘れがちなのはsパーミッションの許可です.これは,ディレクトリを移動するためのパーミッションです.このパーミッションを忘れるとアプリケーションがディレクトリをオープンできないため,うまく動作しないことがあります.10行目は,80番ポートを使ってサーバとして振る舞うための権限です.この権限が必要なことは自明なので許可しています.ここでできるだけ多くの設定を書いておくと,あとの設定追加作業の手間が省けます.
2) 設定反映・ドメイン付与の確認
設定を反映し,lighttpdにhttpd_tドメインが付与されることを確認します.設定の反映のためには,まず,開発機上でポリシを生成します.作業ディレクトリは~/seedit-crossとします.
$ ./seedit-cross -d
これで,ボード側の/etc/selinux/seeditに転送すべきポリシがpolicy_rootディレクトリにできました.policy_rootの中身をボード側の/etc/selinux/seeditに転送します注4.
注4;ポリシの転送方法はいろいろ考えられるが,今後繰り返し転送することを考えると,開発機側の~/seedit-cross/policy_rootをボード側の/etc/selinux/seeditにNFSマウントするのが最も楽である.
転送したら,ボード側で設定反映作業を行います.まずは,新しいポリシをロードします.
# load_policy
これで,アクセス許可設定が格納された/etc/selinux/seedit/policy/poilcy.21の内容がカーネルにロードされます.これだけでは設定は反映されません.ファイルとタイプの関連付けが変更になることがあるためです.変更部分を反映する必要があります.SEEditでは,タイプの修正が必要なファイルの一覧をボード側の/etc/selinux/seedit/fcdiffに格納しています.
ボード側で,次のコマンドを使うことで,タイプの修正が必要なファイルのタイプを修正できます.
# restorecon -R -f /etc/selinux/seedit/ fcdiff
restoreconコマンドは,ファイルのラベルを直すコマンドです.fcdiffに列挙されたディレクトリ・ファイルのラベルを直します.-Rは,ディレクトリの中身を再帰的にたどるためのオプションです.なお,もう一度seedit-load -dを実行して結果を転送するとfcdiffが消えてしまうことに気を付けましょう.
設定を反映したら,ボード側でlighttpdを再起動してみます注5.
注5;SELinuxでは,プロセスへのドメインの付与は,プロセスの実行のタイミングで行われる.新たにドメインを付与する設定を作成した場合は,該当するプロセスを再起動する必要がある.
# /etc/init.d/lighttpd restart
そして,ドメインを確認します.
# ps -Z ... 1164 system_u:system_r:httpd_t S /usr/ sbin/lighttpd -f /etc/lighttpd/ ...
lighttpdが,「httpd_t」というドメインで動作していることが分かります.