Migliorare la sicurezza con i criteri di gestione dei dispositivi

Ritiro dell'amministratore del dispositivo. Alcuni criteri amministrativi sono stati contrassegnati come deprecati quando sono stati richiamati da parte di un amministratore del dispositivo. Per scoprire di più e visualizzare le opzioni di migrazione, vedi Ritiro dell'amministrazione del dispositivo.

A partire da Android 2.2 (livello API 8), la piattaforma Android offre la gestione dei dispositivi a livello di sistema. tramite le API di amministrazione dei dispositivi.

In questa lezione imparerai a creare un'applicazione sensibile alla sicurezza che gestisca l'accesso i relativi contenuti applicando i criteri di gestione dei dispositivi. Nello specifico, l'applicazione può essere configurata in modo da garantire che sia impostata una password di blocco schermo sufficientemente sicura prima di visualizzare contenuti con limitazioni per l'utente.

Definisci e dichiara il criterio

Innanzitutto, devi definire i tipi di norme da supportare a livello funzionale. Le norme possono riguardano la sicurezza della password del blocco schermo, il timeout della scadenza, la crittografia e così via.

Devi dichiarare l'insieme di criteri selezionato, che verrà applicato dall'applicazione, nel res/xml/device_admin.xml. Il file manifest di Android deve fare riferimento anche insieme di criteri dichiarato.

Ogni criterio dichiarato corrisponde a un certo numero di metodi dei criteri relativi ai dispositivi correlati in DevicePolicyManager (che definisce la lunghezza minima della password e il numero minimo di sono due esempi). Se un'applicazione tenta di richiamare metodi la cui il criterio corrispondente non viene dichiarato nel file XML e verrà generato un SecurityException in fase di runtime. Altre autorizzazioni, come force-lock, sono disponibili se l'applicazione intende gestire ad altri tipi di norme. Come vedrai più avanti, nell'ambito della procedura di attivazione dell'amministratore del dispositivo, l'elenco dei criteri dichiarati verrà presentato all'utente su una schermata di sistema.

Il seguente snippet dichiara il criterio relativo al limite delle password in res/xml/device_admin.xml:

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

XML Dichiarazione delle norme a cui viene fatto riferimento nel file manifest di Android:

<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>

Crea un ricevitore di amministrazione dispositivo

Crea un broadcast receiver per l'amministrazione dei dispositivi che riceva una notifica sugli eventi relativi ai criteri che hai dichiarato di supportare. Un'applicazione può sostituire selettivamente i metodi di callback.

Nell'applicazione di esempio, Amministratore dispositivo, quando l'amministratore del dispositivo viene disattivato dal utente, il criterio configurato viene cancellato dalla preferenza condivisa. Dovresti valutare l'implementazione alla logica di business pertinente al tuo caso d'uso. Ad esempio, l'applicazione potrebbe richiedere per mitigare i rischi per la sicurezza implementando una combinazione di eliminazione di dati sensibili sul dispositivo, disattivazione della sincronizzazione remota, invio di avvisi a un amministratore e così via

Affinché il broadcast receiver funzioni, assicurati di registrarlo nel file manifest Android come illustrato nello snippet precedente.

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();
    }
}

Attivare l'amministratore del dispositivo

Prima di applicare qualsiasi criterio, l'utente deve attivare manualmente l'applicazione come dispositivo amministratore. Lo snippet di seguito illustra come attivare l'attività delle impostazioni in cui l'utente può attivare la tua applicazione. È buona norma includere il testo esplicativo per evidenziare agli utenti il motivo per cui l'applicazione richiede di essere un amministratore del dispositivo, specificando il EXTRA_ADD_EXPLANATION extra nell'intent.

Figura 1. La schermata di attivazione dell'utente in cui puoi fornisci una descrizione dei criteri relativi ai dispositivi.

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);
}

Se l'utente sceglie "Attiva", l'applicazione diventa un amministratore del dispositivo e può iniziare prima di configurare e applicare il criterio.

L'applicazione deve inoltre essere preparata per gestire le situazioni in cui l'utente abbandona il processo di attivazione premendo il pulsante Annulla, il tasto Indietro o il tasto Home. Pertanto, onResume() nell'attività di configurazione dei criteri deve avere una logica per rivalutare la condizione e presentare l'opzione Attivazione dell'amministratore del dispositivo all'utente, se necessaria.

Implementare il controller dei criteri dei dispositivi

Dopo l'attivazione dell'amministratore del dispositivo, l'applicazione configura il dispositivo Gestione norme con il criterio richiesto. Tieni presente che stiamo aggiungendo nuove norme Android a ogni release. È opportuno eseguire i controlli della versione nell'applicazione se usi i nuovi criteri, supportando al contempo le versioni precedenti della piattaforma. Ad esempio, Password minimi Le norme relative alle maiuscole sono disponibili solo con il livello API 11 (Honeycomb) e versioni successive. Il seguente codice mostra come controllare la versione in fase di runtime.

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);
}

A questo punto, l'applicazione è in grado di applicare il criterio. Anche se l'applicazione non ha accesso all'effettiva password del blocco schermo utilizzata, tramite l'API Device Policy Manager che può determinare se la password esistente soddisfa i criteri richiesti. Se risulta che l'attuale la password del blocco schermo non è sufficiente, l'API di amministrazione del dispositivo non accetta un'azione correttiva. È responsabilità dell'applicazione avviare esplicitamente il sistema schermata di modifica della password nell'app Impostazioni. Ad esempio:

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);
}

Normalmente, l'utente può selezionare uno dei meccanismi di blocco disponibili, come Nessuno, Sequenza o PIN (numerico) o Password (numerico). Quando viene configurato un criterio per le password, i tipi più deboli rispetto a quelli definiti nel criterio vengono disattivati. Ad esempio, se La qualità della password "numerica" è configurata; l'utente può selezionare PIN (numerico) o password solo password (alfanumerica).

Una volta che il dispositivo è protetto correttamente impostando una password di blocco schermo adeguata, l'applicazione consente l'accesso ai contenuti protetti.

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));
}