2. ガイド文書の構成¶
2.1. 開発者コンテキスト ¶
セキュアコーディング系のガイド文書は「こういうコーディングは危ない、だからこのようにコーディングすべき」といった内容で構成されることが多いのですが、このような構成はすでにコーディングされたソースコードをレビューするときには役立つ反面、これから開発者がコーディングしようというときには、どの記事を読んだらよいのか分かりにくいという問題があります。
このガイド文書では、開発者がいま何をしようとしているか?という開発者コンテキストに着目し、開発者コンテキストに合わせた切り口の記事を用意する方針をとっています。たとえば「Activityを作る・利用する」や「SQLiteを使う」という開発者が行うであろう作業単位ごとに記事を用意しています。
開発者コンテキストに合わせて記事を用意することにより、開発者は必要な記事を見つけやすく、業務にすぐ役立つようになると考えています。
2.2. サンプルコード、ルールブック、アドバンスト ¶
それぞれの記事はサンプルコード、ルールブック、アドバンストの3つのセクションで構成されています。お急ぎの方はサンプルコードとルールブックをご覧ください。ある程度再利用可能なパターンに落とし込んだ内容にしてあります。サンプルコードセクションとルールブックセクションに収まらない課題をお持ちの方はアドバンストをご覧ください。個別課題の解決方法を検討するための考慮材料を記載してあります。
なお、サンプルコードおよび記事の内容は特別な記述がない限りAndroid 4.0.3(API Level 15)以降を対象にしています。Android 4.0.3(API Level 15)より前のバージョンにおいては動作確認をしておらず、対策として効果がない場合もありますのでご注意ください。また、対象範囲内のバージョンであっても、組み込んだ端末で動作をご確認の上、ご自身の責任のもとでご利用ください。
また、本書で紹介するサンプルコードはtargetSdkVersionのAPI Lvelを26以上に設定しています。これは Google 社が定めている以下の要件に従ったものです:
- 2018年8月以降に Google Play ストアから配信する新規リリースのアプリケーションは targetSdkVersion の API Level を26(Android 8.0)以上にしなければならない
- 2018年11月以降に既存アプリをバージョンアップする場合も targetSdkVersion を26以上にしなければならない
- 2019年以降は、毎年要求される targetSdkVersion が上げられる
2.2.1. サンプルコード¶
サンプルコードセクションでは、その記事がテーマとする開発者コンテキストにおいて基本的なお手本となるサンプルコードを掲載しています。複数のパターンがある場合はその分類方法とそれぞれのパターンのサンプルコードを用意しています。解説においては簡潔さを心がけており、セキュリティ上考慮すべきポイントを本文中で「ポイント:」部分に番号付き箇条書きで記載し、その箇条書き番号Nに対応するサンプルコードにも「★ポイントN★」と記載しコメントで解説しています。一つのポイントがサンプルコード上では複数個所に対応する場合があることにご注意ください。このようにセキュリティを考慮すべき個所はソースコード全体に対して僅かな量ですが、それらの個所は点在します。セキュリティの考慮が必要な個所を見渡すことができるように、サンプルコードはクラス単位でまるごと掲載するようにしています。
このガイド文書で掲載しているサンプルコードは一部です。すべてのサンプルコードをまとめた圧縮ファイルも下記のURLに公開しています。Apache License, Version 2.0で公開していますので、自由にサンプルコードをコピー&ペーストしてご利用いただけます。ただしエラー処理についてはサンプルコードが長くなり過ぎないように最小限にしていますのでご注意ください。
- https://www.jssec.org/dl/android_securecoding/ ガイド文書
- https://www.jssec.org/dl/android_securecoding.zip サンプルコード一式
サンプルコードに添付するProjects/keystoreファイルはAPK署名用の開発者鍵を含んだキーストアファイルです。パスワードは「android」です。自社限定系のサンプルコードをAPK署名する際にご利用ください。
デバッグ用にキーストアファイルdebug.keystoreを用意しているので、Android Studioで開発する場合は、Android Studioの個別のプロジェクトで設定しておくと、自社限定系のサンプルコードの動作確認に便利です。また、複数のAPKから成るサンプルコードにおいて、各APK間の連携動作を確認するためには、各々のAndroidManifest.xml内のandroid:debuggableの設定を合わせる必要があります。Android StudioからAPKをインストールする場合は、明示的に設定が無ければ自動的にandroid:debuggable="true"になります。
サンプルコードおよびキーストアファイルをAndroid Studioに取り込む方法については「2.5. サンプルコードのAndroid Studioへの取り込み手順」をご参照ください。
2.2.2. ルールブック¶
ルールブックセクションでは、その記事がテーマとする開発者コンテキストにおいて、セキュリティ観点から守るべきルールや考慮事項を掲載しています。ルールブックセクションの冒頭にはそのセクションで扱っているルールを表形式で一覧表示し、「必須」または「推奨」のレベル分けをしています。ルールには肯定文または否定文の2種類がありますので、必須の肯定文は「やらなきゃだめ」、推奨の肯定文は「やったほうがよい」、必須の否定文は「やったらだめ」、推奨の否定文は「やらないほうがよい」といったレベル感で表現しています。もちろんこのレベル分けは執筆者の主観に基づくものですので、参考程度としてお取扱いください。
サンプルコードセクションに掲載されているサンプルコードはこれらのルールや考慮事項が反映されたものとなっていますが、その詳しい説明はルールブックセクションに記載されています。また、サンプルコードセクションでは扱っていないルールや考慮事項についてもルールブックセクションでは扱っています。
2.2.3. アドバンスト¶
アドバンストセクションでは、その記事がテーマとする開発者コンテキストにおいて、サンプルコードセクションやルールブックセクションで説明できなかった、しかし注意を要する事項について記載しています。その記事がテーマとする開発者コンテキストにまつわる、コラム的な話題やAndroid OSの限界に関する話題など、サンプルコードセクションやルールブックセクションの内容で解決できなかった個別課題の解決方法を検討するための考慮材料として役立てることができます。
開発者のみなさんは常に多忙です。開発者の多くは、Androidの深遠なるセキュリティの構造について深く理解することよりも、ある程度のAndroidセキュリティの知識を持って、迅速にかつ安全なAndroidアプリケーションをどんどん生産することが求められます。一方、セキュリティ設計が重要なアプリケーションもあります。このようなアプリケーションの開発者はAndroidのセキュリティについて深く理解している必要があります。
このようにスピード重視の開発者とセキュリティ重視の開発者の両方を支援するために、このガイド文書のすべての記事はサンプルコード、ルールブック、アドバンストの3つのセクションに分けて記述しています。サンプルコードとルールブックセクションは「そういうことがしたければ、これをしておけば安全ですよ」といった一般化できる内容が書いてあり、可能な限りソースコードのコピー&ペーストで自動的に安全なコーディングができることを狙っています。アドバンストセクションは「こんなときはこういう問題があって、こういう考え方をするとよい」といった考えるための材料が書いてあり、開発者が取り組んでいる個別のアプリケーションで最適なセキュア設計、セキュアコーディングを検討できることを狙っています。
2.3. ガイド文書のスコープ¶
このガイド文書は一般のAndroidアプリケーション開発者に必要なセキュリティTipsを集めることを目的としています。そのため主にマーケットで配布されるAndroidアプリケーションの開発におけるセキュリティTips(下図の「アプリのセキュリティ」)が主なスコープとなっています。
![_images/image5.png](_images/image5.png)
図 2.3.1 Android プラットフォームの主なコンポーネント
Android OS層以下のAndroid端末実装に関するセキュリティ(上図の「端末のセキュリティ」)はスコープ外です。またAndroid端末にユーザーがインストールする一般のAndroidアプリケーションと、Android端末メーカーがプレインストールするAndroidアプリケーションでは気を付けるべきセキュリティの観点で異なるところがありますが、特に現行版においては前者のみを扱っており、後者については扱っていません。現行版ではJavaにより実装するTipsだけを記載しておりますが、JNI実装についても今後の版で記載していく予定です。
root権限が奪取される脅威についても今のところ扱っていません。基本的にはroot権限が奪われていないセキュアなAndroid端末を前提とし、Android OSのセキュリティモデルを活用したセキュリティTipsをまとめています。なお、資産と脅威の扱いについては「3.1.3. 資産分類と保護施策」にて詳しく説明しておりますので、合わせてご確認ください。
2.4. Androidセキュアコーディング関連書籍の紹介¶
このガイド文書ではAndroidセキュアコーディングのすべてを扱うことはとてもできないので、下記で紹介する書籍を併用することをお勧めします。
- Android Security 安全なアプリケーションを作成するために
著者:タオソフトウェア株式会社 ISBN978-4-8443-3134-6
https://www.amazon.co.jp/dp/4844331345/ - Javaセキュアコーディングスタンダード CERT/ Oracle版
著者:Fred Long, Dhruv Mohindra, Robert C. Seacord, Dean F. Sutherland, David Svoboda
監修:歌代和正 翻訳:久保正樹, 戸田洋三 ISBN978-4-04-886070-3
https://www.amazon.co.jp/dp/4048860704/
2.5. サンプルコードのAndroid Studioへの取り込み手順¶
サンプルコードのAndroid Studioへの取り込み手順を説明します。サンプルコードは目的ごとに複数のプロジェクトにわかれています。これらのプロジェクトを取り込む方法を「2.5.1. サンプルプロジェクトを取り込む」に示します。プロジェクトの取り込みが終わったら「2.5.2. サンプルコード動作確認用debug.keystoreを設定する」を参照してdebug.keystoreファイルをAndroid Studioに設定してください。なお、確認は下記の環境で行っております。
- OS
- Windows 10 Pro
- Android Studio
- 3.1.4
- Android SDK
- Android 9.0(API 28)
- 特に注意のないサンプルプロジェクトはAndroid 9.0(API28)でビルドできます。
- Android 9.0(API 28)
2.5.1. サンプルプロジェクトを取り込む¶
2.5.1.3. 展開先を指定する¶
ここでは"C:\android_securecoding"という名前でワークスペースを作成します。そのため、"C:\ "を指定し"展開"ボタンをクリックします。
![_images/image7.png](_images/image7.png)
図 2.5.2 展開先を指定する
"展開"ボタンをクリックすると"C:\"直下に"android_securecoding"というフォルダが作成されます。
![_images/image8.png](_images/image8.png)
図 2.5.3 android_securecoding フォルダ
"android_securecoding"フォルダの中にはサンプルコードが含まれています。
例えば、「4.1. Activityを作る・利用する」の「4.1.1.3. パートナー限定Activityを作る・利用する」においてサンプルコードを参照したい場合は以下をご覧ください。
android_securecoding
┗ Create Use Activity
┗ Activity PartnerActivity
以上のように、"android_securecoding"フォルダ配下は、節ごとに「サンプルコードのプロジェクト」が配置された構成となります。
2.5.1.4. Android Studioを起動しワークスペースを指定する¶
スタートメニューやデスクトップアイコンなどからAndroid Studioを起動します。
![_images/image9.png](_images/image9.png)
図 2.5.4 Android Studio を起動する
起動後、表示されたダイアログからプロジェクトをオープンします。
![_images/image10.png](_images/image10.png)
図 2.5.5 Android Studio ダイアログ
また、既にプロジェクトを読み込んでいる場合は、そのWindowが表示されるため、メニューより"File -> Close Project"で表示しているプロジェクトをクローズします。
![_images/image11.png](_images/image11.png)
図 2.5.6 File -> Close Project
2.5.1.5. プロジェクトをオープンする¶
表示されているダイアログの"Open an existing Android Studio project"をクリックします。
![_images/image10.png](_images/image10.png)
図 2.5.7 Open project
2.5.1.6. プロジェクトを選択する¶
オープンするプロジェクトフォルダを選択します。
![_images/image12.png](_images/image12.png)
図 2.5.8 オープンするプロジェクトを選択
本ガイドのサンプルコードプロジェクトと使用しているAndroid StudioのGradleバージョンが異なる場合、Gradleが最適化されます。
![_images/image13.png](_images/image13.png)
図 2.5.9 Gradle の最適化
画面に従い、"Update"をクリックし、Android Gradle Pluginのアップデートを開始してください。
![_images/image14.png](_images/image14.png)
図 2.5.10 Android Gradle Plugin のアップデート
以下のメッセージが表示されるので"Fix Gradle wapper and re-import project Gradle setting"をクリックし、Gradle Wrapperの更新を行ってください。
![_images/image15.png](_images/image15.png)
図 2.5.11 Gradle Wrapper の更新
2.5.1.7. オープンの完了¶
プロジェクトがオープンされ完了します。
![_images/image16.png](_images/image16.png)
図 2.5.12 オープンの完了
Android Studioは、Eclipseとは違い、1つのプロジェクトに対して1つのWindowで表示されます。違うプロジェクトをオープンする場合は、"File-> Open..."をクリックオープンします。
![_images/image17.png](_images/image17.png)
図 2.5.13 File -> Open...
2.5.2. サンプルコード動作確認用debug.keystoreを設定する¶
サンプルコードから作成したアプリをAndroid端末やエミュレーターで動作させるためには署名が必要です。この署名に使うデバッグ用の鍵ファイル"debug.keystore"をAndroid Studioのプロジェクトに設定します。
2.5.2.1. File -> Project Structure...をクリックする¶
![_images/image18.png](_images/image18.png)
図 2.5.14 File -> Project Structure...
2.5.2.2. Signingを追加する¶
左欄のModulesからプロジェクト名を選択し、Signingタブを選択後、「+」ボタンをクリックし、デフォルトの名前”config"を"debug"に変更します。
![_images/image19.png](_images/image19.png)
図 2.5.15 Signing を追加する
2.5.2.3. Store File として"debug.keystore"を選択する¶
図 2.5.15 で赤丸で囲んだボタンをクリックし、”Store File" を設定します。debug.keystoreはサンプルコードに含まれています。(android_securecodingフォルダ直下)
![_images/image20.png](_images/image20.png)
図 2.5.16 "debug.keystore" を選択する
![_images/image21.png](_images/image21.png)
図 2.5.17 debug.keystore を選択した結果
2.5.2.4. Build TypesでSigning Configを設定¶
Build Typesタブを選択し、debugビルド用のSigning ConfigをSingningで追加した"debug"を選択し、OKをクリックします。
![_images/image22.png](_images/image22.png)
図 2.5.18 Build Types で Signing Config を設定
2.5.2.5. build.gradleファイルで確認¶
signingConfigsに選択したdebug.keystoreのパスが表示され、buildTypesのdebugにsigningConfigが表示されます。
![_images/image23.png](_images/image23.png)
図 2.5.19 build.gradle ファイルで確認