Bezpieczeństwo

Funkcje w tym przewodniku opisują możliwości zarządzania zabezpieczeniami, które można zaimplementować w aplikacji kontroler zasad urządzeń (DPC). Ten dokument zawiera przykładowy kod. Możesz też użyć aplikacji Test DPC jako przykładowego kodu funkcji biznesowych Androida.

Aplikacja DPC może działać w trybie właściciela profilu na urządzeniach osobistych lub u właściciela urządzenia na w pełni zarządzanych urządzeniach. Ta tabela pokazuje, które funkcje są dostępne gdy DPC działa w trybie właściciela profilu lub urządzenia:

Funkcja Właściciel profilu Właściciel urządzenia
Wyłączanie dostępu do aplikacji
Blokowanie aplikacji z nieznanych źródeł
Ograniczanie dostępu do kont w Google Play
Włącz firmową ochronę przywracania do ustawień fabrycznych
Monitorowanie firmowych dzienników procesów i zdalnych raportów o błędach
Przyznawanie i odbieranie dostępu do certyfikatu klienta
Bezpieczne resetowanie kodu dostępu
Zabezpieczenie profilu służbowego

Wyłączanie dostępu do aplikacji

Dla organizacji, które chcą zablokować pracownikom możliwość grania w gry lub oglądania treści o określonych porach dnia w YouTube na urządzeniach z Androidem, w określone dni tygodnia DPC może tymczasowo wyłączyć dostęp do aplikacji.

Aby wyłączyć dostęp do aplikacji, DPC działający w trybie właściciela urządzenia lub właściciela profilu konfiguruje setPackagesSuspended(), a wybrana aplikacja działa tak, jakby jest wyłączona (program uruchamiający Google wyszarzy aplikację). Gdy użytkownik kliknie aplikację, zobaczy okno systemowe z informacją, że aplikacja jest zawieszona.

Po zawieszeniu aplikacji nie może ona rozpoczynać aktywności ani otrzymywać powiadomień są pomijane. Zawieszone pakiety nie są widoczne w omówieniu raportów. ekranu, nie mogą wyświetlać okien (w tym powiadomień i pasków powiadomień), Nie można odtworzyć dźwięku ani włączyć wibracji urządzenia.

Program uruchamiający może sprawdzić, czy aplikacja jest zawieszona, wywołując isPackageSuspended(). Szczegółowe informacje o konfigurowaniu aplikacji dotyczące zawieszenia konta, patrz setPackagesSuspended.

Blokowanie aplikacji z nieznanych źródeł

Aplikacje, które nie zostały zainstalowane z Google Play (lub innego zaufanego sklepu z aplikacjami), nazywane aplikacjami z nieznanych źródeł. Urządzenia i dane mogą być bardziej narażone na ryzyko podczas instalowania tych aplikacji.

Aby uniemożliwić komuś instalowanie aplikacji z nieznanych źródeł, komponenty administracyjne W pełni zarządzane urządzenia i profile służbowe mogą dodawać Ograniczenie dotyczące użytkownika DISALLOW_INSTALL_UNKNOWN_SOURCES.

Ograniczenie dotyczące profilu służbowego na całym urządzeniu

Gdy administrator profilu służbowego doda DISALLOW_INSTALL_UNKNOWN_SOURCES, ograniczenie dotyczy tylko profilu służbowego. Administrator zadania profilu mogą wprowadzić ograniczenia dotyczące całego urządzenia, ustawiając konfiguracją zarządzaną na potrzeby Google Play. Ograniczenie dotyczące całego urządzenia to jest dostępna na urządzeniach z Androidem 8.0 (lub nowszym) po zainstalowaniu aplikacji Google Play wersji 80812500 lub nowszej.

Aby ograniczyć instalowanie aplikacji do Google Play, wykonaj te czynności:

  1. Ustaw pakiet konfiguracji zarządzanej na potrzeby pakietu Google Play com.android.vending
  2. W pakiecie umieść wartość logiczną dla funkcji verify_apps:device_wide_unknown_source_block klawisz.
  3. Dodaj ograniczenie dotyczące użytkownika ENSURE_VERIFY_APPS.

Ten przykład pokazuje, jak sprawdzić, czy Google Play obsługuje tę funkcję i ustaw wartość 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);

Interfejs użytkownika w ustawieniach systemu pozostaje aktywny, ale system blokuje instalacja aplikacji. To ograniczenie będzie mieć wpływ na przyszłe instalacje – wcześniej zainstalowane aplikacje pozostają na urządzeniu. Użytkownicy urządzeń mogą nadal instalować aplikacje do profilu osobistego za pomocą narzędzia Android Debug Bridge (adb).

Aby dowiedzieć się więcej o nieznanych źródłach, przeczytaj artykuł Rozkład alternatywny .

Ograniczanie kont w Google Play

Czasami organizacja może zezwolić użytkownikom na dodawanie konta (np. do czytania e-maili w Gmailu), ale nie są przeznaczone aby instalować aplikacje. DPC może określić listę kont, na których użytkownicy mogą używać Google Play.

Komponenty administracyjne urządzeń w pełni zarządzanych lub profili służbowych mogą ograniczać Konfigurując zarządzaną konfigurację Google Play, Konto ograniczenie jest dostępne, gdy zainstalowana aplikacja Google Play ma wersję 80970100 lub wyższą.

Aby ograniczyć liczbę kont w Google Play:

  1. Ustaw pakiet konfiguracji zarządzanej na potrzeby pakietu Google Play com.android.vending
  2. W pakiecie umieść rozdzielone przecinkami adresy e-mail jako ciąg znaków dla argumentu klawisz allowed_accounts.

Poniższy przykład pokazuje, jak możesz ograniczyć liczbę kont:

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

Aby ograniczyć Google Play tylko do konta służbowego, ustaw allowed_accounts na z jednego konta zarządzanego, gdy tylko DPC zna jego adres e-mail. An pusty ciąg znaków uniemożliwia użytkownikom korzystanie z jakiegokolwiek konta w Google Play.

Włączanie firmowej ochrony urządzeń po przywróceniu do ustawień fabrycznych

Przy użyciu firmowej ochrony przywracania do ustawień fabrycznych organizacje mogą określać, Konta Google umożliwiają obsługę administracyjną urządzenia, na którym przywrócono ustawienia fabryczne.

Ochrona przywracania do ustawień fabrycznych ma zapobiegać kradzieży urządzenia. Przed umożliwianie obsługi administracyjnej urządzenia po przywróceniu ustawień fabrycznych (np. jako dostawca usług EMM), kreator konfiguracji wymaga od użytkownika uwierzytelnienia konta Google, które wcześniej były dostępne w profilu osobistym na urządzeniu.

W środowisku korporacyjnym resetowanie do ustawień fabrycznych jest ważnym narzędziem do zarządzania urządzeń pracowników po odejściu przez pracownika z organizacji. Jeśli jednak organizacja nie zna danych logowania do konta pracownika, reset fabryczny może zablokować możliwość wysyłania przez organizację urządzenia do innego pracownik.

Kontrolowanie obsługi administracyjnej po przywróceniu ustawień fabrycznych

W trybie właściciela urządzenia DPC może używać: setFactoryResetProtectionPolicy(), aby kontrolować, które konta uprawniony do obsługi administracyjnej urządzenia po przywróceniu ustawień fabrycznych. Jeśli ta konfiguracja ma wartość null lub lista jest pusta, oznacza to konta upoważnione do obsługi administracyjnej, po przywróceniu ustawień fabrycznych urządzenia są konta w profilu osobistym urządzenia.

DPC może konfigurować te konta przez cały okres istnienia w pełni zarządzanej usługi urządzenia.

  1. Administrator IT może użyć metody people.get z interfejsu People API o specjalnej wartości me. Pobiera ona userId dla zalogowanego konta. Parametr userID jest zwracany w kluczu resourceName w argumencie format people/[userId] jako ciąg liczby całkowitej. Nowo utworzone konta mogą nie będą dostępne w celu przywrócenia ustawień fabrycznych przez 72 h.
  2. Możesz też umożliwić jednemu lub kilku administratorom IT odblokowywanie urządzenia po przywrócenie urządzenia do ustawień fabrycznych. Poproś każdego z tych administratorów IT o zalogowanie się na swoje konto Google. wykonaj też krok 1 i udostępnij Ci swoje userId, aby móc je dodać userIds do listy w następnym kroku.
  3. DPC ustawia odpowiednie ograniczenia aplikacji za pomocą: setFactoryResetProtectionPolicy(), aby ustawić listę elementów userId, które mogą udostępnić urządzenie do ustawień fabrycznych.
  4. DPC włącza konta, które mogą obsługiwać urządzenia po fabryce zresetować przez wysłanie komunikatu com.google.android.gms.auth.FRP_CONFIG_CHANGED jako wyraźny zamiar – są nie do usunięcia z powodu ograniczeń w tle.

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

Starsze

W przypadku urządzeń, które nie mogą korzystać z funkcji setFactoryResetProtectionPolicy(), wprowadzonych za pomocą API poziomu 30, DPC może użyć setApplicationRestrictions, aby dodać wybrane konta do konfiguracji zarządzanej factoryResetProtectionAdmin dla pakietu 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);

Wyłącz firmową ochronę przywracania do ustawień fabrycznych

Aby wyłączyć ochronę przywracania do ustawień fabrycznych, DPC może użyć: setFactoryResetProtectionPolicy()przekazywanie wartości 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);

Starsze

W przypadku urządzeń, które nie mogą korzystać z funkcji setFactoryResetProtectionPolicy(), wprowadzonych za pomocą API poziomu 30, DPC może użyć setApplicationRestrictions do ustawienia klucza wartość true w disableFactoryResetProtectionAdmin zarządzanych dla pakietu 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);

Monitoruj firmowe logi procesów i zdalne raporty o błędach

W konsoli EMM administrator może monitorować w pełni zarządzane urządzenia za pomocą funkcji Enterprise dzienników procesów i zdalnych raportów o błędach.

Rejestruj aktywność związaną z urządzeniami firmowymi

DPC działający w trybie właściciela urządzenia może zdalnie rozpoznawać podejrzaną aktywność śledzenie aktywności urządzeń, w tym nowych aplikacji, Android Debug Bridge (adb) aktywność i odblokowania ekranu. Dzienniki procesów nie wymagają zgody użytkownika.

Aby włączyć lub wyłączyć rejestrowanie, DPC wywołuje setSecurityLoggingEnabled().

Gdy dostępna będzie nowa grupa logów, DeviceAdminReceiver otrzyma onSecurityLogsAvailable() oddzwanianie. Aby pobrać dzienniki (po DPC wywołuje retrieveSecurityLogs().

DPC może też wywołać parametr retrievePreRebootSecurityLogs(), aby pobrać zabezpieczenia wygenerowanych podczas poprzedniego cyklu ponownego uruchamiania. Jest to odstęp między parametrem ostatniego restartu urządzenia i poprzedniego restartu. Urządzenia, które nie obsługują retrieveSecurityLogs() zwraca wartość null. Jeśli aplikacja pobiera logi przy użyciu obu metod retrievePreRebootSecurityLogs() i retrieveSecurityLogs(), musisz sprawdzić, czy wpisy nie są zduplikowane.
Uwaga: ta funkcja rejestruje aktywność tylko na w pełni zarządzanych urządzeniach użytkownika lub powiązanych użytkowników na urządzeniu. Ta funkcja nie działa na na urządzeniach osobistych, ponieważ rejestruje aktywność na całym urządzeniu.

To ustawienie może być przydatne podczas kontroli po zdarzeniach związanych z bezpieczeństwem, ponieważ rejestruje następujące typy działań:

  • Za każdym razem, gdy aplikacja jest uruchamiana od nowa. Pomoże to określić, czy złośliwe oprogramowanie, którego początkiem jest zaatakowana aplikacja.
  • Nieudane próby odblokowania urządzenia. Pomoże to określić, czy kilka nieudanych prób odblokowania w krótkim czasie.
  • Potencjalnie szkodliwe polecenia adb, gdy użytkownik łączy się urządzenie do komputera kablem USB.

Szczegółowe informacje o odczytywaniu logów znajdziesz w sekcji SecurityLog.

W trakcie programowania i testowania możesz wymusić w systemie istniejące dzienniki zabezpieczeń dostępne dla DPC – nie musisz czekać, wsad. W Androidzie 9.0 (poziom interfejsu API 28) lub nowszym uruchom te polecenia Android Debug Bridge (adb) w terminalu:

adb shell dpm force-security-logs

System ogranicza częstotliwość korzystania z narzędzia i zgłasza celowe spowolnienie pracy na danych wyjściowych terminala. Jeśli są dostępne dzienniki, DPC otrzymuje wywołanie zwrotne onSecurityLogsAvailable().

Poproś zdalnie o raport o błędzie

DPC działający w trybie właściciela urządzenia może zdalnie poprosić użytkownika o raporty o błędach urządzeń, które mają tylko jednego użytkownika lub powiązanych użytkowników. Raport o błędzie zawiera informacje aktywności urządzenia w momencie wysłania prośby o raport, ale może też mogą zawierać aktywność z ostatnich kilku godzin, w zależności od tego, jak często odświeżenia bufora.

Aby zdalnie zgłosić błąd, DPC wywołuje requestBugreport():

Przyznawanie dostępu i odbieranie dostępu do certyfikatu klienta

Jeśli DPC działający w trybie właściciela profilu lub urządzenia przyznaje aplikacji innej firmy zarządzanie certyfikatami, aplikacja może przyznawać sobie dostęp do które instaluje bez udziału użytkownika. Aby zainstalować certyfikatu, do którego mają dostęp wszystkie aplikacje w profilu, użyj installKeyPair().

Informacje o konfigurowaniu parametrów znajdziesz w sekcji installKeyPair(). Ta funkcja współpracuje z istniejącym interfejsem API do zarządzania certyfikatami.

Scenariusz wdrożenia

Bez metody installKeyPair():

  • Użytkownicy muszą kliknąć nazwę certyfikatu i za każdym razem kliknąć Zezwól którzy chcą przyznać dostęp do certyfikatu.
  • Podczas instalowania certyfikatu użytkownicy widzą monit i muszą nazwać certyfikat.

Za pomocą metody installKeyPair():

  • Użytkownicy nie muszą klikać Zezwól za każdym razem, gdy chcą przyznać dostęp do certyfikat.
  • Użytkownicy nie mogą zmieniać nazw certyfikatów.
  • Administratorzy mają większą kontrolę, mogą blokować certyfikaty dla które nie powinny mieć dostępu do określonych certyfikatów.

Usuwanie certyfikatu klienta

Aby zdalnie usunąć klienta po przyznaniu dostępu do certyfikatu klienta certyfikaty zainstalowane przez installKeyPair(), wywołaj removeKeyPair()

DPC działający w trybie właściciela urządzenia lub właściciela profilu albo instalator certyfikatów może wywołać metodę removeKeyPair(). Spowoduje to usunięcie certyfikat i para kluczy prywatnych zainstalowanych pod podanym aliasem klucza prywatnego.

Scenariusz wdrożenia

Użyj tej funkcji, jeśli organizacja przechodzi na bezpieczniejszą formę klienta certyfikat. Jeśli administrator wdroży nowy certyfikat i jego rozpowszechnianie zajmuje dużo czasu, administrator może anulować wycofane certyfikatów po zakończeniu migracji.

Resetowanie bezpiecznego kodu dostępu

DPC może zresetować hasło użytkownika, autoryzując zmianę za pomocą zarejestrowanego wcześniej, bezpiecznego tokena. Właściciele urządzeń i właściciele profili mogą dzwonić pod numery Bezpieczne interfejsy API do resetowania haseł umożliwiające zmianę haseł do urządzeń i profili służbowych . Zresetowanie bezpiecznego kodu dostępu spowoduje zastąpienie resetPassword() następujące ulepszenia:

Jeśli Twoja kompilacja DPC jest kierowana na Androida 8.0 (interfejs API), użyj bezpiecznego resetowania kodu dostępu na poziomie 26) lub wyższym. Dzwonienie do resetPassword() powoduje zgłoszenie błędu SecurityException w grach DPC kierowanych na Androida 8.0 lub nowszego, musisz zaktualizować DPC.

Ustaw i aktywuj token

Twój DPC musi skonfigurować i aktywować token przed zresetowaniem hasła. Ponieważ DPC może nie być w stanie użyć tokena od razu, ustaw go o ile administrator będzie musiał jej użyć.

Token resetowania hasła to silna kryptograficznie wartość losowa i musi: mieć co najmniej 32 bajty długości. Utwórz token dla każdego urządzenia i profilu. Nie ponownie wykorzystać lub udostępnić wygenerowane tokeny.

Zalecamy przechowywanie tokenów lub środków do odszyfrowywania zaszyfrowanego tokena na serwera. Jeśli przechowujesz tokeny lokalnie w magazynie zaszyfrowanym danymi logowania, DPC nie może zresetować hasła, dopóki użytkownik nie odblokuje urządzenia lub profilu. Jeśli przechowywać tokeny lokalnie w pamięci zaszyfrowanej na urządzeniu, która zostanie przejęta osoba przeprowadzająca atak może go użyć, aby uzyskać dostęp do profilu służbowego lub głównego użytkownika.

Możesz wygenerować nowy token w swojej sieci DPC lub pobrać token z serwera. poniżej pokazujemy, jak DPC generuje token i zgłasza go serwer:

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

W większości przypadków DPC musi aktywować token po jego ustawieniu. Ale gdy użytkownik nie ma hasła do ekranu blokady, system aktywuje token. . Aby aktywować token, poproś użytkownika o potwierdzenie danych logowania. DPC może wywołać metodę KeyguardManager createConfirmDeviceCredentialIntent(), aby uzyskać Intent, który rozpoczyna się z potwierdzeniem. Wyjaśnij użytkownikowi urządzenia w interfejsie, dlaczego z prośbą o uwierzytelnienie. Fragment kodu poniżej pokazuje, jak możesz aktywować w Twoim 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
}

Przed ponownym uruchomieniem urządzenia musisz aktywować token ustawiony przez DPC. Android, przechowuje w pamięci nieaktywowany token i nie zachowuje go po i uruchomić go ponownie. Jeśli użytkownik zrestartuje urządzenie przed aktywacją tokena, DPC może ustaw ten sam token ponownie lub wygeneruj nowy.

DPC może sprawdzić, czy token jest aktywny, wywołując isResetPasswordTokenActive(), a wynik to true.

Gdy DPC ustawi i aktywuje token, będzie on ważny, dopóki DPC go nie usunie lub zastąpi token (lub na urządzeniu zostaną przywrócone ustawienia fabryczne). Token jest niezależny od hasła, a zmiana lub usunięcie go przez użytkownika nie ma na nie wpływu.

Usuń token

Możesz wywołać clearResetPasswordToken(), aby usunąć token dodany przez DPC. ustawione wcześniej. Może być konieczne unieważnienie przejętego tokena lub uniemożliwia zresetowanie hasła. Z przykładu poniżej dowiesz się, w 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 ...
}

Resetowanie hasła

Jeśli administrator musi zresetować hasło, zadzwoń pod numer resetPasswordWithToken() i przekaż token ustawiony i aktywowany przez DPC. z wyprzedzeniem:

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

Wywołanie resetPasswordWithToken() zwraca false, a hasło nie , gdy nowe hasło nie spełnia tych warunków:

  • Liczba znaków nie spełnia ograniczeń dotyczących minimalnej długości hasła. Zadzwoń do nas getPasswordMinimumLength(), aby dowiedzieć się, czy IT administrator ustawił ograniczenie długości.
  • Kompozycja i złożoność znaków w haśle . Zadzwoń pod numer getPasswordQuality(), by dowiedzieć się, czy IT administrator ustawił ograniczenie dotyczące kompozycji.

Jeśli ograniczenia związane z jakością haseł nie wymagają ustawienia hasła, możesz przekazać null lub pusty ciąg do funkcji resetPasswordWithToken(), by usunąć hasła.

Test zabezpieczający zabezpieczenia profilu służbowego

DPC działający w trybie właściciela profilu może wymagać od użytkowników określenia zabezpieczeń dla aplikacji działających w profilu służbowym. System pokazuje zabezpieczenia testu zabezpieczającego, gdy użytkownik próbuje otworzyć dowolną aplikację służbową. Jeśli użytkownik po przejściu weryfikacji zabezpieczającej system odblokowuje profil służbowy, w razie potrzeby odszyfrowuje go.

Jak działa test zabezpieczający logowanie w profilu służbowym

  1. Jeśli DPC wyśle intencję ACTION_SET_NEW_PASSWORD, system poprosi o to. użytkownika do skonfigurowania testu zabezpieczającego.
  2. DPC może też wysłać ACTION_SET_NEW_PARENT_PROFILE_PASSWORD zachęcający użytkownika do ustawienia blokady urządzenia.

DPC może ustawić zasady dotyczące haseł dla wyzwania w inny sposób niż zasady zasad dotyczących haseł na innych urządzeniach. Na przykład minimalna długość dla atrybutu Odpowiedź na test zabezpieczający może się różnić od długości wymaganej dla innych haseł. DPC ustala zasady dotyczące wyzwań przy użyciu standardowego DevicePolicyManager, takie jak setPasswordQuality() czy setPasswordMinimumLength().

co należy wziąć pod uwagę

  • DPC może zresetować hasło w profilu służbowym, ale nie może zresetować hasła urządzenia (osobistego). Jeśli użytkownik ustawi hasło służbowe i osobiste tak samo, resetPassword() w profilu służbowym spowoduje hasło do zresetowania tylko w profilu służbowym. Hasło nie będzie takie samo. jak w przypadku ekranu blokady urządzenia.
  • DPC może dostosować ekran danych logowania dla wyzwania służbowego za pomocą setOrganizationColor() i setOrganizationName().
  • Administratorzy urządzeń nie mogą używać resetPassword() do czyszczenia ani zmiany haseł już ustawionych. Administratorzy urządzenia nadal mogą ustawić hasło, ale tylko gdy urządzenie nie ma hasła, kodu PIN ani wzoru.

Więcej informacji znajdziesz w sekcji getParentProfileInstance() i w artykule dokumentacji na stronie DevicePolicyManager.