เอกสารนี้จะอธิบายวิธีที่นักพัฒนาแอปสามารถใช้ ฟีเจอร์ความปลอดภัยที่ Android มีให้เพื่อกำหนดสิทธิ์ของตนเอง โดย การกำหนดสิทธิ์ที่กำหนดเอง ทำให้แอปสามารถแชร์ทรัพยากรและความสามารถของแอป กับแอปอื่นๆ ดูข้อมูลเพิ่มเติมเกี่ยวกับสิทธิ์ได้ที่ภาพรวมสิทธิ์
ฉากหลัง
Android คือระบบปฏิบัติการที่แบ่งแยกสิทธิ์ ซึ่งแต่ละระบบปฏิบัติการ แอปทำงานด้วยข้อมูลประจำตัวของระบบที่ชัดเจน (รหัสผู้ใช้และกลุ่ม Linux) รหัส) นอกจากนี้ ระบบยังแยกส่วนต่างๆ ออกเป็นอัตลักษณ์ที่แตกต่างกันด้วย Linux จึงแยกแอปออกจากกันเองและแยกจากระบบ
แอปสามารถแสดงฟังก์ชันของตนแก่แอปอื่นๆ ได้ด้วยการกำหนดสิทธิ์ ที่แอปอื่นๆ สามารถร้องขอได้ และยังสามารถกำหนดสิทธิ์ที่ จะพร้อมใช้งานโดยอัตโนมัติสำหรับแอปอื่นๆ ที่รับรองโดยโปรแกรม ใบรับรองเดียวกัน
การลงนามแอป
APK ทั้งหมดต้องลงนามด้วยใบรับรอง ซึ่งนักพัฒนาซอฟต์แวร์เป็นเจ้าของคีย์ส่วนตัว ใบรับรองไม่จำเป็นต้องได้รับการลงนามโดยผู้ออกใบรับรอง แอป Android ใช้ใบรับรองที่ลงนามด้วยตนเองได้ ซึ่งถือเป็นเรื่องปกติ วัตถุประสงค์ของใบรับรองใน Android คือเพื่อแยกความแตกต่างของผู้เขียนแอป ซึ่งช่วยให้ ระบบให้สิทธิ์หรือปฏิเสธการเข้าถึงระดับลายเซ็นของแอป สิทธิ์แล้วให้หรือปฏิเสธคำขอให้อนุญาตของแอป ข้อมูลประจำตัว Linux เดิมกับอีกแอปหนึ่ง
ให้สิทธิ์ลายเซ็นหลังจากเวลาผลิตอุปกรณ์
ตั้งแต่ Android 12 (API ระดับ 31) เป็นต้นไป แอตทริบิวต์ knownCerts
สำหรับสิทธิ์ระดับลายเซ็นจะช่วยให้คุณอ้างอิงถึงข้อมูลสรุปของใบรับรองการรับรองที่รู้จัก ณ เวลาประกาศได้
คุณสามารถประกาศแอตทริบิวต์ knownCerts
และใช้ Flag knownSigner
ในแอตทริบิวต์ protectionLevel
ของแอปเพื่อสิทธิ์ระดับลายเซ็นที่เฉพาะเจาะจง จากนั้นระบบ
ให้สิทธิ์นั้นกับแอปที่ส่งคำขอ หากมีผู้ลงนามในแอปที่ส่งคำขอ
กลุ่มลายเซ็นผู้ลงนามปัจจุบัน รวมถึงผู้ลงนามปัจจุบัน ตรงกับไดเจสต์รายการหนึ่งที่
ซึ่งประกาศไว้โดยใช้สิทธิ์ในแอตทริบิวต์ knownCerts
Flag knownSigner
ช่วยให้อุปกรณ์และแอปสามารถให้สิทธิ์การรับรองแก่แอปอื่นๆ ได้โดยไม่ต้องรับรองแอปเมื่อผลิตและจัดส่งอุปกรณ์
รหัสผู้ใช้และการเข้าถึงไฟล์
ขณะติดตั้ง Android จะกำหนดรหัสผู้ใช้ Linux ที่ไม่ซ้ำกันให้กับแต่ละแพ็กเกจ ข้อมูลประจำตัวนั้นคงที่ตลอดช่วงเวลาตลอดอายุของแพ็กเกจ อุปกรณ์ ในอุปกรณ์เครื่องอื่น แพ็กเกจเดียวกันอาจมี UID ที่แตกต่างกัน แต่สิ่งสำคัญคือแต่ละแพ็กเกจต้องมี UID ที่ไม่ซ้ำกันในอุปกรณ์หนึ่งๆ
เนื่องจากการบังคับใช้ความปลอดภัยเกิดขึ้นที่ระดับกระบวนการ โค้ดของแพ็กเกจ 2 รายการจึงไม่สามารถทำงานในกระบวนการเดียวกันได้ เนื่องจากต้องทำงานในฐานะผู้ใช้ Linux คนละคน
ข้อมูลที่แอปจัดเก็บจะได้รับการกำหนดรหัสผู้ใช้ของแอปนั้น และโดยปกติแล้วแพ็กเกจอื่นๆ จะเข้าถึงไม่ได้
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับรูปแบบความปลอดภัยของ Android โปรดดูที่การรักษาความปลอดภัยของ Android ภาพรวม
กำหนดและบังคับใช้สิทธิ์
หากต้องการบังคับใช้สิทธิ์ของคุณเอง คุณต้องประกาศสิทธิ์เหล่านั้นใน AndroidManifest.xml
โดยใช้องค์ประกอบ
<permission>
อย่างน้อย 1 รายการก่อน
รูปแบบการตั้งชื่อ
ระบบไม่อนุญาตให้ประกาศแพ็กเกจหลายรายการ สิทธิ์ที่มีชื่อเดียวกัน เว้นแต่ว่าแพ็กเกจทั้งหมดจะมีการลงชื่อด้วย ใบรับรองเดียวกัน หากแพ็กเกจแจ้งสิทธิ์ ระบบจะไม่ อนุญาตให้ผู้ใช้ติดตั้งแพ็กเกจอื่นๆ ที่มีชื่อสิทธิ์เหมือนกัน เว้นแต่ว่า แพ็กเกจเหล่านั้นลงชื่อด้วยใบรับรองเดียวกันกับแพ็กเกจแรก
เราขอแนะนำให้ใส่คำนำหน้าสิทธิ์ด้วยชื่อแพ็กเกจของแอป โดยใช้
การตั้งชื่อแบบโดเมนแบบย้อนกลับ ตามด้วย .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