Özel uygulama izni tanımlama

Bu dokümanda, uygulama geliştiricilerinin güvenlik özelliklerini kullanarak kendi izinlerini tanımlamalarını sağlar. Uygulamalar, özel izinler tanımlayarak kaynaklarını ve özelliklerini diğer uygulamalarla paylaşabilir. İzinler hakkında daha fazla bilgi için izinlere genel bakış başlıklı makaleye bakın.

Arka plan

Android, her uygulamanın farklı bir sistem kimliğiyle (Linux kullanıcı kimliği ve grup kimliği) çalıştığı, ayrıcalıklara ayrılmış bir işletim sistemidir. Sistemin bölümleri de farklı kimliklere ayrılır. Bu sayede Linux, uygulamaları birbirinden ve sistemden ayırır.

Uygulamalar, izinler tanımlayarak işlevlerini diğer uygulamalara sunabilir izin verilenler listesine eklenir. Ayrıca, aynı sertifikayla imzalanan diğer tüm uygulamalara otomatik olarak sunulan izinler de tanımlayabilirler.

Uygulama imzalama

Tüm APK'ların sertifika ile imzalanması gerekir geliştiricisi tarafından tutulan bir kullanıcı olabilir. Sertifika, bir sertifika yetkilisi tarafından imzalanması gerekir. Android uygulamalarının kendinden imzalı sertifika kullanması izin verilen ve yaygın bir durumdur. Android'deki sertifikaların amacı, uygulama yazarlarını ayırt etmektir. Bu sayede sistem, uygulamaların imza düzeyindeki izinlere erişmesine izin verebilir veya bu erişimi reddedebilir ve bir uygulamanın başka bir uygulamayla aynı Linux kimliğini alma isteğine izin verebilir veya bu isteği reddedebilir.

Cihaz üretim zamanından sonra imza izinleri verin

Android 12'den (API düzeyi 31) itibaren knownCerts özelliği için imza düzeyinde izinler, bilinen imzalama bilgilerinin özetlerine göz atabilmenizi sağlar. beyandaki sertifikalar gerekir.

knownCerts özelliğini tanımlayıp knownSigner işaretini kullanabilirsiniz. uygulamanızın protectionLevel ilişkilendirmek kullanabilirsiniz. Ardından sistem, istek yapan uygulamanın imzalama soy ağacındaki herhangi bir imzalayan (mevcut imzalayan dahil) knownCerts özelliğinde izinle beyan edilen özetlerden biriyle eşleşirse istek yapan uygulamaya bu izni verir.

knownSigner işareti, cihazların ve uygulamaların, cihazın üretimi ve gönderimi sırasında uygulamaları imzalamak zorunda kalmadan diğer uygulamalara imza izinleri vermesini sağlar.

Kullanıcı kimlikleri ve dosya erişimi

Android, yükleme sırasında her pakete farklı bir Linux kullanıcı kimliği verir. İlgili içeriği oluşturmak için kullanılan Kimlik, paketin bu öğedeki ömrü boyunca sabit kalır. olanak tanır. Farklı bir cihazda, aynı paket farklı bir UID: Önemli olan, her paketin belirli bir olanak tanır.

Güvenlik yaptırımı işlem düzeyinde gerçekleştiği için, farklı Linux kullanıcıları olarak çalıştırılmaları gerektiğinden, iki paketin kodu normalde aynı işlemde çalışamaz.

Bir uygulama tarafından depolanan tüm veriler, ilgili uygulamanın kullanıcı kimliğine atanır ve normalde diğer paketler tarafından erişilemez.

Android'in güvenlik modeli hakkında daha fazla bilgi için Android Güvenliğine Genel Bakış başlıklı makaleyi inceleyin.

İzinleri tanımlama ve zorunlu kılma

Kendi izinlerinizi uygulamak için öncelikle bunları Bir veya daha fazla kullanarak AndroidManifest.xml <permission> öğeleri.

Adlandırma kuralı

Sistem, tüm paketler aynı sertifikayla imzalanmadığı sürece birden fazla paketin aynı ada sahip bir izin beyan etmesine izin vermez. Bir paket bir izin beyan ederse sistem de Kullanıcının aynı izin adına sahip başka paketler yüklemesine izin ver. bu paketler ilk paketle aynı sertifikayla imzalanır.

İzinlerin önüne, ters alan adı stilinde adlandırma kullanarak uygulamanın paket adını, ardından .permission. ve ardından iznin temsil ettiği özelliğin açıklamasını büyük harflerle SNAKE_CASE olarak eklemenizi öneririz. Örneğin, com.example.myapp.permission.ENGAGE_HYPERSPACE

Bu önerinin uygulanması, adlandırma çakışmalarını önler ve reklamların özel iznin sahibini ve amacını tanımlama

Örnek

Örneğin, etkinliklerinden birini hangi diğer uygulamaların başlatabileceğini kontrol etmesi gereken bir uygulama, bu işlem için aşağıdaki şekilde izin beyan edebilir:

<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 özelliği zorunludur ve sisteme, kullanıcıları iznin gerekli olduğu uygulamalar veya izni hangi uygulamaların alabileceği hakkında nasıl bilgilendireceğini söyler. Bu bilgiler bağlantılı dokümanda açıklanmaktadır.

android:permissionGroup özelliğinin isteğe bağlıdır ve yalnızca sistemin görüntüleme izinlerini vermesine yardımcı olmak için kullanılır. kullanıcıya gösterir. Çoğu durumda bunu standart bir sistem grubu olarak ayarlarsınız (android.Manifest.permission_group içinde listelenir). Ancak aşağıdaki bölümde açıklandığı gibi bir grubu kendiniz de tanımlayabilirsiniz. Mevcut bir grubu kullanmanızı öneririz, çünkü bu daha basit bir kullanıcıya gösterilen izin kullanıcı arayüzü.

Etiket için hem etiket hem de açıklama izni gerekir. Bunlar, kullanıcının izin listesini (android:label) veya tek bir izinle ilgili ayrıntıları (android:description) görüntülerken görebileceği dize kaynaklarıdır. Etiket kısadır: İznin koruduğu temel işlevsellik parçasını açıklayan birkaç kelimeden oluşur. Açıklama izin sahibinin neler yapmasına olanak tanıdığını açıklayan birkaç cümle. Bizim kuralı, ilk cümlenin açıklamaya yerleştiği iki cümlelik hem de ikinci cümle kullanıcıyı bu tür şeyler hakkında uyarır. bu durum ters gidebilecek niteliktedir.

CALL_PHONE izini için etiket ve açıklama örneği aşağıda verilmiştir:

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

İzin grubu oluşturma

Önceki bölümde gösterildiği gibi, sistemin kullanıcıya izinleri açıklamasına yardımcı olmak için android:permissionGroup özelliğini kullanabilirsiniz. Çoğu durumda bunu standart bir sistem grubu olarak (android.Manifest.permission_group içinde listelenmiştir) ayarlarsınız ancak <permission-group> ile kendi grubunuzu da tanımlayabilirsiniz.

<permission-group> öğesi, hem manifest dosyasında <permission> öğeleriyle tanımlanan hem de başka bir yerde tanımlanan bir dizi izin için bir etiket tanımlar. Bu durum yalnızca izinlerin kullanıcıya sunulurken nasıl gruplandırıldığını etkiler. İlgili içeriği oluşturmak için kullanılan <permission-group>. öğesi, gruba ait izinleri belirtmez, ancak bu gruba bir ad verir.

Grup adını <permission> öğenin permissionGroup özelliğine atayarak gruba izin ekleyebilirsiniz.

İlgili içeriği oluşturmak için kullanılan <permission-tree>. öğesi, girin.

Özel izin önerileri

<uses-permission> öğeleri tanımlayarak uygulamalarınız için özel izinler tanımlayabilir ve diğer uygulamalardan özel izinler isteyebilirsiniz. Ancak bunu yapmanın gerekli olup olmadığını dikkatlice değerlendirin.

  • İşlevselliği tek bir kullanıcıya sunan bir uygulama paketi tasarlıyorsanız bir diğerinde, uygulamaları her izin yalnızca tanımlanacak şekilde bir kez. Uygulamaların tümü aynı sertifikayla imzalanmamışsa bunu yapmanız gerekir. Uygulamaların tümü aynı sertifikayla imzalanmış olsa bile her izni yalnızca bir kez tanımlamak en iyi uygulamadır.
  • İşlev yalnızca sağlayıcı uygulamayla aynı imzayla imzalanan uygulamalar tarafından kullanılabiliyorsa imza kontrollerini kullanarak özel izinler tanımlamaktan kaçınabilirsiniz. Uygulamalarınızdan biri diğerine istek gönderdiğinde ikinci uygulama, isteğe uymadan önce her iki uygulamanın da aynı sertifikayla imzalanıp imzalanmadığını doğrulayabilir.

Özel izin gerekiyorsa yalnızca izin kontrolünü gerçekleştiren uygulamayla aynı geliştirici tarafından imzalanan uygulamaların bu izine erişmesi gerekip gerekmediğini göz önünde bulundurun (ör. aynı geliştiricinin iki uygulaması arasında güvenli işlemler arası iletişimi uygularken). Bu durumda imza izinlerini kullanmanızı öneririz. İmza izinleri kullanıcı için şeffaftır ve kullanıcı tarafından onaylanan izinlerden kaçınarak kullanıcıların kafasını karıştırabilir.

Aşağıdaki konular hakkında daha fazla bilgi edinin:

<uses-permission>
Uygulamanızın gerekli sistem izinlerini tanımlayan manifest etiketi için API referansı.

Şunlar da ilginizi çekebilir:

Android Güvenliğine Genel Bakış
Android platformunun güvenlik modeli hakkında ayrıntılı bir tartışma.