Ö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. Bir uygulama, özel izinler tanımlayarak kaynaklarını ve özelliklerini diğer uygulamalarla paylaşabilir. İzinler hakkında daha fazla bilgi için izinlere genel bakış bölümünü inceleyin.

Arka plan

Android, her uygulamanın ayrı bir sistem kimliğiyle (Linux kullanıcı kimliği ve grup kimliği) çalıştığı, ayrıcalıkların ayrıldığı bir işletim sistemidir. Sistemin parçaları da farklı kimliklere ayrılmıştır. Linux, uygulamaları birbirinden ve sistemden izole eder.

Uygulamalar, diğer uygulamaların isteyebileceği izinleri tanımlayarak işlevlerini diğer uygulamalara sunabilir. Ayrıca, aynı sertifikayla imzalanmış diğer uygulamalara otomatik olarak sunulan izinleri de tanımlayabilirler.

Uygulama imzalama

Tüm APK'lar, özel anahtarı geliştirici tarafından tutulan bir sertifikayla imzalanmalıdır. Sertifikanın bir sertifika yetkilisi tarafından imzalanması gerekmez. Android uygulamalarının kendinden imzalı sertifikalar kullanmasına izin verilir ve bu yaygın bir uygulamadır. Android'de sertifikaların amacı, uygulama yazarlarını ayırt etmektir. Bu sayede sistem, uygulamalara imza düzeyinde izinlere erişim izni verebilir veya erişimi reddedebilir ve bir uygulamanın başka bir uygulamayla aynı Linux kimliğine sahip olma isteğini kabul edebilir veya reddedebilir.

Cihaz üretim zamanından 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 uygulamanızın protectionLevel özelliğinde knownCerts özelliğini tanımlayabilir ve knownSigner işaretini kullanabilirsiniz. Ardından sistem, istekte bulunan uygulamanın imzalama kökenindeki herhangi bir imzalayan (mevcut imzalayan dahil), knownCerts özelliğindeki izinle beyan edilen özetlerden biriyle eşleşirse istekte bulunan uygulamaya bu izni verir.

knownSigner işareti, cihazların ve uygulamaların, cihaz üretimi ve sevkiyatı 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 ayrı bir Linux kullanıcı kimliği verir. Kimlik, paketin o cihazdaki kullanım ö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ğinden, iki paketin kodu normalde aynı işlemde çalıştırılamaz. Çünkü bu kodların farklı Linux kullanıcıları olarak çalıştırılması gerekir.

Bir uygulama tarafından depolanan tüm verilere o uygulamanın kullanıcı kimliği atanır ve bu verilere 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 zorunlu kılmak için öncelikle bir veya daha fazla <permission> öğesi kullanarak bunları AndroidManifest.xml dosyanızda beyan etmeniz 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 paket bir izin beyan ederse sistem, kullanıcının aynı izin adına sahip diğer paketleri yüklemesine de izin vermez. Ancak bu paketler ilk paketle aynı sertifikayla imzalanmışsa yüklemeye izin verilir.

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

Bu öneriyi uygulamak, adlandırma çakışmalarını önler ve özel bir iznin sahibini ve amacını net bir şekilde belirlemeye yardımcı olur.

Örnek

Örneğin, etkinliklerinden birini hangi uygulamaların başlatabileceğini kontrol etmesi gereken bir uygulama, bu işlem için aşağıdaki gibi bir 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, izni gerektiren uygulamaların kullanıcılarını nasıl bilgilendireceğini veya hangi uygulamaların izne sahip olabileceğini bildirir. Bu konu, bağlantılı dokümanlarda açıklanmıştı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 grubuna (android.Manifest.permission_group içinde listelenir) 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 grubu 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 iznin ayrıntılarını (android:description) görüntülerken görebileceği dize kaynaklarıdır. Etiket kısadır: İznin koruduğu temel işlevi açıklayan birkaç kelimeden oluşur. Açıklama, izin sahibinin neler yapabileceğini açıklayan birkaç cümleden oluşur. Bizim kuralımız, ilk cümlenin izni açıkladığı ve ikinci cümlenin, bir uygulamaya izin verildiğinde nelerin yanlış gidebileceği konusunda kullanıcıyı uyardığı iki cümlelik bir açıklamadır.

CALL_PHONE izni için etiket ve açıklama örneği:

<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 izinleri kullanıcıya açıklamasını sağlamak için android:permissionGroup özelliğini kullanabilirsiniz. Çoğu durumda bunu standart bir sistem grubuna (android.Manifest.permission_group içinde listelenir) 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 yerlerde tanımlanan bir izin grubu için etiket tanımlar. Bu, yalnızca izinlerin kullanıcıya sunulurken nasıl gruplandırılacağını etkiler. <permission-group> öğesi, gruba ait izinleri belirtmez ancak gruba bir ad verir.

<permission> öğesinin permissionGroup özelliğine grup adını atayarak bir izni gruba yerleştirebilirsiniz.

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

Özel izin önerileri

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

  • Birbirine işlevsellik 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ğlayan uygulamayla aynı uygulama imzasına sahip uygulamalarda kullanılabiliyorsa imza kontrollerini kullanarak özel izinler tanımlamaktan kaçınabilirsiniz. Uygulamalarınızdan biri başka bir uygulamanızdan istekte bulunduğunda, ikinci uygulama isteği yerine getirmeden önce her iki uygulamanın da aynı sertifikayla imzalandığını doğrulayabilir.

Özel bir izin gerekliyse yalnızca izin kontrolünü gerçekleştiren uygulamayla aynı geliştirici tarafından imzalanmış uygulamaların erişmesi gerekip gerekmediğini düşünün. Örneğin, aynı geliştiriciye ait iki uygulama arasında güvenli işlemler arası iletişim uygularken bu durum geçerlidir. Bu durumda imza izinlerini kullanmanızı öneririz. İmza izinleri kullanıcıya şeffaf bir şekilde sunulur ve kullanıcıların kafasını karıştırabilecek kullanıcı onaylı izinlerden kaçınılır.

Şu konu hakkında okumaya devam edin:

<uses-permission>
Uygulamanızın gerekli sistem izinlerini beyan eden 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 açıklama.