跳到主要内容

订阅通知类事件

场景介绍

从6.0.0(20)开始,新增提供统一的安全审计数据多客户端订阅/取消订阅与添加/删除过滤条件接口,应用可以获取设备上的安全审计数据(如下表),并按需进行过滤,以支撑审计相关业务。

审计事件ID说明
0x027000000剪切板复制粘贴事件
0x010000100账号登录登出事件
0x007000000窗口截屏录屏投屏事件
0x00F000000移动存储插拔事件,如U盘、存储卡等具有存储功能的外设插拔事件
0x02E000000打印机事件
0x01C000007文件事件
0x01C000008进程创建退出事件
0x01C000009网络事件
0x01C00000AKIA文件拦截事件
0x02D000000相机事件
0x010000000应用事件
0x011000000edm事件
0x012003000证书操作事件
0x01C00000BKIA文件新增事件
0x01C00000CKIA文件变种事件
0x01C000012KIA文件读事件
0x01C00000E网络流量事件
0x01C00000F网络连接事件
0x00B000000应用权限变更事件
0x003000001DNS审计事件
0x01C001100文件拦截事件
0x018000100app安装拦截事件
0x018000101app卸载拦截事件
0x018000102app更新拦截事件
0x018000103app恢复拦截事件
0x018000104app启动拦截事件
0x030000000USB访问拦截事件
0x0F000001SMB(Samba)外发事件 起始版本: 6.1.0(23)
0x1C000014KIA文件秒开事件 起始版本: 6.1.0(23)
0x27000100HDC(HarmonyOS Device Connector)调测文件事件 起始版本: 6.1.0(23)
0x27000101HDC(HarmonyOS Device Connector)调测拦截事件 起始版本: 6.1.0(23)
0x2F000000多用户空间数据互传事件 起始版本: 6.1.0(23)
0x2F000001多用户空间互换审核策略事件 起始版本: 6.1.0(23)
0x30000100串口访问审计事件 起始版本: 6.1.0(23)
0x03000002网络拦截事件 起始版本: 6.1.0(23)
0x03000100WI-FI拦截事件 起始版本: 6.1.0(23)
0x2E000001打印拦截事件 起始版本: 6.1.0(23)

约束与限制

  1. 当前能力仅支持2in1设备。
  2. 一个进程最大只允许创建2个客户端实例,当前设备最多只允许创建16个客户端实例。
  3. 一个客户端实例最大只允许设置256个Filter,每个Filter限制10条过滤value。

业务流程

流程说明:

  1. 开发者创建审计通知类事件(以下统称为事件)订阅客户端实例,需要提供CallBack。

  2. 开发者使用1中创建的实例订阅事件,需要提供想要订阅的事件id。

  3. 开发者使用1中创建的实例设置事件过滤条件,需要提供事件id和过滤条件信息。

  4. 当事件发生时,审计服务先根据事件过滤条件过滤事件,当事件满足过滤条件时,触发回调通知订阅当前事件的客户端。

  5. 开发者根据审计数据处理业务。

  6. 当开发者应用不需要过滤/使用该审计数据时,开发者可以使用1中创建的实例解除过滤条件,取消对应的订阅事件。

  7. 当开发者应用不需要使用当前实例时,开发者可以删除实例。

    支持先设置过滤条件再订阅事件。

    删除实例后,被删除的实例所有的订阅以及过滤条件将被全部解除。

接口说明

接口如下表,更多接口及使用方法请参见API参考

接口名描述
int32_t HMS_SecurityAudit_NewClient(SecurityAudit_Client** client, SecurityAudit_Handler handler)创建通知类事件管理对象Client,Client提供订阅、解订阅、增加事件过滤、移除事件过滤功能。
int32_t HMS_SecurityAudit_DeleteClient(SecurityAudit_Client* client)删除审计通知类事件管理对象。
int32_t HMS_SecurityAudit_Subscribe(const SecurityAudit_Client* client, const SecurityAudit_Notify_Event *events, uint64_t count)订阅审计通知类事件。
int32_t HMS_SecurityAudit_Unsubscribe(const SecurityAudit_Client* client, const SecurityAudit_Notify_Event *events, uint64_t count)解订阅审计通知类事件。
int32_t HMS_SecurityAudit_AddFilter(const SecurityAudit_Client* client, SecurityAudit_Notify_Event event, const SecurityAudit_Filter *filter)添加审计通知类事件过滤条件。
int32_t HMS_SecurityAudit_RemoveFilter(const SecurityAudit_Client* client, SecurityAudit_Notify_Event event, const SecurityAudit_Filter *filter)移除审计通知类事件过滤条件。

开发步骤

  • 在开发准备过程中,需要申请权限:ohos.permission.QUERY_AUDIT_EVENT。
  • 只允许清单内的企业类应用申请该权限,申请方式请参考:申请使用企业类应用可用权限
  1. 在CMakeLists.txt中导入安全审计共享库,并链接该库。

    find_library(dsm-lib libsecurityaudit_ndk.z.so)
    target_link_libraries(entry PUBLIC libace_napi.z.so ${dsm-lib})
  2. 导入安全审计的头文件。

    #include <DeviceSecurityKit/security_audit.h>
    #include <cstdio>
  3. 全局范围定义通知类事件的回调函数。

    void Notify(const SecurityAudit_Event *events, uint64_t count)
    {
    if (events == nullptr) {
    printf("events nullptr");
    return;
    }
    for (uint64_t i = 0; i < count; i++) {
    printf("event content = %s", events[i].content);
    printf("event id = %ld", events[i].eventId);
    }
    }
  4. 创建审计通知类事件客户端实例。

    SecurityAudit_Client *client = NULL;
    SecurityAudit_Handler handler = Notify;
    HMS_SecurityAudit_NewClient(&client, handler);
    if (client == nullptr) {
    printf("client is null");
    return 0;
    }
  5. 订阅审计通知类事件。

    SecurityAudit_Notify_Event event[1] = {};
    event[0] = SECURITY_AUDIT_NOTIFY_EVENT_KIA_READ;
    int ret = HMS_SecurityAudit_Subscribe(client, event, 1);
    if (ret != 0) {
    printf("subscribe fail");
    return;
    }
  6. 设置审计通知类事件过滤条件。

    SecurityAudit_Filter filter = {};
    filter.type = PROCESS_NAME_PREFIX;
    const char* filterStr[1] = {};
    filterStr[0] = "1";
    filter.value = filterStr;
    filter.valueCount = 1;
    ret = HMS_SecurityAudit_AddFilter(client, SECURITY_AUDIT_NOTIFY_EVENT_KIA_READ, &filter);
    if (ret != 0) {
    printf("addfilter fail");
    return;
    }
  7. 解除审计通知类事件订阅。

    ret = HMS_SecurityAudit_Unsubscribe(client, event, 1);
    if (ret != 0) {
    printf("unsubscribe fail");
    return;
    }
  8. 解除审计通知类事件过滤条件。

    ret = HMS_SecurityAudit_RemoveFilter(client, SECURITY_AUDIT_NOTIFY_EVENT_KIA_READ, &filter);
    if (ret != 0) {
    printf("removefilter fail");
    return;
    }
  9. 删除审计通知类事件客户端实例。

    ret = HMS_SecurityAudit_DeleteClient(client);
    if (ret != 0) {
    printf("deleteclient fail");
    return;
    }