Özel uygulama izni tanımlama

Bu belgede, uygulama geliştiricilerin kendi izinlerini tanımlamak için Android tarafından sağlanan güvenlik özelliklerini nasıl kullanabileceği açıklanmaktadır. 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ı makaleyi inceleyin.

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. Böylece Linux, uygulamaları birbirinden ve sistemden izole eder.

Uygulamalar, diğer uygulamaların isteyebileceği izinleri tanımlayarak işlevlerini diğer uygulamalara gösterebilir. Ayrıca, aynı sertifikayla imzalanan diğer tüm uygulamalara otomatik olarak sunulan izinler de tanımlayabilirler.

Uygulama imzalama

Tüm APK'lar, özel anahtarı geliştirici tarafından tutulan bir sertifikayla imzalanmış olmalıdır. Sertifikanın bir sertifika yetkilisi tarafından imzalanması gerekmez. 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, uygulamalara imza düzeyinde izinlere erişim izni verebilir veya vermeyi reddedebilir ve bir uygulamanın başka bir uygulamayla aynı Linux kimliğini alma isteğine izin verebilir veya vermeyi reddedebilir.

Cihazın üretim tarihinden sonra imza izinleri verme

Android 12'den (API düzeyi 31) itibaren, imza düzeyindeki izinler için knownCerts özelliği, beyan sırasında bilinen imzalama sertifikalarının özetlerine başvurmanıza olanak tanır.

Belirli bir imza düzeyinde izin için knownCerts özelliğini tanımlayabilir ve uygulamanızın protectionLevel özelliğinde knownSigner işaretini 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. Kimlik, paketin söz konusu cihazdaki ömrü boyunca sabit kalır. Aynı paketin farklı bir cihazda farklı bir UID'si olabilir. Önemli olan, her paketin belirli bir cihazda farklı bir UID'ye sahip olmasıdı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 uygulama

Kendi izinlerinizi uygulamak için öncelikle bunları bir veya daha fazla <permission> öğesi kullanarak AndroidManifest.xml içinde belirtmeniz gerekir.

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 pakette izin beyan edilirse sistem, bu paketler ilk paketle aynı sertifikayla imzalanmadığı sürece kullanıcının aynı izin adına sahip başka paketler yüklemesine de izin vermez.

İ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 öneriye uymak, ad çakışmalarını önler ve özel iznin sahibini ve amacını net bir şekilde tanımlamanıza yardımcı olur.

Ö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ği isteğe bağlıdır ve yalnızca sistemin kullanıcıya izinleri göstermesine yardımcı olmak için kullanılır. Çoğu durumda bunu standart bir sistem grubu olarak (android.Manifest.permission_group içinde listelenmiştir) ayarlarsınız. Ancak aşağıdaki bölümde açıklandığı gibi bir grubu kendiniz de tanımlayabilirsiniz. Kullanıcıya gösterilen izin kullanıcı arayüzünü basitleştirdiği için mevcut bir grup kullanmanızı öneririz.

İzin için hem etiket hem de açıklama sağlamanız 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, iznin sahibine ne yapmasına izin verdiğini açıklayan birkaç cümleden oluşur. Açıklamamızda, ilk cümlede izin açıklanır ve ikinci cümlede kullanıcıya, uygulamaya izin verilirse ne gibi sorunlarla karşılaşabileceği konusunda uyarı verilir.

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. <permission-group> öğesi, gruba ait izinleri belirtmez ancak gruba bir ad verir.

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

<permission-tree> öğesi, kodda tanımlanan bir izin grubu için bir ad alanı tanımlar.

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

  • Birbirine işlev sunan bir uygulama paketi tasarlıyorsanız uygulamaları, her izin yalnızca bir kez tanımlanacak şekilde tasarlamaya çalışın. 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 bildiren 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.