## 场景介绍

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

展开

| 审计事件ID | 说明 |
| --- | --- |
| 0x027000000 | 剪切板复制粘贴事件 |
| 0x010000100 | 账号登录登出事件 |
| 0x007000000 | 窗口截屏录屏投屏事件 |
| 0x00F000000 | 移动存储插拔事件，如U盘、存储卡等具有存储功能的外设插拔事件 |
| 0x02E000000 | 打印机事件 |
| 0x01C000007 | 文件事件 |
| 0x01C000008 | 进程创建退出事件 |
| 0x01C000009 | 网络事件 |
| 0x01C00000A | KIA文件拦截事件 |
| 0x02D000000 | 相机事件 |
| 0x010000000 | 应用事件 |
| 0x011000000 | edm事件 |
| 0x012003000 | 证书操作事件 |
| 0x01C00000B | KIA文件新增事件 |
| 0x01C00000C | KIA文件变种事件 |
| 0x01C000012 | KIA文件读事件 |
| 0x01C00000E | 网络流量事件 |
| 0x01C00000F | 网络连接事件 |
| 0x00B000000 | 应用权限变更事件 |
| 0x003000001 | DNS审计事件 |
| 0x01C001100 | 文件拦截事件 |
| 0x018000100 | app安装拦截事件 |
| 0x018000101 | app卸载拦截事件 |
| 0x018000102 | app更新拦截事件 |
| 0x018000103 | app恢复拦截事件 |
| 0x018000104 | app启动拦截事件 |
| 0x030000000 | USB访问拦截事件 |

## 约束与限制

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

## 业务流程

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/82/v3/K58B71LCSy26VfVR536GYQ/zh-cn_image_0000002482908436.png?HW-CC-KV=V1&HW-CC-Date=20260414T043317Z&HW-CC-Expire=86400&HW-CC-Sign=81B991A01535C64DD010678E17A1222F25156C475D440FC8280C7E389ED40C6E)

**流程说明：**

1. 开发者创建审计通知类事件(以下统称为事件)订阅客户端实例，需要提供CallBack。
2. 开发者使用1中创建的实例订阅事件，需要提供想要订阅的事件id。
3. 开发者使用1中创建的实例设置事件过滤条件，需要提供事件id和过滤条件信息。
4. 当事件发生时，审计服务先根据事件过滤条件过滤事件，当事件满足过滤条件时，触发回调通知订阅当前事件的客户端。
5. 开发者根据审计数据处理业务。
6. 当开发者应用不需要过滤/使用该审计数据时，开发者可以使用1中创建的实例解除过滤条件，取消对应的订阅事件。
7. 当开发者应用不需要使用当前实例时，开发者可以删除实例。

   说明

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

   注意

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

## 接口说明

接口如下表，更多接口及使用方法请参见[API参考](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/devicesecurity-capi-securityaudit#zh-cn_topic_0000002349017400_ga18d7c9fe5c578d6113c86dd0c09353b4)。

展开

| 接口名 | 描述 |
| --- | --- |
| 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。
* 只允许清单内的企业类应用申请该权限，申请方式请参考：[申请使用企业类应用可用权限](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/permissions-for-enterprise-apps)。

1. 在CMakeLists.txt中导入安全审计共享库，并链接该库。

   收起

   自动换行

   深色代码主题

   复制

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

   收起

   自动换行

   深色代码主题

   复制

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

   收起

   自动换行

   深色代码主题

   复制

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

   收起

   自动换行

   深色代码主题

   复制

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

   收起

   自动换行

   深色代码主题

   复制

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

   收起

   自动换行

   深色代码主题

   复制

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

   收起

   自动换行

   深色代码主题

   复制

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

   收起

   自动换行

   深色代码主题

   复制

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

   收起

   自动换行

   深色代码主题

   复制

   ```
   1. ret = HMS_SecurityAudit_DeleteClient(client);
   2. if (ret != 0) {
   3. printf("deleteclient fail");
   4. return;
   5. }
   ```