این سند شرح میدهد که توسعهدهندگان برنامه چگونه میتوانند از ویژگیهای امنیتی ارائهشده توسط Android برای تعریف اجازههای خودشان استفاده کنند. با تعریف اجازههای سفارشی، برنامه میتواند منابع و قابلیتهایش را با برنامههای دیگر همرسانی کند. برای اطلاعات بیشتر درباره اجازهها، به نمای کلی اجازهها مراجعه کنید.
پسزمینه
Android سیستمعاملی با امتیازهای جداگانه است که در آن هر برنامه با هویت سیستم متمایزی (شناسه کاربر Linux و شناسه گروه) اجرا میشود. بخشهایی از سیستم نیز به هویتهای متمایز تقسیم شدهاند. بنابراین Linux برنامهها را از یکدیگر و از سیستم جدا میکند.
برنامهها میتوانند با تعریف اجازههایی که برنامههای دیگر میتوانند درخواست کنند، عملکرد خود را دراختیار برنامههای دیگر قرار دهند. همچنین میتوانند اجازههایی را تعریف کنند که بهطور خودکار برای هر برنامه دیگری که با همان گواهی امضا شده است دردسترس قرار میگیرد.
امضای برنامه
همه فایلهای APK باید با گواهینامهای امضا شده باشند که کلید خصوصی آن دراختیار توسعهدهنده آنها باشد. گواهی نباید توسط مرجع صدور گواهی امضا شده باشد. استفاده از گواهیهای خودامضاشده برای برنامههای Android مجاز و معمول است. هدف از گواهیها در Android، تشخیص نویسندگان برنامه است. این کار به سیستم اجازه میدهد تا به برنامهها اجازه دسترسی به اجازههای سطح امضا را بدهد یا آن را رد کند و درخواست برنامه برای داشتن هویت Linux یکسان با برنامه دیگر را بپذیرد یا رد کند.
اعطای اجازههای امضا پساز زمان ساخت دستگاه
از Android نسخه ۱۲ (سطح میانای برنامهسازی کاربردی ۳۱)، مشخصه
knownCerts برای
اجازههای سطح امضا به شما امکان میدهد در زمان اعلام، به خلاصههای گواهیهای امضای شناختهشده
ارجاع دهید.
میتوانید مشخصه knownCerts را اعلام کنید و از پرچم knownSigner
در مشخصه protectionLevel
برنامهتان
برای اجازه سطح امضای خاصی استفاده کنید. سپس، اگر هر امضاکنندهای در تبار امضای برنامه درخواستکننده، ازجمله امضاکننده فعلی، با یکی از خلاصههایی که با اجازه در مشخصه knownCerts اعلام شده است مطابقت داشته باشد، سیستم آن اجازه را به برنامه درخواستکننده اعطا میکند.
پرچم knownSigner به دستگاهها و برنامهها اجازه میدهد اجازههای امضا را به
برنامههای دیگر اعطا کنند بدون اینکه لازم باشد برنامهها در زمان ساخت و
ارسال دستگاه امضا شوند.
شناسههای کاربر و دسترسی به فایل
هنگام نصب، Android به هر بسته یک شناسه کاربر Linux متمایز میدهد. این هویت درطول عمر بسته در آن دستگاه ثابت میماند. در دستگاهی دیگر، همان بسته ممکن است شناسه کاربری متفاوتی داشته باشد—آنچه اهمیت دارد این است که هر بسته در دستگاهی مشخص، شناسه کاربری متمایزی داشته باشد.
چون اجرای امنیت در سطح فرایند اتفاق میافتد، کد هر دو بسته معمولاً نمیتواند در یک فرایند اجرا شود، زیرا باید بهعنوان کاربران Linux متفاوت اجرا شوند.
هر دادهای که توسط برنامهای ذخیره میشود به شناسه کاربر آن برنامه اختصاص داده میشود و معمولاً برای بستههای دیگر قابلدسترسی نیست.
برای اطلاعات بیشتر درباره مدل امنیتی Android، به نمای کلی امنیت Android مراجعه کنید.
تعریف و اعمال اجازهها
برای اعمال اجازههای خودتان، ابتدا باید آنها را در
AndroidManifest.xml بااستفاده از یک یا چند عنصر
<permission> اعلام کنید.
قرارداد نامگذاری
سیستم به چندین بسته اجازه نمیدهد اجازهای با نام یکسان را اعلام کنند، مگراینکه همه بستهها با گواهینامه یکسانی امضا شده باشند. اگر بستهای اجازهای را اعلام کند، سیستم همچنین به کاربر اجازه نمیدهد بستههای دیگری را با همان نام اجازه نصب کند، مگراینکه آن بستهها با همان گواهینامه بسته اول امضا شده باشند.
توصیه میکنیم پیشوند اجازهها را با نام بسته برنامه، بااستفاده از نامگذاری سبک دامنه معکوس، و بهدنبال آن .permission. و سپس شرح قابلیتی که اجازه نشان میدهد، در SNAKE_CASE بزرگ قرار دهید. برای مثال،
com.example.myapp.permission.ENGAGE_HYPERSPACE.
دنبال کردن این توصیه از تداخل نامگذاری جلوگیری میکند و به شناسایی واضح مالک و هدف اجازه سفارشی کمک میکند.
مثال
برای مثال، برنامهای که باید کنترل کند کدام برنامههای دیگر میتوانند یکی از فعالیتهای آن را شروع کنند، میتواند اجازهای را برای این عملیات بهصورت زیر اعلام کند:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myapp" > <permission android:name="com.example.myapp.permission.DEADLY_ACTIVITY" android:label="@string/permlab_deadlyActivity" android:description="@string/permdesc_deadlyActivity" android:permissionGroup="android.permission-group.COST_MONEY" android:protectionLevel="dangerous" /> ... </manifest>
مشخصه
protectionLevel الزامی است و به سیستم میگوید چگونه به کاربران برنامههایی که به این اجازه نیاز دارند اطلاع دهد یا چه برنامههایی میتوانند این اجازه را داشته باشند، همانطور که در سند پیوندشده توضیح داده شده است.
مشخصه android:permissionGroup اختیاری است و فقط برای کمک به سیستم در نمایش اجازهها به کاربر استفاده میشود. در بیشتر موارد، این مورد را روی گروه سیستم استاندارد تنظیم میکنید (در android.Manifest.permission_group فهرست شده است)،
هرچند میتوانید خودتان گروهی را تعریف کنید، همانطور که در بخش زیر توضیح داده شده است.
توصیه میکنیم از گروه موجود استفاده کنید، زیرا این کار واسط کاربر اجازه نشاندادهشده به کاربر را ساده میکند.
باید هم برچسب و هم شرح برای اجازه ارائه دهید. اینها منابع رشتهای هستند که کاربر میتواند هنگام مشاهده فهرست اجازهها (android:label) یا جزئیات یک اجازه (android:description) ببیند. برچسب کوتاه است: چند کلمه که بخش کلیدی عملکردی را که اجازه از آن محافظت میکند توصیف میکند. توضیحات شامل چند جمله است که توضیح میدهد این اجازه به دارنده آن اجازه میدهد چه کاری انجام دهد. طبق قرارداد ما، توضیحات شامل دو جمله است که جمله اول اجازه را توصیف میکند و جمله دوم به کاربر درباره انواع مشکلاتی که ممکن است درصورت اعطای اجازه به برنامه رخ دهد هشدار میدهد.
در اینجا نمونهای از برچسب و شرح برای
اجازه CALL_PHONE
آورده شده است:
<string name="permlab_callPhone">directly call phone numbers</string> <string name="permdesc_callPhone">Allows the app to call non-emergency phone numbers without your intervention. Malicious apps may cause unexpected calls on your phone bill.</string>
ایجاد گروه اجازه
همانطور که در بخش قبلی نشان داده شد، میتوانید از مشخصه
android:permissionGroup استفاده کنید تا به سیستم کمک کنید
اجازهها را برای کاربر شرح دهد. در بیشتر موارد، این مورد را روی گروه سیستم استاندارد (فهرستشده در
android.Manifest.permission_group)
تنظیم میکنید، اما میتوانید گروه خودتان را نیز با
<permission-group>
تعریف کنید.
عنصر <permission-group> برچسبی را برای مجموعهای از اجازهها تعریف میکند—هم اجازههایی که در مانیفست با عناصر <permission> تعریف شدهاند و هم اجازههایی که در جاهای دیگر تعریف شدهاند. این موضوع فقط بر نحوه گروهبندی اجازهها هنگام ارائه به کاربر تأثیر میگذارد. عنصر
<permission-group>
اجازههای متعلق به گروه را مشخص نمیکند، اما
نامی به گروه میدهد.
با اختصاص دادن نام گروه به مشخصه
permissionGroup
عنصر
<permission>
میتوانید اجازهای را در گروه قرار دهید.
عنصر
<permission-tree>
فضای نامی را برای گروهی از اجازهها که در کد تعریف شدهاند
اعلام میکند.
توصیههای اجازه سفارشی
میتوانید اجازههای سفارشی برای برنامههایتان تعریف کنید و با تعریف کردن عناصر <uses-permission>،
اجازههای سفارشی از برنامههای دیگر درخواست کنید.
اما بهدقت ارزیابی کنید که آیا انجام این کار ضروری است یا نه.
- اگر درحال طراحی مجموعهای از برنامهها هستید که عملکرد را برای یکدیگر آشکار میکنند، سعی کنید برنامهها را بهگونهای طراحی کنید که هر اجازه فقط یکبار تعریف شود. اگر همه برنامهها با گواهینامه یکسانی امضا نشده باشند، باید این کار را انجام دهید. حتی اگر همه برنامهها با گواهی یکسانی امضا شده باشند، بهترین روش این است که هر اجازه را فقط یکبار تعریف کنید.
- اگر این عملکرد فقط برای برنامههایی دردسترس است که با همان امضای برنامه ارائهدهنده امضا شدهاند، ممکن است بتوانید بااستفاده از بررسیهای امضا، از تعریف اجازههای سفارشی اجتناب کنید. وقتی یکی از برنامههایتان از برنامه دیگرتان درخواستی میکند، برنامه دوم میتواند قبلاز پذیرفتن درخواست، درستیسنجی کند که هر دو برنامه با گواهی یکسانی امضا شده باشند.
اگر اجازه سفارشی لازم است، بررسی کنید که آیا فقط برنامههایی که توسط همان توسعهدهنده برنامه انجامدهنده بررسی اجازه امضا شدهاند باید به آن دسترسی داشته باشند یا نه (مثلاً هنگام پیادهسازی ارتباطات میانپردازشی ایمن بین دو برنامه از یک توسعهدهنده). اگر اینطور است، توصیه میکنیم از اجازههای امضا استفاده کنید. اجازههای امضا برای کاربر شفاف است و از اجازههای تأییدشده توسط کاربر که میتواند برای کاربران گیجکننده باشد اجتناب میکند.
ادامه خواندن درباره:
<uses-permission>- مرجع میانای برنامهسازی کاربردی برای برچسب مانیفست که اجازههای سیستم موردنیاز برنامهتان را اعلام میکند.
ممکن است به این موارد نیز علاقهمند باشید:
- نمای کلی امنیت Android
- بحثی مفصل درباره مدل امنیتی پلاتفرم Android.