minimize

事業拡大のため、新しい仲間を募集しています。
→詳しくはこちら

Android はマルチプロセスのシステムです。
それぞれのアプリケーションは、自分自身のプロセスで動きます。

アプリケーションとシステム間のほとんどのセキュリティは
標準のLinux機構を通じてプロセスレベルで守られています。
例えば各アプリケーションに割り当てられるユーザIDやグループIDなどによって、です。

それに加えて、特定のデータにアクセスすることを許可するために
URI単位での Permission メカニズムを使った
きめ細やかなセキュリティシステムも提供されています。

アーキテクチャ

Andoir のセキュリティ・アーキテクチャの基礎となる設計ポイントは、
デフォルトではどのアプリケーションも他のアプリケーション、他のOS、他のユーザに
有害となり得るようなオペレーションは一切実行できないようになっていることです。

これはユーザのプライベートデータ(e-mailのような)の読み書き、
他のアプリケーションが使うファイルへの読み書き、ネットワークアクセス、デバイスの制御、なども含みます。

アプリケーションのプロセスは安全なサンドボックスです。
他のアプリケーションを邪魔することはできません。

アプリケーションによって必要とされる許可は、そのアプリケーションで静的に宣言されます。
アプリケーションをインストールした時に許可されるオペレーションは決定され、
その後変化することはありません。

アプリケーションの署名

全ての Android アプリケーション(.apk ファイル)は
開発者が秘密鍵によって署名する必要があります。
この証明書によって、アプリケーションの作者が特定されます。

証明局によって署名する必要はありません。
Android では一般的に自己署名による証明書を使用します。

証明書は、アプリケーションをインストールできるかどうかの判断にではなく
アプリケーションとの信頼関係を確立するために使われます。

証明書が最もセキュリティに影響を与えるのは、
署名ベースの Permission にアクセスできるか、ユーザIDを共有できるかどうか、という点です。

ユーザIDとファイルアクセス

端末にインストールされる各 Android パッケージ(.apk)ファイルには、
そのアプリケーション専用のLinuxユーザIDが与えられます。
これによって、そのアプリケーションは他からアクセスできず、またそのアプリケーションは
他にアクセスできません。これによってサンドボックスが確保されます。
このユーザIDは、アプリケーションがインストールされてからそれがアンインストールされるまで
決して変わることなく保持されています。

プロセスレベルでセキュリティは施行されるので、通常はいかなる二つのパッケージも
それらを同じプロセスで動かすことはできません。
異なるLinuxユーザで動かす必要があります。

Manifest File 内で sharedUserId 属性を定義することで
それぞれのパッケージは同じユーザIDを共有することができます。
これによって、両者のパッケージはセキュリティ上同じアプリケーションとして扱われます。
ただし、同じ sharedUserId 属性を要求しても、同じ署名でサインしたアプリケーションだけが
実際に同じユーザIDを与えられることに注意して下さい。

アプリケーションが格納する全てのデータには、そのアプリケーションのユーザIDが割り当てられます。
そして通常、他のパッケージからこれらにはアクセスできません。
新しくファイルを作るとき MODE_WORLD_READABLE または MODE_WORLD_WRITEABLE のフラグを使うことができます。

これによって、そのデータを他の全てのパッケージから読み込んだり、書き込んだりできるようになります。
このとき、それらのファイルの所有者はそれでもアプリケーションのユーザになっています。
ただし、Permission を変えることによって他のユーザからもアクセスできることになります。

Permission の使用

基本的な Android アプリケーションは、何の Permission も与えられていません。
Manifest File に <uses-permission> 要素を記述することで、アプリケーションに必要な
Permission を定義することができます。

例えば、アプリケーションに SMS メッセージの受信を許可する場合、以下のように記述します。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.android.app.myapp" >
    <uses-permission android:name="android.permission.RECEIVE_SMS" />
</manifest>

アプリケーションをインストールするとき、これらの Permission を許可するかどうか決めて下さい。
アプリケーション動作中に、これらの許可・拒否を変えることはできません。
例えば、処理の度に Android システムが Permission についてプロンプトを出すことはありません。
もしインストール時に拒否した Permission を使おうとすると、それは無条件で失敗することでしょう。

時々、Permission の拒否は SecurityException を引き起こします。
ただし、これが全ての場面で発生することは保障されていません。
しかしながらほとんど全ての場合、拒否はシステムログに記録されるはずです。

Permission の作成

自身で新しい Permission を作成することもできます。
これには <permission> 要素を使います。