กำหนดสิทธิ์ของแอปที่กำหนดเอง

เอกสารนี้จะอธิบายวิธีที่นักพัฒนาแอปสามารถใช้ ฟีเจอร์ความปลอดภัยที่ Android มีให้เพื่อกำหนดสิทธิ์ของตนเอง โดย การกำหนดสิทธิ์ที่กำหนดเอง ทำให้แอปสามารถแชร์ทรัพยากรและความสามารถของแอป กับแอปอื่นๆ ดูข้อมูลเพิ่มเติมเกี่ยวกับสิทธิ์ได้ที่ภาพรวมสิทธิ์

ฉากหลัง

Android คือระบบปฏิบัติการที่แบ่งแยกสิทธิ์ ซึ่งแต่ละระบบปฏิบัติการ แอปทำงานด้วยข้อมูลประจำตัวของระบบที่ชัดเจน (รหัสผู้ใช้และกลุ่ม Linux) รหัส) ส่วนต่างๆ ของระบบจะถูกแบ่งออกเป็นข้อมูลประจำตัวที่แตกต่างกัน ดังนั้น Linux จึงแยกแอปออกจากกันและออกจากระบบ

แอปสามารถแสดงฟังก์ชันของตนแก่แอปอื่นๆ ได้ด้วยการกำหนดสิทธิ์ ที่แอปอื่นๆ สามารถร้องขอได้ และยังสามารถกำหนดสิทธิ์ที่ จะพร้อมใช้งานโดยอัตโนมัติสำหรับแอปอื่นๆ ที่รับรองโดยโปรแกรม ใบรับรองเดียวกัน

การลงนามแอป

APK ทั้งหมดต้องลงนามด้วยใบรับรอง ซึ่งนักพัฒนาซอฟต์แวร์เป็นเจ้าของคีย์ส่วนตัว ใบรับรองจะไม่ ต้องมีการลงชื่อโดยผู้ออกใบรับรอง อนุญาต และ ทั่วไป เพื่อให้แอป Android ใช้ใบรับรองที่ลงนามด้วยตนเองได้ วัตถุประสงค์ของ ใบรับรองใน Android คือการจำแนกผู้เขียนแอป ซึ่งช่วยให้ ระบบให้สิทธิ์หรือปฏิเสธการเข้าถึงระดับลายเซ็นของแอป สิทธิ์แล้วให้หรือปฏิเสธคำขอให้อนุญาตของแอป ข้อมูลประจำตัว Linux เดิมกับอีกแอปหนึ่ง

ให้สิทธิ์ลายเซ็นหลังจากเวลาผลิตอุปกรณ์

เริ่มตั้งแต่ Android 12 (API ระดับ 31) เป็นต้นไป knownCerts สำหรับ สิทธิ์ระดับลายเซ็นช่วยให้คุณอ้างอิงถึงเนื้อหาโดยรวมของการรับรองที่ทราบแล้ว ใบรับรองขณะประกาศ

คุณประกาศแอตทริบิวต์ knownCerts และใช้แฟล็ก knownSigner ได้ ใน protectionLevel ของแอป แอตทริบิวต์ สำหรับสิทธิ์ระดับลายเซ็นโดยเฉพาะ จากนั้นระบบ ให้สิทธิ์นั้นกับแอปที่ส่งคำขอ หากมีผู้ลงนามในแอปที่ส่งคำขอ กลุ่มลายเซ็นผู้ลงนามปัจจุบัน รวมถึงผู้ลงนามปัจจุบัน ตรงกับไดเจสต์รายการหนึ่งที่ ซึ่งประกาศไว้โดยใช้สิทธิ์ในแอตทริบิวต์ knownCerts

แฟล็ก knownSigner จะอนุญาตให้อุปกรณ์และแอปให้สิทธิ์ลายเซ็นแก่ แอปอื่นๆ โดยไม่ต้องลงนามแอป ณ เวลาที่ผลิตอุปกรณ์ และการจัดส่ง

รหัสผู้ใช้และการเข้าถึงไฟล์

ขณะติดตั้ง Android จะให้รหัสผู้ใช้ Linux ที่ไม่ซ้ำกันแต่ละแพ็กเกจ ข้อมูลประจำตัวนั้นคงที่ตลอดช่วงเวลาตลอดอายุของแพ็กเกจ อุปกรณ์ บนอุปกรณ์อื่น แพ็กเกจเดียวกันอาจมี UID—สิ่งที่สำคัญคือแต่ละแพ็กเกจมี UID ที่แตกต่างกันไป อุปกรณ์

เนื่องจากการบังคับใช้การรักษาความปลอดภัยเกิดขึ้นที่ รหัสของแพ็กเกจสองแพ็กเกจไม่สามารถ ทำงานในขั้นตอนเดียวกัน เนื่องจากจะต้องเรียกใช้ในฐานะผู้ใช้ Linux คนละคน

ระบบจะกำหนดข้อมูลทั้งหมดที่แอปจัดเก็บให้กับผู้ใช้แอป และโดยปกติแล้วจะเข้าถึงแพ็กเกจอื่นๆ ไม่ได้

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับรูปแบบความปลอดภัยของ Android โปรดดูที่การรักษาความปลอดภัยของ Android ภาพรวม

กำหนดและบังคับใช้สิทธิ์

หากต้องการบังคับใช้สิทธิ์ของคุณเอง คุณต้องประกาศสิทธิ์ดังกล่าวใน AndroidManifest.xml กำลังใช้อย่างน้อย 1 รายการ <permission>

รูปแบบการตั้งชื่อ

ระบบไม่อนุญาตให้ประกาศแพ็กเกจหลายรายการ สิทธิ์ที่มีชื่อเดียวกัน เว้นแต่ว่าแพ็กเกจทั้งหมดจะมีการลงชื่อด้วย ใบรับรองเดียวกัน หากแพ็กเกจแจ้งสิทธิ์ ระบบจะไม่ อนุญาตให้ผู้ใช้ติดตั้งแพ็กเกจอื่นๆ ที่มีชื่อสิทธิ์เหมือนกัน เว้นแต่ว่า แพ็กเกจเหล่านั้นลงชื่อด้วยใบรับรองเดียวกันกับแพ็กเกจแรก

เราขอแนะนำให้ใส่คำนำหน้าสิทธิ์ด้วยชื่อแพ็กเกจของแอป โดยใช้ การตั้งชื่อแบบโดเมนแบบย้อนกลับ ตามด้วย .permission. จากนั้นจะมีคำอธิบายความสามารถที่สิทธิ์นั้นนำเสนอ SNAKE_CASE ตัวพิมพ์ใหญ่ ตัวอย่างเช่น com.example.myapp.permission.ENGAGE_HYPERSPACE

การทำตามคำแนะนำนี้จะหลีกเลี่ยงการตั้งชื่อชนกันและช่วยให้เห็นภาพว่า ระบุเจ้าของและเจตนาของสิทธิ์ที่กำหนดเอง

ตัวอย่าง

เช่น แอปที่ต้องควบคุมว่าจะให้แอปอื่นๆ รายการใดเริ่มทำงานได้บ้าง ของกิจกรรมสามารถประกาศสิทธิ์สำหรับการดำเนินการนี้ได้ดังนี้

<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 และบอกวิธีทำให้ระบบทราบ แจ้งให้ผู้ใช้ทราบแอปที่ต้องใช้สิทธิ์หรือสิ่งที่แอปทำได้ มีสิทธิ์ดังที่อธิบายไว้ในเอกสารที่ลิงก์

android:permissionGroup เป็นแอตทริบิวต์ที่ไม่บังคับและใช้เพื่อช่วยระบบแสดงสิทธิ์เท่านั้น แก่ผู้ใช้ได้ ในกรณีส่วนใหญ่ คุณจะตั้งค่านี้เป็นระบบมาตรฐาน กลุ่ม (อยู่ในรายการ android.Manifest.permission_group) แม้ว่าคุณจะสามารถกำหนดกลุ่มด้วยตัวเอง ดังที่อธิบายไว้ในส่วนต่อไปนี้ เราขอแนะนำให้ใช้กลุ่มที่มีอยู่ เนื่องจากจะช่วยลดความซับซ้อนของ UI สิทธิ์ที่แสดงต่อผู้ใช้

คุณต้องระบุทั้งป้ายกำกับและคำอธิบายสำหรับ สิทธิ์ นี่คือทรัพยากรสตริงที่ผู้ใช้จะเห็นเมื่อ ผู้ใช้กำลังดูรายการสิทธิ์ (android:label) หรือรายละเอียดเกี่ยวกับสิทธิ์เดียว (android:description) ป้ายกำกับนี้สั้นมาก ซึ่งหมายถึงคำ 2-3 คำที่อธิบายส่วนสำคัญของ ที่สิทธิ์ปกป้องอยู่ คำอธิบายคือ ประโยค 2 ประโยคที่อธิบายว่าการอนุญาตช่วยให้ผู้ถือสิทธิ์ทำอะไรได้บ้าง แบบแผนคือคำอธิบาย 2 ประโยคที่ประโยคแรกอธิบาย สิทธิ์และประโยคที่ 2 เตือนผู้ใช้เกี่ยวกับประเภทของสิ่งต่างๆ ซึ่งอาจทำงานผิดพลาดหากแอปได้รับสิทธิ์ดังกล่าว

ลองดูตัวอย่างป้ายกำกับและคำอธิบายสำหรับ CALL_PHONE สิทธิ์:

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

สร้างกลุ่มสิทธิ์

ตามที่แสดงในส่วนก่อนหน้านี้ คุณสามารถใช้ android:permissionGroup เพื่อช่วยระบบอธิบาย สิทธิ์ของผู้ใช้ ในกรณีส่วนใหญ่ คุณควรตั้งค่านี้เป็นมาตรฐาน กลุ่มระบบ (อยู่ในรายการ android.Manifest.permission_group) แต่คุณก็สามารถกำหนดกลุ่มของคุณเองด้วย <permission-group>

องค์ประกอบ <permission-group> กำหนดป้ายกำกับสำหรับชุด สิทธิ์ทั้งที่ประกาศไว้ในไฟล์ Manifest ที่มี วันที่ <permission> และองค์ประกอบที่ประกาศไว้ในส่วนอื่น การเปลี่ยนแปลงนี้จะส่งผลต่อสิทธิ์ต่างๆ เท่านั้น เมื่อนำเสนอต่อผู้ใช้ <permission-group> ไม่ได้ระบุสิทธิ์ที่อยู่ในกลุ่ม แต่ ระบบจะตั้งชื่อกลุ่ม

คุณสามารถให้สิทธิ์ในกลุ่มโดยกำหนดชื่อกลุ่มให้กับ <permission> ขององค์ประกอบ วันที่ permissionGroup

<permission-tree> ประกาศเนมสเปซสำหรับกลุ่มสิทธิ์ที่กำหนดไว้ใน โค้ด

คำแนะนำสิทธิ์ที่กำหนดเอง

คุณสามารถกำหนดสิทธิ์ที่กำหนดเองสำหรับแอปและขอสิทธิ์ที่กำหนดเองได้ จากแอปอื่นๆ โดยกำหนดองค์ประกอบ <uses-permission> อย่างไรก็ตาม โปรดประเมินอย่างรอบคอบว่าจำเป็นต้องทำเช่นนั้นหรือไม่

  • หากคุณกำลังออกแบบชุดแอปที่เผยฟังก์ชันการทำงาน อีกแบบหนึ่ง ให้พยายามออกแบบแอปให้กำหนดสิทธิ์แต่ละรายการ ครั้งเดียว คุณต้องดำเนินการนี้หากแอปไม่ได้ลงนามด้วยอีเมลเดียวกันทั้งหมด ใบรับรอง แม้ว่าแอปทั้งหมดจะรับรองด้วยใบรับรองเดียวกัน แนวทางปฏิบัติแนะนำคือการกำหนดสิทธิ์แต่ละรายการเพียงครั้งเดียว
  • ในกรณีที่ฟังก์ชันมีไว้เฉพาะสำหรับแอปที่รับรองด้วย เป็นแอปที่มีให้ คุณอาจหลีกเลี่ยงการกำหนด สิทธิ์โดยใช้การตรวจสอบลายเซ็น เมื่อแอปใดแอปหนึ่งของคุณส่งคำขอ ของแอปอื่นของคุณ แอปที่ 2 สามารถยืนยันได้ว่าทั้ง 2 แอปมีการรับรอง ด้วยใบรับรองเดียวกันก่อนที่จะปฏิบัติตามคำขอ

หากจำเป็นต้องใช้สิทธิ์ที่กำหนดเอง ให้พิจารณาว่ามีเพียงแอปพลิเคชันที่ลงชื่อเท่านั้น โดยนักพัฒนาซอฟต์แวร์เดียวกับที่แอปพลิเคชันตรวจสอบสิทธิ์ เข้าถึงข้อมูล เช่น เมื่อใช้การสื่อสารระหว่างโปรเซสเซอร์ที่ปลอดภัย ระหว่าง 2 แอปพลิเคชันจากนักพัฒนาซอฟต์แวร์คนเดียวกัน หากใช่ เราขอแนะนำให้ใช้ สิทธิ์ลายเซ็น ผู้ใช้จะต้องเห็นสิทธิ์ในลายเซ็นและหลีกเลี่ยงการยืนยันโดยผู้ใช้ ซึ่งอาจทำให้ผู้ใช้สับสนได้

อ่านต่อเกี่ยวกับ:

<uses-permission>
การอ้างอิง API สำหรับแท็กไฟล์ Manifest ที่ประกาศสิทธิ์ของระบบที่จำเป็นของแอป

คุณอาจสนใจ:

ภาพรวมด้านความปลอดภัยของ Android
การพูดคุยอย่างละเอียดเกี่ยวกับรูปแบบความปลอดภัยของแพลตฟอร์ม Android