Fitur dalam panduan ini menjelaskan kemampuan pengelolaan keamanan yang dapat Anda terapkan di aplikasi pengontrol kebijakan perangkat (DPC). Dokumen ini berisi contoh kode dan Anda juga dapat menggunakan aplikasi Test DPC sebagai sumber kode contoh untuk fitur perusahaan Android.
Aplikasi DPC dapat berjalan dalam mode pemilik profil di perangkat pribadi atau dalam mode pemilik perangkat di perangkat terkelola sepenuhnya. Tabel ini menunjukkan fitur yang tersedia saat DPC berjalan dalam mode pemilik profil atau mode pemilik perangkat:
Nonaktifkan akses ke aplikasi
Untuk organisasi yang ingin memblokir karyawan agar tidak dapat bermain game atau menonton YouTube di perangkat Android selama waktu tertentu, atau hari-hari tertentu, DPC dapat menonaktifkan akses ke aplikasi untuk sementara.
Untuk menonaktifkan akses ke aplikasi, DPC yang berjalan di mode pemilik perangkat atau pemilik profil
akan mengonfigurasi setPackagesSuspended()
, lalu aplikasi yang dipilih akan bertindak seolah-olah
dinonaktifkan (peluncur Google membuat aplikasi berwarna abu-abu). Saat pengguna mengetuk aplikasi,
mereka akan melihat dialog sistem yang menyatakan bahwa aplikasi ditangguhkan.
Saat ditangguhkan, aplikasi tidak dapat memulai aktivitas, dan notifikasi ke paket akan disembunyikan. Paket yang ditangguhkan tidak muncul di layar ringkasan, paket tidak dapat menampilkan dialog (termasuk toast dan snackbar), dan tidak dapat memutar audio atau menggetarkan perangkat.
Peluncur dapat mengetahui apakah aplikasi ditangguhkan dengan memanggil
metode isPackageSuspended()
. Untuk mengetahui detail tentang cara mengonfigurasi penangguhan
aplikasi, lihat setPackagesSuspended
.
Blokir aplikasi dari sumber tidak dikenal
Aplikasi yang tidak diinstal dari Google Play (atau app store tepercaya lainnya) disebut aplikasi dari sumber tidak dikenal. Perangkat dan data dapat lebih berisiko saat menginstal aplikasi tersebut.
Untuk mencegah seseorang menginstal aplikasi dari sumber tidak dikenal, komponen admin
perangkat yang terkelola sepenuhnya dan profil kerja dapat menambahkan
batasan pengguna DISALLOW_INSTALL_UNKNOWN_SOURCES
.
Pembatasan di seluruh perangkat profil kerja
Saat admin profil kerja menambahkan DISALLOW_INSTALL_UNKNOWN_SOURCES
,
pembatasan hanya berlaku untuk profil kerja. Namun, admin profil
kerja dapat menerapkan pembatasan di seluruh perangkat dengan menyetel
konfigurasi terkelola untuk Google Play. Pembatasan di seluruh perangkat
tersedia di Android 8.0 (atau yang lebih baru) jika aplikasi Google Play yang terinstal
adalah versi 80812500 atau yang lebih tinggi.
Untuk membatasi penginstalan aplikasi di Google Play, ikuti langkah-langkah berikut:
- Menetapkan paket konfigurasi terkelola untuk paket Google Play
com.android.vending
. - Dalam paket, tempatkan nilai boolean untuk
kunci
verify_apps:device_wide_unknown_source_block
. - Tambahkan batasan pengguna
ENSURE_VERIFY_APPS
.
Contoh berikut menunjukkan cara memeriksa bahwa Google Play mendukung
setelan ini dan menyetel nilai ke 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);
Antarmuka pengguna di setelan sistem tetap aktif, tetapi sistem memblokir penginstalan aplikasi. Pembatasan ini memengaruhi penginstalan mendatang—aplikasi yang sebelumnya diinstal akan tetap ada di perangkat. Pengguna perangkat dapat terus menginstal aplikasi ke profil pribadi menggunakan Android Debug Bridge (adb).
Untuk mempelajari sumber tidak dikenal lebih lanjut, baca Opsi distribusi alternatif.
Membatasi akun di Google Play
Terkadang organisasi mungkin ingin mengizinkan pengguna menambahkan Akun Google pribadi (misalnya untuk membaca email di Gmail), tetapi tidak ingin akun pribadi tersebut menginstal aplikasi. DPC dapat menetapkan daftar akun yang dapat digunakan pengguna di Google Play.
Komponen admin dari perangkat terkelola sepenuhnya atau profil kerja dapat membatasi akun dengan menyetel konfigurasi terkelola untuk Google Play. Pembatasan akun tersedia jika aplikasi Google Play yang terinstal adalah versi 80970100 atau yang lebih tinggi.
Untuk membatasi akun di Google Play, lakukan hal berikut:
- Menetapkan paket konfigurasi terkelola untuk paket Google Play
com.android.vending
. - Dalam paket, tempatkan alamat email yang dipisahkan koma sebagai nilai string untuk kunci
allowed_accounts
.
Contoh berikut menunjukkan cara membatasi akun:
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);
Untuk membatasi Google Play hanya ke akun kerja, setel allowed_accounts
ke
satu akun terkelola segera setelah DPC mengetahui alamat email akun tersebut. String
kosong mencegah pengguna menggunakan akun apa pun di Google Play.
Aktifkan perlindungan reset ke setelan pabrik perusahaan
Dengan menggunakan perlindungan reset ke setelan pabrik untuk perusahaan, organisasi dapat menentukan Akun Google mana yang dapat menyediakan perangkat yang telah direset ke setelan pabrik.
Perlindungan reset ke setelan pabrik untuk konsumen dirancang untuk mencegah pencurian perangkat. Sebelum mengizinkan siapa pun menyediakan perangkat setelah reset ke setelan pabrik tanpa izin (seperti menggunakan EMM), wizard penyiapan mengharuskan pengguna untuk melakukan autentikasi dengan Akun Google apa pun yang sebelumnya ada di profil pribadi perangkat.
Dalam lingkungan perusahaan, reset ke setelan pabrik adalah alat penting untuk mengelola perangkat karyawan saat karyawan keluar dari organisasi. Namun, jika organisasi tidak mengetahui kredensial akun karyawan, perlindungan reset ke setelan pabrik dapat memblokir kemampuan organisasi untuk mengeluarkan perangkat kepada karyawan lain.
Mengontrol penyediaan setelah reset ke setelan pabrik
Saat berjalan dalam mode pemilik perangkat, DPC dapat menggunakan
setFactoryResetProtectionPolicy()
untuk mengontrol akun mana yang
diotorisasi untuk menyediakan perangkat setelah reset ke setelan pabrik. Jika konfigurasi ini
disetel ke null
atau disetel ke daftar kosong, akun yang diizinkan untuk menyediakan
perangkat setelah reset ke setelan pabrik adalah akun di profil pribadi
perangkat.
DPC dapat mengonfigurasi akun ini sepanjang waktu penggunaan perangkat yang terkelola sepenuhnya.
- Admin IT dapat menggunakan metode
people.get
dari People API dengan nilai khususme
. Tindakan ini akan mengambiluserId
untuk akun yang digunakan untuk login.userID
ditampilkan dalam kunciresourceName
dalam bentukpeople/[userId]
sebagai string bilangan bulat. Akun yang baru dibuat mungkin tidak tersedia untuk tujuan reset ke setelan pabrik selama 72 jam. - Anda juga dapat mengaktifkan satu atau beberapa admin IT untuk membuka kunci perangkat setelah
direset ke setelan pabrik. Minta setiap admin IT tersebut untuk login ke Akun Google mereka, lalu
ikuti langkah 1 dan bagikan
userId
mereka kepada Anda, sehinggauserIds
ini dapat ditambahkan ke Daftar di langkah berikutnya. - DPC menetapkan pembatasan aplikasi yang sesuai menggunakan
setFactoryResetProtectionPolicy()
untuk menetapkan DaftaruserId
yang dapat menyediakan perangkat yang direset ke setelan pabrik. - DPC memungkinkan akun yang dapat menyediakan perangkat setelah reset
ke setelan pabrik dengan mengirimkan
com.google.android.gms.auth.FRP_CONFIG_CHANGED
siaran sebagai intent eksplisit untuk mencegah penghapusan karena pembatasan latar belakang.
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);
Lama
Untuk perangkat yang tidak dapat menggunakan setFactoryResetProtectionPolicy()
, yang diperkenalkan dengan
API Level 30, DPC dapat menggunakan setApplicationRestrictions
untuk menambahkan
akun yang dipilih ke konfigurasi terkelola factoryResetProtectionAdmin
untuk paket 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);
Nonaktifkan perlindungan reset ke setelan pabrik untuk perusahaan
Untuk menonaktifkan perlindungan reset ke setelan pabrik, DPC dapat menggunakan
setFactoryResetProtectionPolicy()
meneruskan nilai 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);
Lama
Untuk perangkat yang tidak dapat menggunakan setFactoryResetProtectionPolicy()
, yang diperkenalkan dengan
API Level 30, DPC dapat menggunakan setApplicationRestrictions
untuk menetapkan nilai
kunci true
dalam konfigurasi terkelola disableFactoryResetProtectionAdmin
untuk paket 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);
Memantau log proses perusahaan dan laporan bug jarak jauh
Di konsol EMM, admin dapat memantau perangkat yang terkelola sepenuhnya menggunakan log proses perusahaan dan laporan bug jarak jauh.
Catat aktivitas perangkat perusahaan
DPC yang berjalan dalam mode pemilik perangkat dapat mengidentifikasi aktivitas mencurigakan dengan melacak aktivitas perangkat dari jarak jauh, termasuk peluncuran aplikasi, aktivitas Android Debug Bridge (adb), dan pembukaan kunci layar. Log proses tidak memerlukan izin pengguna.
Untuk mengaktifkan atau menonaktifkan logging, DPC akan memanggil setSecurityLoggingEnabled()
.
Saat batch log baru tersedia, DeviceAdminReceiver
akan menerima callback onSecurityLogsAvailable()
. Untuk mengambil log (setelah
menerima callback), DPC akan memanggil retrieveSecurityLogs()
.
DPC juga dapat memanggil retrievePreRebootSecurityLogs()
untuk mengambil log
keamanan yang dihasilkan dalam siklus mulai ulang sebelumnya. Ini adalah interval antara
reboot perangkat terakhir dan mulai ulang sebelumnya. Perangkat yang tidak mendukung
retrieveSecurityLogs()
akan menampilkan null
. Jika aplikasi Anda mengambil log menggunakan retrievePreRebootSecurityLogs()
dan retrieveSecurityLogs()
, Anda perlu memeriksa entri duplikat.
Catatan: Fitur ini hanya mencatat aktivitas di perangkat yang terkelola sepenuhnya dengan satu
pengguna atau pengguna terafiliasi di perangkat. Fitur ini tidak berfungsi di
perangkat pribadi, karena mencatat aktivitas seluruh perangkat.
Setelan ini dapat berguna dalam pengauditan peristiwa pasca-keamanan karena mencatat jenis tindakan berikut ke dalam log:
- Setiap kali aplikasi baru dimulai. Langkah ini dapat membantu mengidentifikasi apakah ada {i>malware<i} yang dimulai dengan aplikasi yang disusupi.
- Upaya membuka kunci yang gagal di perangkat. Informasi ini dapat mengidentifikasi apakah ada beberapa upaya membuka kunci yang gagal dalam waktu singkat.
- Perintah adb yang berpotensi berbahaya saat pengguna menghubungkan perangkat ke komputer menggunakan kabel USB.
Untuk mengetahui detail tentang cara membaca log, lihat SecurityLog
.
Saat melakukan pengembangan dan pengujian, Anda dapat memaksa sistem untuk menyediakan log keamanan yang ada untuk DPC—Anda tidak perlu menunggu sepenuhnya. Di Android 9.0 (API level 28) atau yang lebih tinggi, jalankan perintah Android Debug Bridge (adb) berikut di terminal Anda:
adb shell dpm force-security-logs
Sistem membatasi seberapa sering Anda dapat menggunakan alat ini dan melaporkan
perlambatan yang disengaja dalam output terminal. Jika ada log yang tersedia, DPC
Anda akan menerima callback onSecurityLogsAvailable()
.
Meminta laporan bug dari jarak jauh
DPC yang berjalan dalam mode pemilik perangkat dapat meminta laporan bug dari jarak jauh untuk perangkat pengguna yang hanya memiliki satu pengguna atau pengguna terafiliasi. Laporan bug merekam aktivitas perangkat pada saat laporan bug diminta, tetapi juga dapat menyertakan aktivitas dari beberapa jam sebelumnya, bergantung pada seberapa sering buffer logcat dimuat ulang.
Untuk meminta laporan bug dari jarak jauh, DPC akan memanggil requestBugreport()
:
- Jika pengguna menerima permintaan berbagi laporan bug, DPC akan menerima laporan
bug menggunakan
onBugreportShared()
. - Jika pengguna menolak membagikan laporan bug, DPC akan menerima pesan
yang ditolak permintaan berbagi menggunakan
onBugreportSharingDeclined()
. - Jika laporan bug gagal, DPC akan melihat
onBugreportFailed()
denganBUGREPORT_FAILURE_FAILED_COMPLETING
atauBUGREPORT_FAILURE_FILE_NO_LONGER_AVAILABLE
.
Memberikan akses dan menghapus akses ke sertifikat klien
Jika DPC yang berjalan di mode pemilik profil atau pemilik perangkat memberikan kemampuan mengelola sertifikat
kepada aplikasi pihak ketiga, aplikasi tersebut dapat memberikan akses ke
sertifikat yang diinstalnya tanpa intervensi pengguna. Untuk menginstal
sertifikat yang dapat diakses oleh semua aplikasi di profil, gunakan installKeyPair()
.
Untuk parameter yang akan dikonfigurasi, lihat installKeyPair()
. Fitur ini berfungsi bersama dengan API yang sudah ada untuk mengelola sertifikat.
Skenario deployment
Tanpa metode installKeyPair()
:
- Pengguna harus mengetuk nama sertifikat dan mengetuk Izinkan setiap kali mereka ingin memberikan akses ke sertifikat.
- Pengguna akan melihat perintah saat menginstal sertifikat dan harus memberi nama sertifikat.
Dengan metode installKeyPair()
:
- Pengguna tidak perlu mengetuk Izinkan setiap kali ingin memberikan akses ke sertifikat.
- Pengguna tidak dapat mengganti nama sertifikat.
- Admin memiliki kontrol lebih besar agar mereka dapat memblokir sertifikat untuk aplikasi yang seharusnya tidak memiliki akses ke sertifikat tertentu.
Menghapus sertifikat klien
Setelah memberikan akses ke sertifikat klien, untuk menghapus sertifikat klien
yang diinstal melalui installKeyPair()
dari jarak jauh, panggil
removeKeyPair()
.
DPC yang berjalan dalam mode pemilik perangkat atau mode pemilik profil, atau penginstal sertifikat
yang didelegasikan dapat memanggil removeKeyPair()
. Tindakan ini akan menghapus
pasangan kunci pribadi dan sertifikat yang diinstal menggunakan alias kunci pribadi tertentu.
Skenario deployment
Gunakan fitur ini jika organisasi bermigrasi ke bentuk sertifikat klien yang lebih aman. Jika admin meluncurkan sertifikat baru, dan distribusinya memerlukan banyak waktu, admin dapat mencabut sertifikat yang tidak digunakan lagi setelah migrasi selesai.
Kode sandi aman direset
DPC dapat mereset sandi pengguna dengan mengizinkan perubahan menggunakan
token aman yang telah didaftarkan sebelumnya. Pemilik perangkat dan pemilik profil dapat memanggil
API reset kode sandi yang aman untuk mengubah sandi perangkat dan
profil kerja. Reset kode sandi aman akan menggantikan resetPassword()
dengan
peningkatan berikut:
- DPC dapat mereset kode sandi sebelum pengguna membuka kunci perangkat atau profil setelah memulai ulang di perangkat menggunakan enkripsi berbasis file.
- Android Keystore mempertahankan kunci yang diautentikasi pengguna setelah kode sandi direset.
Anda harus menggunakan reset kode sandi aman jika build DPC Anda menargetkan Android 8.0 (API
level 26) atau yang lebih tinggi. Memanggil resetPassword()
akan menampilkan
SecurityException
di DPC yang menargetkan Android 8.0 atau yang lebih tinggi sehingga Anda mungkin
perlu mengupdate DPC.
Menetapkan dan mengaktifkan token
DPC Anda harus menetapkan dan mengaktifkan token sebelum mereset sandi. Karena DPC mungkin tidak dapat langsung menggunakan token, Anda perlu menetapkan token sebelum admin IT mungkin perlu menggunakannya.
Token reset sandi adalah nilai acak yang kuat secara kriptografis dan harus memiliki panjang minimal 32 byte. Buat token untuk setiap perangkat dan profil. Jangan menggunakan kembali atau membagikan token yang dihasilkan.
Sebaiknya simpan token, atau cara mendekripsi token terenkripsi, di server. Jika Anda menyimpan token secara lokal di penyimpanan yang dienkripsi dengan kredensial, DPC tidak dapat mereset sandi hingga pengguna membuka kunci perangkat atau profil. Jika Anda menyimpan token secara lokal di penyimpanan yang dienkripsi dengan perangkat, yang kemudian disusupi, penyerang dapat menggunakan token tersebut untuk mendapatkan akses ke profil kerja atau pengguna utama.
Anda dapat membuat token baru di DPC atau mengambil token dari server. Contoh di bawah ini menunjukkan DPC yang membuat token itu sendiri dan melaporkannya ke 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); }
Dalam sebagian besar kasus, DPC Anda perlu mengaktifkan token setelah menyetelnya. Namun, jika pengguna tidak memiliki sandi layar kunci, sistem akan langsung mengaktifkan token. Untuk mengaktifkan token, minta pengguna mengonfirmasi kredensialnya.
DPC dapat memanggil metode KeyguardManager
createConfirmDeviceCredentialIntent()
untuk mendapatkan Intent
yang memulai
konfirmasi. Jelaskan kepada pengguna perangkat di antarmuka pengguna dan alasan Anda meminta mereka untuk melakukan autentikasi. Cuplikan di bawah ini menunjukkan cara mengaktifkan
token di 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 }
Anda harus mengaktifkan token yang ditetapkan DPC sebelum perangkat dimulai ulang. Android menyimpan token yang belum diaktifkan di memori dan tidak akan mempertahankan token tersebut setelah mulai ulang. Jika pengguna memulai ulang perangkat sebelum mengaktifkan token, DPC dapat menyetel token yang sama lagi atau membuat token baru.
DPC Anda dapat mengonfirmasi bahwa token aktif dengan memanggil
isResetPasswordTokenActive()
dan memeriksa hasilnya adalah true
.
Setelah DPC menetapkan dan mengaktifkan token, token berlaku hingga DPC menghapus atau mengganti token (atau perangkat direset ke setelan pabrik). Token ini tidak bergantung pada sandi dan tidak terpengaruh oleh pengguna yang mengubah atau menghapus sandi.
Menghapus token
Anda dapat memanggil clearResetPasswordToken()
untuk menghapus token yang ditetapkan DPC
sebelumnya. Anda mungkin harus mencabut token yang telah disusupi atau menghapus kemampuan untuk mereset sandi. Contoh di bawah ini menunjukkan cara
melakukan hal ini di 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 ... }
Reset sandi
Jika admin IT perlu mereset sandi, panggil
resetPasswordWithToken()
dan teruskan token yang ditetapkan dan diaktifkan DPC Anda
terlebih dahulu:
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. }
Panggilan ke resetPasswordWithToken()
akan menampilkan false
, dan sandi tidak
berubah, jika sandi baru tidak memenuhi batasan berikut:
- Jumlah karakter memenuhi batasan panjang minimum sandi. Panggil
getPasswordMinimumLength()
untuk mengetahui apakah admin IT menetapkan batasan durasi. - Rentang dan kompleksitas karakter dalam sandi memenuhi batasan
komposisi. Panggil
getPasswordQuality()
untuk mengetahui apakah admin IT menetapkan batasan komposisi.
Jika batasan kualitas sandi tidak mengharuskan sandi ditetapkan, Anda dapat
meneruskan null
atau string kosong ke resetPasswordWithToken()
untuk menghapus
sandi.
Pertanyaan keamanan profil kerja
DPC yang berjalan dalam mode pemilik profil dapat mengharuskan pengguna menentukan tantangan keamanan untuk aplikasi yang berjalan di profil kerja. Sistem menampilkan tantangan keamanan saat pengguna mencoba membuka aplikasi kerja apa pun. Jika pengguna berhasil menyelesaikan tantangan keamanan, sistem akan membuka kunci profil kerja dan mendekripsinya, jika perlu.
Cara kerja tantangan keamanan profil kerja
- Jika DPC mengirimkan intent
ACTION_SET_NEW_PASSWORD
, sistem akan meminta pengguna menyiapkan verifikasi keamanan. - DPC juga dapat mengirimkan intent
ACTION_SET_NEW_PARENT_PROFILE_PASSWORD
untuk meminta pengguna menyetel penguncian perangkat.
DPC dapat menetapkan kebijakan sandi untuk tantangan kerja secara berbeda
dengan kebijakan sandi perangkat lainnya. Misalnya, panjang minimum respons tantangan perangkat dapat berbeda dari panjang yang diperlukan untuk sandi lainnya. DPC menetapkan kebijakan tantangan menggunakan metode
DevicePolicyManager
biasa, seperti setPasswordQuality()
dan
setPasswordMinimumLength()
.
Pertimbangan
- DPC dapat mereset sandi di profil kerja, tetapi tidak dapat mereset
sandi perangkat (pribadi). Jika pengguna memilih untuk menyetel sandi kerja dan pribadi
menjadi sama,
resetPassword()
di profil kerja akan menyebabkan sandi direset di profil kerja saja, dan sandi tidak akan sama dengan sandi untuk layar kunci perangkat. - DPC dapat menyesuaikan layar kredensial untuk tantangan kerja menggunakan
setOrganizationColor()
dansetOrganizationName()
. - Admin perangkat tidak dapat menggunakan
resetPassword()
untuk menghapus sandi atau mengubah sandi yang sudah ditetapkan. Admin perangkat masih dapat menyetel sandi, tetapi hanya jika perangkat tidak memiliki sandi, PIN, atau pola.
Untuk informasi tambahan, lihat getParentProfileInstance()
dan dokumentasi
referensi di bagian DevicePolicyManager
.