security_permission_lite/README_zh.md
chennian 322e6c2ebd readme整改
Signed-off-by:chennian<chennian1@huawei.com>

Signed-off-by: chennian <chennian1@huawei.com>
2022-09-29 20:55:44 +08:00

16 KiB
Executable File
Raw Permalink Blame History

应用权限管理

简介

OpenHarmony中应用和系统服务均运行在独立的沙箱中进程空间和程序数据都是相互隔离的以保护应用数据的安全性但是运行在独立沙箱中的服务或应用同时需要对外提供一些API以实现所需功能其他独立沙箱中的应用在跨进程访问这些API时需要系统提供一种权限管理机制对这些API的访问者进行授权。

  • 应用权限管理提供了权限定义机制允许系统服务和应用为自己的敏感API定义新的权限其他应用必须申请此权限才能访问此敏感API

  • 应用权限管理提供了权限申请机制允许应用申请权限这些权限由系统或者其他应用定义权限申请通过后就能访问这个权限相关的系统或其他应用提供的敏感API

  • 应用权限管理也为用户提供了一些必须的功能,方便用户查看和管理权限授予情况。

图 1 应用权限管理架构

应用权限管理为用户程序框架子系统提供权限管理功能,并且为上层应用提供权限申请和授权状态查询接口。本次开源的应用权限管理功能适用于轻量系统、小型系统和标准系统。

  • 轻量系统mini system面向MCU类处理器例如Arm Cortex-M、RISC-V 32位的设备硬件资源极其有限参考内存≥128KiB可以提供多种轻量级网络协议轻量级的图形框架以及丰富的IOT总线读写部件等。可支撑的产品如智能家居领域的连接类模组、传感器设备、穿戴类设备等。
  • 小型系统small system面向应用处理器例如Arm Cortex-A的设备参考内存≥1MiB可以提供更高的安全能力、标准的图形框架、视频编解码的多媒体能力。可支撑的产品如智能家居领域的IP Camera、电子猫眼、路由器以及智慧出行域的行车记录仪等。

目录

/base/security/permission_lite
├── interfaces                         # 接口层
│   ├── innerkits                      # 内部接口层
│   └── kits                           # 外部接口层
└── services                           # 服务层
    ├── ipc_auth                       # IPC通信鉴权
    ├── js_api                         # JS API封装
    ├── pms                            # 权限管理逻辑和服务端
    ├── pms_base                       # 服务注册
    └── pms_client                     # 权限管理服务的客户端

使用

接口说明

轻量系统、小型系统应用权限管理当前仅供系统应用和系统服务调用具体API接口如下

接口名

描述

int CheckPermission(int uid, const char *permissionName)

检查指定UID的应用进程是否具有访问系统服务API的权限

int CheckSelfPermission(const char *permissionName)

检查调用者是否具有访问系统服务API的权限

int QueryPermission(const char *identifier, PermissionSaved **permissions, int *permNum)

查询应用申请的所有权限,并检查权限是否被授予

int GrantPermission(const char *identifier, const char *permName)

将指定权限授予应用程序

int RevokePermission(const char *identifier, const char *permName)

收回应用程序的指定权限

int GrantRuntimePermission(int uid, const char *permissionName)

应用运行时动态授予指定权限

int RevokeRuntimePermission(int uid, const char *permissionName)

应用运行时动态撤销指定权限

int UpdatePermissionFlags(const char *identifier, const char *permissionName, const int flags)

更新应用程序指定的应用权限的标记

轻量系统、小型系统IPC通信鉴权

接口名

描述

int GetCommunicationStrategy(RegParams params, PolicyTrans **policies, unsigned int *policyNum)

服务注册过程中查询调用接口对应的访问策略仅供Samgr调用

int IsCommunicationAllowed(AuthParams params)

检查访问主体进程是否有权限调用受访客体进程的接口仅供Samgr调用

使用说明

轻量系统、小型系统应用权限管理

使用说明以包管理器的应用权限开发为例进行讲解。开发过程中首先需要明确涉及的敏感权限并在config.json中声明该权限在安装应用程序时包管理器会调用应用权限管理组件的接口检查该权限是否被授予若授予安装流程正常进行否则安装失败。

  1. 在开发过程中包管理器明确需要安装应用的权限ohos.permission.INSTALL_BUNDLE并声明该权限 FA模型需要在config.json中声明权限示例

    {
      "module": {
          "package": "ohos.demo.kitframework",
          "deviceType": [
              "phone", "tv","tablet", "car","smartWatch","sportsWatch","smartCamera", "smartVision"
          ],
          "reqPermissions": [{
            "name": "ohos.permission.INSTALL_BUNDLE",
            "reason": "install bundle",
            "usedScene": {
              "ability": [
                "KitFramework"
                ],
              "when": "always"
            }
          },
          {
            "name": "ohos.permission.LISTEN_BUNDLE_CHANGE",
            "reason": "install bundle",
            "usedScene": {
              "ability": [
                "KitFramework"
                ],
              "when": "always"
            }
          },
          {
            "name": "ohos.permission.GET_BUNDLE_INFO",
            "reason": "install bundle",
            "usedScene": {
              "ability": [
                "KitFramework"
                ],
              "when": "always"
            }
          }
        ]
      }
    }
    

    Stage模型需要在module.json5中声明权限示例

    {
      "module": {
        "requestPermissions": [{
          "name": "ohos.permission.INSTALL_BUNDLE",
          "reason": "install bundle",
          "usedScene": {
            "ability": [
              "KitFramework"
            ],
            "when": "always"
          }
        },
        {
          "name": "ohos.permission.LISTEN_BUNDLE_CHANGE",
          "reason": "install bundle",
          "usedScene": {
            "ability": [
              "KitFramework"
            ],
            "when": "always"
          }
        },
        {
          "name": "ohos.permission.GET_BUNDLE_INFO",
          "reason": "install bundle",
          "usedScene": {
            "ability": [
              "KitFramework"
            ],
            "when": "always"
          }
        }]
      }
    }
    
  2. 当包管理器开发应用安装功能接口时,会调用权限管理相关接口检查自身是否具有安装应用程序的权限,例如:以安装应用的权限名"ohos.permission.INSTALL_BUNDLE"作为入参调用CheckPermission接口检查包管理器是否具有安装应用的权限如果有权限安装流程继续执行否则返回安装失败

    constexpr static char PERMISSION_INSTALL_BUNDLE[] = "ohos.permission.INSTALL_BUNDLE";
    
    bool Install(const char *hapPath, const InstallParam *installParam, InstallerCallback installerCallback)
    {
        if ((hapPath == nullptr) || (installerCallback == nullptr) || (installParam == nullptr)) {
            HILOG_ERROR(HILOG_MODULE_APP, "BundleManager install failed due to nullptr parameters");
            return false;
        }
        // 检查ohos.permission.INSTALL_BUNDLE权限是否被授予
        if (CheckPermission(0, static_cast<const char *>(PERMISSION_INSTALL_BUNDLE)) != GRANTED) {
            HILOG_ERROR(HILOG_MODULE_APP, "BundleManager install failed due to permission denied");
            return false;  // 返回安装失败
        }
        // 安装流程
        ...
    }
    

轻量系统、小型系统IPC通信鉴权

使用说明以BMS服务通过IPC通信方式对外开放接口为例讲解如何通过IPC通信鉴权组件配置对应接口的访问策略。这里BMS在Samgr中注册的service为bundlems为开放的接口注册的Feature为BmsFeature。

  1. 在源码路径下的头文件base/security/permission_lite/services/ipc_auth/include/policy_preset.h中配置相应的访问策略访问策略主要有三种类型

    1type为RANGE类型允许某个特定范围UID的进程访问需要指定uidMin和uidMax

    2type为FIXED类型允许指定的几个UID的进程访问需要指定fixedUid最多配置8个

    3type为BUNDLENAME类型只允许特定的应用访问需要指定bundleName包名

    FeaturePolicy bmsFeature[] = {
        {
            "BmsFeature",
            {
                {
                    .type=FIXED,    // 允许指定UID的进程访问的方式
                    .fixedUid={2, 3, 8}
                },
                {
                    .type=RANGE,    // 允许特定范围内的UID的进程访问的方式
                    .uidMin=100,
                    .uidMax=__INT_MAX__,
                },
            }
        },
        {
            "BmsInnerFeature",
            {
                {
                    .type=FIXED,     // 允许指定UID的进程访问的方式
                    .fixedUid={2, 3, 8}
                },
                {
                    .type=RANGE,
                    .uidMin=100,
                    .uidMax=999,
                },
            }
        },
    };
    
  2. 将步骤1中定义的Feature的策略加配到全局策略中需要配置feature数量

    static PolicySetting g_presetPolicies[] = {
        {"permissionms", pmsFeature, 1},
        {"abilityms", amsFeature, 2},
        {"bundlems", bmsFeature, 2},  // 步骤1定义的BMS的feature数量为2
        {"dtbschedsrv", dmsFeature, 1},
        {"samgr", samgrFeature, 1},
        {"appspawn", appspawnFeature, 1},
        {"WMS", wmsFeature, 1},
        {"bundle_daemon", bdsFeature, 1},
    };
    
  3. 将步骤1中定义的BmsFeature注册到Samgr

    const char BMS_SERVICE[] = "bundlems";
    const char BMS_FEATURE[] = "BmsFeature";
    static void Init()
    {
        SamgrLite *sm = SAMGR_GetInstance();
        if (sm == nullptr) {
            return;
        }
        // 注册服务到Samgr
        sm->RegisterFeature(BMS_SERVICE, reinterpret_cast<Feature *>(BundleMsFeature::GetInstance()));
        sm->RegisterFeatureApi(BMS_SERVICE, BMS_FEATURE,
            GetBmsFeatureApi(reinterpret_cast<Feature *>(BundleMsFeature::GetInstance())));
        HILOG_DEBUG(HILOG_MODULE_APP, "BundleMS feature start success");
    }
    APP_FEATURE_INIT(Init);
    

完成以上开发步骤后开发者在Samgr注册服务时Samgr会调用IPC通信鉴权组件的GetCommunicationStrategy接口获取服务的访问策略当其他服务或应用通过IPC方式访问这些服务时Samgr会调用IPC通信鉴权组件的IsCommunicationAllowed接口检查调用者服务的权限如果满足访问策略则可以访问开发者接口否则拒绝访问。

相关仓

安全子系统 security_permission_lite