SELinuxで組み込み機器のセキュリティを高める(後編) ―― 組み込み機器にSELinuxを適用する

中村雄一

tag: 組み込み

技術解説 2008年9月 8日

3) permissiveモードで動作テスト

 正しくドメインが付与できたら,今度はpermissiveモードでlighttpdの動作を一通り行います.先ほど確認したように,現段階ではpermissiveモードですが,permissiveモードに切り換えるには,setenforce 0とします.足りない権限があるならば,この間にアクセス拒否ログが出力されます.拒否されたアクセスを許可すれば,アクセスが拒否されることはなくなり,Enforcingモードでも正しく動作するはずです.

4) ログを確認

 SELinuxのアクセス拒否ログは,カーネル・メッセージとして表示されるので,dmesgコマンドで確認可能です. 筆者の場合は,図5のようなログが出力されました.「nsswitch.conf」,「bash」,「passwd」という名前のファイルの読み込みが拒否されたことが分かります.

zu05_01.gif

図5 動作テストで出力されたアクセス拒否ログ

5) 設定を追加

 拒否されたアクセスを許可する設定を追加します.追加すべき設定を生成するには,~/seedit-crossに配置されているaudit2spdlプログラムを使うと楽です.ボード上のログを開発機に転送します.今回は,logというファイルに入っているとします.開発機側でaudit2spdlを使います.

  $./audit2spdl -l -i log


 このコマンドは,logというファイルを入力として,設定を出力します.

 出力例を図6に示します.上半分が,SELinuxのアクセス拒否ログです.下に表示されたallow設定が,それを許可するための設定です.「allow/usr/share/lighttpd/create-mime.assign.pl x,r,s;」という設定が提示されています.この設定をhttpd_t.spに追加すれば大丈夫です.ただ,実際は/usr/share/lighttpdディレクトリ全体に同じようにアクセスすると推測できるため,「allow /usr/share/lighttpd/** x,r,s;」とディレクトリ全体のアクセスを許可する方がより効率的でしょう.

#SELinux deny log:
audit(946656978.157:74): avc: denied { execute_no_trans } for pid=1293 comm="bash" path="/usr/share/lighttpd/create-mime.assign.pl" dev=jffs2 ino=987 scontext=system_u:system_r:httpd_t tcontext=system_u:object_r:usr_share_t tclass=file
#Suggested configuration
File httpd_t.sp:
allow /usr/share/lighttpd/create-mime.assign.pl x,r,s;
図6 audit2spdlの出力例

 中には,図7のようにアクセス許可すべきファイルのフルパスが記録されない場合があります.allow passwd r,s;のように,ファイル名のフルパスが抜けています.この場合は,自分でフルパスを補う必要があります.audit2spdlの出力を参考にしながら追加した設定がリスト3です.

#SELinux deny log:
audit(946658358.748:115): avc: denied { read } for pid=1431 comm="lighttpd" name="passwd" dev=jffs2 ino=231 scontext=system_u:system_r:httpd_t tcontext=system_u:object_r:etc_passwd_t tclass=file
#Suggested configuration
File httpd_t.sp:
#Failed to generate, because failed to obtain fullpath.
allow passwd r,s;
図7 ファイルのフルパスが記録されない例
allow /bin/bash r,x,s;
allow /etc/passwd r,s;
allow /etc/group r,s;
allow /etc/nsswitch.conf r,s;
allow /usr/share/lighttpd/** r,s,x;
リスト3 動作テストの結果,httpd_t.spに追加した設定
}の前に追加することに注意.


 設定を反映します.開発機側で,SPDLを通常の書式に変換します.

  $ seedit-load -d


 policy_root以下を,ボード側の/etc/selinux/seedit/に転送します.ボード側で,設定反映を行います.

  load_policy
  restorecon -R -f /etc/selinux/seedit/
  fcdiff

6) 再度permissiveモードで動作テスト

 さて,設定を追加したら再度permissiveモードで動作テストを行います.アクセス拒否ログが出ていたら,設定を追加します.テストと設定の追加をログが出なくなるまで繰り返します.

7) Enforcingモードで動作テスト

 アクセス拒否ログが出なくなったら,本番モードであるEnforcingモードにして動作をテストします.ボード側で,Enforcingモードに切り換えます.

  # setenforce 1
  # getenforce
  Enforcing


 この状態で動作テストを行い,正しく動作すれば設定は終了です.動作しない場合は,「setenforce 0」でPermissiveモードにし,3)に戻ります.

6 本番動作

 さて,設定が終わったら本番動作です.本番では,システム起動時からEnforcingモードになっている必要があります.システム起動スクリプトのどこかでEnforcingモードにしておくのがよいでしょう.再起動して最終チェックを行います.

 先ほど追加した,

  /etc/rcS.d/S05restorecon


の末尾に,

  /sbin/setenforce 1


を追加してもよいでしょう.

 ここまででSELinuxを組み込み機器で使うための基本的なことはそろったはずです.組み込み用SELinuxは適用事例がまだ少なく,改善すべき点があると思います.最新の情報は,elinux.orgのWebサイト(http://elinux.org/SELinux/)などにアップデートされると思われます.また,SELinux Policy Editorについては,筆者が主に開発しています.感想や質問などがあれば,ご連絡をお願いします.

 本記事の執筆にあたり,シリコンリナックスには,CAT760ボードの提供やカーネル2.6.24の対応などで協力をいただきました.感謝いたします.


なかむら・ゆういち
日立ソフトウェアエンジニアリング(株) 技術開発本部

組み込みキャッチアップ

お知らせ 一覧を見る

電子書籍の最新刊! FPGAマガジン No.12『ARMコアFPGA×Linux初体験』好評発売中

FPGAマガジン No.11『性能UP! アルゴリズム×手仕上げHDL』好評発売中! PDF版もあります

PICK UP用語

EV(電気自動車)

関連記事

EnOcean

関連記事

Android

関連記事

ニュース 一覧を見る
Tech Villageブログ

渡辺のぼるのロボコン・プロモータ日記

2年ぶりのブログ更新w

2016年10月 9日

Hamana Project

Hamana-8最終打ち上げ報告(その2)

2012年6月26日