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.