Le funzionalità di questa guida descrivono le funzionalità di gestione della sicurezza che puoi implementare nell'app controller dei criteri dei dispositivi (DPC). Questo documento contiene esempi di codice e puoi anche utilizzare l'app DPC di test come una sorgente di codice campione per le funzionalità aziendali di Android.
Un'app DPC può essere eseguita in modalità proprietario del profilo sui dispositivi personali o nel proprietario del dispositivo su dispositivi completamente gestiti. Questa tabella indica le funzionalità disponibili Quando il DPC è eseguito in modalità proprietario del profilo o proprietario del dispositivo:
Funzionalità | Proprietario del profilo | Proprietario del dispositivo |
---|---|---|
Disattivare l'accesso alle app | ✓ | ✓ |
Bloccare app di origini sconosciute | ✓ | ✓ |
Limitare gli account in Google Play | ✓ | ✓ |
Attivare la protezione ripristino dati di fabbrica per le aziende | ✓ | |
Monitorare i log di processo aziendale e le segnalazioni di bug da remoto | ✓ | |
Concedere l'accesso e rimuovere l'accesso a un certificato client | ✓ | ✓ |
Reimpostazione passcode sicura | ✓ | ✓ |
Sfida relativa alla sicurezza del profilo di lavoro | ✓ |
Disattivare l'accesso alle app
Per le organizzazioni che vogliono impedire ai dipendenti di giocare o guardare YouTube sul proprio dispositivo Android in determinate ore della giornata oppure in determinati giorni della settimana, un DPC può disattivare temporaneamente l'accesso alle app.
Per disattivare l'accesso alle app, un DPC eseguito in modalità proprietario del dispositivo o proprietario del profilo
configura setPackagesSuspended()
, l'app selezionata si comporta come se
è disabilitata (Avvio app di Google rende l'app non selezionabile). Quando un utente tocca l'app,
viene visualizzata una finestra di dialogo di sistema che comunica che l'app è sospesa.
Mentre un'app è sospesa, non può avviare attività e inviare notifiche al vengono soppressi. I pacchetti sospesi non vengono visualizzati nella panoramica schermo, non sarà possibile mostrare finestre di dialogo (inclusi toast e snackbar) e non può riprodurre audio o far vibrare il dispositivo.
Gli utenti di Avvio app possono scoprire se un'app è stata sospesa chiamando il
isPackageSuspended()
. Per maggiori dettagli su come configurare l'app
sospensione, consulta setPackagesSuspended
.
Blocca le app di origini sconosciute
Le app che non sono installate da Google Play (o da altri store attendibili) vengono chiamate app di origini sconosciute. Dispositivi e dati possono essere a rischio quando gli utenti installano queste app.
Per impedire che qualcuno installi app da fonti sconosciute, i componenti di amministrazione di
dispositivi completamente gestiti e profili di lavoro possono aggiungere
Limitazione utente DISALLOW_INSTALL_UNKNOWN_SOURCES
.
Limitazione a livello di dispositivo del profilo di lavoro
Quando l'amministratore di un profilo di lavoro aggiunge DISALLOW_INSTALL_UNKNOWN_SOURCES
,
la limitazione si applica solo al profilo di lavoro. Tuttavia, l'amministratore di un'opera
può applicare una limitazione a livello di dispositivo impostando un
configurazione gestita per Google Play. La limitazione a livello di dispositivo è
disponibile su Android 8.0 (o versioni successive) quando l'app Google Play installata è
versione 80812500 o successive.
Per limitare le installazioni di app a Google Play, procedi nel seguente modo:
- Impostare un bundle di configurazione gestita per il pacchetto Google Play
com.android.vending
. - Nel bundle, inserisci un valore booleano per il
verify_apps:device_wide_unknown_source_block
chiave. - Aggiungi la limitazione utente
ENSURE_VERIFY_APPS
.
L'esempio che segue mostra come verificare che Google Play supporti questa funzionalità.
e imposta il valore su 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);
L'interfaccia utente nelle impostazioni di sistema rimane attiva, ma il sistema blocca l'installazione di app. Questa limitazione si applica alle installazioni future, in precedenza le app installate rimangono sul dispositivo. Gli utenti dei dispositivi possono continuare a installare app nel profilo personale utilizzando Android Debug Bridge (adb).
Per scoprire di più sulle origini sconosciute, leggi l'articolo Distribuzione alternativa opzioni.
Limitare gli account in Google Play
A volte un'organizzazione potrebbe voler consentire agli utenti di aggiungere Account (per leggere la posta in Gmail, ad esempio) ma non desidera per installare le app. Il DPC può impostare un elenco di account in cui le persone possono utilizzare su Google Play.
I componenti amministrativi di dispositivi o profili di lavoro completamente gestiti possono limitare le impostando una configurazione gestita per Google Play. Account è disponibile quando l'app Google Play installata è la versione 80970100 o superiore.
Per limitare gli account in Google Play, procedi nel seguente modo:
- Impostare un bundle di configurazione gestita per il pacchetto Google Play
com.android.vending
. - Nel bundle, inserisci gli indirizzi email separati da virgole come valore stringa per
la chiave
allowed_accounts
.
L'esempio seguente mostra come limitare gli account:
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);
Per limitare Google Play solo all'account di lavoro, imposta allowed_accounts
su
un singolo account gestito non appena il DPC conosce l'indirizzo email dell'account. Un
la stringa vuota impedisce agli utenti che utilizzano qualsiasi account di Google Play.
Attivare la protezione aziendale del ripristino dei dati di fabbrica
Utilizzando la protezione ripristino dati di fabbrica per le aziende, le organizzazioni possono specificare quale Gli Account Google possono eseguire il provisioning di un dispositivo di cui sono stati ripristinati i dati di fabbrica.
La protezione ripristino dati di fabbrica per i consumatori è progettata per scoraggiare il furto dei dispositivi. Prima del giorno consentendo a chiunque di eseguire il provisioning del dispositivo dopo un ripristino dei dati di fabbrica non autorizzato (come come l'utilizzo di un EMM), la configurazione guidata richiede all'utente di autenticarsi presso qualsiasi Account Google già presenti sul profilo personale del dispositivo.
In un ambiente aziendale, il ripristino dei dati di fabbrica è uno strumento importante sui dispositivi dei dipendenti quando un dipendente lascia l'organizzazione. Tuttavia, se l'organizzazione non conosce le credenziali dell'account di un dipendente, ripristina i dati di fabbrica la protezione può impedire all'organizzazione di inviare un dispositivo a un altro dipendente.
Controllare il provisioning dopo un ripristino dei dati di fabbrica
Quando è in modalità proprietario del dispositivo, il DPC può utilizzare
setFactoryResetProtectionPolicy()
per controllare quali account
hai l'autorizzazione a eseguire il provisioning di un dispositivo dopo un ripristino dei dati di fabbrica. Se questa configurazione
è impostato su null
o su un elenco vuoto, gli account autorizzati al provisioning
dispositivo dopo un ripristino dei dati di fabbrica sono gli account del profilo personale
dispositivo.
Un DPC può configurare questi account per tutta la durata di un account completamente gestito dispositivo.
- L'amministratore IT può utilizzare il metodo
people.get
dell'API People con il valore specialeme
. Viene recuperato il valoreuserId
per dopo aver eseguito l'accesso.userID
viene restituito nella chiaveresourceName
in nel formatopeople/[userId]
come stringa di numeri interi. Gli account appena creati non sarà disponibile per il ripristino dei dati di fabbrica per 72 ore. - Potresti anche voler consentire a uno o più amministratori IT di sbloccare il dispositivo dopo
un ripristino dei dati di fabbrica. Chiedi a ciascuno di questi amministratori IT di accedere al proprio Account Google e
anche seguire il passaggio 1 e condividere i suoi
userId
con te, in modo che tu possa aggiungerliuserIds
all'elenco nel passaggio successivo. - Il DPC imposta una limitazione dell'app appropriata
setFactoryResetProtectionPolicy()
per impostare l'elenco diuserId
che possono eseguire il provisioning di un dispositivo ripristinato ai dati di fabbrica. - Il DPC consente agli account che possono eseguire il provisioning dei dispositivi dopo una fabbrica
reimpostata inviando il broadcast
com.google.android.gms.auth.FRP_CONFIG_CHANGED
come intento esplicito di per evitare l'eliminazione a causa di restrizioni in background.
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);
Precedente
Per i dispositivi che non possono utilizzare setFactoryResetProtectionPolicy()
, introdotto con
API di livello 30, il tuo DPC può utilizzare setApplicationRestrictions
per aggiungere
gli account selezionati alla configurazione gestita factoryResetProtectionAdmin
per il pacchetto 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);
Disattiva la protezione ripristino dati di fabbrica per le aziende
Per disattivare la protezione ripristino dati di fabbrica, il DPC può utilizzare
setFactoryResetProtectionPolicy()
e viene passato il valore 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);
Precedente
Per i dispositivi che non possono utilizzare setFactoryResetProtectionPolicy()
, introdotto con
con il livello API 30, il DPC può utilizzare setApplicationRestrictions
per impostare una chiave
valore di true
nella categoria disableFactoryResetProtectionAdmin
gestita
per il pacchetto 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);
Monitorare i log dei processi aziendali e le segnalazioni di bug da remoto
Nella tua console EMM, un amministratore può monitorare i dispositivi completamente gestiti utilizzando log di processo e segnalazioni di bug da remoto.
Registra attività dispositivo aziendale
Un DPC in modalità proprietario del dispositivo può identificare le attività sospette da remoto monitoraggio dell'attività del dispositivo, inclusi lanci di app, Android Debug Bridge (adb) attività e sblocchi schermo. I log di processo non richiedono il consenso dell'utente.
Per attivare o disattivare il logging, un DPC chiama setSecurityLoggingEnabled()
.
Quando è disponibile un nuovo batch di log, DeviceAdminReceiver
riceve
Chiamata di onSecurityLogsAvailable()
. Per recuperare i log (dopo
quando viene richiamato), un DPC chiama retrieveSecurityLogs()
.
I DPC possono anche chiamare retrievePreRebootSecurityLogs()
per recuperare il livello di sicurezza
generati nel ciclo di riavvio precedente. Si tratta dell'intervallo tra
l'ultimo riavvio del dispositivo
e il riavvio precedente. Dispositivi che non supportano
retrieveSecurityLogs()
restituisce null
. Se l'app recupera i log utilizzando entrambi
retrievePreRebootSecurityLogs()
e retrieveSecurityLogs()
, devi
verifica la presenza di voci duplicate.
Nota: questa funzionalità registra solo le attività sui dispositivi completamente gestiti con un singolo
utente o utenti affiliati sul dispositivo. Questa funzionalità non è supportata su
dispositivi personali, perché registra l'attività a livello di dispositivo.
Questa impostazione può essere utile nel controllo successivo agli eventi di sicurezza perché registra i seguenti tipi di azione:
- Ogni volta che l'app viene avviata di recente. Questo può aiutare a identificare se c'è malware che inizia con un'app compromessa.
- Tentativi di sblocco non riusciti su un dispositivo. Questo potrebbe identificare se ci sono diversi tentativi di sblocco non riusciti in un breve periodo di tempo.
- Comandi ADB potenzialmente dannosi quando un utente si connette il dispositivo a un computer tramite un cavo USB.
Per maggiori dettagli su come leggere i log, vedi SecurityLog
.
Durante lo sviluppo e il test, puoi forzare il sistema a eseguire i log di sicurezza esistenti disponibili per il DPC, non devi aspettare batch. In Android 9.0 (livello API 28) o versioni successive, esegui quanto segue Comando Android Debug Bridge (adb) nel tuo terminale:
adb shell dpm force-security-logs
Il sistema limita la frequenza di utilizzo dello strumento e segnala qualsiasi
intenzionale dell'output del terminale. Se sono disponibili log,
Il DPC riceve il callback onSecurityLogsAvailable()
.
Richiedere da remoto una segnalazione di bug
Un DPC in modalità proprietario del dispositivo può richiedere da remoto segnalazioni di bug per l'utente dispositivi con un solo utente o utenti affiliati. La segnalazione di bug acquisisce l'attività del dispositivo nel momento esatto in cui viene richiesta la segnalazione di bug, ma potrebbe anche includi l'attività delle ore precedenti, in base alla frequenza con cui il logcat del buffer.
Per richiedere da remoto segnalazioni di bug, il DPC chiama requestBugreport()
:
- Se un utente accetta di condividere la segnalazione di bug, il DPC riceve il bug.
genera report utilizzando
onBugreportShared()
- Se un utente nega la condivisione della segnalazione di bug, il DPC riceve
messaggio di richiesta rifiutata utilizzando
onBugreportSharingDeclined()
- Se la segnalazione di bug ha esito negativo, il DPC vede
onBugreportFailed()
conBUGREPORT_FAILURE_FAILED_COMPLETING
oppureBUGREPORT_FAILURE_FILE_NO_LONGER_AVAILABLE
Concedi l'accesso e rimuovi l'accesso a un certificato client
Se un DPC eseguito in modalità proprietario del profilo o proprietario del dispositivo concede a un'app di terze parti
gestire i certificati, l'app può concedersi l'accesso a
di certificati installati senza l'intervento dell'utente. Per installare
certificato accessibile a tutte le app in un profilo, utilizza installKeyPair()
.
Per i parametri da configurare, vedi installKeyPair()
. Questa funzionalità
insieme all'API esistente per la gestione dei certificati.
Scenario di deployment
Senza il metodo installKeyPair()
:
- Gli utenti devono toccare il nome del certificato e toccare Consenti ogni volta. che vogliono concedere l'accesso a un certificato.
- Gli utenti visualizzano un messaggio durante l'installazione di un certificato e devono assegnare un nome certificato.
Con il metodo installKeyPair()
:
- Non è necessario che gli utenti tocchino Consenti ogni volta che vogliono concedere l'accesso a un certificato.
- Gli utenti non possono rinominare i certificati.
- Gli amministratori hanno maggiore controllo in quanto possono bloccare i certificati per App che non dovrebbero avere accesso a certificati specifici.
Rimuovi un certificato client
Dopo aver concesso l'accesso a un certificato client, per rimuovere il client da remoto
certificati installati tramite installKeyPair()
, richiama
removeKeyPair()
.
Un DPC in esecuzione in modalità proprietario del dispositivo o proprietario del profilo, oppure delegato
il programma di installazione dei certificati può chiamare removeKeyPair()
. In questo modo viene rimosso
il certificato e la coppia di chiavi private installati in un determinato alias di chiave privata.
Scenario di deployment
Utilizza questa funzionalità se un'organizzazione sta eseguendo la migrazione a un client più sicuro certificato. Se un amministratore implementa un nuovo certificato e la sua distribuzione richiede molto tempo, l'amministratore può revocare certificati al termine della migrazione.
Reimpostazione passcode sicuro
Il DPC può reimpostare la password di un utente autorizzando la modifica con un
un token sicuro preregistrato. I proprietari del dispositivo e dei profili possono effettuare chiamate sicure
API di reimpostazione dei passcode per cambiare la password dei dispositivi e dei profili di lavoro
rispettivamente. La reimpostazione del passcode sicuro sostituisce resetPassword()
con il
i seguenti miglioramenti:
- Il DPC può reimpostare il passcode prima che l'utente sblocchi il dispositivo o il profilo dopo un riavvio sui dispositivi che utilizzano crittografia basata su file.
- L'archivio chiavi Android conserva le chiavi autenticate dall'utente. dopo la reimpostazione del passcode.
Devi usare la reimpostazione sicura del passcode se la build DPC ha come target Android 8.0 (API
livello 26) o superiore. La chiamata di resetPassword()
genera un
SecurityException
nei DPC che hanno come target Android 8.0 o versioni successive, quindi
devi aggiornare il tuo DPC.
Imposta e attiva un token
Il DPC deve impostare e attivare un token prima di reimpostare una password. Poiché il tuo DPC potrebbe non essere in grado di utilizzare subito il token, lo imposti prima che un amministratore IT debba usarlo.
Un token di reimpostazione della password è un valore casuale crittograficamente efficace che deve e avere una lunghezza di almeno 32 byte. Crea un token per ogni dispositivo e profilo (non di riutilizzare o condividere i token generati.
Consigliamo di archiviare i token, o i mezzi per decriptare un token criptato, su una o server web. Se archivi i token localmente nell'archiviazione con crittografia delle credenziali, il DPC non può reimpostare la password finché l'utente non sblocca il dispositivo o il profilo. Se archiviare i token localmente nello spazio di archiviazione criptato del dispositivo, che viene compromesso un malintenzionato potrebbe utilizzare il token per accedere a un profilo di lavoro o a un utente.
Puoi generare un nuovo token nel DPC o recuperare un token da un server. La l'esempio riportato di seguito mostra un DPC che genera automaticamente un token e lo segnala a un server:
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); }
Nella maggior parte dei casi, il DPC deve attivare un token dopo averlo impostato. Ma quando
l'utente non dispone di una password per la schermata di blocco, il sistema attiva un token
immediatamente. Per attivare un token, chiedi all'utente di confermare le proprie credenziali.
Il DPC può chiamare il metodo KeyguardManager
createConfirmDeviceCredentialIntent()
per ottenere un Intent
che avvii
conferma. Spiega all'utente del dispositivo nell'interfaccia utente perché
chiedendo loro di autenticarsi. Lo snippet seguente mostra come attivare un
nel tuo 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 }
Devi attivare un token impostato dal DPC prima che il dispositivo si riavvii. Android archivia un token non attivato in memoria e non lo rende permanente dopo un riavvio. Se l'utente riavvia il dispositivo prima di attivare un token, il DPC può impostare di nuovo lo stesso token o generarne uno nuovo.
Il tuo DPC può verificare che un token sia attivo chiamando
isResetPasswordTokenActive()
e controllo del risultato è true
.
Dopo che il DPC imposta e attiva un token, questo è valido fino a quando il DPC non elimina o sostituisce il token (o vengono ripristinati i dati di fabbrica del dispositivo). Il token è indipendente la password e non viene influenzata dalla modifica o dalla cancellazione della password da parte dell'utente.
Elimina un token
Puoi chiamare clearResetPasswordToken()
per eliminare un token che il tuo DPC (controller criteri dispositivi)
impostate prima. Potresti dover revocare un token compromesso
rimuovere la possibilità di reimpostare la password. L'esempio seguente mostra come procedere
nel DPC (controller criteri dispositivi):
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 ... }
Reimpostare la password
Quando un amministratore IT deve reimpostare la password, chiama
resetPasswordWithToken()
e passa il token che il DPC ha impostato e attivato
in anticipo:
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 chiamata a resetPasswordWithToken()
restituisce false
e la password non
modificare, quando la nuova password non soddisfa i seguenti vincoli:
- Il numero di caratteri soddisfa qualsiasi vincolo di lunghezza minima della password. Chiama
getPasswordMinimumLength()
per sapere se un team IT l'amministratore ha impostato un vincolo di lunghezza. - La gamma e la complessità dei caratteri di una password corrispondono a una composizione
di blocco. Chiama il numero
getPasswordQuality()
per sapere se un IT un vincolo di composizione.
Se i vincoli di qualità delle password non richiedono l'impostazione di una password, puoi
passa null
o una stringa vuota a resetPasswordWithToken()
per rimuovere
password.
Verifica della sicurezza del profilo di lavoro
Un DPC eseguito in modalità proprietario del profilo può richiedere agli utenti di specificare una sfida per le app eseguite nel profilo di lavoro. Il sistema mostra lo stato verifica quando l'utente tenta di aprire un'app di lavoro. Se l'utente riesce completa la verifica per la sicurezza, il sistema sblocca il profilo di lavoro se necessario, la decripta.
Come funziona la verifica di sicurezza del profilo di lavoro
- Se un DPC invia un intent
ACTION_SET_NEW_PASSWORD
, il sistema richiede all'utente di impostare una verifica di sicurezza. - Il DPC può anche inviare una
ACTION_SET_NEW_PARENT_PROFILE_PASSWORD
di chiedere all'utente di impostare un blocco del dispositivo.
Un DPC può impostare i criteri relativi alle password per la sfida di lavoro in modo diverso
criteri per le altre password dei dispositivi. Ad esempio, la lunghezza minima
la risposta alla verifica del dispositivo può essere diversa dalla lunghezza richiesta per altre
password. Un DPC imposta i criteri di verifica utilizzando il
DevicePolicyManager
, come setPasswordQuality()
e
setPasswordMinimumLength()
Considerazioni
- Il DPC può reimpostare la password sul profilo di lavoro, ma non può reimpostare
password del dispositivo (personale). Se un utente sceglie di impostare password personali e di lavoro
sia lo stesso, allora
resetPassword()
sul profilo di lavoro fa sì che password da reimpostare solo sul profilo di lavoro e la password non sarà la stessa per la schermata di blocco del dispositivo. - Un DPC può personalizzare la schermata delle credenziali per la sfida di lavoro utilizzando
setOrganizationColor()
esetOrganizationName()
. - Gli amministratori dei dispositivi non possono usare
resetPassword()
per cancellare le password o modificarle quelli già impostati. Gli amministratori dei dispositivi possono impostare una password, ma se il dispositivo non ha password, PIN o sequenze.
Per ulteriori informazioni, consulta getParentProfileInstance()
e i riferimenti
documentazione in DevicePolicyManager
.