跳到主要内容

订阅阻断类事件

场景介绍

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

审计事件ID说明
0x1C801100文件创建阻断事件。
0x1C801101文件打开阻断事件。
0x1C801102文件重命名阻断事件。
0x1C801103文件删除阻断事件。
0x1C801104文件设置扩展属性的阻断事件。
0x1C801105文件删除扩展属性的阻断事件。

约束与限制

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

业务流程

流程说明:

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

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

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

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

  5. 开发者根据审计数据制定阻断策略。

  6. 使用步骤1中创建的实例设置接收到的事件的阻断策略。

  7. 当业务结束时,开发者可以使用步骤1中创建的实例解除过滤条件,取消订阅事件。

  8. 当业务结束时,开发者可以删除步骤1中创建的实例。

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

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

接口说明

更多接口及使用方法请参见API参考

接口名描述
newAuthClient(callback: Callback<AuditEvent>): AuthClient;创建审计阻断类事件管理对象AuthClient,AuthClient提供订阅、解订阅、增加事件过滤、移除事件过滤、阻断功能
deleteAuthClient(client: AuthClient): void;删除审计阻断类事件管理对象
interface AuthClient { subscribe(events: AuthEvent[]): void; }订阅审计阻断类事件
interface AuthClient { unsubscribe(events: AuthEvent[]): void; }解订阅审计阻断类事件
interface AuthClient { addFilter(event: AuthEvent, filter: Filter): void; }添加审计阻断类事件过滤条件
interface AuthClient { removeFilter(event: AuthEvent, filter: Filter): void; }移除审计阻断类事件过滤条件
interface AuthClient { auth(auditEvent: AuditEvent, authResult: AuthResult): void; }设置审计阻断类事件的阻断结果

开发步骤

  • 在开发准备过程中,需要申请权限:ohos.permission.kernel.AUTH_AUDIT_EVENT。
  • 只允许清单内的企业类应用申请该权限,申请方式请参考:申请使用企业类应用可用权限
  1. 导入Device Security Kit模块及相关公共模块。

    import { securityAudit } from '@kit.DeviceSecurityKit';
    import { BusinessError } from '@kit.BasicServicesKit';
    import { hilog } from '@kit.PerformanceAnalysisKit';
  2. 使用携带阻断策略的回调函数创建审计阻断类事件客户端实例。

    const TAG = "SecurityAuditAuthJsTest";
    let authClient: securityAudit.AuthClient | undefined = undefined;
    const allowEventCallback = (event: securityAudit.AuditEvent) => {
    hilog.info(0x0000, TAG, '%{public}s', 'Security_SecurityAudit_Auth_JsApi_Func eventId= ' + event.eventId);
    hilog.info(0x0000, TAG, '%{public}s', 'Security_SecurityAudit_Auth_JsApi_Func content= ' + event.content);
    hilog.info(0x0000, TAG, '%{public}s', 'Security_SecurityAudit_Auth_JsApi_Func metadata= ' + event.metadata);
    try {
    authClient?.auth(event, securityAudit.AuthResult.ALLOW);
    } catch (error) {
    let e: BusinessError = error as BusinessError;
    hilog.error(0x0000, TAG, 'allowEventCallback', 'auth error:' + e.code);
    }
    };
    try {
    authClient = securityAudit.newAuthClient(allowEventCallback);
    } catch (err) {
    let e: BusinessError = err as BusinessError;
    hilog.error(0x0000, TAG, 'newAuthClient failed: %{public}d %{public}s', e.code, e.message);
    }
  3. 订阅审计阻断类事件。

    try {
    hilog.info(0x0000, TAG, 'subscribe begin.');
    authClient?.subscribe([securityAudit.AuthEvent.FILE_CREATE]);
    hilog.info(0x0000, TAG, 'Succeeded in subscribe.');
    } catch (err) {
    let e: BusinessError = err as BusinessError;
    hilog.error(0x0000, TAG, 'subscribe failed: %{public}d %{public}s', e.code, e.message);
    }
  4. 设置审计阻断类事件过滤条件。

    let filter : securityAudit.Filter = {
    type: securityAudit.FilterType.PROCESS_PID_EQUAL,
    isInclude: true,
    values : ["2"]
    };
    try {
    hilog.info(0x0000, TAG, 'addFilter begin.');
    authClient?.addFilter(securityAudit.AuthEvent.FILE_CREATE, filter);
    hilog.info(0x0000, TAG, 'Succeeded in addFilter.');
    } catch (err) {
    let e: BusinessError = err as BusinessError;
    hilog.error(0x0000, TAG, 'addFilter failed: %{public}d %{public}s', e.code, e.message);
    }
  5. 解除审计阻断类事件订阅。

    try {
    hilog.info(0x0000, TAG, 'unsubscribe begin.');
    authClient?.unsubscribe([securityAudit.AuthEvent.FILE_CREATE]);
    hilog.info(0x0000, TAG, 'Succeeded in unsubscribe.');
    } catch (err) {
    let e: BusinessError = err as BusinessError;
    hilog.error(0x0000, TAG, 'unsubscribe failed: %{public}d %{public}s', e.code, e.message);
    }
  6. 解除审计阻断类事件过滤条件。

    try {
    hilog.info(0x0000, TAG, 'removeFilter begin.');
    authClient?.removeFilter(securityAudit.AuthEvent.FILE_CREATE, filter);
    hilog.info(0x0000, TAG, 'Succeeded in removeFilter.');
    } catch (err) {
    let e: BusinessError = err as BusinessError;
    hilog.error(0x0000, TAG, 'removeFilter failed: %{public}d %{public}s', e.code, e.message);
    }
  7. 删除审计阻断类事件客户端实例。

    try {
    securityAudit.deleteAuthClient(authClient);
    } catch (err) {
    let e: BusinessError = err as BusinessError;
    hilog.error(0x0000, TAG, 'deleteAuthClient failed: %{public}d %{public}s', e.code, e.message);
    }