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.