Cihaz yönetimi politikalarıyla güvenliği artırma

Cihaz yöneticisi desteğinin sonlandırılması. Bazı yönetici politikaları, cihaz yöneticisi tarafından çağrıldığında kullanımdan kaldırıldı olarak işaretlenmiş. Daha fazla bilgi edinmek ve taşıma seçeneklerini görmek için Cihaz yöneticisi desteğinin sonlandırılması başlıklı makaleye göz atın.

Android 2.2'den (API düzeyi 8) itibaren Android platformu, Device Management API'leri aracılığıyla sistem düzeyinde cihaz yönetimi özellikleri sunmaktadır.

Bu derste, cihaz yönetimi politikalarını zorunlu kılarak içeriklerine erişimi yöneten ve güvenliğe duyarlı bir uygulamanın nasıl oluşturulacağını öğreneceksiniz. Özellikle, uygulama, kısıtlı içeriği kullanıcıya görüntülemeden önce yeterli güçte bir ekran kilidi şifresinin ayarlanmasını sağlayacak şekilde yapılandırılabilir.

Politikanızı tanımlama ve beyan etme

Öncelikle işlev düzeyinde desteklenecek politika türlerini tanımlamanız gerekir. Politikalar, ekran kilidi şifresinin gücünü, geçerlilik sonu zaman aşımını, şifrelemeyi vb. kapsayabilir.

Uygulama tarafından zorunlu kılınacak seçili politika grubunu res/xml/device_admin.xml dosyasında beyan etmeniz gerekir. Android manifesti de beyan edilen politika grubuna referans vermelidir.

Beyan edilen her politika, DevicePolicyManager politikasındaki ilgili bazı cihaz politikası yöntemlerine karşılık gelir (minimum şifre uzunluğu ve minimum büyük harf karakter sayısının tanımlanması iki örnektir). Bir uygulama, karşılık gelen politikası XML'de açıklanmamış olan yöntemleri çağırmaya çalışırsa çalışma zamanında bir SecurityException oluşur. Uygulama başka politika türlerini yönetmeyi amaçlıyorsa force-lock gibi diğer izinler kullanılabilir. Daha sonra göreceğiniz gibi, cihaz yöneticisi etkinleştirme işleminin bir parçası olarak, beyan edilen politikaların listesi kullanıcıya bir sistem ekranında sunulur.

Aşağıdaki snippet, res/xml/device_admin.xml ürününde şifre sınırlama politikasını beyan eder:

<device-admin xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-policies>
        <limit-password />
    </uses-policies>
</device-admin>

Android manifest dosyasında referans verilen politika beyanı XML'si:

<receiver android:name=".Policy$PolicyAdmin"
    android:permission="android.permission.BIND_DEVICE_ADMIN">
    <meta-data android:name="android.app.device_admin"
        android:resource="@xml/device_admin" />
    <intent-filter>
        <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
    </intent-filter>
</receiver>

Cihaz yönetimi alıcısı oluşturma

Desteklediğini beyan ettiğiniz politikalarla ilgili etkinlikler hakkında bildirim alacak bir Cihaz Yönetimi yayın alıcısı oluşturun. Bir uygulama, geri çağırma yöntemlerini seçerek geçersiz kılabilir.

Örnek uygulamada (Cihaz Yöneticisi) cihaz yöneticisi kullanıcı tarafından devre dışı bırakıldığında, yapılandırılmış politika paylaşılan tercihten silinir. Kullanım alanınıza uygun bir iş mantığını uygulamayı düşünmelisiniz. Örneğin uygulama, güvenlik riskini azaltmak için cihazdaki hassas verileri silme, uzaktan senkronizasyonu devre dışı bırakma ve yönetici uyarma gibi çeşitli kombinasyonları uygulayarak güvenlik riskini azaltmak amacıyla bazı işlemler gerçekleştirebilir.

Yayın alıcısının çalışması için bunu yukarıdaki snippet'te gösterildiği gibi Android manifest dosyasına kaydettiğinizden emin olun.

Kotlin

class PolicyAdmin : DeviceAdminReceiver() {

    override fun onDisabled(context: Context, intent: Intent) {
        // Called when the app is about to be deactivated as a device administrator.
        // Deletes previously stored password policy.
        super.onDisabled(context, intent)
        context.getSharedPreferences(APP_PREF, Activity.MODE_PRIVATE).edit().apply {
            clear()
            apply()
        }
    }
}

Java

public static class PolicyAdmin extends DeviceAdminReceiver {

    @Override
    public void onDisabled(Context context, Intent intent) {
        // Called when the app is about to be deactivated as a device administrator.
        // Deletes previously stored password policy.
        super.onDisabled(context, intent);
        SharedPreferences prefs = context.getSharedPreferences(APP_PREF, Activity.MODE_PRIVATE);
        prefs.edit().clear().commit();
    }
}

Cihaz yöneticisini etkinleştirme

Herhangi bir politikayı zorunlu kılmadan önce kullanıcının, uygulamayı cihaz yöneticisi olarak manuel olarak etkinleştirmesi gerekir. Aşağıdaki snippet'te, kullanıcının uygulamanızı etkinleştirebileceği ayarlar etkinliğinin nasıl tetikleneceği gösterilmektedir. Uygulamanın neden cihaz yöneticisi olmak istediğini kullanıcılara vurgulayacak açıklayıcı metin eklemek ve amaçtaki ekstra EXTRA_ADD_EXPLANATION özelliğini belirtmek iyi bir uygulamadır.

Şekil 1. Cihaz politikalarınızın açıklamasını girebileceğiniz kullanıcı etkinleştirme ekranı.

Kotlin

if (!policy.isAdminActive()) {

    val activateDeviceAdminIntent = Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN)

    activateDeviceAdminIntent.putExtra(
            DevicePolicyManager.EXTRA_DEVICE_ADMIN,
            policy.getPolicyAdmin()
    )

    // It is good practice to include the optional explanation text to
    // explain to user why the application is requesting to be a device
    // administrator. The system will display this message on the activation
    // screen.
    activateDeviceAdminIntent.putExtra(
            DevicePolicyManager.EXTRA_ADD_EXPLANATION,
            resources.getString(R.string.device_admin_activation_message)
    )

    startActivityForResult(activateDeviceAdminIntent, REQ_ACTIVATE_DEVICE_ADMIN)
}

Java

if (!policy.isAdminActive()) {

    Intent activateDeviceAdminIntent =
        new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);

    activateDeviceAdminIntent.putExtra(
        DevicePolicyManager.EXTRA_DEVICE_ADMIN,
        policy.getPolicyAdmin());

    // It is good practice to include the optional explanation text to
    // explain to user why the application is requesting to be a device
    // administrator. The system will display this message on the activation
    // screen.
    activateDeviceAdminIntent.putExtra(
        DevicePolicyManager.EXTRA_ADD_EXPLANATION,
        getResources().getString(R.string.device_admin_activation_message));

    startActivityForResult(activateDeviceAdminIntent,
        REQ_ACTIVATE_DEVICE_ADMIN);
}

Kullanıcı "Etkinleştir"i seçerse uygulama bir cihaz yöneticisi olur ve politikayı yapılandırmaya ve uygulamaya başlayabilir.

Uygulamanın ayrıca kullanıcının İptal düğmesini, Geri veya Ana Ekran tuşuna basarak etkinleştirme işleminden vazgeçmesi durumlarıyla başa çıkabilecek duruma gelmesi gerekir. Bu nedenle, Politika Ayarlama Etkinliği'nde onResume(), durumu yeniden değerlendirmek ve gerektiğinde kullanıcıya Cihaz Yöneticisi Etkinleştirme seçeneğini sunmak için bir mantığa sahip olmalıdır.

Cihaz politikası denetleyiciyi uygulama

Cihaz yöneticisi başarıyla etkinleştirildikten sonra uygulama, Cihaz Politikası Yöneticisi'ni istenen politikayla yapılandırır. Her sürümde yeni politikaların Android'e ekleneceğini unutmayın. Platformun eski sürümlerini desteklerken yeni politikalar kullanıyorsanız uygulamanızda sürüm kontrolleri yapmak uygundur. Örneğin, Şifre Minimum Tümü Büyük Harf politikası, yalnızca API düzeyi 11 (Honeycomb) ve sonraki sürümlerde kullanılabilir. Aşağıdaki kod, sürümü çalışma zamanında nasıl kontrol edebileceğinizi gösterir.

Kotlin

private lateinit var dpm: DevicePolicyManager
private lateinit var policyAdmin: ComponentName

dpm = context.getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager
policyAdmin = ComponentName(context, PolicyAdmin::class.java)

dpm.apply {
    setPasswordQuality(policyAdmin, PASSWORD_QUALITY_VALUES[passwordQuality])
    setPasswordMinimumLength(policyAdmin, passwordLength)
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        setPasswordMinimumUpperCase(policyAdmin, passwordMinUpperCase)
    }
}

Java

DevicePolicyManager dpm = (DevicePolicyManager)
        context.getSystemService(Context.DEVICE_POLICY_SERVICE);
ComponentName policyAdmin = new ComponentName(context, PolicyAdmin.class);

dpm.setPasswordQuality(policyAdmin, PASSWORD_QUALITY_VALUES[passwordQuality]);
dpm.setPasswordMinimumLength(policyAdmin, passwordLength);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
    dpm.setPasswordMinimumUpperCase(policyAdmin, passwordMinUpperCase);
}

Bu noktada, uygulama politikayı uygulayabilir. Uygulamanın, kullanılan gerçek ekran kilidi şifresine erişimi olmasa da Device Policy Manager API'si aracılığıyla mevcut şifrenin gerekli politikayı karşılayıp karşılamadığını belirleyebilir. Mevcut ekran kilidi şifresinin yeterli olmadığı ortaya çıkarsa cihaz yönetimi API'si otomatik olarak düzeltici işlem yapmaz. Ayarlar uygulamasında sistem şifresi değiştirme ekranını açık bir şekilde başlatmak uygulamanın sorumluluğudur. Örneğin:

Kotlin

if (!dpm.isActivePasswordSufficient) {
    // Triggers password change screen in Settings.
    Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD).also { intent ->
        startActivity(intent)
    }
}

Java

if (!dpm.isActivePasswordSufficient()) {
    ...
    // Triggers password change screen in Settings.
    Intent intent =
        new Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD);
    startActivity(intent);
}

Normalde kullanıcı; Yok, Kalıp, PIN (sayısal) veya Şifre (alfasayısal) gibi mevcut kilit mekanizmalarından birini seçebilir. Bir şifre politikası yapılandırıldığında, politikada tanımlanandan daha zayıf olan şifre türleri devre dışı bırakılır. Örneğin, "Sayısal" şifre kalitesi yapılandırılırsa kullanıcı yalnızca PIN (sayısal) veya Şifre (alfasayısal) şifreyi seçebilir.

Cihaz, uygun bir ekran kilidi şifresi ayarlanarak gerektiği gibi güvenli hale getirildikten sonra, uygulama güvenli içeriğe erişim izni verir.

Kotlin

when {
    !dpm.isAdminActive(policyAdmin) -> {
        // Activates device administrator.
        ...
    }
    !dpm.isActivePasswordSufficient -> {
        // Launches password set-up screen in Settings.
        ...
    }
    else -> {
        // Grants access to secure content.
        ...
        startActivity(Intent(context, SecureActivity::class.java))
    }
}

Java

if (!dpm.isAdminActive(..)) {
    // Activates device administrator.
    ...
} else if (!dpm.isActivePasswordSufficient()) {
    // Launches password set-up screen in Settings.
    ...
} else {
    // Grants access to secure content.
    ...
    startActivity(new Intent(context, SecureActivity.class));
}