1 |
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> |
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> |
2 |
<html lang="ja-JP"> |
<html lang="ja-JP"> |
3 |
<head> |
<head> |
4 |
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> |
<meta http-equiv="content-type" content="text/html; charset=UTF-8"> |
5 |
<meta http-equiv="Content-Style-Type" content="text/css"> |
<meta http-equiv="content-style-type" content="text/css"> |
6 |
<title>TOMOYO Linux 導入手順書</title> |
<link rel="stylesheet" href="../media/tomoyolinux.css" media="all" type="text/css"> |
7 |
<link rel="stylesheet" href="http://tomoyo.sourceforge.jp/tomoyo.css" media="all" type="text/css"> |
<title>TOMOYO Linux 1.8.x : TOMOYO Linux on Android</title> |
8 |
</head> |
</head> |
9 |
|
|
10 |
<body> |
<body> |
|
<p style="text-align:right;"><a href="android-arm.html.en">English Page</a></p> |
|
|
<p style="text-align:right;">Last modified: $Date$</p> |
|
11 |
|
|
12 |
<h1>TOMOYO Linux on Android</h1> |
<div id="titlebar"> |
13 |
|
<a href="../index.html.ja"><img src="../media/tomoyotitle.png" alt="tomoyotitle.png" width="320" height="40" border="0" align="left" title="TOMOYO Linux"></a> |
14 |
|
</div> |
15 |
|
|
16 |
|
<div id="navbar" class="tomoyo-documentation"> |
17 |
|
<ul id="navbarlist"> |
18 |
|
<li id="tomoyo-home"><a href="../index.html.ja" title="TOMOYO Linux ホーム">ホーム</a></li> |
19 |
|
<li id="tomoyo-about"><a href="../about.html.ja" title="TOMOYO Linux の詳細">詳細</a></li> |
20 |
|
<li id="tomoyo-download"><a href="../download.html.ja" title="TOMOYO Linux を入手">ダウンロード</a></li> |
21 |
|
<li id="tomoyo-changelogs"><a href="../changelogs.html.ja" title="TOMOYO Linux 変更履歴">変更履歴</a></li> |
22 |
|
<li id="tomoyo-documentation"><a href="../documentation.html.ja" title="公式ドキュメント">ドキュメント</a></li> |
23 |
|
<li id="tomoyo-support"><a href="../support.html.ja" title="サポート情報">サポート</a></li> |
24 |
|
<li id="tomoyo-links"><a href="../links.html.ja" title="Links">リンク</a></li> |
25 |
|
</ul> |
26 |
|
<ul id="switch-language"> |
27 |
|
<li id="tomoyo-switch-language"><a href="android-arm.html.en" title="Go to English page">English page</a></li> |
28 |
|
</ul> |
29 |
|
</div> |
30 |
|
|
31 |
|
<div id="content"> |
32 |
|
|
33 |
<p>このページでは、 TOMOYO Linux を arm 用 Android エミュレータ上で動作させる手順について説明します。ホスト環境として x86 上で動作している Ubuntu 8.04.4 を使用します。</p> |
<div id="regular-content"> |
34 |
|
|
35 |
<hr> |
<h2>TOMOYO Linux on Android</h2> |
36 |
|
|
37 |
<h2>ステップ1:必要なパッケージのインストール</h2> |
<p>このページでは、 TOMOYO Linux を arm 用 Android エミュレータ上で動作させる手順について説明します。ホスト環境として x86_64 上で動作している Ubuntu 10.04.3 を使用します。</p> |
38 |
|
|
39 |
|
<h3>ステップ1:必要なパッケージのインストール</h3> |
40 |
|
|
41 |
<p><a href="http://source.android.com/source/download.html">http://source.android.com/source/download.html</a> に示されているとおり、必要なパッケージをインストールします。</p> |
<p><a href="http://source.android.com/source/download.html">http://source.android.com/source/download.html</a> に示されているとおり、必要なパッケージをインストールします。</p> |
42 |
|
|
43 |
<table border="1"> |
<pre class="command"> |
44 |
<tr><td> |
sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner" |
45 |
sudo apt-get install git-core gnupg sun-java5-jdk flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev |
sudo add-apt-repository "deb-src http://archive.canonical.com/ubuntu lucid partner" |
46 |
</td></tr> |
sudo apt-get update |
47 |
</table> |
sudo apt-get install sun-java6-jdk |
48 |
|
sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev libc6-dev \ |
49 |
|
lib32ncurses5-dev ia32-libs x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev \ |
50 |
|
libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown libxml2-utils xsltproc |
51 |
|
</pre> |
52 |
|
|
53 |
|
<h3>ステップ2:環境変数の設定</h3> |
54 |
|
|
55 |
|
<p>以下の内容を環境変数として指定します。 ~/.bashrc などに追加しておくことをお勧めします。</p> |
56 |
|
|
57 |
|
<pre class="command"> |
58 |
|
export ANDROID_HOME=$HOME/mydroid/ |
59 |
|
export ANDROID_IMG=$ANDROID_HOME/image/ |
60 |
|
</pre> |
61 |
|
|
62 |
|
<p>必要なディレクトリを作成します。</p> |
63 |
|
|
64 |
|
<pre class="command"> |
65 |
|
mkdir -p $ANDROID_HOME |
66 |
|
mkdir -p $ANDROID_HOME/tmp |
67 |
|
mkdir -p $ANDROID_HOME/tmp/policy |
68 |
|
mkdir -p $ANDROID_IMG |
69 |
|
mkdir -p $ANDROID_IMG/tmp |
70 |
|
sudo mkdir -p /var/log/tomoyo |
71 |
|
sudo chown -R `id -u` /var/log/tomoyo/ |
72 |
|
</pre> |
73 |
|
|
74 |
<h2>ステップ2:環境変数の設定</h2> |
<h3>ステップ3: Android 環境の構築</h3> |
75 |
|
|
76 |
<p>以下の内容を環境変数として指定します。 ~/.bashrc などに追加しておくことをお勧めします。 arm-eabi-4.2.1 の部分は arm-eabi-4.3.1 または arm-eabi-4.4.0 にしても構いません。</p> |
<p>エミュレータをコンパイルします。</p> |
77 |
|
|
78 |
<table border="1"> |
<pre class="command"> |
79 |
<tr><td> |
cd $ANDROID_HOME |
80 |
export ANDROID_HOME=$HOME/mydroid/<br> |
wget https://dl-ssl.google.com/dl/googlesource/git-repo/repo |
81 |
export ANDROID_IMG=$ANDROID_HOME/image/<br> |
chmod 755 repo |
82 |
export ANDROID_TOOLCHAIN=$ANDROID_HOME/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/<br> |
./repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.1_r1 |
83 |
export PATH=$PATH:$ANDROID_HOME/out/host/linux-x86/bin/:$ANDROID_TOOLCHAIN |
./repo sync |
84 |
</td></tr> |
source build/envsetup.sh |
85 |
</table> |
lunch full-eng |
86 |
|
make |
87 |
|
</pre> |
88 |
|
|
89 |
<h2>ステップ3: Android 環境の構築</h2> |
<h3>ステップ4:ホスト環境用ツールのインストール</h3> |
90 |
|
|
91 |
<p>エミュレータをコンパイルします。</p> |
<p>Android エミュレータを遠隔操作するために、ホスト側に TOMOYO Linux のツールをインストールします。</p> |
92 |
|
|
93 |
<table border="1"> |
<pre class="command"> |
94 |
<tr><td> |
cd $ANDROID_HOME/tmp/ |
95 |
mkdir -p $ANDROID_HOME<br> |
wget -O ccs-tools-1.8.3-20120805.tar.gz 'http://sourceforge.jp/frs/redir.php?m=jaist&f=/tomoyo/49693/ccs-tools-1.8.3-20120805.tar.gz' |
96 |
cd $ANDROID_HOME<br> |
wget -O ccs-tools-1.8.3-20120805.tar.gz.asc 'http://sourceforge.jp/frs/redir.php?m=jaist&f=/tomoyo/49693/ccs-tools-1.8.3-20120805.tar.gz.asc' |
97 |
wget http://android.git.kernel.org/repo<br> |
wget http://I-love.SAKURA.ne.jp/kumaneko-key |
98 |
chmod 755 repo<br> |
gpg --import kumaneko-key |
99 |
./repo init -u git://android.git.kernel.org/platform/manifest.git<br> |
gpg ccs-tools-1.8.3-20120805.tar.gz.asc |
100 |
./repo sync<br> |
tar -zxf ccs-tools-1.8.3-20120805.tar.gz |
101 |
|
cd ccs-tools |
102 |
make |
make |
103 |
</td></tr> |
sudo make install |
104 |
</table> |
</pre> |
105 |
|
|
106 |
<h2>ステップ4: Android 用カーネルの構築</h2> |
<p>また、ポリシーをチューニングするためのツールを使うので、そのための準備を行います。</p> |
107 |
|
|
108 |
<p>カーネルをコンパイルします。 TOMOYO Linux パッチを適用する以外は通常の手順と同じです。</p> |
<pre class="command"> |
109 |
|
sudo /usr/lib/ccs/init_policy |
110 |
|
sudo chown -R `id -u` /etc/ccs/ |
111 |
|
echo 'rewrite head_pattern /acct/uid/\$/' >> /etc/ccs/tools/patternize.conf |
112 |
|
</pre> |
113 |
|
|
114 |
|
<h3>ステップ5:エミュレータ環境用ツールのインストール</h3> |
115 |
|
|
116 |
|
<p>Android エミュレータ側にインストールするためのエージェントをコンパイルします。</p> |
117 |
|
|
118 |
<table border="1"> |
<pre class="command"> |
119 |
<tr><td> |
cd $ANDROID_HOME/tmp/ |
120 |
mkdir -p $ANDROID_HOME/tmp<br> |
wget -O agcc http://plausible.org/andy/agcc |
121 |
cd $ANDROID_HOME/tmp/<br> |
sed -i -e 's@4\.2\.1@4.4.3@g' -e 's@interwork/@@g' -- agcc |
122 |
wget -O kernel-source.tar.gz 'http://android.git.kernel.org/?p=kernel/common.git;a=snapshot;h=b0d93fb0426911d0329f861f22c59f1c72cff815;sf=tgz'<br> |
chmod 755 agcc |
123 |
tar -zxf kernel-source.tar.gz<br> |
./agcc -o ccs-editpolicy-agent $ANDROID_HOME/tmp/ccs-tools/usr_lib_ccs/ccs-editpolicy-agent.c |
124 |
cd common/<br> |
chmod 700 ccs-editpolicy-agent |
125 |
wget -O ccs-patch-1.8.0-20101122.tar.gz 'http://sourceforge.jp/frs/redir.php?f=/tomoyo/49684/ccs-patch-1.8.0-20101122.tar.gz'<br> |
</pre> |
126 |
wget -O ccs-patch-1.8.0-20101122.tar.gz.asc 'http://sourceforge.jp/frs/redir.php?f=/tomoyo/49684/ccs-patch-1.8.0-20101122.tar.gz.asc'<br> |
|
127 |
gpg ccs-patch-1.8.0-20101122.tar.gz.asc<br> |
<h3>ステップ6:初期ポリシーの作成</h3> |
128 |
tar -zxf ccs-patch-1.8.0-20101122.tar.gz<br> |
|
129 |
patch -p1 < patches/ccs-patch-2.6.29-android-goldfish.diff<br> |
<p>カーネル内に埋め込んでおくためのポリシーを作成します。</p> |
130 |
sed -i -e 's:/sbin/modprobe /sbin/hotplug::' -e 's:/sbin/ccs-start:/init:' -- security/ccsecurity/Kconfig<br> |
|
131 |
ARCH=arm CROSS_COMPILE=$ANDROID_TOOLCHAIN/arm-eabi- make goldfish_defconfig<br> |
<ul> |
132 |
ARCH=arm CROSS_COMPILE=$ANDROID_TOOLCHAIN/arm-eabi- make -s<br> |
<li>全てのドメインを学習モードに設定する。</li> |
133 |
mkdir -p $ANDROID_IMG/tmp<br> |
<li>ユーザIDまたはグループIDが 1 ~ 9999 に変化した時点で <kernel> //./system-user ドメインへと遷移する</li> |
134 |
|
<li>ユーザIDまたはグループIDが 10000 以上に変化した時点で <kernel> //./app-user ドメインへと遷移する</li> |
135 |
|
<li>予めある程度のアクセス許可を与えておく</li> |
136 |
|
<li>個々の Android アプリは区別しない</li> |
137 |
|
<li>ポリシーを変更できるのは /sbin/ccs-editpolicy-agent のみとする</li> |
138 |
|
</ul> |
139 |
|
|
140 |
|
<p>という設定での例を示します。 <kernel> //./app-user ドメインに対して ANY_PATHNAME への書き込み許可は与えすぎです。実際に利用する場合には例えば /system/ 以下への書き込みを禁止するなどの対策を行うべきです。</p> |
141 |
|
|
142 |
|
<pre class="command"> |
143 |
|
cd $ANDROID_HOME/tmp/policy/ |
144 |
|
cat > profile.conf << "EOF" |
145 |
|
PROFILE_VERSION=20100903 |
146 |
|
0-COMMENT=-----Disabled Mode----- |
147 |
|
0-PREFERENCE={ max_audit_log=1024 max_learning_entry=2048 enforcing_penalty=0 } |
148 |
|
0-CONFIG={ mode=disabled grant_log=no reject_log=yes } |
149 |
|
1-COMMENT=-----Learning Mode----- |
150 |
|
1-PREFERENCE={ max_audit_log=1024 max_learning_entry=2048 enforcing_penalty=0 } |
151 |
|
1-CONFIG={ mode=learning grant_log=no reject_log=yes } |
152 |
|
2-COMMENT=-----Permissive Mode----- |
153 |
|
2-PREFERENCE={ max_audit_log=1024 max_learning_entry=2048 enforcing_penalty=0 } |
154 |
|
2-CONFIG={ mode=permissive grant_log=no reject_log=yes } |
155 |
|
3-COMMENT=-----Enforcing Mode----- |
156 |
|
3-PREFERENCE={ max_audit_log=1024 max_learning_entry=2048 enforcing_penalty=0 } |
157 |
|
3-CONFIG={ mode=enforcing grant_log=no reject_log=yes } |
158 |
|
EOF |
159 |
|
cat > exception_policy.conf << "EOF" |
160 |
|
path_group ANY_PATHNAME / |
161 |
|
path_group ANY_PATHNAME /\{\*\}/ |
162 |
|
path_group ANY_PATHNAME /\{\*\}/\* |
163 |
|
path_group ANY_PATHNAME /\* |
164 |
|
path_group ANY_PATHNAME \*:/ |
165 |
|
path_group ANY_PATHNAME \*:/\{\*\}/ |
166 |
|
path_group ANY_PATHNAME \*:/\{\*\}/\* |
167 |
|
path_group ANY_PATHNAME \*:/\* |
168 |
|
path_group ANY_PATHNAME \*:[\$] |
169 |
|
path_group ANY_PATHNAME socket:[family=\$:type=\$:protocol=\$] |
170 |
|
acl_group 0 file getattr @ANY_PATHNAME |
171 |
|
acl_group 0 file ioctl @ANY_PATHNAME 0-0xFFFFFFFF |
172 |
|
acl_group 0 file read /dev/urandom |
173 |
|
acl_group 0 file read /system/bin/linker |
174 |
|
acl_group 0 file read /system/lib/lib\*.so |
175 |
|
acl_group 0 misc env _ |
176 |
|
acl_group 0 misc env ANDROID_ASSETS |
177 |
|
acl_group 0 misc env ANDROID_BOOTLOGO |
178 |
|
acl_group 0 misc env ANDROID_DATA |
179 |
|
acl_group 0 misc env ANDROID_DNS_MODE |
180 |
|
acl_group 0 misc env ANDROID_PROPERTY_WORKSPACE |
181 |
|
acl_group 0 misc env ANDROID_ROOT |
182 |
|
acl_group 0 misc env ANDROID_SOCKET_\* |
183 |
|
acl_group 0 misc env ASEC_MOUNTPOINT |
184 |
|
acl_group 0 misc env BOOTCLASSPATH |
185 |
|
acl_group 0 misc env EXTERNAL_STORAGE |
186 |
|
acl_group 0 misc env HOME |
187 |
|
acl_group 0 misc env LD_LIBRARY_PATH |
188 |
|
acl_group 0 misc env LOOP_MOUNTPOINT |
189 |
|
acl_group 0 misc env ndns |
190 |
|
acl_group 0 misc env PATH |
191 |
|
acl_group 0 misc env qemu |
192 |
|
acl_group 0 misc env RANDOM |
193 |
|
acl_group 0 misc env SHELL |
194 |
|
acl_group 0 misc env TERM |
195 |
|
acl_group 0 task auto_domain_transition <kernel> //./app-user task.gid=10000-4294967295 |
196 |
|
acl_group 0 task auto_domain_transition <kernel> //./app-user task.uid=10000-4294967295 |
197 |
|
acl_group 0 task auto_domain_transition <kernel> //./system-user task.gid=1-9999 |
198 |
|
acl_group 0 task auto_domain_transition <kernel> //./system-user task.uid=1-9999 |
199 |
|
acl_group 1 file getattr @ANY_PATHNAME |
200 |
|
acl_group 1 file ioctl @ANY_PATHNAME 0-0xFFFFFFFF |
201 |
|
acl_group 1 file read /dev/urandom |
202 |
|
acl_group 1 file read /system/bin/linker |
203 |
|
acl_group 1 file read /system/lib/lib\*.so |
204 |
|
acl_group 1 misc env _ |
205 |
|
acl_group 1 misc env ANDROID_ASSETS |
206 |
|
acl_group 1 misc env ANDROID_BOOTLOGO |
207 |
|
acl_group 1 misc env ANDROID_DATA |
208 |
|
acl_group 1 misc env ANDROID_PROPERTY_WORKSPACE |
209 |
|
acl_group 1 misc env ANDROID_ROOT |
210 |
|
acl_group 1 misc env ANDROID_SOCKET_\* |
211 |
|
acl_group 1 misc env ASEC_MOUNTPOINT |
212 |
|
acl_group 1 misc env BOOTCLASSPATH |
213 |
|
acl_group 1 misc env EXTERNAL_STORAGE |
214 |
|
acl_group 1 misc env HOME |
215 |
|
acl_group 1 misc env HOSTNAME |
216 |
|
acl_group 1 misc env LD_LIBRARY_PATH |
217 |
|
acl_group 1 misc env LOOP_MOUNTPOINT |
218 |
|
acl_group 1 misc env MKSH |
219 |
|
acl_group 1 misc env PATH |
220 |
|
acl_group 1 misc env PS1 |
221 |
|
acl_group 1 misc env RANDOM |
222 |
|
acl_group 1 misc env SHELL |
223 |
|
acl_group 1 misc env TERM |
224 |
|
acl_group 1 misc env USER |
225 |
|
EOF |
226 |
|
cat > domain_policy.conf << "EOF" |
227 |
|
<kernel> |
228 |
|
use_profile 1 |
229 |
|
use_group 0 |
230 |
|
|
231 |
|
<kernel> //./system-user |
232 |
|
use_profile 1 |
233 |
|
use_group 1 |
234 |
|
|
235 |
|
file read/write/unlink/rmdir/truncate/symlink @ANY_PATHNAME task.euid=1-9999 task.egid=1-9999 |
236 |
|
file create/mkdir/mkfifo/mksock/chmod @ANY_PATHNAME 0-0777 task.euid=1-9999 task.egid=1-9999 |
237 |
|
file link/rename @ANY_PATHNAME @ANY_PATHNAME task.euid=1-9999 task.egid=1-9999 |
238 |
|
|
239 |
|
<kernel> //./app-user |
240 |
|
use_profile 1 |
241 |
|
use_group 1 |
242 |
|
|
243 |
|
file read/write/unlink/rmdir/truncate/symlink @ANY_PATHNAME task.euid=10000-4294967295 task.egid=10000-4294967295 |
244 |
|
file create/mkdir/mkfifo/mksock/chmod @ANY_PATHNAME 0-0777 task.euid=10000-4294967295 task.egid=10000-4294967295 |
245 |
|
file link/rename @ANY_PATHNAME @ANY_PATHNAME task.euid=10000-4294967295 task.egid=10000-4294967295 |
246 |
|
EOF |
247 |
|
echo /sbin/ccs-editpolicy-agent > manager.conf |
248 |
|
echo > stat.conf |
249 |
|
</pre> |
250 |
|
|
251 |
|
<h3>ステップ7: Android 用カーネルの構築</h3> |
252 |
|
|
253 |
|
<p>カーネルのソースコードをダウンロードして展開します。</p> |
254 |
|
|
255 |
|
<pre class="command"> |
256 |
|
cd $ANDROID_HOME/tmp/ |
257 |
|
git clone https://android.googlesource.com/kernel/goldfish |
258 |
|
cd goldfish/ |
259 |
|
git checkout origin/android-goldfish-2.6.29 |
260 |
|
ARCH=arm CROSS_COMPILE=$ANDROID_EABI_TOOLCHAIN/arm-linux-androideabi- make -s goldfish_armv7_defconfig |
261 |
|
</pre> |
262 |
|
|
263 |
|
<p>TOMOYO Linux パッチを適用します。</p> |
264 |
|
|
265 |
|
<pre class="command"> |
266 |
|
cd $ANDROID_HOME/tmp/goldfish/ |
267 |
|
wget -O ccs-patch-1.8.3-20121111.tar.gz 'http://sourceforge.jp/frs/redir.php?m=jaist&f=/tomoyo/49684/ccs-patch-1.8.3-20121111.tar.gz' |
268 |
|
wget -O ccs-patch-1.8.3-20121111.tar.gz.asc 'http://sourceforge.jp/frs/redir.php?m=jaist&f=/tomoyo/49684/ccs-patch-1.8.3-20121111.tar.gz.asc' |
269 |
|
gpg ccs-patch-1.8.3-20121111.tar.gz.asc |
270 |
|
tar -zxf ccs-patch-1.8.3-20121111.tar.gz |
271 |
|
patch -p1 < patches/ccs-patch-2.6.29-android-goldfish.diff |
272 |
|
sed -e 's/# CONFIG_CCSECURITY_OMIT_USERSPACE_LOADER is not set/CONFIG_CCSECURITY_OMIT_USERSPACE_LOADER=y/' -- config.ccs >> .config |
273 |
|
mkdir -p security/ccsecurity/policy/ |
274 |
|
cp -p $ANDROID_HOME/tmp/policy/*.conf security/ccsecurity/policy/ |
275 |
|
</pre> |
276 |
|
|
277 |
|
<p>カーネルをコンパイルします。</p> |
278 |
|
|
279 |
|
<pre class="command"> |
280 |
|
cd $ANDROID_HOME/tmp/goldfish/ |
281 |
|
ARCH=arm CROSS_COMPILE=$ANDROID_EABI_TOOLCHAIN/arm-linux-androideabi- make -s |
282 |
cp -p arch/arm/boot/zImage $ANDROID_IMG/kernel.img |
cp -p arch/arm/boot/zImage $ANDROID_IMG/kernel.img |
283 |
</td></tr> |
</pre> |
|
</table> |
|
284 |
|
|
285 |
<h2>ステップ5:イメージファイルのコピー</h2> |
<h3>ステップ8:イメージファイルのコピー</h3> |
286 |
|
|
287 |
<p>Android エミュレータで指定するためのイメージファイルをコピーします。</p> |
<p>Android エミュレータで指定するためのイメージファイルをコピーします。</p> |
288 |
|
|
289 |
<table border="1"> |
<pre class="command"> |
290 |
<tr><td> |
cd $ANDROID_HOME/out/target/product/generic/ |
|
cd $ANDROID_HOME/out/target/product/generic/<br> |
|
291 |
cp -p system.img ramdisk.img userdata.img $ANDROID_IMG |
cp -p system.img ramdisk.img userdata.img $ANDROID_IMG |
292 |
</td></tr> |
</pre> |
|
</table> |
|
293 |
|
|
294 |
<h2>ステップ6:ホスト環境用ツールのインストール</h2> |
<h3>ステップ9:RAMディスクの編集</h3> |
295 |
|
|
296 |
<p>Android エミュレータを遠隔操作するために、ホスト側に TOMOYO Linux のツールをインストールします。</p> |
<p>Android エミュレータで使用するRAMディスクにエージェントをコピーし、自動的に起動されるようにします。</p> |
297 |
|
|
298 |
<table border="1"> |
<pre class="command"> |
299 |
<tr><td> |
cd $ANDROID_IMG/tmp/ |
300 |
cd $ANDROID_HOME/tmp/<br> |
zcat ../ramdisk.img | cpio -id |
301 |
wget -O ccs-tools-1.8.0-20101122.tar.gz 'http://sourceforge.jp/frs/redir.php?f=/tomoyo/49693/ccs-tools-1.8.0-20101122.tar.gz'<br> |
echo >> init.rc |
302 |
wget -O ccs-tools-1.8.0-20101122.tar.gz.asc 'http://sourceforge.jp/frs/redir.php?f=/tomoyo/49693/ccs-tools-1.8.0-20101122.tar.gz.asc'<br> |
echo 'service ccs_agent /sbin/ccs-editpolicy-agent 0.0.0.0:7000' >> init.rc |
303 |
gpg ccs-tools-1.8.0-20101122.tar.gz.asc<br> |
echo ' class core' >> init.rc |
304 |
tar -zxf ccs-tools-1.8.0-20101122.tar.gz<br> |
echo ' oneshot' >> init.rc |
305 |
cd ccstools<br> |
cp -p $ANDROID_HOME/tmp/ccs-editpolicy-agent sbin/ |
306 |
sudo apt-get install libreadline-dev<br> |
find . -print0 | cpio -o0 -H newc | gzip -9 > ../ramdisk.img |
307 |
make<br> |
</pre> |
|
sudo make install |
|
|
</td></tr> |
|
|
</table> |
|
308 |
|
|
309 |
<h2>ステップ7:エミュレータ環境用ツールのインストール</h2> |
<h3>ステップ10:エミュレータの起動</h3> |
310 |
|
|
311 |
<p>Android エミュレータ側にインストールするためのエージェントをコンパイルします。</p> |
<p>Android エミュレータを起動します。カーネルはステップ7で作成したものを、RAMディスクはステップ9で作成したものを指定します。</p> |
312 |
|
|
313 |
<p>Android エミュレータで使用するRAMディスクに含まれている /init.rc が /etc という名前で /system/etc/ ディレクトリへのシンボリックリンクを作成するため、(ステップ13で追加する TOMOYO Linux のポリシーローダである) /sbin/ccs-init が /etc/ccs/ ディレクトリを起動時に読み込むポリシーを保存しておくためのディレクトリとして使用することができません。そのため、 /etc/ccs/ の代わりに /ccs/ をポリシー用ディレクトリとして使用します。</p> |
<pre class="command"> |
314 |
|
emulator -kernel $ANDROID_IMG/kernel.img -ramdisk $ANDROID_IMG/ramdisk.img -sysdir $ANDROID_IMG \ |
315 |
|
-data $ANDROID_IMG/userdata.img -show-kernel |
316 |
|
</pre> |
317 |
|
|
318 |
<table border="1"> |
<h3>ステップ11:ポート転送の指定</h3> |
|
<tr><td> |
|
|
cd $ANDROID_HOME/tmp/<br> |
|
|
wget -O agcc http://plausible.org/andy/agcc<br> |
|
|
chmod 755 agcc<br> |
|
|
./agcc -o init_policy $ANDROID_HOME/tmp/ccstools/usr_lib_ccs/init_policy.c<br> |
|
|
./agcc -o ccs-editpolicy-agent $ANDROID_HOME/tmp/ccstools/usr_lib_ccs/ccs-editpolicy-agent.c<br> |
|
|
sed -e 's:etc/ccs:ccs:g' $ANDROID_HOME/tmp/ccstools/sbin/ccs-init.c > $ANDROID_HOME/tmp/ccstools/ccs-init2.c<br> |
|
|
./agcc -o ccs-init $ANDROID_HOME/tmp/ccstools/ccs-init2.c<br> |
|
|
chmod 700 init_policy ccs-editpolicy-agent ccs-init |
|
|
</td></tr> |
|
|
</table> |
|
319 |
|
|
320 |
<h2>ステップ8:RAMディスクの編集</h2> |
<p>エミュレータ内で動作しているエージェントと通信するために、ポート転送を指定します。以下のように指定した場合、ホスト側でのポート 10000 への TCP 接続は、エミュレータ側でのポート 7000 へと転送されます。ステップ9で ccs-editpolicy-agent をポート 7000 で待機するように指定しているので、ホスト側でポート 10000 へ接続することにより、エージェントとの通信が可能になります。</p> |
321 |
|
|
322 |
<p>Android エミュレータで使用するRAMディスクにエージェントをコピーし、自動的に起動されるようにします。</p> |
<pre class="command"> |
323 |
|
adb forward tcp:10000 tcp:7000 |
324 |
|
</pre> |
325 |
|
|
326 |
<table border="1"> |
<h3>ステップ12:エージェント経由での操作</h3> |
|
<tr><td> |
|
|
cd $ANDROID_IMG/tmp/<br> |
|
|
zcat ../ramdisk.img | cpio -id<br> |
|
|
echo 'service ccs_agent /sbin/ccs-editpolicy-agent 0.0.0.0:7000' >> init.rc<br> |
|
|
echo ' oneshot' >> init.rc<br> |
|
|
echo >> init.rc<br> |
|
|
cp -p $ANDROID_HOME/tmp/init_policy $ANDROID_HOME/tmp/ccs-editpolicy-agent sbin/<br> |
|
|
find . -print0 | cpio -o0 -H newc | gzip -9 > ../ramdisk.img |
|
|
</td></tr> |
|
|
</table> |
|
327 |
|
|
328 |
<h2>ステップ9:エミュレータの起動</h2> |
<p>以下のように ccs-editpolicy を起動すると、エミュレータ内のエージェント経由で ポリシーを閲覧/編集できます。</p> |
329 |
|
|
330 |
<p>Android エミュレータを起動します。カーネルはステップ4で作成したものを、RAMディスクはステップ8で作成したものを指定します。</p> |
<pre class="command"> |
331 |
|
/usr/sbin/ccs-editpolicy 127.0.0.1:10000 |
332 |
|
</pre> |
333 |
|
|
334 |
<table border="1"> |
<p>以下のように ccs-auditd を起動すると、エミュレータ内のエージェント経由でアクセス許可ログ/拒否ログを取得して保存することができます。なお、アクセスログは大量に出力されるため、ディスクの空き容量に注意してください。</p> |
|
<tr><td> |
|
|
emulator -kernel $ANDROID_IMG/kernel.img -ramdisk $ANDROID_IMG/ramdisk.img -sysdir $ANDROID_IMG -data $ANDROID_IMG/userdata.img -show-kernel |
|
|
</td></tr> |
|
|
</table> |
|
335 |
|
|
336 |
<h2>ステップ10:必要なファイルのコピー</h2> |
<pre class="command"> |
337 |
|
/usr/sbin/ccs-auditd 127.0.0.1:10000 |
338 |
|
</pre> |
339 |
|
|
340 |
<p>/sbin/ccs-init の動作に必要なファイルをRAMディスクにコピーします。 Android 環境では、ダイナミックリンクライブラリをロードするために /system/bin/loader が使われます。しかし、 /sbin/ccs-init が実行される時点では /system/ パーティションはまだマウントされていません。そのため、 /system/ パーティションの中にある /bin/loader をRAMディスク内の /system/bin/ ディレクトリにコピーしておく必要があります。同様に、 /system/ パーティションの中にある /lib/libc.so と /lib/libm.so をRAMディスク内の /lib/ ディレクトリにコピーしておく必要があります。</p> |
<p>以下のように ccs-queryd を実行すると、エミュレータ内のエージェント経由で、強制モードでのポリシー違反を対話的に処理できます。 ccs-queryd を終了させるには Ctrl-C を押してください。</p> |
341 |
|
|
342 |
<table border="1"> |
<pre class="command"> |
343 |
<tr><td> |
/usr/sbin/ccs-queryd 127.0.0.1:10000 |
344 |
cd $ANDROID_IMG/tmp/<br> |
</pre> |
|
mkdir -p system/bin lib<br> |
|
|
adb pull /system/bin/linker system/bin/<br> |
|
|
adb pull /system/lib/libc.so lib/<br> |
|
|
adb pull /system/lib/libm.so lib/<br> |
|
|
chmod 755 system/bin/linker lib/libc.so lib/libm.so<br> |
|
|
</td></tr> |
|
|
</table> |
|
345 |
|
|
346 |
<h2>ステップ11:ポリシーの初期化</h2> |
<p>ワイルドカード化を行うには以下のようにしてください。ワイルドカード化のルールは /etc/ccs/tools/patternize.conf で定義されているので、適宜編集してください。</p> |
347 |
|
|
348 |
<p>TOMOYO Linux が使用するための初期状態のポリシーを作成します。初期状態のポリシーファイルをRAMディスクの中の /ccs/ ディレクトリにコピーします。</p> |
<pre class="command"> |
349 |
|
cd $ANDROID_HOME/tmp/policy/ |
350 |
|
/usr/sbin/ccs-savepolicy -d 127.0.0.1:10000 > domain_policy.old |
351 |
|
/usr/sbin/ccs-patternize < domain_policy.old > domain_policy.new |
352 |
|
/usr/sbin/ccs-diffpolicy domain_policy.old domain_policy.new > domain_policy.diff |
353 |
|
less domain_policy.diff |
354 |
|
/usr/sbin/ccs-loadpolicy -d 127.0.0.1:10000 < domain_policy.diff |
355 |
|
</pre> |
356 |
|
|
357 |
<table border="1"> |
<h3>ステップ13:ポリシーのアップデート</h3> |
|
<tr><td> |
|
|
mkdir -p $ANDROID_IMG/tmp/ccs/<br> |
|
|
adb shell /sbin/init_policy policy_dir=/data/ccs/<br> |
|
|
adb pull /data/ccs/ $ANDROID_IMG/tmp/ccs/<br> |
|
|
adb shell rm /data/ccs/\*<br> |
|
|
adb shell rmdir /data/ccs/<br> |
|
|
adb emu kill |
|
|
</td></tr> |
|
|
</table> |
|
358 |
|
|
359 |
<h2>ステップ12:ポリシーの修正</h2> |
<p>ポリシーはメモリ上にのみ存在しているため、エミュレータを終了すると失われてしまいます。エミュレータを終了する前に忘れずにポリシーを保存するようにしてください。</p> |
360 |
|
|
361 |
<p>不足している acl_group 0 file read などを例外ポリシーに追加します。以下の内容は一例です。ドメインポリシーでは全体をプロファイル1(学習モード)で動作させるように指定しています。マネージャにはエージェントプログラムだけを指定しています。</p> |
<pre class="command"> |
362 |
|
cd $ANDROID_HOME/tmp/policy/ |
363 |
|
/usr/sbin/ccs-savepolicy -e 127.0.0.1:10000 > exception_policy.conf |
364 |
|
/usr/sbin/ccs-savepolicy -d 127.0.0.1:10000 > domain_policy.conf |
365 |
|
/usr/sbin/ccs-savepolicy -p 127.0.0.1:10000 > profile.conf |
366 |
|
</pre> |
367 |
|
|
368 |
<table border="1"> |
<p>また、保存したポリシーをカーネル内に埋め込むには以下のように行ってください。</p> |
|
<tr><td> |
|
|
cd $ANDROID_IMG/tmp/<br> |
|
|
(<br> |
|
|
echo 'initialize_domain /init'<br> |
|
|
echo 'initialize_domain /system/bin/app_process'<br> |
|
|
<br> |
|
|
echo 'acl_group 0 file read /system/lib/\@.so'<br> |
|
|
echo 'acl_group 0 file read /system/framework/\*.jar'<br> |
|
|
echo 'acl_group 0 file read /system/media/audio/\*/\*'<br> |
|
|
echo 'acl_group 0 file read /system/fonts/\*.ttf'<br> |
|
|
<br> |
|
|
echo 'path_group SYSTEM_APK /system/app/\@.apk'<br> |
|
|
<br> |
|
|
echo 'path_group SYS_FILES sys:kernel/ipv4/tcp_wmem_min'<br> |
|
|
echo 'path_group SYS_FILES sys:kernel/ipv4/tcp_wmem_def'<br> |
|
|
echo 'path_group SYS_FILES sys:kernel/ipv4/tcp_wmem_max'<br> |
|
|
echo 'path_group SYS_FILES sys:kernel/ipv4/tcp_rmem_min'<br> |
|
|
echo 'path_group SYS_FILES sys:kernel/ipv4/tcp_rmem_def'<br> |
|
|
echo 'path_group SYS_FILES sys:kernel/ipv4/tcp_rmem_max'<br> |
|
|
<br> |
|
|
echo 'acl_group 0 file read sys:devices/platform/\*battery\*/power_supply/ac/online'<br> |
|
|
echo 'acl_group 0 file read sys:devices/platform/\*battery\*/power_supply/battery/\@'<br> |
|
|
<br> |
|
|
#App. specific data files<br> |
|
|
) >> ccs/exception_policy.conf<br> |
|
|
(<br> |
|
|
echo '<kernel>'<br> |
|
|
echo 'use_profile 1'<br> |
|
|
) > ccs/domain_policy.conf<br> |
|
|
echo /sbin/ccs-editpolicy-agent > ccs/manager.conf |
|
|
</td></tr> |
|
|
</table> |
|
369 |
|
|
370 |
<h2>ステップ13:ポリシーローダの追加</h2> |
<pre class="command"> |
371 |
|
cp -p $ANDROID_HOME/tmp/policy/*.conf $ANDROID_HOME/tmp/goldfish/security/ccsecurity/policy/ |
372 |
|
</pre> |
373 |
|
|
374 |
<p>TOMOYO Linux を有効にするために、 ccs-init を追加します。</p> |
<p>カーネルを再コンパイルします。</p> |
375 |
|
|
376 |
<table border="1"> |
<pre class="command"> |
377 |
<tr><td> |
cd $ANDROID_HOME/tmp/goldfish/ |
378 |
cd $ANDROID_IMG/tmp/<br> |
ARCH=arm CROSS_COMPILE=$ANDROID_EABI_TOOLCHAIN/arm-linux-androideabi- make -s |
379 |
rm sbin/init_policy<br> |
cp -p arch/arm/boot/zImage $ANDROID_IMG/kernel.img |
380 |
cp -p $ANDROID_HOME/tmp/ccs-init sbin/<br> |
</pre> |
|
find . -print0 | cpio -o0 -H newc | gzip -9 > ../ramdisk.img |
|
|
</td></tr> |
|
|
</table> |
|
381 |
|
|
382 |
<h2>ステップ14:エミュレータの起動</h2> |
<p>再度エミュレータを実行します。</p> |
383 |
|
|
384 |
<p>Android エミュレータを起動します。カーネルはステップ4で作成したものを、RAMディスクはステップ13で作成したものを指定します。</p> |
<pre class="command"> |
385 |
|
emulator -kernel $ANDROID_IMG/kernel.img -ramdisk $ANDROID_IMG/ramdisk.img -sysdir $ANDROID_IMG \ |
386 |
|
-data $ANDROID_IMG/userdata.img -show-kernel |
387 |
|
</pre> |
388 |
|
|
389 |
<table border="1"> |
<p>最終的なポリシーが完成したら、カーネル内に埋め込まれている domain_policy.conf に enforcing mode 用のプロファイルを割り当てておく( use_profile 3 )ことにより、 /init が実行される時点からアクセス制御を有効にすることができます。その状態で正常に動作することを確認したら、ステップ9で追加した /sbin/ccs-editpolicy-agent を削除します。また、 /init.rc およびカーネル内に埋め込まれた profile.conf からも ccs-editpolicy-agent を削除します。</p> |
|
<tr><td> |
|
|
emulator -kernel $ANDROID_IMG/kernel.img -ramdisk $ANDROID_IMG/ramdisk.img -sysdir $ANDROID_IMG -data $ANDROID_IMG/userdata.img -show-kernel |
|
|
</td></tr> |
|
|
</table> |
|
390 |
|
|
391 |
<h2>ステップ15:ポート転送の指定</h2> |
<h3>補足:ポリシーの更新を認めたい場合のヒント</h3> |
392 |
|
|
393 |
<p>エミュレータ内で動作しているエージェントと通信するために、ポート転送を指定します。以下のように指定した場合、ホスト側でのポート 10000 への TCP 接続は、エミュレータ側でのポート 7000 へと転送されます。ステップ8で ccs-editpolicy-agent をポート 7000 で待機するように指定しているので、ホスト側でポート 10000 へ接続することにより、エージェントとの通信が可能になります。</p> |
<p>Android ではユーザがアプリケーションを追加することができます。上記手順では、ユーザIDに基づいて3つのカテゴリに分類するという方法により、アプリケーションが追加されてもポリシーを更新する必要が無いような仕様になっています。</p> |
394 |
|
|
395 |
<table border="1"> |
<p>しかし、追加されるアプリケーションによっては、ポリシーを更新したい場合があるかもしれません。そのような場合、起動時に必要になるポリシーとしてカーネル内に埋め込む固定分と、起動後に必要になるポリシーとしてカーネル内には埋め込まない変動分とを分離することで対処するという方法が考えられます。</p> |
|
<tr><td> |
|
|
adb forward tcp:10000 tcp:7000 |
|
|
</td></tr> |
|
|
</table> |
|
396 |
|
|
397 |
<h2>ステップ16:エージェント経由での操作</h2> |
<p>起動時に必要となるポリシーはカーネルを読み込み専用のパーティションに配置することで、改ざんされる可能性を減らすことができます。起動後に必要になるポリシーは読み書きが可能なパーティションに配置することになるので改ざんされる可能性が高くなります。そのため、例えば GPG で署名し、改ざんされていないことを確認できた場合にのみポリシーを追加読み込みするという方法が考えられます。</p> |
398 |
|
|
399 |
<p>以下のように ccs-editpolicy を起動すると、エミュレータ内のエージェント経由で ポリシーを閲覧/編集できます。</p> |
<p>TOMOYO Linux では強制モードにおけるポリシー違反を契機として外部のプログラムに問い合わせを行うことができます。 ccs-queryd 相当の処理を実装し、 ccs-editpolicy-agent の代わりに常駐させておくという方法を利用できます。</p> |
400 |
|
|
401 |
<table border="1"> |
<h3>補足:ポリシーをカーネル内に埋め込みたくない場合のヒント</h3> |
|
<tr><td> |
|
|
/usr/sbin/ccs-editpolicy 127.0.0.1:10000 |
|
|
</td></tr> |
|
|
</table> |
|
402 |
|
|
403 |
<p>以下のように ccs-savepolicy を実行すると、エミュレータ内のエージェント経由で現在のポリシーをRAMディスク内の /ccs/ ディレクトリに出力できます。</p> |
<p>何かの理由によりポリシーをカーネル内に埋め込みたくない場合、ステップ7の</p> |
404 |
|
|
405 |
<table border="1"> |
<pre class="command"> |
406 |
<tr><td> |
sed -e 's/# CONFIG_CCSECURITY_OMIT_USERSPACE_LOADER is not set/CONFIG_CCSECURITY_OMIT_USERSPACE_LOADER=y/' -- config.ccs >> .config |
407 |
/usr/sbin/ccs-savepolicy $ANDROID_IMG/tmp/ccs/ 127.0.0.1:10000<br> |
mkdir -p security/ccsecurity/policy/ |
408 |
cd $ANDROID_IMG/tmp/<br> |
cp -p $ANDROID_HOME/tmp/policy/*.conf security/ccsecurity/policy/ |
409 |
find . -print0 | cpio -o0 -H newc | gzip -9 > ../ramdisk.img |
</pre> |
|
</td></tr> |
|
|
</table> |
|
410 |
|
|
411 |
<p>以下のように ccs-auditd を起動すると、エミュレータ内のエージェント経由でアクセス許可ログ/拒否ログを取得して保存することができます。なお、アクセスログは大量に出力されるため、ディスクの空き容量に注意してください。</p> |
<p>という部分を</p> |
412 |
|
|
413 |
<table border="1"> |
<pre class="command"> |
414 |
<tr><td> |
sed -e 's:/sbin/init:/init:' -- config.ccs >> .config |
415 |
/usr/sbin/ccs-auditd /tmp/grant_log /tmp/reject_log 127.0.0.1:10000 |
</pre> |
|
</td></tr> |
|
|
</table> |
|
416 |
|
|
417 |
<p>以下のように ccs-queryd を実行すると、エミュレータ内のエージェント経由で、強制モードでのポリシー違反を対話的に処理できます。 ccs-queryd を終了させるには Ctrl-C を押してください。</p> |
<p>に置き換えてください。このようにした場合、ポリシーローダとして /sbin/ccs-init (および /sbin/ccs-init が依存するファイルとして /system/bin/linker /system/lib/libc.so /system/lib/libm.so )もRAMディスク内にコピーしてください。 /sbin/ccs-init が実行される時点では /system/ パーティションがマウントされていないため、シンボリックリンクでの代用はできません。また、 ccs-init.c はポリシーを /etc/ccs/ から読み込むようになっていますので、適宜修正(例えば $ANDROID_HOME/tmp/policy/*.conf の内容を ccs-init.c に埋め込んでしまうなど)してください。 Android エミュレータで使用するRAMディスクに含まれている /init.rc が /etc という名前で /system/etc/ ディレクトリへのシンボリックリンクを作成するため、以下の例では、ポリシーを /ccs/ ディレクトリから読み込むように修正しています。</p> |
418 |
|
|
419 |
<table border="1"> |
<pre class="command"> |
420 |
<tr><td> |
cd $ANDROID_HOME/tmp/ |
421 |
/usr/sbin/ccs-queryd 127.0.0.1:10000 |
sed -e 's:etc/ccs:ccs:g' $ANDROID_HOME/tmp/ccs-tools/sbin/ccs-init.c > $ANDROID_HOME/tmp/ccs-tools/sbin/ccs-init2.c |
422 |
</td></tr> |
./agcc -o ccs-init $ANDROID_HOME/tmp/ccs-tools/sbin/ccs-init2.c |
423 |
</table> |
cd $ANDROID_IMG/tmp/ |
424 |
|
mkdir -p sbin system/bin system/lib |
425 |
|
cp -p $ANDROID_HOME/tmp/ccs-init sbin/ |
426 |
|
cp -p $ANDROID_HOME/out/target/product/generic/system/bin/linker system/bin/ |
427 |
|
cp -p $ANDROID_HOME/out/target/product/generic/system/lib/libc.so system/lib/ |
428 |
|
cp -p $ANDROID_HOME/out/target/product/generic/system/lib/libm.so system/lib/ |
429 |
|
chmod 700 sbin/ccs-init system/bin/linker system/lib/libc.so system/lib/libm.so |
430 |
|
find . -print0 | cpio -o0 -H newc | gzip -9 > ../ramdisk.img |
431 |
|
</pre> |
432 |
|
|
433 |
|
</div><!-- regular-content --> |
434 |
|
|
435 |
|
</div><!-- content --> |
436 |
|
|
437 |
|
<div id="navfooter"> |
438 |
<hr> |
<hr> |
439 |
|
<table> |
440 |
|
<tr> |
441 |
|
<td class="docs-previous"> |
442 |
|
</td> |
443 |
|
<td class="docs-index"> |
444 |
|
<a href="index.html.ja">目次</a> |
445 |
|
</td> |
446 |
|
<td class="docs-next"> |
447 |
|
</td> |
448 |
|
</tr> |
449 |
|
<tr> |
450 |
|
<td class="docs-previous-description"> |
451 |
|
</td> |
452 |
|
<td class="docs-home"> |
453 |
|
</td> |
454 |
|
<td class="docs-next-description"> |
455 |
|
</td> |
456 |
|
</tr> |
457 |
|
</table> |
458 |
|
</div> |
459 |
|
|
460 |
|
<div id="footer"> |
461 |
|
<p class="language">Go to <a href="android-arm.html.en">English page</a>.</p> |
462 |
|
<p class="timestamp">Last modified: $Date$</p> |
463 |
|
<p class="trademark">Linux® は世界各国における Linus Torvalds の登録商標です。 TOMOYO® は<a href="http://www.nttdata.co.jp/">株式会社NTTデータ</a>の登録商標です。</p> |
464 |
|
<p><a href="http://sourceforge.jp/"><img src="http://sourceforge.jp/sflogo.php?group_id=1973" width="96" height="31" alt="sflogo.php" title="SourceForge.jp"></a></p> |
465 |
|
</div> |
466 |
|
|
|
<p><a href="index.html.ja">目次へ戻る</a></p> |
|
|
<p><a href="http://sourceforge.jp/"><img src="http://sourceforge.jp/sflogo.php?group_id=1973" width="96" height="31" alt="SourceForge.jp"></a></p> |
|
467 |
</body> |
</body> |
468 |
</html> |
</html> |