跳到主要内容

基于设备分类和数据分级的访问控制 (ArkTS)

基本概念

分布式数据管理对数据实施分类分级保护,提供基于数据安全标签以及设备安全等级的访问控制机制。

数据安全标签和设备安全等级越高,加密措施和访问控制措施越严格,数据安全性越高。

数据安全标签

按照数据分类分级规范要求,可将数据分为S1、S2、S3、S4四个安全等级。

风险等级风险标准定义样例
严重S4业界法律法规定义的特殊数据类型,涉及个人的最私密领域的信息或一旦泄露、篡改、破坏、销毁可能会给个人或组织造成重大的不利影响的数据。政治观点、宗教和哲学信仰、工会成员资格、基因数据、生物信息、健康和性生活状况,性取向等或设备认证鉴权、个人信用卡等财务信息等。
S3数据的泄露、篡改、破坏、销毁可能会给个人或组织导致严峻的不利影响。个人实时精确定位信息、运动轨迹等。
S2数据的泄露、篡改、破坏、销毁可能会给个人或组织导致严重的不利影响。个人的详细通信地址、姓名昵称等。
S1数据的泄露、篡改、破坏、销毁可能会给个人或组织导致有限的不利影响。性别、国籍、用户申请记录等。

设备安全等级

根据设备安全能力,比如是否有TEE、是否有安全存储芯片等,将设备安全等级分为SL1、SL2、SL3、SL4、SL5五个等级。例如,手表通常为低安全的SL1设备,手机、平板通常为高安全的SL4设备。

在设备组网时可以通过hidumper -s 3511查看设备安全等级。

跨设备同步访问控制机制

数据跨设备同步时,基于数据安全标签和设备安全等级进行访问控制。数据库的数据安全标签不高于对端设备的设备安全等级时,数据才能同步。具体访问控制矩阵如下:

设备安全级别可同步的数据安全标签
SL1S1
SL2S1~S2
SL3S1~S3
SL4S1~S4
SL5S1~S4

例如,手表通常为低安全的SL1设备。若创建数据安全标签为S1的数据库,则此数据库数据可以在这些设备间同步;若创建的数据库标签为S2-S4,则不能在这些设备间同步。

场景介绍

分布式数据库的访问控制机制确保了数据存储和同步时的安全能力。在创建数据库时,应当基于数据分类分级规范合理地设置数据库的安全标签,确保数据库内容和数据标签的一致性。

使用键值型数据库实现数据分级

键值型数据库,通过securityLevel参数设置数据库的安全等级,安全等级具体可见SecurityLevel枚举。此处以创建安全等级为S3的数据库为例。

具体接口及功能,可见分布式键值数据库

在单设备使用场景下,KV数据库支持修改securityLevel开库参数进行安全等级升级。数据库安全等级升级操作需要注意以下几点:

  • 该操作不支持需要进行跨设备同步的数据库,不同安全等级的数据库之间不能进行数据同步,需要跨设备同步的数据库如果要升级安全等级,建议重新创建更高安全等级的数据库。
  • 该操作需在关闭当前数据库之后,通过修改securityLevel开库参数重新设置数据库的安全等级,再进行开库操作。
  • 该操作只支持升级,不支持降级。例如支持S2->S3的升级,不支持S3->S2的降级。
// 导入模块
// 在pages目录下新建KvStoreInterface.ets
import { distributedKVStore } from '@kit.ArkData';
import { BusinessError } from '@kit.BasicServicesKit';
import EntryAbility from '../entryability/EntryAbility';
// Logger为hilog封装后实现的打印功能
import Logger from '../common/Logger';

let kvManager: distributedKVStore.KVManager | undefined = undefined;
let kvStore: distributedKVStore.SingleKVStore | undefined = undefined;
let appId: string = 'com.example.kvstoresamples';
let storeId: string = 'storeId';
const context = EntryAbility.getContext();

// 下面所有接口的代码都实现在KvInterface中
export class KvInterface {
}
public CreateKvManager = (() => {
Logger.info('CreateKvManager start');
if (typeof (kvManager) === 'undefined') {
const kvManagerConfig: distributedKVStore.KVManagerConfig = {
bundleName: appId,
context: context
};
try {
// 创建KVManager实例
kvManager = distributedKVStore.createKVManager(kvManagerConfig);
Logger.info('Succeeded in creating KVManager.');
} catch (err) {
Logger.error(`Failed to create KVManager. Code:${err.code},message:${err.message}`);
}
} else {
Logger.info ('KVManager has created');
}
})
public GetKvStore = (() => {
Logger.info('GetKvStore start');
if (kvManager === undefined) {
Logger.info('KvManager not initialized');
return;
}
try {
let child1 = new distributedKVStore.FieldNode('id');
child1.type = distributedKVStore.ValueType.INTEGER;
child1.nullable = false;
child1.default = '1';
let child2 = new distributedKVStore.FieldNode('name');
child2.type = distributedKVStore.ValueType.STRING;
child2.nullable = false;
child2.default = 'zhangsan';

let schema = new distributedKVStore.Schema();
schema.root.appendChild(child1);
schema.root.appendChild(child2);
schema.indexes = ['$.id', '$.name'];
// 0表示COMPATIBLE模式,1表示STRICT模式。
schema.mode = 1;
// 支持在检查Value时,跳过skip指定的字节数,且取值范围为[0,4M-2]。
schema.skip = 0;

const options: distributedKVStore.Options = {
createIfMissing: true,
// 设置数据库加密
encrypt: true,
backup: false,
autoSync: false,
// kvStoreType不填时,默认创建多设备协同数据库
kvStoreType: distributedKVStore.KVStoreType.SINGLE_VERSION,
// 多设备协同数据库:kvStoreType: distributedKVStore.KVStoreType.DEVICE_COLLABORATION,
schema: schema,
// schema未定义可以不填,定义方法请参考上方schema示例。
securityLevel: distributedKVStore.SecurityLevel.S3
};
kvManager.getKVStore<distributedKVStore.SingleKVStore>(storeId, options,
(err, store: distributedKVStore.SingleKVStore) => {
if (err) {
Logger.error(`Failed to get KVStore: Code:${err.code},message:${err.message}`);
return;
}
Logger.info('Succeeded in getting KVStore.');
kvStore = store;
// 请确保获取到键值数据库实例后,再进行相关数据操作
});
} catch (e) {
let error = e as BusinessError;
Logger.error(`An unexpected error occurred. Code:${error.code},message:${error.message}`);
}
})

使用关系型数据库实现数据分级

关系型数据库,通过securityLevel参数设置数据库的安全等级,安全等级具体可见SecurityLevel枚举。此处以创建安全等级为S3的数据库为例。

具体接口及功能,可见@ohos.data.relationalStore (关系型数据库)

import { relationalStore } from '@kit.ArkData';
import { UIContext } from '@kit.ArkUI';
import { common } from '@kit.AbilityKit';

let store: relationalStore.RdbStore | undefined = undefined;

export async function accessControlByDeviceAndDataLevel() {
/* context为应用的上下文信息,由调用方自行获取,此处仅为示例。 */
const context = new UIContext().getHostContext() as common.UIAbilityContext;
try {
const STORE_CONFIG: relationalStore.StoreConfig = {
name: 'RdbTest.db',
// 设置数据库安全级别为S3
securityLevel: relationalStore.SecurityLevel.S3
};
store = await relationalStore.getRdbStore(context, STORE_CONFIG);
console.info('Succeeded in getting RdbStore.')
} catch (err) {
console.error(`Failed to get RdbStore. Code:${err.code}, message:${err.message}`);
}
}