ডিভাইস ম্যানেজমেন্ট নীতির মাধ্যমে নিরাপত্তা উন্নত করা

ডিভাইস অ্যাডমিন ডেপ্রিকেশন। ডিভাইস অ্যাডমিন কিছু অ্যাডমিন নীতি চালু করলে, সেগুলি বাতিল করা হয়েছে বলে চিহ্নিত করা হয়েছে। আরও জানতে এবং মাইগ্রেশনের বিকল্প দেখতে, ডিভাইস অ্যাডমিন বন্ধ করা দেখুন।

Android 2.2 (API লেভেল ৮) থেকে, Android প্ল্যাটফর্ম ডিভাইস অ্যাডমিনিস্ট্রেশন API-এর মাধ্যমে সিস্টেম-লেভেল ডিভাইস ম্যানেজমেন্ট ক্ষমতা অফার করে।

এই পাঠে, আপনি শিখবেন কীভাবে একটি নিরাপত্তা-সচেতন অ্যাপ্লিকেশন তৈরি করতে হয় যা ডিভাইস ম্যানেজমেন্ট নীতি প্রয়োগ করে এর কন্টেন্টে অ্যাক্সেস ম্যানেজ করে। বিশেষ করে, অ্যাপ্লিকেশনটি এমনভাবে কনফিগার করা যেতে পারে যাতে ব্যবহারকারীকে বিধিনিষেধযুক্ত কন্টেন্ট দেখানোর আগে যথেষ্ট শক্তিশালী স্ক্রিন-লক পাসওয়ার্ড সেট আপ করা হয়েছে কিনা তা নিশ্চিত করা যায়।

আপনার নীতি নির্ধারণ ও ঘোষণা করা

প্রথমে, আপনাকে ফাংশনাল লেভেলে কাজ করার জন্য নীতির ধরন নির্ধারণ করতে হবে। নীতিতে স্ক্রিন-লক পাসওয়ার্ডের ক্ষমতা, মেয়াদ শেষ হওয়ার টাইমআউট, এনক্রিপশন ইত্যাদি অন্তর্ভুক্ত থাকতে পারে।

আপনাকে অবশ্যই বেছে নেওয়া নীতি সেট ঘোষণা করতে হবে, যা অ্যাপ্লিকেশন দ্বারা res/xml/device_admin.xml ফাইলে এনফোর্স করা হবে। Android ম্যানিফেস্টে ঘোষিত নীতি সেটও উল্লেখ করতে হবে।

প্রতিটি ঘোষিত নীতি DevicePolicyManager-এ কিছু সংখ্যক সম্পর্কিত ডিভাইস নীতি পদ্ধতির সাথে সামঞ্জস্যপূর্ণ (পাসওয়ার্ডের ন্যূনতম দৈর্ঘ্য এবং বড় হাতের অক্ষরের ন্যূনতম সংখ্যা নির্ধারণ করা হল দুটি উদাহরণ)। কোনও অ্যাপ্লিকেশন যদি এমন পদ্ধতি ব্যবহার করার চেষ্টা করে যার সংশ্লিষ্ট নীতি XML-এ ঘোষণা করা হয়নি, তাহলে রানটাইমে 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 ম্যানিফেস্টে রেফারেন্স দেওয়া নীতি ঘোষণা XML:

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

জাভা

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

জাভা

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-এ নতুন নীতি যোগ করা হচ্ছে। প্ল্যাটফর্মের পুরনো ভার্সন সাপোর্ট করার সময় নতুন নীতি ব্যবহার করলে, আপনার অ্যাপ্লিকেশনে ভার্সন চেক করা উপযুক্ত। যেমন, পাসওয়ার্ডে বড় হাতের অক্ষর ব্যবহারের নীতি শুধুমাত্র API লেভেল ১১ (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)
    }
}

জাভা

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

এই পর্যায়ে, অ্যাপ্লিকেশনটি নীতি এনফোর্স করতে পারবে। অ্যাপ্লিকেশনটি ব্যবহৃত প্রকৃত স্ক্রিন-লক পাসওয়ার্ড অ্যাক্সেস করতে না পারলেও, ডিভাইস নীতি ম্যানেজার API-এর মাধ্যমে এটি নির্ধারণ করতে পারে যে বিদ্যমান পাসওয়ার্ডটি প্রয়োজনীয় নীতি পূরণ করে কিনা। যদি দেখা যায় যে আগে থেকে থাকা স্ক্রিন-লক পাসওয়ার্ড যথেষ্ট নয়, তাহলে ডিভাইস অ্যাডমিনিস্ট্রেশন API অটোমেটিক সংশোধনমূলক অ্যাকশন নেয় না। সেটিংস অ্যাপে সিস্টেম পাসওয়ার্ড পরিবর্তন করার স্ক্রিন স্পষ্টভাবে লঞ্চ করার দায়িত্ব অ্যাপ্লিকেশনের। যেমন:

Kotlin

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

জাভা

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

জাভা

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