डिवाइस मैनेजमेंट की नीतियों के साथ सुरक्षा को बेहतर बनाना

डिवाइस एडमिन का बंद होना. कुछ एडमिन नीतियों को लागू करने पर, उन्हें 'अब काम नहीं करता' के तौर पर मार्क किया गया है डिवाइस एडमिन के ज़रिए. इस बारे में ज़्यादा जानने और माइग्रेशन के विकल्प देखने के लिए, यह देखें डिवाइस एडमिन की सुविधा बंद होना.

Android 2.2 (एपीआई लेवल 8) के बाद से, Android प्लैटफ़ॉर्म में सिस्टम-लेवल डिवाइस मैनेजमेंट की सुविधा उपलब्ध है को ऐक्सेस करने की सुविधा मिलती है.

इस लेसन में, सुरक्षा की जानकारी देने वाला ऐसा ऐप्लिकेशन बनाने का तरीका बताया गया है जो कॉन्टेंट बनाने के लिए, डिवाइस मैनेजमेंट की नीतियों को लागू करना. खास तौर पर, ऐप्लिकेशन को कॉन्फ़िगर किया जा सकता है ऐसी सुविधा जिससे यह पक्का किया जा सके कि डिसप्ले से पहले ज़रूरत के हिसाब से स्क्रीन लॉक पासवर्ड सेट अप किया गया है उपयोगकर्ता के लिए प्रतिबंधित सामग्री होती है.

अपनी नीति तय करना और उसका एलान करना

सबसे पहले, आपको यह बताना होगा कि सुविधाएं अलग-अलग तरह की हैं या नहीं. नीतियां कवर स्क्रीन-लॉक पासवर्ड की मज़बूती, खत्म होने का समय, एन्क्रिप्शन वगैरह.

आपको चुने गए नीति सेट की घोषणा करनी होगी, जिसे ऐप्लिकेशन द्वारा लागू किया जाएगा, इसमें res/xml/device_admin.xml फ़ाइल. Android मेनिफ़ेस्ट को नीति सेट का एलान किया गया है.

एलान की गई हर नीति, DevicePolicyManager में डिवाइस नीति से जुड़ी कुछ तरीकों की संख्या से मेल खाती है. इसमें, पासवर्ड की कम से कम लंबाई और उदाहरण के लिए, अपरकेस वाले वर्ण. अगर कोई ऐप्लिकेशन उन तरीकों को शुरू करने की कोशिश करता है जिनके लिए एक्सएमएल में संबंधित नीति का एलान नहीं किया गया है, तो रनटाइम के दौरान यह SecurityException बन जाएगा. अन्य अनुमतियां, अगर ऐप्लिकेशन को मैनेज करना है, तो उपलब्ध होगी, जैसे कि force-lock नीति लागू होती है. जैसा कि आपको बाद में दिखेगा, डिवाइस एडमिन को चालू करने की प्रोसेस के हिस्से के तौर पर, एलान की गई नीतियों की सूची, उपयोगकर्ता को सिस्टम स्क्रीन पर दिखेगी.

नीचे दिया गया स्निपेट, res/xml/device_admin.xml में पासवर्ड सीमा की नीति के बारे में बताता है:

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

नीति के पालन से जुड़े एलान का एक्सएमएल, Android मेनिफ़ेस्ट में बताया गया है:

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

एक डिवाइस व्यवस्थापक रिसीवर बनाएं

ऐसा डिवाइस एडमिन ब्रॉडकास्ट रिसीवर बनाएं जिसे आपने जिन नीतियों का इस्तेमाल करने का एलान किया है उनसे जुड़े इवेंट की सूचना मिले. कोई ऐप्लिकेशन चुनिंदा तरीके से कॉलबैक के तरीकों को ओवरराइड कर सकता है.

नमूना ऐप्लिकेशन में, डिवाइस एडमिन, जब डिवाइस एडमिन को उपयोगकर्ता के लिए, कॉन्फ़िगर की गई नीति शेयर की गई प्राथमिकता से मिटा दी जाती है. आपको अपने विज्ञापनों को लागू करने के बारे में जो आपके कारोबार के उदाहरण के हिसाब से काम के हों. उदाहरण के लिए, यह ऐप्लिकेशन सुरक्षा के जोखिमों को कम करने के लिए, डिवाइस, रिमोट तरीके से सिंक करना बंद करना, एडमिन को सूचना देना वगैरह.

ब्रॉडकास्ट रिसीवर काम करे, इसके लिए उसे Android मेनिफ़ेस्ट में रजिस्टर करना न भूलें, जैसा कि ऊपर दिए गए स्निपेट में दिखाया गया है.

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

डिवाइस एडमिन को चालू करें

कोई भी नीति लागू करने से पहले, उपयोगकर्ता को ऐप्लिकेशन को मैन्युअल रूप से डिवाइस के तौर पर चालू करना होगा एडमिन. नीचे दिया गया स्निपेट उस सेटिंग गतिविधि को ट्रिगर करने का तरीका बताता है, जिसमें उपयोगकर्ता आपके ऐप्लिकेशन को चालू कर सकता है. हाइलाइट करने के लिए व्याख्यात्मक टेक्स्ट को शामिल करना एक अच्छा तरीका है उपयोगकर्ताओं को यह निर्दिष्ट करके कि ऐप्लिकेशन एक डिवाइस व्यवस्थापक होने का अनुरोध क्यों कर रहा है इंटेंट में EXTRA_ADD_EXPLANATION ज़्यादा.

पहला डायग्राम. उपयोगकर्ता ऐक्टिवेशन स्क्रीन, जिसमें यह काम किया जा सकता है आप डिवाइस से जुड़ी नीतियों के बारे में जानकारी दें.

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

अगर उपयोगकर्ता "चालू करें" चुनता है, ऐप्लिकेशन, डिवाइस एडमिन बन जाता है और कॉन्फ़िगर करने और लागू करने में मदद करता है.

ऐप्लिकेशन को ऐसी सेट बैक स्थितियों को मैनेज करने के लिए भी तैयार रहना होगा, जब उपयोगकर्ता उसे छोड़ देता है रद्द करें बटन, वापस जाएं बटन या होम बटन दबाकर ऐक्टिवेशन प्रोसेस को चालू करता है. इसलिए, नीति सेट अप करने से जुड़ी गतिविधि में मौजूद onResume() में तर्क होना ज़रूरी है स्थिति का फिर से आकलन करने के लिए और उपयोगकर्ता को डिवाइस एडमिन ऐक्टिवेशन विकल्प पेश करने के लिए, अगर की ज़रूरत नहीं है.

डिवाइस नीति नियंत्रक को लागू करें

डिवाइस एडमिन के चालू होने के बाद, ऐप्लिकेशन डिवाइस को कॉन्फ़िगर करता है अनुरोध की गई नीति वाला पॉलिसी मैनेजर. ध्यान रखें कि इसमें नई नीतियां जोड़ी जा रही हैं हर रिलीज़ के साथ Android. अगर आपके ऐप्लिकेशन में वर्शन की जांच की जा रही है, तो नई नीतियों के बारे में बताएँगे. उदाहरण के लिए, कम से कम अपर केस नीति सिर्फ़ एपीआई लेवल 11 (Honeycomb) और उसके बाद वाले वर्शन के लिए उपलब्ध है. यह कोड से पता चलता है कि रनटाइम के दौरान, वर्शन की जांच कैसे की जा सकती है.

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

इस समय, ऐप्लिकेशन इस नीति को लागू कर सकता है. ऐप्लिकेशन के पास ऐक्सेस न होने पर का उपयोग करता है, जो Device Policy Manager API के ज़रिए होता है, जो यह तय कर सकता है कि मौजूदा पासवर्ड ज़रूरी नीति के मुताबिक है या नहीं. अगर यह पता चलता है कि मौजूदा स्क्रीन-लॉक पासवर्ड काफ़ी नहीं है, डिवाइस एडमिन एपीआई अपने-आप सुधारात्मक कार्रवाई. सिस्टम को साफ़ तौर पर लॉन्च करना, ऐप्लिकेशन की ज़िम्मेदारी है सेटिंग ऐप्लिकेशन में पासवर्ड बदलने वाली स्क्रीन. जैसे:

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

आम तौर पर, उपयोगकर्ता लॉक करने के उपलब्ध तरीकों में से किसी एक को चुन सकता है. जैसे, कोई नहीं, पैटर्न, पिन (न्यूमेरिक) या पासवर्ड (अक्षर और अंक). जब कोई पासवर्ड नीति कॉन्फ़िगर की जाती है, तो वे पासवर्ड जो टाइप नीति में बताए गए टाइप से कमज़ोर हैं उन्हें बंद कर दिया जाता है. उदाहरण के लिए, अगर पासवर्ड की “संख्या वाली” क्वालिटी कॉन्फ़िगर की गई है. उपयोगकर्ता पिन (संख्या में) या पासवर्ड चुन सकता है (अक्षर और अंक) पासवर्ड.

एक बार सही स्क्रीन-लॉक पासवर्ड सेट करके डिवाइस को पूरी तरह से सुरक्षित करने के बाद, ऐप्लिकेशन सुरक्षित सामग्री को ऐक्सेस करने की अनुमति देता है.

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