ডিভাইস ম্যানেজমেন্ট নীতির সাথে নিরাপত্তা বৃদ্ধি করা

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

অ্যান্ড্রয়েড 2.2 (এপিআই লেভেল 8) থেকে, অ্যান্ড্রয়েড প্ল্যাটফর্মটি ডিভাইস অ্যাডমিনিস্ট্রেশন API-এর মাধ্যমে সিস্টেম-স্তরের ডিভাইস পরিচালনার ক্ষমতা প্রদান করে।

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

আপনার নীতি নির্ধারণ করুন এবং ঘোষণা করুন

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

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

প্রতিটি ঘোষিত নীতি 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>

নীতি ঘোষণা XML 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 ম্যানিফেস্টে এটি নিবন্ধন করতে ভুলবেন না।

কোটলিন

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 উল্লেখ করে কেন অ্যাপ্লিকেশনটি ডিভাইস প্রশাসক হওয়ার জন্য অনুরোধ করছে তা ব্যবহারকারীদের কাছে হাইলাইট করার জন্য ব্যাখ্যামূলক পাঠ্য অন্তর্ভুক্ত করা ভাল অভ্যাস।

চিত্র 1. ব্যবহারকারীর অ্যাক্টিভেশন স্ক্রীন যেখানে আপনি আপনার ডিভাইস নীতিগুলির একটি বিবরণ প্রদান করতে পারেন৷

কোটলিন

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 স্তর 11 (হানিকম্ব) এবং তার উপরে উপলব্ধ। নিম্নলিখিত কোডটি দেখায় যে আপনি রানটাইমে সংস্করণটি কীভাবে পরীক্ষা করতে পারেন।

কোটলিন

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 স্বয়ংক্রিয়ভাবে সংশোধনমূলক ব্যবস্থা নেয় না। সেটিংস অ্যাপ্লিকেশানে সিস্টেম পাসওয়ার্ড-পরিবর্তন স্ক্রীনটি স্পষ্টভাবে চালু করা অ্যাপ্লিকেশনটির দায়িত্ব৷ যেমন:

কোটলিন

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

সাধারণত, ব্যবহারকারী উপলভ্য লক মেকানিজমের যেকোন একটি থেকে নির্বাচন করতে পারেন, যেমন None, প্যাটার্ন, PIN (সাংখ্যিক), বা পাসওয়ার্ড (আলফানিউমেরিক)। যখন একটি পাসওয়ার্ড নীতি কনফিগার করা হয়, সেইসব পাসওয়ার্ডের প্রকারগুলি যেগুলি নীতিতে সংজ্ঞায়িতগুলির চেয়ে দুর্বল সেগুলি অক্ষম করা হয়৷ উদাহরণস্বরূপ, যদি "সাংখ্যিক" পাসওয়ার্ডের গুণমানটি কনফিগার করা থাকে তবে ব্যবহারকারী শুধুমাত্র PIN (সংখ্যাসূচক) বা পাসওয়ার্ড (আলফানিউমেরিক) পাসওয়ার্ড নির্বাচন করতে পারেন।

একবার একটি সঠিক স্ক্রিন-লক পাসওয়ার্ড সেট আপ করে ডিভাইসটি সঠিকভাবে সুরক্ষিত হয়ে গেলে, অ্যাপ্লিকেশনটি সুরক্ষিত সামগ্রীতে অ্যাক্সেসের অনুমতি দেয়।

কোটলিন

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