Open Harmony 安全隐私:module.json5 中的 Ability 暴露控制与权限边界 🛡️

前言 🌟

在 OpenHarmony / HarmonyOS 项目中,module.json5 不是一个“随便生成的配置文件”。它决定了模块类型、入口 Ability、页面路径、扩展 Ability、启动图标、启动背景,以及 Ability 是否对外暴露。

当前项目的安全隐私切入点,不是复杂权限系统,而是 Ability 暴露边界。也就是说:哪些能力可以被系统或外部拉起,哪些能力只应该留在应用内部。

本文基于当前项目真实的 module.json5,分析其中和安全隐私相关的配置。

module.json5 的核心结构 📦

当前项目的模块配置大致如下:

{
  "module": {
    "name": "entry",
    "type": "entry",
    "mainElement": "EntryAbility",
    "deviceTypes": [
      "phone"
    ],
    "deliveryWithInstall": true,
    "installationFree": false,
    "pages": "$profile:main_pages",
    "abilities": [
      {
        "name": "EntryAbility",
        "srcEntry": "./ets/entryability/EntryAbility.ets",
        "exported": true
      }
    ],
    "extensionAbilities": [
      {
        "name": "EntryBackupAbility",
        "type": "backup",
        "exported": false
      }
    ]
  }
}

这份配置可以拆成两部分看:

  1. 普通 Ability:EntryAbility
  2. 扩展 Ability:EntryBackupAbility

它们的 exported 配置不同,背后体现的是不同的能力边界。

EntryAbility 为什么是 exported: true?🚪

项目中 EntryAbility 的配置如下:

{
  "name": "EntryAbility",
  "srcEntry": "./ets/entryability/EntryAbility.ets",
  "description": "$string:EntryAbility_desc",
  "icon": "$media:layered_image",
  "label": "$string:EntryAbility_label",
  "startWindowIcon": "$media:startIcon",
  "startWindowBackground": "$color:start_window_background",
  "exported": true,
  "skills": [
    {
      "entities": [
        "entity.system.home"
      ],
      "actions": [
        "ohos.want.action.home"
      ]
    }
  ]
}

这里 exported: true 是合理的,因为它是应用主入口,并且通过 skills 声明了桌面启动能力。

关键配置是:

"entities": [
  "entity.system.home"
],
"actions": [
  "ohos.want.action.home"
]

这表示该 Ability 可以作为应用首页入口被系统识别。用户点击桌面图标时,就会进入这个 Ability。

从安全角度看,主入口可以暴露,但入口内部仍然应该做好页面跳转、登录状态、数据访问等控制。exported: true 不代表所有业务能力都可以无边界开放。

EntryBackupAbility 为什么是 exported: false?🔐

备份扩展的配置如下:

{
  "name": "EntryBackupAbility",
  "srcEntry": "./ets/entrybackupability/EntryBackupAbility.ets",
  "type": "backup",
  "exported": false,
  "metadata": [
    {
      "name": "ohos.extension.backup",
      "resource": "$profile:backup_config"
    }
  ]
}

这里 exported: false 很重要。

备份恢复能力可能涉及应用内部数据。如果随意暴露,会扩大攻击面,也会让能力边界变得模糊。当前项目将备份扩展设置为不导出,是比较稳妥的配置。

这也体现了安全隐私设计中的一个基本原则:只暴露必须暴露的能力。

metadata 的作用 🧾

备份扩展还绑定了 metadata:

"metadata": [
  {
    "name": "ohos.extension.backup",
    "resource": "$profile:backup_config"
  }
]

它指向:

{
  "allowToBackupRestore": true
}

这说明当前应用允许备份恢复。但注意,允许备份恢复和开放扩展入口不是一回事。当前项目一方面允许系统备份恢复流程识别该能力,另一方面通过 exported: false 控制外部暴露边界。

这个组合比较适合写安全隐私文章,因为它不是口号,而是具体配置。

配置文件中的安全检查清单 ✅

基于当前项目,可以总结出一份检查清单:

  1. 主入口 Ability 是否确实需要 exported: true
  2. 非主入口 Ability 是否默认关闭外部暴露?
  3. 扩展 Ability 是否按照能力类型进行精确配置?
  4. metadata 是否指向正确资源?
  5. skills 是否只声明必要的启动动作?
  6. 后续增加权限时,是否做到最小权限原则?

当前项目暂时没有复杂权限申请,所以不要把文章写成“已经实现精细化权限管控”。更真实的说法是:当前项目从 Ability 暴露边界开始,具备安全隐私治理的基础。

与页面代码的关系 🧩

module.json5 负责入口和能力声明,页面文件负责 UI。

当前首页是:

@Entry
@Component
struct Index {
  @State message: string = 'Hello World';

  build() {
    RelativeContainer() {
      Text(this.message)
    }
    .height('100%')
    .width('100%')
  }
}

这段页面代码本身没有权限访问行为,也没有敏感数据处理。因此安全重点并不在页面,而在 Ability 配置和扩展能力边界。

写技术文章时,把配置层和页面层分清楚,会比泛泛而谈“安全隐私”更有说服力。

总结 🚀

这篇文章对应“四大主题”中的 安全隐私

当前项目可以真实支撑的内容包括:

  1. EntryAbility 作为主入口,设置 exported: true
  2. 通过 skills 声明桌面启动入口。
  3. EntryBackupAbility 作为备份扩展,设置 exported: false
  4. 通过 metadata 绑定备份配置。

安全隐私不是只有权限弹窗。对 OpenHarmony 应用来说,Ability 是否暴露、扩展能力是否收口、配置文件是否准确,同样是安全设计的重要组成部分。当前项目虽然简单,但这部分基础是扎实的。

参考资料:

  • HarmonyOS 官方文档:模块配置文件
  • HarmonyOS 官方文档:Ability 与 ExtensionAbility 配置
  • 当前项目文件:module.json5EntryAbility.etsEntryBackupAbility.ets

img

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐