Bảo mật

Các tính năng trong hướng dẫn này mô tả khả năng quản lý bảo mật mà bạn có thể triển khai trong ứng dụng trình kiểm soát chính sách thiết bị (DPC) của bạn. Tài liệu này có chứa mã mẫu và bạn cũng có thể sử dụng ứng dụng Test DPC dưới dạng nguồn mã mẫu cho các tính năng của Android dành cho doanh nghiệp.

Ứng dụng DPC có thể chạy ở chế độ chủ sở hữu hồ sơ trên thiết bị cá nhân hoặc trong chủ sở hữu thiết bị trên các thiết bị được quản lý hoàn toàn. Bảng này cho biết bạn có thể sử dụng những tính năng nào khi DPC chạy ở chế độ chủ sở hữu hồ sơ hoặc chế độ chủ sở hữu thiết bị:

Tính năng Chủ sở hữu trang doanh nghiệp Chủ sở hữu thiết bị
Tắt quyền truy cập vào ứng dụng
Chặn ứng dụng không rõ nguồn gốc
Hạn chế tài khoản trong Google Play
Bật chế độ bảo vệ khi đặt lại về trạng thái ban đầu dành cho doanh nghiệp
Giám sát nhật ký quy trình của doanh nghiệp và báo cáo lỗi từ xa
Cấp quyền truy cập và xoá quyền truy cập vào chứng chỉ ứng dụng
Đặt lại mật mã an toàn
Thử thách bảo mật hồ sơ công việc

Vô hiệu hoá quyền truy cập vào ứng dụng

Dành cho các tổ chức muốn chặn nhân viên chơi trò chơi hoặc xem YouTube trên thiết bị chạy Android của họ vào những thời điểm nhất định trong ngày, hoặc vào một số ngày nhất định trong tuần, DPC có thể tạm thời vô hiệu hoá quyền truy cập vào ứng dụng.

Để vô hiệu hoá quyền truy cập vào các ứng dụng, DPC đang chạy ở chế độ chủ sở hữu thiết bị hoặc chế độ chủ sở hữu hồ sơ định cấu hình setPackagesSuspended(), sau đó ứng dụng được chọn sẽ hoạt động như thể tính năng đó bị tắt (trình chạy của Google chuyển ứng dụng sang màu xám). Khi người dùng nhấn vào ứng dụng, họ sẽ thấy một hộp thoại của hệ thống cho biết ứng dụng đã bị tạm ngưng.

Khi bị tạm ngưng, một ứng dụng không thể bắt đầu các hoạt động và gửi thông báo đến đã bị chặn. Gói bị tạm ngưng không xuất hiện trong phần tổng quan màn hình, chúng không thể hiện hộp thoại (bao gồm cả thông báo ngắn và thanh thông báo nhanh), đồng thời không thể phát âm thanh hoặc rung thiết bị.

Trình chạy có thể tìm hiểu xem một ứng dụng có bị tạm ngưng hay không bằng cách gọi lệnh Phương thức isPackageSuspended(). Để biết thông tin chi tiết về cách định cấu hình ứng dụng tạm ngưng, hãy xem setPackagesSuspended.

Chặn ứng dụng không rõ nguồn gốc

Những ứng dụng không được cài đặt qua Google Play (hoặc các cửa hàng ứng dụng đáng tin cậy khác) có tên là ứng dụng từ các nguồn không xác định. Rủi ro đối với thiết bị và dữ liệu có thể gia tăng khi mọi người cài đặt các ứng dụng này.

Để ngăn người khác cài đặt ứng dụng không rõ nguồn gốc, các thành phần quản trị của hồ sơ công việc và thiết bị được quản lý toàn bộ có thể thêm Giới hạn người dùng DISALLOW_INSTALL_UNKNOWN_SOURCES.

Hạn chế trên toàn thiết bị hồ sơ công việc

Khi quản trị viên của hồ sơ công việc thêm DISALLOW_INSTALL_UNKNOWN_SOURCES, quy định hạn chế này chỉ áp dụng cho hồ sơ công việc. Tuy nhiên, quản trị viên của một tác phẩm có thể đặt giới hạn trên toàn thiết bị bằng cách đặt cấu hình được quản lý cho Google Play. Giới hạn trên toàn thiết bị là khả dụng trong Android 8.0 (trở lên) khi ứng dụng Google Play đã cài đặt phiên bản 80812500 trở lên.

Để chỉ cho phép cài đặt ứng dụng trên Google Play, hãy làm theo các bước sau:

  1. Đặt gói cấu hình được quản lý cho gói Google Play com.android.vending.
  2. Trong gói, hãy đặt một giá trị boolean cho thuộc tính Khoá verify_apps:device_wide_unknown_source_block.
  3. Thêm giới hạn người dùng ENSURE_VERIFY_APPS.

Ví dụ sau đây minh hoạ cách kiểm tra để đảm bảo rằng Google Play có hỗ trợ quy trình này và đặt giá trị thành 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);

Giao diện người dùng trong phần cài đặt hệ thống vẫn hoạt động nhưng hệ thống đã chặn lượt cài đặt ứng dụng. Quy định hạn chế này ảnh hưởng đến các lượt cài đặt trong tương lai (trước đây) thì các ứng dụng đã cài đặt vẫn còn trên thiết bị. Người dùng thiết bị có thể tiếp tục cài đặt ứng dụng vào hồ sơ cá nhân bằng Cầu gỡ lỗi Android (adb).

Để tìm hiểu thêm về các nguồn không xác định, hãy đọc phần Cách phân phối thay thế .

Hạn chế tài khoản trong Google Play

Đôi khi, một tổ chức có thể muốn cho phép mọi người thêm tài khoản Google cá nhân Tài khoản (ví dụ: để đọc thư trong Gmail) nhưng không muốn cấu hình tài khoản cá nhân để cài đặt ứng dụng. DPC của bạn có thể thiết lập danh sách tài khoản mọi người có thể sử dụng Google Play.

Thành phần quản trị của thiết bị được quản lý hoàn toàn hoặc hồ sơ công việc có thể hạn chế bằng cách thiết lập một cấu hình được quản lý cho Google Play. Tài khoản có hạn chế khi ứng dụng Google Play đã cài đặt là phiên bản 80970100 trở lên.

Để giới hạn các tài khoản trong Google Play, hãy làm như sau:

  1. Đặt gói cấu hình được quản lý cho gói Google Play com.android.vending.
  2. Trong gói, hãy đặt địa chỉ email được phân tách bằng dấu phẩy làm giá trị chuỗi cho khoá allowed_accounts.

Ví dụ sau đây cho thấy cách bạn có thể giới hạn tài khoản:

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

Để giới hạn Google Play chỉ ở tài khoản công việc, hãy đặt allowed_accounts thành ngay khi DPC của bạn biết địa chỉ email của tài khoản. Một chuỗi trống ngăn mọi người sử dụng bất kỳ tài khoản nào trong Google Play.

Bật tính năng bảo vệ khi đặt lại về trạng thái ban đầu dành cho doanh nghiệp

Khi sử dụng tính năng bảo vệ khi đặt lại về trạng thái ban đầu dành cho doanh nghiệp, các tổ chức có thể chỉ định Tài khoản Google có thể cấp phép cho một thiết bị đã được đặt lại về trạng thái ban đầu.

Tính năng bảo vệ người tiêu dùng đặt lại về trạng thái ban đầu được thiết kế để ngăn chặn hành vi trộm cắp thiết bị. Trước cho phép bất kỳ ai cung cấp thiết bị sau khi đặt lại trái phép về trạng thái ban đầu (chẳng hạn như như sử dụng EMM), trình hướng dẫn thiết lập yêu cầu người dùng xác thực với bất kỳ Những Tài khoản Google từng có trong hồ sơ cá nhân của thiết bị.

Trong môi trường doanh nghiệp, đặt lại về trạng thái ban đầu là một công cụ quan trọng để quản lý thiết bị của nhân viên khi nhân viên rời khỏi tổ chức. Tuy nhiên, nếu tổ chức không biết thông tin đăng nhập tài khoản của một nhân viên, đặt lại về trạng thái ban đầu tính năng bảo vệ có thể chặn khả năng tổ chức cấp thiết bị cho một thiết bị khác nhân viên.

Kiểm soát việc cấp phép sau khi đặt lại về trạng thái ban đầu

Khi chạy ở chế độ chủ sở hữu thiết bị, DPC của bạn có thể sử dụng setFactoryResetProtectionPolicy() để kiểm soát các tài khoản được phép cấp phép cho một thiết bị sau khi đặt lại về trạng thái ban đầu. Nếu cấu hình này được đặt thành null hoặc đặt thành danh sách trống, thì tài khoản được uỷ quyền cung cấp một thiết bị sau khi đặt lại về trạng thái ban đầu là các tài khoản trên hồ sơ cá nhân của thiết bị.

DPC có thể định cấu hình các tài khoản này trong suốt thời gian hoạt động của tài khoản được quản lý hoàn toàn thiết bị.

  1. Quản trị viên CNTT có thể sử dụng phương thức people.get trong API Mọi người với giá trị đặc biệt me. Thao tác này sẽ truy xuất userId cho phần tài khoản đã đăng nhập. userID được trả về trong khoá resourceName trong có dạng people/[userId] dưới dạng chuỗi số nguyên. Các tài khoản mới tạo có thể không khả dụng cho mục đích đặt lại về trạng thái ban đầu trong vòng 72 giờ.
  2. Bạn cũng nên cho phép một hoặc nhiều quản trị viên CNTT mở khoá thiết bị sau đặt lại về trạng thái ban đầu. Yêu cầu từng quản trị viên CNTT này đăng nhập vào Tài khoản Google của họ và đồng thời làm theo bước 1 và chia sẻ userId của họ với bạn để bạn có thể thêm userIds vào Danh sách trong bước tiếp theo.
  3. DPC thiết lập giới hạn thích hợp cho ứng dụng bằng cách sử dụng setFactoryResetProtectionPolicy() để đặt Danh sách userId có thể cung cấp một thiết bị đã đặt lại về trạng thái ban đầu.
  4. DPC cho phép các tài khoản có thể cấp phép cho các thiết bị sau khi xuất xưởng đặt lại bằng cách gửi thông báo truyền tin com.google.android.gms.auth.FRP_CONFIG_CHANGED làm ý định tường minh để tránh bị bỏ qua do các hạn chế trong nền.

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

Đối với các thiết bị không thể sử dụng setFactoryResetProtectionPolicy(), được giới thiệu bằng API cấp 30, DPC của bạn có thể sử dụng setApplicationRestrictions để thêm các tài khoản đã chọn với cấu hình được quản lý factoryResetProtectionAdmin cho gói 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);

Tắt chế độ bảo vệ khi đặt lại về trạng thái ban đầu dành cho doanh nghiệp

Để tắt tính năng bảo vệ khi đặt lại về trạng thái ban đầu, DPC của bạn có thể sử dụng setFactoryResetProtectionPolicy()chuyển giá trị 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);

Đối với các thiết bị không thể sử dụng setFactoryResetProtectionPolicy(), được giới thiệu bằng API cấp 30, DPC của bạn có thể sử dụng setApplicationRestrictions để đặt khoá giá trị của true trong disableFactoryResetProtectionAdmin được quản lý cấu hình cho gói 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);

Giám sát nhật ký quy trình của doanh nghiệp và báo cáo lỗi từ xa

Trong bảng điều khiển EMM, quản trị viên có thể giám sát các thiết bị được quản lý hoàn toàn bằng Enterprise nhật ký xử lý và báo cáo lỗi từ xa.

Ghi nhật ký hoạt động trên thiết bị của doanh nghiệp

DPC chạy ở chế độ chủ sở hữu thiết bị có thể xác định hoạt động đáng ngờ bằng cách theo dõi hoạt động của thiết bị, bao gồm cả các lần khởi chạy ứng dụng, Cầu gỡ lỗi Android (adb) hoạt động và phương thức mở khoá màn hình. Nhật ký quy trình không yêu cầu sự đồng ý của người dùng.

Để bật hoặc tắt tính năng ghi nhật ký, DPC sẽ gọi setSecurityLoggingEnabled().

Khi có một lô nhật ký mới, DeviceAdminReceiver sẽ nhận được Lệnh gọi lại onSecurityLogsAvailable(). Để truy xuất nhật ký (sau khi nhận lệnh gọi lại), DPC sẽ gọi retrieveSecurityLogs().

DPC cũng có thể gọi retrievePreRebootSecurityLogs() để tìm nạp thông tin bảo mật nhật ký được tạo trong chu kỳ khởi động lại trước đó. Đây là khoảng thời gian giữa thiết bị khởi động lại gần đây nhất và lần khởi động lại trước đó. Thiết bị không hỗ trợ retrieveSecurityLogs() trả về null. Nếu ứng dụng của bạn truy xuất nhật ký bằng cả retrievePreRebootSecurityLogs()retrieveSecurityLogs(), bạn cần kiểm tra các mục nhập trùng lặp.
Lưu ý: Tính năng này chỉ ghi nhật ký hoạt động trên các thiết bị được quản lý hoàn toàn bằng một hoặc người dùng liên kết trên thiết bị. Tính năng này không hoạt động trên thiết bị cá nhân vì tính năng này ghi lại hoạt động trên toàn thiết bị.

Chế độ cài đặt này có thể hữu ích khi kiểm tra sự kiện sau bảo mật vì nó ghi lại các loại hành động sau:

  • Mỗi khi ứng dụng được khởi động lại. Điều này có thể giúp xác định xem có phần mềm độc hại bắt đầu từ một ứng dụng bị xâm phạm.
  • Không mở khoá được trên một thiết bị. Điều này có thể xác định xem có nhiều lần mở khóa không thành công trong một khoảng thời gian ngắn.
  • Các lệnh adb có khả năng gây hại khi người dùng kết nối thiết bị với máy tính bằng cáp USB.

Để biết thông tin chi tiết về cách đọc nhật ký, hãy xem SecurityLog.

Trong khi phát triển và thử nghiệm, bạn có thể buộc hệ thống thực hiện bất kỳ nhật ký bảo mật hiện có sẵn có cho DPC của bạn—bạn không phải đợi lô. Trong Android 9.0 (API cấp 28) trở lên, hãy chạy lệnh sau Lệnh Cầu gỡ lỗi Android (adb) trong thiết bị đầu cuối của bạn:

adb shell dpm force-security-logs

Hệ thống giới hạn tần suất bạn có thể sử dụng công cụ này và báo cáo bất kỳ cố ý làm chậm trong đầu ra của thiết bị đầu cuối. Nếu có nhật ký, DPC nhận được lệnh gọi lại onSecurityLogsAvailable().

Yêu cầu báo cáo lỗi từ xa

DPC chạy ở chế độ chủ sở hữu thiết bị có thể yêu cầu báo cáo lỗi cho người dùng từ xa các thiết bị chỉ có một người dùng hoặc người dùng được liên kết. Báo cáo lỗi ghi lại hoạt động của thiết bị ngay tại thời điểm yêu cầu báo cáo lỗi, nhưng cũng có thể bao gồm cả hoạt động trong vài giờ trước, tuỳ thuộc vào tần suất logcat làm mới vùng đệm.

Để yêu cầu báo cáo lỗi từ xa, DPC sẽ gọi requestBugreport():

Cấp quyền truy cập và xoá quyền truy cập vào một chứng chỉ máy khách

Nếu một DPC đang chạy ở chế độ chủ sở hữu thiết bị hoặc chủ sở hữu hồ sơ sẽ cấp cho ứng dụng bên thứ ba khả năng quản lý chứng chỉ, ứng dụng có thể tự cấp quyền truy cập vào chứng chỉ mà không cần sự can thiệp của người dùng. Để cài đặt một chứng chỉ mà tất cả ứng dụng trong hồ sơ đều có thể truy cập, hãy dùng installKeyPair().

Để biết các tham số cần định cấu hình, hãy xem installKeyPair(). Tính năng này hoạt động cùng với API hiện có để quản lý chứng chỉ.

Trường hợp triển khai

Nếu không có phương thức installKeyPair():

  • Người dùng cần nhấn vào tên của chứng chỉ rồi nhấn vào Cho phép mỗi lần họ muốn cấp quyền truy cập vào một chứng chỉ.
  • Người dùng sẽ thấy lời nhắc khi cài đặt chứng chỉ và phải đặt tên cho chứng chỉ.

Với phương thức installKeyPair():

  • Người dùng không cần nhấn vào Cho phép mỗi khi họ muốn cấp quyền truy cập vào chứng chỉ.
  • Người dùng không thể đổi tên chứng chỉ.
  • Quản trị viên có nhiều quyền kiểm soát hơn trong việc chặn các chứng chỉ cho các ứng dụng không được có quyền truy cập vào các chứng chỉ cụ thể.

Xoá chứng chỉ máy khách

Sau khi cấp quyền truy cập vào chứng chỉ máy khách, để xoá từ xa ứng dụng các chứng chỉ được cài đặt qua installKeyPair(), gọi removeKeyPair().

Một DPC đang chạy ở chế độ chủ sở hữu thiết bị/chế độ chủ sở hữu hồ sơ hoặc được uỷ quyền trình cài đặt chứng chỉ có thể gọi removeKeyPair(). Thao tác này sẽ xoá một chứng chỉ và khoá riêng tư được cài đặt trong một bí danh khoá cá nhân đã cho.

Trường hợp triển khai

Sử dụng tính năng này nếu một tổ chức đang chuyển sang một hình thức ứng dụng an toàn hơn chứng chỉ. Nếu quản trị viên triển khai chứng chỉ mới và việc phân phối chứng chỉ đó mất rất nhiều thời gian, quản trị viên có thể thu hồi thông tin không dùng nữa sau khi di chuyển xong.

Đã đặt lại mật mã bảo mật

DPC của bạn có thể đặt lại mật khẩu của người dùng bằng cách cho phép thay đổi bằng đã đăng ký trước, mã thông báo bảo mật. Chủ sở hữu thiết bị và chủ sở hữu hồ sơ có thể gọi an toàn API đặt lại mật mã để thay đổi mật khẩu của thiết bị và hồ sơ công việc . Tính năng đặt lại mật mã an toàn sẽ thay thế resetPassword() bằng những điểm cải tiến sau:

Bạn nên sử dụng tính năng đặt lại mật mã bảo mật nếu bản dựng DPC nhắm đến Android 8.0 (API) cấp 26) trở lên. Việc gọi resetPassword() sẽ tạo ra SecurityException trong DPC nhắm đến Android 8.0 trở lên, vì vậy, bạn có thể cần cập nhật DPC của mình.

Thiết lập và kích hoạt mã thông báo

DPC của bạn cần đặt và kích hoạt mã thông báo trước khi đặt lại mật khẩu. Bởi vì DPC của bạn có thể không sử dụng được mã thông báo ngay lập tức, bạn đặt mã thông báo trước khi quản trị viên CNTT có thể cần sử dụng công cụ này.

Mã thông báo đặt lại mật khẩu là một giá trị ngẫu nhiên được mã hoá mạnh và cần phải phải dài ít nhất 32 byte. Tạo mã thông báo cho từng thiết bị và hồ sơ (đừng làm vậy) sử dụng lại hoặc chia sẻ mã thông báo đã tạo.

Bạn nên lưu trữ mã thông báo hoặc các phương tiện để giải mã mã thông báo đã mã hoá trên máy chủ. Nếu bạn lưu trữ mã thông báo cục bộ trong bộ nhớ được mã hoá thông tin đăng nhập, DPC của bạn không thể đặt lại mật khẩu cho đến khi người dùng mở khoá thiết bị hoặc hồ sơ. Nếu bạn lưu trữ các mã thông báo đó trên thiết bị trong bộ nhớ được mã hoá của thiết bị, vùng này sẽ bị xâm phạm kẻ tấn công có thể sử dụng mã thông báo này để truy cập vào hồ sơ công việc hoặc người dùng.

Bạn có thể tạo mã thông báo mới trong DPC hoặc tìm nạp mã thông báo từ máy chủ. Chiến lược phát hành đĩa đơn ví dụ bên dưới cho thấy DPC tự tạo một mã thông báo và báo cáo mã thông báo đó cho máy chủ:

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

Trong hầu hết trường hợp, DPC của bạn cần kích hoạt mã thông báo sau khi cài đặt. Tuy nhiên, khi người dùng không có mật khẩu màn hình khoá, hệ thống sẽ kích hoạt một mã thông báo ngay lập tức. Để kích hoạt mã thông báo, hãy yêu cầu người dùng xác nhận thông tin đăng nhập của họ. DPC của bạn có thể gọi phương thức KeyguardManager createConfirmDeviceCredentialIntent() để nhận Intent sẽ bắt đầu xác nhận. Giải thích cho người dùng thiết bị trong giao diện người dùng, tại sao bạn yêu cầu họ xác thực. Đoạn mã dưới đây minh hoạ cách bạn có thể kích hoạt một mã thông báo trong DPC của bạn:

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
}

Bạn cần kích hoạt mã thông báo mà DPC đã đặt trước khi thiết bị khởi động lại. của Android sẽ lưu trữ một mã thông báo chưa kích hoạt trong bộ nhớ và không duy trì mã thông báo đó sau một khởi động lại. Nếu người dùng khởi động lại thiết bị trước khi kích hoạt mã thông báo, DPC của bạn có thể hãy đặt lại cùng một mã thông báo hoặc tạo một mã thông báo mới.

DPC của bạn có thể xác nhận rằng mã thông báo đang hoạt động bằng cách gọi Hàm isResetPasswordTokenActive() và kiểm tra kết quả là true.

Sau khi DPC của bạn đặt và kích hoạt một mã thông báo, mã thông báo đó sẽ có hiệu lực cho đến khi DPC của bạn xoá hoặc thay thế mã thông báo (hoặc thiết bị được đặt lại về trạng thái ban đầu). Mã thông báo độc lập với mật khẩu và không bị ảnh hưởng bởi việc người dùng thay đổi hoặc xoá mật khẩu.

Xoá mã thông báo

Bạn có thể gọi clearResetPasswordToken() để xoá mã thông báo mà DPC của bạn đặt trước đó. Bạn có thể cần thu hồi mã thông báo bị xâm phạm hoặc bạn nên loại bỏ khả năng đặt lại mật khẩu. Mẫu dưới đây cho biết cách bạn có thể thực hiện sau đây trong DPC của bạn:

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

Đặt lại mật khẩu

Khi quản trị viên CNTT cần đặt lại mật khẩu, hãy gọi resetPasswordWithToken() rồi chuyển mã thông báo mà DPC của bạn đã thiết lập và kích hoạt trước:

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

Lệnh gọi đến resetPasswordWithToken() trả về false, và mật khẩu không trả về khi mật khẩu mới không đáp ứng các hạn chế sau:

  • Số ký tự đáp ứng mọi giới hạn về độ dài mật khẩu tối thiểu. Gọi điện getPasswordMinimumLength() để biết nhóm CNTT quản trị viên đã đặt giới hạn độ dài.
  • Phạm vi và độ phức tạp của các ký tự trong mật khẩu kết hợp với cấu trúc quy tắc ràng buộc. Gọi getPasswordQuality() để biết nhân viên CNTT quản trị viên đã đặt giới hạn sáng tác.

Nếu các quy tắc ràng buộc về chất lượng mật khẩu không yêu cầu đặt mật khẩu, bạn có thể truyền null hoặc một chuỗi trống đến resetPasswordWithToken() để xoá mật khẩu.

Thử thách bảo mật hồ sơ công việc

DPC chạy ở chế độ chủ sở hữu hồ sơ có thể yêu cầu người dùng chỉ định một loại bảo mật đối với các ứng dụng chạy trong hồ sơ công việc. Hệ thống hiển thị thông tin bảo mật khi người dùng cố gắng mở một ứng dụng công việc bất kỳ. Nếu người dùng thành công hoàn thành thử thách bảo mật, hệ thống sẽ mở khoá hồ sơ công việc và giải mã tệp đó, nếu cần.

Cách hoạt động của thử thách bảo mật hồ sơ công việc

  1. Nếu DPC gửi ý định ACTION_SET_NEW_PASSWORD, hệ thống sẽ nhắc người dùng thiết lập thử thách bảo mật.
  2. DPC cũng có thể gửiACTION_SET_NEW_PARENT_PROFILE_PASSWORD ý định nhắc người dùng đặt phương thức khoá thiết bị.

DPC có thể đặt chính sách mật khẩu cho thử thách công việc khác với chính sách đối với mật khẩu khác của thiết bị. Ví dụ: độ dài tối thiểu cho thuộc tính câu trả lời cho thử thách trên thiết bị có thể khác với độ dài cần thiết cho mật khẩu. DPC đặt ra các chính sách thách thức bằng cách sử dụng Các phương thức DevicePolicyManager, chẳng hạn như setPasswordQuality()setPasswordMinimumLength().

Những yếu tố nên cân nhắc

  • DPC có thể đặt lại mật khẩu trên hồ sơ công việc nhưng không thể đặt lại mật khẩu (cá nhân) của thiết bị. Nếu người dùng chọn đặt mật khẩu công việc và mật khẩu cá nhân giống nhau, thì resetPassword() trên hồ sơ công việc sẽ khiến mật khẩu chỉ được đặt lại trên hồ sơ công việc và mật khẩu sẽ không giống nhau làm màn hình khoá thiết bị.
  • DPC có thể tuỳ chỉnh màn hình thông tin xác thực cho thử thách công việc bằng cách sử dụng setOrganizationColor()setOrganizationName().
  • Quản trị viên thiết bị không thể sử dụng resetPassword() để xoá mật khẩu hoặc thay đổi mà đã được thiết lập. Quản trị viên thiết bị vẫn có thể đặt mật khẩu, nhưng chỉ khi thiết bị không có mật khẩu, mã PIN hoặc hình mở khoá.

Để biết thêm thông tin, hãy xem getParentProfileInstance() và tài liệu tham khảo theo DevicePolicyManager.