Info: Version 1.8.x is available.

English Page

Last modified: $Date: 2019-02-04 23:02:53 +0900 (Mon, 04 Feb 2019) $

TOMOYO Linux on Android

このページでは、 TOMOYO Linux を arm 用 Android エミュレータ上で動作させる手順について説明します。ホスト環境として x86_64 上で動作している Ubuntu 10.04.3 を使用します。


ステップ1:必要なパッケージのインストール

https://source.android.com/source/download.html に示されているとおり、必要なパッケージをインストールします。

sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner"
sudo add-apt-repository "deb-src http://archive.canonical.com/ubuntu lucid partner"
sudo apt-get update
sudo apt-get install sun-java6-jdk
sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev libc6-dev \
lib32ncurses5-dev ia32-libs x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev \
libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown libxml2-utils xsltproc

ステップ2:環境変数の設定

以下の内容を環境変数として指定します。 ~/.bashrc などに追加しておくことをお勧めします。

export ANDROID_HOME=$HOME/mydroid/
export ANDROID_IMG=$ANDROID_HOME/image/

ステップ3: Android 環境の構築

エミュレータをコンパイルします。

mkdir -p $ANDROID_HOME
cd $ANDROID_HOME
wget https://dl-ssl.google.com/dl/googlesource/git-repo/repo
chmod 755 repo
./repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.1_r1
./repo sync
source build/envsetup.sh
lunch full-eng
make

ステップ4: Android 用カーネルの構築

カーネルをコンパイルします。 TOMOYO Linux パッチを適用する以外は通常の手順と同じです。

mkdir -p $ANDROID_HOME/tmp
cd $ANDROID_HOME/tmp/
git clone https://android.googlesource.com/kernel/goldfish
cd goldfish/
git checkout origin/android-goldfish-2.6.29
wget -O ccs-patch-1.7.3-20171111.tar.gz 'https://osdn.jp/frs/redir.php?m=jaist&f=/tomoyo/43375/ccs-patch-1.7.3-20171111.tar.gz'
wget -O ccs-patch-1.7.3-20171111.tar.gz.asc 'https://osdn.jp/frs/redir.php?m=jaist&f=/tomoyo/43375/ccs-patch-1.7.3-20171111.tar.gz.asc'
gpg ccs-patch-1.7.3-20171111.tar.gz.asc
tar -zxf ccs-patch-1.7.3-20171111.tar.gz
patch -p1 < patches/ccs-patch-2.6.29-android-goldfish.diff
sed -i -e 's:/sbin/modprobe /sbin/hotplug::' -e 's:/sbin/ccs-start:/init:' -- security/ccsecurity/Kconfig
ARCH=arm CROSS_COMPILE=$ANDROID_EABI_TOOLCHAIN/arm-linux-androideabi- make -s goldfish_armv7_defconfig
ARCH=arm CROSS_COMPILE=$ANDROID_EABI_TOOLCHAIN/arm-linux-androideabi- make -s
mkdir -p $ANDROID_IMG/tmp
cp -p arch/arm/boot/zImage $ANDROID_IMG/kernel.img

ステップ5:イメージファイルのコピー

Android エミュレータで指定するためのイメージファイルをコピーします。

cd $ANDROID_HOME/out/target/product/generic/
cp -p system.img ramdisk.img userdata.img $ANDROID_IMG

ステップ6:ホスト環境用ツールのインストール

Android エミュレータを遠隔操作するために、ホスト側に TOMOYO Linux のツールをインストールします。

cd $ANDROID_HOME/tmp/
wget -O ccs-tools-1.7.3-20120301.tar.gz 'https://osdn.jp/frs/redir.php?m=jaist&f=/tomoyo/43376/ccs-tools-1.7.3-20120301.tar.gz'
tar -zxf ccs-tools-1.7.3-20120301.tar.gz
cd ccstools
sudo apt-get install libreadline5-dev
make
sudo make install

ステップ7:エミュレータ環境用ツールのインストール

Android エミュレータ側にインストールするためのエージェントをコンパイルします。

Android エミュレータで使用するRAMディスクに含まれている /init.rc が /etc という名前で /system/etc/ ディレクトリへのシンボリックリンクを作成するため、(ステップ12で追加する TOMOYO Linux のポリシーローダである) /sbin/ccs-init が /etc/ccs/ ディレクトリを起動時に読み込むポリシーを保存しておくためのディレクトリとして使用することができません。そのため、 /etc/ccs/ の代わりに /ccs/ をポリシー用ディレクトリとして使用します。

cd $ANDROID_HOME/tmp/
wget -O agcc https://plausible.org/andy/agcc
sed -i -e 's@4\.2\.1@4.4.3@g' -e 's@interwork/@@g' -- agcc
chmod 755 agcc
./agcc -o init_policy $ANDROID_HOME/tmp/ccstools/init_policy.c
./agcc -o ccs-editpolicy-agent $ANDROID_HOME/tmp/ccstools/ccs-editpolicy-agent.c
sed -e 's:etc/ccs:ccs:g' $ANDROID_HOME/tmp/ccstools/ccs-init.c > $ANDROID_HOME/tmp/ccstools/ccs-init2.c
./agcc -o ccs-init $ANDROID_HOME/tmp/ccstools/ccs-init2.c
chmod 700 init_policy ccs-editpolicy-agent ccs-init

ステップ8:RAMディスクの編集

Android エミュレータで使用するRAMディスクにエージェントをコピーし、自動的に起動されるようにします。

cd $ANDROID_IMG/tmp/
zcat ../ramdisk.img | cpio -id
echo 'service ccs_agent /sbin/ccs-editpolicy-agent 0.0.0.0:7000' >> init.rc
echo '    class core' >> init.rc
echo '    oneshot' >> init.rc
echo >> init.rc
cp -p $ANDROID_HOME/tmp/init_policy $ANDROID_HOME/tmp/ccs-editpolicy-agent sbin/
find . -print0 | cpio -o0 -H newc | gzip -9 > ../ramdisk.img
rm sbin/init_policy

ステップ9:エミュレータの起動

Android エミュレータを起動します。カーネルはステップ4で作成したものを、RAMディスクはステップ8で作成したものを指定します。

emulator -kernel $ANDROID_IMG/kernel.img -ramdisk $ANDROID_IMG/ramdisk.img -sysdir $ANDROID_IMG -data $ANDROID_IMG/userdata.img -show-kernel

ステップ10:ポリシーの初期化

TOMOYO Linux が使用するための初期状態のポリシーを作成します。初期状態のポリシーファイルをRAMディスクの中の /ccs/ ディレクトリにコピーします。

mkdir -p $ANDROID_IMG/tmp/ccs/
adb shell /sbin/init_policy policy_dir=/data/ccs/
adb pull /data/ccs/ $ANDROID_IMG/tmp/ccs/
adb shell rm /data/ccs/\*
adb shell rmdir /data/ccs/
adb emu kill

ステップ11:ポリシーの修正

不足している file_pattern や allow_read などを例外ポリシーに追加します。以下の内容は一例です。ドメインポリシーでは全体をプロファイル1(学習モード)で動作させるように指定しています。マネージャにはエージェントプログラムだけを指定しています。

cd $ANDROID_IMG/tmp/
(
echo 'initialize_domain /init'
echo 'initialize_domain /system/bin/app_process'

echo 'file_pattern /dev/tty\$'

echo 'file_pattern /system/lib/\@.so'
echo 'allow_read /system/lib/\@.so'
echo 'file_pattern /system/framework/\*.jar'
echo 'allow_read /system/framework/\*.jar'
echo 'file_pattern /system/media/audio/\*/\*'
echo 'allow_read /system/media/audio/\*/\*'
echo 'file_pattern /system/fonts/\*.ttf'
echo 'allow_read /system/fonts/\*.ttf'
echo 'file_pattern /data/tombstones/tombstone_\$'

echo 'file_pattern /data/dalvik-cache/system@framework@\*.jar@classes.dex'
echo 'file_pattern /data/dalvik-cache/system@app@\*.jar@classes.dex'
echo 'file_pattern /data/dalvik-cache/data@app@\*@classes.dex'

echo 'file_pattern /data/local/tmp/\*.apk'
echo 'file_pattern /data/local/tmp/\*.apk'

echo 'file_pattern /data/app/\*.tmp'
echo 'file_pattern /data/data/\*/databases/\*'
echo 'file_pattern /data/data/\*/databases/'

echo 'file_pattern /data/dalvik-cache/system@framework@\*.jar@classes.dex'
echo 'file_pattern /data/dalvik-cache/system@app@\*.apk@classes.dex'
echo 'file_pattern /data/dalvik-cache/system@app-private@\*.apk@classes.dex'

echo 'file_pattern /sdcard/dcim/.thumbnails/\$.jpg'
echo 'file_pattern /sdcard/dcim/.thumbnails/.thumbdata\*'
echo 'file_pattern /sdcard/dcim/.thumbnails/.thumbdata3--\$'

echo 'path_group SYSTEM_APK /system/app/\@.apk'

echo 'path_group SYS_FILES /sys/kernel/ipv4/tcp_wmem_min'
echo 'path_group SYS_FILES /sys/kernel/ipv4/tcp_wmem_def'
echo 'path_group SYS_FILES /sys/kernel/ipv4/tcp_wmem_max'
echo 'path_group SYS_FILES /sys/kernel/ipv4/tcp_rmem_min'
echo 'path_group SYS_FILES /sys/kernel/ipv4/tcp_rmem_def'
echo 'path_group SYS_FILES /sys/kernel/ipv4/tcp_rmem_max'

echo 'allow_read /sys/devices/platform/\*battery\*/power_supply/ac/online'
echo 'allow_read /sys/devices/platform/\*battery\*/power_supply/battery/\@'

#App. specific data files
echo 'file_pattern /data/data/com.android.browser/cache/webviewCache/\*'
echo 'file_pattern /data/data/com.android.browser/app_thumbnails/\*'
) >> ccs/exception_policy.conf
(
echo '<kernel>'
echo 'use_profile 1'
) > ccs/domain_policy.conf
echo /sbin/ccs-editpolicy-agent > ccs/manager.conf

ステップ12:ポリシーローダの追加

TOMOYO Linux を有効にするために、 /sbin/ccs-init を追加します。また、 /sbin/ccs-init の動作に必要なファイルも追加します。 Android 環境では、ダイナミックリンクライブラリをロードするために /system/bin/loader が使われます。しかし、 /sbin/ccs-init が実行される時点では /system/ パーティションはまだマウントされていません。そのため、 /system/ パーティションの中にある /bin/loader をRAMディスク内の /system/bin/ ディレクトリにコピーしておく必要があります。同様に、 /system/ パーティションの中にある /lib/libc.so と /lib/libm.so をRAMディスク内の /system/lib/ ディレクトリにコピーしておく必要があります。

cd $ANDROID_IMG/tmp/
mkdir -p system/bin system/lib
cp -p $ANDROID_HOME/tmp/ccs-init sbin/
cp -p $ANDROID_HOME/out/target/product/generic/system/bin/linker system/bin/
cp -p $ANDROID_HOME/out/target/product/generic/system/lib/libc.so system/lib/
cp -p $ANDROID_HOME/out/target/product/generic/system/lib/libm.so system/lib/
chmod 755 system/bin/linker system/lib/libc.so system/lib/libm.so
find . -print0 | cpio -o0 -H newc | gzip -9 > ../ramdisk.img

ステップ13:エミュレータの起動

Android エミュレータを起動します。カーネルはステップ4で作成したものを、RAMディスクはステップ12で作成したものを指定します。

emulator -kernel $ANDROID_IMG/kernel.img -ramdisk $ANDROID_IMG/ramdisk.img -sysdir $ANDROID_IMG -data $ANDROID_IMG/userdata.img -show-kernel

ステップ14:ポート転送の指定

エミュレータ内で動作しているエージェントと通信するために、ポート転送を指定します。以下のように指定した場合、ホスト側でのポート 10000 への TCP 接続は、エミュレータ側でのポート 7000 へと転送されます。ステップ8で ccs-editpolicy-agent をポート 7000 で待機するように指定しているので、ホスト側でポート 10000 へ接続することにより、エージェントとの通信が可能になります。

adb forward tcp:10000 tcp:7000

ステップ15:エージェント経由での操作

以下のように ccs-editpolicy を起動すると、エミュレータ内のエージェント経由で ポリシーを閲覧/編集できます。

/usr/sbin/ccs-editpolicy 127.0.0.1:10000

以下のように ccs-savepolicy を実行すると、エミュレータ内のエージェント経由で現在のポリシーをRAMディスク内の /ccs/ ディレクトリに出力できます。

/usr/sbin/ccs-savepolicy edpm $ANDROID_IMG/tmp/ccs/ 127.0.0.1:10000
cd $ANDROID_IMG/tmp/
find . -print0 | cpio -o0 -H newc | gzip -9 > ../ramdisk.img

以下のように ccs-auditd を起動すると、エミュレータ内のエージェント経由でアクセス許可ログ/拒否ログを取得して保存することができます。なお、アクセスログは大量に出力されるため、ディスクの空き容量に注意してください。

/usr/sbin/ccs-auditd /tmp/grant_log /tmp/reject_log 127.0.0.1:10000

以下のように ccs-queryd を実行すると、エミュレータ内のエージェント経由で、強制モードでのポリシー違反を対話的に処理できます。 ccs-queryd を終了させるには Ctrl-C を押してください。

/usr/sbin/ccs-queryd 127.0.0.1:10000

目次へ戻る

sflogo.php