Keamanan

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:

Fitur Pemilik profil Pemilik perangkat
Menonaktifkan akses ke aplikasi
Memblokir aplikasi dari sumber tidak dikenal
Membatasi akun di Google Play
Mengaktifkan perlindungan reset ke setelan pabrik untuk perusahaan
Memantau log proses perusahaan dan laporan bug jarak jauh
Memberikan akses dan menghapus akses ke sertifikat klien
Reset kode sandi aman
Tantangan keamanan profil kerja

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:

  1. Menetapkan paket konfigurasi terkelola untuk paket Google Play com.android.vending.
  2. Dalam paket, tempatkan nilai boolean untuk kunci verify_apps:device_wide_unknown_source_block.
  3. 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:

  1. Menetapkan paket konfigurasi terkelola untuk paket Google Play com.android.vending.
  2. 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.

  1. Admin IT dapat menggunakan metode people.get dari People API dengan nilai khusus me. Tindakan ini akan mengambil userId untuk akun yang digunakan untuk login. userID ditampilkan dalam kunci resourceName dalam bentuk people/[userId] sebagai string bilangan bulat. Akun yang baru dibuat mungkin tidak tersedia untuk tujuan reset ke setelan pabrik selama 72 jam.
  2. 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, sehingga userIds ini dapat ditambahkan ke Daftar di langkah berikutnya.
  3. DPC menetapkan pembatasan aplikasi yang sesuai menggunakan setFactoryResetProtectionPolicy() untuk menetapkan Daftar userId yang dapat menyediakan perangkat yang direset ke setelan pabrik.
  4. 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():

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:

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

  1. Jika DPC mengirimkan intent ACTION_SET_NEW_PASSWORD, sistem akan meminta pengguna menyiapkan verifikasi keamanan.
  2. 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() dan setOrganizationName().
  • 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.