Güvenlik

Bu kılavuzdaki özelliklerde, cihaz politikası denetleyici (DPC) uygulamanızda uygulayabileceğiniz güvenlik yönetimi özellikleri açıklanmaktadır. Bu dokümanda, kod örnekleri bulunmaktadır. Ayrıca, Android'in kurumsal özellikleri için örnek kod kaynağı olarak Test DPC uygulamasını da kullanabilirsiniz.

DPC uygulamaları, kişisel cihazlarda profil sahibi modunda veya tümüyle yönetilen cihazlarda cihaz sahibi modunda çalışabilir. Bu tablo, DPC profil sahibi modunda veya cihaz sahibi modunda çalıştırıldığında hangi özelliklerin kullanılabildiğini gösterir:

Özellik Profil sahibi Cihaz sahibi
Uygulamalara erişimi devre dışı bırakma
Bilinmeyen kaynaklardan gelen uygulamaları engelleme
Google Play'de hesapları kısıtlama
Kurumsal fabrika ayarlarına sıfırlama korumasını etkinleştirme
Kurumsal işlem günlüklerini ve uzaktan hata raporlarını izleme
İstemci sertifikasına erişim izni verme ve erişim iznini kaldırma
Güvenli şifre kodu sıfırlama
İş profili güvenlik doğrulaması

Uygulamalara erişimi devre dışı bırakma

Çalışanların Android destekli cihazlarında günün belirli saatlerinde veya haftanın belirli günlerinde oyun oynamasını veya YouTube izlemesini engellemek isteyen kuruluşlar için DPC, uygulamalara erişimi geçici olarak devre dışı bırakabilir.

Uygulamalara erişimi devre dışı bırakmak için cihaz sahibi veya profil sahibi modunda çalışan bir DPC setPackagesSuspended() özelliğini yapılandırır ve seçilen uygulama devre dışıymış gibi çalışır (Google başlatıcı, uygulamayı devre dışı bırakır). Kullanıcı uygulamaya dokunduğunda, uygulamanın askıya alındığını belirten bir sistem iletişim kutusu görür.

Bir uygulama askıya alındığında etkinlik başlatamaz ve pakete gönderilen bildirimler atlanır. Askıya alınan paketler genel bakış ekranında görünmez, iletişim kutularını (kısa mesaj notları ve atıştırmalık çubukları dahil) gösteremez, ses çalamaz veya cihazı titreşemez.

Başlatıcılar isPackageSuspended() yöntemini çağırarak bir uygulamanın askıya alınıp alınmadığını öğrenebilir. Uygulamaların askıya alınmasının nasıl yapılandırılacağıyla ilgili ayrıntılar için setPackagesSuspended bölümünü inceleyin.

Bilinmeyen kaynaklardan gelen uygulamaları engelleyin

Google Play'den (veya diğer güvenilir uygulama mağazalarından) yüklenmemiş uygulamalara bilinmeyen kaynaklardan uygulamalar denir. Kullanıcılar bu uygulamaları yüklediğinde cihazlar ve veriler risk altında olabilir.

Kullanıcıların bilinmeyen kaynaklardan uygulama yüklemesini engellemek için tümüyle yönetilen cihazların ve iş profillerinin yönetici bileşenlerine DISALLOW_INSTALL_UNKNOWN_SOURCES kullanıcı kısıtlaması ekleyebilirsiniz.

İş profili için cihaz genelinde kısıtlama

Bir iş profilinin yöneticisi DISALLOW_INSTALL_UNKNOWN_SOURCES özelliğini eklediğinde kısıtlama yalnızca iş profili için geçerli olur. Ancak, bir iş profili yöneticisi Google Play için bir yönetilen yapılandırma ayarlayarak cihaz genelinde bir kısıtlama uygulayabilir. Cihaz genelinde kısıtlama, yüklü Google Play uygulamasının 80812500 veya sonraki sürümleri Android 8.0 (veya sonraki sürümler) için geçerlidir.

Uygulama yüklemelerini Google Play ile kısıtlamak için şu adımları uygulayın:

  1. com.android.vending adlı Google Play paketi için bir yönetilen yapılandırma paketi ayarlayın.
  2. Pakete verify_apps:device_wide_unknown_source_block anahtarı için bir boole değeri girin.
  3. ENSURE_VERIFY_APPS kullanıcı kısıtlamasını ekleyin.

Aşağıdaki örnekte, Google Play'in bu ayarı destekleyip desteklemediğini ve değeri true olarak nasıl ayarlayabileceğiniz gösterilmektedir:

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

Sistem ayarlarındaki kullanıcı arayüzü etkin kalır ancak sistem, uygulama yüklemesini engeller. Bu kısıtlama gelecekteki yüklemeleri etkiler. Önceden yüklenmiş olan uygulamalar cihazda kalır. Cihaz kullanıcıları, Android Debug Bridge'i (adb) kullanarak kişisel profillerine uygulama yüklemeye devam edebilir.

Bilinmeyen kaynaklar hakkında daha fazla bilgi edinmek için Alternatif dağıtım seçenekleri başlıklı makaleyi inceleyin.

Google Play'de hesapları kısıtlama

Bazen bir kuruluş, kullanıcıların kişisel Google Hesapları eklemesine izin vermek isteyebilir (örneğin, Gmail'de postaları okumak için) ancak kişisel hesaptan uygulama yüklemesini istemez. DPC'niz, kişilerin Google Play'de kullanabileceği hesapların listesini oluşturabilir.

Tümüyle yönetilen cihazların veya iş profillerinin yönetici bileşenleri, Google Play için yönetilen bir yapılandırma ayarlayarak hesapları kısıtlayabilir. Bu hesap kısıtlaması, yüklü Google Play uygulamasının 80970100 veya sonraki bir sürümü olduğunda kullanılabilir.

Google Play'deki hesapları sınırlandırmak için şunları yapın:

  1. com.android.vending adlı Google Play paketi için bir yönetilen yapılandırma paketi ayarlayın.
  2. Pakete, virgülle ayrılmış e-posta adreslerini allowed_accounts anahtarı için dize değeri olarak yerleştirin.

Aşağıdaki örnekte, hesapları nasıl sınırlayabileceğiniz gösterilmektedir:

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

Google Play'i yalnızca iş hesabıyla sınırlandırmak için DPC'niz hesabın e-posta adresini öğrenir öğrenmez allowed_accounts özelliğini tek bir yönetilen hesap olarak ayarlayın. Boş dize, kullanıcıların Google Play'de herhangi bir hesabı kullanmasını engeller.

Kurumsal fabrika ayarlarına sıfırlama korumasını etkinleştir

Kuruluşlar, kurumsal fabrika sıfırlama korumasını kullanarak hangi Google Hesaplarının fabrika ayarlarına sıfırlanmış bir cihazın temel hazırlığını yapabileceğini belirtebilir.

Tüketicilere yönelik fabrika ayarlarına sıfırlama koruması, cihaz hırsızlığını engellemek için tasarlanmıştır. Yetkisiz fabrika ayarlarına sıfırlama işleminden sonra (örneğin, bir EMM kullanarak) cihazın herhangi bir kişinin temel hazırlığını yapmasına izin vermeden önce, kurulum sihirbazı, kullanıcının daha önce cihazın kişisel profilinde bulunan tüm Google Hesaplarında kimlik doğrulaması yapmasını gerektirir.

Kurumsal ortamlarda fabrika ayarlarına sıfırlama, bir çalışan kuruluştan ayrıldığında çalışanların cihazlarını yönetmek için önemli bir araçtır. Ancak kuruluş, bir çalışanın hesap kimlik bilgilerini bilmiyorsa fabrika ayarlarına sıfırlama koruması, kuruluşun başka bir çalışana cihaz vermesini engelleyebilir.

Fabrika ayarlarına sıfırlama işleminden sonra temel hazırlığı kontrol etme

Cihaz sahibi modunda çalışırken DPC'niz, fabrika ayarlarına sıfırlandıktan sonra hangi hesapların cihaz sağlama yetkisine sahip olduğunu kontrol etmek için setFactoryResetProtectionPolicy() aracını kullanabilir. Bu yapılandırma null değerine veya boş bir listeye ayarlanırsa fabrika ayarlarına sıfırlandıktan sonra bir cihazın temel hazırlığını yapmak için yetkilendirilen hesaplar, cihazın kişisel profilindeki hesaplardır.

DPC, tümüyle yönetilen bir cihazın kullanım ömrü boyunca bu hesapları yapılandırabilir.

  1. BT yöneticisi, People API'deki people.get yöntemini me özel değeriyle kullanabilir. Bu işlem, giriş yapmış hesap için userId kodunu getirir. userID, resourceName anahtarında people/[userId] biçiminde bir tam sayı dizesi olarak döndürülür. Yeni oluşturulan hesaplar, fabrika ayarlarına sıfırlama amacıyla 72 saat boyunca kullanılamayabilir.
  2. Ayrıca, bir veya daha fazla BT yöneticisinin, fabrika ayarlarına sıfırladıktan sonra cihazın kilidini açabilmesini de isteyebilirsiniz. Bu BT yöneticilerinin her birinin kendi Google Hesabına giriş yapıp 1. adımı uygulamasını ve userId sizinle paylaşmasını sağlayın. Böylece bu userIds sonraki adımda Liste'ye eklenebilir.
  3. DPC, fabrika ayarlarına sıfırlanmış bir cihazın temel hazırlığını yapabilecek userId Listesini ayarlamak için setFactoryResetProtectionPolicy() kullanarak uygun bir uygulama kısıtlaması belirler.
  4. DPC, fabrika ayarlarına sıfırlama işleminden sonra com.google.android.gms.auth.FRP_CONFIG_CHANGED yayınını, arka plan kısıtlamaları nedeniyle yayından kaldırılmayı önlemek için açık bir amaç olarak göndererek cihazların temel hazırlığını yapabilen hesapların etkinleştirilmesini sağlar.

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

Eski

API Düzeyi 30 ile sunulan setFactoryResetProtectionPolicy() özelliğini kullanamayan cihazlarda DPC'niz, seçilen hesapları com.google.android.gms paketinin factoryResetProtectionAdmin tarafından yönetilen yapılandırmasına eklemek için setApplicationRestrictions kullanabilir.

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

Kurumsal fabrika ayarlarına sıfırlama korumasını devre dışı bırak

DPC'niz fabrika ayarlarına sıfırlama korumasını devre dışı bırakmak için setFactoryResetProtectionPolicy()null değerini geçirmeyi kullanabilir.

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

Eski

API Düzeyi 30 ile sunulan setFactoryResetProtectionPolicy() özelliğini kullanamayan cihazlarda DPC'niz, com.google.android.gms paketinin disableFactoryResetProtectionAdmin tarafından yönetilen yapılandırmasında true anahtar/değer çifti ayarlamak için setApplicationRestrictions kullanabilir.

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

Kurumsal işlem günlüklerini ve uzaktan hata raporlarını izleme

EMM konsolunuzda bir yönetici, kurumsal işlem günlüklerini ve uzaktan hata raporlarını kullanarak tümüyle yönetilen cihazları izleyebilir.

Kurumsal cihaz etkinliğini günlüğe kaydetme

Cihaz sahibi modunda çalışan bir DPC, uygulama başlatma, Android Debug Bridge (adb) etkinliği ve ekran kilidi açma gibi cihaz etkinliğini uzaktan izleyerek şüpheli etkinlikleri tespit edebilir. İşlem günlükleri, kullanıcıların iznini gerektirmez.

DPC, günlük kaydını etkinleştirmek veya devre dışı bırakmak için setSecurityLoggingEnabled() ifadesini arar.

Yeni bir günlük grubu kullanılabilir olduğunda DeviceAdminReceiver, onSecurityLogsAvailable() geri çağırmasını alır. DPC, günlükleri almak için (geri çağırmayı aldıktan sonra) retrieveSecurityLogs() yöntemini çağırır.

DPC'ler, önceki yeniden başlatma döngüsünde oluşturulan güvenlik günlüklerini getirmek için retrievePreRebootSecurityLogs() yöntemini de çağırabilir. Bu, cihazın son yeniden başlatılmasıyla önceki yeniden başlatma arasındaki aralıktır. retrieveSecurityLogs() özelliğini desteklemeyen cihazlar null değerini döndürür. Uygulamanız hem retrievePreRebootSecurityLogs() hem de retrieveSecurityLogs() kullanarak günlükleri alıyorsa yinelenen girişleri kontrol etmeniz gerekir.
Not: Bu özellik yalnızca cihazda tek bir kullanıcının veya ilişkili kullanıcıların bulunduğu, tümüyle yönetilen cihazlardaki etkinliği günlüğe kaydeder. Bu özellik, cihaz genelindeki etkinliği günlüğe kaydettiğinden kişisel cihazlarda çalışmaz.

Bu ayar, aşağıdaki işlem türlerini günlüğe kaydettiğinden güvenlik etkinliği sonrası denetiminde yararlı olabilir:

  • Uygulama yeni başlatıldığında. Bu, güvenliği ihlal edilmiş bir uygulamayla başlayan kötü amaçlı yazılım olup olmadığını belirlemenize yardımcı olabilir.
  • Cihazda başarısız kilit açma denemeleri. Bu şekilde kısa bir süre içinde birkaç başarısız kilit açma denemesi yapılıp yapılmadığını belirleyebilirsiniz.
  • Kullanıcı, cihazı bir USB kablosuyla bilgisayara bağladığında, zararlı olabilecek adb komutları gösterilir.

Günlükleri okumayla ilgili ayrıntılı bilgi için SecurityLog başlıklı makaleyi inceleyin.

Geliştirme ve test aşamasında, sistemi mevcut güvenlik günlüklerini DPC'niz için kullanılabilir yapmaya zorlayabilirsiniz. Tam bir toplu işlem için beklemeniz gerekmez. Android 9.0 (API düzeyi 28) veya sonraki sürümlerde terminalinizde aşağıdaki Android Debug Bridge (adb) komutunu çalıştırın:

adb shell dpm force-security-logs

Sistem, aracın kullanım sıklığını sınırlandırır ve terminal çıktısındaki yanlışlıkla yavaşlamayı bildirir. Günlükler varsa DPC'niz onSecurityLogsAvailable() geri çağırmasını alır.

Uzaktan hata raporu isteme

Cihaz sahibi modunda çalışan bir DPC, yalnızca tek bir kullanıcısı veya ilişkili kullanıcıları olan kullanıcı cihazları için uzaktan hata raporu isteyebilir. Hata raporu, cihaz etkinliğini hata raporunun istendiği anda kaydeder, ancak logcat arabelleğinin ne sıklıkta yenilendiğine bağlı olarak son birkaç saatteki etkinlikleri de içerebilir.

DPC, hata raporlarını uzaktan istemek için requestBugreport() komutunu çağırır:

Bir istemci sertifikasına erişim izni verme ve erişimi kaldırma

Profil sahibi veya cihaz sahibi modunda çalışan bir DPC, bir üçüncü taraf uygulamasına sertifikaları yönetme izni verirse uygulama, kullanıcı müdahalesi olmadan yüklediği sertifikalara kendisine erişim izni verebilir. Bir profildeki tüm uygulamaların erişebileceği bir sertifika yüklemek için installKeyPair() aracını kullanın.

Hangi parametrelerin yapılandırılacağını öğrenmek için installKeyPair() bölümüne bakın. Bu özellik, sertifikaları yönetmek için mevcut API ile birlikte çalışır.

Dağıtım senaryosu

installKeyPair() yöntemi olmadan:

  • Kullanıcıların bir sertifikaya erişim vermek için önce sertifikanın adına, sonra da İzin ver'e dokunması gerekir.
  • Kullanıcılar bir sertifikayı yüklerken bir istem görür ve sertifikaya ad vermeleri gerekir.

installKeyPair() yöntemiyle:

  • Kullanıcıların bir sertifikaya erişim vermek için her seferinde İzin ver'e dokunmaları gerekmez.
  • Kullanıcılar sertifikaları yeniden adlandıramaz.
  • Yöneticiler, belirli sertifikalara erişememesi gereken uygulamalara ait sertifikaları engelleme konusunda daha fazla denetime sahiptir.

İstemci sertifikasını kaldırma

Bir istemci sertifikasına erişim izni verdikten sonra, installKeyPair() üzerinden yüklenen istemci sertifikalarını uzaktan kaldırmak için removeKeyPair() yöntemini çağırın.

Cihaz sahibi modunda veya profil sahibi modunda çalışan bir DPC ya da yetki verilmiş sertifika yükleyicisi removeKeyPair() araması yapabilir. Bu işlem, belirli bir özel anahtar takma adı altında yüklenmiş bir sertifikayı ve özel anahtar çiftini kaldırır.

Dağıtım senaryosu

Bir kuruluş daha güvenli bir istemci sertifikası biçimine geçiyorsa bu özelliği kullanın. Bir yönetici yeni bir sertifika kullanıma sunarsa ve dağıtımı önemli ölçüde zaman alırsa taşıma işlemi tamamlandıktan sonra yönetici, kullanımdan kaldırılan sertifikaları iptal edebilir.

Güvenli şifre kodu sıfırlama

DPC'niz, ön kayıtlı, güvenli bir jetonla değişikliğe izin vererek kullanıcının şifresini sıfırlayabilir. Cihaz sahipleri ve profil sahipleri, cihazların ve iş profillerinin şifresini sırasıyla değiştirmek için güvenli şifre kodu sıfırlama API'lerini çağırabilir. Güvenli şifre kodu sıfırlama işlemi, resetPassword() hizmetini aşağıdaki iyileştirmelerle değiştirir:

DPC derlemeniz Android 8.0 (API düzeyi 26) veya sonraki sürümleri hedefliyorsa güvenli şifre kodu sıfırlama işlevini kullanmanız gerekir. resetPassword() çağrısı, Android 8.0 veya sonraki sürümleri hedefleyen DPC'lerde bir SecurityException hatası döndürür. Bu nedenle, DPC'nizi güncellemeniz gerekebilir.

Jeton ayarlama ve etkinleştirme

DPC'nizin şifre sıfırlamadan önce bir jeton oluşturması ve etkinleştirmesi gerekir. DPC'niz jetonu hemen kullanamayabilir. Bu nedenle jetonu, BT yöneticisinin ihtiyaç duyabileceği süreden önce ayarlarsınız.

Şifre sıfırlama jetonu, şifreleme açısından güçlü bir rastgele değerdir ve en az 32 bayt uzunluğunda olması gerekir. Her cihaz ve profil için bir jeton oluşturun. Oluşturduğunuz jetonları yeniden kullanmayın veya paylaşmayın.

Jetonları veya şifrelenmiş bir jetonun şifresini çözme yöntemini bir sunucuda depolamanızı öneririz. Jetonları yerel olarak kimlik bilgileriyle şifrelenmiş depolamada depolarsanız kullanıcı cihazın veya profilin kilidini açana kadar DPC'niz şifreyi sıfırlayamaz. Jetonları cihazın şifrelenmiş depolama alanında yerel olarak depolarsanız ve bu durum güvenliği ihlal edilirse saldırganlar jetonu bir iş profiline veya birincil kullanıcıya erişmek için kullanabilir.

DPC'nizde yeni bir jeton oluşturabilir veya bir sunucudan jeton getirebilirsiniz. Aşağıdaki örnekte jeton oluşturan ve jetonu bir sunucuya bildiren bir DPC gösterilmektedir:

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

Çoğu durumda DPC'nizin bir jetonu ayarladıktan sonra etkinleştirmesi gerekir. Ancak, kullanıcının kilit ekranı şifresi olmadığında, sistem hemen bir jetonu etkinleştirir. Bir jetonu etkinleştirmek için kullanıcıdan kimlik bilgilerini onaylamasını isteyin. DPC'niz, onayı başlatan bir Intent almak için KeyguardManager yöntemini createConfirmDeviceCredentialIntent() çağırabilir. Kullanıcı arayüzünde cihaz kullanıcısına, neden kimlik doğrulaması yapmasını istediğinizi açıklayın. Aşağıdaki snippet'te bir jetonu DPC'nizde nasıl etkinleştirebileceğiniz gösterilmektedir:

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
}

Cihaz yeniden başlatılmadan önce DPC'nizin ayarladığı bir jetonu etkinleştirmeniz gerekir. Android, etkinleştirilmemiş bir jetonu bellekte saklar ve yeniden başlatma sonrasında jetonu devam ettirmez. Kullanıcı, bir jetonu etkinleştirmeden önce cihazı yeniden başlatırsa DPC'niz aynı jetonu tekrar ayarlayabilir veya yeni bir jeton oluşturabilir.

DPC'niz isResetPasswordTokenActive() yöntemini çağırıp sonucun true olduğunu kontrol ederek bir jetonun etkin olduğunu onaylayabilir.

DPC'niz bir jeton oluşturup etkinleştirdikten sonra, DPC'niz jetonu silene veya değiştirene (ya da cihaz fabrika ayarlarına sıfırlanana) kadar geçerli olur. Jeton şifreden bağımsızdır ve kullanıcının şifreyi değiştirmesinden veya temizlemesinden etkilenmez.

Jeton silme

DPC'nizin daha önce ayarladığı bir jetonu silmek için clearResetPasswordToken() yöntemini çağırabilirsiniz. Güvenliği ihlal edilmiş bir jetonu iptal etmeniz gerekebilir veya şifre sıfırlama özelliğini kaldırmak isteyebilirsiniz. Aşağıdaki örnekte bunu DPC'nizde nasıl yapabileceğiniz gösterilmektedir:

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

Şifreyi sıfırlama

Bir BT yöneticisinin şifreyi sıfırlaması gerektiğinde resetPasswordWithToken() numaralı telefonu arayıp DPC'niz tarafından belirlenen jetonu iletin ve önceden etkinleştirin:

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

Yeni şifre aşağıdaki kısıtlamaları karşılamadığında resetPasswordWithToken() çağrısı false değerini döndürür ve şifre değişmez:

  • Karakter sayısı, minimum şifre uzunluğu kısıtlamasına uyuyor. Bir BT yöneticisinin uzunluk kısıtlaması ayarlayıp ayarlamadığını öğrenmek için getPasswordMinimumLength() numaralı telefonu arayın.
  • Şifredeki karakterlerin aralığı ve karmaşıklığı, bir bileşim kısıtlamasını karşılar. Bir BT yöneticisinin bir beste kısıtlaması ayarlayıp ayarlamadığını öğrenmek için getPasswordQuality() numaralı telefonu arayın.

Şifre kalitesi kısıtlamaları için şifre ayarlanması gerekmiyorsa şifreyi kaldırmak için null veya boş bir dizeyi resetPasswordWithToken() işlevine iletebilirsiniz.

İş profili güvenlik sorgulaması

Profil sahibi modunda çalışan bir DPC, kullanıcıların iş profilinde çalışan uygulamalar için bir güvenlik sorusu belirtmesini gerektirebilir. Kullanıcı herhangi bir iş uygulamasını açmaya çalıştığında sistem güvenlik sorusunu gösterir. Kullanıcı güvenlik sorgulamasını başarıyla tamamlarsa sistem, gerekirse iş profilinin kilidini açar ve şifresini çözer.

İş profili güvenlik sorgulamasının işleyiş şekli

  1. Bir DPC ACTION_SET_NEW_PASSWORD niyeti gönderirse sistem kullanıcıdan güvenlik sorgulaması oluşturmasını ister.
  2. DPC, kullanıcıdan cihaz kilidi ayarlamasını istemek için bir ACTION_SET_NEW_PARENT_PROFILE_PASSWORD niyeti de gönderebilir.

DPC, iş sorgulaması için şifre politikalarını, diğer cihaz şifrelerinin politikalarından farklı şekilde belirleyebilir. Örneğin, cihaz giriş sorgulaması yanıtının minimum uzunluğu diğer şifreler için gereken uzunluktan farklı olabilir. DPC, sorgulama politikalarını setPasswordQuality() ve setPasswordMinimumLength() gibi olağan DevicePolicyManager yöntemlerini kullanarak belirler.

Dikkat edilmesi gereken noktalar

  • DPC, iş profilindeki şifreyi sıfırlayabilir, ancak cihaz (kişisel) şifresini sıfırlayamaz. Bir kullanıcı iş profili ile kişisel şifrelerinin aynı olmasını seçerse iş profilindeki resetPassword() şifrenin yalnızca iş profilinde sıfırlanmasına neden olur ve şifre, cihazın kilit ekranındaki şifreyle aynı olmaz.
  • DPC, setOrganizationColor() ve setOrganizationName() kullanarak iş sorgulaması için kimlik bilgileri ekranını özelleştirebilir.
  • Cihaz yöneticileri, şifreleri temizlemek veya önceden ayarlanmış şifreleri değiştirmek için resetPassword() uygulamasını kullanamaz. Cihaz yöneticileri, yalnızca cihazda şifre, PIN veya desen olmadığında şifre ayarlamaya devam edebilir.

Daha fazla bilgi için getParentProfileInstance() sayfasına ve DevicePolicyManager sayfasındaki referans belgelere göz atın.