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:
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:
- Establece un paquete de configuración administrada para el paquete de Google Play
com.android.vending
- En el paquete, escribe un valor booleano para el
Tecla
verify_apps:device_wide_unknown_source_block
. - 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:
- Establece un paquete de configuración administrada para el paquete de Google Play
com.android.vending
- 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.
- El administrador de TI puede usar el método
people.get
de la API de People con el valor especialme
. Esto recupera eluserId
de la con la que accediste. Se muestrauserID
en la claveresourceName
en el formulariopeople/[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. - 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 estosuserIds
a la lista en el siguiente paso. - El DPC establece una restricción de aplicación adecuada usando
setFactoryResetProtectionPolicy()
para establecer la lista deuserId
que pueden aprovisionar un dispositivo de restablecimiento de la configuración de fábrica. - 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()
:
- Si un usuario acepta compartir el informe de errores, el DPC recibe el error.
generar informes con
onBugreportShared()
- Si un usuario rechaza compartir el informe de errores, el DPC recibe un aviso
Solicitar mensaje denegado con
onBugreportSharingDeclined()
- Si falla el informe de errores, el DPC verá
onBugreportFailed()
conBUGREPORT_FAILURE_FAILED_COMPLETING
oBUGREPORT_FAILURE_FILE_NO_LONGER_AVAILABLE
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:
- Tu DPC puede restablecer la contraseña antes de que el usuario desbloquee el dispositivo o perfil luego de un reinicio en dispositivos que usan encriptación basada en archivos.
- Android Keystore conserva claves autenticadas por el usuario después de restablecer la contraseña.
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
- Si un DPC envía un intent
ACTION_SET_NEW_PASSWORD
, el sistema solicita que el usuario configure un desafío de seguridad. - 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()
ysetOrganizationName()
. - 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
.