Mejora la seguridad con políticas de administración de dispositivos

Baja del administrador de dispositivos. Algunas políticas de administrador se marcaron como obsoletas cuando se invocaron por un administrador del dispositivo. Para obtener más información y ver las opciones de migración, consulta Baja del administrador de dispositivos.

A partir de Android 2.2 (nivel de API 8), la plataforma de Android ofrece administración de dispositivos a nivel del sistema a través de las APIs de administración de dispositivos.

En esta lección, aprenderás a crear una aplicación adaptada a la seguridad que administre el acceso a su contenido aplicando políticas de administración de dispositivos. Específicamente, la aplicación se puede configurar de modo que se garantice la configuración de una contraseña de bloqueo de pantalla con suficiente seguridad antes de mostrar restringido al usuario.

Define y declara tu política

En primer lugar, debes definir los tipos de políticas que admitirás a nivel funcional. Las políticas pueden cubrir la seguridad de la contraseña de bloqueo de pantalla, el tiempo de espera de caducidad, la encriptación, etc.

Debes declarar el conjunto de políticas seleccionado, que la aplicación aplicará en la res/xml/device_admin.xml. El manifiesto de Android también debe hacer referencia al y declarada como conjunto de políticas.

Cada política declarada corresponde a una serie de métodos de política de dispositivo relacionados en DevicePolicyManager (que definen la longitud mínima de las contraseñas y la cantidad mínima de los caracteres en mayúscula son dos ejemplos). Si una aplicación intenta invocar métodos cuyo No se declara la política correspondiente en el XML, lo que generará una SecurityException durante el tiempo de ejecución. Otros permisos, como force-lock, están disponibles si la aplicación tiene la intención de administrar y otros tipos de políticas. Como verás más adelante, en el proceso de activación del administrador de dispositivos, La lista de políticas declaradas se presentará al usuario en una pantalla del sistema.

En el siguiente fragmento, se declara la política de límite de contraseñas en 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 de la declaración de políticas al que se hace referencia en el manifiesto de 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 receptor de administración de dispositivos

Crea un receptor de emisión de la administración de dispositivos, que recibe notificaciones de eventos relacionados con las políticas que declaraste admitir. Una aplicación puede anular selectivamente los métodos de devolución de llamada.

En la aplicación de ejemplo, Administrador de dispositivos, cuando el administrador desactiva al administrador del dispositivo, usuario, la política configurada se borra de la preferencia compartida. Deberías considerar la implementación con la lógica empresarial que sea relevante para tu caso de uso. Por ejemplo, la aplicación puede tomar acciones para mitigar los riesgos de seguridad implementando alguna combinación de eliminación de datos sensibles en el inhabilitar la sincronización remota, alertar a un administrador, etc.

Para que el receptor de emisión funcione, asegúrate de registrarlo en el manifiesto de Android, como se ilustra en el fragmento anterior.

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

Activar el administrador del dispositivo

Antes de aplicar cualquier política, el usuario debe activar manualmente la aplicación como un dispositivo. administrador. El siguiente fragmento ilustra cómo activar la actividad de configuración en la que la usuario puede activar tu aplicación. Es una buena práctica incluir el texto explicativo para destacar el motivo por el cual la aplicación solicita ser administrador de dispositivos, especificando el EXTRA_ADD_EXPLANATION adicional en el intent.

Figura 1: La pantalla de activación del usuario en la que puedes proporciona una descripción de las políticas de dispositivo.

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

Si el usuario elige "Activar", la aplicación se convierte en administrador de dispositivos y puede comenzar configurar y aplicar la política.

La aplicación también debe estar preparada para manejar situaciones de retroceso en las que el usuario abandona el proceso de activación presionando el botón Cancelar, la tecla Atrás o la tecla Inicio. Por lo tanto, onResume() en la actividad de configuración de políticas debe tener lógica para reevaluar la condición y presentar la opción de Activación del administrador de dispositivos al usuario si según tus necesidades.

Cómo implementar el controlador de política de dispositivo

Una vez que el administrador del dispositivo se activa correctamente, la aplicación configura el dispositivo Administrador de políticas con la política solicitada. Ten en cuenta que se agregarán políticas nuevas Android con cada versión Es apropiado realizar verificaciones de versión en tu aplicación si usas políticas nuevas y, al mismo tiempo, la compatibilidad con versiones anteriores de la plataforma. Por ejemplo, el valor mínimo de contraseña La política en mayúsculas solo está disponible con el nivel de API 11 (Honeycomb) y versiones posteriores. El siguiente código demuestra cómo se puede verificar la versión en el tiempo de ejecución.

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

En este punto, la aplicación puede aplicar la política de manera forzosa. Mientras la aplicación no tenga acceso con la contraseña de bloqueo de pantalla que se usó; mediante la API de Device Policy Manager, puede determinar si la contraseña existente cumple con la política requerida. Si resulta que el estado contraseña de bloqueo de pantalla no es suficiente, la API de administración del dispositivo no toma automáticamente para tomar medidas correctivas. La aplicación debe iniciar explícitamente el sistema la pantalla de cambio de contraseña en la app de Configuración. Por ejemplo:

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, el usuario puede seleccionar uno de los mecanismos de bloqueo disponibles, como None, Pattern, PIN (numérico) o contraseña (alfanumérica). Cuando se configura una política de contraseñas, se inhabilitan los tipos más débiles que los definidos en la política. Por ejemplo, si el Se configura la calidad de contraseña “numérica”, el usuario puede seleccionar PIN (numérico) o contraseña (alfanumérica).

Una vez que el dispositivo esté correctamente protegido mediante la configuración de una contraseña de bloqueo de pantalla, la aplicación permite el acceso al contenido protegido.

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