專屬存取權控管 (DAC)

新增至建構作業的檔案系統物件和服務經常需要獨立項目, 專屬 ID,也就是 Android ID (AID)。目前,許多資源 檔案和服務無端使用核心 (Android 定義) AID;許多 但你可以使用原始設備製造商 (OEM) AID。

舊版 Android (Android 7.x 以下版本) 擴充 AID 使用裝置專屬 android_filesystem_config.h 的機制 檔案,指定檔案系統功能和/或自訂原始設備製造商 (OEM) AID。不過, 因為本產品不支援使用 OEM AID 的好名字 您必須指定不含 將好記名稱與數字 AID 建立關聯。

較新版本的 Android (Android 8.0 以上版本) 支援新的 擴充檔案系統功能這個新方法支援 包括:

  • 設定檔的多個來源位置 (啟用可延伸 建構設定)。
  • 檢查原始設備製造商 (OEM) AID 值的建構期間例行性檢查。
  • 產生可在來源檔案中使用的自訂原始設備製造商 (OEM) AID 標頭 。
  • 將易記名稱與實際原始設備製造商 (OEM) AID 值建立關聯。支援 使用者和群組的非數字字串引數,例如「foo」而不是 「2901」。

其他改善項目包括移除 android_ids[] 陣列來源 system/core/libcutils/include/private/android_filesystem_config.h。這個 陣列在 Bionic 中現為完全私密產生的陣列 具有 getpwnam()getgrnam() 的存取子。(這有 因為核心 AID 被修改而產生穩定二進位檔的副作用)。適用對象 和 README 檔案等詳細資訊 build/make/tools/fs_config

新增 Android ID (AID)

Android 8.0 已從 Android 中移除 android_ids[] 陣列 開放原始碼計畫 (AOSP)。所有適合 AID 使用的名稱都會從以下來源產生: system/core/libcutils/include/private/android_filesystem_config.handroid_ids[]不限 工具選取 define 相符的AID_** 則會變成小寫名稱。

例如,在 private/android_filesystem_config.h 中:

#define AID_SYSTEM 1000

變更為:

  • 簡單易懂的名稱:系統
  • uid:1000
  • Gid:1000

如要新增 Android 開放原始碼計畫核心 AID,只要將 #define android_filesystem_config.h 標頭檔案。AID 為 建構時產生的程式碼,並提供給採用使用者和群組的介面 引數。這項工具會驗證新 AID 不在應用程式或原始設備製造商 (OEM) 中 範圍;也會遵循這些範圍的變更,且會自動 在變更或新的原始設備製造商 (OEM) 保留範圍時重新設定。

設定 AID

如要啟用新的 AID 機制,請在TARGET_FS_CONFIG_GEN BoardConfig.mk 檔案。這個變數會保留設定清單 檔案,可讓您視需要附加檔案。

按照慣例,設定檔使用 config.fs 這個名稱,但 練習你說出任何名稱。config.fs 個檔案位於 Python ConfigParser ini 格式,並加入 Caps 區段 (用於設定檔案) 系統功能) 和 AID 部分 (用於設定 OEM AID)。

設定上限部分

大寫部分支援設定 檔案 系統功能對建構中的檔案系統物件 (檔案系統) 執行 本身也必須支援這項功能)。

在 Android 中以根權限執行穩定的服務會導致 Compatibility Test Suite (CTS) 先前要求在執行時仍要保留功能 也就是設定功能的程序或服務 setuid/setgid,以便執行適當的 AID。使用大寫時,你可以 可以略過這些要求,讓核心為您代勞。控制選項處於啟用狀態時 已交給 main(),你的程序已具備這項功能 您需要這樣服務才能使用非超級使用者和群組 (建議使用 以便啟動特殊權限服務)。

上限部分使用的語法如下:

章節 定義
[path] 要設定的檔案系統路徑。系統會將結尾為 / 的路徑視為 dir, 而是檔案

指定多個位置相同的版面會發生錯誤 [path] (不同檔案)。在 Python 3.2 以下版本中, 同一檔案內的區段可能會覆寫前一個部分;Python 應用程式 3.2,系統會將此模式設定為嚴格模式。
mode 八進位檔案模式 有效的八位數檔案模式 (至少要有 3 位數)。如果指定 3,則 前置字串為 0,其他模式則依原樣使用。
user AID_<使用者> C define 代表有效的 AID 或易記名稱 (例如 AID_RADIOradio 均可使用)。目的地: 定義自訂 AID,請參閱設定 AID 部分
group AID_<群組> 與使用者相同。
caps 上限* 名稱 bionic/libc/kernel/uapi/linux/capability.h 開頭的 CAP_ 除外可以混合大小寫。上限可能也是 原始:
  • 二進位 (0b0101)
  • 八進位 (0455)
  • 整數 (42)
  • 十六進位 (0xFF)
,瞭解如何調查及移除這項存取權。 請使用空格分隔多個大寫字元。

如需使用範例,請參閱使用檔案 系統功能

設定 AID 區段

AID 部分包含 OEM AID,並使用下列語法:

章節 定義
[AID_<name>] <name> 可以包含集合內的字元 大寫、數字和底線系統會使用小寫版本 好記的名稱。為了納入程式碼,系統產生的標頭檔案會使用 AID_<name>

指定多個位置相同的版面會發生錯誤 AID_<name> (在與 [path])。

<name> 的開頭必須是分區名稱,才能確保 確定不會與其他來源衝突
value <數字> 有效的 C 樣式數字字串 (十六進位、八進位、二進位和十進位)。

以相同的值選項指定多個版面會發生錯誤。

必須在對應分區的範圍內指定值選項 在 <name>中使用。有效分區的清單及其對應的 範圍是在 system/core/libcutils/include/private/android_filesystem_config.h 中定義。 可採用的選項包括:
  • 供應商分區
    • AID_OEM_RESERVED_START(2900) - AID_OEM_RESERVED_END(2999)
    • AID_OEM_RESERVED_2_START(5000) - AID_OEM_RESERVED_2_END(5999)
  • 系統分區
    • AID_SYSTEM_RESERVED_START(6000) - AID_SYSTEM_RESERVED_END(6499)
  • ODM 分區
    • AID_ODM_RESERVED_START(6500) - AID_ODM_RESERVED_END(6999)
  • 產品劃分
    • AID_PRODUCT_RESERVED_START(7000) - AID_PRODUCT_RESERVED_END(7499)
  • System_ext 分區
    • AID_SYSTEM_EXT_RESERVED_START(7500) - AID_SYSTEM_EXT_RESERVED_END(7999)

如需使用範例,請參閱「定義原始設備製造商 (OEM) AID 名稱使用原始設備製造商 (OEM) AID

使用範例

下列範例詳細說明如何定義及使用 OEM AID,以及如何 啟用檔案系統功能。原始設備製造商 (OEM) AID 名稱 ([AID_name]) 的開頭必須是 分區名稱,例如「vendor_」確保它們不會與未來衝突 AOSP 名稱或其他分區。

定義原始設備製造商 (OEM) AID 名稱

如要定義 OEM AID,請建立 config.fs 檔案, AID 值例如,在 device/x/y/config.fs 中,將 包括:

[AID_VENDOR_FOO]
value: 2900

建立檔案後,請設定 TARGET_FS_CONFIG_GEN 變數 並在 BoardConfig.mk 中指向它例如,在 device/x/y/BoardConfig.mk,請設定以下屬性:

TARGET_FS_CONFIG_GEN += device/x/y/config.fs

如此一來,系統在建立新建構作業時就能直接使用您的自訂 AID。

使用原始設備製造商 (OEM) AID

如要使用 OEM AID,請在 C 程式碼中加入 oemaids_headers Makefile,新增 #include "generated_oem_aid.h",然後開始使用宣告的內容 識別碼例如,在 my_file.c 中新增下列程式碼:

#include "generated_oem_aid.h"
…

If (ipc->uid == AID_VENDOR_FOO) {
  // Do something
...

在相關聯的 Android.bp 檔案中,新增以下內容:

header_libs: ["oemaids_headers"],

如果您使用 Android.mk 檔案,請新增下列程式碼:

LOCAL_HEADER_LIBRARIES := oemaids_headers

使用好記名稱

在 Android 9 中,您可以為 介面。例如:

  • some/init.rcchown 指令中:
    chown vendor_foo /vendor/some/vendor_foo/file
    
  • some/init.rcservice 中:
    service vendor_foo /vendor/bin/foo_service
        user vendor_foo
        group vendor_foo
    

因為從好記名稱到 uid 的內部對應是由 供應商 /vendor/etc/passwd/vendor/etc/group 必須掛接分區。

連結好記名稱

Android 9 支援將 且帶有實際 OEM AID 值的易記名稱。您可以使用非數字字串 使用者和群組的引數,也就是「vendor_foo」而不是 「2901」。

從 AID 轉換為好記名稱

適用對象 OEM AID (Android 8.x 必須使用 具有 getpwnam 和類似函式的 oem_####,如 且適合使用 getpwnam 處理查詢 (例如 init 指令碼)。Android 9: 在 Bionic 使用 getpwnamgetgrnam 好友: 將 Android ID (AID) 轉換為好記名稱,反之亦然。

使用檔案系統功能

如要啟用檔案系統功能,請在 config.fs 檔案。例如,在 device/x/y/config.fs,請新增下列區段:

[system/bin/foo_service]
mode: 0555
user: AID_VENDOR_FOO
group: AID_SYSTEM
caps: SYS_ADMIN | SYS_NICE

建立檔案後,請將 TARGET_FS_CONFIG_GEN 設為指向 該檔案位於 BoardConfig.mk 中例如,在 device/x/y/BoardConfig.mk,請設定以下屬性:

TARGET_FS_CONFIG_GEN += device/x/y/config.fs

執行時,服務 vendor_foo 會啟動 具備功能CAP_SYS_ADMINCAP_SYS_NICE 呼叫 setuidsetgid 網路。此外, vendor_foo 服務的 SELinux 政策不再適用 需要 setuidsetgid 功能,且可在 已刪除。

設定覆寫設定 (Android 6.x-7.x)

Android 6.0 已更換 fs_config 和相關結構 定義 (system/core/include/private/android_filesystem_config.h) 變更為 system/core/libcutils/fs_config.c (支援更新或 這個 Cloud Shell 中安裝的二進位檔案 /system/etc/fs_config_dirs/system/etc/fs_config_files。使用不同的比對和剖析功能 目錄和檔案規則 (可能會使用額外的 glob 運算式) 可讓 Android 處理兩個不同資料表中的目錄和檔案。 system/core/libcutils/fs_config.c 中的結構定義不正確 僅允許執行階段讀取目錄和檔案,但主機可以使用 或建構檔案系統映像檔 「${OUT}/system/etc/fs_config_dirs」和 ${OUT}/system/etc/fs_config_files

雖然擴充檔案系統的覆寫方法已被取代 Android 8.0 推出了模組設定系統,不過您仍可使用 方法。以下各節將詳細說明如何產生及納入 覆寫檔案並設定檔案系統

產生覆寫檔案

您可以產生對齊的二進位檔案 「/system/etc/fs_config_dirs」和 /system/etc/fs_config_files使用 build/tools/fs_config 中的 fs_config_generate 工具。 工具會使用 libcutils 程式庫函式 (fs_config_generate()) 用於管理緩衝區中的 DAC 需求 並且定義了 include 檔案的規則,用於機構 DAC 規則。

如要使用,請在以下位置建立納入檔案: device/vendor/device/android_filesystem_config.h 做為覆寫值檔案必須使用 structure fs_path_config 格式定義於 system/core/include/private/android_filesystem_config.h,其中包含 下列目錄和檔案符號的初始化結構如下:

  • 如果是目錄,請使用 android_device_dirs[]
  • 針對檔案,請使用 android_device_files[]

不使用 android_device_dirs[]android_device_files[],您可以定義 NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRSNO_ANDROID_FILESYSTEM_CONFIG_DEVICE_FILES (請參閱 範例)。您也可以指定覆寫值 在白板中使用 TARGET_ANDROID_FILESYSTEM_CONFIG_H 的檔案 並將強制執行的 basename android_filesystem_config.h

包含覆寫檔案

如要加入檔案,請確認 PRODUCT_PACKAGES 包含 fs_config_dirs 和/或 fs_config_files,以便 請安裝在「/system/etc/fs_config_dirs」中 /system/etc/fs_config_files。建構系統 在 中搜尋自訂 android_filesystem_config.h $(TARGET_DEVICE_DIR),其中 BoardConfig.mk 存在。 如果這個檔案位於其他地方,請設定主機板設定變數 TARGET_ANDROID_FILESYSTEM_CONFIG_H:指向該位置。

設定檔案系統

如要在 Android 6.0 以上版本設定檔案系統,請按照下列步驟操作:

  1. 建立 $(TARGET_DEVICE_DIR)/android_filesystem_config.h 檔案。
  2. fs_config_dirs 和/或 fs_config_files 加入 PRODUCT_PACKAGES (例如 $(TARGET_DEVICE_DIR)/device.mk)。

覆寫範例

這個範例顯示覆寫 system/bin/glgps Daemon 開始支援 Wake Lock device/vendor/device 目錄內。保留 注意:

  • 每個結構項目都是 mode、uid、gid、功能和名稱。 system/core/include/private/android_filesystem_config.h 是 自動提供各種資訊清單 #defines (AID_ROOTAID_SHELLCAP_BLOCK_SUSPEND)。
  • android_device_files[] 部分包含以下項目的動作: 如未指定,則禁止存取 system/etc/fs_config_dirs。 可做為額外的 DAC 防護,避免目錄缺少內容 覆寫值然而,這種防護方式較弱;如果某位使用者擁有 /system,他們通常可以執行任何動作。
diff --git a/android_filesystem_config.h b/android_filesystem_config.h
new file mode 100644
index 0000000..874195f
--- /dev/null
+++ b/android_filesystem_config.h
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ * implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+/* This file is used to define the properties of the file system
+** images generated by build tools (eg: mkbootfs) and
+** by the device side of adb.
+*/
+
+#define NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRS
+/* static const struct fs_path_config android_device_dirs[] = { }; */
+
+/* Rules for files.
+** These rules are applied based on "first match", so they
+** should start with the most specific path and work their
+** way up to the root. Prefixes ending in * denotes wildcard
+** and will allow partial matches.
+*/
+static const struct fs_path_config android_device_files[] = {
+  { 00755, AID_ROOT, AID_SHELL, (1ULL << CAP_BLOCK_SUSPEND),
"system/bin/glgps" },
+#ifdef NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRS
+  { 00000, AID_ROOT, AID_ROOT, 0, "system/etc/fs_config_dirs" },
+#endif
+};


diff --git a/device.mk b/device.mk
index 0c71d21..235c1a7 100644
--- a/device.mk
+++ b/device.mk
@@ -18,7 +18,8 @@ PRODUCT_PACKAGES := \
     libwpa_client \
     hostapd \
     wpa_supplicant \
-    wpa_supplicant.conf
+    wpa_supplicant.conf \
+    fs_config_files

 ifeq ($(TARGET_PREBUILT_KERNEL),)
 ifeq ($(USE_SVELTE_KERNEL), true)

從先前版本遷移檔案系統

遷移 Android 5.x 以下版本的檔案系統時,請注意下列事項 Android 6.x 版

  • 移除部分包含、結構和內嵌定義。
  • 需要 libcutils 的參照,而非直接執行 system/core/include/private/android_filesystem_config.h起。 裝置製造商私人執行檔時,依附元件是 system/code/include/private_filesystem_config.h 代表檔案,或 目錄結構或 fs_config 必須新增 libcutils 程式庫依附元件
  • 需要裝置製造商私人分支版本的 system/core/include/private/android_filesystem_config.h 搭配 與現有目標相關的額外內容 device/vendor/device/android_filesystem_config.h
  • 保留將 SELinux 必要存取控制 (MAC) 套用至 包括在目標系統中的 使用 fs_config() 確定目標執行檔必須確保存取。