Seguridad

En las funciones de esta guía, se describen las capacidades de administración de seguridad que puedes implementar en la app del controlador de política de dispositivo (DPC). Este documento contiene muestras de código y también puedes usar la app de DPC de prueba como una fuente de código de muestra para las funciones empresariales de Android.

Una app de DPC se puede ejecutar en el modo de propietario del perfil en dispositivos personales o en el propietario del dispositivo en dispositivos completamente administrados. En esta tabla, se indican las funciones disponibles Cuando el DPC se ejecuta en el modo de propietario de perfil o de propietario del dispositivo:

Función Propietario del perfil Propietario del dispositivo
Inhabilitar el acceso a las apps
Bloquea apps de fuentes desconocidas
Cómo restringir cuentas en Google Play
Habilita la protección contra el restablecimiento de la configuración de fábrica en la empresa
Supervisa registros de procesos empresariales e informes de errores remotos
Cómo otorgar y quitar el acceso a un certificado de cliente
Restablecimiento de la contraseña segura
Comprobación de seguridad para perfiles de trabajo

Inhabilitar el acceso a las apps

Para organizaciones que desean impedir que los empleados jueguen o miren YouTube en un dispositivo con Android durante determinados momentos del día ciertos días de la semana, un DPC puede inhabilitar temporalmente el acceso a las apps.

Para inhabilitar el acceso a las apps, un DPC que se ejecuta en el modo de propietario del dispositivo o del perfil configura setPackagesSuspended(), y la app seleccionada actuará como si está inhabilitada (el selector de Google inhabilita la aplicación). Cuando un usuario toca la aplicación, ve un diálogo del sistema que dice que la app está suspendida.

Mientras una aplicación esté suspendida, no podrá iniciar actividades ni enviar notificaciones a del paquete se suprimieron. Los paquetes suspendidos no aparecen en la descripción general. pantalla, no pueden mostrar diálogos (incluidos avisos y barras de notificaciones), y no puede reproducir audio ni hacer vibrar el dispositivo.

Para saber si una app está suspendida, los selectores pueden llamar al isPackageSuspended(). Para obtener detalles sobre cómo configurar la app suspensión, consulta setPackagesSuspended.

Bloquea apps de fuentes desconocidas

Las apps que no se instalan desde Google Play (o desde otras tiendas de aplicaciones confiables) tienen las siguientes características: llamadas apps de fuentes desconocidas. Los dispositivos y datos pueden correr un mayor riesgo cuando alguien instala estas aplicaciones.

Para evitar que alguien instale apps de fuentes desconocidas, administra los componentes de los dispositivos completamente administrados y los perfiles de trabajo pueden agregar Restricción de usuario de DISALLOW_INSTALL_UNKNOWN_SOURCES.

Restricción de todo el dispositivo del perfil de trabajo

Cuando el administrador de un perfil de trabajo agrega DISALLOW_INSTALL_UNKNOWN_SOURCES, la restricción solo se aplica al perfil de trabajo. Sin embargo, el administrador de un trabajo puede aplicar una restricción a todo el dispositivo estableciendo una configuración administrada para Google Play. La restricción de todo el dispositivo disponible en Android 8.0 (o versiones posteriores) cuando la aplicación de Google Play instalada versión 80812500 o superior.

Para restringir la instalación de aplicaciones en Google Play, sigue estos pasos:

  1. Establece un paquete de configuración administrada para el paquete de Google Play com.android.vending
  2. En el paquete, escribe un valor booleano para el Tecla verify_apps:device_wide_unknown_source_block.
  3. Agrega la restricción del usuario ENSURE_VERIFY_APPS.

En el siguiente ejemplo, se muestra cómo comprobar si Google Play admite lo siguiente: y establece el valor en true:

Kotlin

internal val DEVICE_WIDE_UNKNOWN_SOURCES = "verify_apps:device_wide_unknown_source_block"
internal val GOOGLE_PLAY_APK = "com.android.vending"

// ...

// Add the setting to Google Play's existing managed config. Supported in
// Google Play version 80812500 or higher--older versions ignore unsupported
// settings.
val dpm = context.getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager
var existingConfig = dpm.getApplicationRestrictions(adminName, GOOGLE_PLAY_APK)
val newConfig = Bundle(existingConfig)
newConfig.putBoolean(DEVICE_WIDE_UNKNOWN_SOURCES, true)
dpm.setApplicationRestrictions(adminName, GOOGLE_PLAY_APK, newConfig)

// Make sure that Google Play Protect verifies apps.
dpm.addUserRestriction(adminName, UserManager.ENSURE_VERIFY_APPS)
dpm.addUserRestriction(adminName, UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES)

Java

static final String DEVICE_WIDE_UNKNOWN_SOURCES =
    "verify_apps:device_wide_unknown_source_block";
static final String GOOGLE_PLAY_APK = "com.android.vending";

// ...


// Add the setting to Google Play's existing managed config. Supported in
// Google Play version 80812500 or higher--older versions ignore unsupported
// settings.
DevicePolicyManager dpm =
    (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
Bundle existingConfig =
    dpm.getApplicationRestrictions(adminName, GOOGLE_PLAY_APK);
Bundle newConfig = new Bundle(existingConfig);
newConfig.putBoolean(DEVICE_WIDE_UNKNOWN_SOURCES, true);
dpm.setApplicationRestrictions(adminName, GOOGLE_PLAY_APK, newConfig);

// Make sure that Google Play Protect verifies apps.
dpm.addUserRestriction(adminName, UserManager.ENSURE_VERIFY_APPS);
dpm.addUserRestriction(adminName, UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES);

La interfaz de usuario en la configuración del sistema permanece activa, pero el sistema se bloquea instalación de la app. Esta restricción afecta las instalaciones futuras, las apps instaladas permanecerán en el dispositivo. Los usuarios del dispositivo pueden seguir instalando apps en el perfil personal con Android Debug Bridge (adb).

Para obtener más información sobre fuentes desconocidas, consulta Distribución alternativa de la aplicación.

Restringir cuentas en Google Play

A veces, una organización puede querer permitir que las personas agreguen datos personales Cuentas (por ejemplo, para leer correos electrónicos en Gmail), pero no quiere la configuración cuenta para instalar apps. Tu DPC puede establecer una lista de cuentas que las personas pueden usar en Google Play

Los componentes administrativos de los dispositivos completamente administrados o de los perfiles de trabajo pueden restringir estableciendo una configuración administrada para Google Play. La cuenta está disponible cuando la versión de la app de Google Play instalada es 80970100 o una superior.

Para limitar las cuentas en Google Play, haz lo siguiente:

  1. Establece un paquete de configuración administrada para el paquete de Google Play com.android.vending
  2. En el paquete, coloca las direcciones de correo electrónico separadas por comas como un valor de cadena para la tecla allowed_accounts.

En el siguiente ejemplo, se muestra cómo puedes limitar las cuentas:

Kotlin

internal val ALLOWED_ACCOUNTS = "allowed_accounts"
internal val GOOGLE_PLAY_APK = "com.android.vending"

// ...

// Limit Google Play to one work and one personal account. Use
// a comma-separated list of account email addresses (usernames).
val googleAccounts = "ali@gmail.com,ali.connors@example.com"

// Supported in Google Play version 80970100 or higher.
val existingConfig = dpm.getApplicationRestrictions(adminName, GOOGLE_PLAY_APK)
val newConfig = Bundle(existingConfig)
newConfig.putString(ALLOWED_ACCOUNTS, googleAccounts)
dpm.setApplicationRestrictions(adminName, GOOGLE_PLAY_APK, newConfig)

Java

static final String ALLOWED_ACCOUNTS = "allowed_accounts";
static final String GOOGLE_PLAY_APK = "com.android.vending";

// ...


// Limit Google Play to one work and one personal account. Use
// a comma-separated list of account email addresses (usernames).
String googleAccounts = "ali@gmail.com,ali.connors@example.com";

// Supported in Google Play version 80970100 or higher.
Bundle existingConfig =
    dpm.getApplicationRestrictions(adminName, GOOGLE_PLAY_APK);
Bundle newConfig = new Bundle(existingConfig);
newConfig.putString(ALLOWED_ACCOUNTS, googleAccounts);
dpm.setApplicationRestrictions(adminName, GOOGLE_PLAY_APK, newConfig);

Para limitar Google Play solo a la cuenta de trabajo, establece allowed_accounts en cuenta administrada única en cuanto el DPC conozca la dirección de correo electrónico de la cuenta. Los string vacía impide que las personas usen cualquier cuenta en Google Play.

Habilitar la protección contra el restablecimiento de la configuración de fábrica para empresas

Con la protección contra el restablecimiento de la configuración de fábrica, las organizaciones pueden especificar Las Cuentas de Google pueden aprovisionar un dispositivo al que se le haya restablecido la configuración de fábrica.

La protección contra el restablecimiento de la configuración de fábrica del consumidor se diseñó para impedir el robo del dispositivo. Antes permitir que cualquier persona aprovisione el dispositivo después de un restablecimiento no autorizado de la configuración de fábrica (como como con una EMM), el asistente de configuración requiere que el usuario se autentique en cualquier Cuentas de Google que anteriormente estaban en el perfil personal del dispositivo

En un entorno empresarial, el restablecimiento de la configuración de fábrica es una herramienta importante para administrar dispositivos cuando un empleado abandona la organización. Sin embargo, si el la organización no conoce las credenciales de la cuenta de un empleado, restablecer la configuración de fábrica puede bloquear la capacidad de la organización de emitir un dispositivo a otro en un empleado.

Cómo controlar el aprovisionamiento después de restablecer la configuración de fábrica

Cuando se ejecuta en el modo de propietario del dispositivo, tu DPC puede usar setFactoryResetProtectionPolicy() para controlar qué cuentas se están autorizados a aprovisionar un dispositivo después de restablecer la configuración de fábrica. Si esta configuración se configure como null o se configure como una lista vacía, las cuentas autorizadas para aprovisionar un dispositivo después de restablecer la configuración de fábrica son las cuentas del perfil personal del dispositivo.

Un DPC puede configurar estas cuentas durante la vida útil de una cuenta completamente dispositivo.

  1. El administrador de TI puede usar el método people.get de la API de People con el valor especial me. Esto recupera el userId de la con la que accediste. Se muestra userID en la clave resourceName en el formulario people/[userId] como una cadena de número entero. Es posible que las cuentas creadas recientemente No estar disponible para restablecer la configuración de fábrica por 72 horas.
  2. Es posible que también desees permitir que uno o más administradores de TI desbloqueen el dispositivo después restablecer la configuración de fábrica. Hacer que cada uno de estos administradores de TI inicie sesión en su Cuenta de Google y también sigue el paso 1 y comparte su userId contigo para que puedas agregar estos userIds a la lista en el siguiente paso.
  3. El DPC establece una restricción de aplicación adecuada usando setFactoryResetProtectionPolicy() para establecer la lista de userId que pueden aprovisionar un dispositivo de restablecimiento de la configuración de fábrica.
  4. El DPC habilita las cuentas que pueden aprovisionar dispositivos después de una restablecer enviando la transmisión com.google.android.gms.auth.FRP_CONFIG_CHANGED como un intent explícito para para evitar que se caigan debido a restricciones en segundo plano.

Kotlin

const val ACTION_FRP_CONFIG_CHANGED =
    "com.google.android.gms.auth.FRP_CONFIG_CHANGED"
const val GMSCORE_PACKAGE = "com.google.android.gms"

// ...

// List of userId that can provision a factory reset device.
// You can use the value returned calling people/me endpoint.
val accountIds = listOf("000000000000000000000")

dpm.setFactoryResetProtectionPolicy(
    adminName,
    FactoryResetProtectionPolicy.Builder()
        .setFactoryResetProtectionAccounts(accountIds)
        .setFactoryResetProtectionEnabled(true)
        .build()
)

val frpChangedIntent = Intent(ACTION_FRP_CONFIG_CHANGED)

frpChangedIntent.setPackage(GMSCORE_PACKAGE)
context.sendBroadcast(frpChangedIntent)

Java

static final String ACTION_FRP_CONFIG_CHANGED =
    "com.google.android.gms.auth.FRP_CONFIG_CHANGED";
static final String GMSCORE_PACKAGE = "com.google.android.gms";

// ...

// List of userId that can provision a factory reset device.
// You can use the value returned calling people/me endpoint.
List<String> accountIds = new ArrayList<String>();
accountIds.add("000000000000000000000");

dpm.setFactoryResetProtectionPolicy(
    adminName,
    new FactoryResetProtectionPolicy.Builder()
        .setFactoryResetProtectionAccounts(accountIds)
        .setFactoryResetProtectionEnabled(true)
        .build());

Intent frpChangedIntent = new Intent(ACTION_FRP_CONFIG_CHANGED);

frpChangedIntent.setPackage(GMSCORE_PACKAGE);
context.sendBroadcast(frpChangedIntent);

Heredada

Para dispositivos que no pueden usar setFactoryResetProtectionPolicy(), que se introdujo con Nivel de API 30, tu DPC puede usar setApplicationRestrictions para agregar las cuentas elegidas a la configuración administrada de factoryResetProtectionAdmin para el paquete com.google.android.gms.

Kotlin

const val GOOGLE_PLAY_APK = "com.android.vending"
const val FACTORY_RESET_PROTECTION_ADMIN = "factoryResetProtectionAdmin"
const val DISABLE_FACTORY_RESET_PROTECTION_ADMIN = "disableFactoryResetProtectionAdmin"
const val GMSCORE_PACKAGE = "com.google.android.gms"

// ...

val existingConfig = dpm.getApplicationRestrictions(adminName, GOOGLE_PLAY_APK)
val newConfig = Bundle(existingConfig)
newConfig.putBoolean(DISABLE_FACTORY_RESET_PROTECTION_ADMIN, false)
newConfig.putString(FACTORY_RESET_PROTECTION_ADMIN, googleAccounts)
dpm.setApplicationRestrictions(adminName, GOOGLE_PLAY_APK, newConfig)

val frpChangedIntent = Intent(ACTION_FRP_CONFIG_CHANGED)

frpChangedIntent.setPackage(GMSCORE_PACKAGE)
context.sendBroadcast(frpChangedIntent)

Java

static final String GOOGLE_PLAY_APK = "com.android.vending";
static final String FACTORY_RESET_PROTECTION_ADMIN = "factoryResetProtectionAdmin";
static final String DISABLE_FACTORY_RESET_PROTECTION_ADMIN = "disableFactoryResetProtectionAdmin";
static final String GMSCORE_PACKAGE = "com.google.android.gms";

// ...

Bundle existingConfig =
        dpm.getApplicationRestrictions(adminName, GOOGLE_PLAY_APK);
Bundle newConfig = new Bundle(existingConfig);
newConfig.putBoolean(DISABLE_FACTORY_RESET_PROTECTION_ADMIN, false);
newConfig.putStringArray(FACTORY_RESET_PROTECTION_ADMIN,
        accountIds.toArray(new String[accountIds.size()]));
dpm.setApplicationRestrictions(adminName, GOOGLE_PLAY_APK, newConfig);

Intent frpChangedIntent = new Intent(ACTION_FRP_CONFIG_CHANGED);

frpChangedIntent.setPackage(GMSCORE_PACKAGE);
context.sendBroadcast(frpChangedIntent);

Inhabilitar la protección contra el restablecimiento de la configuración de fábrica para empresas

Para inhabilitar la protección contra el restablecimiento de la configuración de fábrica, tu DPC puede usar setFactoryResetProtectionPolicy() y pasa el valor null.

Kotlin

const val ACTION_FRP_CONFIG_CHANGED =
    "com.google.android.gms.auth.FRP_CONFIG_CHANGED"
const val GMSCORE_PACKAGE = "com.google.android.gms"

// ...

dpm.setFactoryResetProtectionPolicy(adminName, null)

val frpChangedIntent = Intent(ACTION_FRP_CONFIG_CHANGED)

frpChangedIntent.setPackage(GMSCORE_PACKAGE)
context.sendBroadcast(frpChangedIntent)

Java

static final String ACTION_FRP_CONFIG_CHANGED =
    "com.google.android.gms.auth.FRP_CONFIG_CHANGED";
static final String GMSCORE_PACKAGE = "com.google.android.gms";

// ...

dpm.setFactoryResetProtectionPolicy(adminName, null);

Intent frpChangedIntent = new Intent(ACTION_FRP_CONFIG_CHANGED);

frpChangedIntent.setPackage(GMSCORE_PACKAGE);
context.sendBroadcast(frpChangedIntent);

Heredada

Para dispositivos que no pueden usar setFactoryResetProtectionPolicy(), que se introdujo con Nivel de API 30, tu DPC puede usar setApplicationRestrictions para definir una clave valor de true en los disableFactoryResetProtectionAdmin administrados del paquete com.google.android.gms.

Kotlin

const val GOOGLE_PLAY_APK = "com.android.vending"
const val FACTORY_RESET_PROTECTION_ADMIN = "factoryResetProtectionAdmin"
const val DISABLE_FACTORY_RESET_PROTECTION_ADMIN = "disableFactoryResetProtectionAdmin"
const val GMSCORE_PACKAGE = "com.google.android.gms"

// ...

val existingConfig = dpm.getApplicationRestrictions(adminName, GOOGLE_PLAY_APK)
val newConfig = Bundle(existingConfig)
newConfig.putBoolean(DISABLE_FACTORY_RESET_PROTECTION_ADMIN, true)

dpm.setApplicationRestrictions(
    adminName, GOOGLE_PLAY_SERVICES_PACKAGE, restrictions
)

val frpChangedIntent = Intent(ACTION_FRP_CONFIG_CHANGED)

frpChangedIntent.setPackage(GMSCORE_PACKAGE)
context.sendBroadcast(frpChangedIntent)

Java

static final String GOOGLE_PLAY_APK = "com.android.vending";
static final String FACTORY_RESET_PROTECTION_ADMIN = "factoryResetProtectionAdmin";
static final String DISABLE_FACTORY_RESET_PROTECTION_ADMIN = "disableFactoryResetProtectionAdmin";
static final String GMSCORE_PACKAGE = "com.google.android.gms";

// ...

Bundle existingConfig =
        dpm.getApplicationRestrictions(adminName, GOOGLE_PLAY_APK);
Bundle newConfig = new Bundle(existingConfig);
newConfig.putBoolean(DISABLE_FACTORY_RESET_PROTECTION_ADMIN, true);

dpm.setApplicationRestrictions(
    adminName, GOOGLE_PLAY_SERVICES_PACKAGE, restrictions);

Intent frpChangedIntent = new Intent(ACTION_FRP_CONFIG_CHANGED);

frpChangedIntent.setPackage(GMSCORE_PACKAGE);
context.sendBroadcast(frpChangedIntent);

Supervisa registros de procesos empresariales e informes de errores remotos

En tu consola de EMM, un administrador puede supervisar los dispositivos completamente administrados mediante registros de procesos e informes de errores remotos.

Registrar la actividad de los dispositivos empresariales

Un DPC que se ejecuta en el modo de propietario del dispositivo puede identificar actividad sospechosa al Seguimiento de la actividad del dispositivo, incluidos inicios de apps, Android Debug Bridge (adb) actividad y desbloqueos de pantalla. Los registros de procesos no requieren el consentimiento del usuario.

Para habilitar o inhabilitar el registro, un DPC llama a setSecurityLoggingEnabled().

Cuando hay un nuevo lote de registros disponible, un DeviceAdminReceiver recibe el Devolución de llamada onSecurityLogsAvailable(). Para recuperar los registros (después de recibe la devolución de llamada), un DPC llama a retrieveSecurityLogs().

Los DPC también pueden llamar a retrievePreRebootSecurityLogs() para recuperar la seguridad registros generados en el ciclo de reinicio anterior. Este es el intervalo entre el último reinicio del dispositivo y el reinicio anterior. Dispositivos no compatibles retrieveSecurityLogs() muestra null. Si la app recupera registros mediante retrievePreRebootSecurityLogs() y retrieveSecurityLogs(), debes comprueba si hay entradas duplicadas.
Nota: Esta función solo registra la actividad en dispositivos completamente administrados con un solo usuario o usuarios afiliados en el dispositivo. Esta función no está disponible en dispositivos personales, ya que registra la actividad en todo el dispositivo.

Este parámetro de configuración puede ser útil en la auditoría posterior a los eventos de seguridad, ya que registra los siguientes tipos de acciones:

  • Cada vez que la app se inicia desde cero Esto puede ayudar a identificar software malicioso que comienza con una app comprometida.
  • Intentos de desbloqueo incorrectos en un dispositivo. Esto podría identificar si hay varios intentos de desbloqueo fallidos en un período corto.
  • Comandos de adb potencialmente dañinos cuando un usuario se conecta el dispositivo a una computadora con un cable USB.

Para obtener detalles sobre cómo leer los registros, consulta SecurityLog.

Mientras desarrollas y pruebas, puedes hacer que el sistema haga lo siguiente: los registros de seguridad existentes disponibles para tu DPC, no es necesario que esperes un por lotes. En Android 9.0 (nivel de API 28) o versiones posteriores, ejecuta lo siguiente Android Debug Bridge (adb) en tu terminal:

adb shell dpm force-security-logs

El sistema limita la frecuencia con la que puedes usar la herramienta e informa cualquier una ralentización intencional en la salida de la terminal. Si hay registros disponibles, El DPC recibe la devolución de llamada onSecurityLogsAvailable().

Cómo solicitar un informe de errores de forma remota

Un DPC que se ejecuta en el modo de propietario del dispositivo puede solicitar de forma remota informes de errores para el usuario dispositivos con un solo usuario o usuarios afiliados El informe de errores capta la actividad del dispositivo en el momento exacto en que se solicita el informe de errores, pero también incluyen la actividad de las últimas horas, según la frecuencia con la que actualizaciones del búfer.

Para solicitar informes de errores de forma remota, el DPC llama a requestBugreport():

Cómo otorgar y quitar el acceso a un certificado de cliente

Si un DPC que se ejecuta en el modo de propietario de perfil o de propietario del dispositivo concede a una app de terceros administrar certificados, la app puede otorgarse acceso a certificados que instala sin intervención del usuario. Para instalar un certificado al que puedan acceder todas las apps de un perfil, usa installKeyPair().

Para ver qué parámetros configurar, consulta installKeyPair(). Esta función funciona en conjunto con la API existente para administrar certificados.

Situación de implementación

Sin el método installKeyPair():

  • Los usuarios deberán presionar el nombre del certificado y, luego, Permitir cada vez quieren otorgar acceso a un certificado.
  • Los usuarios ven un mensaje cuando instalan un certificado y deben asignarle un nombre certificado.

Con el método installKeyPair():

  • No es necesario que los usuarios presionen Permitir cada vez que quieran otorgar acceso a un certificado.
  • Los usuarios no pueden cambiar el nombre de los certificados.
  • Los administradores tienen más control, ya que pueden bloquear los certificados por que no deberían tener acceso a certificados específicos.

Cómo quitar un certificado de cliente

Después de otorgar acceso a un certificado de cliente, quitar el cliente de forma remota certificados instalados a través de installKeyPair(), llama removeKeyPair()

Un DPC que se ejecuta en el modo de propietario del dispositivo o en el modo de propietario del perfil, o delegado el instalador de certificados puede llamar a removeKeyPair(). Esto quita un certificado y par de claves privadas instalados con un alias de clave privada determinado.

Situación de implementación

Usa esta función si una organización está migrando a un cliente más seguro certificado. Si un administrador lanza un nuevo certificado y su distribución tarda mucho tiempo, el administrador puede revocar de Google Cloud cuando se complete la migración.

Restablecimiento seguro de la contraseña

Tu DPC puede restablecer la contraseña de un usuario autorizando el cambio con una token seguro y con registro previo. Los propietarios de dispositivos y perfiles pueden llamar APIs de restablecimiento de contraseña para cambiar la contraseña de dispositivos y perfiles de trabajo respectivamente. El restablecimiento seguro de la contraseña reemplaza resetPassword() por el las siguientes mejoras:

Debes realizar el restablecimiento seguro de contraseñas si la compilación de tu DPC tiene como objetivo Android 8.0 (API nivel 26) o una versión posterior. Llamar a resetPassword() arroja un SecurityException en DPC orientados a Android 8.0 o versiones posteriores, por lo que deberías necesitas actualizar tu DPC.

Configura y activa un token

Tu DPC debe establecer y activar un token antes de restablecer una contraseña. Porque es posible que tu DPC no pueda usar el token de inmediato, debes establecer el token antes de que un administrador de TI necesite usarlo.

Un token de restablecimiento de contraseña es un valor aleatorio criptográficamente seguro y debe tener al menos 32 bytes de longitud. Crear un token para cada dispositivo y perfil, lo que no debes reutilizar o compartir los tokens generados.

Recomendamos almacenar tokens, o los medios para desencriptar un token encriptado, en un servidor. Si almacenas tokens localmente en un almacenamiento encriptado por credenciales, tu DPC No puede restablecer la contraseña hasta que el usuario desbloquee el dispositivo o el perfil. Si almacenar los tokens de forma local en un almacenamiento encriptado por el dispositivo, que se ve comprometido un atacante puede usar el token para obtener acceso a un perfil de trabajo o una usuario.

Puedes generar un token nuevo en tu DPC o recuperar un token de un servidor. El En el siguiente ejemplo, se muestra un DPC que genera un token y lo informa a un servidor:

Kotlin

val token = ByteArray(32)

// Generate a new token
val random = SecureRandom()
random.nextBytes(token)

// Set the token to use at a later date
val success: Boolean
success = dpm.setResetPasswordToken(DeviceAdminReceiver.getComponentName(context), token)

// Activate the token and update success variable...

// Store the token on a server
if (success) {
 sendTokenToServer(token)
}

Java

byte token[] = new byte[32]; // Minimum size token accepted

// Generate a new token
SecureRandom random = new SecureRandom();
random.nextBytes(token);

// Set the token to use at a later date
boolean success;
success = dpm.setResetPasswordToken(DeviceAdminReceiver.getComponentName(getContext()), token);

// Activate the token and update success variable ...

// Store the token on a server
if (success) {
 sendTokenToServer(token);
}

En la mayoría de los casos, el DPC necesita activar un token después de configurarlo. Pero, cuando el usuario no tiene una contraseña de pantalla de bloqueo, el sistema activa un token de inmediato. Para activar un token, pídele al usuario que confirme sus credenciales. Tu DPC puede llamar al método KeyguardManager createConfirmDeviceCredentialIntent() para obtener un Intent que inicie el confirmación. Explícale al usuario del dispositivo en la interfaz de usuario, por qué estás para pedirle que se autentique. En el siguiente fragmento, se muestra cómo puedes activar un en tu DPC:

Kotlin

// In your DPC, you'll need to localize the user prompt
val ACTIVATE_TOKEN_PROMPT = "Use your credentials to enable remote password reset"
val ACTIVATE_TOKEN_REQUEST = 1

// Create or fetch a token and set it in setResetPasswordToken() ...
val keyguardManager = context.getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager
val confirmIntent = keyguardManager.createConfirmDeviceCredentialIntent(null, ACTIVATE_TOKEN_PROMPT)

if (confirmIntent != null) {
 startActivityForResult(confirmIntent, ACTIVATE_TOKEN_REQUEST)
 // Check your onActivityResult() callback for RESULT_OK
} else {
 // Null means the user doesn't have a lock screen so the token is already active.
 // Call isResetPasswordTokenActive() if you need to confirm
}

Java

// In your DPC, you'll need to localize the user prompt
static final String ACTIVATE_TOKEN_PROMPT =
 "Use your credentials to enable remote password reset";
static final int ACTIVATE_TOKEN_REQUEST = 1;

// Create or fetch a token and set it in setResetPasswordToken() ...

KeyguardManager keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
Intent confirmIntent = keyguardManager.createConfirmDeviceCredentialIntent(
  null, ACTIVATE_TOKEN_PROMPT);

if (confirmIntent != null) {
 startActivityForResult(confirmIntent, ACTIVATE_TOKEN_REQUEST);
 // Check your onActivityResult() callback for RESULT_OK
} else {
 // Null means the user doesn't have a lock screen so the token is already active.
 // Call isResetPasswordTokenActive() if you need to confirm
}

Debes activar un token que establezca el DPC antes de que se reinicie el dispositivo. En Android almacena un token desactivado en la memoria y no conserva el token tras un reiniciar. Si el usuario reinicia el dispositivo antes de activar un token, tu DPC puede vuelve a configurar el mismo token o genera uno nuevo.

Tu DPC puede confirmar que un token está activo llamando isResetPasswordTokenActive() y verificando que el resultado sea true.

Una vez que tu DPC establezca y active un token, será válido hasta que tu DPC borre o reemplaza el token (o se restablece el dispositivo a la configuración de fábrica). El token es independiente de la contraseña y no se ve afectada por el cambio o eliminación de la contraseña por parte del usuario.

Borra un token

Puedes llamar a clearResetPasswordToken() para borrar un token que tu DPC tenga en cuenta establecido anteriormente. Es posible que debas revocar un token comprometido o quitar la capacidad de restablecer la contraseña. En el siguiente ejemplo, se muestra cómo puedes hacer esto en tu DPC:

Kotlin

val dpm = getDpm()
val admin = DeviceAdminReceiver.getComponentName(requireActivity())

// Clear the token
if (!dpm.clearResetPasswordToken(admin)) {
 // Report the failure and possibly try later ...
}

Java

DevicePolicyManager dpm = getDpm();
ComponentName admin = DeviceAdminReceiver.getComponentName(getActivity());

// Clear the token
if (!dpm.clearResetPasswordToken(admin)) {
 // Report the failure and possibly try later ...
}

Restablecer la contraseña

Cuando un administrador de TI necesite restablecer la contraseña, llama al resetPasswordWithToken() y pasa el token que configuró y activó el DPC con anticipación:

Kotlin

val token: ByteArray = getTokenFromServer()
val newPassword = "password"

try {
 val result: Boolean = dpm.resetPasswordWithToken(
 DeviceAdminReceiver.getComponentName(requireContext()),
 newPassword,
 token,
 0
 )

 if (result) {
 // The password is now 'password'
 } else {
 // Using 'password' doesn't meet password restrictions
 }
} catch (e: IllegalStateException) {
 // The token doesn't match the one set earlier.
}

Java

byte token[] = getTokenFromServer();
String newPassword = "password";

try {
 boolean result = dpm.resetPasswordWithToken(
  DeviceAdminReceiver.getComponentName(getContext()), newPassword, token, 0);

 if (result) {
 // The password is now 'password'
 } else {
 // Using `password` doesn't meet password restrictions
 }
} catch (IllegalStateException e) {
 // The token doesn't match the one set earlier.
}

Una llamada a resetPasswordWithToken() muestra false, y la contraseña no indica cambian, cuando la nueva contraseña no cumple con las siguientes restricciones:

  • El número de caracteres cumple con cualquier restricción de longitud mínima de contraseña. Llamada getPasswordMinimumLength() para saber si un administrador estableció una restricción de longitud.
  • El rango y la complejidad de los caracteres de la contraseña se unen a una composición “compute.vmExternalIpAccess”. Llama a getPasswordQuality() para saber si un departamento de TI administrador estableció una restricción de composición.

Si las restricciones de calidad de las contraseñas no requieren que se establezca una contraseña, puedes pasa null o una cadena vacía a resetPasswordWithToken() para quitar la contraseña.

Comprobación de seguridad para perfiles de trabajo

Un DPC que se ejecuta en el modo de propietario del perfil puede requerir que los usuarios especifiquen una política para las apps que se ejecutan en el perfil de trabajo. El sistema muestra la configuración un desafío cuando el usuario intenta abrir cualquier aplicación de trabajo. Si el usuario se completó correctamente completa el desafío de seguridad, el sistema desbloquea el perfil de trabajo y la desencripta, si es necesario.

Cómo funciona el desafío de seguridad del perfil de trabajo

  1. Si un DPC envía un intent ACTION_SET_NEW_PASSWORD, el sistema solicita que el usuario configure un desafío de seguridad.
  2. El DPC también puede enviar un ACTION_SET_NEW_PARENT_PROFILE_PASSWORD para solicitarle al usuario que configure un bloqueo del dispositivo.

Un DPC puede establecer las políticas de contraseña para el desafío de trabajo de manera diferente a la para las contraseñas de otros dispositivos. Por ejemplo, la longitud mínima del la respuesta ante comprobación del dispositivo puede ser diferente de la longitud necesaria para otros contraseñas. Un DPC establece las políticas de desafío con la configuración Métodos DevicePolicyManager, como setPasswordQuality() y setPasswordMinimumLength()

Consideraciones

  • El DPC puede restablecer la contraseña del perfil de trabajo, pero no puede contraseña del dispositivo (personal). Si un usuario elige configurar contraseñas personales y de trabajo sea la misma, resetPassword() en el perfil de trabajo genera el error la contraseña se restablezca solo en el perfil de trabajo y la contraseña no será la misma para la pantalla de bloqueo del dispositivo.
  • Un DPC puede personalizar la pantalla de credenciales para el desafío de trabajo usando setOrganizationColor() y setOrganizationName().
  • Los administradores del dispositivo no pueden usar resetPassword() para borrar contraseñas o cambiar con los que ya están establecidos. Los administradores de dispositivos aún pueden establecer una contraseña, pero solo cuando el dispositivo no tiene contraseña, PIN ni patrón.

Para obtener información adicional, consulta getParentProfileInstance() y la referencia. documentación en DevicePolicyManager.