SELinuxで組み込み機器のセキュリティを高める(後編) ―― 組み込み機器にSELinuxを適用する
CAT760ボードの場合,zImageファイルの転送方法は次のようになります.zImageファイル(arch/sh/bootディレクトリにある)をvfatファイル・システムでフォーマットされたCompactFlashカードにコピーし,ブートローダから,
>admin <パスワード(初期設定はsilinux)> >cp cf:zimage rom:kernel
を実行します.この際,zImageが大きすぎるとコピーに失敗します.そのときは,カーネル組み込みとしてコンパイルされているもの(ext2やext3ファイル・システム,Ethernetドライバなど)をカーネル・モジュールとしてコンパイルするなどして,zImageのサイズを小さくします.
転送した後,動作確認のために新しいカーネルでブートしてみます.ブート・メッセージに,
SELinux: Initializing.
と表示されていれば,うまくいっています.
● libselinuxのクロス・コンパイル
libselinuxのクロス・コンパイルには,libsepolのヘッダ・ファイルが必要になるので,クロス・コンパイル環境のヘッダ・ファイルが格納されたディレクトリにコピーします.以下は筆者の環境でのコマンド例です.
# cp libsepol-2.0.11/include/sepol /usr/ sh4-linux-gnu/include/ -r
libselinuxのソース・ファイルのディレクトリに移動し,そのままクロス・コンパイルすると,エラーが出ることがあります.組み込み環境のglibcでは,TLS(Thread Local Storage)というスレッド関係の構造体がサポートされていないことがあるためです.このエラーを回避するために,コンパイラに-D__thread=という引き数を渡します.最も手っ取り早いのが,Makefileのall:という行の前に1行追加することで
す.EMFLAGSは,Cコンパイラに渡されるコンパイル・オプションです.
EMFLAGS+= -D__thread=
また,libselinuxのバージョンによっては,src/Make
fileのCFLAGSから-Werrorを除去しないとコンパイルが成功しない場合もありました.さらに,makeにARCH引き数もセットします.「i386」以外の適当な値(何でも良い)をセットすればOKです.ARCH変数をセットしないと,コンパイラのオプション・エラーでコンパイルに失敗します.
ここまでの作業が済んだら,クロス・コンパイルを行います.makeのオプションとして,組み込み用のオプションEMBEDDED=yが用意されています.これをセットすると,libselinuxから組み込みでは使わない機能が取り除かれ,libselinuxのサイズが小さくなります.次のようなコマンドでクロス・コンパイルできます.
$ make EMBEDDED=y CC=sh4-linux-gnu-gcc ARCH=sh4
生成されたファイルを,開発機のクロス・コンパイル環境にインストールします.なお,環境によってインストール先は異なります.
# cp include/selinux /usr/sh4-linux-gnu/include/ -r # cp libselinux.so /usr/sh4-linux-gnu/lib/ # ln -s /usr/sh4-linux-gnu/lib/libselinux.so /usr/sh4-linux-gnu/lib/libselinux.so.1
次に,libselinux.soをターゲット・ボードの/libディレクトリに転送し,/lib/libselinux.so.1というシンボリック・リンクを/lib/libselinux.soに張っておきます.