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 di pemilik perangkat pada perangkat terkelola sepenuhnya. Tabel ini menunjukkan fitur mana yang tersedia jika 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 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 bermain game atau menonton YouTube di perangkat yang didukung Android selama waktu-waktu tertentu, atau di 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 mengonfigurasi setPackagesSuspended(), lalu aplikasi yang dipilih bertindak seolah-olah dinonaktifkan (peluncur Google membuat aplikasi berwarna abu-abu). Saat pengguna mengetuk aplikasi, mereka melihat dialog sistem yang mengatakan bahwa aplikasi ditangguhkan.

Saat ditangguhkan, aplikasi tidak dapat memulai aktivitas dan notifikasi ke disembunyikan. Paket yang ditangguhkan tidak muncul dalam ringkasan layar, aplikasi 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 aplikasi penangguhan, lihat setPackagesSuspended.

Memblokir aplikasi dari sumber tidak dikenal

Aplikasi yang tidak diinstal dari Google Play (atau app store tepercaya lainnya) yang disebut aplikasi dari sumber tidak dikenal. Perangkat dan data dapat berisiko lebih tinggi saat orang menginstal aplikasi tersebut.

Untuk mencegah seseorang menginstal aplikasi dari sumber tidak dikenal, admin komponen perangkat 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 kantor dapat menerapkan pembatasan di seluruh perangkat dengan menyetel konfigurasi terkelola untuk Google Play. Batasan di seluruh perangkat tersedia di Android 8.0 (atau yang lebih tinggi) jika aplikasi Google Play yang terinstal versi 80812500 atau yang lebih tinggi.

Untuk membatasi penginstalan aplikasi ke Google Play, ikuti langkah-langkah berikut:

  1. Menetapkan paket konfigurasi terkelola untuk paket Google Play com.android.vending.
  2. Dalam paket, masukkan nilai boolean untuk Tombol verify_apps:device_wide_unknown_source_block.
  3. Tambahkan batasan pengguna ENSURE_VERIFY_APPS.

Contoh berikut menunjukkan cara memeriksa apakah Google Play mendukung tindakan ini dan tetapkan 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 dalam setelan sistem tetap aktif, tetapi sistem memblokir penginstalan aplikasi. Pembatasan ini memengaruhi penginstalan di masa mendatang—sebelumnya aplikasi terinstal tetap berada di perangkat. Pengguna perangkat dapat terus menginstal aplikasi ke profil pribadi menggunakan Android Debug Bridge (adb).

Untuk mempelajari sumber tidak dikenal lebih lanjut, baca Distribusi alternatif lainnya.

Membatasi akun di Google Play

Terkadang, organisasi mungkin ingin mengizinkan orang untuk menambahkan Google Akun (misalnya, untuk membaca email di Gmail) tetapi tidak menginginkan untuk menginstal aplikasi. DPC dapat menetapkan daftar akun yang dapat digunakan orang di Google Play.

Komponen admin pada perangkat yang terkelola sepenuhnya atau profil kerja dapat membatasi akun dengan menyetel konfigurasi terkelola untuk Google Play. Akun pembatasan tersedia saat 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, masukkan alamat email yang dipisahkan koma sebagai nilai string untuk tombol 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 untuk akun kerja, setel allowed_accounts ke satu akun terkelola segera setelah DPC mengetahui alamat email akun tersebut. Channel string kosong mencegah orang menggunakan akun apa pun di Google Play.

Mengaktifkan perlindungan reset ke setelan pabrik untuk perusahaan

Dengan menggunakan perlindungan reset ke setelan pabrik perusahaan, organisasi dapat menentukan Akun Google dapat menyediakan perangkat yang telah direset ke setelan pabrik.

Perlindungan reset ke setelan pabrik konsumen dirancang untuk mencegah pencurian perangkat. Sebelum pembaruan yang memungkinkan siapa pun menyediakan perangkat setelah pengaturan pabrik yang tidak sah (seperti seperti menggunakan EMM), wizard penyiapan mengharuskan pengguna untuk melakukan autentikasi terhadap Akun Google yang sebelumnya ada di profil pribadi perangkat.

Dalam lingkungan perusahaan, {i>factory reset<i} adalah alat penting untuk mengelola perangkat karyawan ketika ada karyawan yang keluar dari organisasi. Namun, jika organisasi tidak mengetahui kredensial akun karyawan, melakukan {i>factory reset<i} perlindungan data dapat memblokir kemampuan organisasi untuk menerbitkan perangkat ke pihak lain karyawan.

Mengontrol penyediaan setelah reset ke setelan pabrik

Saat berjalan di mode pemilik perangkat, DPC Anda dapat menggunakan setFactoryResetProtectionPolicy() untuk mengontrol akun diizinkan untuk menyediakan perangkat setelah pengaturan ulang pabrik. Jika konfigurasi ini ditetapkan ke null atau ditetapkan ke daftar kosong, akun yang diizinkan untuk disediakan perangkat setelah pengaturan ulang pabrik adalah akun di profil pribadi perangkat seluler.

DPC dapat mengonfigurasi akun ini sepanjang waktu perangkat seluler.

  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 di kunci resourceName di 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 melakukan {i>factory reset<i}. Minta masing-masing admin IT untuk login ke Akun Google mereka dan ikuti juga langkah 1 dan berbagi userId dengan Anda, sehingga Anda dapat menambahkan userIds ke Daftar di langkah berikutnya.
  3. DPC menetapkan pembatasan aplikasi yang sesuai menggunakan setFactoryResetProtectionPolicy() untuk menetapkan Daftar userId yang dapat menyediakan perangkat {i> factory reset<i}.
  4. DPC mengaktifkan akun yang dapat menyediakan perangkat setelah pabrik reset dengan mengirimkan siaran com.google.android.gms.auth.FRP_CONFIG_CHANGED sebagai intent eksplisit untuk tidak dapat dihentikan karena adanya pembatasan di 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(), disediakan dengan Level API 30, DPC Anda 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);

Menonaktifkan perlindungan reset ke setelan pabrik perusahaan

Untuk menonaktifkan perlindungan {i>factory reset<i}, DPC Anda 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(), disediakan dengan API Level 30, DPC Anda dapat menggunakan setApplicationRestrictions untuk menetapkan kunci nilai true di disableFactoryResetProtectionAdmin terkelola 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 terkelola sepenuhnya menggunakan log proses dan laporan {i> bug <i}jarak jauh.

Mencatat aktivitas perangkat perusahaan

DPC yang berjalan dalam mode pemilik perangkat dapat mengidentifikasi aktivitas mencurigakan dengan cara jarak jauh melacak aktivitas perangkat, termasuk peluncuran aplikasi, Android Debug Bridge (adb) aktivitas, dan pembukaan kunci layar. Log proses tidak memerlukan izin pengguna.

Untuk mengaktifkan atau menonaktifkan logging, DPC memanggil setSecurityLoggingEnabled().

Saat batch log baru tersedia, DeviceAdminReceiver akan menerima Callback onSecurityLogsAvailable(). Untuk mengambil log (setelah menerima callback), DPC memanggil retrieveSecurityLogs().

DPC juga dapat memanggil retrievePreRebootSecurityLogs() untuk mengambil keamanan log yang dibuat dalam siklus mulai ulang sebelumnya. Ini adalah interval antara {i>reboot<i} perangkat terakhir dan {i>reboot <i}sebelumnya. Perangkat yang tidak mendukung retrieveSecurityLogs() menampilkan null. Jika aplikasi Anda mengambil log menggunakan retrievePreRebootSecurityLogs() dan retrieveSecurityLogs(), Anda harus periksa entri duplikat.
Catatan: Fitur ini hanya mencatat aktivitas pada perangkat terkelola sepenuhnya dengan satu pengguna atau pengguna terafiliasi di perangkat. Fitur ini tidak berfungsi di perangkat pribadi, karena mencatat aktivitas di seluruh perangkat.

Setelan ini dapat berguna dalam audit pasca-peristiwa keamanan karena mencatat jenis tindakan berikut:

  • Setiap kali aplikasi baru dimulai. Langkah ini dapat membantu mengidentifikasi apakah ada {i>malware <i}yang dimulai dengan aplikasi yang telah disusupi.
  • Upaya membuka kunci di perangkat tidak berhasil. Hal ini dapat mengidentifikasi apakah ada beberapa kali upaya pembukaan kunci yang gagal dalam waktu singkat.
  • Perintah adb yang berpotensi berbahaya saat pengguna terhubung perangkat ke komputer menggunakan kabel USB.

Untuk mengetahui detail tentang cara membaca log, lihat SecurityLog.

Selagi Anda mengembangkan dan menguji, Anda dapat memaksa sistem untuk membuat log keamanan yang ada untuk DPC—Anda tidak perlu menunggu batch. Di Android 9.0 (API level 28) atau yang lebih baru, jalankan perintah berikut Perintah Android Debug Bridge (adb) di terminal Anda:

adb shell dpm force-security-logs

Sistem membatasi seberapa sering Anda dapat menggunakan alat ini dan melaporkan setiap {i>output <i}yang sengaja dibuat menjadi lambat. Jika ada log yang tersedia, DPC menerima callback onSecurityLogsAvailable().

Meminta laporan bug dari jarak jauh

DPC yang berjalan dalam mode pemilik perangkat dapat meminta laporan bug dari jarak jauh untuk pengguna perangkat dengan hanya satu pengguna atau pengguna terafiliasi. Laporan {i>bug<i} menangkap aktivitas perangkat tepat pada saat laporan bug diminta, tetapi juga termasuk aktivitas dari beberapa jam sebelumnya, tergantung pada seberapa sering dimuat ulang.

Untuk meminta laporan bug dari jarak jauh, DPC memanggil requestBugreport():

Memberikan akses dan menghapus akses ke sertifikat klien

Jika DPC yang berjalan di mode pemilik profil atau pemilik perangkat memberikan aplikasi pihak ketiga kemampuan untuk mengelola sertifikat, aplikasi dapat memberi dirinya sendiri akses ke sertifikat yang diinstalnya tanpa intervensi dari pengguna. Untuk menginstal sertifikat yang dapat diakses oleh semua aplikasi dalam profil, gunakan installKeyPair().

Untuk parameter mana yang akan dikonfigurasi, lihat installKeyPair(). Fitur ini berfungsi 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 CA {i>root<i}.

Dengan metode installKeyPair():

  • Pengguna tidak perlu mengetuk Izinkan setiap kali mereka ingin memberikan akses ke CA {i>root<i}.
  • Pengguna tidak dapat mengganti nama sertifikat.
  • Admin memiliki kontrol lebih besar karena 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 klien dari jarak jauh sertifikat diinstal melalui installKeyPair(), panggil removeKeyPair().

DPC yang berjalan dalam mode pemilik perangkat atau mode pemilik profil, atau didelegasikan penginstal sertifikat dapat memanggil removeKeyPair(). Tindakan ini menghapus sertifikat dan pasangan kunci pribadi yang diinstal di bawah alias kunci pribadi tertentu.

Skenario deployment

Gunakan fitur ini jika organisasi bermigrasi ke bentuk klien yang lebih aman CA {i>root<i}. Jika admin meluncurkan sertifikat baru, dan distribusinya membutuhkan banyak waktu, admin dapat mencabut akses sertifikat setelah migrasi selesai.

Kode sandi aman direset

DPC Anda dapat menyetel ulang sandi pengguna dengan mengizinkan perubahan menggunakan token yang aman yang telah didaftarkan sebelumnya. Pemilik perangkat dan pemilik profil dapat menghubungi Secure API reset kode sandi untuk mengubah sandi perangkat dan profil kerja secara berurutan. Reset kode sandi yang aman menggantikan resetPassword() dengan peningkatan berikut:

Anda harus menggunakan reset kode sandi aman jika build DPC menargetkan Android 8.0 (API level 26) atau lebih tinggi. Memanggil resetPassword() akan menampilkan SecurityException di DPC yang menargetkan Android 8.0 atau yang lebih tinggi sehingga Anda mungkin harus memperbarui DPC.

Menetapkan dan mengaktifkan token

DPC harus menetapkan dan mengaktifkan token sebelum mereset sandi. Karena DPC Anda mungkin tidak dapat langsung menggunakan token, Anda menetapkan sebelum administrator IT perlu menggunakannya.

Token pengaturan ulang {i>password<i} adalah nilai acak yang kuat secara kriptografis dan harus setidaknya sepanjang 32 byte. Buat token untuk setiap perangkat dan profil. Jangan menggunakan kembali atau membagikan token yang telah Anda buat.

Sebaiknya simpan token, atau cara untuk mendekripsi token terenkripsi, pada server tertentu. Jika Anda menyimpan token secara lokal di penyimpanan yang dienkripsi dengan kredensial, DPC Anda tidak dapat mengatur ulang {i>password<i} hingga pengguna membuka kunci perangkat atau profil. Jika Anda menyimpan token secara lokal di penyimpanan yang dienkripsi perangkat, yang kemudian disusupi, penyerang dapat menggunakan token untuk mendapatkan akses ke profil kerja atau .

Anda dapat membuat token baru di DPC atau mengambil token dari server. Tujuan di bawah ini menunjukkan DPC yang menghasilkan 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);
}

Biasanya, DPC harus mengaktifkan token setelah menyetelnya. Tapi, ketika pengguna tidak memiliki {i>password<i} layar kunci, sistem akan mengaktifkan token langsung. Untuk mengaktifkan token, minta pengguna untuk mengonfirmasi kredensialnya. DPC Anda dapat memanggil metode KeyguardManager createConfirmDeviceCredentialIntent() untuk mendapatkan Intent yang memulai konfirmasi. Jelaskan kepada pengguna perangkat di antarmuka pengguna, mengapa Anda meminta mereka untuk mengotentikasi. 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 dalam memori dan tidak mempertahankan token setelah memulai ulang. Jika pengguna memulai ulang perangkat sebelum mengaktifkan token, DPC Anda dapat menetapkan token yang sama 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, DPC valid sampai DPC menghapus atau menggantikan token (atau perangkat direset ke setelan pabrik). Token tidak bergantung pada {i>password<i} dan tidak terpengaruh oleh perubahan atau penghapusan {i>password<i} oleh pengguna.

Menghapus token

Anda dapat memanggil clearResetPasswordToken() untuk menghapus token yang DPC Anda yang telah ditentukan sebelumnya. Anda mungkin perlu mencabut token yang telah disusupi atau Anda mungkin ingin menghapus kemampuan untuk mengatur ulang {i>password<i}. Contoh di bawah ini menunjukkan cara hal ini di DPC Anda:

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

Mereset sandi

Saat admin IT perlu mereset sandi, hubungi resetPasswordWithToken() dan meneruskan token yang ditetapkan dan diaktifkan oleh 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 sandinya tidak diubah, jika {i>password<i} baru tidak memenuhi batasan berikut:

  • Jumlah karakter memenuhi batasan panjang sandi minimum. Telepon getPasswordMinimumLength() untuk mengetahui apakah menetapkan batasan panjang.
  • Rentang dan kerumitan karakter dalam {i>password<i} memenuhi komposisi batasan data. Hubungi getPasswordQuality() untuk mengetahui apakah IT admin menyetel batasan komposisi.

Jika batasan kualitas sandi tidak memerlukan penetapan sandi, Anda dapat teruskan null atau string kosong ke resetPasswordWithToken() untuk menghapus {i>password<i}.

Pertanyaan keamanan profil kerja

DPC yang berjalan dalam mode pemilik profil dapat mengharuskan pengguna untuk menentukan untuk aplikasi yang berjalan di profil kerja. Sistem menunjukkan tingkat keamanan saat pengguna mencoba membuka aplikasi kerja apa pun. Jika pengguna berhasil menyelesaikan tantangan keamanan, sistem akan membuka profil kerja dan mendekripsinya, jika diperlukan.

Cara kerja tantangan keamanan profil kerja

  1. Jika DPC mengirim intent ACTION_SET_NEW_PASSWORD, sistem akan memberi tahu pengguna untuk menyiapkan pertanyaan keamanan.
  2. DPC juga dapat mengirimACTION_SET_NEW_PARENT_PROFILE_PASSWORD untuk meminta pengguna menyetel penguncian perangkat.

DPC dapat menetapkan kebijakan {i>password<i} untuk tantangan pekerjaan secara berbeda dari kebijakan untuk sandi perangkat lainnya. Misalnya, panjang minimum untuk respons tantangan perangkat bisa berbeda dari panjang yang dibutuhkan untuk {i>password<i}. DPC menetapkan kebijakan tantangan menggunakan Metode DevicePolicyManager, seperti setPasswordQuality() dan setPasswordMinimumLength().

Pertimbangan

  • DPC dapat mereset sandi di profil kerja, tetapi tidak dapat mereset sandi {i>password<i} perangkat (pribadi). Jika pengguna memilih untuk menetapkan sandi kerja dan pribadi sama, maka resetPassword() di profil kerja menyebabkan sandi harus direset di profil kerja saja, dan sandinya tidak akan sama sebagai sistem untuk layar kunci perangkat.
  • DPC dapat menyesuaikan layar kredensial untuk tantangan kerja dengan menggunakan setOrganizationColor() dan setOrganizationName().
  • Admin perangkat tidak dapat menggunakan resetPassword() untuk menghapus sandi atau mengubah yang sudah ditetapkan. Admin perangkat masih dapat menyetel sandi, tetapi hanya saat perangkat belum memiliki sandi, PIN, atau pola.

Untuk informasi tambahan, lihat getParentProfileInstance() dan lihat referensi dokumentasi berdasarkan DevicePolicyManager.