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:
- Đặt gói cấu hình được quản lý cho gói Google Play
com.android.vending
. - Trong gói, hãy đặt một giá trị boolean cho thuộc tính
Khoá
verify_apps:device_wide_unknown_source_block
. - 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:
- Đặt gói cấu hình được quản lý cho gói Google Play
com.android.vending
. - 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ị.
- 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ệtme
. Thao tác này sẽ truy xuấtuserId
cho phần tài khoản đã đăng nhập.userID
được trả về trong khoáresourceName
trong có dạngpeople/[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ờ. - 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êmuserIds
vào Danh sách trong bước tiếp theo. - 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áchuserId
có thể cung cấp một thiết bị đã đặt lại về trạng thái ban đầu. - 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);
Cũ
Đố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);
Cũ
Đố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()
và 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()
:
- Nếu người dùng chấp nhận chia sẻ báo cáo lỗi, DPC sẽ nhận được lỗi đó
báo cáo đang sử dụng
onBugreportShared()
. - Nếu người dùng từ chối chia sẻ báo cáo lỗi, DPC sẽ nhận được lượt chia sẻ
yêu cầu tin nhắn bị từ chối sử dụng
onBugreportSharingDeclined()
. - Nếu báo cáo lỗi không thành công, DPC sẽ thấy
onBugreportFailed()
kèm theoBUGREPORT_FAILURE_FAILED_COMPLETING
hoặcBUGREPORT_FAILURE_FILE_NO_LONGER_AVAILABLE
.
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:
- DPC của bạn có thể đặt lại mật mã trước khi người dùng mở khoá thiết bị hoặc hồ sơ sau khi khởi động lại trên thiết bị sử dụng mã hoá dựa trên tệp.
- Kho khoá Android giữ lại các khoá đã được người dùng xác thực sau khi đặt lại mật mã.
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
- 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. - DPC cũng có thể gửi
ACTION_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()
và
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()
và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
.