デバイス管理ポリシーによるセキュリティの強化

デバイス管理のサポート終了。一部の管理ポリシーは、呼び出されたときに非推奨としてマークされています デバイス管理者によって プロビジョニングされています詳細と移行オプションについては、以下をご覧ください。 <ph type="x-smartling-placeholder"></ph> デバイス管理のサポート終了

Android 2.2(API レベル 8)以降、Android プラットフォームではシステムレベルのデバイス管理ができるようになりました。 Device Administration API で管理できます。

このレッスンでは、セキュリティを考慮したアプリケーションを作成し、アプリケーションへのアクセスを管理する方法を学びます。 管理ポリシーを適用できます。具体的には、アプリケーションを パスワードを表示する前に、十分な強度の画面ロックのパスワードを設定する コンテンツを制限することです。

ポリシーの定義と宣言

まず、サポートするポリシーの種類を機能レベルで定義する必要があります。ポリシーでは、 画面ロックのパスワードの安全度、有効期限のタイムアウト、暗号化などをカバーする

アプリケーションによって適用される選択済みのポリシーセットを、 res/xml/device_admin.xml ファイル。また、Android マニフェストでは 宣言されているポリシーセットです。

宣言された各ポリシーは、DevicePolicyManager のいくつかの関連するデバイス ポリシー メソッドに対応します(パスワードの最小長と最小のパスワード数を定義 2 つの例です)。アプリケーションが指定のメソッドを 対応するポリシーが XML で宣言されていない場合、実行時に SecurityException が発生します。その他の権限、 force-lock などは、アプリケーションがリソースを管理する必要がある場合に、 使用できます。後ほど紹介しますが、デバイス管理者の有効化プロセスでは 宣言されたポリシーのリストがシステム画面に表示される。

次のスニペットは、res/xml/device_admin.xml でパスワード上限ポリシーを宣言しています。

<device-admin xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-policies>
        <limit-password />
    </uses-policies>
</device-admin>

Android マニフェストで参照されるポリシー宣言の XML:

<receiver android:name=".Policy$PolicyAdmin"
    android:permission="android.permission.BIND_DEVICE_ADMIN">
    <meta-data android:name="android.app.device_admin"
        android:resource="@xml/device_admin" />
    <intent-filter>
        <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
    </intent-filter>
</receiver>

デバイス管理レシーバを作成する

サポートを宣言したポリシーに関連するイベントの通知を受け取る、デバイス管理ブロードキャスト レシーバを作成します。アプリはコールバック メソッドを選択的にオーバーライドできます。

サンプルアプリの Device Admin では、管理者によって 設定済みのポリシーが共有設定から消去されます。複数の異なるソースから ビジネスロジックを実行できます。たとえば、アプリケーションで 機密データの削除を組み合わせて実装することで、セキュリティ リスクを軽減するためのアクションを リモート同期の無効化、管理者へのアラートなどです。

ブロードキャスト レシーバを機能させるには、上記のスニペットに示すように、必ず Android マニフェストに登録してください。

Kotlin

class PolicyAdmin : DeviceAdminReceiver() {

    override fun onDisabled(context: Context, intent: Intent) {
        // Called when the app is about to be deactivated as a device administrator.
        // Deletes previously stored password policy.
        super.onDisabled(context, intent)
        context.getSharedPreferences(APP_PREF, Activity.MODE_PRIVATE).edit().apply {
            clear()
            apply()
        }
    }
}

Java

public static class PolicyAdmin extends DeviceAdminReceiver {

    @Override
    public void onDisabled(Context context, Intent intent) {
        // Called when the app is about to be deactivated as a device administrator.
        // Deletes previously stored password policy.
        super.onDisabled(context, intent);
        SharedPreferences prefs = context.getSharedPreferences(APP_PREF, Activity.MODE_PRIVATE);
        prefs.edit().clear().commit();
    }
}

デバイス管理を有効にする

ポリシーを適用する前に、ユーザーはアプリケーションをデバイスとして手動で有効にする必要があります。 なります。以下のスニペットは、 ユーザーがアプリケーションをアクティブ化できます。説明テキストを含めることをおすすめします。 アプリがデバイス管理者になることをリクエストした理由をユーザーに通知するために、 インテントの EXTRA_ADD_EXPLANATION エクストラ。

図 1. ユーザーのアクティベーション画面で デバイス ポリシーの説明を入力します。

Kotlin

if (!policy.isAdminActive()) {

    val activateDeviceAdminIntent = Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN)

    activateDeviceAdminIntent.putExtra(
            DevicePolicyManager.EXTRA_DEVICE_ADMIN,
            policy.getPolicyAdmin()
    )

    // It is good practice to include the optional explanation text to
    // explain to user why the application is requesting to be a device
    // administrator. The system will display this message on the activation
    // screen.
    activateDeviceAdminIntent.putExtra(
            DevicePolicyManager.EXTRA_ADD_EXPLANATION,
            resources.getString(R.string.device_admin_activation_message)
    )

    startActivityForResult(activateDeviceAdminIntent, REQ_ACTIVATE_DEVICE_ADMIN)
}

Java

if (!policy.isAdminActive()) {

    Intent activateDeviceAdminIntent =
        new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);

    activateDeviceAdminIntent.putExtra(
        DevicePolicyManager.EXTRA_DEVICE_ADMIN,
        policy.getPolicyAdmin());

    // It is good practice to include the optional explanation text to
    // explain to user why the application is requesting to be a device
    // administrator. The system will display this message on the activation
    // screen.
    activateDeviceAdminIntent.putExtra(
        DevicePolicyManager.EXTRA_ADD_EXPLANATION,
        getResources().getString(R.string.device_admin_activation_message));

    startActivityForResult(activateDeviceAdminIntent,
        REQ_ACTIVATE_DEVICE_ADMIN);
}

ユーザーが [有効にする]を選択するとアプリケーションがデバイス管理者になり、 ポリシーの構成と適用を行います

アプリケーションは、ユーザーが処理をやめるという事態の後退に対処できるよう準備する必要もあります。 [Cancel] ボタン、Back キー、または Home キーを押すことで、有効化プロセスを続行できます。したがって、 ポリシー設定アクティビティの onResume() にロジックが必要 次の場合は、条件を再評価して、お客様にデバイス管理の有効化オプションを提示してください。 必要ありません。

Device Policy Controller を実装する

デバイス管理者が正常にアクティベートされると、アプリケーションはデバイスを設定します。 リクエストされたポリシーを持つポリシー マネージャー。なお、新しいポリシーは リリースごとに Android。アプリケーションでバージョン チェックを実行するのは、 古いバージョンのプラットフォームもサポートしています。たとえば、[パスワードの最小要件] 大文字のポリシーは API レベル 11(Honeycomb)以降でのみ使用できます。次のコードでは、 は、実行時にバージョンを確認する方法を示しています。

Kotlin

private lateinit var dpm: DevicePolicyManager
private lateinit var policyAdmin: ComponentName

dpm = context.getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager
policyAdmin = ComponentName(context, PolicyAdmin::class.java)

dpm.apply {
    setPasswordQuality(policyAdmin, PASSWORD_QUALITY_VALUES[passwordQuality])
    setPasswordMinimumLength(policyAdmin, passwordLength)
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        setPasswordMinimumUpperCase(policyAdmin, passwordMinUpperCase)
    }
}

Java

DevicePolicyManager dpm = (DevicePolicyManager)
        context.getSystemService(Context.DEVICE_POLICY_SERVICE);
ComponentName policyAdmin = new ComponentName(context, PolicyAdmin.class);

dpm.setPasswordQuality(policyAdmin, PASSWORD_QUALITY_VALUES[passwordQuality]);
dpm.setPasswordMinimumLength(policyAdmin, passwordLength);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
    dpm.setPasswordMinimumUpperCase(policyAdmin, passwordMinUpperCase);
}

この時点で、アプリケーションはポリシーを適用できます。アプリケーションにはアクセス権がないものの、 Device Policy Manager API を通じて、実際に使用された画面ロック パスワードに 既存のパスワードが必要なポリシーに準拠しているかどうかが確認されます。既存のアプリケーションが 画面ロックのパスワードだけでは不十分な場合、Device Administration API では、 是正措置を取ることができます。システムを明示的に起動することはアプリケーション側に 設定アプリのパスワード変更画面。次に例を示します。

Kotlin

if (!dpm.isActivePasswordSufficient) {
    // Triggers password change screen in Settings.
    Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD).also { intent ->
        startActivity(intent)
    }
}

Java

if (!dpm.isActivePasswordSufficient()) {
    ...
    // Triggers password change screen in Settings.
    Intent intent =
        new Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD);
    startActivity(intent);
}

通常、ユーザーは使用可能なロック メカニズム(なし、パターン、 PIN(数字)、またはパスワード(英数字)を入力します。パスワード ポリシーを構成すると、それらのパスワードは ポリシーで定義されたものよりも弱いものは無効になります。たとえば、 「数値」のパスワードの品質が構成されている場合、ユーザーは PIN(数字)またはパスワードのいずれかを選択できます パスワードのみを使用できます。

適切な画面ロック パスワードを設定してデバイスを適切に保護すると、アプリは コンテンツへのアクセスを許可します。

Kotlin

when {
    !dpm.isAdminActive(policyAdmin) -> {
        // Activates device administrator.
        ...
    }
    !dpm.isActivePasswordSufficient -> {
        // Launches password set-up screen in Settings.
        ...
    }
    else -> {
        // Grants access to secure content.
        ...
        startActivity(Intent(context, SecureActivity::class.java))
    }
}

Java

if (!dpm.isAdminActive(..)) {
    // Activates device administrator.
    ...
} else if (!dpm.isActivePasswordSufficient()) {
    // Launches password set-up screen in Settings.
    ...
} else {
    // Grants access to secure content.
    ...
    startActivity(new Intent(context, SecureActivity.class));
}