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:
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:
- Ustaw pakiet konfiguracji zarządzanej na potrzeby pakietu Google Play
com.android.vending
- W pakiecie umieść wartość logiczną dla funkcji
verify_apps:device_wide_unknown_source_block
klawisz. - 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:
- Ustaw pakiet konfiguracji zarządzanej na potrzeby pakietu Google Play
com.android.vending
- 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.
- Administrator IT może użyć metody
people.get
z interfejsu People API o specjalnej wartościme
. Pobiera onauserId
dla zalogowanego konta. ParametruserID
jest zwracany w kluczuresourceName
w argumencie formatpeople/[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. - 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. - DPC ustawia odpowiednie ograniczenia aplikacji za pomocą:
setFactoryResetProtectionPolicy()
, aby ustawić listę elementówuserId
, które mogą udostępnić urządzenie do ustawień fabrycznych. - 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()
:
- Jeśli użytkownik zgodzi się na udostępnienie raportu o błędzie, DPC otrzyma komunikat o błędzie
zgłoś za pomocą
onBugreportShared()
- Jeśli użytkownik odmówi udostępnienia raportu o błędzie, DPC otrzyma
wiadomość o odrzuceniu żądania przy użyciu
onBugreportSharingDeclined()
- Jeśli zgłoszenie błędu nie powiedzie się, DPC zobaczy ciąg
onBugreportFailed()
zBUGREPORT_FAILURE_FAILED_COMPLETING
lubBUGREPORT_FAILURE_FILE_NO_LONGER_AVAILABLE
.
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:
- DPC może zresetować hasło, zanim użytkownik odblokuje urządzenie lub profil po ponownym uruchomieniu na urządzeniach z szyfrowania na podstawie plików.
- Magazyn kluczy Androida przechowuje klucze uwierzytelnione przez użytkowników po zresetowaniu kodu dostępu.
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
- Jeśli DPC wyśle intencję
ACTION_SET_NEW_PASSWORD
, system poprosi o to. użytkownika do skonfigurowania testu zabezpieczającego. - 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()
isetOrganizationName()
. - 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
.