یک مجوز برنامه سفارشی تعریف کنید

این سند توضیح می دهد که چگونه توسعه دهندگان برنامه می توانند از ویژگی های امنیتی ارائه شده توسط Android برای تعریف مجوزهای خود استفاده کنند. با تعریف مجوزهای سفارشی، یک برنامه می تواند منابع و قابلیت های خود را با سایر برنامه ها به اشتراک بگذارد. برای اطلاعات بیشتر درباره مجوزها، به نمای کلی مجوزها مراجعه کنید.

پس زمینه

اندروید یک سیستم عامل مجزا با امتیازات است که در آن هر برنامه با هویت سیستمی مجزا (شناسه کاربر لینوکس و شناسه گروه) اجرا می شود. بخش‌هایی از سیستم نیز به هویت‌های متمایز جدا می‌شوند. بنابراین لینوکس برنامه ها را از یکدیگر و از سیستم جدا می کند.

برنامه ها می توانند با تعریف مجوزهایی که سایر برنامه ها می توانند درخواست کنند، عملکرد خود را در معرض دید سایر برنامه ها قرار دهند. آنها همچنین می توانند مجوزهایی را تعریف کنند که به طور خودکار برای هر برنامه دیگری که با همان گواهی امضا شده است در دسترس قرار می گیرد.

امضای برنامه

همه فایل‌های APK باید با گواهی امضا شوند که کلید خصوصی آن در اختیار توسعه‌دهنده‌شان است. گواهی نیازی به امضای یک مرجع گواهی ندارد . برای برنامه‌های اندرویدی مجاز و معمولی است که از گواهی‌های خود امضا شده استفاده کنند. هدف از گواهینامه ها در اندروید تشخیص نویسندگان برنامه است. این به سیستم اجازه می دهد یا از دسترسی برنامه ها به مجوزهای سطح امضا جلوگیری می کند و درخواست برنامه را برای دادن هویت لینوکس مشابه با برنامه دیگر اعطا یا رد می کند.

پس از زمان ساخت دستگاه، مجوز امضا را اعطا کنید

با شروع در Android 12 (سطح API 31)، مشخصه knownCerts برای مجوزهای سطح امضا به شما امکان می‌دهد به خلاصه گواهی‌های امضای شناخته شده در زمان اعلام مراجعه کنید.

می‌توانید مشخصه knownCerts را اعلام کنید و از پرچم knownSigner در ویژگی protectionLevel برنامه خود برای یک مجوز در سطح امضای خاص استفاده کنید. سپس، اگر هر امضاکننده‌ای در خط امضای برنامه درخواست‌کننده، از جمله امضاکننده فعلی، با یکی از خلاصه‌هایی که با مجوز مشخصه knownCerts اعلام شده است، مطابقت داشته باشد، سیستم این مجوز را به برنامه درخواست‌کننده می‌دهد.

پرچم knownSigner به دستگاه‌ها و برنامه‌ها اجازه می‌دهد بدون نیاز به امضای برنامه‌ها در زمان ساخت و ارسال دستگاه، مجوز امضا را به برنامه‌های دیگر اعطا کنند.

شناسه های کاربر و دسترسی به فایل

در زمان نصب، اندروید به هر بسته یک شناسه کاربر لینوکس مجزا می دهد. هویت در طول عمر بسته در آن دستگاه ثابت می ماند. در یک دستگاه دیگر، همان بسته ممکن است یک UID متفاوت داشته باشد - آنچه مهم است این است که هر بسته دارای یک UID مجزا در یک دستگاه خاص باشد.

از آنجایی که اجرای امنیت در سطح فرآیند اتفاق می افتد، کد هر دو بسته به طور معمول نمی تواند در یک فرآیند اجرا شود، زیرا آنها باید به عنوان کاربران مختلف لینوکس اجرا شوند.

هر گونه داده ذخیره شده توسط یک برنامه به شناسه کاربری آن برنامه اختصاص می یابد و به طور معمول برای بسته های دیگر قابل دسترسی نیست.

برای اطلاعات بیشتر در مورد مدل امنیتی Android، به نمای کلی امنیت Android مراجعه کنید.

تعریف و اجرای مجوزها

برای اعمال مجوزهای خود، ابتدا باید آنها را با استفاده از یک یا چند عنصر <permission> در AndroidManifest.xml خود اعلام کنید.

قرارداد نامگذاری

سیستم به چندین بسته اجازه نمی‌دهد تا مجوزی با همان نام را اعلام کند، مگر اینکه همه بسته‌ها با یک گواهی امضا شده باشند. اگر بسته ای مجوز را اعلام کند، سیستم همچنین به کاربر اجازه نمی دهد بسته های دیگری را با همان نام مجوز نصب کند، مگر اینکه آن بسته ها با همان گواهی نامه بسته اول امضا شده باشند.

توصیه می‌کنیم مجوزها را با نام بسته برنامه، با استفاده از نام‌گذاری به سبک دامنه معکوس، و به دنبال آن .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>
مرجع API برای تگ مانیفست که مجوزهای سیستم مورد نیاز برنامه شما را اعلام می کند.

شما همچنین ممکن است علاقه مند باشید:

مروری بر امنیت اندروید
بحث مفصل در مورد مدل امنیتی پلتفرم اندروید.